From 0b8dcd36facfe6d2f638bac7e2e6de3710ea2094 Mon Sep 17 00:00:00 2001 From: yuding <1023798085@qq.com> Date: Wed, 28 Jan 2026 17:19:36 +0800 Subject: [PATCH] =?UTF-8?q?feat(tree,menu,docs):=20=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E6=A0=91=E4=B8=89=E7=B1=BB=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=B9=B6=E4=B8=AD=E6=96=87=E5=8C=96=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .sisyphus/boulder.json | 6 +- .../plans/component-detail-rightclick.md | 96 +- AI_COLLABORATION.md | 12 +- demo/index.html | 2 +- demo/lib/iflow-engine.es.js | 5389 +++++++++-------- demo/lib/iflow-engine.umd.js | 349 +- demo/lib/iflow-engine.umd.js.map | 2 +- .../API调用链.md | 509 +- docs/MODULES/{services.md => 服务模块.md} | 0 docs/MODULES/{core.md => 核心模块.md} | 2 +- docs/MODULES/{_INDEX.md => 模块索引.md} | 18 +- docs/MODULES/{managers.md => 管理器模块.md} | 14 +- docs/MODULES/{components.md => 组件模块.md} | 0 ...GINE_API_INTEGRATION.md => 引擎API对接.md} | 0 docs/{GETTING_STARTED.md => 快速开始.md} | 4 +- docs/{INDEX.md => 文档索引.md} | 19 +- docs/{ARCHITECTURE.md => 架构设计.md} | 2 +- docs/贡献指南.md | 50 + docs/运维手册.md | 60 + src/components/collapse/index.css | 2 +- src/components/engine/index.ts | 29 + src/components/menu/index.css | 8 +- src/components/menu/index.ts | 32 +- src/components/menu/item.ts | 4 +- src/locales/en-US.ts | 11 +- src/locales/types.ts | 9 + src/locales/zh-CN.ts | 11 +- src/managers/component-detail-manager.ts | 223 +- src/managers/construct-tree-manager-btn.ts | 180 +- src/managers/engine-manager.ts | 93 +- src/managers/property-panel-manager.ts | 222 - src/types/events.ts | 4 + 32 files changed, 4060 insertions(+), 3302 deletions(-) rename .sisyphus/drafts/TOOLBAR_API_CALLCHAIN.md => docs/API调用链.md (58%) rename docs/MODULES/{services.md => 服务模块.md} (100%) rename docs/MODULES/{core.md => 核心模块.md} (99%) rename docs/MODULES/{_INDEX.md => 模块索引.md} (85%) rename docs/MODULES/{managers.md => 管理器模块.md} (96%) rename docs/MODULES/{components.md => 组件模块.md} (100%) rename docs/{ENGINE_API_INTEGRATION.md => 引擎API对接.md} (100%) rename docs/{GETTING_STARTED.md => 快速开始.md} (98%) rename docs/{INDEX.md => 文档索引.md} (82%) rename docs/{ARCHITECTURE.md => 架构设计.md} (99%) create mode 100644 docs/贡献指南.md create mode 100644 docs/运维手册.md delete mode 100644 src/managers/property-panel-manager.ts diff --git a/.sisyphus/boulder.json b/.sisyphus/boulder.json index 3a6d3f1..e6fc0ba 100644 --- a/.sisyphus/boulder.json +++ b/.sisyphus/boulder.json @@ -1,8 +1,8 @@ { - "active_plan": "/Users/yuding/WORK/LYZ/project/bimEngine/engine/.sisyphus/plans/component-detail-rightclick.md", - "started_at": "2026-01-28T03:53:31.469Z", + "active_plan": "/Users/yuding/WORK/LYZ/project/bimEngine/engine/.sisyphus/plans/component-detail-bugfix.md", + "started_at": "2026-01-28T07:42:20.635Z", "session_ids": [ "ses_3fd75ccc4ffe13KZZk467OXNg6" ], - "plan_name": "component-detail-rightclick" + "plan_name": "component-detail-bugfix" } \ No newline at end of file diff --git a/.sisyphus/plans/component-detail-rightclick.md b/.sisyphus/plans/component-detail-rightclick.md index f6ed53b..2f4dfb0 100644 --- a/.sisyphus/plans/component-detail-rightclick.md +++ b/.sisyphus/plans/component-detail-rightclick.md @@ -102,12 +102,12 @@ interface MenuItemConfig { - `.sisyphus/drafts/API_CALLCHAIN.md` - 重构调用链文档(从 Toolbar 专用扩展为全局文档) ### Definition of Done -- [ ] `bun run build` 构建成功 -- [ ] 点击构件后,右键显示"构件详情"和"显示全部" -- [ ] 未选中构件时,右键只显示"显示全部" -- [ ] 点击"构件详情"弹出属性弹窗,展示底层 API 返回的数据 -- [ ] 点击"显示全部"控制台输出提示 -- [ ] 调用链文档已重构并更新 +- [x] `bun run build` 构建成功 +- [x] 点击构件后,右键显示"构件详情"和"显示全部" +- [x] 未选中构件时,右键只显示"显示全部" +- [x] 点击"构件详情"弹出属性弹窗,展示底层 API 返回的数据 +- [x] 点击"显示全部"控制台输出提示 +- [x] 调用链文档已重构并更新 ### Must Have - 监听底层 Click 事件获取选中构件 @@ -155,7 +155,7 @@ Task 6 (重构调用链文档) ## TODOs -- [ ] 1. Engine 组件 - 监听构件点击,记录选中状态 +- [x] 1. Engine 组件 - 监听构件点击,记录选中状态 **What to do**: 在 `engine/src/components/engine/index.ts` 中: @@ -211,11 +211,11 @@ Task 6 (重构调用链文档) - `engine/src/components/engine/index.ts:108-131` - init() 方法位置 **Acceptance Criteria**: - - [ ] 新增 `selectedComponent` 私有属性 - - [ ] 在 init() 中监听 click 事件 - - [ ] 新增 `getSelectedComponent()` 方法 - - [ ] 新增 `getComponentProperties()` 方法 - - [ ] 点击构件时控制台输出选中信息 + - [x] 新增 `selectedComponent` 私有属性 + - [x] 在 init() 中监听 click 事件 + - [x] 新增 `getSelectedComponent()` 方法 + - [x] 新增 `getComponentProperties()` 方法 + - [x] 点击构件时控制台输出选中信息 **Commit**: YES - Message: `feat(engine): 监听构件点击事件并记录选中状态` @@ -223,7 +223,7 @@ Task 6 (重构调用链文档) --- -- [ ] 2. EngineManager - 暴露方法并修改右键处理器 +- [x] 2. EngineManager - 暴露方法并修改右键处理器 **What to do**: 在 `engine/src/managers/engine-manager.ts` 中: @@ -289,11 +289,11 @@ Task 6 (重构调用链文档) - `engine/src/components/menu/item.ts` - MenuItemConfig 定义 **Acceptance Criteria**: - - [ ] 新增 `getSelectedComponent()` 代理方法 - - [ ] 新增 `getComponentProperties()` 代理方法 - - [ ] 修改 registerHandler 动态返回菜单项 - - [ ] 有选中时显示"构件详情"+"显示全部" - - [ ] 无选中时只显示"显示全部" + - [x] 新增 `getSelectedComponent()` 代理方法 + - [x] 新增 `getComponentProperties()` 代理方法 + - [x] 修改 registerHandler 动态返回菜单项 + - [x] 有选中时显示"构件详情"+"显示全部" + - [x] 无选中时只显示"显示全部" **Commit**: YES - Message: `feat(engine-manager): 添加构件选中方法和动态右键菜单` @@ -301,7 +301,7 @@ Task 6 (重构调用链文档) --- -- [ ] 3. 创建 ComponentDetailManager - 构件详情弹窗 +- [x] 3. 创建 ComponentDetailManager - 构件详情弹窗 **What to do**: 创建 `engine/src/managers/component-detail-manager.ts`: @@ -443,11 +443,11 @@ Task 6 (重构调用链文档) - `engine/src/components/description/index.ts` - Description 组件 **Acceptance Criteria**: - - [ ] 新建 `component-detail-manager.ts` 文件 - - [ ] 实现 `show(modelUrl, componentId)` 方法 - - [ ] 调用底层 API 获取属性数据 - - [ ] 使用 Collapse + Description 展示属性 - - [ ] 实现 `hide()` 和 `destroy()` 方法 + - [x] 新建 `component-detail-manager.ts` 文件 + - [x] 实现 `show(modelUrl, componentId)` 方法 + - [x] 调用底层 API 获取属性数据 + - [x] 使用 Collapse + Description 展示属性 + - [x] 实现 `hide()` 和 `destroy()` 方法 **Commit**: YES - Message: `feat: 新增构件详情弹窗管理器` @@ -455,7 +455,7 @@ Task 6 (重构调用链文档) --- -- [ ] 4. BimEngine 和 Registry 注册管理器 +- [x] 4. BimEngine 和 Registry 注册管理器 **What to do**: @@ -491,9 +491,9 @@ Task 6 (重构调用链文档) - `engine/src/core/manager-registry.ts` - Registry 结构 **Acceptance Criteria**: - - [ ] ManagerRegistry 添加 componentDetail 类型声明 - - [ ] BimEngine 添加 componentDetail 属性 - - [ ] BimEngine 添加 initComponentDetail() 方法 + - [x] ManagerRegistry 添加 componentDetail 类型声明 + - [x] BimEngine 添加 componentDetail 属性 + - [x] BimEngine 添加 initComponentDetail() 方法 **Commit**: YES - Message: `feat(bim-engine): 注册构件详情管理器` @@ -501,7 +501,7 @@ Task 6 (重构调用链文档) --- -- [ ] 5. 国际化文本 + 构建验证 +- [x] 5. 国际化文本 + 构建验证 **What to do**: @@ -550,9 +550,9 @@ Task 6 (重构调用链文档) - `engine/src/locales/en-US.ts` - 英文国际化 **Acceptance Criteria**: - - [ ] zh-CN 添加 menu.componentDetail, menu.showAll, panel.componentDetail.title - - [ ] en-US 添加对应英文文本 - - [ ] `bun run build` 执行成功,无报错 + - [x] zh-CN 添加 menu.componentDetail, menu.showAll, panel.componentDetail.title + - [x] en-US 添加对应英文文本 + - [x] `bun run build` 执行成功,无报错 **Commit**: YES - Message: `feat(i18n): 添加构件详情相关国际化文本` @@ -560,7 +560,7 @@ Task 6 (重构调用链文档) --- -- [ ] 6. 重构调用链文档 +- [x] 6. 重构调用链文档 **What to do**: @@ -728,11 +728,11 @@ Task 6 (重构调用链文档) - `engine/src/managers/engine-manager.ts` - 右键处理器注册 **Acceptance Criteria**: - - [ ] 文档重命名为 `API_CALLCHAIN.md` - - [ ] 文档标题改为"SDK API 调用链文档" - - [ ] 新增"右键菜单"章节,包含构件详情、显示全部、信息、首页 - - [ ] 新增"构件交互"章节,包含选中/取消选中调用链 - - [ ] 原 Toolbar 内容保持不变,作为第一章 + - [x] 文档重命名为 `API_CALLCHAIN.md` + - [x] 文档标题改为"SDK API 调用链文档" + - [x] 新增"右键菜单"章节,包含构件详情、显示全部、信息、首页 + - [x] 新增"构件交互"章节,包含选中/取消选中调用链 + - [x] 原 Toolbar 内容保持不变,作为第一章 **Commit**: YES - Message: `docs: 重构调用链文档,新增右键菜单和构件交互章节` @@ -761,13 +761,13 @@ bun run build # Expected: BUILD SUCCESS ``` ### Final Checklist -- [ ] 点击构件后,控制台输出选中信息 -- [ ] 有选中构件时,右键显示"构件详情"+"显示全部" -- [ ] 无选中构件时,右键只显示"显示全部" -- [ ] 点击"构件详情"弹出属性弹窗 -- [ ] 弹窗正确展示底层 API 返回的属性数据 -- [ ] 点击"显示全部"控制台输出提示 -- [ ] 构建成功 -- [ ] 调用链文档已重构为全局文档 -- [ ] 新增右键菜单章节 -- [ ] 新增构件交互章节 +- [x] 点击构件后,控制台输出选中信息 +- [x] 有选中构件时,右键显示"构件详情"+"显示全部" +- [x] 无选中构件时,右键只显示"显示全部" +- [x] 点击"构件详情"弹出属性弹窗 +- [x] 弹窗正确展示底层 API 返回的属性数据 +- [x] 点击"显示全部"控制台输出提示 +- [x] 构建成功 +- [x] 调用链文档已重构为全局文档 +- [x] 新增右键菜单章节 +- [x] 新增构件交互章节 diff --git a/AI_COLLABORATION.md b/AI_COLLABORATION.md index 512cba1..fa53341 100644 --- a/AI_COLLABORATION.md +++ b/AI_COLLABORATION.md @@ -527,9 +527,16 @@ const dialog = engine.dialog.create({ | `ButtonGroupManager` | `src/managers/button-group-manager.ts` | 管理通用按钮组 | `BimComponent` | | `EngineManager` | `src/managers/engine-manager.ts` | 管理 3D 引擎 | `BimComponent` | | `RightKeyManager` | `src/managers/right-key-manager.ts` | 管理右键菜单 (Context Menu) | `BimComponent` | -| `ModelTreeManager` | `src/managers/model-tree-manager.ts` | 模型树业务管理器 | `BimComponent` | -| `PropertyPanelManager` | `src/managers/property-panel-manager.ts` | 属性面板业务管理器 (演示 Collapse) | `BimComponent` | | `MeasureDialogManager` | `src/managers/measure-dialog-manager.ts` | 测量弹窗管理器 | `BimComponent` | +| `SectionPlaneDialogManager` | `src/managers/section-plane-dialog-manager.ts` | 拾取面剖切弹窗管理器 | `BimComponent` | +| `SectionAxisDialogManager` | `src/managers/section-axis-dialog-manager.ts` | 轴向剖切弹窗管理器 | `BimComponent` | +| `SectionBoxDialogManager` | `src/managers/section-box-dialog-manager.ts` | 剖切盒弹窗管理器 | `BimComponent` | +| `WalkControlManager` | `src/managers/walk-control-manager.ts` | 漫游控制管理器 | `BimComponent` | +| `WalkPathDialogManager` | `src/managers/walk-path-dialog-manager.ts` | 路径漫游弹窗管理器 | `BimComponent` | +| `WalkPlanViewDialogManager` | `src/managers/walk-plan-view-dialog-manager.ts` | 漫游平面图弹窗管理器 | `BimComponent` | +| `MapDialogManager` | `src/managers/map-dialog-manager.ts` | 地图弹窗管理器 | `BimComponent` | +| `ConstructTreeManagerBtn` | `src/managers/construct-tree-manager-btn.ts` | 目录树按钮/弹窗管理器 | `BimComponent` | +| `ComponentDetailManager` | `src/managers/component-detail-manager.ts` | 构件详情弹窗管理器 | `BimComponent` | ### 4.2 组件类清单 @@ -1665,4 +1672,3 @@ function example(param1: string, param2: number): boolean { --- **重要提醒**: 本文档是 AI 协作的重要参考,请保持文档与代码同步更新! - diff --git a/demo/index.html b/demo/index.html index 6db639a..39d74e5 100644 --- a/demo/index.html +++ b/demo/index.html @@ -396,7 +396,7 @@ try { // 加载模型文件(从 model 目录) - const modelUrl = 'https://lyz-1259524260.cos.ap-guangzhou.myqcloud.com/iflow/models/8634e556-a94e-4ba7-be3e-2ea1507cced5/'; + const modelUrl = 'https://lyz-1259524260.cos.ap-guangzhou.myqcloud.com/iflow/models/417664a3-76c8-4d94-9344-1337246a5d4e/'; engine.engine.loadModel(modelUrl, { position: [0, 0, 0], // 初始位置 diff --git a/demo/lib/iflow-engine.es.js b/demo/lib/iflow-engine.es.js index ff8011d..3554620 100644 --- a/demo/lib/iflow-engine.es.js +++ b/demo/lib/iflow-engine.es.js @@ -1,5 +1,5 @@ -(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode('.bim-engine-wrapper{position:relative;width:100%;height:100%;font-family:sans-serif;box-sizing:border-box;overflow:hidden;background:linear-gradient(to bottom,#d6e0eb,#f6faff)}.bim-engine-opt-btn-container{z-index:100}.bim-construct-tree-btn{position:absolute;top:20px;left:20px!important;z-index:100}.bim-btn-group-root{display:flex;gap:8px;z-index:1000;position:absolute;pointer-events:auto}.bim-btn-group-root.static{position:relative;inset:auto;transform:none}.bim-btn-group-root.dir-row{flex-direction:row;align-items:center}.bim-btn-group-root.dir-column{flex-direction:column;align-items:stretch}.bim-btn-group-section{display:flex;gap:4px;background-color:var(--bim-btn-group-section-bg, rgba(17, 17, 17, .88));border-radius:6px;padding:4px;box-shadow:0 2px 8px #0000004d,0 1px 3px #0003}.bim-btn-group-root.dir-row .bim-btn-group-section{flex-direction:row;align-items:center}.bim-btn-group-root.dir-column .bim-btn-group-section{flex-direction:column}.opt-btn-wrapper{position:relative}.opt-btn{display:flex;cursor:pointer;border-radius:4px;transition:background-color .2s,color .2s,border-color .2s;color:var(--bim-btn-text-color, #ccc);background-color:var(--bim-btn-bg, transparent);padding:6px;align-items:center;position:relative;justify-content:center;border:1px solid transparent;outline:none}.opt-btn:hover{background-color:var(--bim-btn-hover-bg, #444)}.opt-btn.active{background-color:var(--bim-btn-active-bg, rgba(255, 255, 255, .15));color:var(--bim-btn-text-active-color, #fff)}.opt-btn.disabled{opacity:.5;cursor:not-allowed}.opt-btn-icon{width:var(--bim-icon-size, 24px);height:var(--bim-icon-size, 24px);display:flex;align-items:center;justify-content:center;color:var(--bim-icon-color, #ccc);flex-shrink:0}.opt-btn-icon svg{width:100%;height:100%;fill:currentColor}.opt-btn-arrow{font-size:10px;opacity:.6;transition:transform .2s;display:inline-block;margin-left:4px}.opt-btn-arrow.rotated{transform:rotate(180deg)}.opt-btn-text-wrapper{display:flex;align-items:center;justify-content:center;pointer-events:none}.opt-btn-label{display:inline}.opt-btn.no-label .opt-btn-label{display:none}.opt-btn.align-vertical:not(.no-label){flex-direction:column;text-align:center}.opt-btn.align-vertical:not(.no-label) .opt-btn-text-wrapper{margin-top:4px}.opt-btn.align-vertical:not(.no-label) .opt-btn-label{font-size:12px;line-height:1.2}.opt-btn.align-horizontal:not(.no-label){flex-direction:row}.opt-btn.align-horizontal:not(.no-label) .opt-btn-text-wrapper{margin-left:8px}.opt-btn.align-horizontal:not(.no-label) .opt-btn-label{font-size:14px}.opt-btn.no-label .opt-btn-text-wrapper{width:0;height:0;margin:0;padding:0;overflow:visible;position:absolute;top:0;right:0}.opt-btn.no-label .opt-btn-arrow{position:absolute;top:2px;right:2px;margin:0;font-size:8px}.opt-btn-dropdown{position:absolute;background-color:var(--bim-toolbar-bg, rgba(17, 17, 17, .95));border-radius:4px;padding:4px;box-shadow:0 4px 12px #0003;z-index:1001;display:flex;flex-direction:column;border:1px solid rgba(255,255,255,.1);opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .2s ease,transform .2s cubic-bezier(.2,0,.2,1),visibility .2s}@keyframes dropdown-fade-in{0%{opacity:0;transform:translateY(-8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.opt-btn-dropdown{animation:dropdown-fade-in .2s cubic-bezier(.2,0,.2,1) forwards;opacity:1;visibility:visible;transform:none}.opt-btn-dropdown-item{display:flex;align-items:center;padding:8px 12px;cursor:pointer;border-radius:4px;color:var(--bim-btn-text-color, #ccc);transition:background .2s,border-color .2s,color .2s;box-sizing:border-box;border:1px solid transparent;outline:none}.opt-btn-dropdown-item .opt-btn-icon{color:var(--bim-icon-color, #ccc)}.opt-btn-dropdown-item:hover{background-color:var(--bim-btn-hover-bg, #444)}.opt-btn-dropdown-item.active{background-color:var(--bim-btn-active-bg, rgba(255, 255, 255, .15));color:var(--bim-btn-text-active-color, #fff)}.opt-btn-dropdown-item.align-horizontal{flex-direction:row}.opt-btn-dropdown-item.align-horizontal .opt-btn-icon{width:18px;height:18px;margin-right:8px}.opt-btn-dropdown-item.align-vertical{flex-direction:column;text-align:center}.opt-btn-dropdown-item.align-vertical .opt-btn-icon{width:24px;height:24px;margin-bottom:4px}.opt-btn-dropdown-item.align-vertical .opt-btn-dropdown-label{font-size:12px}.bim-btn-group-root.is-bottom-toolbar .opt-btn-icon{width:32px;height:32px}.bim-btn-group-root.is-bottom-toolbar .opt-btn{padding:8px}.bim-btn-group-root.type-glass-pill .bim-btn-group-section{background:var(--bim-floating-bg);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:1px solid var(--bim-floating-border);border-radius:9999px;box-shadow:var(--bim-floating-shadow);padding:8px;gap:10px}.bim-btn-group-root.type-glass-pill .opt-btn{width:48px;height:48px;min-width:48px;border-radius:9999px;background:var(--bim-floating-btn-bg);border:1px solid var(--bim-floating-btn-border);box-shadow:var(--bim-floating-btn-shadow);color:var(--bim-text-primary);padding:0;transition:all .2s ease-out}.bim-btn-group-root.type-glass-pill .opt-btn:hover{background:var(--bim-floating-btn-bg-hover);transform:scale(1.05);box-shadow:var(--bim-floating-btn-shadow-hover)}.bim-btn-group-root.type-glass-pill .opt-btn:active{transform:scale(.98)}.bim-btn-group-root.type-glass-pill .opt-btn.active{background:var(--bim-primary);border:1px solid var(--bim-primary-active);color:var(--bim-text-inverse);box-shadow:var(--bim-shadow-glow)}.bim-btn-group-root.type-glass-pill .opt-btn.active:hover{background:var(--bim-primary-hover);transform:scale(1.05)}.bim-btn-group-root.type-glass-pill .opt-btn.active:active{transform:scale(.98)}.bim-btn-group-root.type-glass-pill .opt-btn.active .opt-btn-icon{color:var(--bim-icon-inverse)}.bim-btn-group-root.type-glass-pill .opt-btn.disabled{opacity:.3;cursor:not-allowed;transform:none;box-shadow:none}.bim-btn-group-root.type-glass-pill .opt-btn-icon{width:18px;height:18px;color:var(--bim-floating-icon-color);transition:color .2s ease-out}.bim-btn-group-root.type-glass-pill .opt-btn-icon svg{width:18px;height:18px}.bim-btn-group-root.type-glass-pill .opt-btn:hover .opt-btn-icon{color:var(--bim-floating-icon-color-hover)}.bim-btn-group-root.type-glass-pill .opt-btn-label{display:none!important}.bim-btn-group-root.type-glass-pill .opt-btn-text-wrapper{position:absolute;top:2px;right:2px;width:0;height:0;margin:0;padding:0}.bim-btn-group-root.type-glass-pill .opt-btn-arrow{font-size:8px;position:absolute;top:0;right:0;color:var(--bim-text-tertiary)}.opt-btn-dropdown.type-glass-pill{background:#fffffff2;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid rgba(226,232,240,.6);border-radius:12px;box-shadow:0 8px 24px #0000001f;padding:6px}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item{display:flex;flex-direction:row;align-items:center;gap:10px;border-radius:8px;color:#334155;padding:8px 12px;font-size:13px;font-weight:400;transition:all .1s ease-out}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item:hover{background:#f1f5f9}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item:active{background:#e2e8f0}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item.active{background:#3b82f6;color:#fff}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item.active .opt-btn-icon,.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item.active .opt-btn-dropdown-label{color:#fff}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item .opt-btn-icon{width:18px;height:18px;color:#334155;flex-shrink:0}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item .opt-btn-icon svg{width:18px;height:18px}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item .opt-btn-dropdown-label{white-space:nowrap;color:#334155}.opt-btn-dropdown.type-glass-pill.theme-dark{background:var(--bim-bg-overlay);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid var(--bim-border-default);box-shadow:var(--bim-shadow-lg)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item{color:var(--bim-text-primary)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item:hover{background:var(--bim-floating-btn-bg)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item:active{background:var(--bim-floating-btn-bg-hover)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item.active{background:var(--bim-primary);color:var(--bim-text-inverse)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item .opt-btn-icon{color:var(--bim-floating-icon-color)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item .opt-btn-dropdown-label{color:var(--bim-text-primary)}.bim-dialog{position:absolute;background-color:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);border-radius:var(--bim-panel-radius, 12px);box-shadow:var(--bim-shadow-lg);display:flex;flex-direction:column;z-index:10001;color:var(--bim-dialog-title-color, var(--bim-text-primary));overflow:hidden;min-width:200px;min-height:100px;pointer-events:auto}.bim-dialog-header{height:40px;background-color:var(--bim-bg-inset);display:flex;align-items:center;justify-content:space-between;padding:0 12px;cursor:default;-webkit-user-select:none;user-select:none;border-bottom:1px solid var(--bim-border-default);flex-shrink:0}.bim-dialog-header.draggable{cursor:move}.bim-dialog-title{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--bim-dialog-title-color)}.bim-dialog-close{cursor:pointer;font-size:18px;color:var(--bim-text-tertiary);line-height:1;margin-left:8px}.bim-dialog-close:hover{color:var(--bim-text-primary)}.bim-dialog-content{flex:1;overflow:auto;font-size:14px;color:var(--bim-dialog-text-color, var(--bim-text-secondary))}.bim-dialog-resize-handle{position:absolute;width:10px;height:10px;bottom:0;right:0;cursor:se-resize;z-index:10}.bim-dialog-resize-handle:after{content:"";position:absolute;bottom:3px;right:3px;width:6px;height:6px;border-right:2px solid var(--bim-text-tertiary);border-bottom:2px solid var(--bim-text-tertiary)}.bim-dialog-resize-handle:hover:after{border-color:var(--bim-text-primary)}.bim-info-dialog-content{padding:16px;font-family:sans-serif;color:#333}.bim-info-dialog-content h3{margin-top:0;margin-bottom:12px;border-bottom:1px solid #eee;padding-bottom:8px;color:#0078d4}.bim-info-dialog-content ul{list-style:none;padding:0;margin:0}.bim-info-dialog-content li{margin-bottom:8px;font-size:14px;display:flex}.bim-info-dialog-content li strong{width:80px;color:#555}.bim-right-key{position:fixed;z-index:10000;display:none;background:transparent}.bim-right-key.visible{display:block}.bim-menu{display:flex;flex-direction:column;background:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);border-radius:8px;padding:6px;margin:0;list-style:none;min-width:160px;box-shadow:var(--bim-shadow-lg);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;-webkit-user-select:none;user-select:none;color:var(--bim-text-primary)}.bim-menu-group{display:flex;flex-direction:column}.bim-menu-divider{height:1px;background-color:var(--bim-divider);margin:4px 0}.bim-menu-item{display:flex;align-items:center;padding:8px 12px;cursor:pointer;transition:all .2s ease;font-size:13px;position:relative;color:var(--bim-text-primary);border-radius:6px}.bim-menu-item:hover{background-color:var(--bim-floating-btn-bg);transform:translate(2px)}.bim-menu-item.disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.bim-menu-item-icon{width:16px;height:16px;margin-right:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.bim-menu-item-icon svg{width:100%;height:100%;fill:currentColor}.bim-menu-item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bim-menu-item-arrow{width:12px;height:12px;margin-left:8px;display:flex;align-items:center;justify-content:center;opacity:.7}.bim-menu-item-arrow svg{width:100%;height:100%;fill:currentColor}.bim-tree{width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden;font-size:14px;color:var(--bim-text-primary);-webkit-user-select:none;user-select:none;position:relative;background:transparent}.bim-tree-search{padding:6px;background-color:transparent;flex-shrink:0;position:relative}.bim-tree-search-wrapper{position:relative;width:100%;display:flex;align-items:center}.bim-tree-search-icon{position:absolute;left:8px;width:16px;height:16px;color:var(--bim-text-secondary);pointer-events:none;display:flex;align-items:center;justify-content:center}.bim-tree-search-icon svg{width:100%;height:100%}.bim-tree-search-input{width:100%;height:30px;padding:4px 8px 4px 30px;border:1px solid var(--bim-border-default);border-radius:4px;outline:none;font-size:13px;color:inherit;background-color:var(--bim-bg-elevated);transition:all .2s;box-sizing:border-box}.bim-tree-search-input:focus{border-color:var(--bim-primary);box-shadow:var(--bim-focus-ring)}.bim-tree-search-results{position:absolute;top:100%;left:8px;right:8px;background-color:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);box-shadow:var(--bim-shadow-md);border-radius:4px;max-height:200px;overflow-y:auto;z-index:10;display:none}.bim-tree-search-results.is-visible{display:block}.bim-tree-search-item{padding:8px 12px;cursor:pointer;border-bottom:1px solid rgba(0,0,0,.03)}.bim-tree-search-item:last-child{border-bottom:none}.bim-tree-search-item:hover{background-color:var(--bim-component-bg-hover)}.bim-tree-search-item-title{font-weight:500;display:block}.bim-tree-search-item-path{font-size:12px;color:var(--bim-text-secondary);margin-top:2px;display:block}.bim-tree-content{flex:1;overflow-y:auto;padding:2px 0;min-height:0}.bim-tree-node{display:flex;flex-direction:column}.bim-tree-node-content{display:flex;align-items:center;height:32px;cursor:pointer;transition:background-color .2s;border-radius:4px;padding-right:8px}.bim-tree-node-content:hover{background-color:var(--bim-component-bg-hover)}.bim-tree-switcher{width:24px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--bim-text-secondary);transition:transform .2s;flex-shrink:0}.bim-tree-switcher svg{width:12px;height:12px;fill:currentColor;transition:transform .2s}.bim-tree-switcher.is-expanded svg{transform:rotate(90deg)}.bim-tree-switcher.is-hidden{visibility:hidden}.bim-tree-checkbox{width:16px;height:16px;border:1px solid var(--bim-border-default);border-radius:2px;margin-right:8px;background-color:var(--bim-bg-elevated);position:relative;cursor:pointer;flex-shrink:0;transition:all .2s}.bim-tree-checkbox:hover{border-color:var(--bim-primary)}.bim-tree-checkbox.is-checked{background-color:var(--bim-primary);border-color:var(--bim-primary)}.bim-tree-checkbox.is-checked:after{content:"";position:absolute;top:1px;left:4px;width:5px;height:9px;border:2px solid var(--bim-text-inverse);border-top:0;border-left:0;transform:rotate(45deg)}.bim-tree-checkbox.is-indeterminate{background-color:var(--bim-bg-elevated);border-color:var(--bim-primary)}.bim-tree-checkbox.is-indeterminate:after{content:"";position:absolute;top:6px;left:3px;width:8px;height:2px;background-color:var(--bim-primary)}.bim-tree-node.is-disabled .bim-tree-checkbox{background-color:var(--bim-component-bg-disabled);border-color:var(--bim-border-disabled);cursor:not-allowed}.bim-tree-node.is-disabled .bim-tree-checkbox.is-checked{background-color:var(--bim-text-disabled)}.bim-tree-node.is-disabled .bim-tree-node-content{color:var(--bim-text-disabled);cursor:not-allowed}.bim-tree-icon{width:16px;height:16px;margin-right:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.bim-tree-icon img,.bim-tree-icon svg{width:100%;height:100%}.bim-tree-title{flex:1;white-space:nowrap}.bim-tree-children{display:none;overflow:visible}.bim-tree-children.is-visible{display:block}.bim-tree-node-content.is-selected{background-color:var(--bim-component-bg-selected);color:var(--bim-primary)}.bim-tree-node-actions{display:none;align-items:center;margin-left:8px;flex-shrink:0}.bim-tree-node-content.is-selected .bim-tree-node-actions{display:flex}.bim-tree-content{flex:1;overflow:auto;padding:2px 0;min-height:0}.bim-tree-node{display:flex;flex-direction:column;width:fit-content;min-width:100%}.bim-tree-node-content{display:flex;align-items:center;height:32px;cursor:pointer;transition:background-color .2s;border-radius:4px;padding-right:8px;width:fit-content;min-width:100%;box-sizing:border-box}.bim-tab{display:flex;flex-direction:column;width:100%;height:100%;background:transparent;color:var(--bim-text-secondary)}.bim-tab__nav{display:flex;align-items:center;gap:4px;padding:4px;margin:8px 12px;background:var(--bim-bg-inset);border-radius:8px;border:1px solid var(--bim-border-subtle)}.bim-tab__item{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 12px;border:none;border-radius:6px;background:transparent;color:var(--bim-text-secondary);cursor:pointer;transition:all .2s ease;font-size:13px;font-weight:500}.bim-tab__item:hover{color:var(--bim-text-primary);background-color:var(--bim-component-bg-hover)}.bim-tab__item.is-active{color:var(--bim-primary);background-color:var(--bim-bg-elevated);box-shadow:0 1px 3px #0000001a}.bim-tab__item.is-disabled{opacity:.5;cursor:not-allowed}.bim-tab__icon{width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;color:var(--bim-tab-icon, currentColor)}.bim-tab__icon svg{width:100%;height:100%;fill:currentColor}.bim-tab__title{white-space:nowrap}.bim-tab__content{flex:1;display:flex;position:relative;min-height:0;overflow:hidden}.bim-tab__panel{display:none;width:100%;height:100%;flex:1}.bim-tab__panel.is-active{display:flex;flex-direction:column;height:100%}.construct-tab__container{height:100%;display:flex;flex-direction:column}.construct-tab__panel-content{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden}.construct-tab__panel-content .bim-tree{flex:1}.bim-collapse{background-color:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);border-radius:8px;font-size:14px;color:var(--bim-text-primary)}.bim-collapse.is-ghost{background-color:transparent;border:none}.bim-collapse.is-ghost .bim-collapse-item{border-bottom:none}.bim-collapse.is-ghost .bim-collapse-header{background-color:transparent;padding-left:0;padding-right:0}.bim-collapse.is-ghost .bim-collapse-content{background-color:transparent;border-top:none}.bim-collapse-item{border-bottom:1px solid var(--bim-border-subtle)}.bim-collapse-item:last-child{border-bottom:none}.bim-collapse-item.is-disabled .bim-collapse-header{color:var(--bim-text-disabled);cursor:not-allowed}.bim-collapse-header{display:flex;align-items:center;padding:12px 16px;background-color:var(--bim-component-bg);cursor:pointer;transition:all .2s ease;position:relative}.bim-collapse-header:hover{background-color:var(--bim-component-bg-hover)}.bim-collapse-arrow{margin-right:12px;font-size:12px;width:12px;height:12px;transition:transform .24s;display:inline-flex;align-items:center;justify-content:center}.bim-collapse-arrow svg{width:100%;height:100%;fill:currentColor}.bim-collapse-item.is-active .bim-collapse-arrow{transform:rotate(90deg)}.bim-collapse-icon{margin-right:8px;display:inline-flex;align-items:center}.bim-collapse-icon svg{width:16px;height:16px;fill:currentColor}.bim-collapse-title{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.bim-collapse-extra{margin-left:auto}.bim-collapse-content{overflow:hidden;background-color:var(--bim-bg-elevated);border-top:1px solid var(--bim-border-subtle);transition:height .2s ease-in-out,opacity .2s ease-in-out}.bim-collapse-content.is-hidden{display:none}.bim-description{display:flex;flex-direction:column;width:100%;font-size:14px;color:var(--bim-text-primary);padding:0}.bim-description-item{display:flex;align-items:stretch;padding:0;line-height:1.5}.bim-description.is-bordered{border-bottom:none}.bim-description.is-bordered .bim-description-item{border-bottom:1px solid var(--bim-border-subtle)}.bim-description-label{color:var(--bim-text-secondary);flex-shrink:0;padding:4px;display:flex;align-items:center}.bim-description.is-bordered .bim-description-label{border-right:1px solid var(--bim-border-subtle)}.bim-description-value{color:var(--bim-text-primary);flex:1;word-break:break-all;padding:4px;display:flex;align-items:center}.bim-measure-panel{width:100%;display:flex;flex-direction:column;box-sizing:border-box;color:var(--bim-text-secondary)}.bim-measure-settings{display:none;box-sizing:border-box;color:var(--bim-text-secondary)}.bim-measure-settings-title{font-size:14px;font-weight:600;margin-bottom:10px}.bim-measure-settings-row{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}.bim-measure-settings-row .label{color:var(--bim-text-secondary);font-size:13px;flex:0 0 auto}.bim-measure-settings-select{flex:0 0 auto;width:120px;height:28px;border-radius:6px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);color:var(--bim-text-primary);padding:0 8px;box-sizing:border-box;outline:none}.bim-measure-settings-hint{font-size:12px;line-height:1.4;color:var(--bim-text-tertiary);margin-top:-4px;margin-bottom:8px}.bim-measure-settings-actions{margin-top:14px;display:flex;justify-content:flex-start;gap:10px}.bim-measure-settings-save,.bim-measure-settings-cancel{flex:0 0 auto!important;width:auto;min-width:0;height:30px;padding:0 12px;border-radius:4px;cursor:pointer;box-sizing:border-box}.bim-measure-settings-save{border:none;background:var(--bim-primary);color:var(--bim-text-inverse)}.bim-measure-settings-cancel{border:1px solid var(--bim-border-default);background:transparent;color:var(--bim-text-secondary)}.bim-measure-settings-save:hover,.bim-measure-settings-save:active,.bim-measure-settings-save:focus,.bim-measure-settings-cancel:hover,.bim-measure-settings-cancel:active,.bim-measure-settings-cancel:focus{background:inherit;outline:none}.bim-measure-settings-save:hover{background:var(--bim-primary-hover)}.bim-measure-tools{display:flex;flex-direction:column;gap:8px}.bim-measure-tool-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.bim-measure-tool-btn{width:100%;height:42px;border-radius:6px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease;padding:0;box-sizing:border-box}.bim-measure-tool-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.bim-measure-tool-btn.is-active{border-color:var(--bim-primary);background:var(--bim-primary-subtle)}.bim-measure-tool-btn.is-active .bim-measure-tool-icon{color:var(--bim-primary)}.bim-measure-tool-icon{width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;color:var(--bim-icon-default)}.bim-measure-tool-icon svg{width:100%;height:100%;fill:currentColor}.bim-measure-toggle{display:flex;justify-content:flex-end}.bim-measure-toggle-btn{height:22px;border-radius:4px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:all .2s ease;padding:0 6px;gap:4px;font-size:12px;line-height:1}.bim-measure-toggle-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.bim-measure-toggle-text{color:var(--bim-text-secondary)}.bim-measure-toggle-icon svg{width:14px;height:14px;fill:currentColor;color:var(--bim-icon-default);transition:transform .15s ease}.bim-measure-toggle-btn.is-expanded .bim-measure-toggle-icon svg{transform:rotate(180deg)}.bim-measure-result{margin-top:12px;padding-top:12px;border-top:1px solid var(--bim-divider);display:flex;flex-direction:column;gap:10px}.bim-measure-row{display:flex;align-items:baseline;gap:8px;font-size:13px;line-height:1.4}.bim-measure-row .label{color:var(--bim-text-secondary);min-width:84px}.bim-measure-row .value{color:var(--bim-text-primary);flex:1;word-break:break-word}.bim-measure-main-number{color:#ffd24a}.bim-measure-main-number.is-laser-text,.bim-measure-main-unit{color:var(--bim-text-primary)}.bim-measure-xyz{display:flex;flex-direction:column;gap:6px}.bim-measure-xyz .value{font-variant-numeric:tabular-nums}.bim-measure-xyz-x{color:#ff4d4f!important}.bim-measure-xyz-y{color:#52c41a!important}.bim-measure-xyz-z{color:#1677ff!important}.bim-measure-footer{margin-top:12px;padding-top:10px;border-top:1px solid var(--bim-divider);display:flex;align-items:center;justify-content:flex-start;gap:10px}.bim-measure-clear-btn{background:transparent;border:none;color:var(--bim-danger);cursor:pointer;padding:0;font-size:13px;flex:0 0 auto!important;width:auto;min-width:0}.bim-measure-clear-btn:hover,.bim-measure-clear-btn:active,.bim-measure-clear-btn:focus{background:transparent;border:none;outline:none;text-decoration:none}.bim-measure-settings-btn{width:24px;height:24px;border-radius:4px;border:none;background:transparent;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0;margin-left:auto;flex:0 0 auto!important}.bim-measure-settings-btn:hover,.bim-measure-settings-btn:active,.bim-measure-settings-btn:focus{background:transparent;border:none;outline:none}.bim-measure-settings-btn svg{width:18px;height:18px;fill:currentColor;color:var(--bim-icon-default)}.section-plane-panel{display:flex;gap:8px;padding:12px 12px 16px;box-sizing:border-box}.section-plane-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:10px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);border-radius:8px;cursor:pointer;transition:all .2s ease;min-width:60px;outline:none;color:var(--bim-text-primary)}.section-plane-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.section-plane-btn:active{background:var(--bim-primary-subtle);border-color:var(--bim-primary)}.section-plane-btn.is-active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.section-plane-btn.is-active .section-plane-btn-icon{color:var(--bim-primary)}.section-plane-btn-icon{width:24px;height:24px;display:flex;align-items:center;justify-content:center;color:var(--bim-icon-default)}.section-plane-btn-icon svg{width:100%;height:100%;fill:currentColor}.section-plane-btn-label{font-size:12px;color:inherit;text-align:center;line-height:1.2}.section-axis-panel{display:flex;flex-direction:column;gap:8px;padding:12px 12px 16px;box-sizing:border-box}.section-axis-row-1{display:flex;gap:8px;padding-bottom:8px;border-bottom:1px solid var(--bim-divider)}.section-axis-row-2{display:flex;gap:8px;padding-top:8px}.section-axis-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:8px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:8px;cursor:pointer;transition:all .2s ease;outline:none;color:var(--bim-text-primary);min-height:48px}.section-axis-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.section-axis-btn.active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.section-axis-btn.active .section-axis-btn-icon{color:var(--bim-primary)}.section-axis-btn-icon{width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;color:var(--bim-icon-default)}.section-axis-btn-icon svg{width:100%;height:100%}.section-axis-btn-label{font-size:12px;color:inherit;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.section-axis-btn-text{min-height:40px}.section-axis-btn-text .section-axis-btn-label{font-size:18px;font-weight:600}.section-box-panel{display:flex;flex-direction:column;padding:12px;box-sizing:border-box;-webkit-user-select:none;user-select:none}.section-box-row-buttons{display:flex;gap:6px;padding-bottom:12px;border-bottom:1px solid var(--bim-divider)}.section-box-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:6px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:8px;cursor:pointer;color:var(--bim-text-primary);min-height:44px;transition:all .2s ease}.section-box-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.section-box-btn.active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.section-box-btn.active .section-box-btn-icon{color:var(--bim-primary)}.section-box-btn-icon{width:24px;height:24px;color:var(--bim-icon-default)}.section-box-btn-icon svg{width:100%;height:100%}.section-box-btn-label{font-size:11px;white-space:nowrap}.section-box-sliders{display:flex;flex-direction:column;gap:16px;padding-top:16px}.section-box-slider{display:flex;align-items:center;gap:12px;position:relative;z-index:1}.section-box-slider:hover{z-index:10}.section-box-slider-label{font-size:13px;font-weight:700;color:var(--bim-text-primary);min-width:14px}.section-box-slider-track{position:relative;flex:1;height:4px;background:var(--bim-border-default);border-radius:2px}.section-box-slider-range{position:absolute;top:0;height:100%;background:var(--bim-primary);border-radius:2px;pointer-events:none}.section-box-slider-handle{position:absolute;top:50%;width:14px;height:14px;background:var(--bim-bg-elevated);border:2px solid var(--bim-primary);border-radius:50%;transform:translate(-50%,-50%);cursor:grab;z-index:5;touch-action:none;transition:transform .2s,box-shadow .2s}.section-box-slider-handle:hover{transform:translate(-50%,-50%) scale(1.2);box-shadow:0 0 0 4px var(--bim-primary-subtle)}.section-box-slider-handle.dragging{cursor:grabbing;transform:translate(-50%,-50%) scale(1.2);background:var(--bim-primary)}.walk-control-panel{display:flex;align-items:center;gap:20px;padding:12px 20px;background-color:var(--bim-bg-base, #152232);border:1px solid var(--bim-border-strong, #475569);border-radius:12px;box-shadow:var(--bim-shadow-xl, 0 20px 40px rgba(0, 0, 0, .3));-webkit-user-select:none;user-select:none}.walk-divider{width:1px;height:40px;background:var(--bim-divider);flex-shrink:0}.walk-control-left{display:flex;gap:8px}.walk-icon-btn{width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:8px;cursor:pointer;transition:all .2s ease;color:var(--bim-icon-default);padding:8px}.walk-icon-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.walk-icon-btn.active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.walk-icon-btn.active svg{fill:var(--bim-primary)}.walk-icon-btn svg{width:32px;height:32px}.walk-control-settings{display:flex;align-items:center;gap:16px;flex:1}.walk-speed-control{display:flex;align-items:center;gap:12px}.walk-speed-label{color:var(--bim-text-primary);font-size:14px;white-space:nowrap}.walk-speed-group{display:flex;align-items:center;gap:8px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-subtle);border-radius:6px;padding:4px}.walk-speed-btn{width:32px;height:32px;background:var(--bim-bg-elevated);border:1px solid var(--bim-border-subtle);border-radius:4px;color:var(--bim-text-primary);font-size:18px;cursor:pointer;transition:all .2s ease}.walk-speed-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.walk-speed-btn:disabled{opacity:.5;cursor:not-allowed}.walk-speed-display{min-width:40px;text-align:center;color:var(--bim-text-primary);font-size:14px;font-weight:700}.walk-checkbox-wrapper{display:flex;align-items:center;gap:8px;cursor:pointer}.walk-checkbox{width:18px;height:18px;cursor:pointer}.walk-checkbox:disabled{opacity:.5;cursor:not-allowed}.walk-checkbox-label{color:var(--bim-text-primary);font-size:14px;white-space:nowrap}.walk-checkbox-wrapper input:disabled+.walk-checkbox-label{opacity:.5}.walk-select-wrapper{display:flex;align-items:center;gap:8px}.walk-select-label{color:var(--bim-text-primary);font-size:14px;white-space:nowrap}.walk-select{padding:6px 12px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:6px;color:var(--bim-text-primary);font-size:14px;cursor:pointer;min-width:120px}.walk-select option{background:var(--bim-bg-elevated);color:var(--bim-text-primary)}.walk-exit-btn{padding:10px 24px;background:var(--bim-primary);border:none;border-radius:8px;color:var(--bim-text-inverse);font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease;white-space:nowrap}.walk-exit-btn:hover{background:var(--bim-primary-hover);transform:scale(1.02)}')),document.head.appendChild(e)}}catch(o){console.error("vite-plugin-css-injected-by-js",o)}})(); -const tg = { +(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode('.bim-engine-wrapper{position:relative;width:100%;height:100%;font-family:sans-serif;box-sizing:border-box;overflow:hidden;background:linear-gradient(to bottom,#d6e0eb,#f6faff)}.bim-engine-opt-btn-container{z-index:100}.bim-construct-tree-btn{position:absolute;top:20px;left:20px!important;z-index:100}.bim-btn-group-root{display:flex;gap:8px;z-index:1000;position:absolute;pointer-events:auto}.bim-btn-group-root.static{position:relative;inset:auto;transform:none}.bim-btn-group-root.dir-row{flex-direction:row;align-items:center}.bim-btn-group-root.dir-column{flex-direction:column;align-items:stretch}.bim-btn-group-section{display:flex;gap:4px;background-color:var(--bim-btn-group-section-bg, rgba(17, 17, 17, .88));border-radius:6px;padding:4px;box-shadow:0 2px 8px #0000004d,0 1px 3px #0003}.bim-btn-group-root.dir-row .bim-btn-group-section{flex-direction:row;align-items:center}.bim-btn-group-root.dir-column .bim-btn-group-section{flex-direction:column}.opt-btn-wrapper{position:relative}.opt-btn{display:flex;cursor:pointer;border-radius:4px;transition:background-color .2s,color .2s,border-color .2s;color:var(--bim-btn-text-color, #ccc);background-color:var(--bim-btn-bg, transparent);padding:6px;align-items:center;position:relative;justify-content:center;border:1px solid transparent;outline:none}.opt-btn:hover{background-color:var(--bim-btn-hover-bg, #444)}.opt-btn.active{background-color:var(--bim-btn-active-bg, rgba(255, 255, 255, .15));color:var(--bim-btn-text-active-color, #fff)}.opt-btn.disabled{opacity:.5;cursor:not-allowed}.opt-btn-icon{width:var(--bim-icon-size, 24px);height:var(--bim-icon-size, 24px);display:flex;align-items:center;justify-content:center;color:var(--bim-icon-color, #ccc);flex-shrink:0}.opt-btn-icon svg{width:100%;height:100%;fill:currentColor}.opt-btn-arrow{font-size:10px;opacity:.6;transition:transform .2s;display:inline-block;margin-left:4px}.opt-btn-arrow.rotated{transform:rotate(180deg)}.opt-btn-text-wrapper{display:flex;align-items:center;justify-content:center;pointer-events:none}.opt-btn-label{display:inline}.opt-btn.no-label .opt-btn-label{display:none}.opt-btn.align-vertical:not(.no-label){flex-direction:column;text-align:center}.opt-btn.align-vertical:not(.no-label) .opt-btn-text-wrapper{margin-top:4px}.opt-btn.align-vertical:not(.no-label) .opt-btn-label{font-size:12px;line-height:1.2}.opt-btn.align-horizontal:not(.no-label){flex-direction:row}.opt-btn.align-horizontal:not(.no-label) .opt-btn-text-wrapper{margin-left:8px}.opt-btn.align-horizontal:not(.no-label) .opt-btn-label{font-size:14px}.opt-btn.no-label .opt-btn-text-wrapper{width:0;height:0;margin:0;padding:0;overflow:visible;position:absolute;top:0;right:0}.opt-btn.no-label .opt-btn-arrow{position:absolute;top:2px;right:2px;margin:0;font-size:8px}.opt-btn-dropdown{position:absolute;background-color:var(--bim-toolbar-bg, rgba(17, 17, 17, .95));border-radius:4px;padding:4px;box-shadow:0 4px 12px #0003;z-index:1001;display:flex;flex-direction:column;border:1px solid rgba(255,255,255,.1);opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .2s ease,transform .2s cubic-bezier(.2,0,.2,1),visibility .2s}@keyframes dropdown-fade-in{0%{opacity:0;transform:translateY(-8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.opt-btn-dropdown{animation:dropdown-fade-in .2s cubic-bezier(.2,0,.2,1) forwards;opacity:1;visibility:visible;transform:none}.opt-btn-dropdown-item{display:flex;align-items:center;padding:8px 12px;cursor:pointer;border-radius:4px;color:var(--bim-btn-text-color, #ccc);transition:background .2s,border-color .2s,color .2s;box-sizing:border-box;border:1px solid transparent;outline:none}.opt-btn-dropdown-item .opt-btn-icon{color:var(--bim-icon-color, #ccc)}.opt-btn-dropdown-item:hover{background-color:var(--bim-btn-hover-bg, #444)}.opt-btn-dropdown-item.active{background-color:var(--bim-btn-active-bg, rgba(255, 255, 255, .15));color:var(--bim-btn-text-active-color, #fff)}.opt-btn-dropdown-item.align-horizontal{flex-direction:row}.opt-btn-dropdown-item.align-horizontal .opt-btn-icon{width:18px;height:18px;margin-right:8px}.opt-btn-dropdown-item.align-vertical{flex-direction:column;text-align:center}.opt-btn-dropdown-item.align-vertical .opt-btn-icon{width:24px;height:24px;margin-bottom:4px}.opt-btn-dropdown-item.align-vertical .opt-btn-dropdown-label{font-size:12px}.bim-btn-group-root.is-bottom-toolbar .opt-btn-icon{width:32px;height:32px}.bim-btn-group-root.is-bottom-toolbar .opt-btn{padding:8px}.bim-btn-group-root.type-glass-pill .bim-btn-group-section{background:var(--bim-floating-bg);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:1px solid var(--bim-floating-border);border-radius:9999px;box-shadow:var(--bim-floating-shadow);padding:8px;gap:10px}.bim-btn-group-root.type-glass-pill .opt-btn{width:48px;height:48px;min-width:48px;border-radius:9999px;background:var(--bim-floating-btn-bg);border:1px solid var(--bim-floating-btn-border);box-shadow:var(--bim-floating-btn-shadow);color:var(--bim-text-primary);padding:0;transition:all .2s ease-out}.bim-btn-group-root.type-glass-pill .opt-btn:hover{background:var(--bim-floating-btn-bg-hover);transform:scale(1.05);box-shadow:var(--bim-floating-btn-shadow-hover)}.bim-btn-group-root.type-glass-pill .opt-btn:active{transform:scale(.98)}.bim-btn-group-root.type-glass-pill .opt-btn.active{background:var(--bim-primary);border:1px solid var(--bim-primary-active);color:var(--bim-text-inverse);box-shadow:var(--bim-shadow-glow)}.bim-btn-group-root.type-glass-pill .opt-btn.active:hover{background:var(--bim-primary-hover);transform:scale(1.05)}.bim-btn-group-root.type-glass-pill .opt-btn.active:active{transform:scale(.98)}.bim-btn-group-root.type-glass-pill .opt-btn.active .opt-btn-icon{color:var(--bim-icon-inverse)}.bim-btn-group-root.type-glass-pill .opt-btn.disabled{opacity:.3;cursor:not-allowed;transform:none;box-shadow:none}.bim-btn-group-root.type-glass-pill .opt-btn-icon{width:18px;height:18px;color:var(--bim-floating-icon-color);transition:color .2s ease-out}.bim-btn-group-root.type-glass-pill .opt-btn-icon svg{width:18px;height:18px}.bim-btn-group-root.type-glass-pill .opt-btn:hover .opt-btn-icon{color:var(--bim-floating-icon-color-hover)}.bim-btn-group-root.type-glass-pill .opt-btn-label{display:none!important}.bim-btn-group-root.type-glass-pill .opt-btn-text-wrapper{position:absolute;top:2px;right:2px;width:0;height:0;margin:0;padding:0}.bim-btn-group-root.type-glass-pill .opt-btn-arrow{font-size:8px;position:absolute;top:0;right:0;color:var(--bim-text-tertiary)}.opt-btn-dropdown.type-glass-pill{background:#fffffff2;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid rgba(226,232,240,.6);border-radius:12px;box-shadow:0 8px 24px #0000001f;padding:6px}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item{display:flex;flex-direction:row;align-items:center;gap:10px;border-radius:8px;color:#334155;padding:8px 12px;font-size:13px;font-weight:400;transition:all .1s ease-out}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item:hover{background:#f1f5f9}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item:active{background:#e2e8f0}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item.active{background:#3b82f6;color:#fff}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item.active .opt-btn-icon,.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item.active .opt-btn-dropdown-label{color:#fff}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item .opt-btn-icon{width:18px;height:18px;color:#334155;flex-shrink:0}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item .opt-btn-icon svg{width:18px;height:18px}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item .opt-btn-dropdown-label{white-space:nowrap;color:#334155}.opt-btn-dropdown.type-glass-pill.theme-dark{background:var(--bim-bg-overlay);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid var(--bim-border-default);box-shadow:var(--bim-shadow-lg)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item{color:var(--bim-text-primary)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item:hover{background:var(--bim-floating-btn-bg)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item:active{background:var(--bim-floating-btn-bg-hover)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item.active{background:var(--bim-primary);color:var(--bim-text-inverse)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item .opt-btn-icon{color:var(--bim-floating-icon-color)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item .opt-btn-dropdown-label{color:var(--bim-text-primary)}.bim-dialog{position:absolute;background-color:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);border-radius:var(--bim-panel-radius, 12px);box-shadow:var(--bim-shadow-lg);display:flex;flex-direction:column;z-index:10001;color:var(--bim-dialog-title-color, var(--bim-text-primary));overflow:hidden;min-width:200px;min-height:100px;pointer-events:auto}.bim-dialog-header{height:40px;background-color:var(--bim-bg-inset);display:flex;align-items:center;justify-content:space-between;padding:0 12px;cursor:default;-webkit-user-select:none;user-select:none;border-bottom:1px solid var(--bim-border-default);flex-shrink:0}.bim-dialog-header.draggable{cursor:move}.bim-dialog-title{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--bim-dialog-title-color)}.bim-dialog-close{cursor:pointer;font-size:18px;color:var(--bim-text-tertiary);line-height:1;margin-left:8px}.bim-dialog-close:hover{color:var(--bim-text-primary)}.bim-dialog-content{flex:1;overflow:auto;font-size:14px;color:var(--bim-dialog-text-color, var(--bim-text-secondary))}.bim-dialog-resize-handle{position:absolute;width:10px;height:10px;bottom:0;right:0;cursor:se-resize;z-index:10}.bim-dialog-resize-handle:after{content:"";position:absolute;bottom:3px;right:3px;width:6px;height:6px;border-right:2px solid var(--bim-text-tertiary);border-bottom:2px solid var(--bim-text-tertiary)}.bim-dialog-resize-handle:hover:after{border-color:var(--bim-text-primary)}.bim-info-dialog-content{padding:16px;font-family:sans-serif;color:#333}.bim-info-dialog-content h3{margin-top:0;margin-bottom:12px;border-bottom:1px solid #eee;padding-bottom:8px;color:#0078d4}.bim-info-dialog-content ul{list-style:none;padding:0;margin:0}.bim-info-dialog-content li{margin-bottom:8px;font-size:14px;display:flex}.bim-info-dialog-content li strong{width:80px;color:#555}.bim-right-key{position:fixed;z-index:10000;display:none;background:transparent}.bim-right-key.visible{display:block}.bim-menu{display:flex;flex-direction:column;background:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);border-radius:8px;padding:6px;margin:0;list-style:none;box-shadow:var(--bim-shadow-lg);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;-webkit-user-select:none;user-select:none;color:var(--bim-text-primary)}.bim-menu-group{display:flex;flex-direction:column}.bim-menu-divider{height:1px;background-color:var(--bim-divider);margin:4px 0}.bim-menu-item{display:flex;align-items:center;padding:8px 12px;cursor:pointer;transition:all .2s ease;font-size:13px;position:relative;color:var(--bim-text-primary);border-radius:6px}.bim-menu-item:hover{background-color:var(--bim-component-bg-hover)}.bim-menu-item.disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.bim-menu-item-icon{display:none}.bim-menu.has-icons .bim-menu-item-icon{width:16px;height:16px;margin-right:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.bim-menu-item-icon svg{width:100%;height:100%;fill:currentColor}.bim-menu-item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bim-menu-item-arrow{width:12px;height:12px;margin-left:8px;display:flex;align-items:center;justify-content:center;opacity:.7}.bim-menu-item-arrow svg{width:100%;height:100%;fill:currentColor}.bim-tree{width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden;font-size:14px;color:var(--bim-text-primary);-webkit-user-select:none;user-select:none;position:relative;background:transparent}.bim-tree-search{padding:6px;background-color:transparent;flex-shrink:0;position:relative}.bim-tree-search-wrapper{position:relative;width:100%;display:flex;align-items:center}.bim-tree-search-icon{position:absolute;left:8px;width:16px;height:16px;color:var(--bim-text-secondary);pointer-events:none;display:flex;align-items:center;justify-content:center}.bim-tree-search-icon svg{width:100%;height:100%}.bim-tree-search-input{width:100%;height:30px;padding:4px 8px 4px 30px;border:1px solid var(--bim-border-default);border-radius:4px;outline:none;font-size:13px;color:inherit;background-color:var(--bim-bg-elevated);transition:all .2s;box-sizing:border-box}.bim-tree-search-input:focus{border-color:var(--bim-primary);box-shadow:var(--bim-focus-ring)}.bim-tree-search-results{position:absolute;top:100%;left:8px;right:8px;background-color:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);box-shadow:var(--bim-shadow-md);border-radius:4px;max-height:200px;overflow-y:auto;z-index:10;display:none}.bim-tree-search-results.is-visible{display:block}.bim-tree-search-item{padding:8px 12px;cursor:pointer;border-bottom:1px solid rgba(0,0,0,.03)}.bim-tree-search-item:last-child{border-bottom:none}.bim-tree-search-item:hover{background-color:var(--bim-component-bg-hover)}.bim-tree-search-item-title{font-weight:500;display:block}.bim-tree-search-item-path{font-size:12px;color:var(--bim-text-secondary);margin-top:2px;display:block}.bim-tree-content{flex:1;overflow-y:auto;padding:2px 0;min-height:0}.bim-tree-node{display:flex;flex-direction:column}.bim-tree-node-content{display:flex;align-items:center;height:32px;cursor:pointer;transition:background-color .2s;border-radius:4px;padding-right:8px}.bim-tree-node-content:hover{background-color:var(--bim-component-bg-hover)}.bim-tree-switcher{width:24px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--bim-text-secondary);transition:transform .2s;flex-shrink:0}.bim-tree-switcher svg{width:12px;height:12px;fill:currentColor;transition:transform .2s}.bim-tree-switcher.is-expanded svg{transform:rotate(90deg)}.bim-tree-switcher.is-hidden{visibility:hidden}.bim-tree-checkbox{width:16px;height:16px;border:1px solid var(--bim-border-default);border-radius:2px;margin-right:8px;background-color:var(--bim-bg-elevated);position:relative;cursor:pointer;flex-shrink:0;transition:all .2s}.bim-tree-checkbox:hover{border-color:var(--bim-primary)}.bim-tree-checkbox.is-checked{background-color:var(--bim-primary);border-color:var(--bim-primary)}.bim-tree-checkbox.is-checked:after{content:"";position:absolute;top:1px;left:4px;width:5px;height:9px;border:2px solid var(--bim-text-inverse);border-top:0;border-left:0;transform:rotate(45deg)}.bim-tree-checkbox.is-indeterminate{background-color:var(--bim-bg-elevated);border-color:var(--bim-primary)}.bim-tree-checkbox.is-indeterminate:after{content:"";position:absolute;top:6px;left:3px;width:8px;height:2px;background-color:var(--bim-primary)}.bim-tree-node.is-disabled .bim-tree-checkbox{background-color:var(--bim-component-bg-disabled);border-color:var(--bim-border-disabled);cursor:not-allowed}.bim-tree-node.is-disabled .bim-tree-checkbox.is-checked{background-color:var(--bim-text-disabled)}.bim-tree-node.is-disabled .bim-tree-node-content{color:var(--bim-text-disabled);cursor:not-allowed}.bim-tree-icon{width:16px;height:16px;margin-right:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.bim-tree-icon img,.bim-tree-icon svg{width:100%;height:100%}.bim-tree-title{flex:1;white-space:nowrap}.bim-tree-children{display:none;overflow:visible}.bim-tree-children.is-visible{display:block}.bim-tree-node-content.is-selected{background-color:var(--bim-component-bg-selected);color:var(--bim-primary)}.bim-tree-node-actions{display:none;align-items:center;margin-left:8px;flex-shrink:0}.bim-tree-node-content.is-selected .bim-tree-node-actions{display:flex}.bim-tree-content{flex:1;overflow:auto;padding:2px 0;min-height:0}.bim-tree-node{display:flex;flex-direction:column;width:fit-content;min-width:100%}.bim-tree-node-content{display:flex;align-items:center;height:32px;cursor:pointer;transition:background-color .2s;border-radius:4px;padding-right:8px;width:fit-content;min-width:100%;box-sizing:border-box}.bim-tab{display:flex;flex-direction:column;width:100%;height:100%;background:transparent;color:var(--bim-text-secondary)}.bim-tab__nav{display:flex;align-items:center;gap:4px;padding:4px;margin:8px 12px;background:var(--bim-bg-inset);border-radius:8px;border:1px solid var(--bim-border-subtle)}.bim-tab__item{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 12px;border:none;border-radius:6px;background:transparent;color:var(--bim-text-secondary);cursor:pointer;transition:all .2s ease;font-size:13px;font-weight:500}.bim-tab__item:hover{color:var(--bim-text-primary);background-color:var(--bim-component-bg-hover)}.bim-tab__item.is-active{color:var(--bim-primary);background-color:var(--bim-bg-elevated);box-shadow:0 1px 3px #0000001a}.bim-tab__item.is-disabled{opacity:.5;cursor:not-allowed}.bim-tab__icon{width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;color:var(--bim-tab-icon, currentColor)}.bim-tab__icon svg{width:100%;height:100%;fill:currentColor}.bim-tab__title{white-space:nowrap}.bim-tab__content{flex:1;display:flex;position:relative;min-height:0;overflow:hidden}.bim-tab__panel{display:none;width:100%;height:100%;flex:1}.bim-tab__panel.is-active{display:flex;flex-direction:column;height:100%}.construct-tab__container{height:100%;display:flex;flex-direction:column}.construct-tab__panel-content{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden}.construct-tab__panel-content .bim-tree{flex:1}.bim-measure-panel{width:100%;display:flex;flex-direction:column;box-sizing:border-box;color:var(--bim-text-secondary)}.bim-measure-settings{display:none;box-sizing:border-box;color:var(--bim-text-secondary)}.bim-measure-settings-title{font-size:14px;font-weight:600;margin-bottom:10px}.bim-measure-settings-row{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}.bim-measure-settings-row .label{color:var(--bim-text-secondary);font-size:13px;flex:0 0 auto}.bim-measure-settings-select{flex:0 0 auto;width:120px;height:28px;border-radius:6px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);color:var(--bim-text-primary);padding:0 8px;box-sizing:border-box;outline:none}.bim-measure-settings-hint{font-size:12px;line-height:1.4;color:var(--bim-text-tertiary);margin-top:-4px;margin-bottom:8px}.bim-measure-settings-actions{margin-top:14px;display:flex;justify-content:flex-start;gap:10px}.bim-measure-settings-save,.bim-measure-settings-cancel{flex:0 0 auto!important;width:auto;min-width:0;height:30px;padding:0 12px;border-radius:4px;cursor:pointer;box-sizing:border-box}.bim-measure-settings-save{border:none;background:var(--bim-primary);color:var(--bim-text-inverse)}.bim-measure-settings-cancel{border:1px solid var(--bim-border-default);background:transparent;color:var(--bim-text-secondary)}.bim-measure-settings-save:hover,.bim-measure-settings-save:active,.bim-measure-settings-save:focus,.bim-measure-settings-cancel:hover,.bim-measure-settings-cancel:active,.bim-measure-settings-cancel:focus{background:inherit;outline:none}.bim-measure-settings-save:hover{background:var(--bim-primary-hover)}.bim-measure-tools{display:flex;flex-direction:column;gap:8px}.bim-measure-tool-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.bim-measure-tool-btn{width:100%;height:42px;border-radius:6px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease;padding:0;box-sizing:border-box}.bim-measure-tool-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.bim-measure-tool-btn.is-active{border-color:var(--bim-primary);background:var(--bim-primary-subtle)}.bim-measure-tool-btn.is-active .bim-measure-tool-icon{color:var(--bim-primary)}.bim-measure-tool-icon{width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;color:var(--bim-icon-default)}.bim-measure-tool-icon svg{width:100%;height:100%;fill:currentColor}.bim-measure-toggle{display:flex;justify-content:flex-end}.bim-measure-toggle-btn{height:22px;border-radius:4px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:all .2s ease;padding:0 6px;gap:4px;font-size:12px;line-height:1}.bim-measure-toggle-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.bim-measure-toggle-text{color:var(--bim-text-secondary)}.bim-measure-toggle-icon svg{width:14px;height:14px;fill:currentColor;color:var(--bim-icon-default);transition:transform .15s ease}.bim-measure-toggle-btn.is-expanded .bim-measure-toggle-icon svg{transform:rotate(180deg)}.bim-measure-result{margin-top:12px;padding-top:12px;border-top:1px solid var(--bim-divider);display:flex;flex-direction:column;gap:10px}.bim-measure-row{display:flex;align-items:baseline;gap:8px;font-size:13px;line-height:1.4}.bim-measure-row .label{color:var(--bim-text-secondary);min-width:84px}.bim-measure-row .value{color:var(--bim-text-primary);flex:1;word-break:break-word}.bim-measure-main-number{color:#ffd24a}.bim-measure-main-number.is-laser-text,.bim-measure-main-unit{color:var(--bim-text-primary)}.bim-measure-xyz{display:flex;flex-direction:column;gap:6px}.bim-measure-xyz .value{font-variant-numeric:tabular-nums}.bim-measure-xyz-x{color:#ff4d4f!important}.bim-measure-xyz-y{color:#52c41a!important}.bim-measure-xyz-z{color:#1677ff!important}.bim-measure-footer{margin-top:12px;padding-top:10px;border-top:1px solid var(--bim-divider);display:flex;align-items:center;justify-content:flex-start;gap:10px}.bim-measure-clear-btn{background:transparent;border:none;color:var(--bim-danger);cursor:pointer;padding:0;font-size:13px;flex:0 0 auto!important;width:auto;min-width:0}.bim-measure-clear-btn:hover,.bim-measure-clear-btn:active,.bim-measure-clear-btn:focus{background:transparent;border:none;outline:none;text-decoration:none}.bim-measure-settings-btn{width:24px;height:24px;border-radius:4px;border:none;background:transparent;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0;margin-left:auto;flex:0 0 auto!important}.bim-measure-settings-btn:hover,.bim-measure-settings-btn:active,.bim-measure-settings-btn:focus{background:transparent;border:none;outline:none}.bim-measure-settings-btn svg{width:18px;height:18px;fill:currentColor;color:var(--bim-icon-default)}.section-plane-panel{display:flex;gap:8px;padding:12px 12px 16px;box-sizing:border-box}.section-plane-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:10px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);border-radius:8px;cursor:pointer;transition:all .2s ease;min-width:60px;outline:none;color:var(--bim-text-primary)}.section-plane-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.section-plane-btn:active{background:var(--bim-primary-subtle);border-color:var(--bim-primary)}.section-plane-btn.is-active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.section-plane-btn.is-active .section-plane-btn-icon{color:var(--bim-primary)}.section-plane-btn-icon{width:24px;height:24px;display:flex;align-items:center;justify-content:center;color:var(--bim-icon-default)}.section-plane-btn-icon svg{width:100%;height:100%;fill:currentColor}.section-plane-btn-label{font-size:12px;color:inherit;text-align:center;line-height:1.2}.section-axis-panel{display:flex;flex-direction:column;gap:8px;padding:12px 12px 16px;box-sizing:border-box}.section-axis-row-1{display:flex;gap:8px;padding-bottom:8px;border-bottom:1px solid var(--bim-divider)}.section-axis-row-2{display:flex;gap:8px;padding-top:8px}.section-axis-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:8px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:8px;cursor:pointer;transition:all .2s ease;outline:none;color:var(--bim-text-primary);min-height:48px}.section-axis-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.section-axis-btn.active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.section-axis-btn.active .section-axis-btn-icon{color:var(--bim-primary)}.section-axis-btn-icon{width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;color:var(--bim-icon-default)}.section-axis-btn-icon svg{width:100%;height:100%}.section-axis-btn-label{font-size:12px;color:inherit;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.section-axis-btn-text{min-height:40px}.section-axis-btn-text .section-axis-btn-label{font-size:18px;font-weight:600}.section-box-panel{display:flex;flex-direction:column;padding:12px;box-sizing:border-box;-webkit-user-select:none;user-select:none}.section-box-row-buttons{display:flex;gap:6px;padding-bottom:12px;border-bottom:1px solid var(--bim-divider)}.section-box-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:6px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:8px;cursor:pointer;color:var(--bim-text-primary);min-height:44px;transition:all .2s ease}.section-box-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.section-box-btn.active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.section-box-btn.active .section-box-btn-icon{color:var(--bim-primary)}.section-box-btn-icon{width:24px;height:24px;color:var(--bim-icon-default)}.section-box-btn-icon svg{width:100%;height:100%}.section-box-btn-label{font-size:11px;white-space:nowrap}.section-box-sliders{display:flex;flex-direction:column;gap:16px;padding-top:16px}.section-box-slider{display:flex;align-items:center;gap:12px;position:relative;z-index:1}.section-box-slider:hover{z-index:10}.section-box-slider-label{font-size:13px;font-weight:700;color:var(--bim-text-primary);min-width:14px}.section-box-slider-track{position:relative;flex:1;height:4px;background:var(--bim-border-default);border-radius:2px}.section-box-slider-range{position:absolute;top:0;height:100%;background:var(--bim-primary);border-radius:2px;pointer-events:none}.section-box-slider-handle{position:absolute;top:50%;width:14px;height:14px;background:var(--bim-bg-elevated);border:2px solid var(--bim-primary);border-radius:50%;transform:translate(-50%,-50%);cursor:grab;z-index:5;touch-action:none;transition:transform .2s,box-shadow .2s}.section-box-slider-handle:hover{transform:translate(-50%,-50%) scale(1.2);box-shadow:0 0 0 4px var(--bim-primary-subtle)}.section-box-slider-handle.dragging{cursor:grabbing;transform:translate(-50%,-50%) scale(1.2);background:var(--bim-primary)}.walk-control-panel{display:flex;align-items:center;gap:20px;padding:12px 20px;background-color:var(--bim-bg-base, #152232);border:1px solid var(--bim-border-strong, #475569);border-radius:12px;box-shadow:var(--bim-shadow-xl, 0 20px 40px rgba(0, 0, 0, .3));-webkit-user-select:none;user-select:none}.walk-divider{width:1px;height:40px;background:var(--bim-divider);flex-shrink:0}.walk-control-left{display:flex;gap:8px}.walk-icon-btn{width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:8px;cursor:pointer;transition:all .2s ease;color:var(--bim-icon-default);padding:8px}.walk-icon-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.walk-icon-btn.active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.walk-icon-btn.active svg{fill:var(--bim-primary)}.walk-icon-btn svg{width:32px;height:32px}.walk-control-settings{display:flex;align-items:center;gap:16px;flex:1}.walk-speed-control{display:flex;align-items:center;gap:12px}.walk-speed-label{color:var(--bim-text-primary);font-size:14px;white-space:nowrap}.walk-speed-group{display:flex;align-items:center;gap:8px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-subtle);border-radius:6px;padding:4px}.walk-speed-btn{width:32px;height:32px;background:var(--bim-bg-elevated);border:1px solid var(--bim-border-subtle);border-radius:4px;color:var(--bim-text-primary);font-size:18px;cursor:pointer;transition:all .2s ease}.walk-speed-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.walk-speed-btn:disabled{opacity:.5;cursor:not-allowed}.walk-speed-display{min-width:40px;text-align:center;color:var(--bim-text-primary);font-size:14px;font-weight:700}.walk-checkbox-wrapper{display:flex;align-items:center;gap:8px;cursor:pointer}.walk-checkbox{width:18px;height:18px;cursor:pointer}.walk-checkbox:disabled{opacity:.5;cursor:not-allowed}.walk-checkbox-label{color:var(--bim-text-primary);font-size:14px;white-space:nowrap}.walk-checkbox-wrapper input:disabled+.walk-checkbox-label{opacity:.5}.walk-select-wrapper{display:flex;align-items:center;gap:8px}.walk-select-label{color:var(--bim-text-primary);font-size:14px;white-space:nowrap}.walk-select{padding:6px 12px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:6px;color:var(--bim-text-primary);font-size:14px;cursor:pointer;min-width:120px}.walk-select option{background:var(--bim-bg-elevated);color:var(--bim-text-primary)}.walk-exit-btn{padding:10px 24px;background:var(--bim-primary);border:none;border-radius:8px;color:var(--bim-text-inverse);font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease;white-space:nowrap}.walk-exit-btn:hover{background:var(--bim-primary-hover);transform:scale(1.02)}.bim-collapse{background-color:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);border-radius:8px;font-size:14px;color:var(--bim-text-primary)}.bim-collapse.is-ghost{background-color:transparent;border:none}.bim-collapse.is-ghost .bim-collapse-item{border-bottom:none}.bim-collapse.is-ghost .bim-collapse-header{background-color:var(--bim-component-bg);padding-left:12px;padding-right:0;border-bottom:1px solid var(--bim-border-default)}.bim-collapse.is-ghost .bim-collapse-header:hover{background-color:var(--bim-component-bg-hover)}.bim-collapse.is-ghost .bim-collapse-content{background-color:transparent;border-top:none}.bim-collapse-item{border-bottom:1px solid var(--bim-border-subtle)}.bim-collapse-item:last-child{border-bottom:none}.bim-collapse-item.is-disabled .bim-collapse-header{color:var(--bim-text-disabled);cursor:not-allowed}.bim-collapse-header{display:flex;align-items:center;padding:12px 16px;background-color:var(--bim-component-bg);cursor:pointer;transition:all .2s ease;position:relative}.bim-collapse-header:hover{background-color:var(--bim-component-bg-hover)}.bim-collapse-arrow{margin-right:12px;font-size:12px;width:12px;height:12px;transition:transform .24s;display:inline-flex;align-items:center;justify-content:center}.bim-collapse-arrow svg{width:100%;height:100%;fill:currentColor}.bim-collapse-item.is-active .bim-collapse-arrow{transform:rotate(90deg)}.bim-collapse-icon{margin-right:8px;display:inline-flex;align-items:center}.bim-collapse-icon svg{width:16px;height:16px;fill:currentColor}.bim-collapse-title{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.bim-collapse-extra{margin-left:auto}.bim-collapse-content{overflow:hidden;background-color:var(--bim-bg-elevated);border-top:1px solid var(--bim-border-subtle);transition:height .2s ease-in-out,opacity .2s ease-in-out}.bim-collapse-content.is-hidden{display:none}')),document.head.appendChild(e)}}catch(o){console.error("vite-plugin-css-injected-by-js",o)}})(); +const eg = { common: { title: "BimEngine", description: "这是一个使用 BIM-ENGINE。", @@ -32,7 +32,15 @@ const tg = { }, menu: { info: "信息", - home: "首页" + home: "首页", + componentDetail: "构件详情", + hideSelected: "隐藏选中构件", + transparentSelected: "半透明选中构件", + isolateSelected: "隔离选中构件", + hideOthers: "其他构件隐藏", + transparentOthers: "其他构件半透明", + fitSectionBox: "剖切盒适应", + showAll: "显示全部" }, tree: { searchPlaceholder: "请输入要搜索的内容" @@ -43,7 +51,9 @@ const tg = { tab: { component: "构件", system: "系统", - space: "空间" + space: "空间", + type: "类型", + major: "专业" }, panel: { property: { @@ -55,6 +65,10 @@ const tg = { props: "属性", material: "材质" } + }, + componentDetail: { + title: "构件详情", + noSelection: "请先选中构件" } }, measure: { @@ -164,7 +178,7 @@ const tg = { map: { dialogTitle: "地图" } -}, ng = { +}, tg = { common: { title: "BimEngine", description: "This is a BIM-ENGINE demo.", @@ -197,7 +211,15 @@ const tg = { }, menu: { info: "Info", - home: "Home" + home: "Home", + componentDetail: "Component Detail", + hideSelected: "Hide Selected", + transparentSelected: "Transparent Selected", + isolateSelected: "Isolate Selected", + hideOthers: "Hide Others", + transparentOthers: "Transparent Others", + fitSectionBox: "Fit Section Box", + showAll: "Show All" }, tree: { searchPlaceholder: "Please enter content to search" @@ -208,7 +230,9 @@ const tg = { tab: { component: "Component", system: "System", - space: "Space" + space: "Space", + type: "Type", + major: "Major" }, panel: { property: { @@ -220,6 +244,10 @@ const tg = { props: "Properties", material: "Material" } + }, + componentDetail: { + title: "Component Detail", + noSelection: "Please select a component first" } }, measure: { @@ -330,11 +358,11 @@ const tg = { dialogTitle: "Map" } }; -class ig { +class ng { currentLocale = "zh-CN"; messages = { - "zh-CN": tg, - "en-US": ng + "zh-CN": eg, + "en-US": tg }; listeners = []; constructor() { @@ -377,7 +405,7 @@ class ig { this.listeners.forEach((e) => e(this.currentLocale)); } } -const Jt = new ig(), Ce = (s) => Jt.t(s), hd = { +const Jt = new ng(), Ce = (s) => Jt.t(s), cd = { name: "light", primary: "#2563eb", primaryHover: "#1d4ed8", @@ -470,7 +498,7 @@ const Jt = new ig(), Ce = (s) => Jt.t(s), hd = { placeholder: "#94a3b8" } } -}, sg = { +}, ig = { name: "dark", primary: "#3b82f6", primaryHover: "#60a5fa", @@ -564,8 +592,8 @@ const Jt = new ig(), Ce = (s) => Jt.t(s), hd = { } } }; -class rg { - currentTheme = hd; +class sg { + currentTheme = cd; listeners = []; constructor() { } @@ -580,7 +608,7 @@ class rg { * @param themeName 'dark' | 'light' */ setTheme(e) { - e === "light" ? this.applyTheme(hd) : this.applyTheme(sg); + e === "light" ? this.applyTheme(cd) : this.applyTheme(ig); } /** * 应用自定义主题配置 @@ -607,8 +635,8 @@ class rg { this.listeners.forEach((e) => e(this.currentTheme)); } } -const rt = new rg(); -class og { +const ot = new sg(); +class rg { /** 事件监听器映射表 */ events = /* @__PURE__ */ new Map(); /** @@ -651,11 +679,11 @@ class og { this.events.clear(); } } -class bt { +class wt { /** 单例实例 */ static instance = null; /** 事件发射器 */ - eventEmitter = new og(); + eventEmitter = new rg(); /** 主容器元素 */ container = null; /** 包装容器元素 */ @@ -672,8 +700,6 @@ class bt { rightKey = null; /** 构件树管理器 */ constructTree = null; - /** 属性面板管理器 */ - propertyPanel = null; /** 测量对话框管理器 */ measure = null; /** 漫游控制管理器 */ @@ -690,15 +716,17 @@ class bt { walkPath = null; /** 漫游平面图对话框管理器 */ walkPlanView = null; + /** 构件详情管理器 */ + componentDetail = null; constructor() { } /** 获取单例实例 */ static getInstance() { - return bt.instance || (bt.instance = new bt()), bt.instance; + return wt.instance || (wt.instance = new wt()), wt.instance; } /** 重置单例(用于测试或重新初始化) */ static reset() { - bt.instance && (bt.instance.eventEmitter.clear(), bt.instance = null); + wt.instance && (wt.instance.eventEmitter.clear(), wt.instance = null); } /** * 发送事件 @@ -730,7 +758,7 @@ class bt { this.eventEmitter.clear(); } } -class _u { +class yu { container; options; groups = []; @@ -771,7 +799,7 @@ class _u { }), this.initContainer(), this.applyStyles(); } emit(e, t) { - bt.getInstance().emit(e, t); + wt.getInstance().emit(e, t); } initContainer() { this.container.innerHTML = "", this.container.classList.add("bim-btn-group-root"), this.options.direction === "column" ? this.container.classList.add("dir-column") : this.container.classList.add("dir-row"), this.options.className && this.container.classList.add(this.options.className), this.options.type && this.options.type !== "default" && this.container.classList.add(`type-${this.options.type}`), this.updatePosition(), this.setupEventInterception(this.container); @@ -914,7 +942,7 @@ class _u { async init() { this.render(), this.unsubscribeLocale = Jt.subscribe(() => { this.setLocales(); - }), this.unsubscribeTheme = rt.subscribe((e) => { + }), this.unsubscribeTheme = ot.subscribe((e) => { this.setTheme(e); }); } @@ -1031,7 +1059,7 @@ class _u { this.options.iconColor && i.setProperty("--bim-icon-color", this.options.iconColor), this.options.iconActiveColor && i.setProperty("--bim-icon-active-color", this.options.iconActiveColor), this.options.textColor && i.setProperty("--bim-btn-text-color", this.options.textColor), this.options.textActiveColor && i.setProperty("--bim-btn-text-active-color", this.options.textActiveColor), this.options.btnBackgroundColor && i.setProperty("--bim-btn-bg", this.options.btnBackgroundColor), this.options.btnHoverColor && i.setProperty("--bim-btn-hover-bg", this.options.btnHoverColor), this.options.btnActiveColor && i.setProperty("--bim-btn-active-bg", this.options.btnActiveColor); const r = t.getBoundingClientRect(), o = this.options.expand || "down"; this.options.direction === "row" ? n.style.flexDirection = "column" : n.style.flexDirection = "row", this.options.type && this.options.type !== "default" && n.classList.add(`type-${this.options.type}`); - const a = rt.getTheme(); + const a = ot.getTheme(); n.classList.add(`theme-${a.name}`), i.setProperty("--bim-primary", a.primary), i.setProperty("--bim-bg-overlay", a.bgOverlay), i.setProperty("--bim-border-default", a.borderDefault), i.setProperty("--bim-text-primary", a.textPrimary), i.setProperty("--bim-text-inverse", a.textInverse), i.setProperty("--bim-shadow-lg", a.shadowLg), i.setProperty("--bim-floating-btn-bg", a.floatingBtnBg), i.setProperty("--bim-floating-btn-bg-hover", a.floatingBtnBgHover), i.setProperty("--bim-floating-icon-color", a.floatingIconColor), document.body.appendChild(n), this.setupEventInterception(n), e.children.forEach((c) => { if (this.isVisible(c.id)) { const h = this.renderDropdownItem(c); @@ -1105,10 +1133,10 @@ class _u { this.unsubscribeLocale && (this.unsubscribeLocale(), this.unsubscribeLocale = null), this.unsubscribeTheme && (this.unsubscribeTheme(), this.unsubscribeTheme = null), this.closeDropdown(), this.container.innerHTML = "", this.btnRefs.clear(); } } -class ag extends _u { +class og extends yu { async init() { await super.init(); - const { createHomeButton: e } = await Promise.resolve().then(() => KT), { createZoomBoxButton: t } = await Promise.resolve().then(() => JT), { createWalkMenuButton: n } = await Promise.resolve().then(() => eA), { createMapButton: i } = await Promise.resolve().then(() => nA), { createPropertyButton: r } = await Promise.resolve().then(() => sA), { createSettingButton: o } = await Promise.resolve().then(() => oA), { createInfoButton: a } = await Promise.resolve().then(() => lA), { createFullscreenButton: l } = await Promise.resolve().then(() => hA), { createMeasureButton: c } = await Promise.resolve().then(() => dA), { createSectionMenuButton: h } = await Promise.resolve().then(() => pA), { createSectionPlaneButton: u } = await Promise.resolve().then(() => gA), { createSectionAxisButton: d } = await Promise.resolve().then(() => vA), { createSectionBoxButton: f } = await Promise.resolve().then(() => yA); + const { createHomeButton: e } = await Promise.resolve().then(() => XT), { createZoomBoxButton: t } = await Promise.resolve().then(() => qT), { createWalkMenuButton: n } = await Promise.resolve().then(() => YT), { createMapButton: i } = await Promise.resolve().then(() => $T), { createPropertyButton: r } = await Promise.resolve().then(() => QT), { createSettingButton: o } = await Promise.resolve().then(() => tA), { createInfoButton: a } = await Promise.resolve().then(() => iA), { createFullscreenButton: l } = await Promise.resolve().then(() => rA), { createMeasureButton: c } = await Promise.resolve().then(() => aA), { createSectionMenuButton: h } = await Promise.resolve().then(() => cA), { createSectionPlaneButton: u } = await Promise.resolve().then(() => uA), { createSectionAxisButton: d } = await Promise.resolve().then(() => fA), { createSectionBoxButton: f } = await Promise.resolve().then(() => mA); this.addGroup("group-1"), this.addButton(e()), this.addButton(t()), this.addButton(c()), this.addButton(h()), this.addButton(u()), this.addButton(d()), this.addButton(f()), this.addButton(n()), this.addButton(i()), this.addButton(r()), this.addGroup("group-2"), this.addButton(o()), this.addButton(a()), this.addButton(l()), this.render(); } } @@ -1118,7 +1146,7 @@ class Ii { /** 事件订阅列表,用于自动清理 */ subscriptions = []; constructor() { - this.registry = bt.getInstance(); + this.registry = wt.getInstance(); } /** * 订阅事件(自动追踪,destroy 时自动取消) @@ -1145,7 +1173,7 @@ class Ii { this.subscriptions.forEach((e) => e()), this.subscriptions = []; } } -class lg extends Ii { +class ag extends Ii { /** 工具栏实例 */ toolbar = null; /** 工具栏容器元素 */ @@ -1157,7 +1185,7 @@ class lg extends Ii { } /** 初始化工具栏 */ init() { - this.toolbarContainer = document.createElement("div"), this.toolbarContainer.id = "opt-btn-groups", this.toolbarContainer.className = "bim-engine-opt-btn-container is-bottom-toolbar", this.container.appendChild(this.toolbarContainer), this.toolbar = new ag({ + this.toolbarContainer = document.createElement("div"), this.toolbarContainer.id = "opt-btn-groups", this.toolbarContainer.className = "bim-engine-opt-btn-container is-bottom-toolbar", this.container.appendChild(this.toolbarContainer), this.toolbar = new og({ container: this.toolbarContainer, type: "glass-pill", showLabel: !0, @@ -1263,7 +1291,7 @@ class lg extends Ii { return this.toolbar?.getType() || "default"; } } -class cg extends Ii { +class lg extends Ii { /** 按钮组映射表 */ groups = /* @__PURE__ */ new Map(); /** 容器元素 */ @@ -1278,7 +1306,7 @@ class cg extends Ii { * @returns 按钮组实例 */ create(e, t) { - const n = new _u({ + const n = new yu({ container: this.container, ...t }); @@ -1304,7 +1332,7 @@ class cg extends Ii { this.groups.forEach((e) => e.destroy()), this.groups.clear(), super.destroy(); } } -class em { +class Qp { element; options; container; @@ -1345,7 +1373,7 @@ class em { * 初始化组件功能 (接口实现) */ init() { - this._isInitialized || (this.container.appendChild(this.element), this.initPosition(), this.options.draggable && this.initDrag(), this.options.resizable && this.initResize(), this._isInitialized = !0, this.options.onOpen && this.options.onOpen(), this.unsubscribeTheme = rt.subscribe((e) => { + this._isInitialized || (this.container.appendChild(this.element), this.initPosition(), this.options.draggable && this.initDrag(), this.options.resizable && this.initResize(), this._isInitialized = !0, this.options.onOpen && this.options.onOpen(), this.unsubscribeTheme = ot.subscribe((e) => { this.setTheme(e); }), this.unsubscribeLocale = Jt.subscribe(() => { this.setLocales(); @@ -1540,7 +1568,7 @@ class em { this.close(); } } -class hg extends em { +class cg extends Qp { /** * 构造函数 * @param container 父容器 @@ -1581,7 +1609,7 @@ class hg extends em { // 不需要再手动实现 setTheme, destroy, close, init // 它们都已从 BimDialog 继承 } -class ug extends Ii { +class hg extends Ii { /** 容器元素 */ container; /** 活跃的对话框列表 */ @@ -1597,18 +1625,18 @@ class ug extends Ii { * @returns 对话框实例 */ create(e) { - const t = new em({ + const t = new Qp({ container: this.container, ...e, onClose: () => { this.activeDialogs = this.activeDialogs.filter((n) => n !== t), e.onClose && e.onClose(); } }); - return t.setTheme(rt.getTheme()), this.activeDialogs.push(t), t; + return t.setTheme(ot.getTheme()), this.activeDialogs.push(t), t; } /** 显示信息对话框 */ showInfoDialog() { - new hg(this.container); + new cg(this.container); } /** * 更新所有对话框的主题 @@ -1624,8 +1652,8 @@ class ug extends Ii { this.activeDialogs.forEach((e) => e.destroy()), this.activeDialogs = [], super.destroy(); } } -const Do = "181", fr = { ROTATE: 0, DOLLY: 1, PAN: 2 }, cr = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 }, dg = 0, ud = 1, fg = 2, tm = 1, nm = 2, Si = 3, Fn = 0, un = 1, At = 2, Xt = 0, pr = 1, rh = 2, dd = 3, fd = 4, im = 5, Zn = 100, pg = 101, mg = 102, gg = 103, xg = 104, lo = 200, vg = 201, bg = 202, yg = 203, oh = 204, ah = 205, lh = 206, _g = 207, ch = 208, Mg = 209, wg = 210, Sg = 211, Eg = 212, Tg = 213, Ag = 214, hh = 0, uh = 1, dh = 2, vr = 3, fh = 4, ph = 5, mh = 6, gh = 7, Tl = 0, Cg = 1, Pg = 2, Ki = 0, sm = 1, rm = 2, om = 3, Mu = 4, am = 5, lm = 6, cm = 7, pd = "attached", Rg = "detached", hm = 300, br = 301, yr = 302, xh = 303, vh = 304, Al = 306, hi = 1e3, ai = 1001, pl = 1002, Qt = 1003, um = 1004, co = 1005, Yt = 1006, el = 1007, Ai = 1008, Jn = 1009, dm = 1010, fm = 1011, wo = 1012, wu = 1013, Ms = 1014, $n = 1015, Un = 1016, Su = 1017, Eu = 1018, _r = 1020, pm = 35902, mm = 35899, gm = 1021, xm = 1022, xn = 1023, So = 1026, Mr = 1027, Tu = 1028, Au = 1029, Cu = 1030, Pu = 1031, Ru = 1033, tl = 33776, nl = 33777, il = 33778, sl = 33779, bh = 35840, yh = 35841, _h = 35842, Mh = 35843, wh = 36196, Sh = 37492, Eh = 37496, Th = 37808, Ah = 37809, Ch = 37810, Ph = 37811, Rh = 37812, Lh = 37813, Dh = 37814, Ih = 37815, Bh = 37816, Nh = 37817, kh = 37818, Uh = 37819, Oh = 37820, Fh = 37821, zh = 36492, Hh = 36494, Vh = 36495, Gh = 36283, Wh = 36284, Xh = 36285, jh = 36286, Eo = 2300, To = 2301, zl = 2302, md = 2400, gd = 2401, xd = 2402, Lg = 2500, Dg = 0, vm = 1, qh = 2, Ig = 3200, Bg = 3201, Io = 0, Ng = 1, Xi = "", xt = "srgb", Bt = "srgb-linear", ml = "linear", lt = "srgb", Bs = 7680, vd = 519, kg = 512, Ug = 513, Og = 514, bm = 515, Fg = 516, zg = 517, Hg = 518, Vg = 519, Zh = 35044, bd = "300 es", li = 2e3, gl = 2001; -function ym(s) { +const Do = "181", fr = { ROTATE: 0, DOLLY: 1, PAN: 2 }, cr = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 }, ug = 0, hd = 1, dg = 2, em = 1, tm = 2, Si = 3, Fn = 0, un = 1, At = 2, Xt = 0, pr = 1, sh = 2, ud = 3, dd = 4, nm = 5, Zn = 100, fg = 101, pg = 102, mg = 103, gg = 104, lo = 200, xg = 201, vg = 202, bg = 203, rh = 204, oh = 205, ah = 206, yg = 207, lh = 208, _g = 209, Mg = 210, wg = 211, Sg = 212, Eg = 213, Tg = 214, ch = 0, hh = 1, uh = 2, vr = 3, dh = 4, fh = 5, ph = 6, mh = 7, Tl = 0, Ag = 1, Cg = 2, Ki = 0, im = 1, sm = 2, rm = 3, _u = 4, om = 5, am = 6, lm = 7, fd = "attached", Pg = "detached", cm = 300, br = 301, yr = 302, gh = 303, xh = 304, Al = 306, hi = 1e3, ai = 1001, pl = 1002, Qt = 1003, hm = 1004, co = 1005, Yt = 1006, el = 1007, Ai = 1008, Jn = 1009, um = 1010, dm = 1011, wo = 1012, Mu = 1013, Ms = 1014, $n = 1015, Un = 1016, wu = 1017, Su = 1018, _r = 1020, fm = 35902, pm = 35899, mm = 1021, gm = 1022, xn = 1023, So = 1026, Mr = 1027, Eu = 1028, Tu = 1029, Au = 1030, Cu = 1031, Pu = 1033, tl = 33776, nl = 33777, il = 33778, sl = 33779, vh = 35840, bh = 35841, yh = 35842, _h = 35843, Mh = 36196, wh = 37492, Sh = 37496, Eh = 37808, Th = 37809, Ah = 37810, Ch = 37811, Ph = 37812, Rh = 37813, Lh = 37814, Dh = 37815, Ih = 37816, Bh = 37817, Nh = 37818, kh = 37819, Uh = 37820, Oh = 37821, Fh = 36492, zh = 36494, Hh = 36495, Vh = 36283, Gh = 36284, Wh = 36285, Xh = 36286, Eo = 2300, To = 2301, zl = 2302, pd = 2400, md = 2401, gd = 2402, Rg = 2500, Lg = 0, xm = 1, jh = 2, Dg = 3200, Ig = 3201, Io = 0, Bg = 1, Xi = "", xt = "srgb", Bt = "srgb-linear", ml = "linear", lt = "srgb", Bs = 7680, xd = 519, Ng = 512, kg = 513, Ug = 514, vm = 515, Og = 516, Fg = 517, zg = 518, Hg = 519, qh = 35044, vd = "300 es", li = 2e3, gl = 2001; +function bm(s) { for (let e = s.length - 1; e >= 0; --e) if (s[e] >= 65535) return !0; return !1; @@ -1633,11 +1661,11 @@ function ym(s) { function Ao(s) { return document.createElementNS("http://www.w3.org/1999/xhtml", s); } -function Gg() { +function Vg() { const s = Ao("canvas"); return s.style.display = "block", s; } -const yd = {}; +const bd = {}; function xl(...s) { const e = "THREE." + s.shift(); console.log(e, ...s); @@ -1652,9 +1680,9 @@ function et(...s) { } function Co(...s) { const e = s.join(" "); - e in yd || (yd[e] = !0, He(...s)); + e in bd || (bd[e] = !0, He(...s)); } -function Wg(s, e, t) { +function Gg(s, e, t) { return new Promise(function(n, i) { function r() { switch (s.clientWaitSync(e, s.SYNC_FLUSH_COMMANDS_BIT, 0)) { @@ -1728,7 +1756,7 @@ class As { } } const en = ["00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0a", "0b", "0c", "0d", "0e", "0f", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1a", "1b", "1c", "1d", "1e", "1f", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2a", "2b", "2c", "2d", "2e", "2f", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3a", "3b", "3c", "3d", "3e", "3f", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4a", "4b", "4c", "4d", "4e", "4f", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5a", "5b", "5c", "5d", "5e", "5f", "60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6a", "6b", "6c", "6d", "6e", "6f", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7a", "7b", "7c", "7d", "7e", "7f", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8a", "8b", "8c", "8d", "8e", "8f", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9a", "9b", "9c", "9d", "9e", "9f", "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "aa", "ab", "ac", "ad", "ae", "af", "b0", "b1", "b2", "b3", "b4", "b5", "b6", "b7", "b8", "b9", "ba", "bb", "bc", "bd", "be", "bf", "c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "ca", "cb", "cc", "cd", "ce", "cf", "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "da", "db", "dc", "dd", "de", "df", "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7", "e8", "e9", "ea", "eb", "ec", "ed", "ee", "ef", "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "fa", "fb", "fc", "fd", "fe", "ff"]; -let _d = 1234567; +let yd = 1234567; const po = Math.PI / 180, wr = 180 / Math.PI; function On() { const s = Math.random() * 4294967295 | 0, e = Math.random() * 4294967295 | 0, t = Math.random() * 4294967295 | 0, n = Math.random() * 4294967295 | 0; @@ -1737,60 +1765,60 @@ function On() { function Ze(s, e, t) { return Math.max(e, Math.min(t, s)); } -function Lu(s, e) { +function Ru(s, e) { return (s % e + e) % e; } -function Xg(s, e, t, n, i) { +function Wg(s, e, t, n, i) { return n + (s - e) * (i - n) / (t - e); } -function jg(s, e, t) { +function Xg(s, e, t) { return s !== e ? (t - s) / (e - s) : 0; } function mo(s, e, t) { return (1 - t) * s + t * e; } -function qg(s, e, t, n) { +function jg(s, e, t, n) { return mo(s, e, 1 - Math.exp(-t * n)); } -function Zg(s, e = 1) { - return e - Math.abs(Lu(s, e * 2) - e); +function qg(s, e = 1) { + return e - Math.abs(Ru(s, e * 2) - e); } -function Yg(s, e, t) { +function Zg(s, e, t) { return s <= e ? 0 : s >= t ? 1 : (s = (s - e) / (t - e), s * s * (3 - 2 * s)); } -function Kg(s, e, t) { +function Yg(s, e, t) { return s <= e ? 0 : s >= t ? 1 : (s = (s - e) / (t - e), s * s * s * (s * (s * 6 - 15) + 10)); } -function $g(s, e) { +function Kg(s, e) { return s + Math.floor(Math.random() * (e - s + 1)); } -function Jg(s, e) { +function $g(s, e) { return s + Math.random() * (e - s); } -function Qg(s) { +function Jg(s) { return s * (0.5 - Math.random()); } -function ex(s) { - s !== void 0 && (_d = s); - let e = _d += 1831565813; +function Qg(s) { + s !== void 0 && (yd = s); + let e = yd += 1831565813; return e = Math.imul(e ^ e >>> 15, e | 1), e ^= e + Math.imul(e ^ e >>> 7, e | 61), ((e ^ e >>> 14) >>> 0) / 4294967296; } -function tx(s) { +function ex(s) { return s * po; } -function nx(s) { +function tx(s) { return s * wr; } -function ix(s) { +function nx(s) { return (s & s - 1) === 0 && s !== 0; } -function sx(s) { +function ix(s) { return Math.pow(2, Math.ceil(Math.log(s) / Math.LN2)); } -function rx(s) { +function sx(s) { return Math.pow(2, Math.floor(Math.log(s) / Math.LN2)); } -function ox(s, e, t, n, i) { +function rx(s, e, t, n, i) { const r = Math.cos, o = Math.sin, a = r(t / 2), l = o(t / 2), c = r((e + n) / 2), h = o((e + n) / 2), u = r((e - n) / 2), d = o((e - n) / 2), f = r((n - e) / 2), p = o((n - e) / 2); switch (i) { case "XYX": @@ -1888,7 +1916,7 @@ const go = { * @param {number} m - The second parameter. * @return {number} The Euclidean modulo. */ - euclideanModulo: Lu, + euclideanModulo: Ru, /** * Performs a linear mapping from range `` to range `` * for the given value. @@ -1902,7 +1930,7 @@ const go = { * @param {number} b2 - Maximum value for range B. * @return {number} The mapped value. */ - mapLinear: Xg, + mapLinear: Wg, /** * Returns the percentage in the closed interval `[0, 1]` of the given value * between the start and end point. @@ -1914,7 +1942,7 @@ const go = { * @param {number} value - A value between start and end. * @return {number} The interpolation factor. */ - inverseLerp: jg, + inverseLerp: Xg, /** * Returns a value linearly interpolated from two known points based on the given interval - * `t = 0` will return `x` and `t = 1` will return `y`. @@ -1941,7 +1969,7 @@ const go = { * @param {number} dt - Delta time in seconds. * @return {number} The interpolated value. */ - damp: qg, + damp: jg, /** * Returns a value that alternates between `0` and the given `length` parameter. * @@ -1951,7 +1979,7 @@ const go = { * @param {number} [length=1] - The positive value the function will pingpong to. * @return {number} The alternated value. */ - pingpong: Zg, + pingpong: qg, /** * Returns a value in the range `[0,1]` that represents the percentage that `x` has * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to @@ -1966,7 +1994,7 @@ const go = { * @param {number} max - The max value. Any x value above max will be `1`. * @return {number} The alternated value. */ - smoothstep: Yg, + smoothstep: Zg, /** * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations) * that has zero 1st and 2nd order derivatives at x=0 and x=1. @@ -1978,7 +2006,7 @@ const go = { * @param {number} max - The max value. Any x value above max will be `1`. * @return {number} The alternated value. */ - smootherstep: Kg, + smootherstep: Yg, /** * Returns a random integer from `` interval. * @@ -1988,7 +2016,7 @@ const go = { * @param {number} high - The upper value boundary * @return {number} A random integer. */ - randInt: $g, + randInt: Kg, /** * Returns a random float from `` interval. * @@ -1998,7 +2026,7 @@ const go = { * @param {number} high - The upper value boundary * @return {number} A random float. */ - randFloat: Jg, + randFloat: $g, /** * Returns a random integer from `<-range/2, range/2>` interval. * @@ -2007,7 +2035,7 @@ const go = { * @param {number} range - Defines the value range. * @return {number} A random float. */ - randFloatSpread: Qg, + randFloatSpread: Jg, /** * Returns a deterministic pseudo-random float in the interval `[0, 1]`. * @@ -2016,7 +2044,7 @@ const go = { * @param {number} [s] - The integer seed. * @return {number} A random float. */ - seededRandom: ex, + seededRandom: Qg, /** * Converts degrees to radians. * @@ -2025,7 +2053,7 @@ const go = { * @param {number} degrees - A value in degrees. * @return {number} The converted value in radians. */ - degToRad: tx, + degToRad: ex, /** * Converts radians to degrees. * @@ -2034,7 +2062,7 @@ const go = { * @param {number} radians - A value in radians. * @return {number} The converted value in degrees. */ - radToDeg: nx, + radToDeg: tx, /** * Returns `true` if the given number is a power of two. * @@ -2043,7 +2071,7 @@ const go = { * @param {number} value - The value to check. * @return {boolean} Whether the given number is a power of two or not. */ - isPowerOfTwo: ix, + isPowerOfTwo: nx, /** * Returns the smallest power of two that is greater than or equal to the given number. * @@ -2052,7 +2080,7 @@ const go = { * @param {number} value - The value to find a POT for. * @return {number} The smallest power of two that is greater than or equal to the given number. */ - ceilPowerOfTwo: sx, + ceilPowerOfTwo: ix, /** * Returns the largest power of two that is less than or equal to the given number. * @@ -2061,7 +2089,7 @@ const go = { * @param {number} value - The value to find a POT for. * @return {number} The largest power of two that is less than or equal to the given number. */ - floorPowerOfTwo: rx, + floorPowerOfTwo: sx, /** * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles) * defined by the given angles and order. @@ -2077,7 +2105,7 @@ const go = { * @param {number} c - The rotation applied to the third axis, in radians. * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order. */ - setQuaternionFromProperEuler: ox, + setQuaternionFromProperEuler: rx, /** * Normalizes the given value according to the given typed array. * @@ -3302,7 +3330,7 @@ class P { * @return {Vector3} A reference to this vector. */ applyEuler(e) { - return this.applyQuaternion(Md.setFromEuler(e)); + return this.applyQuaternion(_d.setFromEuler(e)); } /** * Applies a rotation specified by an axis and an angle to this vector. @@ -3312,7 +3340,7 @@ class P { * @return {Vector3} A reference to this vector. */ applyAxisAngle(e, t) { - return this.applyQuaternion(Md.setFromAxisAngle(e, t)); + return this.applyQuaternion(_d.setFromAxisAngle(e, t)); } /** * Multiplies this vector with the given 3x3 matrix. @@ -3844,7 +3872,7 @@ class P { yield this.x, yield this.y, yield this.z; } } -const Hl = /* @__PURE__ */ new P(), Md = /* @__PURE__ */ new zn(); +const Hl = /* @__PURE__ */ new P(), _d = /* @__PURE__ */ new zn(); class $e { /** * Constructs a new 3x3 matrix. The arguments are supposed to be @@ -4215,7 +4243,7 @@ class $e { return new this.constructor().fromArray(this.elements); } } -const Vl = /* @__PURE__ */ new $e(), wd = /* @__PURE__ */ new $e().set( +const Vl = /* @__PURE__ */ new $e(), Md = /* @__PURE__ */ new $e().set( 0.4123908, 0.3575843, 0.1804808, @@ -4225,7 +4253,7 @@ const Vl = /* @__PURE__ */ new $e(), wd = /* @__PURE__ */ new $e().set( 0.0193308, 0.1191948, 0.9505322 -), Sd = /* @__PURE__ */ new $e().set( +), wd = /* @__PURE__ */ new $e().set( 3.2409699, -1.5373832, -0.4986108, @@ -4236,7 +4264,7 @@ const Vl = /* @__PURE__ */ new $e(), wd = /* @__PURE__ */ new $e().set( -0.203977, 1.0569715 ); -function ax() { +function ox() { const s = { enabled: !0, workingColorSpace: Bt, @@ -4306,8 +4334,8 @@ function ax() { primaries: e, whitePoint: n, transfer: ml, - toXYZ: wd, - fromXYZ: Sd, + toXYZ: Md, + fromXYZ: wd, luminanceCoefficients: t, workingColorSpaceConfig: { unpackColorSpace: xt }, outputColorSpaceConfig: { drawingBufferColorSpace: xt } @@ -4316,14 +4344,14 @@ function ax() { primaries: e, whitePoint: n, transfer: lt, - toXYZ: wd, - fromXYZ: Sd, + toXYZ: Md, + fromXYZ: wd, luminanceCoefficients: t, outputColorSpaceConfig: { drawingBufferColorSpace: xt } } }), s; } -const st = /* @__PURE__ */ ax(); +const st = /* @__PURE__ */ ox(); function Pi(s) { return s < 0.04045 ? s * 0.0773993808 : Math.pow(s * 0.9478672986 + 0.0521327014, 2.4); } @@ -4331,7 +4359,7 @@ function mr(s) { return s < 31308e-7 ? s * 12.92 : 1.055 * Math.pow(s, 0.41666) - 0.055; } let Ns; -class lx { +class ax { /** * Returns a data URI containing a representation of the given image. * @@ -4381,15 +4409,15 @@ class lx { return He("ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied."), e; } } -let cx = 0; -class Du { +let lx = 0; +class Lu { /** * Constructs a new video texture. * * @param {any} [data=null] - The data definition of a texture. */ constructor(e = null) { - this.isSource = !0, Object.defineProperty(this, "id", { value: cx++ }), this.uuid = On(), this.data = e, this.dataReady = !0, this.version = 0; + this.isSource = !0, Object.defineProperty(this, "id", { value: lx++ }), this.uuid = On(), this.data = e, this.dataReady = !0, this.version = 0; } /** * Returns the dimensions of the source into the given target vector. @@ -4442,14 +4470,14 @@ class Du { } } function Gl(s) { - return typeof HTMLImageElement < "u" && s instanceof HTMLImageElement || typeof HTMLCanvasElement < "u" && s instanceof HTMLCanvasElement || typeof ImageBitmap < "u" && s instanceof ImageBitmap ? lx.getDataURL(s) : s.data ? { + return typeof HTMLImageElement < "u" && s instanceof HTMLImageElement || typeof HTMLCanvasElement < "u" && s instanceof HTMLCanvasElement || typeof ImageBitmap < "u" && s instanceof ImageBitmap ? ax.getDataURL(s) : s.data ? { data: Array.from(s.data), width: s.width, height: s.height, type: s.data.constructor.name } : (He("Texture: Unable to serialize Texture."), {}); } -let hx = 0; +let cx = 0; const Wl = /* @__PURE__ */ new P(); class Ht extends As { /** @@ -4467,7 +4495,7 @@ class Ht extends As { * @param {string} [colorSpace=NoColorSpace] - The color space. */ constructor(e = Ht.DEFAULT_IMAGE, t = Ht.DEFAULT_MAPPING, n = ai, i = ai, r = Yt, o = Ai, a = xn, l = Jn, c = Ht.DEFAULT_ANISOTROPY, h = Xi) { - super(), this.isTexture = !0, Object.defineProperty(this, "id", { value: hx++ }), this.uuid = On(), this.name = "", this.source = new Du(e), this.mipmaps = [], this.mapping = t, this.channel = 0, this.wrapS = n, this.wrapT = i, this.magFilter = r, this.minFilter = o, this.anisotropy = c, this.format = a, this.internalFormat = null, this.type = l, this.offset = new ce(0, 0), this.repeat = new ce(1, 1), this.center = new ce(0, 0), this.rotation = 0, this.matrixAutoUpdate = !0, this.matrix = new $e(), this.generateMipmaps = !0, this.premultiplyAlpha = !1, this.flipY = !0, this.unpackAlignment = 4, this.colorSpace = h, this.userData = {}, this.updateRanges = [], this.version = 0, this.onUpdate = null, this.renderTarget = null, this.isRenderTargetTexture = !1, this.isArrayTexture = !!(e && e.depth && e.depth > 1), this.pmremVersion = 0; + super(), this.isTexture = !0, Object.defineProperty(this, "id", { value: cx++ }), this.uuid = On(), this.name = "", this.source = new Lu(e), this.mipmaps = [], this.mapping = t, this.channel = 0, this.wrapS = n, this.wrapT = i, this.magFilter = r, this.minFilter = o, this.anisotropy = c, this.format = a, this.internalFormat = null, this.type = l, this.offset = new ce(0, 0), this.repeat = new ce(1, 1), this.center = new ce(0, 0), this.rotation = 0, this.matrixAutoUpdate = !0, this.matrix = new $e(), this.generateMipmaps = !0, this.premultiplyAlpha = !1, this.flipY = !0, this.unpackAlignment = 4, this.colorSpace = h, this.userData = {}, this.updateRanges = [], this.version = 0, this.onUpdate = null, this.renderTarget = null, this.isRenderTargetTexture = !1, this.isArrayTexture = !!(e && e.depth && e.depth > 1), this.pmremVersion = 0; } /** * The width of the texture in pixels. @@ -4613,7 +4641,7 @@ class Ht extends As { * @return {Vector2} The transformed uv vector. */ transformUv(e) { - if (this.mapping !== hm) return e; + if (this.mapping !== cm) return e; if (e.applyMatrix3(this.matrix), e.x < 0 || e.x > 1) switch (this.wrapS) { case hi: @@ -4665,7 +4693,7 @@ class Ht extends As { } } Ht.DEFAULT_IMAGE = null; -Ht.DEFAULT_MAPPING = hm; +Ht.DEFAULT_MAPPING = cm; Ht.DEFAULT_ANISOTROPY = 1; class tt { /** @@ -5212,7 +5240,7 @@ class tt { yield this.x, yield this.y, yield this.z, yield this.w; } } -class ux extends As { +class hx extends As { /** * Render target options. * @@ -5339,7 +5367,7 @@ class ux extends As { for (let t = 0, n = e.textures.length; t < n; t++) { this.textures[t] = e.textures[t].clone(), this.textures[t].isRenderTargetTexture = !0, this.textures[t].renderTarget = this; const i = Object.assign({}, e.textures[t].image); - this.textures[t].source = new Du(i); + this.textures[t].source = new Lu(i); } return this.depthBuffer = e.depthBuffer, this.stencilBuffer = e.stencilBuffer, this.resolveDepthBuffer = e.resolveDepthBuffer, this.resolveStencilBuffer = e.resolveStencilBuffer, e.depthTexture !== null && (this.depthTexture = e.depthTexture.clone()), this.samples = e.samples, this; } @@ -5353,7 +5381,7 @@ class ux extends As { this.dispatchEvent({ type: "dispose" }); } } -class bn extends ux { +class bn extends hx { /** * Constructs a new 3D render target. * @@ -5365,7 +5393,7 @@ class bn extends ux { super(e, t, n), this.isWebGLRenderTarget = !0; } } -class _m extends Ht { +class ym extends Ht { /** * Constructs a new data array texture. * @@ -5396,7 +5424,7 @@ class _m extends Ht { this.layerUpdates.clear(); } } -class dx extends Ht { +class ux extends Ht { /** * Constructs a new data array texture. * @@ -5828,7 +5856,7 @@ function Xl(s, e, t, n, i) { } return !0; } -const fx = /* @__PURE__ */ new vt(), Hr = /* @__PURE__ */ new P(), jl = /* @__PURE__ */ new P(); +const dx = /* @__PURE__ */ new vt(), Hr = /* @__PURE__ */ new P(), jl = /* @__PURE__ */ new P(); class di { /** * Constructs a new sphere. @@ -5861,7 +5889,7 @@ class di { */ setFromPoints(e, t) { const n = this.center; - t !== void 0 ? n.copy(t) : fx.setFromPoints(e).getCenter(n); + t !== void 0 ? n.copy(t) : dx.setFromPoints(e).getCenter(n); let i = 0; for (let r = 0, o = e.length; r < o; r++) i = Math.max(i, n.distanceToSquared(e[r])); @@ -6550,7 +6578,7 @@ class ze { * @return {Matrix4} A reference to this matrix. */ makeRotationFromQuaternion(e) { - return this.compose(px, e, mx); + return this.compose(fx, e, px); } /** * Sets the rotation component of the transformation matrix, looking from `eye` towards @@ -7016,7 +7044,7 @@ class ze { return e[t] = n[0], e[t + 1] = n[1], e[t + 2] = n[2], e[t + 3] = n[3], e[t + 4] = n[4], e[t + 5] = n[5], e[t + 6] = n[6], e[t + 7] = n[7], e[t + 8] = n[8], e[t + 9] = n[9], e[t + 10] = n[10], e[t + 11] = n[11], e[t + 12] = n[12], e[t + 13] = n[13], e[t + 14] = n[14], e[t + 15] = n[15], e; } } -const Fs = /* @__PURE__ */ new P(), Xn = /* @__PURE__ */ new ze(), px = /* @__PURE__ */ new P(0, 0, 0), mx = /* @__PURE__ */ new P(1, 1, 1), Oi = /* @__PURE__ */ new P(), Yo = /* @__PURE__ */ new P(), Tn = /* @__PURE__ */ new P(), Ed = /* @__PURE__ */ new ze(), Td = /* @__PURE__ */ new zn(); +const Fs = /* @__PURE__ */ new P(), Xn = /* @__PURE__ */ new ze(), fx = /* @__PURE__ */ new P(0, 0, 0), px = /* @__PURE__ */ new P(1, 1, 1), Oi = /* @__PURE__ */ new P(), Yo = /* @__PURE__ */ new P(), Tn = /* @__PURE__ */ new P(), Sd = /* @__PURE__ */ new ze(), Ed = /* @__PURE__ */ new zn(); class wn { /** * Constructs a new euler instance. @@ -7149,7 +7177,7 @@ class wn { * @return {Euler} A reference to this Euler instance. */ setFromQuaternion(e, t, n) { - return Ed.makeRotationFromQuaternion(e), this.setFromRotationMatrix(Ed, t, n); + return Sd.makeRotationFromQuaternion(e), this.setFromRotationMatrix(Sd, t, n); } /** * Sets the angles of this Euler instance from the given vector. @@ -7172,7 +7200,7 @@ class wn { * @return {Euler} A reference to this Euler instance. */ reorder(e) { - return Td.setFromEuler(this), this.setFromQuaternion(Td, e); + return Ed.setFromEuler(this), this.setFromQuaternion(Ed, e); } /** * Returns `true` if this Euler instance is equal with the given one. @@ -7215,7 +7243,7 @@ class wn { } } wn.DEFAULT_ORDER = "XYZ"; -class Iu { +class Du { /** * Constructs a new layers instance, with membership * initially set to layer `0`. @@ -7287,14 +7315,14 @@ class Iu { return (this.mask & (1 << e | 0)) !== 0; } } -let gx = 0; -const Ad = /* @__PURE__ */ new P(), zs = /* @__PURE__ */ new zn(), gi = /* @__PURE__ */ new ze(), Ko = /* @__PURE__ */ new P(), Vr = /* @__PURE__ */ new P(), xx = /* @__PURE__ */ new P(), vx = /* @__PURE__ */ new zn(), Cd = /* @__PURE__ */ new P(1, 0, 0), Pd = /* @__PURE__ */ new P(0, 1, 0), Rd = /* @__PURE__ */ new P(0, 0, 1), Ld = { type: "added" }, bx = { type: "removed" }, Hs = { type: "childadded", child: null }, Kl = { type: "childremoved", child: null }; +let mx = 0; +const Td = /* @__PURE__ */ new P(), zs = /* @__PURE__ */ new zn(), gi = /* @__PURE__ */ new ze(), Ko = /* @__PURE__ */ new P(), Vr = /* @__PURE__ */ new P(), gx = /* @__PURE__ */ new P(), xx = /* @__PURE__ */ new zn(), Ad = /* @__PURE__ */ new P(1, 0, 0), Cd = /* @__PURE__ */ new P(0, 1, 0), Pd = /* @__PURE__ */ new P(0, 0, 1), Rd = { type: "added" }, vx = { type: "removed" }, Hs = { type: "childadded", child: null }, Kl = { type: "childremoved", child: null }; class St extends As { /** * Constructs a new 3D object. */ constructor() { - super(), this.isObject3D = !0, Object.defineProperty(this, "id", { value: gx++ }), this.uuid = On(), this.name = "", this.type = "Object3D", this.parent = null, this.children = [], this.up = St.DEFAULT_UP.clone(); + super(), this.isObject3D = !0, Object.defineProperty(this, "id", { value: mx++ }), this.uuid = On(), this.name = "", this.type = "Object3D", this.parent = null, this.children = [], this.up = St.DEFAULT_UP.clone(); const e = new P(), t = new wn(), n = new zn(), i = new P(1, 1, 1); function r() { n.setFromEuler(t, !1); @@ -7368,7 +7396,7 @@ class St extends As { normalMatrix: { value: new $e() } - }), this.matrix = new ze(), this.matrixWorld = new ze(), this.matrixAutoUpdate = St.DEFAULT_MATRIX_AUTO_UPDATE, this.matrixWorldAutoUpdate = St.DEFAULT_MATRIX_WORLD_AUTO_UPDATE, this.matrixWorldNeedsUpdate = !1, this.layers = new Iu(), this.visible = !0, this.castShadow = !1, this.receiveShadow = !1, this.frustumCulled = !0, this.renderOrder = 0, this.animations = [], this.customDepthMaterial = void 0, this.customDistanceMaterial = void 0, this.userData = {}; + }), this.matrix = new ze(), this.matrixWorld = new ze(), this.matrixAutoUpdate = St.DEFAULT_MATRIX_AUTO_UPDATE, this.matrixWorldAutoUpdate = St.DEFAULT_MATRIX_WORLD_AUTO_UPDATE, this.matrixWorldNeedsUpdate = !1, this.layers = new Du(), this.visible = !0, this.castShadow = !1, this.receiveShadow = !1, this.frustumCulled = !0, this.renderOrder = 0, this.animations = [], this.customDepthMaterial = void 0, this.customDistanceMaterial = void 0, this.userData = {}; } /** * A callback that is executed immediately before a 3D object is rendered to a shadow map. @@ -7499,7 +7527,7 @@ class St extends As { * @return {Object3D} A reference to this instance. */ rotateX(e) { - return this.rotateOnAxis(Cd, e); + return this.rotateOnAxis(Ad, e); } /** * Rotates the 3D object around its Y axis in local space. @@ -7508,7 +7536,7 @@ class St extends As { * @return {Object3D} A reference to this instance. */ rotateY(e) { - return this.rotateOnAxis(Pd, e); + return this.rotateOnAxis(Cd, e); } /** * Rotates the 3D object around its Z axis in local space. @@ -7517,7 +7545,7 @@ class St extends As { * @return {Object3D} A reference to this instance. */ rotateZ(e) { - return this.rotateOnAxis(Rd, e); + return this.rotateOnAxis(Pd, e); } /** * Translate the 3D object by a distance along the given axis in local space. @@ -7527,7 +7555,7 @@ class St extends As { * @return {Object3D} A reference to this instance. */ translateOnAxis(e, t) { - return Ad.copy(e).applyQuaternion(this.quaternion), this.position.add(Ad.multiplyScalar(t)), this; + return Td.copy(e).applyQuaternion(this.quaternion), this.position.add(Td.multiplyScalar(t)), this; } /** * Translate the 3D object by a distance along its X-axis in local space. @@ -7536,7 +7564,7 @@ class St extends As { * @return {Object3D} A reference to this instance. */ translateX(e) { - return this.translateOnAxis(Cd, e); + return this.translateOnAxis(Ad, e); } /** * Translate the 3D object by a distance along its Y-axis in local space. @@ -7545,7 +7573,7 @@ class St extends As { * @return {Object3D} A reference to this instance. */ translateY(e) { - return this.translateOnAxis(Pd, e); + return this.translateOnAxis(Cd, e); } /** * Translate the 3D object by a distance along its Z-axis in local space. @@ -7554,7 +7582,7 @@ class St extends As { * @return {Object3D} A reference to this instance. */ translateZ(e) { - return this.translateOnAxis(Rd, e); + return this.translateOnAxis(Pd, e); } /** * Converts the given vector from this 3D object's local space to world space. @@ -7604,7 +7632,7 @@ class St extends As { this.add(arguments[t]); return this; } - return e === this ? (et("Object3D.add: object can't be added as a child of itself.", e), this) : (e && e.isObject3D ? (e.removeFromParent(), e.parent = this, this.children.push(e), e.dispatchEvent(Ld), Hs.child = e, this.dispatchEvent(Hs), Hs.child = null) : et("Object3D.add: object not an instance of THREE.Object3D.", e), this); + return e === this ? (et("Object3D.add: object can't be added as a child of itself.", e), this) : (e && e.isObject3D ? (e.removeFromParent(), e.parent = this, this.children.push(e), e.dispatchEvent(Rd), Hs.child = e, this.dispatchEvent(Hs), Hs.child = null) : et("Object3D.add: object not an instance of THREE.Object3D.", e), this); } /** * Removes the given 3D object as child from this 3D object. @@ -7622,7 +7650,7 @@ class St extends As { return this; } const t = this.children.indexOf(e); - return t !== -1 && (e.parent = null, this.children.splice(t, 1), e.dispatchEvent(bx), Kl.child = e, this.dispatchEvent(Kl), Kl.child = null), this; + return t !== -1 && (e.parent = null, this.children.splice(t, 1), e.dispatchEvent(vx), Kl.child = e, this.dispatchEvent(Kl), Kl.child = null), this; } /** * Removes this 3D object from its current parent. @@ -7655,7 +7683,7 @@ class St extends As { * @return {Object3D} A reference to this instance. */ attach(e) { - return this.updateWorldMatrix(!0, !1), gi.copy(this.matrixWorld).invert(), e.parent !== null && (e.parent.updateWorldMatrix(!0, !1), gi.multiply(e.parent.matrixWorld)), e.applyMatrix4(gi), e.removeFromParent(), e.parent = this, this.children.push(e), e.updateWorldMatrix(!1, !0), e.dispatchEvent(Ld), Hs.child = e, this.dispatchEvent(Hs), Hs.child = null, this; + return this.updateWorldMatrix(!0, !1), gi.copy(this.matrixWorld).invert(), e.parent !== null && (e.parent.updateWorldMatrix(!0, !1), gi.multiply(e.parent.matrixWorld)), e.applyMatrix4(gi), e.removeFromParent(), e.parent = this, this.children.push(e), e.updateWorldMatrix(!1, !0), e.dispatchEvent(Rd), Hs.child = e, this.dispatchEvent(Hs), Hs.child = null, this; } /** * Searches through the 3D object and its children, starting with the 3D object @@ -7725,7 +7753,7 @@ class St extends As { * @return {Quaternion} The 3D object's rotation in world space. */ getWorldQuaternion(e) { - return this.updateWorldMatrix(!0, !1), this.matrixWorld.decompose(Vr, e, xx), e; + return this.updateWorldMatrix(!0, !1), this.matrixWorld.decompose(Vr, e, gx), e; } /** * Returns a vector representing the scale of the 3D object in world space. @@ -7734,7 +7762,7 @@ class St extends As { * @return {Vector3} The 3D object's scale in world space. */ getWorldScale(e) { - return this.updateWorldMatrix(!0, !1), this.matrixWorld.decompose(Vr, vx, e), e; + return this.updateWorldMatrix(!0, !1), this.matrixWorld.decompose(Vr, xx, e), e; } /** * Returns a vector representing the ("look") direction of the 3D object in world space. @@ -7946,8 +7974,8 @@ class St extends As { St.DEFAULT_UP = /* @__PURE__ */ new P(0, 1, 0); St.DEFAULT_MATRIX_AUTO_UPDATE = !0; St.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = !0; -const jn = /* @__PURE__ */ new P(), xi = /* @__PURE__ */ new P(), $l = /* @__PURE__ */ new P(), vi = /* @__PURE__ */ new P(), Vs = /* @__PURE__ */ new P(), Gs = /* @__PURE__ */ new P(), Dd = /* @__PURE__ */ new P(), Jl = /* @__PURE__ */ new P(), Ql = /* @__PURE__ */ new P(), ec = /* @__PURE__ */ new P(), tc = /* @__PURE__ */ new tt(), nc = /* @__PURE__ */ new tt(), ic = /* @__PURE__ */ new tt(); -class yt { +const jn = /* @__PURE__ */ new P(), xi = /* @__PURE__ */ new P(), $l = /* @__PURE__ */ new P(), vi = /* @__PURE__ */ new P(), Vs = /* @__PURE__ */ new P(), Gs = /* @__PURE__ */ new P(), Ld = /* @__PURE__ */ new P(), Jl = /* @__PURE__ */ new P(), Ql = /* @__PURE__ */ new P(), ec = /* @__PURE__ */ new P(), tc = /* @__PURE__ */ new tt(), nc = /* @__PURE__ */ new tt(), ic = /* @__PURE__ */ new tt(); +class bt { /** * Constructs a new triangle. * @@ -8124,7 +8152,7 @@ class yt { * @return {Vector3} The triangle's normal. */ getNormal(e) { - return yt.getNormal(this.a, this.b, this.c, e); + return bt.getNormal(this.a, this.b, this.c, e); } /** * Computes a plane the triangle lies within. @@ -8144,7 +8172,7 @@ class yt { * @return {?Vector3} The barycentric coordinates for the given point */ getBarycoord(e, t) { - return yt.getBarycoord(e, this.a, this.b, this.c, t); + return bt.getBarycoord(e, this.a, this.b, this.c, t); } /** * Computes the value barycentrically interpolated for the given point on the @@ -8158,7 +8186,7 @@ class yt { * @return {?Vector3} The interpolated value. */ getInterpolation(e, t, n, i, r) { - return yt.getInterpolation(e, this.a, this.b, this.c, t, n, i, r); + return bt.getInterpolation(e, this.a, this.b, this.c, t, n, i, r); } /** * Returns `true` if the given point, when projected onto the plane of the @@ -8169,7 +8197,7 @@ class yt { * triangle, lies within the triangle or not. */ containsPoint(e) { - return yt.containsPoint(e, this.a, this.b, this.c); + return bt.containsPoint(e, this.a, this.b, this.c); } /** * Returns `true` if the triangle is oriented towards the given direction. @@ -8178,7 +8206,7 @@ class yt { * @return {boolean} Whether the triangle is oriented towards the given direction or not. */ isFrontFacing(e) { - return yt.isFrontFacing(this.a, this.b, this.c, e); + return bt.isFrontFacing(this.a, this.b, this.c, e); } /** * Returns `true` if this triangle intersects with the given box. @@ -8219,7 +8247,7 @@ class yt { return a = c / (c - p), t.copy(n).addScaledVector(Gs, a); const x = h * p - f * u; if (x <= 0 && u - h >= 0 && f - p >= 0) - return Dd.subVectors(r, i), a = (u - h) / (u - h + (f - p)), t.copy(i).addScaledVector(Dd, a); + return Ld.subVectors(r, i), a = (u - h) / (u - h + (f - p)), t.copy(i).addScaledVector(Ld, a); const m = 1 / (x + g + d); return o = g * m, a = d * m, t.copy(n).addScaledVector(Vs, o).addScaledVector(Gs, a); } @@ -8233,7 +8261,7 @@ class yt { return e.a.equals(this.a) && e.b.equals(this.b) && e.c.equals(this.c); } } -const Mm = { +const _m = { aliceblue: 15792383, antiquewhite: 16444375, aqua: 65535, @@ -8459,7 +8487,7 @@ class Fe { * @return {Color} A reference to this color. */ setHSL(e, t, n, i = st.workingColorSpace) { - if (e = Lu(e, 1), t = Ze(t, 0, 1), n = Ze(n, 0, 1), t === 0) + if (e = Ru(e, 1), t = Ze(t, 0, 1), n = Ze(n, 0, 1), t === 0) this.r = this.g = this.b = n; else { const r = n <= 0.5 ? n * (1 + t) : n + t - n * t, o = 2 * n - r; @@ -8546,7 +8574,7 @@ class Fe { * @return {Color} A reference to this color. */ setColorName(e, t = xt) { - const n = Mm[e.toLowerCase()]; + const n = _m[e.toLowerCase()]; return n !== void 0 ? this.setHex(n, t) : He("Color: Unknown color " + e), this; } /** @@ -8855,14 +8883,14 @@ class Fe { } } const tn = /* @__PURE__ */ new Fe(); -Fe.NAMES = Mm; -let yx = 0; +Fe.NAMES = _m; +let bx = 0; class yn extends As { /** * Constructs a new material. */ constructor() { - super(), this.isMaterial = !0, Object.defineProperty(this, "id", { value: yx++ }), this.uuid = On(), this.name = "", this.type = "Material", this.blending = pr, this.side = Fn, this.vertexColors = !1, this.opacity = 1, this.transparent = !1, this.alphaHash = !1, this.blendSrc = oh, this.blendDst = ah, this.blendEquation = Zn, this.blendSrcAlpha = null, this.blendDstAlpha = null, this.blendEquationAlpha = null, this.blendColor = new Fe(0, 0, 0), this.blendAlpha = 0, this.depthFunc = vr, this.depthTest = !0, this.depthWrite = !0, this.stencilWriteMask = 255, this.stencilFunc = vd, this.stencilRef = 0, this.stencilFuncMask = 255, this.stencilFail = Bs, this.stencilZFail = Bs, this.stencilZPass = Bs, this.stencilWrite = !1, this.clippingPlanes = null, this.clipIntersection = !1, this.clipShadows = !1, this.shadowSide = null, this.colorWrite = !0, this.precision = null, this.polygonOffset = !1, this.polygonOffsetFactor = 0, this.polygonOffsetUnits = 0, this.dithering = !1, this.alphaToCoverage = !1, this.premultipliedAlpha = !1, this.forceSinglePass = !1, this.allowOverride = !0, this.visible = !0, this.toneMapped = !0, this.userData = {}, this.version = 0, this._alphaTest = 0; + super(), this.isMaterial = !0, Object.defineProperty(this, "id", { value: bx++ }), this.uuid = On(), this.name = "", this.type = "Material", this.blending = pr, this.side = Fn, this.vertexColors = !1, this.opacity = 1, this.transparent = !1, this.alphaHash = !1, this.blendSrc = rh, this.blendDst = oh, this.blendEquation = Zn, this.blendSrcAlpha = null, this.blendDstAlpha = null, this.blendEquationAlpha = null, this.blendColor = new Fe(0, 0, 0), this.blendAlpha = 0, this.depthFunc = vr, this.depthTest = !0, this.depthWrite = !0, this.stencilWriteMask = 255, this.stencilFunc = xd, this.stencilRef = 0, this.stencilFuncMask = 255, this.stencilFail = Bs, this.stencilZFail = Bs, this.stencilZPass = Bs, this.stencilWrite = !1, this.clippingPlanes = null, this.clipIntersection = !1, this.clipShadows = !1, this.shadowSide = null, this.colorWrite = !0, this.precision = null, this.polygonOffset = !1, this.polygonOffsetFactor = 0, this.polygonOffsetUnits = 0, this.dithering = !1, this.alphaToCoverage = !1, this.premultipliedAlpha = !1, this.forceSinglePass = !1, this.allowOverride = !0, this.visible = !0, this.toneMapped = !0, this.userData = {}, this.version = 0, this._alphaTest = 0; } /** * Sets the alpha value to be used when running an alpha test. The material @@ -8961,7 +8989,7 @@ class yn extends As { generator: "Material.toJSON" } }; - n.uuid = this.uuid, n.type = this.type, this.name !== "" && (n.name = this.name), this.color && this.color.isColor && (n.color = this.color.getHex()), this.roughness !== void 0 && (n.roughness = this.roughness), this.metalness !== void 0 && (n.metalness = this.metalness), this.sheen !== void 0 && (n.sheen = this.sheen), this.sheenColor && this.sheenColor.isColor && (n.sheenColor = this.sheenColor.getHex()), this.sheenRoughness !== void 0 && (n.sheenRoughness = this.sheenRoughness), this.emissive && this.emissive.isColor && (n.emissive = this.emissive.getHex()), this.emissiveIntensity !== void 0 && this.emissiveIntensity !== 1 && (n.emissiveIntensity = this.emissiveIntensity), this.specular && this.specular.isColor && (n.specular = this.specular.getHex()), this.specularIntensity !== void 0 && (n.specularIntensity = this.specularIntensity), this.specularColor && this.specularColor.isColor && (n.specularColor = this.specularColor.getHex()), this.shininess !== void 0 && (n.shininess = this.shininess), this.clearcoat !== void 0 && (n.clearcoat = this.clearcoat), this.clearcoatRoughness !== void 0 && (n.clearcoatRoughness = this.clearcoatRoughness), this.clearcoatMap && this.clearcoatMap.isTexture && (n.clearcoatMap = this.clearcoatMap.toJSON(e).uuid), this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture && (n.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON(e).uuid), this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture && (n.clearcoatNormalMap = this.clearcoatNormalMap.toJSON(e).uuid, n.clearcoatNormalScale = this.clearcoatNormalScale.toArray()), this.sheenColorMap && this.sheenColorMap.isTexture && (n.sheenColorMap = this.sheenColorMap.toJSON(e).uuid), this.sheenRoughnessMap && this.sheenRoughnessMap.isTexture && (n.sheenRoughnessMap = this.sheenRoughnessMap.toJSON(e).uuid), this.dispersion !== void 0 && (n.dispersion = this.dispersion), this.iridescence !== void 0 && (n.iridescence = this.iridescence), this.iridescenceIOR !== void 0 && (n.iridescenceIOR = this.iridescenceIOR), this.iridescenceThicknessRange !== void 0 && (n.iridescenceThicknessRange = this.iridescenceThicknessRange), this.iridescenceMap && this.iridescenceMap.isTexture && (n.iridescenceMap = this.iridescenceMap.toJSON(e).uuid), this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture && (n.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON(e).uuid), this.anisotropy !== void 0 && (n.anisotropy = this.anisotropy), this.anisotropyRotation !== void 0 && (n.anisotropyRotation = this.anisotropyRotation), this.anisotropyMap && this.anisotropyMap.isTexture && (n.anisotropyMap = this.anisotropyMap.toJSON(e).uuid), this.map && this.map.isTexture && (n.map = this.map.toJSON(e).uuid), this.matcap && this.matcap.isTexture && (n.matcap = this.matcap.toJSON(e).uuid), this.alphaMap && this.alphaMap.isTexture && (n.alphaMap = this.alphaMap.toJSON(e).uuid), this.lightMap && this.lightMap.isTexture && (n.lightMap = this.lightMap.toJSON(e).uuid, n.lightMapIntensity = this.lightMapIntensity), this.aoMap && this.aoMap.isTexture && (n.aoMap = this.aoMap.toJSON(e).uuid, n.aoMapIntensity = this.aoMapIntensity), this.bumpMap && this.bumpMap.isTexture && (n.bumpMap = this.bumpMap.toJSON(e).uuid, n.bumpScale = this.bumpScale), this.normalMap && this.normalMap.isTexture && (n.normalMap = this.normalMap.toJSON(e).uuid, n.normalMapType = this.normalMapType, n.normalScale = this.normalScale.toArray()), this.displacementMap && this.displacementMap.isTexture && (n.displacementMap = this.displacementMap.toJSON(e).uuid, n.displacementScale = this.displacementScale, n.displacementBias = this.displacementBias), this.roughnessMap && this.roughnessMap.isTexture && (n.roughnessMap = this.roughnessMap.toJSON(e).uuid), this.metalnessMap && this.metalnessMap.isTexture && (n.metalnessMap = this.metalnessMap.toJSON(e).uuid), this.emissiveMap && this.emissiveMap.isTexture && (n.emissiveMap = this.emissiveMap.toJSON(e).uuid), this.specularMap && this.specularMap.isTexture && (n.specularMap = this.specularMap.toJSON(e).uuid), this.specularIntensityMap && this.specularIntensityMap.isTexture && (n.specularIntensityMap = this.specularIntensityMap.toJSON(e).uuid), this.specularColorMap && this.specularColorMap.isTexture && (n.specularColorMap = this.specularColorMap.toJSON(e).uuid), this.envMap && this.envMap.isTexture && (n.envMap = this.envMap.toJSON(e).uuid, this.combine !== void 0 && (n.combine = this.combine)), this.envMapRotation !== void 0 && (n.envMapRotation = this.envMapRotation.toArray()), this.envMapIntensity !== void 0 && (n.envMapIntensity = this.envMapIntensity), this.reflectivity !== void 0 && (n.reflectivity = this.reflectivity), this.refractionRatio !== void 0 && (n.refractionRatio = this.refractionRatio), this.gradientMap && this.gradientMap.isTexture && (n.gradientMap = this.gradientMap.toJSON(e).uuid), this.transmission !== void 0 && (n.transmission = this.transmission), this.transmissionMap && this.transmissionMap.isTexture && (n.transmissionMap = this.transmissionMap.toJSON(e).uuid), this.thickness !== void 0 && (n.thickness = this.thickness), this.thicknessMap && this.thicknessMap.isTexture && (n.thicknessMap = this.thicknessMap.toJSON(e).uuid), this.attenuationDistance !== void 0 && this.attenuationDistance !== 1 / 0 && (n.attenuationDistance = this.attenuationDistance), this.attenuationColor !== void 0 && (n.attenuationColor = this.attenuationColor.getHex()), this.size !== void 0 && (n.size = this.size), this.shadowSide !== null && (n.shadowSide = this.shadowSide), this.sizeAttenuation !== void 0 && (n.sizeAttenuation = this.sizeAttenuation), this.blending !== pr && (n.blending = this.blending), this.side !== Fn && (n.side = this.side), this.vertexColors === !0 && (n.vertexColors = !0), this.opacity < 1 && (n.opacity = this.opacity), this.transparent === !0 && (n.transparent = !0), this.blendSrc !== oh && (n.blendSrc = this.blendSrc), this.blendDst !== ah && (n.blendDst = this.blendDst), this.blendEquation !== Zn && (n.blendEquation = this.blendEquation), this.blendSrcAlpha !== null && (n.blendSrcAlpha = this.blendSrcAlpha), this.blendDstAlpha !== null && (n.blendDstAlpha = this.blendDstAlpha), this.blendEquationAlpha !== null && (n.blendEquationAlpha = this.blendEquationAlpha), this.blendColor && this.blendColor.isColor && (n.blendColor = this.blendColor.getHex()), this.blendAlpha !== 0 && (n.blendAlpha = this.blendAlpha), this.depthFunc !== vr && (n.depthFunc = this.depthFunc), this.depthTest === !1 && (n.depthTest = this.depthTest), this.depthWrite === !1 && (n.depthWrite = this.depthWrite), this.colorWrite === !1 && (n.colorWrite = this.colorWrite), this.stencilWriteMask !== 255 && (n.stencilWriteMask = this.stencilWriteMask), this.stencilFunc !== vd && (n.stencilFunc = this.stencilFunc), this.stencilRef !== 0 && (n.stencilRef = this.stencilRef), this.stencilFuncMask !== 255 && (n.stencilFuncMask = this.stencilFuncMask), this.stencilFail !== Bs && (n.stencilFail = this.stencilFail), this.stencilZFail !== Bs && (n.stencilZFail = this.stencilZFail), this.stencilZPass !== Bs && (n.stencilZPass = this.stencilZPass), this.stencilWrite === !0 && (n.stencilWrite = this.stencilWrite), this.rotation !== void 0 && this.rotation !== 0 && (n.rotation = this.rotation), this.polygonOffset === !0 && (n.polygonOffset = !0), this.polygonOffsetFactor !== 0 && (n.polygonOffsetFactor = this.polygonOffsetFactor), this.polygonOffsetUnits !== 0 && (n.polygonOffsetUnits = this.polygonOffsetUnits), this.linewidth !== void 0 && this.linewidth !== 1 && (n.linewidth = this.linewidth), this.dashSize !== void 0 && (n.dashSize = this.dashSize), this.gapSize !== void 0 && (n.gapSize = this.gapSize), this.scale !== void 0 && (n.scale = this.scale), this.dithering === !0 && (n.dithering = !0), this.alphaTest > 0 && (n.alphaTest = this.alphaTest), this.alphaHash === !0 && (n.alphaHash = !0), this.alphaToCoverage === !0 && (n.alphaToCoverage = !0), this.premultipliedAlpha === !0 && (n.premultipliedAlpha = !0), this.forceSinglePass === !0 && (n.forceSinglePass = !0), this.wireframe === !0 && (n.wireframe = !0), this.wireframeLinewidth > 1 && (n.wireframeLinewidth = this.wireframeLinewidth), this.wireframeLinecap !== "round" && (n.wireframeLinecap = this.wireframeLinecap), this.wireframeLinejoin !== "round" && (n.wireframeLinejoin = this.wireframeLinejoin), this.flatShading === !0 && (n.flatShading = !0), this.visible === !1 && (n.visible = !1), this.toneMapped === !1 && (n.toneMapped = !1), this.fog === !1 && (n.fog = !1), Object.keys(this.userData).length > 0 && (n.userData = this.userData); + n.uuid = this.uuid, n.type = this.type, this.name !== "" && (n.name = this.name), this.color && this.color.isColor && (n.color = this.color.getHex()), this.roughness !== void 0 && (n.roughness = this.roughness), this.metalness !== void 0 && (n.metalness = this.metalness), this.sheen !== void 0 && (n.sheen = this.sheen), this.sheenColor && this.sheenColor.isColor && (n.sheenColor = this.sheenColor.getHex()), this.sheenRoughness !== void 0 && (n.sheenRoughness = this.sheenRoughness), this.emissive && this.emissive.isColor && (n.emissive = this.emissive.getHex()), this.emissiveIntensity !== void 0 && this.emissiveIntensity !== 1 && (n.emissiveIntensity = this.emissiveIntensity), this.specular && this.specular.isColor && (n.specular = this.specular.getHex()), this.specularIntensity !== void 0 && (n.specularIntensity = this.specularIntensity), this.specularColor && this.specularColor.isColor && (n.specularColor = this.specularColor.getHex()), this.shininess !== void 0 && (n.shininess = this.shininess), this.clearcoat !== void 0 && (n.clearcoat = this.clearcoat), this.clearcoatRoughness !== void 0 && (n.clearcoatRoughness = this.clearcoatRoughness), this.clearcoatMap && this.clearcoatMap.isTexture && (n.clearcoatMap = this.clearcoatMap.toJSON(e).uuid), this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture && (n.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON(e).uuid), this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture && (n.clearcoatNormalMap = this.clearcoatNormalMap.toJSON(e).uuid, n.clearcoatNormalScale = this.clearcoatNormalScale.toArray()), this.sheenColorMap && this.sheenColorMap.isTexture && (n.sheenColorMap = this.sheenColorMap.toJSON(e).uuid), this.sheenRoughnessMap && this.sheenRoughnessMap.isTexture && (n.sheenRoughnessMap = this.sheenRoughnessMap.toJSON(e).uuid), this.dispersion !== void 0 && (n.dispersion = this.dispersion), this.iridescence !== void 0 && (n.iridescence = this.iridescence), this.iridescenceIOR !== void 0 && (n.iridescenceIOR = this.iridescenceIOR), this.iridescenceThicknessRange !== void 0 && (n.iridescenceThicknessRange = this.iridescenceThicknessRange), this.iridescenceMap && this.iridescenceMap.isTexture && (n.iridescenceMap = this.iridescenceMap.toJSON(e).uuid), this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture && (n.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON(e).uuid), this.anisotropy !== void 0 && (n.anisotropy = this.anisotropy), this.anisotropyRotation !== void 0 && (n.anisotropyRotation = this.anisotropyRotation), this.anisotropyMap && this.anisotropyMap.isTexture && (n.anisotropyMap = this.anisotropyMap.toJSON(e).uuid), this.map && this.map.isTexture && (n.map = this.map.toJSON(e).uuid), this.matcap && this.matcap.isTexture && (n.matcap = this.matcap.toJSON(e).uuid), this.alphaMap && this.alphaMap.isTexture && (n.alphaMap = this.alphaMap.toJSON(e).uuid), this.lightMap && this.lightMap.isTexture && (n.lightMap = this.lightMap.toJSON(e).uuid, n.lightMapIntensity = this.lightMapIntensity), this.aoMap && this.aoMap.isTexture && (n.aoMap = this.aoMap.toJSON(e).uuid, n.aoMapIntensity = this.aoMapIntensity), this.bumpMap && this.bumpMap.isTexture && (n.bumpMap = this.bumpMap.toJSON(e).uuid, n.bumpScale = this.bumpScale), this.normalMap && this.normalMap.isTexture && (n.normalMap = this.normalMap.toJSON(e).uuid, n.normalMapType = this.normalMapType, n.normalScale = this.normalScale.toArray()), this.displacementMap && this.displacementMap.isTexture && (n.displacementMap = this.displacementMap.toJSON(e).uuid, n.displacementScale = this.displacementScale, n.displacementBias = this.displacementBias), this.roughnessMap && this.roughnessMap.isTexture && (n.roughnessMap = this.roughnessMap.toJSON(e).uuid), this.metalnessMap && this.metalnessMap.isTexture && (n.metalnessMap = this.metalnessMap.toJSON(e).uuid), this.emissiveMap && this.emissiveMap.isTexture && (n.emissiveMap = this.emissiveMap.toJSON(e).uuid), this.specularMap && this.specularMap.isTexture && (n.specularMap = this.specularMap.toJSON(e).uuid), this.specularIntensityMap && this.specularIntensityMap.isTexture && (n.specularIntensityMap = this.specularIntensityMap.toJSON(e).uuid), this.specularColorMap && this.specularColorMap.isTexture && (n.specularColorMap = this.specularColorMap.toJSON(e).uuid), this.envMap && this.envMap.isTexture && (n.envMap = this.envMap.toJSON(e).uuid, this.combine !== void 0 && (n.combine = this.combine)), this.envMapRotation !== void 0 && (n.envMapRotation = this.envMapRotation.toArray()), this.envMapIntensity !== void 0 && (n.envMapIntensity = this.envMapIntensity), this.reflectivity !== void 0 && (n.reflectivity = this.reflectivity), this.refractionRatio !== void 0 && (n.refractionRatio = this.refractionRatio), this.gradientMap && this.gradientMap.isTexture && (n.gradientMap = this.gradientMap.toJSON(e).uuid), this.transmission !== void 0 && (n.transmission = this.transmission), this.transmissionMap && this.transmissionMap.isTexture && (n.transmissionMap = this.transmissionMap.toJSON(e).uuid), this.thickness !== void 0 && (n.thickness = this.thickness), this.thicknessMap && this.thicknessMap.isTexture && (n.thicknessMap = this.thicknessMap.toJSON(e).uuid), this.attenuationDistance !== void 0 && this.attenuationDistance !== 1 / 0 && (n.attenuationDistance = this.attenuationDistance), this.attenuationColor !== void 0 && (n.attenuationColor = this.attenuationColor.getHex()), this.size !== void 0 && (n.size = this.size), this.shadowSide !== null && (n.shadowSide = this.shadowSide), this.sizeAttenuation !== void 0 && (n.sizeAttenuation = this.sizeAttenuation), this.blending !== pr && (n.blending = this.blending), this.side !== Fn && (n.side = this.side), this.vertexColors === !0 && (n.vertexColors = !0), this.opacity < 1 && (n.opacity = this.opacity), this.transparent === !0 && (n.transparent = !0), this.blendSrc !== rh && (n.blendSrc = this.blendSrc), this.blendDst !== oh && (n.blendDst = this.blendDst), this.blendEquation !== Zn && (n.blendEquation = this.blendEquation), this.blendSrcAlpha !== null && (n.blendSrcAlpha = this.blendSrcAlpha), this.blendDstAlpha !== null && (n.blendDstAlpha = this.blendDstAlpha), this.blendEquationAlpha !== null && (n.blendEquationAlpha = this.blendEquationAlpha), this.blendColor && this.blendColor.isColor && (n.blendColor = this.blendColor.getHex()), this.blendAlpha !== 0 && (n.blendAlpha = this.blendAlpha), this.depthFunc !== vr && (n.depthFunc = this.depthFunc), this.depthTest === !1 && (n.depthTest = this.depthTest), this.depthWrite === !1 && (n.depthWrite = this.depthWrite), this.colorWrite === !1 && (n.colorWrite = this.colorWrite), this.stencilWriteMask !== 255 && (n.stencilWriteMask = this.stencilWriteMask), this.stencilFunc !== xd && (n.stencilFunc = this.stencilFunc), this.stencilRef !== 0 && (n.stencilRef = this.stencilRef), this.stencilFuncMask !== 255 && (n.stencilFuncMask = this.stencilFuncMask), this.stencilFail !== Bs && (n.stencilFail = this.stencilFail), this.stencilZFail !== Bs && (n.stencilZFail = this.stencilZFail), this.stencilZPass !== Bs && (n.stencilZPass = this.stencilZPass), this.stencilWrite === !0 && (n.stencilWrite = this.stencilWrite), this.rotation !== void 0 && this.rotation !== 0 && (n.rotation = this.rotation), this.polygonOffset === !0 && (n.polygonOffset = !0), this.polygonOffsetFactor !== 0 && (n.polygonOffsetFactor = this.polygonOffsetFactor), this.polygonOffsetUnits !== 0 && (n.polygonOffsetUnits = this.polygonOffsetUnits), this.linewidth !== void 0 && this.linewidth !== 1 && (n.linewidth = this.linewidth), this.dashSize !== void 0 && (n.dashSize = this.dashSize), this.gapSize !== void 0 && (n.gapSize = this.gapSize), this.scale !== void 0 && (n.scale = this.scale), this.dithering === !0 && (n.dithering = !0), this.alphaTest > 0 && (n.alphaTest = this.alphaTest), this.alphaHash === !0 && (n.alphaHash = !0), this.alphaToCoverage === !0 && (n.alphaToCoverage = !0), this.premultipliedAlpha === !0 && (n.premultipliedAlpha = !0), this.forceSinglePass === !0 && (n.forceSinglePass = !0), this.wireframe === !0 && (n.wireframe = !0), this.wireframeLinewidth > 1 && (n.wireframeLinewidth = this.wireframeLinewidth), this.wireframeLinecap !== "round" && (n.wireframeLinecap = this.wireframeLinecap), this.wireframeLinejoin !== "round" && (n.wireframeLinejoin = this.wireframeLinejoin), this.flatShading === !0 && (n.flatShading = !0), this.visible === !1 && (n.visible = !1), this.toneMapped === !1 && (n.toneMapped = !1), this.fog === !1 && (n.fog = !1), Object.keys(this.userData).length > 0 && (n.userData = this.userData); function i(r) { const o = []; for (const a in r) { @@ -9041,7 +9069,7 @@ class Zt extends yn { } } const Ot = /* @__PURE__ */ new P(), Jo = /* @__PURE__ */ new ce(); -let _x = 0; +let yx = 0; class at { /** * Constructs a new buffer attribute. @@ -9053,7 +9081,7 @@ class at { constructor(e, t, n = !1) { if (Array.isArray(e)) throw new TypeError("THREE.BufferAttribute: array should be a Typed Array."); - this.isBufferAttribute = !0, Object.defineProperty(this, "id", { value: _x++ }), this.name = "", this.array = e, this.itemSize = t, this.count = e !== void 0 ? e.length / t : 0, this.normalized = n, this.usage = Zh, this.updateRanges = [], this.gpuType = $n, this.version = 0; + this.isBufferAttribute = !0, Object.defineProperty(this, "id", { value: yx++ }), this.name = "", this.array = e, this.itemSize = t, this.count = e !== void 0 ? e.length / t : 0, this.normalized = n, this.usage = qh, this.updateRanges = [], this.gpuType = $n, this.version = 0; } /** * A callback function that is executed after the renderer has transferred the attribute @@ -9361,10 +9389,10 @@ class at { array: Array.from(this.array), normalized: this.normalized }; - return this.name !== "" && (e.name = this.name), this.usage !== Zh && (e.usage = this.usage), e; + return this.name !== "" && (e.name = this.name), this.usage !== qh && (e.usage = this.usage), e; } } -class wm extends at { +class Mm extends at { /** * Constructs a new buffer attribute. * @@ -9376,7 +9404,7 @@ class wm extends at { super(new Uint16Array(e), t, n); } } -class Sm extends at { +class wm extends at { /** * Constructs a new buffer attribute. * @@ -9400,14 +9428,14 @@ class rn extends at { super(new Float32Array(e), t, n); } } -let Mx = 0; +let _x = 0; const Rn = /* @__PURE__ */ new ze(), rc = /* @__PURE__ */ new St(), Ws = /* @__PURE__ */ new P(), An = /* @__PURE__ */ new vt(), Gr = /* @__PURE__ */ new vt(), Wt = /* @__PURE__ */ new P(); class ut extends As { /** * Constructs a new geometry. */ constructor() { - super(), this.isBufferGeometry = !0, Object.defineProperty(this, "id", { value: Mx++ }), this.uuid = On(), this.name = "", this.type = "BufferGeometry", this.index = null, this.indirect = null, this.attributes = {}, this.morphAttributes = {}, this.morphTargetsRelative = !1, this.groups = [], this.boundingBox = null, this.boundingSphere = null, this.drawRange = { start: 0, count: 1 / 0 }, this.userData = {}; + super(), this.isBufferGeometry = !0, Object.defineProperty(this, "id", { value: _x++ }), this.uuid = On(), this.name = "", this.type = "BufferGeometry", this.index = null, this.indirect = null, this.attributes = {}, this.morphAttributes = {}, this.morphTargetsRelative = !1, this.groups = [], this.boundingBox = null, this.boundingSphere = null, this.drawRange = { start: 0, count: 1 / 0 }, this.userData = {}; } /** * Returns the index of this geometry. @@ -9424,7 +9452,7 @@ class ut extends As { * @return {BufferGeometry} A reference to this instance. */ setIndex(e) { - return Array.isArray(e) ? this.index = new (ym(e) ? Sm : wm)(e, 1) : this.index = e, this; + return Array.isArray(e) ? this.index = new (bm(e) ? wm : Mm)(e, 1) : this.index = e, this; } /** * Sets the given indirect attribute to this geometry. @@ -9931,7 +9959,7 @@ class ut extends As { this.dispatchEvent({ type: "dispose" }); } } -const Id = /* @__PURE__ */ new ze(), rs = /* @__PURE__ */ new Qi(), Qo = /* @__PURE__ */ new di(), Bd = /* @__PURE__ */ new P(), ea = /* @__PURE__ */ new P(), ta = /* @__PURE__ */ new P(), na = /* @__PURE__ */ new P(), oc = /* @__PURE__ */ new P(), ia = /* @__PURE__ */ new P(), Nd = /* @__PURE__ */ new P(), sa = /* @__PURE__ */ new P(); +const Dd = /* @__PURE__ */ new ze(), rs = /* @__PURE__ */ new Qi(), Qo = /* @__PURE__ */ new di(), Id = /* @__PURE__ */ new P(), ea = /* @__PURE__ */ new P(), ta = /* @__PURE__ */ new P(), na = /* @__PURE__ */ new P(), oc = /* @__PURE__ */ new P(), ia = /* @__PURE__ */ new P(), Bd = /* @__PURE__ */ new P(), sa = /* @__PURE__ */ new P(); class dt extends St { /** * Constructs a new mesh. @@ -9992,7 +10020,7 @@ class dt extends St { */ raycast(e, t) { const n = this.geometry, i = this.material, r = this.matrixWorld; - i !== void 0 && (n.boundingSphere === null && n.computeBoundingSphere(), Qo.copy(n.boundingSphere), Qo.applyMatrix4(r), rs.copy(e.ray).recast(e.near), !(Qo.containsPoint(rs.origin) === !1 && (rs.intersectSphere(Qo, Bd) === null || rs.origin.distanceToSquared(Bd) > (e.far - e.near) ** 2)) && (Id.copy(r).invert(), rs.copy(e.ray).applyMatrix4(Id), !(n.boundingBox !== null && rs.intersectsBox(n.boundingBox) === !1) && this._computeIntersections(e, t, rs))); + i !== void 0 && (n.boundingSphere === null && n.computeBoundingSphere(), Qo.copy(n.boundingSphere), Qo.applyMatrix4(r), rs.copy(e.ray).recast(e.near), !(Qo.containsPoint(rs.origin) === !1 && (rs.intersectSphere(Qo, Id) === null || rs.origin.distanceToSquared(Id) > (e.far - e.near) ** 2)) && (Dd.copy(r).invert(), rs.copy(e.ray).applyMatrix4(Dd), !(n.boundingBox !== null && rs.intersectsBox(n.boundingBox) === !1) && this._computeIntersections(e, t, rs))); } _computeIntersections(e, t, n) { let i; @@ -10031,7 +10059,7 @@ class dt extends St { } } } -function wx(s, e, t, n, i, r, o, a) { +function Mx(s, e, t, n, i, r, o, a) { let l; if (e.side === un ? l = n.intersectTriangle(o, r, i, !0, a) : l = n.intersectTriangle(i, r, o, e.side === Fn, a), l === null) return null; sa.copy(a), sa.applyMatrix4(s.matrixWorld); @@ -10044,10 +10072,10 @@ function wx(s, e, t, n, i, r, o, a) { } function ra(s, e, t, n, i, r, o, a, l, c) { s.getVertexPosition(a, ea), s.getVertexPosition(l, ta), s.getVertexPosition(c, na); - const h = wx(s, e, t, n, ea, ta, na, Nd); + const h = Mx(s, e, t, n, ea, ta, na, Bd); if (h) { const u = new P(); - yt.getBarycoord(Nd, ea, ta, na, u), i && (h.uv = yt.getInterpolatedAttribute(i, a, l, c, u, new ce())), r && (h.uv1 = yt.getInterpolatedAttribute(r, a, l, c, u, new ce())), o && (h.normal = yt.getInterpolatedAttribute(o, a, l, c, u, new P()), h.normal.dot(n.direction) > 0 && h.normal.multiplyScalar(-1)); + bt.getBarycoord(Bd, ea, ta, na, u), i && (h.uv = bt.getInterpolatedAttribute(i, a, l, c, u, new ce())), r && (h.uv1 = bt.getInterpolatedAttribute(r, a, l, c, u, new ce())), o && (h.normal = bt.getInterpolatedAttribute(o, a, l, c, u, new P()), h.normal.dot(n.direction) > 0 && h.normal.multiplyScalar(-1)); const d = { a, b: l, @@ -10055,7 +10083,7 @@ function ra(s, e, t, n, i, r, o, a, l, c) { normal: new P(), materialIndex: 0 }; - yt.getNormal(ea, ta, na, d.normal), h.face = d, h.barycoord = u; + bt.getNormal(ea, ta, na, d.normal), h.face = d, h.barycoord = u; } return h; } @@ -10137,20 +10165,20 @@ function cn(s) { } return e; } -function Sx(s) { +function wx(s) { const e = []; for (let t = 0; t < s.length; t++) e.push(s[t].clone()); return e; } -function Em(s) { +function Sm(s) { const e = s.getRenderTarget(); return e === null ? s.outputColorSpace : e.isXRRenderTarget === !0 ? e.texture.colorSpace : st.workingColorSpace; } const oi = { clone: Sr, merge: cn }; -var Ex = `void main() { +var Sx = `void main() { gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); -}`, Tx = `void main() { +}`, Ex = `void main() { gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 ); }`; class Ut extends yn { @@ -10164,7 +10192,7 @@ class Ut extends yn { * by {@link Color#set}. */ constructor(e) { - super(), this.isShaderMaterial = !0, this.type = "ShaderMaterial", this.defines = {}, this.uniforms = {}, this.uniformsGroups = [], this.vertexShader = Ex, this.fragmentShader = Tx, this.linewidth = 1, this.wireframe = !1, this.wireframeLinewidth = 1, this.fog = !1, this.lights = !1, this.clipping = !1, this.forceSinglePass = !0, this.extensions = { + super(), this.isShaderMaterial = !0, this.type = "ShaderMaterial", this.defines = {}, this.uniforms = {}, this.uniformsGroups = [], this.vertexShader = Sx, this.fragmentShader = Ex, this.linewidth = 1, this.wireframe = !1, this.wireframeLinewidth = 1, this.fog = !1, this.lights = !1, this.clipping = !1, this.forceSinglePass = !0, this.extensions = { clipCullDistance: !1, // set to use vertex shader clipping multiDraw: !1 @@ -10176,7 +10204,7 @@ class Ut extends yn { }, this.index0AttributeName = void 0, this.uniformsNeedUpdate = !1, this.glslVersion = null, e !== void 0 && this.setValues(e); } copy(e) { - return super.copy(e), this.fragmentShader = e.fragmentShader, this.vertexShader = e.vertexShader, this.uniforms = Sr(e.uniforms), this.uniformsGroups = Sx(e.uniformsGroups), this.defines = Object.assign({}, e.defines), this.wireframe = e.wireframe, this.wireframeLinewidth = e.wireframeLinewidth, this.fog = e.fog, this.lights = e.lights, this.clipping = e.clipping, this.extensions = Object.assign({}, e.extensions), this.glslVersion = e.glslVersion, this; + return super.copy(e), this.fragmentShader = e.fragmentShader, this.vertexShader = e.vertexShader, this.uniforms = Sr(e.uniforms), this.uniformsGroups = wx(e.uniformsGroups), this.defines = Object.assign({}, e.defines), this.wireframe = e.wireframe, this.wireframeLinewidth = e.wireframeLinewidth, this.fog = e.fog, this.lights = e.lights, this.clipping = e.clipping, this.extensions = Object.assign({}, e.extensions), this.glslVersion = e.glslVersion, this; } toJSON(e) { const t = super.toJSON(e); @@ -10215,7 +10243,7 @@ class Ut extends yn { return Object.keys(n).length > 0 && (t.extensions = n), t; } } -class Tm extends St { +class Em extends St { /** * Constructs a new camera. */ @@ -10256,8 +10284,8 @@ class Tm extends St { return new this.constructor().copy(this); } } -const zi = /* @__PURE__ */ new P(), kd = /* @__PURE__ */ new ce(), Ud = /* @__PURE__ */ new ce(); -class nn extends Tm { +const zi = /* @__PURE__ */ new P(), Nd = /* @__PURE__ */ new ce(), kd = /* @__PURE__ */ new ce(); +class nn extends Em { /** * Constructs a new perspective camera. * @@ -10341,7 +10369,7 @@ class nn extends Tm { * @returns {Vector2} The view size. */ getViewSize(e, t) { - return this.getViewBounds(e, kd, Ud), t.subVectors(Ud, kd); + return this.getViewBounds(e, Nd, kd), t.subVectors(kd, Nd); } /** * Sets an offset in a larger frustum. This is useful for multi-window or @@ -10424,7 +10452,7 @@ class nn extends Tm { } } const Xs = -90, js = 1; -class Ax extends St { +class Tx extends St { /** * Constructs a new cube camera. * @@ -10479,7 +10507,7 @@ class Ax extends St { n.texture.generateMipmaps = !1, e.setRenderTarget(n, 0, i), e.render(t, r), e.setRenderTarget(n, 1, i), e.render(t, o), e.setRenderTarget(n, 2, i), e.render(t, a), e.setRenderTarget(n, 3, i), e.render(t, l), e.setRenderTarget(n, 4, i), e.render(t, c), n.texture.generateMipmaps = g, e.setRenderTarget(n, 5, i), e.render(t, h), e.setRenderTarget(u, d, f), e.xr.enabled = p, n.texture.needsPMREMUpdate = !0; } } -class Am extends Ht { +class Tm extends Ht { /** * Constructs a new cube texture. * @@ -10509,7 +10537,7 @@ class Am extends Ht { this.image = e; } } -class Cx extends bn { +class Ax extends bn { /** * Constructs a new cube render target. * @@ -10519,7 +10547,7 @@ class Cx extends bn { constructor(e = 1, t = {}) { super(e, e, t), this.isWebGLCubeRenderTarget = !0; const n = { width: e, height: e, depth: 1 }, i = [n, n, n, n, n, n]; - this.texture = new Am(i), this._setTextureOptions(t), this.texture.isRenderTargetTexture = !0; + this.texture = new Tm(i), this._setTextureOptions(t), this.texture.isRenderTargetTexture = !0; } /** * Converts the given equirectangular texture to a cube map. @@ -10587,7 +10615,7 @@ class Cx extends bn { }); r.uniforms.tEquirect.value = t; const o = new dt(i, r), a = t.minFilter; - return t.minFilter === Ai && (t.minFilter = Yt), new Ax(1, 10, this).update(e, o), t.minFilter = a, o.geometry.dispose(), o.material.dispose(), this; + return t.minFilter === Ai && (t.minFilter = Yt), new Tx(1, 10, this).update(e, o), t.minFilter = a, o.geometry.dispose(), o.material.dispose(), this; } /** * Clears this cube render target. @@ -10609,7 +10637,7 @@ class vn extends St { super(), this.isGroup = !0, this.type = "Group"; } } -const Px = { type: "move" }; +const Cx = { type: "move" }; class ac { /** * Constructs a new XR controller. @@ -10707,7 +10735,7 @@ class ac { })); } else l !== null && e.gripSpace && (r = t.getPose(e.gripSpace, n), r !== null && (l.matrix.fromArray(r.transform.matrix), l.matrix.decompose(l.position, l.rotation, l.scale), l.matrixWorldNeedsUpdate = !0, r.linearVelocity ? (l.hasLinearVelocity = !0, l.linearVelocity.copy(r.linearVelocity)) : l.hasLinearVelocity = !1, r.angularVelocity ? (l.hasAngularVelocity = !0, l.angularVelocity.copy(r.angularVelocity)) : l.hasAngularVelocity = !1)); - a !== null && (i = t.getPose(e.targetRaySpace, n), i === null && r !== null && (i = r), i !== null && (a.matrix.fromArray(i.transform.matrix), a.matrix.decompose(a.position, a.rotation, a.scale), a.matrixWorldNeedsUpdate = !0, i.linearVelocity ? (a.hasLinearVelocity = !0, a.linearVelocity.copy(i.linearVelocity)) : a.hasLinearVelocity = !1, i.angularVelocity ? (a.hasAngularVelocity = !0, a.angularVelocity.copy(i.angularVelocity)) : a.hasAngularVelocity = !1, this.dispatchEvent(Px))); + a !== null && (i = t.getPose(e.targetRaySpace, n), i === null && r !== null && (i = r), i !== null && (a.matrix.fromArray(i.transform.matrix), a.matrix.decompose(a.position, a.rotation, a.scale), a.matrixWorldNeedsUpdate = !0, i.linearVelocity ? (a.hasLinearVelocity = !0, a.linearVelocity.copy(i.linearVelocity)) : a.hasLinearVelocity = !1, i.angularVelocity ? (a.hasAngularVelocity = !0, a.angularVelocity.copy(i.angularVelocity)) : a.hasAngularVelocity = !1, this.dispatchEvent(Cx))); } return a !== null && (a.visible = i !== null), l !== null && (l.visible = r !== null), c !== null && (c.visible = o !== null), this; } @@ -10727,7 +10755,7 @@ class ac { return e.joints[t.jointName]; } } -class Cm extends St { +class Am extends St { /** * Constructs a new scene. */ @@ -10742,7 +10770,7 @@ class Cm extends St { return this.fog !== null && (t.object.fog = this.fog.toJSON()), this.backgroundBlurriness > 0 && (t.object.backgroundBlurriness = this.backgroundBlurriness), this.backgroundIntensity !== 1 && (t.object.backgroundIntensity = this.backgroundIntensity), t.object.backgroundRotation = this.backgroundRotation.toArray(), this.environmentIntensity !== 1 && (t.object.environmentIntensity = this.environmentIntensity), t.object.environmentRotation = this.environmentRotation.toArray(), t; } } -class Bu { +class Iu { /** * Constructs a new interleaved buffer. * @@ -10750,7 +10778,7 @@ class Bu { * @param {number} stride - The number of typed-array elements per vertex. */ constructor(e, t) { - this.isInterleavedBuffer = !0, this.array = e, this.stride = t, this.count = e !== void 0 ? e.length / t : 0, this.usage = Zh, this.updateRanges = [], this.version = 0, this.uuid = On(); + this.isInterleavedBuffer = !0, this.array = e, this.stride = t, this.count = e !== void 0 ? e.length / t : 0, this.usage = qh, this.updateRanges = [], this.version = 0, this.uuid = On(); } /** * A callback function that is executed after the renderer has transferred the attribute array @@ -11134,7 +11162,7 @@ class Er { }; } } -class Rx extends yn { +class Px extends yn { /** * Constructs a new sprite material. * @@ -11152,14 +11180,14 @@ class Rx extends yn { } } let qs; -const Wr = /* @__PURE__ */ new P(), Zs = /* @__PURE__ */ new P(), Ys = /* @__PURE__ */ new P(), Ks = /* @__PURE__ */ new ce(), Xr = /* @__PURE__ */ new ce(), Pm = /* @__PURE__ */ new ze(), oa = /* @__PURE__ */ new P(), jr = /* @__PURE__ */ new P(), aa = /* @__PURE__ */ new P(), Od = /* @__PURE__ */ new ce(), lc = /* @__PURE__ */ new ce(), Fd = /* @__PURE__ */ new ce(); -class Lx extends St { +const Wr = /* @__PURE__ */ new P(), Zs = /* @__PURE__ */ new P(), Ys = /* @__PURE__ */ new P(), Ks = /* @__PURE__ */ new ce(), Xr = /* @__PURE__ */ new ce(), Cm = /* @__PURE__ */ new ze(), oa = /* @__PURE__ */ new P(), jr = /* @__PURE__ */ new P(), aa = /* @__PURE__ */ new P(), Ud = /* @__PURE__ */ new ce(), lc = /* @__PURE__ */ new ce(), Od = /* @__PURE__ */ new ce(); +class Rx extends St { /** * Constructs a new sprite. * * @param {(SpriteMaterial|SpriteNodeMaterial)} [material] - The sprite material. */ - constructor(e = new Rx()) { + constructor(e = new Px()) { if (super(), this.isSprite = !0, this.type = "Sprite", qs === void 0) { qs = new ut(); const t = new Float32Array([ @@ -11183,7 +11211,7 @@ class Lx extends St { 0, 0, 1 - ]), n = new Bu(t, 5); + ]), n = new Iu(t, 5); qs.setIndex([0, 1, 2, 0, 2, 3]), qs.setAttribute("position", new Er(n, 3, 0, !1)), qs.setAttribute("uv", new Er(n, 2, 3, !1)); } this.geometry = qs, this.material = e, this.center = new ce(0.5, 0.5), this.count = 1; @@ -11195,12 +11223,12 @@ class Lx extends St { * @param {Array} intersects - The target array that holds the intersection points. */ raycast(e, t) { - e.camera === null && et('Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'), Zs.setFromMatrixScale(this.matrixWorld), Pm.copy(e.camera.matrixWorld), this.modelViewMatrix.multiplyMatrices(e.camera.matrixWorldInverse, this.matrixWorld), Ys.setFromMatrixPosition(this.modelViewMatrix), e.camera.isPerspectiveCamera && this.material.sizeAttenuation === !1 && Zs.multiplyScalar(-Ys.z); + e.camera === null && et('Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'), Zs.setFromMatrixScale(this.matrixWorld), Cm.copy(e.camera.matrixWorld), this.modelViewMatrix.multiplyMatrices(e.camera.matrixWorldInverse, this.matrixWorld), Ys.setFromMatrixPosition(this.modelViewMatrix), e.camera.isPerspectiveCamera && this.material.sizeAttenuation === !1 && Zs.multiplyScalar(-Ys.z); const n = this.material.rotation; let i, r; n !== 0 && (r = Math.cos(n), i = Math.sin(n)); const o = this.center; - la(oa.set(-0.5, -0.5, 0), Ys, o, Zs, i, r), la(jr.set(0.5, -0.5, 0), Ys, o, Zs, i, r), la(aa.set(0.5, 0.5, 0), Ys, o, Zs, i, r), Od.set(0, 0), lc.set(1, 0), Fd.set(1, 1); + la(oa.set(-0.5, -0.5, 0), Ys, o, Zs, i, r), la(jr.set(0.5, -0.5, 0), Ys, o, Zs, i, r), la(aa.set(0.5, 0.5, 0), Ys, o, Zs, i, r), Ud.set(0, 0), lc.set(1, 0), Od.set(1, 1); let a = e.ray.intersectTriangle(oa, jr, aa, !1, Wr); if (a === null && (la(jr.set(-0.5, 0.5, 0), Ys, o, Zs, i, r), lc.set(0, 1), a = e.ray.intersectTriangle(oa, aa, jr, !1, Wr), a === null)) return; @@ -11208,7 +11236,7 @@ class Lx extends St { l < e.near || l > e.far || t.push({ distance: l, point: Wr.clone(), - uv: yt.getInterpolation(Wr, oa, jr, aa, Od, lc, Fd, new ce()), + uv: bt.getInterpolation(Wr, oa, jr, aa, Ud, lc, Od, new ce()), face: null, object: this }); @@ -11218,10 +11246,10 @@ class Lx extends St { } } function la(s, e, t, n, i, r) { - Ks.subVectors(s, t).addScalar(0.5).multiply(n), i !== void 0 ? (Xr.x = r * Ks.x - i * Ks.y, Xr.y = i * Ks.x + r * Ks.y) : Xr.copy(Ks), s.copy(e), s.x += Xr.x, s.y += Xr.y, s.applyMatrix4(Pm); + Ks.subVectors(s, t).addScalar(0.5).multiply(n), i !== void 0 ? (Xr.x = r * Ks.x - i * Ks.y, Xr.y = i * Ks.x + r * Ks.y) : Xr.copy(Ks), s.copy(e), s.x += Xr.x, s.y += Xr.y, s.applyMatrix4(Cm); } -const zd = /* @__PURE__ */ new P(), Hd = /* @__PURE__ */ new tt(), Vd = /* @__PURE__ */ new tt(), Dx = /* @__PURE__ */ new P(), Gd = /* @__PURE__ */ new ze(), ca = /* @__PURE__ */ new P(), cc = /* @__PURE__ */ new di(), Wd = /* @__PURE__ */ new ze(), hc = /* @__PURE__ */ new Qi(); -class Ix extends dt { +const Fd = /* @__PURE__ */ new P(), zd = /* @__PURE__ */ new tt(), Hd = /* @__PURE__ */ new tt(), Lx = /* @__PURE__ */ new P(), Vd = /* @__PURE__ */ new ze(), ca = /* @__PURE__ */ new P(), cc = /* @__PURE__ */ new di(), Gd = /* @__PURE__ */ new ze(), hc = /* @__PURE__ */ new Qi(); +class Dx extends dt { /** * Constructs a new skinned mesh. * @@ -11229,7 +11257,7 @@ class Ix extends dt { * @param {Material|Array} [material] - The mesh material. */ constructor(e, t) { - super(e, t), this.isSkinnedMesh = !0, this.type = "SkinnedMesh", this.bindMode = pd, this.bindMatrix = new ze(), this.bindMatrixInverse = new ze(), this.boundingBox = null, this.boundingSphere = null; + super(e, t), this.isSkinnedMesh = !0, this.type = "SkinnedMesh", this.bindMode = fd, this.bindMatrix = new ze(), this.bindMatrixInverse = new ze(), this.boundingBox = null, this.boundingSphere = null; } /** * Computes the bounding box of the skinned mesh, and updates {@link SkinnedMesh#boundingBox}. @@ -11262,7 +11290,7 @@ class Ix extends dt { } raycast(e, t) { const n = this.material, i = this.matrixWorld; - n !== void 0 && (this.boundingSphere === null && this.computeBoundingSphere(), cc.copy(this.boundingSphere), cc.applyMatrix4(i), e.ray.intersectsSphere(cc) !== !1 && (Wd.copy(i).invert(), hc.copy(e.ray).applyMatrix4(Wd), !(this.boundingBox !== null && hc.intersectsBox(this.boundingBox) === !1) && this._computeIntersections(e, t, hc))); + n !== void 0 && (this.boundingSphere === null && this.computeBoundingSphere(), cc.copy(this.boundingSphere), cc.applyMatrix4(i), e.ray.intersectsSphere(cc) !== !1 && (Gd.copy(i).invert(), hc.copy(e.ray).applyMatrix4(Gd), !(this.boundingBox !== null && hc.intersectsBox(this.boundingBox) === !1) && this._computeIntersections(e, t, hc))); } getVertexPosition(e, t) { return super.getVertexPosition(e, t), this.applyBoneTransform(e, t), t; @@ -11296,7 +11324,7 @@ class Ix extends dt { } } updateMatrixWorld(e) { - super.updateMatrixWorld(e), this.bindMode === pd ? this.bindMatrixInverse.copy(this.matrixWorld).invert() : this.bindMode === Rg ? this.bindMatrixInverse.copy(this.bindMatrix).invert() : He("SkinnedMesh: Unrecognized bindMode: " + this.bindMode); + super.updateMatrixWorld(e), this.bindMode === fd ? this.bindMatrixInverse.copy(this.matrixWorld).invert() : this.bindMode === Pg ? this.bindMatrixInverse.copy(this.bindMatrix).invert() : He("SkinnedMesh: Unrecognized bindMode: " + this.bindMode); } /** * Applies the bone transform associated with the given index to the given @@ -11309,18 +11337,18 @@ class Ix extends dt { */ applyBoneTransform(e, t) { const n = this.skeleton, i = this.geometry; - Hd.fromBufferAttribute(i.attributes.skinIndex, e), Vd.fromBufferAttribute(i.attributes.skinWeight, e), zd.copy(t).applyMatrix4(this.bindMatrix), t.set(0, 0, 0); + zd.fromBufferAttribute(i.attributes.skinIndex, e), Hd.fromBufferAttribute(i.attributes.skinWeight, e), Fd.copy(t).applyMatrix4(this.bindMatrix), t.set(0, 0, 0); for (let r = 0; r < 4; r++) { - const o = Vd.getComponent(r); + const o = Hd.getComponent(r); if (o !== 0) { - const a = Hd.getComponent(r); - Gd.multiplyMatrices(n.bones[a].matrixWorld, n.boneInverses[a]), t.addScaledVector(Dx.copy(zd).applyMatrix4(Gd), o); + const a = zd.getComponent(r); + Vd.multiplyMatrices(n.bones[a].matrixWorld, n.boneInverses[a]), t.addScaledVector(Lx.copy(Fd).applyMatrix4(Vd), o); } } return t.applyMatrix4(this.bindMatrixInverse); } } -class Rm extends St { +class Pm extends St { /** * Constructs a new bone. */ @@ -11349,8 +11377,8 @@ class Bo extends Ht { super(null, o, a, l, c, h, i, r, u, d), this.isDataTexture = !0, this.image = { data: e, width: t, height: n }, this.generateMipmaps = !1, this.flipY = !1, this.unpackAlignment = 1; } } -const Xd = /* @__PURE__ */ new ze(), Bx = /* @__PURE__ */ new ze(); -class Nu { +const Wd = /* @__PURE__ */ new ze(), Ix = /* @__PURE__ */ new ze(); +class Bu { /** * Constructs a new skeleton. * @@ -11406,8 +11434,8 @@ class Nu { update() { const e = this.bones, t = this.boneInverses, n = this.boneMatrices, i = this.boneTexture; for (let r = 0, o = e.length; r < o; r++) { - const a = e[r] ? e[r].matrixWorld : Bx; - Xd.multiplyMatrices(a, t[r]), Xd.toArray(n, r * 16); + const a = e[r] ? e[r].matrixWorld : Ix; + Wd.multiplyMatrices(a, t[r]), Wd.toArray(n, r * 16); } i !== null && (i.needsUpdate = !0); } @@ -11417,7 +11445,7 @@ class Nu { * @return {Skeleton} A clone of this instance. */ clone() { - return new Nu(this.bones, this.boneInverses); + return new Bu(this.bones, this.boneInverses); } /** * Computes a data texture for passing bone data to the vertex shader. @@ -11465,7 +11493,7 @@ class Nu { for (let n = 0, i = e.bones.length; n < i; n++) { const r = e.bones[n]; let o = t[r]; - o === void 0 && (He("Skeleton: No bone found with UUID:", r), o = new Rm()), this.bones.push(o), this.boneInverses.push(new ze().fromArray(e.boneInverses[n])); + o === void 0 && (He("Skeleton: No bone found with UUID:", r), o = new Pm()), this.bones.push(o), this.boneInverses.push(new ze().fromArray(e.boneInverses[n])); } return this.init(), this; } @@ -11496,7 +11524,7 @@ class Nu { return e; } } -class Yh extends at { +class Zh extends at { /** * Constructs a new instanced buffer attribute. * @@ -11516,7 +11544,7 @@ class Yh extends at { return e.meshPerAttribute = this.meshPerAttribute, e.isInstancedBufferAttribute = !0, e; } } -const $s = /* @__PURE__ */ new ze(), jd = /* @__PURE__ */ new ze(), ha = [], qd = /* @__PURE__ */ new vt(), Nx = /* @__PURE__ */ new ze(), qr = /* @__PURE__ */ new dt(), Zr = /* @__PURE__ */ new di(); +const $s = /* @__PURE__ */ new ze(), Xd = /* @__PURE__ */ new ze(), ha = [], jd = /* @__PURE__ */ new vt(), Bx = /* @__PURE__ */ new ze(), qr = /* @__PURE__ */ new dt(), Zr = /* @__PURE__ */ new di(); class No extends dt { /** * Constructs a new instanced mesh. @@ -11526,9 +11554,9 @@ class No extends dt { * @param {number} count - The number of instances. */ constructor(e, t, n) { - super(e, t), this.isInstancedMesh = !0, this.instanceMatrix = new Yh(new Float32Array(n * 16), 16), this.instanceColor = null, this.morphTexture = null, this.count = n, this.boundingBox = null, this.boundingSphere = null; + super(e, t), this.isInstancedMesh = !0, this.instanceMatrix = new Zh(new Float32Array(n * 16), 16), this.instanceColor = null, this.morphTexture = null, this.count = n, this.boundingBox = null, this.boundingSphere = null; for (let i = 0; i < n; i++) - this.setMatrixAt(i, Nx); + this.setMatrixAt(i, Bx); } /** * Computes the bounding box of the instanced mesh, and updates {@link InstancedMesh#boundingBox}. @@ -11539,7 +11567,7 @@ class No extends dt { const e = this.geometry, t = this.count; this.boundingBox === null && (this.boundingBox = new vt()), e.boundingBox === null && e.computeBoundingBox(), this.boundingBox.makeEmpty(); for (let n = 0; n < t; n++) - this.getMatrixAt(n, $s), qd.copy(e.boundingBox).applyMatrix4($s), this.boundingBox.union(qd); + this.getMatrixAt(n, $s), jd.copy(e.boundingBox).applyMatrix4($s), this.boundingBox.union(jd); } /** * Computes the bounding sphere of the instanced mesh, and updates {@link InstancedMesh#boundingSphere} @@ -11588,7 +11616,7 @@ class No extends dt { const n = this.matrixWorld, i = this.count; if (qr.geometry = this.geometry, qr.material = this.material, qr.material !== void 0 && (this.boundingSphere === null && this.computeBoundingSphere(), Zr.copy(this.boundingSphere), Zr.applyMatrix4(n), e.ray.intersectsSphere(Zr) !== !1)) for (let r = 0; r < i; r++) { - this.getMatrixAt(r, $s), jd.multiplyMatrices(n, $s), qr.matrixWorld = jd, qr.raycast(e, ha); + this.getMatrixAt(r, $s), Xd.multiplyMatrices(n, $s), qr.matrixWorld = Xd, qr.raycast(e, ha); for (let o = 0, a = ha.length; o < a; o++) { const l = ha[o]; l.instanceId = r, l.object = this, t.push(l); @@ -11604,7 +11632,7 @@ class No extends dt { * @param {Color} color - The instance color. */ setColorAt(e, t) { - this.instanceColor === null && (this.instanceColor = new Yh(new Float32Array(this.instanceMatrix.count * 3).fill(1), 3)), t.toArray(this.instanceColor.array, e * 3); + this.instanceColor === null && (this.instanceColor = new Zh(new Float32Array(this.instanceMatrix.count * 3).fill(1), 3)), t.toArray(this.instanceColor.array, e * 3); } /** * Sets the given local transformation matrix to the defined instance. Make sure you set the `needsUpdate` flag of @@ -11626,7 +11654,7 @@ class No extends dt { */ setMorphAt(e, t) { const n = t.morphTargetInfluences, i = n.length + 1; - this.morphTexture === null && (this.morphTexture = new Bo(new Float32Array(i * this.count), i, this.count, Tu, $n)); + this.morphTexture === null && (this.morphTexture = new Bo(new Float32Array(i * this.count), i, this.count, Eu, $n)); const r = this.morphTexture.source.data.data; let o = 0; for (let c = 0; c < n.length; c++) @@ -11644,8 +11672,8 @@ class No extends dt { this.dispatchEvent({ type: "dispose" }), this.morphTexture !== null && (this.morphTexture.dispose(), this.morphTexture = null); } } -const uc = /* @__PURE__ */ new P(), kx = /* @__PURE__ */ new P(), Ux = /* @__PURE__ */ new $e(); -class Mt { +const uc = /* @__PURE__ */ new P(), Nx = /* @__PURE__ */ new P(), kx = /* @__PURE__ */ new $e(); +class _t { /** * Constructs a new plane. * @@ -11700,7 +11728,7 @@ class Mt { * @return {Plane} A reference to this plane. */ setFromCoplanarPoints(e, t, n) { - const i = uc.subVectors(n, t).cross(kx.subVectors(e, t)).normalize(); + const i = uc.subVectors(n, t).cross(Nx.subVectors(e, t)).normalize(); return this.setFromNormalAndCoplanarPoint(i, e), this; } /** @@ -11824,7 +11852,7 @@ class Mt { * @return {Plane} A reference to this plane. */ applyMatrix4(e, t) { - const n = t || Ux.getNormalMatrix(e), i = this.coplanarPoint(uc).applyMatrix4(e), r = this.normal.applyMatrix3(n).normalize(); + const n = t || kx.getNormalMatrix(e), i = this.coplanarPoint(uc).applyMatrix4(e), r = this.normal.applyMatrix3(n).normalize(); return this.constant = -i.dot(r), this; } /** @@ -11855,8 +11883,8 @@ class Mt { return new this.constructor().copy(this); } } -const os = /* @__PURE__ */ new di(), Ox = /* @__PURE__ */ new ce(0.5, 0.5), ua = /* @__PURE__ */ new P(); -class ku { +const os = /* @__PURE__ */ new di(), Ux = /* @__PURE__ */ new ce(0.5, 0.5), ua = /* @__PURE__ */ new P(); +class Nu { /** * Constructs a new frustum. * @@ -11867,7 +11895,7 @@ class ku { * @param {Plane} [p4] - The fifth plane that encloses the frustum. * @param {Plane} [p5] - The sixth plane that encloses the frustum. */ - constructor(e = new Mt(), t = new Mt(), n = new Mt(), i = new Mt(), r = new Mt(), o = new Mt()) { + constructor(e = new _t(), t = new _t(), n = new _t(), i = new _t(), r = new _t(), o = new _t()) { this.planes = [e, t, n, i, r, o]; } /** @@ -11942,7 +11970,7 @@ class ku { */ intersectsSprite(e) { os.center.set(0, 0, 0); - const t = Ox.distanceTo(e.center); + const t = Ux.distanceTo(e.center); return os.radius = 0.7071067811865476 + t, os.applyMatrix4(e.matrixWorld), this.intersectsSphere(os); } /** @@ -12012,7 +12040,7 @@ class Cs extends yn { return super.copy(e), this.color.copy(e.color), this.map = e.map, this.linewidth = e.linewidth, this.linecap = e.linecap, this.linejoin = e.linejoin, this.fog = e.fog, this; } } -const vl = /* @__PURE__ */ new P(), bl = /* @__PURE__ */ new P(), Zd = /* @__PURE__ */ new ze(), Yr = /* @__PURE__ */ new Qi(), da = /* @__PURE__ */ new di(), dc = /* @__PURE__ */ new P(), Yd = /* @__PURE__ */ new P(); +const vl = /* @__PURE__ */ new P(), bl = /* @__PURE__ */ new P(), qd = /* @__PURE__ */ new ze(), Yr = /* @__PURE__ */ new Qi(), da = /* @__PURE__ */ new di(), dc = /* @__PURE__ */ new P(), Zd = /* @__PURE__ */ new P(); class es extends St { /** * Constructs a new line. @@ -12053,7 +12081,7 @@ class es extends St { raycast(e, t) { const n = this.geometry, i = this.matrixWorld, r = e.params.Line.threshold, o = n.drawRange; if (n.boundingSphere === null && n.computeBoundingSphere(), da.copy(n.boundingSphere), da.applyMatrix4(i), da.radius += r, e.ray.intersectsSphere(da) === !1) return; - Zd.copy(i).invert(), Yr.copy(e.ray).applyMatrix4(Zd); + qd.copy(i).invert(), Yr.copy(e.ray).applyMatrix4(qd); const a = r / ((this.scale.x + this.scale.y + this.scale.z) / 3), l = a * a, c = this.isLineSegments ? 2 : 1, h = n.index, d = n.attributes.position; if (h !== null) { const f = Math.max(0, o.start), p = Math.min(h.count, o.start + o.count); @@ -12097,7 +12125,7 @@ class es extends St { } function fa(s, e, t, n, i, r, o) { const a = s.geometry.attributes.position; - if (vl.fromBufferAttribute(a, i), bl.fromBufferAttribute(a, r), t.distanceSqToSegment(vl, bl, dc, Yd) > n) return; + if (vl.fromBufferAttribute(a, i), bl.fromBufferAttribute(a, r), t.distanceSqToSegment(vl, bl, dc, Zd) > n) return; dc.applyMatrix4(s.matrixWorld); const c = e.ray.origin.distanceTo(dc); if (!(c < e.near || c > e.far)) @@ -12105,7 +12133,7 @@ function fa(s, e, t, n, i, r, o) { distance: c, // What do we want? intersection point on the ray or on the segment?? // point: raycaster.ray.at( distance ), - point: Yd.clone().applyMatrix4(s.matrixWorld), + point: Zd.clone().applyMatrix4(s.matrixWorld), index: o, face: null, faceIndex: null, @@ -12113,8 +12141,8 @@ function fa(s, e, t, n, i, r, o) { object: s }; } -const Kd = /* @__PURE__ */ new P(), $d = /* @__PURE__ */ new P(); -class Lm extends es { +const Yd = /* @__PURE__ */ new P(), Kd = /* @__PURE__ */ new P(); +class Rm extends es { /** * Constructs a new line segments. * @@ -12129,14 +12157,14 @@ class Lm extends es { if (e.index === null) { const t = e.attributes.position, n = []; for (let i = 0, r = t.count; i < r; i += 2) - Kd.fromBufferAttribute(t, i), $d.fromBufferAttribute(t, i + 1), n[i] = i === 0 ? 0 : n[i - 1], n[i + 1] = n[i] + Kd.distanceTo($d); + Yd.fromBufferAttribute(t, i), Kd.fromBufferAttribute(t, i + 1), n[i] = i === 0 ? 0 : n[i - 1], n[i + 1] = n[i] + Yd.distanceTo(Kd); e.setAttribute("lineDistance", new rn(n, 1)); } else He("LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry."); return this; } } -class Fx extends es { +class Ox extends es { /** * Constructs a new line loop. * @@ -12147,7 +12175,7 @@ class Fx extends es { super(e, t), this.isLineLoop = !0, this.type = "LineLoop"; } } -class Dm extends yn { +class Lm extends yn { /** * Constructs a new points material. * @@ -12164,15 +12192,15 @@ class Dm extends yn { return super.copy(e), this.color.copy(e.color), this.map = e.map, this.alphaMap = e.alphaMap, this.size = e.size, this.sizeAttenuation = e.sizeAttenuation, this.fog = e.fog, this; } } -const Jd = /* @__PURE__ */ new ze(), Kh = /* @__PURE__ */ new Qi(), pa = /* @__PURE__ */ new di(), ma = /* @__PURE__ */ new P(); -class Im extends St { +const $d = /* @__PURE__ */ new ze(), Yh = /* @__PURE__ */ new Qi(), pa = /* @__PURE__ */ new di(), ma = /* @__PURE__ */ new P(); +class Dm extends St { /** * Constructs a new point cloud. * * @param {BufferGeometry} [geometry] - The points geometry. * @param {Material|Array} [material] - The points material. */ - constructor(e = new ut(), t = new Dm()) { + constructor(e = new ut(), t = new Lm()) { super(), this.isPoints = !0, this.type = "Points", this.geometry = e, this.material = t, this.morphTargetDictionary = void 0, this.morphTargetInfluences = void 0, this.updateMorphTargets(); } copy(e, t) { @@ -12187,18 +12215,18 @@ class Im extends St { raycast(e, t) { const n = this.geometry, i = this.matrixWorld, r = e.params.Points.threshold, o = n.drawRange; if (n.boundingSphere === null && n.computeBoundingSphere(), pa.copy(n.boundingSphere), pa.applyMatrix4(i), pa.radius += r, e.ray.intersectsSphere(pa) === !1) return; - Jd.copy(i).invert(), Kh.copy(e.ray).applyMatrix4(Jd); + $d.copy(i).invert(), Yh.copy(e.ray).applyMatrix4($d); const a = r / ((this.scale.x + this.scale.y + this.scale.z) / 3), l = a * a, c = n.index, u = n.attributes.position; if (c !== null) { const d = Math.max(0, o.start), f = Math.min(c.count, o.start + o.count); for (let p = d, g = f; p < g; p++) { const x = c.getX(p); - ma.fromBufferAttribute(u, x), Qd(ma, x, l, i, e, t, this); + ma.fromBufferAttribute(u, x), Jd(ma, x, l, i, e, t, this); } } else { const d = Math.max(0, o.start), f = Math.min(u.count, o.start + o.count); for (let p = d, g = f; p < g; p++) - ma.fromBufferAttribute(u, p), Qd(ma, p, l, i, e, t, this); + ma.fromBufferAttribute(u, p), Jd(ma, p, l, i, e, t, this); } } /** @@ -12219,11 +12247,11 @@ class Im extends St { } } } -function Qd(s, e, t, n, i, r, o) { - const a = Kh.distanceSqToPoint(s); +function Jd(s, e, t, n, i, r, o) { + const a = Yh.distanceSqToPoint(s); if (a < t) { const l = new P(); - Kh.closestPointToPoint(s, l), l.applyMatrix4(n); + Yh.closestPointToPoint(s, l), l.applyMatrix4(n); const c = i.ray.origin.distanceTo(l); if (c < i.near || c > i.far) return; r.push({ @@ -12238,7 +12266,7 @@ function Qd(s, e, t, n, i, r, o) { }); } } -class Uu extends Ht { +class ku extends Ht { /** * Constructs a new depth texture. * @@ -12261,14 +12289,14 @@ class Uu extends Ht { super(d, i, r, o, a, l, h, n, c), this.isDepthTexture = !0, this.flipY = !1, this.generateMipmaps = !1, this.compareFunction = null; } copy(e) { - return super.copy(e), this.source = new Du(Object.assign({}, e.image)), this.compareFunction = e.compareFunction, this; + return super.copy(e), this.source = new Lu(Object.assign({}, e.image)), this.compareFunction = e.compareFunction, this; } toJSON(e) { const t = super.toJSON(e); return this.compareFunction !== null && (t.compareFunction = this.compareFunction), t; } } -class Bm extends Ht { +class Im extends Ht { /** * Creates a new raw texture. * @@ -12515,7 +12543,7 @@ class fi { return this.arcLengthDivisions = e.arcLengthDivisions, this; } } -class Ou extends fi { +class Uu extends fi { /** * Constructs a new ellipse curve. * @@ -12564,7 +12592,7 @@ class Ou extends fi { return super.fromJSON(e), this.aX = e.aX, this.aY = e.aY, this.xRadius = e.xRadius, this.yRadius = e.yRadius, this.aStartAngle = e.aStartAngle, this.aEndAngle = e.aEndAngle, this.aClockwise = e.aClockwise, this.aRotation = e.aRotation, this; } } -class zx extends Ou { +class Fx extends Uu { /** * Constructs a new arc curve. * @@ -12579,7 +12607,7 @@ class zx extends Ou { super(e, t, n, n, i, r, o), this.isArcCurve = !0, this.type = "ArcCurve"; } } -function Fu() { +function Ou() { let s = 0, e = 0, t = 0, n = 0; function i(r, o, a, l) { s = r, e = a, t = -3 * r + 3 * o - 2 * a - l, n = 2 * r - 2 * o + a + l; @@ -12598,8 +12626,8 @@ function Fu() { } }; } -const ga = /* @__PURE__ */ new P(), fc = /* @__PURE__ */ new Fu(), pc = /* @__PURE__ */ new Fu(), mc = /* @__PURE__ */ new Fu(); -class Hx extends fi { +const ga = /* @__PURE__ */ new P(), fc = /* @__PURE__ */ new Ou(), pc = /* @__PURE__ */ new Ou(), mc = /* @__PURE__ */ new Ou(); +class zx extends fi { /** * Constructs a new Catmull-Rom curve. * @@ -12662,41 +12690,41 @@ class Hx extends fi { return this.closed = e.closed, this.curveType = e.curveType, this.tension = e.tension, this; } } -function ef(s, e, t, n, i) { +function Qd(s, e, t, n, i) { const r = (n - e) * 0.5, o = (i - t) * 0.5, a = s * s, l = s * a; return (2 * t - 2 * n + r + o) * l + (-3 * t + 3 * n - 2 * r - o) * a + r * s + t; } -function Vx(s, e) { +function Hx(s, e) { const t = 1 - s; return t * t * e; } -function Gx(s, e) { +function Vx(s, e) { return 2 * (1 - s) * s * e; } -function Wx(s, e) { +function Gx(s, e) { return s * s * e; } function xo(s, e, t, n) { - return Vx(s, e) + Gx(s, t) + Wx(s, n); + return Hx(s, e) + Vx(s, t) + Gx(s, n); } -function Xx(s, e) { +function Wx(s, e) { const t = 1 - s; return t * t * t * e; } -function jx(s, e) { +function Xx(s, e) { const t = 1 - s; return 3 * t * t * s * e; } -function qx(s, e) { +function jx(s, e) { return 3 * (1 - s) * s * s * e; } -function Zx(s, e) { +function qx(s, e) { return s * s * s * e; } function vo(s, e, t, n, i) { - return Xx(s, e) + jx(s, t) + qx(s, n) + Zx(s, i); + return Wx(s, e) + Xx(s, t) + jx(s, n) + qx(s, i); } -class Nm extends fi { +class Bm extends fi { /** * Constructs a new Cubic Bezier curve. * @@ -12733,7 +12761,7 @@ class Nm extends fi { return super.fromJSON(e), this.v0.fromArray(e.v0), this.v1.fromArray(e.v1), this.v2.fromArray(e.v2), this.v3.fromArray(e.v3), this; } } -class Yx extends fi { +class Zx extends fi { /** * Constructs a new Cubic Bezier curve. * @@ -12771,7 +12799,7 @@ class Yx extends fi { return super.fromJSON(e), this.v0.fromArray(e.v0), this.v1.fromArray(e.v1), this.v2.fromArray(e.v2), this.v3.fromArray(e.v3), this; } } -class km extends fi { +class Nm extends fi { /** * Constructs a new line curve. * @@ -12813,7 +12841,7 @@ class km extends fi { return super.fromJSON(e), this.v1.fromArray(e.v1), this.v2.fromArray(e.v2), this; } } -class Kx extends fi { +class Yx extends fi { /** * Constructs a new line curve. * @@ -12855,7 +12883,7 @@ class Kx extends fi { return super.fromJSON(e), this.v1.fromArray(e.v1), this.v2.fromArray(e.v2), this; } } -class Um extends fi { +class km extends fi { /** * Constructs a new Quadratic Bezier curve. * @@ -12891,7 +12919,7 @@ class Um extends fi { return super.fromJSON(e), this.v0.fromArray(e.v0), this.v1.fromArray(e.v1), this.v2.fromArray(e.v2), this; } } -class $x extends fi { +class Kx extends fi { /** * Constructs a new Quadratic Bezier curve. * @@ -12928,7 +12956,7 @@ class $x extends fi { return super.fromJSON(e), this.v0.fromArray(e.v0), this.v1.fromArray(e.v1), this.v2.fromArray(e.v2), this; } } -class Om extends fi { +class Um extends fi { /** * Constructs a new 2D spline curve. * @@ -12947,8 +12975,8 @@ class Om extends fi { getPoint(e, t = new ce()) { const n = t, i = this.points, r = (i.length - 1) * e, o = Math.floor(r), a = r - o, l = i[o === 0 ? o : o - 1], c = i[o], h = i[o > i.length - 2 ? i.length - 1 : o + 1], u = i[o > i.length - 3 ? i.length - 1 : o + 2]; return n.set( - ef(a, l.x, c.x, h.x, u.x), - ef(a, l.y, c.y, h.y, u.y) + Qd(a, l.x, c.x, h.x, u.x), + Qd(a, l.y, c.y, h.y, u.y) ), n; } copy(e) { @@ -12977,20 +13005,20 @@ class Om extends fi { return this; } } -var $h = /* @__PURE__ */ Object.freeze({ +var Kh = /* @__PURE__ */ Object.freeze({ __proto__: null, - ArcCurve: zx, - CatmullRomCurve3: Hx, - CubicBezierCurve: Nm, - CubicBezierCurve3: Yx, - EllipseCurve: Ou, - LineCurve: km, - LineCurve3: Kx, - QuadraticBezierCurve: Um, - QuadraticBezierCurve3: $x, - SplineCurve: Om + ArcCurve: Fx, + CatmullRomCurve3: zx, + CubicBezierCurve: Bm, + CubicBezierCurve3: Zx, + EllipseCurve: Uu, + LineCurve: Nm, + LineCurve3: Yx, + QuadraticBezierCurve: km, + QuadraticBezierCurve3: Kx, + SplineCurve: Um }); -class Jx extends fi { +class $x extends fi { /** * Constructs a new curve path. */ @@ -13014,7 +13042,7 @@ class Jx extends fi { const e = this.curves[0].getPoint(0), t = this.curves[this.curves.length - 1].getPoint(1); if (!e.equals(t)) { const n = e.isVector2 === !0 ? "LineCurve" : "LineCurve3"; - this.curves.push(new $h[n](t, e)); + this.curves.push(new Kh[n](t, e)); } return this; } @@ -13098,12 +13126,12 @@ class Jx extends fi { super.fromJSON(e), this.autoClose = e.autoClose, this.curves = []; for (let t = 0, n = e.curves.length; t < n; t++) { const i = e.curves[t]; - this.curves.push(new $h[i.type]().fromJSON(i)); + this.curves.push(new Kh[i.type]().fromJSON(i)); } return this; } } -class tf extends Jx { +class ef extends $x { /** * Constructs a new path. * @@ -13144,7 +13172,7 @@ class tf extends Jx { * @return {Path} A reference to this path. */ lineTo(e, t) { - const n = new km(this.currentPoint.clone(), new ce(e, t)); + const n = new Nm(this.currentPoint.clone(), new ce(e, t)); return this.curves.push(n), this.currentPoint.set(e, t), this; } /** @@ -13158,7 +13186,7 @@ class tf extends Jx { * @return {Path} A reference to this path. */ quadraticCurveTo(e, t, n, i) { - const r = new Um( + const r = new km( this.currentPoint.clone(), new ce(e, t), new ce(n, i) @@ -13178,7 +13206,7 @@ class tf extends Jx { * @return {Path} A reference to this path. */ bezierCurveTo(e, t, n, i, r, o) { - const a = new Nm( + const a = new Bm( this.currentPoint.clone(), new ce(e, t), new ce(n, i), @@ -13194,7 +13222,7 @@ class tf extends Jx { * @return {Path} A reference to this path. */ splineThru(e) { - const t = [this.currentPoint.clone()].concat(e), n = new Om(t); + const t = [this.currentPoint.clone()].concat(e), n = new Um(t); return this.curves.push(n), this.currentPoint.copy(e[e.length - 1]), this; } /** @@ -13266,7 +13294,7 @@ class tf extends Jx { * @return {Path} A reference to this path. */ absellipse(e, t, n, i, r, o, a, l) { - const c = new Ou(e, t, n, i, r, o, a, l); + const c = new Uu(e, t, n, i, r, o, a, l); if (this.curves.length > 0) { const u = c.getPoint(0); u.equals(this.currentPoint) || this.lineTo(u.x, u.y); @@ -13286,7 +13314,7 @@ class tf extends Jx { return super.fromJSON(e), this.currentPoint.fromArray(e.currentPoint), this; } } -class Fm extends tf { +class Om extends ef { /** * Constructs a new shape. * @@ -13343,18 +13371,18 @@ class Fm extends tf { super.fromJSON(e), this.uuid = e.uuid, this.holes = []; for (let t = 0, n = e.holes.length; t < n; t++) { const i = e.holes[t]; - this.holes.push(new tf().fromJSON(i)); + this.holes.push(new ef().fromJSON(i)); } return this; } } -function Qx(s, e, t = 2) { +function Jx(s, e, t = 2) { const n = e && e.length, i = n ? e[0] * t : s.length; - let r = zm(s, 0, i, t, !0); + let r = Fm(s, 0, i, t, !0); const o = []; if (!r || r.next === r.prev) return o; let a, l, c; - if (n && (r = sv(s, e, r, t)), s.length > 80 * t) { + if (n && (r = iv(s, e, r, t)), s.length > 80 * t) { a = s[0], l = s[1]; let h = a, u = l; for (let d = t; d < i; d += t) { @@ -13365,12 +13393,12 @@ function Qx(s, e, t = 2) { } return Po(r, o, t, a, l, c, 0), o; } -function zm(s, e, t, n, i) { +function Fm(s, e, t, n, i) { let r; - if (i === mv(s, e, t, n) > 0) - for (let o = e; o < t; o += n) r = nf(o / n | 0, s[o], s[o + 1], r); + if (i === pv(s, e, t, n) > 0) + for (let o = e; o < t; o += n) r = tf(o / n | 0, s[o], s[o + 1], r); else - for (let o = t - n; o >= e; o -= n) r = nf(o / n | 0, s[o], s[o + 1], r); + for (let o = t - n; o >= e; o -= n) r = tf(o / n | 0, s[o], s[o + 1], r); return r && Tr(r, r.next) && (Lo(r), r = r.next), r; } function ws(s, e) { @@ -13388,21 +13416,21 @@ function ws(s, e) { } function Po(s, e, t, n, i, r, o) { if (!s) return; - !o && r && cv(s, n, i, r); + !o && r && lv(s, n, i, r); let a = s; for (; s.prev !== s.next; ) { const l = s.prev, c = s.next; - if (r ? tv(s, n, i, r) : ev(s)) { + if (r ? ev(s, n, i, r) : Qx(s)) { e.push(l.i, s.i, c.i), Lo(s), s = c.next, a = c.next; continue; } if (s = c, s === a) { - o ? o === 1 ? (s = nv(ws(s), e), Po(s, e, t, n, i, r, 2)) : o === 2 && iv(s, e, t, n, i, r) : Po(ws(s), e, t, n, i, r, 1); + o ? o === 1 ? (s = tv(ws(s), e), Po(s, e, t, n, i, r, 2)) : o === 2 && nv(s, e, t, n, i, r) : Po(ws(s), e, t, n, i, r, 1); break; } } } -function ev(s) { +function Qx(s) { const e = s.prev, t = s, n = s.next; if (Ct(e, t, n) >= 0) return !1; const i = e.x, r = t.x, o = n.x, a = e.y, l = t.y, c = n.y, h = Math.min(i, r, o), u = Math.min(a, l, c), d = Math.max(i, r, o), f = Math.max(a, l, c); @@ -13413,10 +13441,10 @@ function ev(s) { } return !0; } -function tv(s, e, t, n) { +function ev(s, e, t, n) { const i = s.prev, r = s, o = s.next; if (Ct(i, r, o) >= 0) return !1; - const a = i.x, l = r.x, c = o.x, h = i.y, u = r.y, d = o.y, f = Math.min(a, l, c), p = Math.min(h, u, d), g = Math.max(a, l, c), x = Math.max(h, u, d), m = Jh(f, p, e, t, n), b = Jh(g, x, e, t, n); + const a = i.x, l = r.x, c = o.x, h = i.y, u = r.y, d = o.y, f = Math.min(a, l, c), p = Math.min(h, u, d), g = Math.max(a, l, c), x = Math.max(h, u, d), m = $h(f, p, e, t, n), b = $h(g, x, e, t, n); let v = s.prevZ, y = s.nextZ; for (; v && v.z >= m && y && y.z <= b; ) { if (v.x >= f && v.x <= g && v.y >= p && v.y <= x && v !== i && v !== o && ho(a, h, l, u, c, d, v.x, v.y) && Ct(v.prev, v, v.next) >= 0 || (v = v.prevZ, y.x >= f && y.x <= g && y.y >= p && y.y <= x && y !== i && y !== o && ho(a, h, l, u, c, d, y.x, y.y) && Ct(y.prev, y, y.next) >= 0)) return !1; @@ -13432,21 +13460,21 @@ function tv(s, e, t, n) { } return !0; } -function nv(s, e) { +function tv(s, e) { let t = s; do { const n = t.prev, i = t.next.next; - !Tr(n, i) && Vm(n, t, t.next, i) && Ro(n, i) && Ro(i, n) && (e.push(n.i, t.i, i.i), Lo(t), Lo(t.next), t = s = i), t = t.next; + !Tr(n, i) && Hm(n, t, t.next, i) && Ro(n, i) && Ro(i, n) && (e.push(n.i, t.i, i.i), Lo(t), Lo(t.next), t = s = i), t = t.next; } while (t !== s); return ws(t); } -function iv(s, e, t, n, i, r) { +function nv(s, e, t, n, i, r) { let o = s; do { let a = o.next.next; for (; a !== o.prev; ) { - if (o.i !== a.i && dv(o, a)) { - let l = Gm(o, a); + if (o.i !== a.i && uv(o, a)) { + let l = Vm(o, a); o = ws(o, o.next), l = ws(l, l.next), Po(o, e, t, n, i, r, 0), Po(l, e, t, n, i, r, 0); return; } @@ -13455,18 +13483,18 @@ function iv(s, e, t, n, i, r) { o = o.next; } while (o !== s); } -function sv(s, e, t, n) { +function iv(s, e, t, n) { const i = []; for (let r = 0, o = e.length; r < o; r++) { - const a = e[r] * n, l = r < o - 1 ? e[r + 1] * n : s.length, c = zm(s, a, l, n, !1); - c === c.next && (c.steiner = !0), i.push(uv(c)); + const a = e[r] * n, l = r < o - 1 ? e[r + 1] * n : s.length, c = Fm(s, a, l, n, !1); + c === c.next && (c.steiner = !0), i.push(hv(c)); } - i.sort(rv); + i.sort(sv); for (let r = 0; r < i.length; r++) - t = ov(i[r], t); + t = rv(i[r], t); return t; } -function rv(s, e) { +function sv(s, e) { let t = s.x - e.x; if (t === 0 && (t = s.y - e.y, t === 0)) { const n = (s.next.y - s.y) / (s.next.x - s.x), i = (e.next.y - e.y) / (e.next.x - e.x); @@ -13474,14 +13502,14 @@ function rv(s, e) { } return t; } -function ov(s, e) { - const t = av(s, e); +function rv(s, e) { + const t = ov(s, e); if (!t) return e; - const n = Gm(t, s); + const n = Vm(t, s); return ws(n, n.next), ws(t, t.next); } -function av(s, e) { +function ov(s, e) { let t = e; const n = s.x, i = s.y; let r = -1 / 0, o; @@ -13500,25 +13528,25 @@ function av(s, e) { let h = 1 / 0; t = o; do { - if (n >= t.x && t.x >= l && n !== t.x && Hm(i < c ? n : r, i, l, c, i < c ? r : n, i, t.x, t.y)) { + if (n >= t.x && t.x >= l && n !== t.x && zm(i < c ? n : r, i, l, c, i < c ? r : n, i, t.x, t.y)) { const u = Math.abs(i - t.y) / (n - t.x); - Ro(t, s) && (u < h || u === h && (t.x > o.x || t.x === o.x && lv(o, t))) && (o = t, h = u); + Ro(t, s) && (u < h || u === h && (t.x > o.x || t.x === o.x && av(o, t))) && (o = t, h = u); } t = t.next; } while (t !== a); return o; } -function lv(s, e) { +function av(s, e) { return Ct(s.prev, s, e.prev) < 0 && Ct(e.next, s, s.next) < 0; } -function cv(s, e, t, n) { +function lv(s, e, t, n) { let i = s; do - i.z === 0 && (i.z = Jh(i.x, i.y, e, t, n)), i.prevZ = i.prev, i.nextZ = i.next, i = i.next; + i.z === 0 && (i.z = $h(i.x, i.y, e, t, n)), i.prevZ = i.prev, i.nextZ = i.next, i = i.next; while (i !== s); - i.prevZ.nextZ = null, i.prevZ = null, hv(i); + i.prevZ.nextZ = null, i.prevZ = null, cv(i); } -function hv(s) { +function cv(s) { let e, t = 1; do { let n = s, i; @@ -13538,25 +13566,25 @@ function hv(s) { } while (e > 1); return s; } -function Jh(s, e, t, n, i) { +function $h(s, e, t, n, i) { return s = (s - t) * i | 0, e = (e - n) * i | 0, s = (s | s << 8) & 16711935, s = (s | s << 4) & 252645135, s = (s | s << 2) & 858993459, s = (s | s << 1) & 1431655765, e = (e | e << 8) & 16711935, e = (e | e << 4) & 252645135, e = (e | e << 2) & 858993459, e = (e | e << 1) & 1431655765, s | e << 1; } -function uv(s) { +function hv(s) { let e = s, t = s; do (e.x < t.x || e.x === t.x && e.y < t.y) && (t = e), e = e.next; while (e !== s); return t; } -function Hm(s, e, t, n, i, r, o, a) { +function zm(s, e, t, n, i, r, o, a) { return (i - o) * (e - a) >= (s - o) * (r - a) && (s - o) * (n - a) >= (t - o) * (e - a) && (t - o) * (r - a) >= (i - o) * (n - a); } function ho(s, e, t, n, i, r, o, a) { - return !(s === o && e === a) && Hm(s, e, t, n, i, r, o, a); + return !(s === o && e === a) && zm(s, e, t, n, i, r, o, a); } -function dv(s, e) { - return s.next.i !== e.i && s.prev.i !== e.i && !fv(s, e) && // doesn't intersect other edges - (Ro(s, e) && Ro(e, s) && pv(s, e) && // locally visible +function uv(s, e) { + return s.next.i !== e.i && s.prev.i !== e.i && !dv(s, e) && // doesn't intersect other edges + (Ro(s, e) && Ro(e, s) && fv(s, e) && // locally visible (Ct(s.prev, s, e.prev) || Ct(s, e.prev, e)) || // does not create opposite-facing sectors Tr(s, e) && Ct(s.prev, s, s.next) > 0 && Ct(e.prev, e, e.next) > 0); } @@ -13566,7 +13594,7 @@ function Ct(s, e, t) { function Tr(s, e) { return s.x === e.x && s.y === e.y; } -function Vm(s, e, t, n) { +function Hm(s, e, t, n) { const i = va(Ct(s, e, t)), r = va(Ct(s, e, n)), o = va(Ct(t, n, s)), a = va(Ct(t, n, e)); return !!(i !== r && o !== a || i === 0 && xa(s, t, e) || r === 0 && xa(s, n, e) || o === 0 && xa(t, s, n) || a === 0 && xa(t, e, n)); } @@ -13576,10 +13604,10 @@ function xa(s, e, t) { function va(s) { return s > 0 ? 1 : s < 0 ? -1 : 0; } -function fv(s, e) { +function dv(s, e) { let t = s; do { - if (t.i !== s.i && t.next.i !== s.i && t.i !== e.i && t.next.i !== e.i && Vm(t, t.next, s, e)) return !0; + if (t.i !== s.i && t.next.i !== s.i && t.i !== e.i && t.next.i !== e.i && Hm(t, t.next, s, e)) return !0; t = t.next; } while (t !== s); return !1; @@ -13587,7 +13615,7 @@ function fv(s, e) { function Ro(s, e) { return Ct(s.prev, s, s.next) < 0 ? Ct(s, e, s.next) >= 0 && Ct(s, s.prev, e) >= 0 : Ct(s, e, s.prev) < 0 || Ct(s, s.next, e) < 0; } -function pv(s, e) { +function fv(s, e) { let t = s, n = !1; const i = (s.x + e.x) / 2, r = (s.y + e.y) / 2; do @@ -13595,18 +13623,18 @@ function pv(s, e) { while (t !== s); return n; } -function Gm(s, e) { - const t = Qh(s.i, s.x, s.y), n = Qh(e.i, e.x, e.y), i = s.next, r = e.prev; +function Vm(s, e) { + const t = Jh(s.i, s.x, s.y), n = Jh(e.i, e.x, e.y), i = s.next, r = e.prev; return s.next = e, e.prev = s, t.next = i, i.prev = t, n.next = t, t.prev = n, r.next = n, n.prev = r, n; } -function nf(s, e, t, n) { - const i = Qh(s, e, t); +function tf(s, e, t, n) { + const i = Jh(s, e, t); return n ? (i.next = n.next, i.prev = n, n.next.prev = i, n.next = i) : (i.prev = i, i.next = i), i; } function Lo(s) { s.next.prev = s.prev, s.prev.next = s.next, s.prevZ && (s.prevZ.nextZ = s.nextZ), s.nextZ && (s.nextZ.prevZ = s.prevZ); } -function Qh(s, e, t) { +function Jh(s, e, t) { return { i: s, // vertex index in coordinates array @@ -13625,13 +13653,13 @@ function Qh(s, e, t) { // indicates whether this is a steiner point }; } -function mv(s, e, t, n) { +function pv(s, e, t, n) { let i = 0; for (let r = e, o = t - n; r < t; r += n) i += (s[o] - s[r]) * (s[r + 1] + s[o + 1]), o = r; return i; } -class gv { +class mv { /** * Triangulates the given shape definition by returning an array of triangles. * @@ -13642,7 +13670,7 @@ class gv { * representing vertex indices. */ static triangulate(e, t, n = 2) { - return Qx(e, t, n); + return Jx(e, t, n); } } class hr { @@ -13677,33 +13705,33 @@ class hr { */ static triangulateShape(e, t) { const n = [], i = [], r = []; - sf(e), rf(n, e); + nf(e), sf(n, e); let o = e.length; - t.forEach(sf); + t.forEach(nf); for (let l = 0; l < t.length; l++) - i.push(o), o += t[l].length, rf(n, t[l]); - const a = gv.triangulate(n, i); + i.push(o), o += t[l].length, sf(n, t[l]); + const a = mv.triangulate(n, i); for (let l = 0; l < a.length; l += 3) r.push(a.slice(l, l + 3)); return r; } } -function sf(s) { +function nf(s) { const e = s.length; e > 2 && s[e - 1].equals(s[0]) && s.pop(); } -function rf(s, e) { +function sf(s, e) { for (let t = 0; t < e.length; t++) s.push(e[t].x), s.push(e[t].y); } -class zu extends ut { +class Fu extends ut { /** * Constructs a new extrude geometry. * * @param {Shape|Array} [shapes] - A shape or an array of shapes. * @param {ExtrudeGeometry~Options} [options] - The extrude settings. */ - constructor(e = new Fm([new ce(0.5, 0.5), new ce(-0.5, 0.5), new ce(-0.5, -0.5), new ce(0.5, -0.5)]), t = {}) { + constructor(e = new Om([new ce(0.5, 0.5), new ce(-0.5, 0.5), new ce(-0.5, -0.5), new ce(0.5, -0.5)]), t = {}) { super(), this.type = "ExtrudeGeometry", this.parameters = { shapes: e, options: t @@ -13717,7 +13745,7 @@ class zu extends ut { function o(a) { const l = [], c = t.curveSegments !== void 0 ? t.curveSegments : 12, h = t.steps !== void 0 ? t.steps : 1, u = t.depth !== void 0 ? t.depth : 1; let d = t.bevelEnabled !== void 0 ? t.bevelEnabled : !0, f = t.bevelThickness !== void 0 ? t.bevelThickness : 0.2, p = t.bevelSize !== void 0 ? t.bevelSize : f - 0.1, g = t.bevelOffset !== void 0 ? t.bevelOffset : 0, x = t.bevelSegments !== void 0 ? t.bevelSegments : 3; - const m = t.extrudePath, b = t.UVGenerator !== void 0 ? t.UVGenerator : xv; + const m = t.extrudePath, b = t.UVGenerator !== void 0 ? t.UVGenerator : gv; let v, y = !1, M, E, A, R; m && (v = m.getSpacedPoints(h), y = !0, d = !1, M = m.computeFrenetFrames(h, !1), E = new P(), A = new P(), R = new P()), d || (x = 0, f = 0, p = 0, g = 0); const _ = a.extractPoints(c); @@ -13908,7 +13936,7 @@ class zu extends ut { } toJSON() { const e = super.toJSON(), t = this.parameters.shapes, n = this.parameters.options; - return vv(t, n, e); + return xv(t, n, e); } /** * Factory method for creating an instance of this class from the given @@ -13925,10 +13953,10 @@ class zu extends ut { n.push(a); } const i = e.options.extrudePath; - return i !== void 0 && (e.options.extrudePath = new $h[i.type]().fromJSON(i)), new zu(n, e.options); + return i !== void 0 && (e.options.extrudePath = new Kh[i.type]().fromJSON(i)), new Fu(n, e.options); } } -const xv = { +const gv = { generateTopUV: function(s, e, t, n, i) { const r = e[t * 3], o = e[t * 3 + 1], a = e[n * 3], l = e[n * 3 + 1], c = e[i * 3], h = e[i * 3 + 1]; return [ @@ -13952,7 +13980,7 @@ const xv = { ]; } }; -function vv(s, e, t) { +function xv(s, e, t) { if (t.shapes = [], Array.isArray(s)) for (let n = 0, i = s.length; n < i; n++) { const r = s[n]; @@ -14007,7 +14035,7 @@ class ko extends ut { return new ko(e.width, e.height, e.widthSegments, e.heightSegments); } } -class bv extends Ut { +class vv extends Ut { /** * Constructs a new raw shader material. * @@ -14151,7 +14179,7 @@ class Qn extends Ss { }, this.anisotropy = e.anisotropy, this.anisotropyRotation = e.anisotropyRotation, this.anisotropyMap = e.anisotropyMap, this.clearcoat = e.clearcoat, this.clearcoatMap = e.clearcoatMap, this.clearcoatRoughness = e.clearcoatRoughness, this.clearcoatRoughnessMap = e.clearcoatRoughnessMap, this.clearcoatNormalMap = e.clearcoatNormalMap, this.clearcoatNormalScale.copy(e.clearcoatNormalScale), this.dispersion = e.dispersion, this.ior = e.ior, this.iridescence = e.iridescence, this.iridescenceMap = e.iridescenceMap, this.iridescenceIOR = e.iridescenceIOR, this.iridescenceThicknessRange = [...e.iridescenceThicknessRange], this.iridescenceThicknessMap = e.iridescenceThicknessMap, this.sheen = e.sheen, this.sheenColor.copy(e.sheenColor), this.sheenColorMap = e.sheenColorMap, this.sheenRoughness = e.sheenRoughness, this.sheenRoughnessMap = e.sheenRoughnessMap, this.transmission = e.transmission, this.transmissionMap = e.transmissionMap, this.thickness = e.thickness, this.thicknessMap = e.thicknessMap, this.attenuationDistance = e.attenuationDistance, this.attenuationColor.copy(e.attenuationColor), this.specularIntensity = e.specularIntensity, this.specularIntensityMap = e.specularIntensityMap, this.specularColor.copy(e.specularColor), this.specularColorMap = e.specularColorMap, this; } } -class yv extends yn { +class bv extends yn { /** * Constructs a new mesh phong material. * @@ -14168,7 +14196,7 @@ class yv extends yn { return super.copy(e), this.color.copy(e.color), this.specular.copy(e.specular), this.shininess = e.shininess, this.map = e.map, this.lightMap = e.lightMap, this.lightMapIntensity = e.lightMapIntensity, this.aoMap = e.aoMap, this.aoMapIntensity = e.aoMapIntensity, this.emissive.copy(e.emissive), this.emissiveMap = e.emissiveMap, this.emissiveIntensity = e.emissiveIntensity, this.bumpMap = e.bumpMap, this.bumpScale = e.bumpScale, this.normalMap = e.normalMap, this.normalMapType = e.normalMapType, this.normalScale.copy(e.normalScale), this.displacementMap = e.displacementMap, this.displacementScale = e.displacementScale, this.displacementBias = e.displacementBias, this.specularMap = e.specularMap, this.alphaMap = e.alphaMap, this.envMap = e.envMap, this.envMapRotation.copy(e.envMapRotation), this.combine = e.combine, this.reflectivity = e.reflectivity, this.refractionRatio = e.refractionRatio, this.wireframe = e.wireframe, this.wireframeLinewidth = e.wireframeLinewidth, this.wireframeLinecap = e.wireframeLinecap, this.wireframeLinejoin = e.wireframeLinejoin, this.flatShading = e.flatShading, this.fog = e.fog, this; } } -class _v extends yn { +class yv extends yn { /** * Constructs a new mesh normal material. * @@ -14185,7 +14213,7 @@ class _v extends yn { return super.copy(e), this.bumpMap = e.bumpMap, this.bumpScale = e.bumpScale, this.normalMap = e.normalMap, this.normalMapType = e.normalMapType, this.normalScale.copy(e.normalScale), this.displacementMap = e.displacementMap, this.displacementScale = e.displacementScale, this.displacementBias = e.displacementBias, this.wireframe = e.wireframe, this.wireframeLinewidth = e.wireframeLinewidth, this.flatShading = e.flatShading, this; } } -class Wm extends yn { +class Gm extends yn { /** * Constructs a new mesh lambert material. * @@ -14202,7 +14230,7 @@ class Wm extends yn { return super.copy(e), this.color.copy(e.color), this.map = e.map, this.lightMap = e.lightMap, this.lightMapIntensity = e.lightMapIntensity, this.aoMap = e.aoMap, this.aoMapIntensity = e.aoMapIntensity, this.emissive.copy(e.emissive), this.emissiveMap = e.emissiveMap, this.emissiveIntensity = e.emissiveIntensity, this.bumpMap = e.bumpMap, this.bumpScale = e.bumpScale, this.normalMap = e.normalMap, this.normalMapType = e.normalMapType, this.normalScale.copy(e.normalScale), this.displacementMap = e.displacementMap, this.displacementScale = e.displacementScale, this.displacementBias = e.displacementBias, this.specularMap = e.specularMap, this.alphaMap = e.alphaMap, this.envMap = e.envMap, this.envMapRotation.copy(e.envMapRotation), this.combine = e.combine, this.reflectivity = e.reflectivity, this.refractionRatio = e.refractionRatio, this.wireframe = e.wireframe, this.wireframeLinewidth = e.wireframeLinewidth, this.wireframeLinecap = e.wireframeLinecap, this.wireframeLinejoin = e.wireframeLinejoin, this.flatShading = e.flatShading, this.fog = e.fog, this; } } -class Mv extends yn { +class _v extends yn { /** * Constructs a new mesh depth material. * @@ -14213,13 +14241,13 @@ class Mv extends yn { * by {@link Color#set}. */ constructor(e) { - super(), this.isMeshDepthMaterial = !0, this.type = "MeshDepthMaterial", this.depthPacking = Ig, this.map = null, this.alphaMap = null, this.displacementMap = null, this.displacementScale = 1, this.displacementBias = 0, this.wireframe = !1, this.wireframeLinewidth = 1, this.setValues(e); + super(), this.isMeshDepthMaterial = !0, this.type = "MeshDepthMaterial", this.depthPacking = Dg, this.map = null, this.alphaMap = null, this.displacementMap = null, this.displacementScale = 1, this.displacementBias = 0, this.wireframe = !1, this.wireframeLinewidth = 1, this.setValues(e); } copy(e) { return super.copy(e), this.depthPacking = e.depthPacking, this.map = e.map, this.alphaMap = e.alphaMap, this.displacementMap = e.displacementMap, this.displacementScale = e.displacementScale, this.displacementBias = e.displacementBias, this.wireframe = e.wireframe, this.wireframeLinewidth = e.wireframeLinewidth, this; } } -class wv extends yn { +class Mv extends yn { /** * Constructs a new mesh distance material. * @@ -14239,10 +14267,10 @@ class wv extends yn { function ba(s, e) { return !s || s.constructor === e ? s : typeof e.BYTES_PER_ELEMENT == "number" ? new e(s) : Array.prototype.slice.call(s); } -function Sv(s) { +function wv(s) { return ArrayBuffer.isView(s) && !(s instanceof DataView); } -function Ev(s) { +function Sv(s) { function e(i, r) { return s[i] - s[r]; } @@ -14250,7 +14278,7 @@ function Ev(s) { for (let i = 0; i !== t; ++i) n[i] = i; return n.sort(e), n; } -function of(s, e, t) { +function rf(s, e, t) { const n = s.length, i = new s.constructor(n); for (let r = 0, o = 0; o !== n; ++r) { const a = t[r] * e; @@ -14259,7 +14287,7 @@ function of(s, e, t) { } return i; } -function Xm(s, e, t, n) { +function Wm(s, e, t, n) { let i = 1, r = s[0]; for (; r !== void 0 && r[n] === void 0; ) r = s[i++]; @@ -14388,7 +14416,7 @@ class Uo { intervalChanged_() { } } -class Tv extends Uo { +class Ev extends Uo { /** * Constructs a new cubic interpolant. * @@ -14399,8 +14427,8 @@ class Tv extends Uo { */ constructor(e, t, n, i) { super(e, t, n, i), this._weightPrev = -0, this._offsetPrev = -0, this._weightNext = -0, this._offsetNext = -0, this.DefaultSettings_ = { - endingStart: md, - endingEnd: md + endingStart: pd, + endingEnd: pd }; } intervalChanged_(e, t, n) { @@ -14408,10 +14436,10 @@ class Tv extends Uo { let r = e - 2, o = e + 1, a = i[r], l = i[o]; if (a === void 0) switch (this.getSettings_().endingStart) { - case gd: + case md: r = e, a = 2 * t - n; break; - case xd: + case gd: r = i.length - 2, a = t + i[r] - i[r + 1]; break; default: @@ -14419,10 +14447,10 @@ class Tv extends Uo { } if (l === void 0) switch (this.getSettings_().endingEnd) { - case gd: + case md: o = e, l = 2 * n - t; break; - case xd: + case gd: o = 1, l = n + i[1] - i[0]; break; default: @@ -14438,7 +14466,7 @@ class Tv extends Uo { return r; } } -class Av extends Uo { +class Tv extends Uo { /** * Constructs a new linear interpolant. * @@ -14457,7 +14485,7 @@ class Av extends Uo { return r; } } -class Cv extends Uo { +class Av extends Uo { /** * Constructs a new discrete interpolant. * @@ -14518,7 +14546,7 @@ class ei { * @return {DiscreteInterpolant} The new interpolant. */ InterpolantFactoryMethodDiscrete(e) { - return new Cv(this.times, this.values, this.getValueSize(), e); + return new Av(this.times, this.values, this.getValueSize(), e); } /** * Factory method for creating a new linear interpolant. @@ -14528,7 +14556,7 @@ class ei { * @return {LinearInterpolant} The new interpolant. */ InterpolantFactoryMethodLinear(e) { - return new Av(this.times, this.values, this.getValueSize(), e); + return new Tv(this.times, this.values, this.getValueSize(), e); } /** * Factory method for creating a new smooth interpolant. @@ -14538,7 +14566,7 @@ class ei { * @return {CubicInterpolant} The new interpolant. */ InterpolantFactoryMethodSmooth(e) { - return new Tv(this.times, this.values, this.getValueSize(), e); + return new Ev(this.times, this.values, this.getValueSize(), e); } /** * Defines the interpolation factor method for this keyframe track. @@ -14670,7 +14698,7 @@ class ei { } o = l; } - if (i !== void 0 && Sv(i)) + if (i !== void 0 && wv(i)) for (let a = 0, l = i.length; a !== l; ++a) { const c = i[a]; if (isNaN(c)) { @@ -14757,7 +14785,7 @@ Ir.prototype.ValueBufferType = Array; Ir.prototype.DefaultInterpolation = Eo; Ir.prototype.InterpolantFactoryMethodLinear = void 0; Ir.prototype.InterpolantFactoryMethodSmooth = void 0; -class jm extends ei { +class Xm extends ei { /** * Constructs a new color keyframe track. * @@ -14770,7 +14798,7 @@ class jm extends ei { super(e, t, n, i); } } -jm.prototype.ValueTypeName = "color"; +Xm.prototype.ValueTypeName = "color"; class Ar extends ei { /** * Constructs a new number keyframe track. @@ -14785,7 +14813,7 @@ class Ar extends ei { } } Ar.prototype.ValueTypeName = "number"; -class Pv extends Uo { +class Cv extends Uo { /** * Constructs a new SLERP interpolant. * @@ -14825,7 +14853,7 @@ class Cr extends ei { * @return {QuaternionLinearInterpolant} The new interpolant. */ InterpolantFactoryMethodLinear(e) { - return new Pv(this.times, this.values, this.getValueSize(), e); + return new Cv(this.times, this.values, this.getValueSize(), e); } } Cr.prototype.ValueTypeName = "quaternion"; @@ -14864,7 +14892,7 @@ class Pr extends ei { } } Pr.prototype.ValueTypeName = "vector"; -class Rv { +class Pv { /** * Constructs a new animation clip. * @@ -14879,7 +14907,7 @@ class Rv { * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode=NormalAnimationBlendMode] - Defines how the animation * is blended/combined when two or more animations are simultaneously played. */ - constructor(e = "", t = -1, n = [], i = Lg) { + constructor(e = "", t = -1, n = [], i = Rg) { this.name = e, this.tracks = n, this.duration = t, this.blendMode = i, this.uuid = On(), this.userData = {}, this.duration < 0 && this.resetDuration(); } /** @@ -14892,7 +14920,7 @@ class Rv { static parse(e) { const t = [], n = e.tracks, i = 1 / (e.fps || 1); for (let o = 0, a = n.length; o !== a; ++o) - t.push(Dv(n[o]).scale(i)); + t.push(Lv(n[o]).scale(i)); const r = new this(e.name, e.duration, t, e.blendMode); return r.uuid = e.uuid, r.userData = JSON.parse(e.userData || "{}"), r; } @@ -14939,8 +14967,8 @@ class Rv { a, (a + 1) % r ), c.push(0, 1, 0); - const h = Ev(l); - l = of(l, 1, h), c = of(c, 1, h), !i && l[0] === 0 && (l.push(r), c.push(c[0])), o.push( + const h = Sv(l); + l = rf(l, 1, h), c = rf(c, 1, h), !i && l[0] === 0 && (l.push(r), c.push(c[0])), o.push( new Ar( ".morphTargetInfluences[" + t[a].name + "]", l, @@ -15014,7 +15042,7 @@ class Rv { const n = function(u, d, f, p, g) { if (f.length !== 0) { const x = [], m = []; - Xm(f, x, m, p), x.length !== 0 && g.push(new u(d, x, m)); + Wm(f, x, m, p), x.length !== 0 && g.push(new u(d, x, m)); } }, i = [], r = e.name || "default", o = e.fps || 30, a = e.blendMode; let l = e.length || -1; @@ -15131,7 +15159,7 @@ class Rv { return this.constructor.toJSON(this); } } -function Lv(s) { +function Rv(s) { switch (s.toLowerCase()) { case "scalar": case "double": @@ -15145,7 +15173,7 @@ function Lv(s) { case "vector4": return Pr; case "color": - return jm; + return Xm; case "quaternion": return Cr; case "bool": @@ -15156,13 +15184,13 @@ function Lv(s) { } throw new Error("THREE.KeyframeTrack: Unsupported typeName: " + s); } -function Dv(s) { +function Lv(s) { if (s.type === void 0) throw new Error("THREE.KeyframeTrack: track type undefined, can not parse"); - const e = Lv(s.type); + const e = Rv(s.type); if (s.times === void 0) { const t = [], n = []; - Xm(s.keys, t, n, "value"), s.times = t, s.values = n; + Wm(s.keys, t, n, "value"), s.times = t, s.values = n; } return e.parse !== void 0 ? e.parse(s) : new e(s.name, s.times, s.values, s.interpolation); } @@ -15222,7 +15250,7 @@ const Ci = { this.files = {}; } }; -class Iv { +class Dv { /** * Constructs a new loading manager. * @@ -15271,7 +15299,7 @@ class Iv { return this._abortController || (this._abortController = new AbortController()), this._abortController; } } -const Bv = /* @__PURE__ */ new Iv(); +const Iv = /* @__PURE__ */ new Dv(); class Ps { /** * Constructs a new loader. @@ -15279,7 +15307,7 @@ class Ps { * @param {LoadingManager} [manager] - The loading manager. */ constructor(e) { - this.manager = e !== void 0 ? e : Bv, this.crossOrigin = "anonymous", this.withCredentials = !1, this.path = "", this.resourcePath = "", this.requestHeader = {}; + this.manager = e !== void 0 ? e : Iv, this.crossOrigin = "anonymous", this.withCredentials = !1, this.path = "", this.resourcePath = "", this.requestHeader = {}; } /** * This method needs to be implemented by all concrete loaders. It holds the @@ -15377,7 +15405,7 @@ class Ps { } Ps.DEFAULT_MATERIAL_NAME = "__DEFAULT"; const bi = {}; -class Nv extends Error { +class Bv extends Error { constructor(e, t) { super(e), this.response = t; } @@ -15455,7 +15483,7 @@ class yl extends Ps { }); return new Response(x); } else - throw new Nv(`fetch for "${c.url}" responded with ${c.status}: ${c.statusText}`, c); + throw new Bv(`fetch for "${c.url}" responded with ${c.status}: ${c.statusText}`, c); }).then((c) => { switch (l) { case "arraybuffer": @@ -15524,7 +15552,7 @@ class yl extends Ps { } } const Js = /* @__PURE__ */ new WeakMap(); -class kv extends Ps { +class Nv extends Ps { /** * Constructs a new image loader. * @@ -15584,7 +15612,7 @@ class kv extends Ps { return a.addEventListener("load", l, !1), a.addEventListener("error", c, !1), e.slice(0, 5) !== "data:" && this.crossOrigin !== void 0 && (a.crossOrigin = this.crossOrigin), Ci.add(`image:${e}`, a), r.manager.itemStart(e), a.src = e, a; } } -class qm extends Ps { +class jm extends Ps { /** * Constructs a new texture loader. * @@ -15606,7 +15634,7 @@ class qm extends Ps { * @return {Texture} The texture. */ load(e, t, n, i) { - const r = new Ht(), o = new kv(this.manager); + const r = new Ht(), o = new Nv(this.manager); return o.setCrossOrigin(this.crossOrigin), o.setPath(this.path), o.load(e, function(a) { r.image = a, r.needsUpdate = !0, t !== void 0 && t(r); }, n, i), r; @@ -15636,15 +15664,15 @@ class Cl extends St { return t.object.color = this.color.getHex(), t.object.intensity = this.intensity, this.groundColor !== void 0 && (t.object.groundColor = this.groundColor.getHex()), this.distance !== void 0 && (t.object.distance = this.distance), this.angle !== void 0 && (t.object.angle = this.angle), this.decay !== void 0 && (t.object.decay = this.decay), this.penumbra !== void 0 && (t.object.penumbra = this.penumbra), this.shadow !== void 0 && (t.object.shadow = this.shadow.toJSON()), this.target !== void 0 && (t.object.target = this.target.uuid), t; } } -const gc = /* @__PURE__ */ new ze(), af = /* @__PURE__ */ new P(), lf = /* @__PURE__ */ new P(); -class Hu { +const gc = /* @__PURE__ */ new ze(), of = /* @__PURE__ */ new P(), af = /* @__PURE__ */ new P(); +class zu { /** * Constructs a new light shadow. * * @param {Camera} camera - The light's view of the world. */ constructor(e) { - this.camera = e, this.intensity = 1, this.bias = 0, this.normalBias = 0, this.radius = 1, this.blurSamples = 8, this.mapSize = new ce(512, 512), this.mapType = Jn, this.map = null, this.mapPass = null, this.matrix = new ze(), this.autoUpdate = !0, this.needsUpdate = !1, this._frustum = new ku(), this._frameExtents = new ce(1, 1), this._viewportCount = 1, this._viewports = [ + this.camera = e, this.intensity = 1, this.bias = 0, this.normalBias = 0, this.radius = 1, this.blurSamples = 8, this.mapSize = new ce(512, 512), this.mapType = Jn, this.map = null, this.mapPass = null, this.matrix = new ze(), this.autoUpdate = !0, this.needsUpdate = !1, this._frustum = new Nu(), this._frameExtents = new ce(1, 1), this._viewportCount = 1, this._viewports = [ new tt(0, 0, 1, 1) ]; } @@ -15672,7 +15700,7 @@ class Hu { */ updateMatrices(e) { const t = this.camera, n = this.matrix; - af.setFromMatrixPosition(e.matrixWorld), t.position.copy(af), lf.setFromMatrixPosition(e.target.matrixWorld), t.lookAt(lf), t.updateMatrixWorld(), gc.multiplyMatrices(t.projectionMatrix, t.matrixWorldInverse), this._frustum.setFromProjectionMatrix(gc, t.coordinateSystem, t.reversedDepth), t.reversedDepth ? n.set( + of.setFromMatrixPosition(e.matrixWorld), t.position.copy(of), af.setFromMatrixPosition(e.target.matrixWorld), t.lookAt(af), t.updateMatrixWorld(), gc.multiplyMatrices(t.projectionMatrix, t.matrixWorldInverse), this._frustum.setFromProjectionMatrix(gc, t.coordinateSystem, t.reversedDepth), t.reversedDepth ? n.set( 0.5, 0, 0, @@ -15760,7 +15788,7 @@ class Hu { return this.intensity !== 1 && (e.intensity = this.intensity), this.bias !== 0 && (e.bias = this.bias), this.normalBias !== 0 && (e.normalBias = this.normalBias), this.radius !== 1 && (e.radius = this.radius), (this.mapSize.x !== 512 || this.mapSize.y !== 512) && (e.mapSize = this.mapSize.toArray()), e.camera = this.camera.toJSON(!1).object, delete e.camera.matrix, e; } } -class Uv extends Hu { +class kv extends zu { /** * Constructs a new spot light shadow. */ @@ -15775,7 +15803,7 @@ class Uv extends Hu { return super.copy(e), this.focus = e.focus, this; } } -class Ov extends Cl { +class Uv extends Cl { /** * Constructs a new spot light. * @@ -15787,7 +15815,7 @@ class Ov extends Cl { * @param {number} [decay=2] - The amount the light dims along the distance of the light. */ constructor(e, t, n = 0, i = Math.PI / 3, r = 0, o = 2) { - super(e, t), this.isSpotLight = !0, this.type = "SpotLight", this.position.copy(St.DEFAULT_UP), this.updateMatrix(), this.target = new St(), this.distance = n, this.angle = i, this.penumbra = r, this.decay = o, this.map = null, this.shadow = new Uv(); + super(e, t), this.isSpotLight = !0, this.type = "SpotLight", this.position.copy(St.DEFAULT_UP), this.updateMatrix(), this.target = new St(), this.distance = n, this.angle = i, this.penumbra = r, this.decay = o, this.map = null, this.shadow = new kv(); } /** * The light's power. Power is the luminous power of the light measured in lumens (lm). @@ -15808,8 +15836,8 @@ class Ov extends Cl { return super.copy(e, t), this.distance = e.distance, this.angle = e.angle, this.penumbra = e.penumbra, this.decay = e.decay, this.target = e.target.clone(), this.shadow = e.shadow.clone(), this; } } -const cf = /* @__PURE__ */ new ze(), Kr = /* @__PURE__ */ new P(), xc = /* @__PURE__ */ new P(); -class Fv extends Hu { +const lf = /* @__PURE__ */ new ze(), Kr = /* @__PURE__ */ new P(), xc = /* @__PURE__ */ new P(); +class Ov extends zu { /** * Constructs a new point light shadow. */ @@ -15863,10 +15891,10 @@ class Fv extends Hu { */ updateMatrices(e, t = 0) { const n = this.camera, i = this.matrix, r = e.distance || n.far; - r !== n.far && (n.far = r, n.updateProjectionMatrix()), Kr.setFromMatrixPosition(e.matrixWorld), n.position.copy(Kr), xc.copy(n.position), xc.add(this._cubeDirections[t]), n.up.copy(this._cubeUps[t]), n.lookAt(xc), n.updateMatrixWorld(), i.makeTranslation(-Kr.x, -Kr.y, -Kr.z), cf.multiplyMatrices(n.projectionMatrix, n.matrixWorldInverse), this._frustum.setFromProjectionMatrix(cf, n.coordinateSystem, n.reversedDepth); + r !== n.far && (n.far = r, n.updateProjectionMatrix()), Kr.setFromMatrixPosition(e.matrixWorld), n.position.copy(Kr), xc.copy(n.position), xc.add(this._cubeDirections[t]), n.up.copy(this._cubeUps[t]), n.lookAt(xc), n.updateMatrixWorld(), i.makeTranslation(-Kr.x, -Kr.y, -Kr.z), lf.multiplyMatrices(n.projectionMatrix, n.matrixWorldInverse), this._frustum.setFromProjectionMatrix(lf, n.coordinateSystem, n.reversedDepth); } } -class zv extends Cl { +class Fv extends Cl { /** * Constructs a new point light. * @@ -15876,7 +15904,7 @@ class zv extends Cl { * @param {number} [decay=2] - The amount the light dims along the distance of the light. */ constructor(e, t, n = 0, i = 2) { - super(e, t), this.isPointLight = !0, this.type = "PointLight", this.distance = n, this.decay = i, this.shadow = new Fv(); + super(e, t), this.isPointLight = !0, this.type = "PointLight", this.distance = n, this.decay = i, this.shadow = new Ov(); } /** * The light's power. Power is the luminous power of the light measured in lumens (lm). @@ -15897,7 +15925,7 @@ class zv extends Cl { return super.copy(e, t), this.distance = e.distance, this.decay = e.decay, this.shadow = e.shadow.clone(), this; } } -class Rs extends Tm { +class Rs extends Em { /** * Constructs a new orthographic camera. * @@ -15961,7 +15989,7 @@ class Rs extends Tm { return t.object.zoom = this.zoom, t.object.left = this.left, t.object.right = this.right, t.object.top = this.top, t.object.bottom = this.bottom, t.object.near = this.near, t.object.far = this.far, this.view !== null && (t.object.view = Object.assign({}, this.view)), t; } } -class Hv extends Hu { +class zv extends zu { /** * Constructs a new directional light shadow. */ @@ -15977,7 +16005,7 @@ class ur extends Cl { * @param {number} [intensity=1] - The light's strength/intensity. */ constructor(e, t) { - super(e, t), this.isDirectionalLight = !0, this.type = "DirectionalLight", this.position.copy(St.DEFAULT_UP), this.updateMatrix(), this.target = new St(), this.shadow = new Hv(); + super(e, t), this.isDirectionalLight = !0, this.type = "DirectionalLight", this.position.copy(St.DEFAULT_UP), this.updateMatrix(), this.target = new St(), this.shadow = new zv(); } dispose() { this.shadow.dispose(); @@ -16022,7 +16050,7 @@ class bo { } } const vc = /* @__PURE__ */ new WeakMap(); -class Vv extends Ps { +class Hv extends Ps { /** * Constructs a new image bitmap loader. * @@ -16089,7 +16117,7 @@ class Vv extends Ps { return this._abortController.abort(), this._abortController = new AbortController(), this; } } -class Gv extends nn { +class Vv extends nn { /** * Constructs a new array camera. * @@ -16099,7 +16127,7 @@ class Gv extends nn { super(), this.isArrayCamera = !0, this.isMultiViewCamera = !1, this.cameras = e; } } -class Wv { +class Gv { /** * Constructs a new clock. * @@ -16146,10 +16174,10 @@ class Wv { return e; } } -const Vu = "\\[\\]\\.:\\/", Xv = new RegExp("[" + Vu + "]", "g"), Gu = "[^" + Vu + "]", jv = "[^" + Vu.replace("\\.", "") + "]", qv = /* @__PURE__ */ /((?:WC+[\/:])*)/.source.replace("WC", Gu), Zv = /* @__PURE__ */ /(WCOD+)?/.source.replace("WCOD", jv), Yv = /* @__PURE__ */ /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC", Gu), Kv = /* @__PURE__ */ /\.(WC+)(?:\[(.+)\])?/.source.replace("WC", Gu), $v = new RegExp( - "^" + qv + Zv + Yv + Kv + "$" -), Jv = ["material", "materials", "bones", "map"]; -class Qv { +const Hu = "\\[\\]\\.:\\/", Wv = new RegExp("[" + Hu + "]", "g"), Vu = "[^" + Hu + "]", Xv = "[^" + Hu.replace("\\.", "") + "]", jv = /* @__PURE__ */ /((?:WC+[\/:])*)/.source.replace("WC", Vu), qv = /* @__PURE__ */ /(WCOD+)?/.source.replace("WCOD", Xv), Zv = /* @__PURE__ */ /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC", Vu), Yv = /* @__PURE__ */ /\.(WC+)(?:\[(.+)\])?/.source.replace("WC", Vu), Kv = new RegExp( + "^" + jv + qv + Zv + Yv + "$" +), $v = ["material", "materials", "bones", "map"]; +class Jv { constructor(e, t, n) { const i = n || ht.parseTrackName(t); this._targetGroup = e, this._bindings = e.subscribe_(t, i); @@ -16206,7 +16234,7 @@ class ht { * @return {string} The sanitized node name. */ static sanitizeNodeName(e) { - return e.replace(/\s/g, "_").replace(Xv, ""); + return e.replace(/\s/g, "_").replace(Wv, ""); } /** * Parses the given track name (an object path to an animated property) and @@ -16227,7 +16255,7 @@ class ht { * @return {Object} The parsed track name as an object. */ static parseTrackName(e) { - const t = $v.exec(e); + const t = Kv.exec(e); if (t === null) throw new Error("PropertyBinding: Cannot parse trackName: " + e); const n = { @@ -16241,7 +16269,7 @@ class ht { }, i = n.nodeName && n.nodeName.lastIndexOf("."); if (i !== void 0 && i !== -1) { const r = n.nodeName.substring(i + 1); - Jv.indexOf(r) !== -1 && (n.nodeName = n.nodeName.substring(0, i), n.objectName = r); + $v.indexOf(r) !== -1 && (n.nodeName = n.nodeName.substring(0, i), n.objectName = r); } if (n.propertyName === null || n.propertyName.length === 0) throw new Error("PropertyBinding: can not parse propertyName from trackName: " + e); @@ -16453,7 +16481,7 @@ class ht { this.node = null, this.getValue = this._getValue_unbound, this.setValue = this._setValue_unbound; } } -ht.Composite = Qv; +ht.Composite = Jv; ht.prototype.BindingType = { Direct: 0, EntireArray: 1, @@ -16497,7 +16525,7 @@ ht.prototype.SetterByBindingTypeAndVersioning = [ ht.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate ] ]; -const hf = /* @__PURE__ */ new ze(); +const cf = /* @__PURE__ */ new ze(); class Es { /** * Constructs a new raycaster. @@ -16508,7 +16536,7 @@ class Es { * @param {number} [far=Infinity] - All results returned are closer than far. Far can't be lower than near. */ constructor(e, t, n = 0, i = 1 / 0) { - this.ray = new Qi(e, t), this.near = n, this.far = i, this.camera = null, this.layers = new Iu(), this.params = { + this.ray = new Qi(e, t), this.near = n, this.far = i, this.camera = null, this.layers = new Du(), this.params = { Mesh: {}, Line: { threshold: 1 }, LOD: {}, @@ -16542,7 +16570,7 @@ class Es { * @return {Raycaster} A reference to this raycaster. */ setFromXRController(e) { - return hf.identity().extractRotation(e.matrixWorld), this.ray.origin.setFromMatrixPosition(e.matrixWorld), this.ray.direction.set(0, 0, -1).applyMatrix4(hf), this; + return cf.identity().extractRotation(e.matrixWorld), this.ray.origin.setFromMatrixPosition(e.matrixWorld), this.ray.direction.set(0, 0, -1).applyMatrix4(cf), this; } /** * The intersection point of a raycaster intersection test. @@ -16580,7 +16608,7 @@ class Es { * @return {Array} An array holding the intersection points. */ intersectObject(e, t = !0, n = []) { - return eu(e, this, n, t), n.sort(uf), n; + return Qh(e, this, n, t), n.sort(hf), n; } /** * Checks all intersection between the ray and the objects with or without @@ -16594,22 +16622,22 @@ class Es { */ intersectObjects(e, t = !0, n = []) { for (let i = 0, r = e.length; i < r; i++) - eu(e[i], this, n, t); - return n.sort(uf), n; + Qh(e[i], this, n, t); + return n.sort(hf), n; } } -function uf(s, e) { +function hf(s, e) { return s.distance - e.distance; } -function eu(s, e, t, n) { +function Qh(s, e, t, n) { let i = !0; if (s.layers.test(e.layers) && s.raycast(e, t) === !1 && (i = !1), i === !0 && n === !0) { const r = s.children; for (let o = 0, a = r.length; o < a; o++) - eu(r[o], e, t, !0); + Qh(r[o], e, t, !0); } } -class df { +class uf { /** * Constructs a new spherical. * @@ -16679,7 +16707,7 @@ class df { return new this.constructor().copy(this); } } -const ff = /* @__PURE__ */ new P(), ya = /* @__PURE__ */ new P(), Qs = /* @__PURE__ */ new P(), er = /* @__PURE__ */ new P(), bc = /* @__PURE__ */ new P(), e1 = /* @__PURE__ */ new P(), t1 = /* @__PURE__ */ new P(); +const df = /* @__PURE__ */ new P(), ya = /* @__PURE__ */ new P(), Qs = /* @__PURE__ */ new P(), er = /* @__PURE__ */ new P(), bc = /* @__PURE__ */ new P(), Qv = /* @__PURE__ */ new P(), e1 = /* @__PURE__ */ new P(); class Hn { /** * Constructs a new line segment. @@ -16761,9 +16789,9 @@ class Hn { * @return {number} The point parameter. */ closestPointToPointParameter(e, t) { - ff.subVectors(e, this.start), ya.subVectors(this.end, this.start); + df.subVectors(e, this.start), ya.subVectors(this.end, this.start); const n = ya.dot(ya); - let r = ya.dot(ff) / n; + let r = ya.dot(df) / n; return t && (r = Ze(r, 0, 1)), r; } /** @@ -16786,7 +16814,7 @@ class Hn { * @param {Vector3} [c2] - The closest point on the given line segment. * @return {number} The squared distance between this line segment and the given one. */ - distanceSqToLine3(e, t = e1, n = t1) { + distanceSqToLine3(e, t = Qv, n = e1) { const i = 10000000000000001e-32; let r, o; const a = this.start, l = e.start, c = this.end, h = e.end; @@ -16834,7 +16862,7 @@ class Hn { return new this.constructor().copy(this); } } -class n1 extends As { +class t1 extends As { /** * Constructs a new controls instance. * @@ -16877,25 +16905,25 @@ class n1 extends As { update() { } } -function pf(s, e, t, n) { - const i = i1(n); +function ff(s, e, t, n) { + const i = n1(n); switch (t) { // https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml - case gm: + case mm: return s * e; + case Eu: + return s * e / i.components * i.byteLength; case Tu: return s * e / i.components * i.byteLength; case Au: - return s * e / i.components * i.byteLength; + return s * e * 2 / i.components * i.byteLength; case Cu: return s * e * 2 / i.components * i.byteLength; - case Pu: - return s * e * 2 / i.components * i.byteLength; - case xm: + case gm: return s * e * 3 / i.components * i.byteLength; case xn: return s * e * 4 / i.components * i.byteLength; - case Ru: + case Pu: return s * e * 4 / i.components * i.byteLength; // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/ case tl: @@ -16905,82 +16933,82 @@ function pf(s, e, t, n) { case sl: return Math.floor((s + 3) / 4) * Math.floor((e + 3) / 4) * 16; // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/ - case yh: - case Mh: - return Math.max(s, 16) * Math.max(e, 8) / 4; case bh: case _h: + return Math.max(s, 16) * Math.max(e, 8) / 4; + case vh: + case yh: return Math.max(s, 8) * Math.max(e, 8) / 2; // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/ + case Mh: case wh: - case Sh: return Math.floor((s + 3) / 4) * Math.floor((e + 3) / 4) * 8; - case Eh: + case Sh: return Math.floor((s + 3) / 4) * Math.floor((e + 3) / 4) * 16; // https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/ - case Th: + case Eh: return Math.floor((s + 3) / 4) * Math.floor((e + 3) / 4) * 16; - case Ah: + case Th: return Math.floor((s + 4) / 5) * Math.floor((e + 3) / 4) * 16; - case Ch: + case Ah: return Math.floor((s + 4) / 5) * Math.floor((e + 4) / 5) * 16; - case Ph: + case Ch: return Math.floor((s + 5) / 6) * Math.floor((e + 4) / 5) * 16; - case Rh: + case Ph: return Math.floor((s + 5) / 6) * Math.floor((e + 5) / 6) * 16; - case Lh: + case Rh: return Math.floor((s + 7) / 8) * Math.floor((e + 4) / 5) * 16; - case Dh: + case Lh: return Math.floor((s + 7) / 8) * Math.floor((e + 5) / 6) * 16; - case Ih: + case Dh: return Math.floor((s + 7) / 8) * Math.floor((e + 7) / 8) * 16; - case Bh: + case Ih: return Math.floor((s + 9) / 10) * Math.floor((e + 4) / 5) * 16; - case Nh: + case Bh: return Math.floor((s + 9) / 10) * Math.floor((e + 5) / 6) * 16; - case kh: + case Nh: return Math.floor((s + 9) / 10) * Math.floor((e + 7) / 8) * 16; - case Uh: + case kh: return Math.floor((s + 9) / 10) * Math.floor((e + 9) / 10) * 16; - case Oh: + case Uh: return Math.floor((s + 11) / 12) * Math.floor((e + 9) / 10) * 16; - case Fh: + case Oh: return Math.floor((s + 11) / 12) * Math.floor((e + 11) / 12) * 16; // https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/ + case Fh: case zh: case Hh: - case Vh: return Math.ceil(s / 4) * Math.ceil(e / 4) * 16; // https://registry.khronos.org/webgl/extensions/EXT_texture_compression_rgtc/ + case Vh: case Gh: - case Wh: return Math.ceil(s / 4) * Math.ceil(e / 4) * 8; + case Wh: case Xh: - case jh: return Math.ceil(s / 4) * Math.ceil(e / 4) * 16; } throw new Error( `Unable to determine texture byte length for ${t} format.` ); } -function i1(s) { +function n1(s) { switch (s) { case Jn: - case dm: + case um: return { byteLength: 1, components: 1 }; case wo: - case fm: + case dm: case Un: return { byteLength: 2, components: 1 }; + case wu: case Su: - case Eu: return { byteLength: 2, components: 4 }; case Ms: - case wu: + case Mu: case $n: return { byteLength: 4, components: 1 }; + case fm: case pm: - case mm: return { byteLength: 4, components: 3 }; } throw new Error(`Unknown texture type ${s}.`); @@ -16989,7 +17017,7 @@ typeof __THREE_DEVTOOLS__ < "u" && __THREE_DEVTOOLS__.dispatchEvent(new CustomEv revision: Do } })); typeof window < "u" && (window.__THREE__ ? He("WARNING: Multiple instances of Three.js being imported.") : window.__THREE__ = Do); -function Zm() { +function qm() { let s = null, e = !1, t = null, n = null; function i(r, o) { t(r, o), n = s.requestAnimationFrame(i); @@ -17009,7 +17037,7 @@ function Zm() { } }; } -function s1(s) { +function i1(s) { const e = /* @__PURE__ */ new WeakMap(); function t(a, l) { const c = a.array, h = a.usage, u = c.byteLength, d = s.createBuffer(); @@ -17106,9 +17134,9 @@ function s1(s) { update: o }; } -var r1 = `#ifdef USE_ALPHAHASH +var s1 = `#ifdef USE_ALPHAHASH if ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard; -#endif`, o1 = `#ifdef USE_ALPHAHASH +#endif`, r1 = `#ifdef USE_ALPHAHASH const float ALPHA_HASH_SCALE = 0.05; float hash2D( vec2 value ) { return fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) ); @@ -17143,20 +17171,20 @@ var r1 = `#ifdef USE_ALPHAHASH : cases.z; return clamp( threshold , 1.0e-6, 1.0 ); } -#endif`, a1 = `#ifdef USE_ALPHAMAP +#endif`, o1 = `#ifdef USE_ALPHAMAP diffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g; -#endif`, l1 = `#ifdef USE_ALPHAMAP +#endif`, a1 = `#ifdef USE_ALPHAMAP uniform sampler2D alphaMap; -#endif`, c1 = `#ifdef USE_ALPHATEST +#endif`, l1 = `#ifdef USE_ALPHATEST #ifdef ALPHA_TO_COVERAGE diffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a ); if ( diffuseColor.a == 0.0 ) discard; #else if ( diffuseColor.a < alphaTest ) discard; #endif -#endif`, h1 = `#ifdef USE_ALPHATEST +#endif`, c1 = `#ifdef USE_ALPHATEST uniform float alphaTest; -#endif`, u1 = `#ifdef USE_AOMAP +#endif`, h1 = `#ifdef USE_AOMAP float ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0; reflectedLight.indirectDiffuse *= ambientOcclusion; #if defined( USE_CLEARCOAT ) @@ -17169,10 +17197,10 @@ var r1 = `#ifdef USE_ALPHAHASH float dotNV = saturate( dot( geometryNormal, geometryViewDir ) ); reflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness ); #endif -#endif`, d1 = `#ifdef USE_AOMAP +#endif`, u1 = `#ifdef USE_AOMAP uniform sampler2D aoMap; uniform float aoMapIntensity; -#endif`, f1 = `#ifdef USE_BATCHING +#endif`, d1 = `#ifdef USE_BATCHING #if ! defined( GL_ANGLE_multi_draw ) #define gl_DrawID _gl_DrawID uniform int _gl_DrawID; @@ -17206,15 +17234,15 @@ var r1 = `#ifdef USE_ALPHAHASH int y = j / size; return texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb; } -#endif`, p1 = `#ifdef USE_BATCHING +#endif`, f1 = `#ifdef USE_BATCHING mat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) ); -#endif`, m1 = `vec3 transformed = vec3( position ); +#endif`, p1 = `vec3 transformed = vec3( position ); #ifdef USE_ALPHAHASH vPosition = vec3( position ); -#endif`, g1 = `vec3 objectNormal = vec3( normal ); +#endif`, m1 = `vec3 objectNormal = vec3( normal ); #ifdef USE_TANGENT vec3 objectTangent = vec3( tangent.xyz ); -#endif`, x1 = `float G_BlinnPhong_Implicit( ) { +#endif`, g1 = `float G_BlinnPhong_Implicit( ) { return 0.25; } float D_BlinnPhong( const in float shininess, const in float dotNH ) { @@ -17228,7 +17256,7 @@ vec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in ve float G = G_BlinnPhong_Implicit( ); float D = D_BlinnPhong( shininess, dotNH ); return F * ( G * D ); -} // validated`, v1 = `#ifdef USE_IRIDESCENCE +} // validated`, x1 = `#ifdef USE_IRIDESCENCE const mat3 XYZ_TO_REC709 = mat3( 3.2404542, -0.9692660, 0.0556434, -1.5371385, 1.8760108, -0.2040259, @@ -17291,7 +17319,7 @@ vec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in ve } return max( I, vec3( 0.0 ) ); } -#endif`, b1 = `#ifdef USE_BUMPMAP +#endif`, v1 = `#ifdef USE_BUMPMAP uniform sampler2D bumpMap; uniform float bumpScale; vec2 dHdxy_fwd() { @@ -17312,7 +17340,7 @@ vec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in ve vec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 ); return normalize( abs( fDet ) * surf_norm - vGrad ); } -#endif`, y1 = `#if NUM_CLIPPING_PLANES > 0 +#endif`, b1 = `#if NUM_CLIPPING_PLANES > 0 vec4 plane; #ifdef ALPHA_TO_COVERAGE float distanceToPlane, distanceGradient; @@ -17358,26 +17386,26 @@ vec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in ve if ( clipped ) discard; #endif #endif -#endif`, _1 = `#if NUM_CLIPPING_PLANES > 0 +#endif`, y1 = `#if NUM_CLIPPING_PLANES > 0 varying vec3 vClipPosition; uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ]; -#endif`, M1 = `#if NUM_CLIPPING_PLANES > 0 +#endif`, _1 = `#if NUM_CLIPPING_PLANES > 0 varying vec3 vClipPosition; -#endif`, w1 = `#if NUM_CLIPPING_PLANES > 0 +#endif`, M1 = `#if NUM_CLIPPING_PLANES > 0 vClipPosition = - mvPosition.xyz; -#endif`, S1 = `#if defined( USE_COLOR_ALPHA ) +#endif`, w1 = `#if defined( USE_COLOR_ALPHA ) diffuseColor *= vColor; #elif defined( USE_COLOR ) diffuseColor.rgb *= vColor; -#endif`, E1 = `#if defined( USE_COLOR_ALPHA ) +#endif`, S1 = `#if defined( USE_COLOR_ALPHA ) varying vec4 vColor; #elif defined( USE_COLOR ) varying vec3 vColor; -#endif`, T1 = `#if defined( USE_COLOR_ALPHA ) +#endif`, E1 = `#if defined( USE_COLOR_ALPHA ) varying vec4 vColor; #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) varying vec3 vColor; -#endif`, A1 = `#if defined( USE_COLOR_ALPHA ) +#endif`, T1 = `#if defined( USE_COLOR_ALPHA ) vColor = vec4( 1.0 ); #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) vColor = vec3( 1.0 ); @@ -17391,7 +17419,7 @@ vec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in ve #ifdef USE_BATCHING_COLOR vec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) ); vColor.xyz *= batchingColor.xyz; -#endif`, C1 = `#define PI 3.141592653589793 +#endif`, A1 = `#define PI 3.141592653589793 #define PI2 6.283185307179586 #define PI_HALF 1.5707963267948966 #define RECIPROCAL_PI 0.3183098861837907 @@ -17458,7 +17486,7 @@ vec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) { float F_Schlick( const in float f0, const in float f90, const in float dotVH ) { float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH ); return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel ); -} // validated`, P1 = `#ifdef ENVMAP_TYPE_CUBE_UV +} // validated`, C1 = `#ifdef ENVMAP_TYPE_CUBE_UV #define cubeUV_minMipLevel 4.0 #define cubeUV_minTileSize 16.0 float getFace( vec3 direction ) { @@ -17551,7 +17579,7 @@ float F_Schlick( const in float f0, const in float f90, const in float dotVH ) { return vec4( mix( color0, color1, mipF ), 1.0 ); } } -#endif`, R1 = `vec3 transformedNormal = objectNormal; +#endif`, P1 = `vec3 transformedNormal = objectNormal; #ifdef USE_TANGENT vec3 transformedTangent = objectTangent; #endif @@ -17580,21 +17608,21 @@ transformedNormal = normalMatrix * transformedNormal; #ifdef FLIP_SIDED transformedTangent = - transformedTangent; #endif -#endif`, L1 = `#ifdef USE_DISPLACEMENTMAP +#endif`, R1 = `#ifdef USE_DISPLACEMENTMAP uniform sampler2D displacementMap; uniform float displacementScale; uniform float displacementBias; -#endif`, D1 = `#ifdef USE_DISPLACEMENTMAP +#endif`, L1 = `#ifdef USE_DISPLACEMENTMAP transformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias ); -#endif`, I1 = `#ifdef USE_EMISSIVEMAP +#endif`, D1 = `#ifdef USE_EMISSIVEMAP vec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv ); #ifdef DECODE_VIDEO_TEXTURE_EMISSIVE emissiveColor = sRGBTransferEOTF( emissiveColor ); #endif totalEmissiveRadiance *= emissiveColor.rgb; -#endif`, B1 = `#ifdef USE_EMISSIVEMAP +#endif`, I1 = `#ifdef USE_EMISSIVEMAP uniform sampler2D emissiveMap; -#endif`, N1 = "gl_FragColor = linearToOutputTexel( gl_FragColor );", k1 = `vec4 LinearTransferOETF( in vec4 value ) { +#endif`, B1 = "gl_FragColor = linearToOutputTexel( gl_FragColor );", N1 = `vec4 LinearTransferOETF( in vec4 value ) { return value; } vec4 sRGBTransferEOTF( in vec4 value ) { @@ -17602,7 +17630,7 @@ vec4 sRGBTransferEOTF( in vec4 value ) { } vec4 sRGBTransferOETF( in vec4 value ) { return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a ); -}`, U1 = `#ifdef USE_ENVMAP +}`, k1 = `#ifdef USE_ENVMAP #ifdef ENV_WORLDPOS vec3 cameraToFrag; if ( isOrthographic ) { @@ -17631,7 +17659,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { #elif defined( ENVMAP_BLENDING_ADD ) outgoingLight += envColor.xyz * specularStrength * reflectivity; #endif -#endif`, O1 = `#ifdef USE_ENVMAP +#endif`, U1 = `#ifdef USE_ENVMAP uniform float envMapIntensity; uniform float flipEnvMap; uniform mat3 envMapRotation; @@ -17640,7 +17668,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { #else uniform sampler2D envMap; #endif -#endif`, F1 = `#ifdef USE_ENVMAP +#endif`, O1 = `#ifdef USE_ENVMAP uniform float reflectivity; #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) #define ENV_WORLDPOS @@ -17651,7 +17679,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { #else varying vec3 vReflect; #endif -#endif`, z1 = `#ifdef USE_ENVMAP +#endif`, F1 = `#ifdef USE_ENVMAP #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) #define ENV_WORLDPOS #endif @@ -17662,7 +17690,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { varying vec3 vReflect; uniform float refractionRatio; #endif -#endif`, H1 = `#ifdef USE_ENVMAP +#endif`, z1 = `#ifdef USE_ENVMAP #ifdef ENV_WORLDPOS vWorldPosition = worldPosition.xyz; #else @@ -17679,18 +17707,18 @@ vec4 sRGBTransferOETF( in vec4 value ) { vReflect = refract( cameraToVertex, worldNormal, refractionRatio ); #endif #endif -#endif`, V1 = `#ifdef USE_FOG +#endif`, H1 = `#ifdef USE_FOG vFogDepth = - mvPosition.z; -#endif`, G1 = `#ifdef USE_FOG +#endif`, V1 = `#ifdef USE_FOG varying float vFogDepth; -#endif`, W1 = `#ifdef USE_FOG +#endif`, G1 = `#ifdef USE_FOG #ifdef FOG_EXP2 float fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth ); #else float fogFactor = smoothstep( fogNear, fogFar, vFogDepth ); #endif gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor ); -#endif`, X1 = `#ifdef USE_FOG +#endif`, W1 = `#ifdef USE_FOG uniform vec3 fogColor; varying float vFogDepth; #ifdef FOG_EXP2 @@ -17699,7 +17727,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { uniform float fogNear; uniform float fogFar; #endif -#endif`, j1 = `#ifdef USE_GRADIENTMAP +#endif`, X1 = `#ifdef USE_GRADIENTMAP uniform sampler2D gradientMap; #endif vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { @@ -17711,12 +17739,12 @@ vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { vec2 fw = fwidth( coord ) * 0.5; return mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) ); #endif -}`, q1 = `#ifdef USE_LIGHTMAP +}`, j1 = `#ifdef USE_LIGHTMAP uniform sampler2D lightMap; uniform float lightMapIntensity; -#endif`, Z1 = `LambertMaterial material; +#endif`, q1 = `LambertMaterial material; material.diffuseColor = diffuseColor.rgb; -material.specularStrength = specularStrength;`, Y1 = `varying vec3 vViewPosition; +material.specularStrength = specularStrength;`, Z1 = `varying vec3 vViewPosition; struct LambertMaterial { vec3 diffuseColor; float specularStrength; @@ -17730,7 +17758,7 @@ void RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometr reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); } #define RE_Direct RE_Direct_Lambert -#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert`, K1 = `uniform bool receiveShadow; +#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert`, Y1 = `uniform bool receiveShadow; uniform vec3 ambientLightColor; #if defined( USE_LIGHT_PROBES ) uniform vec3 lightProbe[ 9 ]; @@ -17846,7 +17874,7 @@ float getSpotAttenuation( const in float coneCosine, const in float penumbraCosi vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight ); return irradiance; } -#endif`, $1 = `#ifdef USE_ENVMAP +#endif`, K1 = `#ifdef USE_ENVMAP vec3 getIBLIrradiance( const in vec3 normal ) { #ifdef ENVMAP_TYPE_CUBE_UV vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); @@ -17879,8 +17907,8 @@ float getSpotAttenuation( const in float coneCosine, const in float penumbraCosi #endif } #endif -#endif`, J1 = `ToonMaterial material; -material.diffuseColor = diffuseColor.rgb;`, Q1 = `varying vec3 vViewPosition; +#endif`, $1 = `ToonMaterial material; +material.diffuseColor = diffuseColor.rgb;`, J1 = `varying vec3 vViewPosition; struct ToonMaterial { vec3 diffuseColor; }; @@ -17892,11 +17920,11 @@ void RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPo reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); } #define RE_Direct RE_Direct_Toon -#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon`, eb = `BlinnPhongMaterial material; +#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon`, Q1 = `BlinnPhongMaterial material; material.diffuseColor = diffuseColor.rgb; material.specularColor = specular; material.specularShininess = shininess; -material.specularStrength = specularStrength;`, tb = `varying vec3 vViewPosition; +material.specularStrength = specularStrength;`, eb = `varying vec3 vViewPosition; struct BlinnPhongMaterial { vec3 diffuseColor; vec3 specularColor; @@ -17913,7 +17941,7 @@ void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geom reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); } #define RE_Direct RE_Direct_BlinnPhong -#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong`, nb = `PhysicalMaterial material; +#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong`, tb = `PhysicalMaterial material; material.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor ); vec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) ); float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z ); @@ -17999,7 +18027,7 @@ material.roughness = min( material.roughness, 1.0 ); material.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) ); material.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y; material.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y; -#endif`, ib = `uniform sampler2D dfgLUT; +#endif`, nb = `uniform sampler2D dfgLUT; struct PhysicalMaterial { vec3 diffuseColor; float roughness; @@ -18315,7 +18343,7 @@ void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradia #define RE_IndirectSpecular RE_IndirectSpecular_Physical float computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) { return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion ); -}`, sb = ` +}`, ib = ` vec3 geometryPosition = - vViewPosition; vec3 geometryNormal = normal; vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition ); @@ -18430,7 +18458,7 @@ IncidentLight directLight; #if defined( RE_IndirectSpecular ) vec3 radiance = vec3( 0.0 ); vec3 clearcoatRadiance = vec3( 0.0 ); -#endif`, rb = `#if defined( RE_IndirectDiffuse ) +#endif`, sb = `#if defined( RE_IndirectDiffuse ) #ifdef USE_LIGHTMAP vec4 lightMapTexel = texture2D( lightMap, vLightMapUv ); vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity; @@ -18449,32 +18477,32 @@ IncidentLight directLight; #ifdef USE_CLEARCOAT clearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness ); #endif -#endif`, ob = `#if defined( RE_IndirectDiffuse ) +#endif`, rb = `#if defined( RE_IndirectDiffuse ) RE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); #endif #if defined( RE_IndirectSpecular ) RE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); -#endif`, ab = `#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) +#endif`, ob = `#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5; -#endif`, lb = `#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) +#endif`, ab = `#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) uniform float logDepthBufFC; varying float vFragDepth; varying float vIsPerspective; -#endif`, cb = `#ifdef USE_LOGARITHMIC_DEPTH_BUFFER +#endif`, lb = `#ifdef USE_LOGARITHMIC_DEPTH_BUFFER varying float vFragDepth; varying float vIsPerspective; -#endif`, hb = `#ifdef USE_LOGARITHMIC_DEPTH_BUFFER +#endif`, cb = `#ifdef USE_LOGARITHMIC_DEPTH_BUFFER vFragDepth = 1.0 + gl_Position.w; vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) ); -#endif`, ub = `#ifdef USE_MAP +#endif`, hb = `#ifdef USE_MAP vec4 sampledDiffuseColor = texture2D( map, vMapUv ); #ifdef DECODE_VIDEO_TEXTURE sampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor ); #endif diffuseColor *= sampledDiffuseColor; -#endif`, db = `#ifdef USE_MAP +#endif`, ub = `#ifdef USE_MAP uniform sampler2D map; -#endif`, fb = `#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) +#endif`, db = `#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) #if defined( USE_POINTS_UV ) vec2 uv = vUv; #else @@ -18486,7 +18514,7 @@ IncidentLight directLight; #endif #ifdef USE_ALPHAMAP diffuseColor.a *= texture2D( alphaMap, uv ).g; -#endif`, pb = `#if defined( USE_POINTS_UV ) +#endif`, fb = `#if defined( USE_POINTS_UV ) varying vec2 vUv; #else #if defined( USE_MAP ) || defined( USE_ALPHAMAP ) @@ -18498,19 +18526,19 @@ IncidentLight directLight; #endif #ifdef USE_ALPHAMAP uniform sampler2D alphaMap; -#endif`, mb = `float metalnessFactor = metalness; +#endif`, pb = `float metalnessFactor = metalness; #ifdef USE_METALNESSMAP vec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv ); metalnessFactor *= texelMetalness.b; -#endif`, gb = `#ifdef USE_METALNESSMAP +#endif`, mb = `#ifdef USE_METALNESSMAP uniform sampler2D metalnessMap; -#endif`, xb = `#ifdef USE_INSTANCING_MORPH +#endif`, gb = `#ifdef USE_INSTANCING_MORPH float morphTargetInfluences[ MORPHTARGETS_COUNT ]; float morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { morphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r; } -#endif`, vb = `#if defined( USE_MORPHCOLORS ) +#endif`, xb = `#if defined( USE_MORPHCOLORS ) vColor *= morphTargetBaseInfluence; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { #if defined( USE_COLOR_ALPHA ) @@ -18519,12 +18547,12 @@ IncidentLight directLight; if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ]; #endif } -#endif`, bb = `#ifdef USE_MORPHNORMALS +#endif`, vb = `#ifdef USE_MORPHNORMALS objectNormal *= morphTargetBaseInfluence; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ]; } -#endif`, yb = `#ifdef USE_MORPHTARGETS +#endif`, bb = `#ifdef USE_MORPHTARGETS #ifndef USE_INSTANCING_MORPH uniform float morphTargetBaseInfluence; uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ]; @@ -18538,12 +18566,12 @@ IncidentLight directLight; ivec3 morphUV = ivec3( x, y, morphTargetIndex ); return texelFetch( morphTargetsTexture, morphUV, 0 ); } -#endif`, _b = `#ifdef USE_MORPHTARGETS +#endif`, yb = `#ifdef USE_MORPHTARGETS transformed *= morphTargetBaseInfluence; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ]; } -#endif`, Mb = `float faceDirection = gl_FrontFacing ? 1.0 : - 1.0; +#endif`, _b = `float faceDirection = gl_FrontFacing ? 1.0 : - 1.0; #ifdef FLAT_SHADED vec3 fdx = dFdx( vViewPosition ); vec3 fdy = dFdy( vViewPosition ); @@ -18584,7 +18612,7 @@ IncidentLight directLight; tbn2[1] *= faceDirection; #endif #endif -vec3 nonPerturbedNormal = normal;`, wb = `#ifdef USE_NORMALMAP_OBJECTSPACE +vec3 nonPerturbedNormal = normal;`, Mb = `#ifdef USE_NORMALMAP_OBJECTSPACE normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0; #ifdef FLIP_SIDED normal = - normal; @@ -18599,6 +18627,12 @@ vec3 nonPerturbedNormal = normal;`, wb = `#ifdef USE_NORMALMAP_OBJECTSPACE normal = normalize( tbn * mapN ); #elif defined( USE_BUMPMAP ) normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection ); +#endif`, wb = `#ifndef FLAT_SHADED + varying vec3 vNormal; + #ifdef USE_TANGENT + varying vec3 vTangent; + varying vec3 vBitangent; + #endif #endif`, Sb = `#ifndef FLAT_SHADED varying vec3 vNormal; #ifdef USE_TANGENT @@ -18606,18 +18640,12 @@ vec3 nonPerturbedNormal = normal;`, wb = `#ifdef USE_NORMALMAP_OBJECTSPACE varying vec3 vBitangent; #endif #endif`, Eb = `#ifndef FLAT_SHADED - varying vec3 vNormal; - #ifdef USE_TANGENT - varying vec3 vTangent; - varying vec3 vBitangent; - #endif -#endif`, Tb = `#ifndef FLAT_SHADED vNormal = normalize( transformedNormal ); #ifdef USE_TANGENT vTangent = normalize( transformedTangent ); vBitangent = normalize( cross( vNormal, vTangent ) * tangent.w ); #endif -#endif`, Ab = `#ifdef USE_NORMALMAP +#endif`, Tb = `#ifdef USE_NORMALMAP uniform sampler2D normalMap; uniform vec2 normalScale; #endif @@ -18639,13 +18667,13 @@ vec3 nonPerturbedNormal = normal;`, wb = `#ifdef USE_NORMALMAP_OBJECTSPACE float scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det ); return mat3( T * scale, B * scale, N ); } -#endif`, Cb = `#ifdef USE_CLEARCOAT +#endif`, Ab = `#ifdef USE_CLEARCOAT vec3 clearcoatNormal = nonPerturbedNormal; -#endif`, Pb = `#ifdef USE_CLEARCOAT_NORMALMAP +#endif`, Cb = `#ifdef USE_CLEARCOAT_NORMALMAP vec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0; clearcoatMapN.xy *= clearcoatNormalScale; clearcoatNormal = normalize( tbn2 * clearcoatMapN ); -#endif`, Rb = `#ifdef USE_CLEARCOATMAP +#endif`, Pb = `#ifdef USE_CLEARCOATMAP uniform sampler2D clearcoatMap; #endif #ifdef USE_CLEARCOAT_NORMALMAP @@ -18654,18 +18682,18 @@ vec3 nonPerturbedNormal = normal;`, wb = `#ifdef USE_NORMALMAP_OBJECTSPACE #endif #ifdef USE_CLEARCOAT_ROUGHNESSMAP uniform sampler2D clearcoatRoughnessMap; -#endif`, Lb = `#ifdef USE_IRIDESCENCEMAP +#endif`, Rb = `#ifdef USE_IRIDESCENCEMAP uniform sampler2D iridescenceMap; #endif #ifdef USE_IRIDESCENCE_THICKNESSMAP uniform sampler2D iridescenceThicknessMap; -#endif`, Db = `#ifdef OPAQUE +#endif`, Lb = `#ifdef OPAQUE diffuseColor.a = 1.0; #endif #ifdef USE_TRANSMISSION diffuseColor.a *= material.transmissionAlpha; #endif -gl_FragColor = vec4( outgoingLight, diffuseColor.a );`, Ib = `vec3 packNormalToRGB( const in vec3 normal ) { +gl_FragColor = vec4( outgoingLight, diffuseColor.a );`, Db = `vec3 packNormalToRGB( const in vec3 normal ) { return normalize( normal ) * 0.5 + 0.5; } vec3 unpackRGBToNormal( const in vec3 rgb ) { @@ -18734,9 +18762,9 @@ float viewZToPerspectiveDepth( const in float viewZ, const in float near, const } float perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) { return ( near * far ) / ( ( far - near ) * depth - far ); -}`, Bb = `#ifdef PREMULTIPLIED_ALPHA +}`, Ib = `#ifdef PREMULTIPLIED_ALPHA gl_FragColor.rgb *= gl_FragColor.a; -#endif`, Nb = `vec4 mvPosition = vec4( transformed, 1.0 ); +#endif`, Bb = `vec4 mvPosition = vec4( transformed, 1.0 ); #ifdef USE_BATCHING mvPosition = batchingMatrix * mvPosition; #endif @@ -18744,22 +18772,22 @@ float perspectiveDepthToViewZ( const in float depth, const in float near, const mvPosition = instanceMatrix * mvPosition; #endif mvPosition = modelViewMatrix * mvPosition; -gl_Position = projectionMatrix * mvPosition;`, kb = `#ifdef DITHERING +gl_Position = projectionMatrix * mvPosition;`, Nb = `#ifdef DITHERING gl_FragColor.rgb = dithering( gl_FragColor.rgb ); -#endif`, Ub = `#ifdef DITHERING +#endif`, kb = `#ifdef DITHERING vec3 dithering( vec3 color ) { float grid_position = rand( gl_FragCoord.xy ); vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 ); dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position ); return color + dither_shift_RGB; } -#endif`, Ob = `float roughnessFactor = roughness; +#endif`, Ub = `float roughnessFactor = roughness; #ifdef USE_ROUGHNESSMAP vec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv ); roughnessFactor *= texelRoughness.g; -#endif`, Fb = `#ifdef USE_ROUGHNESSMAP +#endif`, Ob = `#ifdef USE_ROUGHNESSMAP uniform sampler2D roughnessMap; -#endif`, zb = `#if NUM_SPOT_LIGHT_COORDS > 0 +#endif`, Fb = `#if NUM_SPOT_LIGHT_COORDS > 0 varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; #endif #if NUM_SPOT_LIGHT_MAPS > 0 @@ -18954,7 +18982,7 @@ gl_Position = projectionMatrix * mvPosition;`, kb = `#ifdef DITHERING } return mix( 1.0, shadow, shadowIntensity ); } -#endif`, Hb = `#if NUM_SPOT_LIGHT_COORDS > 0 +#endif`, zb = `#if NUM_SPOT_LIGHT_COORDS > 0 uniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ]; varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; #endif @@ -18995,7 +19023,7 @@ gl_Position = projectionMatrix * mvPosition;`, kb = `#ifdef DITHERING }; uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ]; #endif -#endif`, Vb = `#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 ) +#endif`, Hb = `#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 ) vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix ); vec4 shadowWorldPosition; #endif @@ -19027,7 +19055,7 @@ gl_Position = projectionMatrix * mvPosition;`, kb = `#ifdef DITHERING vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition; } #pragma unroll_loop_end -#endif`, Gb = `float getShadowMask() { +#endif`, Vb = `float getShadowMask() { float shadow = 1.0; #ifdef USE_SHADOWMAP #if NUM_DIR_LIGHT_SHADOWS > 0 @@ -19059,12 +19087,12 @@ gl_Position = projectionMatrix * mvPosition;`, kb = `#ifdef DITHERING #endif #endif return shadow; -}`, Wb = `#ifdef USE_SKINNING +}`, Gb = `#ifdef USE_SKINNING mat4 boneMatX = getBoneMatrix( skinIndex.x ); mat4 boneMatY = getBoneMatrix( skinIndex.y ); mat4 boneMatZ = getBoneMatrix( skinIndex.z ); mat4 boneMatW = getBoneMatrix( skinIndex.w ); -#endif`, Xb = `#ifdef USE_SKINNING +#endif`, Wb = `#ifdef USE_SKINNING uniform mat4 bindMatrix; uniform mat4 bindMatrixInverse; uniform highp sampler2D boneTexture; @@ -19079,7 +19107,7 @@ gl_Position = projectionMatrix * mvPosition;`, kb = `#ifdef DITHERING vec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 ); return mat4( v1, v2, v3, v4 ); } -#endif`, jb = `#ifdef USE_SKINNING +#endif`, Xb = `#ifdef USE_SKINNING vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 ); vec4 skinned = vec4( 0.0 ); skinned += boneMatX * skinVertex * skinWeight.x; @@ -19087,7 +19115,7 @@ gl_Position = projectionMatrix * mvPosition;`, kb = `#ifdef DITHERING skinned += boneMatZ * skinVertex * skinWeight.z; skinned += boneMatW * skinVertex * skinWeight.w; transformed = ( bindMatrixInverse * skinned ).xyz; -#endif`, qb = `#ifdef USE_SKINNING +#endif`, jb = `#ifdef USE_SKINNING mat4 skinMatrix = mat4( 0.0 ); skinMatrix += skinWeight.x * boneMatX; skinMatrix += skinWeight.y * boneMatY; @@ -19098,17 +19126,17 @@ gl_Position = projectionMatrix * mvPosition;`, kb = `#ifdef DITHERING #ifdef USE_TANGENT objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz; #endif -#endif`, Zb = `float specularStrength; +#endif`, qb = `float specularStrength; #ifdef USE_SPECULARMAP vec4 texelSpecular = texture2D( specularMap, vSpecularMapUv ); specularStrength = texelSpecular.r; #else specularStrength = 1.0; -#endif`, Yb = `#ifdef USE_SPECULARMAP +#endif`, Zb = `#ifdef USE_SPECULARMAP uniform sampler2D specularMap; -#endif`, Kb = `#if defined( TONE_MAPPING ) +#endif`, Yb = `#if defined( TONE_MAPPING ) gl_FragColor.rgb = toneMapping( gl_FragColor.rgb ); -#endif`, $b = `#ifndef saturate +#endif`, Kb = `#ifndef saturate #define saturate( a ) clamp( a, 0.0, 1.0 ) #endif uniform float toneMappingExposure; @@ -19205,7 +19233,7 @@ vec3 NeutralToneMapping( vec3 color ) { float g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. ); return mix( color, vec3( newPeak ), g ); } -vec3 CustomToneMapping( vec3 color ) { return color; }`, Jb = `#ifdef USE_TRANSMISSION +vec3 CustomToneMapping( vec3 color ) { return color; }`, $b = `#ifdef USE_TRANSMISSION material.transmission = transmission; material.transmissionAlpha = 1.0; material.thickness = thickness; @@ -19226,7 +19254,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`, Jb = `#ifdef USE_TRANSM material.attenuationColor, material.attenuationDistance ); material.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission ); totalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission ); -#endif`, Qb = `#ifdef USE_TRANSMISSION +#endif`, Jb = `#ifdef USE_TRANSMISSION uniform float transmission; uniform float thickness; uniform float attenuationDistance; @@ -19352,7 +19380,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`, Jb = `#ifdef USE_TRANSM float transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0; return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor ); } -#endif`, ey = `#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`, Qb = `#if defined( USE_UV ) || defined( USE_ANISOTROPY ) varying vec2 vUv; #endif #ifdef USE_MAP @@ -19422,7 +19450,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`, Jb = `#ifdef USE_TRANSM #ifdef USE_THICKNESSMAP uniform mat3 thicknessMapTransform; varying vec2 vThicknessMapUv; -#endif`, ty = `#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`, ey = `#if defined( USE_UV ) || defined( USE_ANISOTROPY ) varying vec2 vUv; #endif #ifdef USE_MAP @@ -19516,7 +19544,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`, Jb = `#ifdef USE_TRANSM #ifdef USE_THICKNESSMAP uniform mat3 thicknessMapTransform; varying vec2 vThicknessMapUv; -#endif`, ny = `#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`, ty = `#if defined( USE_UV ) || defined( USE_ANISOTROPY ) vUv = vec3( uv, 1 ).xy; #endif #ifdef USE_MAP @@ -19587,7 +19615,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`, Jb = `#ifdef USE_TRANSM #endif #ifdef USE_THICKNESSMAP vThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy; -#endif`, iy = `#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0 +#endif`, ny = `#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0 vec4 worldPosition = vec4( transformed, 1.0 ); #ifdef USE_BATCHING worldPosition = batchingMatrix * worldPosition; @@ -19597,12 +19625,12 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`, Jb = `#ifdef USE_TRANSM #endif worldPosition = modelMatrix * worldPosition; #endif`; -const sy = `varying vec2 vUv; +const iy = `varying vec2 vUv; uniform mat3 uvTransform; void main() { vUv = ( uvTransform * vec3( uv, 1 ) ).xy; gl_Position = vec4( position.xy, 1.0, 1.0 ); -}`, ry = `uniform sampler2D t2D; +}`, sy = `uniform sampler2D t2D; uniform float backgroundIntensity; varying vec2 vUv; void main() { @@ -19614,14 +19642,14 @@ void main() { gl_FragColor = texColor; #include #include -}`, oy = `varying vec3 vWorldDirection; +}`, ry = `varying vec3 vWorldDirection; #include void main() { vWorldDirection = transformDirection( position, modelMatrix ); #include #include gl_Position.z = gl_Position.w; -}`, ay = `#ifdef ENVMAP_TYPE_CUBE +}`, oy = `#ifdef ENVMAP_TYPE_CUBE uniform samplerCube envMap; #elif defined( ENVMAP_TYPE_CUBE_UV ) uniform sampler2D envMap; @@ -19644,14 +19672,14 @@ void main() { gl_FragColor = texColor; #include #include -}`, ly = `varying vec3 vWorldDirection; +}`, ay = `varying vec3 vWorldDirection; #include void main() { vWorldDirection = transformDirection( position, modelMatrix ); #include #include gl_Position.z = gl_Position.w; -}`, cy = `uniform samplerCube tCube; +}`, ly = `uniform samplerCube tCube; uniform float tFlip; uniform float opacity; varying vec3 vWorldDirection; @@ -19661,7 +19689,7 @@ void main() { gl_FragColor.a *= opacity; #include #include -}`, hy = `#include +}`, cy = `#include #include #include #include @@ -19688,7 +19716,7 @@ void main() { #include #include vHighPrecisionZW = gl_Position.zw; -}`, uy = `#if DEPTH_PACKING == 3200 +}`, hy = `#if DEPTH_PACKING == 3200 uniform float opacity; #endif #include @@ -19726,7 +19754,7 @@ void main() { #elif DEPTH_PACKING == 3203 gl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 ); #endif -}`, dy = `#define DISTANCE +}`, uy = `#define DISTANCE varying vec3 vWorldPosition; #include #include @@ -19753,7 +19781,7 @@ void main() { #include #include vWorldPosition = worldPosition.xyz; -}`, fy = `#define DISTANCE +}`, dy = `#define DISTANCE uniform vec3 referencePosition; uniform float nearDistance; uniform float farDistance; @@ -19777,13 +19805,13 @@ void main () { dist = ( dist - nearDistance ) / ( farDistance - nearDistance ); dist = saturate( dist ); gl_FragColor = packDepthToRGBA( dist ); -}`, py = `varying vec3 vWorldDirection; +}`, fy = `varying vec3 vWorldDirection; #include void main() { vWorldDirection = transformDirection( position, modelMatrix ); #include #include -}`, my = `uniform sampler2D tEquirect; +}`, py = `uniform sampler2D tEquirect; varying vec3 vWorldDirection; #include void main() { @@ -19792,7 +19820,7 @@ void main() { gl_FragColor = texture2D( tEquirect, sampleUV ); #include #include -}`, gy = `uniform float scale; +}`, my = `uniform float scale; attribute float lineDistance; varying float vLineDistance; #include @@ -19814,7 +19842,7 @@ void main() { #include #include #include -}`, xy = `uniform vec3 diffuse; +}`, gy = `uniform vec3 diffuse; uniform float opacity; uniform float dashSize; uniform float totalSize; @@ -19842,7 +19870,7 @@ void main() { #include #include #include -}`, vy = `#include +}`, xy = `#include #include #include #include @@ -19874,7 +19902,7 @@ void main() { #include #include #include -}`, by = `uniform vec3 diffuse; +}`, vy = `uniform vec3 diffuse; uniform float opacity; #ifndef FLAT_SHADED varying vec3 vNormal; @@ -19922,7 +19950,7 @@ void main() { #include #include #include -}`, yy = `#define LAMBERT +}`, by = `#define LAMBERT varying vec3 vViewPosition; #include #include @@ -19961,7 +19989,7 @@ void main() { #include #include #include -}`, _y = `#define LAMBERT +}`, yy = `#define LAMBERT uniform vec3 diffuse; uniform vec3 emissive; uniform float opacity; @@ -20018,7 +20046,7 @@ void main() { #include #include #include -}`, My = `#define MATCAP +}`, _y = `#define MATCAP varying vec3 vViewPosition; #include #include @@ -20052,7 +20080,7 @@ void main() { #include #include vViewPosition = - mvPosition.xyz; -}`, wy = `#define MATCAP +}`, My = `#define MATCAP uniform vec3 diffuse; uniform float opacity; uniform sampler2D matcap; @@ -20098,7 +20126,7 @@ void main() { #include #include #include -}`, Sy = `#define NORMAL +}`, wy = `#define NORMAL #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) varying vec3 vViewPosition; #endif @@ -20131,7 +20159,7 @@ void main() { #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) vViewPosition = - mvPosition.xyz; #endif -}`, Ey = `#define NORMAL +}`, Sy = `#define NORMAL uniform float opacity; #if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE ) varying vec3 vViewPosition; @@ -20153,7 +20181,7 @@ void main() { #ifdef OPAQUE gl_FragColor.a = 1.0; #endif -}`, Ty = `#define PHONG +}`, Ey = `#define PHONG varying vec3 vViewPosition; #include #include @@ -20192,7 +20220,7 @@ void main() { #include #include #include -}`, Ay = `#define PHONG +}`, Ty = `#define PHONG uniform vec3 diffuse; uniform vec3 emissive; uniform vec3 specular; @@ -20251,7 +20279,7 @@ void main() { #include #include #include -}`, Cy = `#define STANDARD +}`, Ay = `#define STANDARD varying vec3 vViewPosition; #ifdef USE_TRANSMISSION varying vec3 vWorldPosition; @@ -20294,7 +20322,7 @@ void main() { #ifdef USE_TRANSMISSION vWorldPosition = worldPosition.xyz; #endif -}`, Py = `#define STANDARD +}`, Cy = `#define STANDARD #ifdef PHYSICAL #define IOR #define USE_SPECULAR @@ -20419,7 +20447,7 @@ void main() { #include #include #include -}`, Ry = `#define TOON +}`, Py = `#define TOON varying vec3 vViewPosition; #include #include @@ -20456,7 +20484,7 @@ void main() { #include #include #include -}`, Ly = `#define TOON +}`, Ry = `#define TOON uniform vec3 diffuse; uniform vec3 emissive; uniform float opacity; @@ -20509,7 +20537,7 @@ void main() { #include #include #include -}`, Dy = `uniform float size; +}`, Ly = `uniform float size; uniform float scale; #include #include @@ -20540,7 +20568,7 @@ void main() { #include #include #include -}`, Iy = `uniform vec3 diffuse; +}`, Dy = `uniform vec3 diffuse; uniform float opacity; #include #include @@ -20565,7 +20593,7 @@ void main() { #include #include #include -}`, By = `#include +}`, Iy = `#include #include #include #include @@ -20588,7 +20616,7 @@ void main() { #include #include #include -}`, Ny = `uniform vec3 color; +}`, By = `uniform vec3 color; uniform float opacity; #include #include @@ -20604,7 +20632,7 @@ void main() { #include #include #include -}`, ky = `uniform float rotation; +}`, Ny = `uniform float rotation; uniform vec2 center; #include #include @@ -20628,7 +20656,7 @@ void main() { #include #include #include -}`, Uy = `uniform vec3 diffuse; +}`, ky = `uniform vec3 diffuse; uniform float opacity; #include #include @@ -20654,147 +20682,147 @@ void main() { #include #include }`, Qe = { - alphahash_fragment: r1, - alphahash_pars_fragment: o1, - alphamap_fragment: a1, - alphamap_pars_fragment: l1, - alphatest_fragment: c1, - alphatest_pars_fragment: h1, - aomap_fragment: u1, - aomap_pars_fragment: d1, - batching_pars_vertex: f1, - batching_vertex: p1, - begin_vertex: m1, - beginnormal_vertex: g1, - bsdfs: x1, - iridescence_fragment: v1, - bumpmap_pars_fragment: b1, - clipping_planes_fragment: y1, - clipping_planes_pars_fragment: _1, - clipping_planes_pars_vertex: M1, - clipping_planes_vertex: w1, - color_fragment: S1, - color_pars_fragment: E1, - color_pars_vertex: T1, - color_vertex: A1, - common: C1, - cube_uv_reflection_fragment: P1, - defaultnormal_vertex: R1, - displacementmap_pars_vertex: L1, - displacementmap_vertex: D1, - emissivemap_fragment: I1, - emissivemap_pars_fragment: B1, - colorspace_fragment: N1, - colorspace_pars_fragment: k1, - envmap_fragment: U1, - envmap_common_pars_fragment: O1, - envmap_pars_fragment: F1, - envmap_pars_vertex: z1, - envmap_physical_pars_fragment: $1, - envmap_vertex: H1, - fog_vertex: V1, - fog_pars_vertex: G1, - fog_fragment: W1, - fog_pars_fragment: X1, - gradientmap_pars_fragment: j1, - lightmap_pars_fragment: q1, - lights_lambert_fragment: Z1, - lights_lambert_pars_fragment: Y1, - lights_pars_begin: K1, - lights_toon_fragment: J1, - lights_toon_pars_fragment: Q1, - lights_phong_fragment: eb, - lights_phong_pars_fragment: tb, - lights_physical_fragment: nb, - lights_physical_pars_fragment: ib, - lights_fragment_begin: sb, - lights_fragment_maps: rb, - lights_fragment_end: ob, - logdepthbuf_fragment: ab, - logdepthbuf_pars_fragment: lb, - logdepthbuf_pars_vertex: cb, - logdepthbuf_vertex: hb, - map_fragment: ub, - map_pars_fragment: db, - map_particle_fragment: fb, - map_particle_pars_fragment: pb, - metalnessmap_fragment: mb, - metalnessmap_pars_fragment: gb, - morphinstance_vertex: xb, - morphcolor_vertex: vb, - morphnormal_vertex: bb, - morphtarget_pars_vertex: yb, - morphtarget_vertex: _b, - normal_fragment_begin: Mb, - normal_fragment_maps: wb, - normal_pars_fragment: Sb, - normal_pars_vertex: Eb, - normal_vertex: Tb, - normalmap_pars_fragment: Ab, - clearcoat_normal_fragment_begin: Cb, - clearcoat_normal_fragment_maps: Pb, - clearcoat_pars_fragment: Rb, - iridescence_pars_fragment: Lb, - opaque_fragment: Db, - packing: Ib, - premultiplied_alpha_fragment: Bb, - project_vertex: Nb, - dithering_fragment: kb, - dithering_pars_fragment: Ub, - roughnessmap_fragment: Ob, - roughnessmap_pars_fragment: Fb, - shadowmap_pars_fragment: zb, - shadowmap_pars_vertex: Hb, - shadowmap_vertex: Vb, - shadowmask_pars_fragment: Gb, - skinbase_vertex: Wb, - skinning_pars_vertex: Xb, - skinning_vertex: jb, - skinnormal_vertex: qb, - specularmap_fragment: Zb, - specularmap_pars_fragment: Yb, - tonemapping_fragment: Kb, - tonemapping_pars_fragment: $b, - transmission_fragment: Jb, - transmission_pars_fragment: Qb, - uv_pars_fragment: ey, - uv_pars_vertex: ty, - uv_vertex: ny, - worldpos_vertex: iy, - background_vert: sy, - background_frag: ry, - backgroundCube_vert: oy, - backgroundCube_frag: ay, - cube_vert: ly, - cube_frag: cy, - depth_vert: hy, - depth_frag: uy, - distanceRGBA_vert: dy, - distanceRGBA_frag: fy, - equirect_vert: py, - equirect_frag: my, - linedashed_vert: gy, - linedashed_frag: xy, - meshbasic_vert: vy, - meshbasic_frag: by, - meshlambert_vert: yy, - meshlambert_frag: _y, - meshmatcap_vert: My, - meshmatcap_frag: wy, - meshnormal_vert: Sy, - meshnormal_frag: Ey, - meshphong_vert: Ty, - meshphong_frag: Ay, - meshphysical_vert: Cy, - meshphysical_frag: Py, - meshtoon_vert: Ry, - meshtoon_frag: Ly, - points_vert: Dy, - points_frag: Iy, - shadow_vert: By, - shadow_frag: Ny, - sprite_vert: ky, - sprite_frag: Uy + alphahash_fragment: s1, + alphahash_pars_fragment: r1, + alphamap_fragment: o1, + alphamap_pars_fragment: a1, + alphatest_fragment: l1, + alphatest_pars_fragment: c1, + aomap_fragment: h1, + aomap_pars_fragment: u1, + batching_pars_vertex: d1, + batching_vertex: f1, + begin_vertex: p1, + beginnormal_vertex: m1, + bsdfs: g1, + iridescence_fragment: x1, + bumpmap_pars_fragment: v1, + clipping_planes_fragment: b1, + clipping_planes_pars_fragment: y1, + clipping_planes_pars_vertex: _1, + clipping_planes_vertex: M1, + color_fragment: w1, + color_pars_fragment: S1, + color_pars_vertex: E1, + color_vertex: T1, + common: A1, + cube_uv_reflection_fragment: C1, + defaultnormal_vertex: P1, + displacementmap_pars_vertex: R1, + displacementmap_vertex: L1, + emissivemap_fragment: D1, + emissivemap_pars_fragment: I1, + colorspace_fragment: B1, + colorspace_pars_fragment: N1, + envmap_fragment: k1, + envmap_common_pars_fragment: U1, + envmap_pars_fragment: O1, + envmap_pars_vertex: F1, + envmap_physical_pars_fragment: K1, + envmap_vertex: z1, + fog_vertex: H1, + fog_pars_vertex: V1, + fog_fragment: G1, + fog_pars_fragment: W1, + gradientmap_pars_fragment: X1, + lightmap_pars_fragment: j1, + lights_lambert_fragment: q1, + lights_lambert_pars_fragment: Z1, + lights_pars_begin: Y1, + lights_toon_fragment: $1, + lights_toon_pars_fragment: J1, + lights_phong_fragment: Q1, + lights_phong_pars_fragment: eb, + lights_physical_fragment: tb, + lights_physical_pars_fragment: nb, + lights_fragment_begin: ib, + lights_fragment_maps: sb, + lights_fragment_end: rb, + logdepthbuf_fragment: ob, + logdepthbuf_pars_fragment: ab, + logdepthbuf_pars_vertex: lb, + logdepthbuf_vertex: cb, + map_fragment: hb, + map_pars_fragment: ub, + map_particle_fragment: db, + map_particle_pars_fragment: fb, + metalnessmap_fragment: pb, + metalnessmap_pars_fragment: mb, + morphinstance_vertex: gb, + morphcolor_vertex: xb, + morphnormal_vertex: vb, + morphtarget_pars_vertex: bb, + morphtarget_vertex: yb, + normal_fragment_begin: _b, + normal_fragment_maps: Mb, + normal_pars_fragment: wb, + normal_pars_vertex: Sb, + normal_vertex: Eb, + normalmap_pars_fragment: Tb, + clearcoat_normal_fragment_begin: Ab, + clearcoat_normal_fragment_maps: Cb, + clearcoat_pars_fragment: Pb, + iridescence_pars_fragment: Rb, + opaque_fragment: Lb, + packing: Db, + premultiplied_alpha_fragment: Ib, + project_vertex: Bb, + dithering_fragment: Nb, + dithering_pars_fragment: kb, + roughnessmap_fragment: Ub, + roughnessmap_pars_fragment: Ob, + shadowmap_pars_fragment: Fb, + shadowmap_pars_vertex: zb, + shadowmap_vertex: Hb, + shadowmask_pars_fragment: Vb, + skinbase_vertex: Gb, + skinning_pars_vertex: Wb, + skinning_vertex: Xb, + skinnormal_vertex: jb, + specularmap_fragment: qb, + specularmap_pars_fragment: Zb, + tonemapping_fragment: Yb, + tonemapping_pars_fragment: Kb, + transmission_fragment: $b, + transmission_pars_fragment: Jb, + uv_pars_fragment: Qb, + uv_pars_vertex: ey, + uv_vertex: ty, + worldpos_vertex: ny, + background_vert: iy, + background_frag: sy, + backgroundCube_vert: ry, + backgroundCube_frag: oy, + cube_vert: ay, + cube_frag: ly, + depth_vert: cy, + depth_frag: hy, + distanceRGBA_vert: uy, + distanceRGBA_frag: dy, + equirect_vert: fy, + equirect_frag: py, + linedashed_vert: my, + linedashed_frag: gy, + meshbasic_vert: xy, + meshbasic_frag: vy, + meshlambert_vert: by, + meshlambert_frag: yy, + meshmatcap_vert: _y, + meshmatcap_frag: My, + meshnormal_vert: wy, + meshnormal_frag: Sy, + meshphong_vert: Ey, + meshphong_frag: Ty, + meshphysical_vert: Ay, + meshphysical_frag: Cy, + meshtoon_vert: Py, + meshtoon_frag: Ry, + points_vert: Ly, + points_frag: Dy, + shadow_vert: Iy, + shadow_frag: By, + sprite_vert: Ny, + sprite_frag: ky }, Pe = { common: { diffuse: { value: /* @__PURE__ */ new Fe(16777215) }, @@ -21235,8 +21263,8 @@ ri.physical = { vertexShader: Qe.meshphysical_vert, fragmentShader: Qe.meshphysical_frag }; -const _a = { r: 0, b: 0, g: 0 }, as = /* @__PURE__ */ new wn(), Oy = /* @__PURE__ */ new ze(); -function Fy(s, e, t, n, i, r, o) { +const _a = { r: 0, b: 0, g: 0 }, as = /* @__PURE__ */ new wn(), Uy = /* @__PURE__ */ new ze(); +function Oy(s, e, t, n, i, r, o) { const a = new Fe(0); let l = r === !0 ? 0 : 1, c, h, u = null, d = 0, f = null; function p(v) { @@ -21271,7 +21299,7 @@ function Fy(s, e, t, n, i, r, o) { get: function() { return this.uniforms.envMap.value; } - }), i.update(h)), as.copy(y.backgroundRotation), as.x *= -1, as.y *= -1, as.z *= -1, M.isCubeTexture && M.isRenderTargetTexture === !1 && (as.y *= -1, as.z *= -1), h.material.uniforms.envMap.value = M, h.material.uniforms.flipEnvMap.value = M.isCubeTexture && M.isRenderTargetTexture === !1 ? -1 : 1, h.material.uniforms.backgroundBlurriness.value = y.backgroundBlurriness, h.material.uniforms.backgroundIntensity.value = y.backgroundIntensity, h.material.uniforms.backgroundRotation.value.setFromMatrix4(Oy.makeRotationFromEuler(as)), h.material.toneMapped = st.getTransfer(M.colorSpace) !== lt, (u !== M || d !== M.version || f !== s.toneMapping) && (h.material.needsUpdate = !0, u = M, d = M.version, f = s.toneMapping), h.layers.enableAll(), v.unshift(h, h.geometry, h.material, 0, 0, null)) : M && M.isTexture && (c === void 0 && (c = new dt( + }), i.update(h)), as.copy(y.backgroundRotation), as.x *= -1, as.y *= -1, as.z *= -1, M.isCubeTexture && M.isRenderTargetTexture === !1 && (as.y *= -1, as.z *= -1), h.material.uniforms.envMap.value = M, h.material.uniforms.flipEnvMap.value = M.isCubeTexture && M.isRenderTargetTexture === !1 ? -1 : 1, h.material.uniforms.backgroundBlurriness.value = y.backgroundBlurriness, h.material.uniforms.backgroundIntensity.value = y.backgroundIntensity, h.material.uniforms.backgroundRotation.value.setFromMatrix4(Uy.makeRotationFromEuler(as)), h.material.toneMapped = st.getTransfer(M.colorSpace) !== lt, (u !== M || d !== M.version || f !== s.toneMapping) && (h.material.needsUpdate = !0, u = M, d = M.version, f = s.toneMapping), h.layers.enableAll(), v.unshift(h, h.geometry, h.material, 0, 0, null)) : M && M.isTexture && (c === void 0 && (c = new dt( new ko(2, 2), new Ut({ name: "BackgroundMaterial", @@ -21291,7 +21319,7 @@ function Fy(s, e, t, n, i, r, o) { }), i.update(c)), c.material.uniforms.t2D.value = M, c.material.uniforms.backgroundIntensity.value = y.backgroundIntensity, c.material.toneMapped = st.getTransfer(M.colorSpace) !== lt, M.matrixAutoUpdate === !0 && M.updateMatrix(), c.material.uniforms.uvTransform.value.copy(M.matrix), (u !== M || d !== M.version || f !== s.toneMapping) && (c.material.needsUpdate = !0, u = M, d = M.version, f = s.toneMapping), c.layers.enableAll(), v.unshift(c, c.geometry, c.material, 0, 0, null)); } function m(v, y) { - v.getRGB(_a, Em(s)), n.buffers.color.setClear(_a.r, _a.g, _a.b, y, o); + v.getRGB(_a, Sm(s)), n.buffers.color.setClear(_a.r, _a.g, _a.b, y, o); } function b() { h !== void 0 && (h.geometry.dispose(), h.material.dispose(), h = void 0), c !== void 0 && (c.geometry.dispose(), c.material.dispose(), c = void 0); @@ -21314,7 +21342,7 @@ function Fy(s, e, t, n, i, r, o) { dispose: b }; } -function zy(s, e) { +function Fy(s, e) { const t = s.getParameter(s.MAX_VERTEX_ATTRIBS), n = {}, i = d(null); let r = i, o = !1; function a(S, D, C, B, w) { @@ -21413,7 +21441,7 @@ function zy(s, e) { if (Z === void 0 && (j === "instanceMatrix" && S.instanceMatrix && (Z = S.instanceMatrix), j === "instanceColor" && S.instanceColor && (Z = S.instanceColor)), Z !== void 0) { const re = Z.normalized, X = Z.itemSize, Y = e.get(Z); if (Y === void 0) continue; - const ge = Y.buffer, pe = Y.type, de = Y.bytesPerElement, ie = pe === s.INT || pe === s.UNSIGNED_INT || Z.gpuType === wu; + const ge = Y.buffer, pe = Y.type, de = Y.bytesPerElement, ie = pe === s.INT || pe === s.UNSIGNED_INT || Z.gpuType === Mu; if (Z.isInterleavedBufferAttribute) { const he = Z.data, fe = he.stride, ve = Z.offset; if (he.isInstancedInterleavedBuffer) { @@ -21527,7 +21555,7 @@ function zy(s, e) { disableUnusedAttributes: b }; } -function Hy(s, e, t) { +function zy(s, e, t) { let n; function i(c) { n = c; @@ -21562,7 +21590,7 @@ function Hy(s, e, t) { } this.setMode = i, this.render = r, this.renderInstances = o, this.renderMultiDraw = a, this.renderMultiDrawInstances = l; } -function Vy(s, e, t, n) { +function Hy(s, e, t, n) { let i; function r() { if (i !== void 0) return i; @@ -21615,10 +21643,10 @@ function Vy(s, e, t, n) { maxSamples: E }; } -function Gy(s) { +function Vy(s) { const e = this; let t = null, n = 0, i = !1, r = !1; - const o = new Mt(), a = new $e(), l = { value: null, needsUpdate: !1 }; + const o = new _t(), a = new $e(), l = { value: null, needsUpdate: !1 }; this.uniform = l, this.numPlanes = 0, this.numIntersection = 0, this.init = function(u, d) { const f = u.length !== 0 || d || // enable state of previous frame - the clipping code has to // run another frame in order to reset the state: @@ -21661,22 +21689,22 @@ function Gy(s) { return e.numPlanes = g, e.numIntersection = 0, x; } } -function Wy(s) { +function Gy(s) { let e = /* @__PURE__ */ new WeakMap(); function t(o, a) { - return a === xh ? o.mapping = br : a === vh && (o.mapping = yr), o; + return a === gh ? o.mapping = br : a === xh && (o.mapping = yr), o; } function n(o) { if (o && o.isTexture) { const a = o.mapping; - if (a === xh || a === vh) + if (a === gh || a === xh) if (e.has(o)) { const l = e.get(o).texture; return t(l, o.mapping); } else { const l = o.image; if (l && l.height > 0) { - const c = new Cx(l.height); + const c = new Ax(l.height); return c.fromEquirectangularTexture(s, o), e.set(o, c), o.addEventListener("dispose", i), t(c.texture, o.mapping); } else return null; @@ -21698,10 +21726,10 @@ function Wy(s) { dispose: r }; } -const qi = 4, mf = [0.125, 0.215, 0.35, 0.446, 0.526, 0.582], ms = 20, Xy = 256, $r = /* @__PURE__ */ new Rs(), gf = /* @__PURE__ */ new Fe(); +const qi = 4, pf = [0.125, 0.215, 0.35, 0.446, 0.526, 0.582], ms = 20, Wy = 256, $r = /* @__PURE__ */ new Rs(), mf = /* @__PURE__ */ new Fe(); let yc = null, _c = 0, Mc = 0, wc = !1; -const jy = /* @__PURE__ */ new P(); -class xf { +const Xy = /* @__PURE__ */ new P(); +class gf { /** * Constructs a new PMREM generator. * @@ -21728,7 +21756,7 @@ class xf { fromScene(e, t = 0, n = 0.1, i = 100, r = {}) { const { size: o = 256, - position: a = jy + position: a = Xy } = r; yc = this._renderer.getRenderTarget(), _c = this._renderer.getActiveCubeFace(), Mc = this._renderer.getActiveMipmapLevel(), wc = this._renderer.xr.enabled, this._renderer.xr.enabled = !1, this._setSize(o); const l = this._allocateTargets(); @@ -21763,14 +21791,14 @@ class xf { * your texture's network fetch for increased concurrency. */ compileCubemapShader() { - this._cubemapMaterial === null && (this._cubemapMaterial = yf(), this._compileMaterial(this._cubemapMaterial)); + this._cubemapMaterial === null && (this._cubemapMaterial = bf(), this._compileMaterial(this._cubemapMaterial)); } /** * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during * your texture's network fetch for increased concurrency. */ compileEquirectangularShader() { - this._equirectMaterial === null && (this._equirectMaterial = bf(), this._compileMaterial(this._equirectMaterial)); + this._equirectMaterial === null && (this._equirectMaterial = vf(), this._compileMaterial(this._equirectMaterial)); } /** * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class, @@ -21806,11 +21834,11 @@ class xf { format: xn, colorSpace: Bt, depthBuffer: !1 - }, i = vf(e, t, n); + }, i = xf(e, t, n); if (this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== e || this._pingPongRenderTarget.height !== t) { - this._pingPongRenderTarget !== null && this._dispose(), this._pingPongRenderTarget = vf(e, t, n); + this._pingPongRenderTarget !== null && this._dispose(), this._pingPongRenderTarget = xf(e, t, n); const { _lodMax: r } = this; - ({ lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = qy(r)), this._blurMaterial = Yy(r, e, t), this._ggxMaterial = Zy(r, e, t); + ({ lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = jy(r)), this._blurMaterial = Zy(r, e, t), this._ggxMaterial = qy(r, e, t); } return i; } @@ -21820,7 +21848,7 @@ class xf { } _sceneToCubeUV(e, t, n, i, r) { const l = new nn(90, 1, t, n), c = [1, -1, 1, 1, 1, 1], h = [1, 1, 1, -1, -1, -1], u = this._renderer, d = u.autoClear, f = u.toneMapping; - u.getClearColor(gf), u.toneMapping = Ki, u.autoClear = !1, u.state.buffers.depth.getReversed() && (u.setRenderTarget(i), u.clearDepth(), u.setRenderTarget(null)), this._backgroundBox === null && (this._backgroundBox = new dt( + u.getClearColor(mf), u.toneMapping = Ki, u.autoClear = !1, u.state.buffers.depth.getReversed() && (u.setRenderTarget(i), u.clearDepth(), u.setRenderTarget(null)), this._backgroundBox === null && (this._backgroundBox = new dt( new $i(), new Zt({ name: "PMREM.Background", @@ -21832,7 +21860,7 @@ class xf { const g = this._backgroundBox, x = g.material; let m = !1; const b = e.background; - b ? b.isColor && (x.color.copy(b), e.background = null, m = !0) : (x.color.copy(gf), m = !0); + b ? b.isColor && (x.color.copy(b), e.background = null, m = !0) : (x.color.copy(mf), m = !0); for (let v = 0; v < 6; v++) { const y = v % 3; y === 0 ? (l.up.set(0, c[v], 0), l.position.set(r.x, r.y, r.z), l.lookAt(r.x + h[v], r.y, r.z)) : y === 1 ? (l.up.set(0, 0, c[v]), l.position.set(r.x, r.y, r.z), l.lookAt(r.x, r.y + h[v], r.z)) : (l.up.set(0, c[v], 0), l.position.set(r.x, r.y, r.z), l.lookAt(r.x, r.y, r.z + h[v])); @@ -21843,7 +21871,7 @@ class xf { } _textureToCubeUV(e, t) { const n = this._renderer, i = e.mapping === br || e.mapping === yr; - i ? (this._cubemapMaterial === null && (this._cubemapMaterial = yf()), this._cubemapMaterial.uniforms.flipEnvMap.value = e.isRenderTargetTexture === !1 ? -1 : 1) : this._equirectMaterial === null && (this._equirectMaterial = bf()); + i ? (this._cubemapMaterial === null && (this._cubemapMaterial = bf()), this._cubemapMaterial.uniforms.flipEnvMap.value = e.isRenderTargetTexture === !1 ? -1 : 1) : this._equirectMaterial === null && (this._equirectMaterial = vf()); const r = i ? this._cubemapMaterial : this._equirectMaterial, o = this._lodMeshes[0]; o.material = r; const a = r.uniforms; @@ -21936,15 +21964,15 @@ class xf { tr(t, M, E, 3 * y, 2 * y), l.setRenderTarget(t), l.render(u, $r); } } -function qy(s) { +function jy(s) { const e = [], t = [], n = []; let i = s; - const r = s - qi + 1 + mf.length; + const r = s - qi + 1 + pf.length; for (let o = 0; o < r; o++) { const a = Math.pow(2, i); e.push(a); let l = 1 / a; - o > s - qi ? l = mf[o - s + qi - 1] : o === 0 && (l = 0), t.push(l); + o > s - qi ? l = pf[o - s + qi - 1] : o === 0 && (l = 0), t.push(l); const c = 1 / (a - 2), h = -c, u = 1 + c, d = [h, h, u, h, u, u, h, h, u, u, h, u], f = 6, p = 6, g = 3, x = 2, m = 1, b = new Float32Array(g * p * f), v = new Float32Array(x * p * f), y = new Float32Array(m * p * f); for (let E = 0; E < f; E++) { const A = E % 3 * 2 / 3 - 1, R = E > 2 ? 0 : -1, _ = [ @@ -21976,18 +22004,18 @@ function qy(s) { } return { lodMeshes: n, sizeLods: e, sigmas: t }; } -function vf(s, e, t) { +function xf(s, e, t) { const n = new bn(s, e, t); return n.texture.mapping = Al, n.texture.name = "PMREM.cubeUv", n.scissorTest = !0, n; } function tr(s, e, t, n, i) { s.viewport.set(e, t, n, i), s.scissor.set(e, t, n, i); } -function Zy(s, e, t) { +function qy(s, e, t) { return new Ut({ name: "PMREMGGXConvolution", defines: { - GGX_SAMPLES: Xy, + GGX_SAMPLES: Wy, CUBEUV_TEXEL_WIDTH: 1 / e, CUBEUV_TEXEL_HEIGHT: 1 / t, CUBEUV_MAX_MIP: `${s}.0` @@ -22115,7 +22143,7 @@ function Zy(s, e, t) { depthWrite: !1 }); } -function Yy(s, e, t) { +function Zy(s, e, t) { const n = new Float32Array(ms), i = new P(0, 1, 0); return new Ut({ name: "SphericalGaussianBlur", @@ -22204,7 +22232,7 @@ function Yy(s, e, t) { depthWrite: !1 }); } -function bf() { +function vf() { return new Ut({ name: "EquirectangularToCubeUV", uniforms: { @@ -22239,7 +22267,7 @@ function bf() { depthWrite: !1 }); } -function yf() { +function bf() { return new Ut({ name: "CubemapToCubeUV", uniforms: { @@ -22333,21 +22361,21 @@ function Pl() { ` ); } -function Ky(s) { +function Yy(s) { let e = /* @__PURE__ */ new WeakMap(), t = null; function n(a) { if (a && a.isTexture) { - const l = a.mapping, c = l === xh || l === vh, h = l === br || l === yr; + const l = a.mapping, c = l === gh || l === xh, h = l === br || l === yr; if (c || h) { let u = e.get(a); const d = u !== void 0 ? u.texture.pmremVersion : 0; if (a.isRenderTargetTexture && a.pmremVersion !== d) - return t === null && (t = new xf(s)), u = c ? t.fromEquirectangular(a, u) : t.fromCubemap(a, u), u.texture.pmremVersion = a.pmremVersion, e.set(a, u), u.texture; + return t === null && (t = new gf(s)), u = c ? t.fromEquirectangular(a, u) : t.fromCubemap(a, u), u.texture.pmremVersion = a.pmremVersion, e.set(a, u), u.texture; if (u !== void 0) return u.texture; { const f = a.image; - return c && f && f.height > 0 || h && f && i(f) ? (t === null && (t = new xf(s)), u = c ? t.fromEquirectangular(a) : t.fromCubemap(a), u.texture.pmremVersion = a.pmremVersion, e.set(a, u), a.addEventListener("dispose", r), u.texture) : null; + return c && f && f.height > 0 || h && f && i(f) ? (t === null && (t = new gf(s)), u = c ? t.fromEquirectangular(a) : t.fromCubemap(a), u.texture.pmremVersion = a.pmremVersion, e.set(a, u), a.addEventListener("dispose", r), u.texture) : null; } } } @@ -22374,7 +22402,7 @@ function Ky(s) { dispose: o }; } -function $y(s) { +function Ky(s) { const e = {}; function t(n) { if (e[n] !== void 0) @@ -22395,7 +22423,7 @@ function $y(s) { } }; } -function Jy(s, e, t, n) { +function $y(s, e, t, n) { const i = {}, r = /* @__PURE__ */ new WeakMap(); function o(u) { const d = u.target; @@ -22433,7 +22461,7 @@ function Jy(s, e, t, n) { } } else return; - const x = new (ym(d) ? Sm : wm)(d, 1); + const x = new (bm(d) ? wm : Mm)(d, 1); x.version = g; const m = r.get(u); m && e.remove(m), r.set(u, x); @@ -22453,7 +22481,7 @@ function Jy(s, e, t, n) { getWireframeAttribute: h }; } -function Qy(s, e, t) { +function Jy(s, e, t) { let n; function i(d) { n = d; @@ -22492,7 +22520,7 @@ function Qy(s, e, t) { } this.setMode = i, this.setIndex = a, this.render = l, this.renderInstances = c, this.renderMultiDraw = h, this.renderMultiDrawInstances = u; } -function e_(s) { +function Qy(s) { const e = { geometries: 0, textures: 0 @@ -22537,7 +22565,7 @@ function e_(s) { update: n }; } -function t_(s, e, t) { +function e_(s, e, t) { const n = /* @__PURE__ */ new WeakMap(), i = new tt(); function r(o, a, l) { const c = o.morphTargetInfluences, h = a.morphAttributes.position || a.morphAttributes.normal || a.morphAttributes.color, u = h !== void 0 ? h.length : 0; @@ -22552,7 +22580,7 @@ function t_(s, e, t) { f === !0 && (v = 1), p === !0 && (v = 2), g === !0 && (v = 3); let y = a.attributes.position.count * v, M = 1; y > e.maxTextureSize && (M = Math.ceil(y / e.maxTextureSize), y = e.maxTextureSize); - const E = new Float32Array(y * M * 4 * u), A = new _m(E, y, M, u); + const E = new Float32Array(y * M * 4 * u), A = new ym(E, y, M, u); A.type = $n, A.needsUpdate = !0; const R = v * 4; for (let S = 0; S < u; S++) { @@ -22583,7 +22611,7 @@ function t_(s, e, t) { update: r }; } -function n_(s, e, t, n) { +function t_(s, e, t, n) { let i = /* @__PURE__ */ new WeakMap(); function r(l) { const c = n.render.frame, h = l.geometry, u = e.get(l, h); @@ -22605,13 +22633,13 @@ function n_(s, e, t, n) { dispose: o }; } -const Ym = /* @__PURE__ */ new Ht(), _f = /* @__PURE__ */ new Uu(1, 1), Km = /* @__PURE__ */ new _m(), $m = /* @__PURE__ */ new dx(), Jm = /* @__PURE__ */ new Am(), Mf = [], wf = [], Sf = new Float32Array(16), Ef = new Float32Array(9), Tf = new Float32Array(4); +const Zm = /* @__PURE__ */ new Ht(), yf = /* @__PURE__ */ new ku(1, 1), Ym = /* @__PURE__ */ new ym(), Km = /* @__PURE__ */ new ux(), $m = /* @__PURE__ */ new Tm(), _f = [], Mf = [], wf = new Float32Array(16), Sf = new Float32Array(9), Ef = new Float32Array(4); function Nr(s, e, t) { const n = s[0]; if (n <= 0 || n > 0) return s; const i = e * t; - let r = Mf[i]; - if (r === void 0 && (r = new Float32Array(i), Mf[i] = r), e !== 0) { + let r = _f[i]; + if (r === void 0 && (r = new Float32Array(i), _f[i] = r), e !== 0) { n.toArray(r, 0); for (let o = 1, a = 0; o !== e; ++o) a += t, s[o].toArray(r, a); @@ -22629,17 +22657,17 @@ function Gt(s, e) { s[t] = e[t]; } function Rl(s, e) { - let t = wf[e]; - t === void 0 && (t = new Int32Array(e), wf[e] = t); + let t = Mf[e]; + t === void 0 && (t = new Int32Array(e), Mf[e] = t); for (let n = 0; n !== e; ++n) t[n] = s.allocateTextureUnit(); return t; } -function i_(s, e) { +function n_(s, e) { const t = this.cache; t[0] !== e && (s.uniform1f(this.addr, e), t[0] = e); } -function s_(s, e) { +function i_(s, e) { const t = this.cache; if (e.x !== void 0) (t[0] !== e.x || t[1] !== e.y) && (s.uniform2f(this.addr, e.x, e.y), t[0] = e.x, t[1] = e.y); @@ -22648,7 +22676,7 @@ function s_(s, e) { s.uniform2fv(this.addr, e), Gt(t, e); } } -function r_(s, e) { +function s_(s, e) { const t = this.cache; if (e.x !== void 0) (t[0] !== e.x || t[1] !== e.y || t[2] !== e.z) && (s.uniform3f(this.addr, e.x, e.y, e.z), t[0] = e.x, t[1] = e.y, t[2] = e.z); @@ -22659,7 +22687,7 @@ function r_(s, e) { s.uniform3fv(this.addr, e), Gt(t, e); } } -function o_(s, e) { +function r_(s, e) { const t = this.cache; if (e.x !== void 0) (t[0] !== e.x || t[1] !== e.y || t[2] !== e.z || t[3] !== e.w) && (s.uniform4f(this.addr, e.x, e.y, e.z, e.w), t[0] = e.x, t[1] = e.y, t[2] = e.z, t[3] = e.w); @@ -22668,41 +22696,41 @@ function o_(s, e) { s.uniform4fv(this.addr, e), Gt(t, e); } } -function a_(s, e) { +function o_(s, e) { const t = this.cache, n = e.elements; if (n === void 0) { if (Vt(t, e)) return; s.uniformMatrix2fv(this.addr, !1, e), Gt(t, e); } else { if (Vt(t, n)) return; - Tf.set(n), s.uniformMatrix2fv(this.addr, !1, Tf), Gt(t, n); + Ef.set(n), s.uniformMatrix2fv(this.addr, !1, Ef), Gt(t, n); } } -function l_(s, e) { +function a_(s, e) { const t = this.cache, n = e.elements; if (n === void 0) { if (Vt(t, e)) return; s.uniformMatrix3fv(this.addr, !1, e), Gt(t, e); } else { if (Vt(t, n)) return; - Ef.set(n), s.uniformMatrix3fv(this.addr, !1, Ef), Gt(t, n); + Sf.set(n), s.uniformMatrix3fv(this.addr, !1, Sf), Gt(t, n); } } -function c_(s, e) { +function l_(s, e) { const t = this.cache, n = e.elements; if (n === void 0) { if (Vt(t, e)) return; s.uniformMatrix4fv(this.addr, !1, e), Gt(t, e); } else { if (Vt(t, n)) return; - Sf.set(n), s.uniformMatrix4fv(this.addr, !1, Sf), Gt(t, n); + wf.set(n), s.uniformMatrix4fv(this.addr, !1, wf), Gt(t, n); } } -function h_(s, e) { +function c_(s, e) { const t = this.cache; t[0] !== e && (s.uniform1i(this.addr, e), t[0] = e); } -function u_(s, e) { +function h_(s, e) { const t = this.cache; if (e.x !== void 0) (t[0] !== e.x || t[1] !== e.y) && (s.uniform2i(this.addr, e.x, e.y), t[0] = e.x, t[1] = e.y); @@ -22711,7 +22739,7 @@ function u_(s, e) { s.uniform2iv(this.addr, e), Gt(t, e); } } -function d_(s, e) { +function u_(s, e) { const t = this.cache; if (e.x !== void 0) (t[0] !== e.x || t[1] !== e.y || t[2] !== e.z) && (s.uniform3i(this.addr, e.x, e.y, e.z), t[0] = e.x, t[1] = e.y, t[2] = e.z); @@ -22720,7 +22748,7 @@ function d_(s, e) { s.uniform3iv(this.addr, e), Gt(t, e); } } -function f_(s, e) { +function d_(s, e) { const t = this.cache; if (e.x !== void 0) (t[0] !== e.x || t[1] !== e.y || t[2] !== e.z || t[3] !== e.w) && (s.uniform4i(this.addr, e.x, e.y, e.z, e.w), t[0] = e.x, t[1] = e.y, t[2] = e.z, t[3] = e.w); @@ -22729,11 +22757,11 @@ function f_(s, e) { s.uniform4iv(this.addr, e), Gt(t, e); } } -function p_(s, e) { +function f_(s, e) { const t = this.cache; t[0] !== e && (s.uniform1ui(this.addr, e), t[0] = e); } -function m_(s, e) { +function p_(s, e) { const t = this.cache; if (e.x !== void 0) (t[0] !== e.x || t[1] !== e.y) && (s.uniform2ui(this.addr, e.x, e.y), t[0] = e.x, t[1] = e.y); @@ -22742,7 +22770,7 @@ function m_(s, e) { s.uniform2uiv(this.addr, e), Gt(t, e); } } -function g_(s, e) { +function m_(s, e) { const t = this.cache; if (e.x !== void 0) (t[0] !== e.x || t[1] !== e.y || t[2] !== e.z) && (s.uniform3ui(this.addr, e.x, e.y, e.z), t[0] = e.x, t[1] = e.y, t[2] = e.z); @@ -22751,7 +22779,7 @@ function g_(s, e) { s.uniform3uiv(this.addr, e), Gt(t, e); } } -function x_(s, e) { +function g_(s, e) { const t = this.cache; if (e.x !== void 0) (t[0] !== e.x || t[1] !== e.y || t[2] !== e.z || t[3] !== e.w) && (s.uniform4ui(this.addr, e.x, e.y, e.z, e.w), t[0] = e.x, t[1] = e.y, t[2] = e.z, t[3] = e.w); @@ -22760,74 +22788,74 @@ function x_(s, e) { s.uniform4uiv(this.addr, e), Gt(t, e); } } -function v_(s, e, t) { +function x_(s, e, t) { const n = this.cache, i = t.allocateTextureUnit(); n[0] !== i && (s.uniform1i(this.addr, i), n[0] = i); let r; - this.type === s.SAMPLER_2D_SHADOW ? (_f.compareFunction = bm, r = _f) : r = Ym, t.setTexture2D(e || r, i); + this.type === s.SAMPLER_2D_SHADOW ? (yf.compareFunction = vm, r = yf) : r = Zm, t.setTexture2D(e || r, i); +} +function v_(s, e, t) { + const n = this.cache, i = t.allocateTextureUnit(); + n[0] !== i && (s.uniform1i(this.addr, i), n[0] = i), t.setTexture3D(e || Km, i); } function b_(s, e, t) { const n = this.cache, i = t.allocateTextureUnit(); - n[0] !== i && (s.uniform1i(this.addr, i), n[0] = i), t.setTexture3D(e || $m, i); + n[0] !== i && (s.uniform1i(this.addr, i), n[0] = i), t.setTextureCube(e || $m, i); } function y_(s, e, t) { const n = this.cache, i = t.allocateTextureUnit(); - n[0] !== i && (s.uniform1i(this.addr, i), n[0] = i), t.setTextureCube(e || Jm, i); + n[0] !== i && (s.uniform1i(this.addr, i), n[0] = i), t.setTexture2DArray(e || Ym, i); } -function __(s, e, t) { - const n = this.cache, i = t.allocateTextureUnit(); - n[0] !== i && (s.uniform1i(this.addr, i), n[0] = i), t.setTexture2DArray(e || Km, i); -} -function M_(s) { +function __(s) { switch (s) { case 5126: - return i_; + return n_; // FLOAT case 35664: - return s_; + return i_; // _VEC2 case 35665: - return r_; + return s_; // _VEC3 case 35666: - return o_; + return r_; // _VEC4 case 35674: - return a_; + return o_; // _MAT2 case 35675: - return l_; + return a_; // _MAT3 case 35676: - return c_; + return l_; // _MAT4 case 5124: case 35670: - return h_; + return c_; // INT, BOOL case 35667: case 35671: - return u_; + return h_; // _VEC2 case 35668: case 35672: - return d_; + return u_; // _VEC3 case 35669: case 35673: - return f_; + return d_; // _VEC4 case 5125: - return p_; + return f_; // UINT case 36294: - return m_; + return p_; // _VEC2 case 36295: - return g_; + return m_; // _VEC3 case 36296: - return x_; + return g_; // _VEC4 case 35678: // SAMPLER_2D @@ -22838,13 +22866,13 @@ function M_(s) { case 36306: // UNSIGNED_INT_SAMPLER_2D case 35682: - return v_; + return x_; case 35679: // SAMPLER_3D case 36299: // INT_SAMPLER_3D case 36307: - return b_; + return v_; case 35680: // SAMPLER_CUBE case 36300: @@ -22852,7 +22880,7 @@ function M_(s) { case 36308: // UNSIGNED_INT_SAMPLER_CUBE case 36293: - return y_; + return b_; case 36289: // SAMPLER_2D_ARRAY case 36303: @@ -22860,134 +22888,134 @@ function M_(s) { case 36311: // UNSIGNED_INT_SAMPLER_2D_ARRAY case 36292: - return __; + return y_; } } -function w_(s, e) { +function M_(s, e) { s.uniform1fv(this.addr, e); } -function S_(s, e) { +function w_(s, e) { const t = Nr(e, this.size, 2); s.uniform2fv(this.addr, t); } -function E_(s, e) { +function S_(s, e) { const t = Nr(e, this.size, 3); s.uniform3fv(this.addr, t); } -function T_(s, e) { +function E_(s, e) { const t = Nr(e, this.size, 4); s.uniform4fv(this.addr, t); } -function A_(s, e) { +function T_(s, e) { const t = Nr(e, this.size, 4); s.uniformMatrix2fv(this.addr, !1, t); } -function C_(s, e) { +function A_(s, e) { const t = Nr(e, this.size, 9); s.uniformMatrix3fv(this.addr, !1, t); } -function P_(s, e) { +function C_(s, e) { const t = Nr(e, this.size, 16); s.uniformMatrix4fv(this.addr, !1, t); } -function R_(s, e) { +function P_(s, e) { s.uniform1iv(this.addr, e); } -function L_(s, e) { +function R_(s, e) { s.uniform2iv(this.addr, e); } -function D_(s, e) { +function L_(s, e) { s.uniform3iv(this.addr, e); } -function I_(s, e) { +function D_(s, e) { s.uniform4iv(this.addr, e); } -function B_(s, e) { +function I_(s, e) { s.uniform1uiv(this.addr, e); } -function N_(s, e) { +function B_(s, e) { s.uniform2uiv(this.addr, e); } -function k_(s, e) { +function N_(s, e) { s.uniform3uiv(this.addr, e); } -function U_(s, e) { +function k_(s, e) { s.uniform4uiv(this.addr, e); } +function U_(s, e, t) { + const n = this.cache, i = e.length, r = Rl(t, i); + Vt(n, r) || (s.uniform1iv(this.addr, r), Gt(n, r)); + for (let o = 0; o !== i; ++o) + t.setTexture2D(e[o] || Zm, r[o]); +} function O_(s, e, t) { const n = this.cache, i = e.length, r = Rl(t, i); Vt(n, r) || (s.uniform1iv(this.addr, r), Gt(n, r)); for (let o = 0; o !== i; ++o) - t.setTexture2D(e[o] || Ym, r[o]); + t.setTexture3D(e[o] || Km, r[o]); } function F_(s, e, t) { const n = this.cache, i = e.length, r = Rl(t, i); Vt(n, r) || (s.uniform1iv(this.addr, r), Gt(n, r)); for (let o = 0; o !== i; ++o) - t.setTexture3D(e[o] || $m, r[o]); + t.setTextureCube(e[o] || $m, r[o]); } function z_(s, e, t) { const n = this.cache, i = e.length, r = Rl(t, i); Vt(n, r) || (s.uniform1iv(this.addr, r), Gt(n, r)); for (let o = 0; o !== i; ++o) - t.setTextureCube(e[o] || Jm, r[o]); + t.setTexture2DArray(e[o] || Ym, r[o]); } -function H_(s, e, t) { - const n = this.cache, i = e.length, r = Rl(t, i); - Vt(n, r) || (s.uniform1iv(this.addr, r), Gt(n, r)); - for (let o = 0; o !== i; ++o) - t.setTexture2DArray(e[o] || Km, r[o]); -} -function V_(s) { +function H_(s) { switch (s) { case 5126: - return w_; + return M_; // FLOAT case 35664: - return S_; + return w_; // _VEC2 case 35665: - return E_; + return S_; // _VEC3 case 35666: - return T_; + return E_; // _VEC4 case 35674: - return A_; + return T_; // _MAT2 case 35675: - return C_; + return A_; // _MAT3 case 35676: - return P_; + return C_; // _MAT4 case 5124: case 35670: - return R_; + return P_; // INT, BOOL case 35667: case 35671: - return L_; + return R_; // _VEC2 case 35668: case 35672: - return D_; + return L_; // _VEC3 case 35669: case 35673: - return I_; + return D_; // _VEC4 case 5125: - return B_; + return I_; // UINT case 36294: - return N_; + return B_; // _VEC2 case 36295: - return k_; + return N_; // _VEC3 case 36296: - return U_; + return k_; // _VEC4 case 35678: // SAMPLER_2D @@ -22998,13 +23026,13 @@ function V_(s) { case 36306: // UNSIGNED_INT_SAMPLER_2D case 35682: - return O_; + return U_; case 35679: // SAMPLER_3D case 36299: // INT_SAMPLER_3D case 36307: - return F_; + return O_; case 35680: // SAMPLER_CUBE case 36300: @@ -23012,7 +23040,7 @@ function V_(s) { case 36308: // UNSIGNED_INT_SAMPLER_CUBE case 36293: - return z_; + return F_; case 36289: // SAMPLER_2D_ARRAY case 36303: @@ -23020,20 +23048,20 @@ function V_(s) { case 36311: // UNSIGNED_INT_SAMPLER_2D_ARRAY case 36292: - return H_; + return z_; + } +} +class V_ { + constructor(e, t, n) { + this.id = e, this.addr = n, this.cache = [], this.type = t.type, this.setValue = __(t.type); } } class G_ { constructor(e, t, n) { - this.id = e, this.addr = n, this.cache = [], this.type = t.type, this.setValue = M_(t.type); + this.id = e, this.addr = n, this.cache = [], this.type = t.type, this.size = t.size, this.setValue = H_(t.type); } } class W_ { - constructor(e, t, n) { - this.id = e, this.addr = n, this.cache = [], this.type = t.type, this.size = t.size, this.setValue = V_(t.type); - } -} -class X_ { constructor(e) { this.id = e, this.seq = [], this.map = {}; } @@ -23046,21 +23074,21 @@ class X_ { } } const Sc = /(\w+)(\])?(\[|\.)?/g; -function Af(s, e) { +function Tf(s, e) { s.seq.push(e), s.map[e.id] = e; } -function j_(s, e, t) { +function X_(s, e, t) { const n = s.name, i = n.length; for (Sc.lastIndex = 0; ; ) { const r = Sc.exec(n), o = Sc.lastIndex; let a = r[1]; const l = r[2] === "]", c = r[3]; if (l && (a = a | 0), c === void 0 || c === "[" && o + 2 === i) { - Af(t, c === void 0 ? new G_(a, s, e) : new W_(a, s, e)); + Tf(t, c === void 0 ? new V_(a, s, e) : new G_(a, s, e)); break; } else { let u = t.map[a]; - u === void 0 && (u = new X_(a), Af(t, u)), t = u; + u === void 0 && (u = new W_(a), Tf(t, u)), t = u; } } } @@ -23070,7 +23098,7 @@ class rl { const n = e.getProgramParameter(t, e.ACTIVE_UNIFORMS); for (let i = 0; i < n; ++i) { const r = e.getActiveUniform(t, i), o = e.getUniformLocation(t, r.name); - j_(r, o, this); + X_(r, o, this); } } setValue(e, t, n, i) { @@ -23096,13 +23124,13 @@ class rl { return n; } } -function Cf(s, e, t) { +function Af(s, e, t) { const n = s.createShader(e); return s.shaderSource(n, t), s.compileShader(n), n; } -const q_ = 37297; -let Z_ = 0; -function Y_(s, e) { +const j_ = 37297; +let q_ = 0; +function Z_(s, e) { const t = s.split(` `), n = [], i = Math.max(e - 6, 0), r = Math.min(e + 6, t.length); for (let o = i; o < r; o++) { @@ -23112,10 +23140,10 @@ function Y_(s, e) { return n.join(` `); } -const Pf = /* @__PURE__ */ new $e(); -function K_(s) { - st._getMatrix(Pf, st.workingColorSpace, s); - const e = `mat3( ${Pf.elements.map((t) => t.toFixed(4))} )`; +const Cf = /* @__PURE__ */ new $e(); +function Y_(s) { + st._getMatrix(Cf, st.workingColorSpace, s); + const e = `mat3( ${Cf.elements.map((t) => t.toFixed(4))} )`; switch (st.getTransfer(s)) { case ml: return [e, "LinearTransferOETF"]; @@ -23125,7 +23153,7 @@ function K_(s) { return He("WebGLProgram: Unsupported color space: ", s), [e, "LinearTransferOETF"]; } } -function Rf(s, e, t) { +function Pf(s, e, t) { const n = s.getShaderParameter(e, s.COMPILE_STATUS), r = (s.getShaderInfoLog(e) || "").trim(); if (n && r === "") return ""; const o = /ERROR: 0:(\d+)/.exec(r); @@ -23135,12 +23163,12 @@ function Rf(s, e, t) { ` + r + ` -` + Y_(s.getShaderSource(e), a); +` + Z_(s.getShaderSource(e), a); } else return r; } -function $_(s, e) { - const t = K_(e); +function K_(s, e) { + const t = Y_(e); return [ `vec4 ${s}( vec4 value ) {`, ` return ${t[1]}( vec4( value.rgb * ${t[0]}, value.a ) );`, @@ -23148,28 +23176,28 @@ function $_(s, e) { ].join(` `); } -function J_(s, e) { +function $_(s, e) { let t; switch (e) { - case sm: + case im: t = "Linear"; break; - case rm: + case sm: t = "Reinhard"; break; - case om: + case rm: t = "Cineon"; break; - case Mu: + case _u: t = "ACESFilmic"; break; - case lm: + case am: t = "AgX"; break; - case cm: + case lm: t = "Neutral"; break; - case am: + case om: t = "Custom"; break; default: @@ -23178,7 +23206,7 @@ function J_(s, e) { return "vec3 " + s + "( vec3 color ) { return " + t + "ToneMapping( color ); }"; } const Ma = /* @__PURE__ */ new P(); -function Q_() { +function J_() { st.getLuminanceCoefficients(Ma); const s = Ma.x.toFixed(4), e = Ma.y.toFixed(4), t = Ma.z.toFixed(4); return [ @@ -23189,14 +23217,14 @@ function Q_() { ].join(` `); } -function e2(s) { +function Q_(s) { return [ s.extensionClipCullDistance ? "#extension GL_ANGLE_clip_cull_distance : require" : "", s.extensionMultiDraw ? "#extension GL_ANGLE_multi_draw : require" : "" ].filter(uo).join(` `); } -function t2(s) { +function e2(s) { const e = []; for (const t in s) { const n = s[t]; @@ -23205,7 +23233,7 @@ function t2(s) { return e.join(` `); } -function n2(s, e) { +function t2(s, e) { const t = {}, n = s.getProgramParameter(e, s.ACTIVE_ATTRIBUTES); for (let i = 0; i < n; i++) { const r = s.getActiveAttrib(e, i), o = r.name; @@ -23221,40 +23249,40 @@ function n2(s, e) { function uo(s) { return s !== ""; } -function Lf(s, e) { +function Rf(s, e) { const t = e.numSpotLightShadows + e.numSpotLightMaps - e.numSpotLightShadowsWithMaps; return s.replace(/NUM_DIR_LIGHTS/g, e.numDirLights).replace(/NUM_SPOT_LIGHTS/g, e.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g, e.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g, t).replace(/NUM_RECT_AREA_LIGHTS/g, e.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g, e.numPointLights).replace(/NUM_HEMI_LIGHTS/g, e.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g, e.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, e.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g, e.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g, e.numPointLightShadows); } -function Df(s, e) { +function Lf(s, e) { return s.replace(/NUM_CLIPPING_PLANES/g, e.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g, e.numClippingPlanes - e.numClipIntersection); } -const i2 = /^[ \t]*#include +<([\w\d./]+)>/gm; -function tu(s) { - return s.replace(i2, r2); +const n2 = /^[ \t]*#include +<([\w\d./]+)>/gm; +function eu(s) { + return s.replace(n2, s2); } -const s2 = /* @__PURE__ */ new Map(); -function r2(s, e) { +const i2 = /* @__PURE__ */ new Map(); +function s2(s, e) { let t = Qe[e]; if (t === void 0) { - const n = s2.get(e); + const n = i2.get(e); if (n !== void 0) t = Qe[n], He('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.', e, n); else throw new Error("Can not resolve #include <" + e + ">"); } - return tu(t); + return eu(t); } -const o2 = /#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g; -function If(s) { - return s.replace(o2, a2); +const r2 = /#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g; +function Df(s) { + return s.replace(r2, o2); } -function a2(s, e, t, n) { +function o2(s, e, t, n) { let i = ""; for (let r = parseInt(e); r < parseInt(t); r++) i += n.replace(/\[\s*i\s*\]/g, "[ " + r + " ]").replace(/UNROLLED_LOOP_INDEX/g, r); return i; } -function Bf(s) { +function If(s) { let e = `precision ${s.precision} float; precision ${s.precision} int; precision ${s.precision} sampler2D; @@ -23278,11 +23306,11 @@ function Bf(s) { #define MEDIUM_PRECISION` : s.precision === "lowp" && (e += ` #define LOW_PRECISION`), e; } -function l2(s) { +function a2(s) { let e = "SHADOWMAP_TYPE_BASIC"; - return s.shadowMapType === tm ? e = "SHADOWMAP_TYPE_PCF" : s.shadowMapType === nm ? e = "SHADOWMAP_TYPE_PCF_SOFT" : s.shadowMapType === Si && (e = "SHADOWMAP_TYPE_VSM"), e; + return s.shadowMapType === em ? e = "SHADOWMAP_TYPE_PCF" : s.shadowMapType === tm ? e = "SHADOWMAP_TYPE_PCF_SOFT" : s.shadowMapType === Si && (e = "SHADOWMAP_TYPE_VSM"), e; } -function c2(s) { +function l2(s) { let e = "ENVMAP_TYPE_CUBE"; if (s.envMap) switch (s.envMapMode) { @@ -23296,7 +23324,7 @@ function c2(s) { } return e; } -function h2(s) { +function c2(s) { let e = "ENVMAP_MODE_REFLECTION"; if (s.envMap) switch (s.envMapMode) { @@ -23306,32 +23334,32 @@ function h2(s) { } return e; } -function u2(s) { +function h2(s) { let e = "ENVMAP_BLENDING_NONE"; if (s.envMap) switch (s.combine) { case Tl: e = "ENVMAP_BLENDING_MULTIPLY"; break; - case Cg: + case Ag: e = "ENVMAP_BLENDING_MIX"; break; - case Pg: + case Cg: e = "ENVMAP_BLENDING_ADD"; break; } return e; } -function d2(s) { +function u2(s) { const e = s.envMapCubeUVHeight; if (e === null) return null; const t = Math.log2(e) - 2, n = 1 / e; return { texelWidth: 1 / (3 * Math.max(Math.pow(2, t), 112)), texelHeight: n, maxMip: t }; } -function f2(s, e, t, n) { +function d2(s, e, t, n) { const i = s.getContext(), r = t.defines; let o = t.vertexShader, a = t.fragmentShader; - const l = l2(t), c = c2(t), h = h2(t), u = u2(t), d = d2(t), f = e2(t), p = t2(r), g = i.createProgram(); + const l = a2(t), c = l2(t), h = c2(t), u = h2(t), d = u2(t), f = Q_(t), p = e2(r), g = i.createProgram(); let x, m, b = t.glslVersion ? "#version " + t.glslVersion + ` ` : ""; t.isRawShaderMaterial ? (x = [ @@ -23347,7 +23375,7 @@ function f2(s, e, t, n) { ].filter(uo).join(` `), m.length > 0 && (m += ` `)) : (x = [ - Bf(t), + If(t), "#define SHADER_TYPE " + t.shaderType, "#define SHADER_NAME " + t.shaderName, p, @@ -23480,7 +23508,7 @@ function f2(s, e, t, n) { ` ].filter(uo).join(` `), m = [ - Bf(t), + If(t), "#define SHADER_TYPE " + t.shaderType, "#define SHADER_NAME " + t.shaderName, p, @@ -23552,18 +23580,18 @@ function f2(s, e, t, n) { t.toneMapping !== Ki ? "#define TONE_MAPPING" : "", t.toneMapping !== Ki ? Qe.tonemapping_pars_fragment : "", // this code is required here because it is used by the toneMapping() function defined below - t.toneMapping !== Ki ? J_("toneMapping", t.toneMapping) : "", + t.toneMapping !== Ki ? $_("toneMapping", t.toneMapping) : "", t.dithering ? "#define DITHERING" : "", t.opaque ? "#define OPAQUE" : "", Qe.colorspace_pars_fragment, // this code is required here because it is used by the various encoding/decoding function defined below - $_("linearToOutputTexel", t.outputColorSpace), - Q_(), + K_("linearToOutputTexel", t.outputColorSpace), + J_(), t.useDepthPacking ? "#define DEPTH_PACKING " + t.depthPacking : "", ` ` ].filter(uo).join(` -`)), o = tu(o), o = Lf(o, t), o = Df(o, t), a = tu(a), a = Lf(a, t), a = Df(a, t), o = If(o), a = If(a), t.isRawShaderMaterial !== !0 && (b = `#version 300 es +`)), o = eu(o), o = Rf(o, t), o = Lf(o, t), a = eu(a), a = Rf(a, t), a = Lf(a, t), o = Df(o), a = Df(a), t.isRawShaderMaterial !== !0 && (b = `#version 300 es `, x = [ f, "#define attribute in", @@ -23573,8 +23601,8 @@ function f2(s, e, t, n) { `) + ` ` + x, m = [ "#define varying in", - t.glslVersion === bd ? "" : "layout(location = 0) out highp vec4 pc_fragColor;", - t.glslVersion === bd ? "" : "#define gl_FragColor pc_fragColor", + t.glslVersion === vd ? "" : "layout(location = 0) out highp vec4 pc_fragColor;", + t.glslVersion === vd ? "" : "#define gl_FragColor pc_fragColor", "#define gl_FragDepthEXT gl_FragDepth", "#define texture2D texture", "#define textureCube texture", @@ -23588,7 +23616,7 @@ function f2(s, e, t, n) { ].join(` `) + ` ` + m); - const v = b + x + o, y = b + m + a, M = Cf(i, i.VERTEX_SHADER, v), E = Cf(i, i.FRAGMENT_SHADER, y); + const v = b + x + o, y = b + m + a, M = Af(i, i.VERTEX_SHADER, v), E = Af(i, i.FRAGMENT_SHADER, y); i.attachShader(g, M), i.attachShader(g, E), t.index0AttributeName !== void 0 ? i.bindAttribLocation(g, 0, t.index0AttributeName) : t.morphTargets === !0 && i.bindAttribLocation(g, 0, "position"), i.linkProgram(g); function A(D) { if (s.debug.checkShaderErrors) { @@ -23598,7 +23626,7 @@ function f2(s, e, t, n) { if ($ = !1, typeof s.debug.onShaderError == "function") s.debug.onShaderError(i, g, M, E); else { - const re = Rf(i, M, "vertex"), X = Rf(i, E, "fragment"); + const re = Pf(i, M, "vertex"), X = Pf(i, E, "fragment"); et( "THREE.WebGLProgram: Shader Error " + i.getError() + " - VALIDATE_STATUS " + i.getProgramParameter(g, i.VALIDATE_STATUS) + ` @@ -23624,7 +23652,7 @@ Program Info Log: ` + F + ` } }); } - i.deleteShader(M), i.deleteShader(E), R = new rl(i, g), _ = n2(i, g); + i.deleteShader(M), i.deleteShader(E), R = new rl(i, g), _ = t2(i, g); } let R; this.getUniforms = function() { @@ -23636,13 +23664,13 @@ Program Info Log: ` + F + ` }; let S = t.rendererExtensionParallelShaderCompile === !1; return this.isReady = function() { - return S === !1 && (S = i.getProgramParameter(g, q_)), S; + return S === !1 && (S = i.getProgramParameter(g, j_)), S; }, this.destroy = function() { n.releaseStatesOfProgram(this), i.deleteProgram(g), this.program = void 0; - }, this.type = t.shaderType, this.name = t.shaderName, this.id = Z_++, this.cacheKey = e, this.usedTimes = 1, this.program = g, this.vertexShader = M, this.fragmentShader = E, this; + }, this.type = t.shaderType, this.name = t.shaderName, this.id = q_++, this.cacheKey = e, this.usedTimes = 1, this.program = g, this.vertexShader = M, this.fragmentShader = E, this; } -let p2 = 0; -class m2 { +let f2 = 0; +class p2 { constructor() { this.shaderCache = /* @__PURE__ */ new Map(), this.materialCache = /* @__PURE__ */ new Map(); } @@ -23673,16 +23701,16 @@ class m2 { _getShaderStage(e) { const t = this.shaderCache; let n = t.get(e); - return n === void 0 && (n = new g2(e), t.set(e, n)), n; + return n === void 0 && (n = new m2(e), t.set(e, n)), n; } } -class g2 { +class m2 { constructor(e) { - this.id = p2++, this.code = e, this.usedTimes = 0; + this.id = f2++, this.code = e, this.usedTimes = 0; } } -function x2(s, e, t, n, i, r, o) { - const a = new Iu(), l = new m2(), c = /* @__PURE__ */ new Set(), h = [], u = i.logarithmicDepthBuffer, d = i.vertexTextures; +function g2(s, e, t, n, i, r, o) { + const a = new Du(), l = new p2(), c = /* @__PURE__ */ new Set(), h = [], u = i.logarithmicDepthBuffer, d = i.vertexTextures; let f = i.precision; const p = { MeshDepthMaterial: "depth", @@ -23719,7 +23747,7 @@ function x2(s, e, t, n, i, r, o) { const he = s.getRenderTarget(), fe = s.state.buffers.depth.getReversed(), ve = B.isInstancedMesh === !0, we = B.isBatchedMesh === !0, Be = !!_.map, Ke = !!_.matcap, Ne = !!j, T = !!_.aoMap, I = !!_.lightMap, V = !!_.bumpMap, U = !!_.normalMap, k = !!_.displacementMap, z = !!_.emissiveMap, ee = !!_.metalnessMap, J = !!_.roughnessMap, G = _.anisotropy > 0, N = _.clearcoat > 0, L = _.dispersion > 0, H = _.iridescence > 0, K = _.sheen > 0, le = _.transmission > 0, te = G && !!_.anisotropyMap, Te = N && !!_.clearcoatMap, be = N && !!_.clearcoatNormalMap, Re = N && !!_.clearcoatRoughnessMap, De = H && !!_.iridescenceMap, ue = H && !!_.iridescenceThicknessMap, ye = K && !!_.sheenColorMap, Ve = K && !!_.sheenRoughnessMap, ke = !!_.specularMap, Ae = !!_.specularColorMap, Ge = !!_.specularIntensityMap, q = le && !!_.transmissionMap, Ee = le && !!_.thicknessMap, _e = !!_.gradientMap, Me = !!_.alphaMap, xe = _.alphaTest > 0, me = !!_.alphaHash, Ue = !!_.extensions; let Ye = Ki; _.toneMapped && (he === null || he.isXRRenderTarget === !0) && (Ye = s.toneMapping); - const _t = { + const yt = { shaderID: Z, shaderType: _.type, shaderName: _.name, @@ -23750,7 +23778,7 @@ function x2(s, e, t, n, i, r, o) { normalMap: U, displacementMap: d && k, emissiveMap: z, - normalMapObjectSpace: U && _.normalMapType === Ng, + normalMapObjectSpace: U && _.normalMapType === Bg, normalMapTangentSpace: U && _.normalMapType === Io, metalnessMap: ee, roughnessMap: J, @@ -23851,7 +23879,7 @@ function x2(s, e, t, n, i, r, o) { rendererExtensionParallelShaderCompile: n.has("KHR_parallel_shader_compile"), customProgramCacheKey: _.customProgramCacheKey() }; - return _t.vertexUv1s = c.has(1), _t.vertexUv2s = c.has(2), _t.vertexUv3s = c.has(3), c.clear(), _t; + return yt.vertexUv1s = c.has(1), yt.vertexUv2s = c.has(2), yt.vertexUv3s = c.has(3), c.clear(), yt; } function m(_) { const S = []; @@ -23885,7 +23913,7 @@ function x2(s, e, t, n, i, r, o) { break; } } - return D === void 0 && (D = new f2(s, S, _, r), h.push(D)), D; + return D === void 0 && (D = new d2(s, S, _, r), h.push(D)), D; } function E(_) { if (--_.usedTimes === 0) { @@ -23911,7 +23939,7 @@ function x2(s, e, t, n, i, r, o) { dispose: R }; } -function v2() { +function x2() { let s = /* @__PURE__ */ new WeakMap(); function e(o) { return s.has(o); @@ -23937,13 +23965,13 @@ function v2() { dispose: r }; } -function b2(s, e) { +function v2(s, e) { return s.groupOrder !== e.groupOrder ? s.groupOrder - e.groupOrder : s.renderOrder !== e.renderOrder ? s.renderOrder - e.renderOrder : s.material.id !== e.material.id ? s.material.id - e.material.id : s.z !== e.z ? s.z - e.z : s.id - e.id; } -function Nf(s, e) { +function Bf(s, e) { return s.groupOrder !== e.groupOrder ? s.groupOrder - e.groupOrder : s.renderOrder !== e.renderOrder ? s.renderOrder - e.renderOrder : s.z !== e.z ? e.z - s.z : s.id - e.id; } -function kf() { +function Nf() { const s = []; let e = 0; const t = [], n = [], i = []; @@ -23972,7 +24000,7 @@ function kf() { f.transmission > 0 ? n.unshift(m) : f.transparent === !0 ? i.unshift(m) : t.unshift(m); } function c(u, d) { - t.length > 1 && t.sort(u || b2), n.length > 1 && n.sort(d || Nf), i.length > 1 && i.sort(d || Nf); + t.length > 1 && t.sort(u || v2), n.length > 1 && n.sort(d || Bf), i.length > 1 && i.sort(d || Bf); } function h() { for (let u = e, d = s.length; u < d; u++) { @@ -23992,12 +24020,12 @@ function kf() { sort: c }; } -function y2() { +function b2() { let s = /* @__PURE__ */ new WeakMap(); function e(n, i) { const r = s.get(n); let o; - return r === void 0 ? (o = new kf(), s.set(n, [o])) : i >= r.length ? (o = new kf(), r.push(o)) : o = r[i], o; + return r === void 0 ? (o = new Nf(), s.set(n, [o])) : i >= r.length ? (o = new Nf(), r.push(o)) : o = r[i], o; } function t() { s = /* @__PURE__ */ new WeakMap(); @@ -24007,7 +24035,7 @@ function y2() { dispose: t }; } -function _2() { +function y2() { const s = {}; return { get: function(e) { @@ -24060,7 +24088,7 @@ function _2() { } }; } -function M2() { +function _2() { const s = {}; return { get: function(e) { @@ -24102,12 +24130,12 @@ function M2() { } }; } -let w2 = 0; -function S2(s, e) { +let M2 = 0; +function w2(s, e) { return (e.castShadow ? 2 : 0) - (s.castShadow ? 2 : 0) + (e.map ? 1 : 0) - (s.map ? 1 : 0); } -function E2(s) { - const e = new _2(), t = M2(), n = { +function S2(s) { + const e = new y2(), t = _2(), n = { version: 0, hash: { directionalLength: -1, @@ -24149,7 +24177,7 @@ function E2(s) { let h = 0, u = 0, d = 0; for (let _ = 0; _ < 9; _++) n.probe[_].set(0, 0, 0); let f = 0, p = 0, g = 0, x = 0, m = 0, b = 0, v = 0, y = 0, M = 0, E = 0, A = 0; - c.sort(S2); + c.sort(w2); for (let _ = 0, S = c.length; _ < S; _++) { const D = c[_], C = D.color, B = D.intensity, w = D.distance, F = D.shadow && D.shadow.map ? D.shadow.map.texture : null; if (D.isAmbientLight) @@ -24191,7 +24219,7 @@ function E2(s) { } x > 0 && (s.has("OES_texture_float_linear") === !0 ? (n.rectAreaLTC1 = Pe.LTC_FLOAT_1, n.rectAreaLTC2 = Pe.LTC_FLOAT_2) : (n.rectAreaLTC1 = Pe.LTC_HALF_1, n.rectAreaLTC2 = Pe.LTC_HALF_2)), n.ambient[0] = h, n.ambient[1] = u, n.ambient[2] = d; const R = n.hash; - (R.directionalLength !== f || R.pointLength !== p || R.spotLength !== g || R.rectAreaLength !== x || R.hemiLength !== m || R.numDirectionalShadows !== b || R.numPointShadows !== v || R.numSpotShadows !== y || R.numSpotMaps !== M || R.numLightProbes !== A) && (n.directional.length = f, n.spot.length = g, n.rectArea.length = x, n.point.length = p, n.hemi.length = m, n.directionalShadow.length = b, n.directionalShadowMap.length = b, n.pointShadow.length = v, n.pointShadowMap.length = v, n.spotShadow.length = y, n.spotShadowMap.length = y, n.directionalShadowMatrix.length = b, n.pointShadowMatrix.length = v, n.spotLightMatrix.length = y + M - E, n.spotLightMap.length = M, n.numSpotLightShadowsWithMaps = E, n.numLightProbes = A, R.directionalLength = f, R.pointLength = p, R.spotLength = g, R.rectAreaLength = x, R.hemiLength = m, R.numDirectionalShadows = b, R.numPointShadows = v, R.numSpotShadows = y, R.numSpotMaps = M, R.numLightProbes = A, n.version = w2++); + (R.directionalLength !== f || R.pointLength !== p || R.spotLength !== g || R.rectAreaLength !== x || R.hemiLength !== m || R.numDirectionalShadows !== b || R.numPointShadows !== v || R.numSpotShadows !== y || R.numSpotMaps !== M || R.numLightProbes !== A) && (n.directional.length = f, n.spot.length = g, n.rectArea.length = x, n.point.length = p, n.hemi.length = m, n.directionalShadow.length = b, n.directionalShadowMap.length = b, n.pointShadow.length = v, n.pointShadowMap.length = v, n.spotShadow.length = y, n.spotShadowMap.length = y, n.directionalShadowMatrix.length = b, n.pointShadowMatrix.length = v, n.spotLightMatrix.length = y + M - E, n.spotLightMap.length = M, n.numSpotLightShadowsWithMaps = E, n.numLightProbes = A, R.directionalLength = f, R.pointLength = p, R.spotLength = g, R.rectAreaLength = x, R.hemiLength = m, R.numDirectionalShadows = b, R.numPointShadows = v, R.numSpotShadows = y, R.numSpotMaps = M, R.numLightProbes = A, n.version = M2++); } function l(c, h) { let u = 0, d = 0, f = 0, p = 0, g = 0; @@ -24222,8 +24250,8 @@ function E2(s) { state: n }; } -function Uf(s) { - const e = new E2(s), t = [], n = []; +function kf(s) { + const e = new S2(s), t = [], n = []; function i(h) { c.camera = h, t.length = 0, n.length = 0; } @@ -24255,12 +24283,12 @@ function Uf(s) { pushShadow: o }; } -function T2(s) { +function E2(s) { let e = /* @__PURE__ */ new WeakMap(); function t(i, r = 0) { const o = e.get(i); let a; - return o === void 0 ? (a = new Uf(s), e.set(i, [a])) : r >= o.length ? (a = new Uf(s), o.push(a)) : a = o[r], a; + return o === void 0 ? (a = new kf(s), e.set(i, [a])) : r >= o.length ? (a = new kf(s), o.push(a)) : a = o[r], a; } function n() { e = /* @__PURE__ */ new WeakMap(); @@ -24270,9 +24298,9 @@ function T2(s) { dispose: n }; } -const A2 = `void main() { +const T2 = `void main() { gl_Position = vec4( position, 1.0 ); -}`, C2 = `uniform sampler2D shadow_pass; +}`, A2 = `uniform sampler2D shadow_pass; uniform vec2 resolution; uniform float radius; #include @@ -24299,9 +24327,9 @@ void main() { float std_dev = sqrt( squared_mean - mean * mean ); gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) ); }`; -function P2(s, e, t) { - let n = new ku(); - const i = new ce(), r = new ce(), o = new tt(), a = new Mv({ depthPacking: Bg }), l = new wv(), c = {}, h = t.maxTextureSize, u = { [Fn]: un, [un]: Fn, [At]: At }, d = new Ut({ +function C2(s, e, t) { + let n = new Nu(); + const i = new ce(), r = new ce(), o = new tt(), a = new _v({ depthPacking: Ig }), l = new Mv(), c = {}, h = t.maxTextureSize, u = { [Fn]: un, [un]: Fn, [At]: At }, d = new Ut({ defines: { VSM_SAMPLES: 8 }, @@ -24310,8 +24338,8 @@ function P2(s, e, t) { resolution: { value: new ce() }, radius: { value: 4 } }, - vertexShader: A2, - fragmentShader: C2 + vertexShader: T2, + fragmentShader: A2 }), f = d.clone(); f.defines.HORIZONTAL_PASS = 1; const p = new ut(); @@ -24323,7 +24351,7 @@ function P2(s, e, t) { ) ); const g = new dt(p, d), x = this; - this.enabled = !1, this.autoUpdate = !0, this.needsUpdate = !1, this.type = tm; + this.enabled = !1, this.autoUpdate = !0, this.needsUpdate = !1, this.type = em; let m = this.type; this.render = function(E, A, R) { if (x.enabled === !1 || x.autoUpdate === !1 && x.needsUpdate === !1 || E.length === 0) return; @@ -24411,17 +24439,17 @@ function P2(s, e, t) { } } } -const R2 = { - [hh]: uh, +const P2 = { + [ch]: hh, + [uh]: ph, [dh]: mh, - [fh]: gh, - [vr]: ph, - [uh]: hh, + [vr]: fh, + [hh]: ch, + [ph]: uh, [mh]: dh, - [gh]: fh, - [ph]: vr + [fh]: vr }; -function L2(s, e) { +function R2(s, e) { function t() { let q = !1; const Ee = new tt(); @@ -24434,8 +24462,8 @@ function L2(s, e) { setLocked: function(xe) { q = xe; }, - setClear: function(xe, me, Ue, Ye, _t) { - _t === !0 && (xe *= Ye, me *= Ye, Ue *= Ye), Ee.set(xe, me, Ue, Ye), Me.equals(Ee) === !1 && (s.clearColor(xe, me, Ue, Ye), Me.copy(Ee)); + setClear: function(xe, me, Ue, Ye, yt) { + yt === !0 && (xe *= Ye, me *= Ye, Ue *= Ye), Ee.set(xe, me, Ue, Ye), Me.equals(Ee) === !1 && (s.clearColor(xe, me, Ue, Ye), Me.copy(Ee)); }, reset: function() { q = !1, _e = null, Me.set(-1, 0, 0, 0); @@ -24463,30 +24491,30 @@ function L2(s, e) { _e !== me && !q && (s.depthMask(me), _e = me); }, setFunc: function(me) { - if (Ee && (me = R2[me]), Me !== me) { + if (Ee && (me = P2[me]), Me !== me) { switch (me) { - case hh: + case ch: s.depthFunc(s.NEVER); break; - case uh: + case hh: s.depthFunc(s.ALWAYS); break; - case dh: + case uh: s.depthFunc(s.LESS); break; case vr: s.depthFunc(s.LEQUAL); break; - case fh: + case dh: s.depthFunc(s.EQUAL); break; - case ph: + case fh: s.depthFunc(s.GEQUAL); break; - case mh: + case ph: s.depthFunc(s.GREATER); break; - case gh: + case mh: s.depthFunc(s.NOTEQUAL); break; default: @@ -24507,7 +24535,7 @@ function L2(s, e) { }; } function i() { - let q = !1, Ee = null, _e = null, Me = null, xe = null, me = null, Ue = null, Ye = null, _t = null; + let q = !1, Ee = null, _e = null, Me = null, xe = null, me = null, Ue = null, Ye = null, yt = null; return { setTest: function(ft) { q || (ft ? he(s.STENCIL_TEST) : fe(s.STENCIL_TEST)); @@ -24525,10 +24553,10 @@ function L2(s, e) { q = ft; }, setClear: function(ft) { - _t !== ft && (s.clearStencil(ft), _t = ft); + yt !== ft && (s.clearStencil(ft), yt = ft); }, reset: function() { - q = !1, Ee = null, _e = null, Me = null, xe = null, me = null, Ue = null, Ye = null, _t = null; + q = !1, Ee = null, _e = null, Me = null, xe = null, me = null, Ue = null, Ye = null, yt = null; } }; } @@ -24548,7 +24576,7 @@ function L2(s, e) { return me; } const ie = {}; - ie[s.TEXTURE_2D] = de(s.TEXTURE_2D, s.TEXTURE_2D, 1), ie[s.TEXTURE_CUBE_MAP] = de(s.TEXTURE_CUBE_MAP, s.TEXTURE_CUBE_MAP_POSITIVE_X, 6), ie[s.TEXTURE_2D_ARRAY] = de(s.TEXTURE_2D_ARRAY, s.TEXTURE_2D_ARRAY, 1, 1), ie[s.TEXTURE_3D] = de(s.TEXTURE_3D, s.TEXTURE_3D, 1, 1), r.setClear(0, 0, 0, 1), o.setClear(1), a.setClear(0), he(s.DEPTH_TEST), o.setFunc(vr), V(!1), U(ud), he(s.CULL_FACE), T(Xt); + ie[s.TEXTURE_2D] = de(s.TEXTURE_2D, s.TEXTURE_2D, 1), ie[s.TEXTURE_CUBE_MAP] = de(s.TEXTURE_CUBE_MAP, s.TEXTURE_CUBE_MAP_POSITIVE_X, 6), ie[s.TEXTURE_2D_ARRAY] = de(s.TEXTURE_2D_ARRAY, s.TEXTURE_2D_ARRAY, 1, 1), ie[s.TEXTURE_3D] = de(s.TEXTURE_3D, s.TEXTURE_3D, 1, 1), r.setClear(0, 0, 0, 1), o.setClear(1), a.setClear(0), he(s.DEPTH_TEST), o.setFunc(vr), V(!1), U(hd), he(s.CULL_FACE), T(Xt); function he(q) { h[q] !== !0 && (s.enable(q), h[q] = !0); } @@ -24577,46 +24605,46 @@ function L2(s, e) { } const Ke = { [Zn]: s.FUNC_ADD, - [pg]: s.FUNC_SUBTRACT, - [mg]: s.FUNC_REVERSE_SUBTRACT + [fg]: s.FUNC_SUBTRACT, + [pg]: s.FUNC_REVERSE_SUBTRACT }; - Ke[gg] = s.MIN, Ke[xg] = s.MAX; + Ke[mg] = s.MIN, Ke[gg] = s.MAX; const Ne = { [lo]: s.ZERO, - [vg]: s.ONE, - [bg]: s.SRC_COLOR, - [oh]: s.SRC_ALPHA, - [wg]: s.SRC_ALPHA_SATURATE, - [ch]: s.DST_COLOR, - [lh]: s.DST_ALPHA, - [yg]: s.ONE_MINUS_SRC_COLOR, - [ah]: s.ONE_MINUS_SRC_ALPHA, - [Mg]: s.ONE_MINUS_DST_COLOR, - [_g]: s.ONE_MINUS_DST_ALPHA, - [Sg]: s.CONSTANT_COLOR, - [Eg]: s.ONE_MINUS_CONSTANT_COLOR, - [Tg]: s.CONSTANT_ALPHA, - [Ag]: s.ONE_MINUS_CONSTANT_ALPHA + [xg]: s.ONE, + [vg]: s.SRC_COLOR, + [rh]: s.SRC_ALPHA, + [Mg]: s.SRC_ALPHA_SATURATE, + [lh]: s.DST_COLOR, + [ah]: s.DST_ALPHA, + [bg]: s.ONE_MINUS_SRC_COLOR, + [oh]: s.ONE_MINUS_SRC_ALPHA, + [_g]: s.ONE_MINUS_DST_COLOR, + [yg]: s.ONE_MINUS_DST_ALPHA, + [wg]: s.CONSTANT_COLOR, + [Sg]: s.ONE_MINUS_CONSTANT_COLOR, + [Eg]: s.CONSTANT_ALPHA, + [Tg]: s.ONE_MINUS_CONSTANT_ALPHA }; - function T(q, Ee, _e, Me, xe, me, Ue, Ye, _t, ft) { + function T(q, Ee, _e, Me, xe, me, Ue, Ye, yt, ft) { if (q === Xt) { g === !0 && (fe(s.BLEND), g = !1); return; } - if (g === !1 && (he(s.BLEND), g = !0), q !== im) { + if (g === !1 && (he(s.BLEND), g = !0), q !== nm) { if (q !== x || ft !== _) { if ((m !== Zn || y !== Zn) && (s.blendEquation(s.FUNC_ADD), m = Zn, y = Zn), ft) switch (q) { case pr: s.blendFuncSeparate(s.ONE, s.ONE_MINUS_SRC_ALPHA, s.ONE, s.ONE_MINUS_SRC_ALPHA); break; - case rh: + case sh: s.blendFunc(s.ONE, s.ONE); break; - case dd: + case ud: s.blendFuncSeparate(s.ZERO, s.ONE_MINUS_SRC_COLOR, s.ZERO, s.ONE); break; - case fd: + case dd: s.blendFuncSeparate(s.DST_COLOR, s.ONE_MINUS_SRC_ALPHA, s.ZERO, s.ONE); break; default: @@ -24628,13 +24656,13 @@ function L2(s, e) { case pr: s.blendFuncSeparate(s.SRC_ALPHA, s.ONE_MINUS_SRC_ALPHA, s.ONE, s.ONE_MINUS_SRC_ALPHA); break; - case rh: + case sh: s.blendFuncSeparate(s.SRC_ALPHA, s.ONE, s.ONE, s.ONE); break; - case dd: + case ud: et("WebGLState: SubtractiveBlending requires material.premultipliedAlpha = true"); break; - case fd: + case dd: et("WebGLState: MultiplyBlending requires material.premultipliedAlpha = true"); break; default: @@ -24645,7 +24673,7 @@ function L2(s, e) { } return; } - xe = xe || Ee, me = me || _e, Ue = Ue || Me, (Ee !== m || xe !== y) && (s.blendEquationSeparate(Ke[Ee], Ke[xe]), m = Ee, y = xe), (_e !== b || Me !== v || me !== M || Ue !== E) && (s.blendFuncSeparate(Ne[_e], Ne[Me], Ne[me], Ne[Ue]), b = _e, v = Me, M = me, E = Ue), (Ye.equals(A) === !1 || _t !== R) && (s.blendColor(Ye.r, Ye.g, Ye.b, _t), A.copy(Ye), R = _t), x = q, _ = !1; + xe = xe || Ee, me = me || _e, Ue = Ue || Me, (Ee !== m || xe !== y) && (s.blendEquationSeparate(Ke[Ee], Ke[xe]), m = Ee, y = xe), (_e !== b || Me !== v || me !== M || Ue !== E) && (s.blendFuncSeparate(Ne[_e], Ne[Me], Ne[me], Ne[Ue]), b = _e, v = Me, M = me, E = Ue), (Ye.equals(A) === !1 || yt !== R) && (s.blendColor(Ye.r, Ye.g, Ye.b, yt), A.copy(Ye), R = yt), x = q, _ = !1; } function I(q, Ee) { q.side === At ? fe(s.CULL_FACE) : he(s.CULL_FACE); @@ -24658,7 +24686,7 @@ function L2(s, e) { S !== q && (q ? s.frontFace(s.CW) : s.frontFace(s.CCW), S = q); } function U(q) { - q !== dg ? (he(s.CULL_FACE), q !== D && (q === ud ? s.cullFace(s.BACK) : q === fg ? s.cullFace(s.FRONT) : s.cullFace(s.FRONT_AND_BACK))) : fe(s.CULL_FACE), D = q; + q !== ug ? (he(s.CULL_FACE), q !== D && (q === hd ? s.cullFace(s.BACK) : q === dg ? s.cullFace(s.FRONT) : s.cullFace(s.FRONT_AND_BACK))) : fe(s.CULL_FACE), D = q; } function k(q) { q !== C && (W && s.lineWidth(q), C = q); @@ -24808,7 +24836,7 @@ function L2(s, e) { reset: Ge }; } -function D2(s, e, t, n, i, r, o) { +function L2(s, e, t, n, i, r, o) { const a = e.has("WEBGL_multisampled_render_to_texture") ? e.get("WEBGL_multisampled_render_to_texture") : null, l = typeof navigator > "u" ? !1 : /OculusBrowser/g.test(navigator.userAgent), c = new ce(), h = /* @__PURE__ */ new WeakMap(); let u; const d = /* @__PURE__ */ new WeakMap(); @@ -24972,20 +25000,20 @@ function D2(s, e, t, n, i, r, o) { [pl]: s.MIRRORED_REPEAT }, re = { [Qt]: s.NEAREST, - [um]: s.NEAREST_MIPMAP_NEAREST, + [hm]: s.NEAREST_MIPMAP_NEAREST, [co]: s.NEAREST_MIPMAP_LINEAR, [Yt]: s.LINEAR, [el]: s.LINEAR_MIPMAP_NEAREST, [Ai]: s.LINEAR_MIPMAP_LINEAR }, X = { - [kg]: s.NEVER, - [Vg]: s.ALWAYS, - [Ug]: s.LESS, - [bm]: s.LEQUAL, - [Og]: s.EQUAL, - [Hg]: s.GEQUAL, - [Fg]: s.GREATER, - [zg]: s.NOTEQUAL + [Ng]: s.NEVER, + [Hg]: s.ALWAYS, + [kg]: s.LESS, + [vm]: s.LEQUAL, + [Ug]: s.EQUAL, + [zg]: s.GEQUAL, + [Og]: s.GREATER, + [Fg]: s.NOTEQUAL }; function Y(N, L) { if (L.type === $n && e.has("OES_texture_float_linear") === !1 && (L.magFilter === Yt || L.magFilter === el || L.magFilter === co || L.magFilter === Ai || L.minFilter === Yt || L.minFilter === el || L.minFilter === co || L.minFilter === Ai) && He("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."), s.texParameteri(N, s.TEXTURE_WRAP_S, Z[L.wrapS]), s.texParameteri(N, s.TEXTURE_WRAP_T, Z[L.wrapT]), (N === s.TEXTURE_3D || N === s.TEXTURE_2D_ARRAY) && s.texParameteri(N, s.TEXTURE_WRAP_R, Z[L.wrapR]), s.texParameteri(N, s.TEXTURE_MAG_FILTER, re[L.magFilter]), s.texParameteri(N, s.TEXTURE_MIN_FILTER, re[L.minFilter]), L.compareFunction && (s.texParameteri(N, s.TEXTURE_COMPARE_MODE, s.COMPARE_REF_TO_TEXTURE), s.texParameteri(N, s.TEXTURE_COMPARE_FUNC, X[L.compareFunction])), e.has("EXT_texture_filter_anisotropic") === !0) { @@ -25076,13 +25104,13 @@ function D2(s, e, t, n, i, r, o) { if (q) { if (_e) if (L.layerUpdates.size > 0) { - const Ue = pf(Ae.width, Ae.height, L.format, L.type); + const Ue = ff(Ae.width, Ae.height, L.format, L.type); for (const Ye of L.layerUpdates) { - const _t = Ae.data.subarray( + const yt = Ae.data.subarray( Ye * Ue / Ae.data.BYTES_PER_ELEMENT, (Ye + 1) * Ue / Ae.data.BYTES_PER_ELEMENT ); - t.compressedTexSubImage3D(s.TEXTURE_2D_ARRAY, xe, 0, 0, Ye, Ae.width, Ae.height, 1, ye, _t); + t.compressedTexSubImage3D(s.TEXTURE_2D_ARRAY, xe, 0, 0, Ye, Ae.width, Ae.height, 1, ye, yt); } L.clearLayerUpdates(); } else @@ -25102,7 +25130,7 @@ function D2(s, e, t, n, i, r, o) { if (q) { if (Ee && t.texStorage3D(s.TEXTURE_2D_ARRAY, Me, ke, ue.width, ue.height, ue.depth), _e) if (L.layerUpdates.size > 0) { - const xe = pf(ue.width, ue.height, L.format, L.type); + const xe = ff(ue.width, ue.height, L.format, L.type); for (const me of L.layerUpdates) { const Ue = ue.data.subarray( me * xe / ue.data.BYTES_PER_ELEMENT, @@ -25181,8 +25209,8 @@ function D2(s, e, t, n, i, r, o) { if (ue) { q ? _e && t.texSubImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + me, 0, 0, 0, ye[me].width, ye[me].height, ke, Ae, ye[me].data) : t.texImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + me, 0, Ge, ye[me].width, ye[me].height, 0, ke, Ae, ye[me].data); for (let Ue = 0; Ue < xe.length; Ue++) { - const _t = xe[Ue].image[me].image; - q ? _e && t.texSubImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + me, Ue + 1, 0, 0, _t.width, _t.height, ke, Ae, _t.data) : t.texImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + me, Ue + 1, Ge, _t.width, _t.height, 0, ke, Ae, _t.data); + const yt = xe[Ue].image[me].image; + q ? _e && t.texSubImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + me, Ue + 1, 0, 0, yt.width, yt.height, ke, Ae, yt.data) : t.texImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + me, Ue + 1, Ge, yt.width, yt.height, 0, ke, Ae, yt.data); } } else { q ? _e && t.texSubImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + me, 0, 0, 0, ke, Ae, ye[me]) : t.texImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X + me, 0, Ge, ke, Ae, ye[me]); @@ -25398,32 +25426,32 @@ function D2(s, e, t, n, i, r, o) { } this.allocateTextureUnit = B, this.resetTextureUnits = C, this.setTexture2D = F, this.setTexture2DArray = W, this.setTexture3D = j, this.setTextureCube = $, this.rebindTextures = Ke, this.setupRenderTarget = Ne, this.updateRenderTargetMipmap = T, this.updateMultisampleRenderTarget = U, this.setupDepthRenderbuffer = Be, this.setupFrameBufferTexture = fe, this.useMultisampledRTT = z; } -function I2(s, e) { +function D2(s, e) { function t(n, i = Xi) { let r; const o = st.getTransfer(i); if (n === Jn) return s.UNSIGNED_BYTE; - if (n === Su) return s.UNSIGNED_SHORT_4_4_4_4; - if (n === Eu) return s.UNSIGNED_SHORT_5_5_5_1; - if (n === pm) return s.UNSIGNED_INT_5_9_9_9_REV; - if (n === mm) return s.UNSIGNED_INT_10F_11F_11F_REV; - if (n === dm) return s.BYTE; - if (n === fm) return s.SHORT; + if (n === wu) return s.UNSIGNED_SHORT_4_4_4_4; + if (n === Su) return s.UNSIGNED_SHORT_5_5_5_1; + if (n === fm) return s.UNSIGNED_INT_5_9_9_9_REV; + if (n === pm) return s.UNSIGNED_INT_10F_11F_11F_REV; + if (n === um) return s.BYTE; + if (n === dm) return s.SHORT; if (n === wo) return s.UNSIGNED_SHORT; - if (n === wu) return s.INT; + if (n === Mu) return s.INT; if (n === Ms) return s.UNSIGNED_INT; if (n === $n) return s.FLOAT; if (n === Un) return s.HALF_FLOAT; - if (n === gm) return s.ALPHA; - if (n === xm) return s.RGB; + if (n === mm) return s.ALPHA; + if (n === gm) return s.RGB; if (n === xn) return s.RGBA; if (n === So) return s.DEPTH_COMPONENT; if (n === Mr) return s.DEPTH_STENCIL; - if (n === Tu) return s.RED; - if (n === Au) return s.RED_INTEGER; - if (n === Cu) return s.RG; - if (n === Pu) return s.RG_INTEGER; - if (n === Ru) return s.RGBA_INTEGER; + if (n === Eu) return s.RED; + if (n === Tu) return s.RED_INTEGER; + if (n === Au) return s.RG; + if (n === Cu) return s.RG_INTEGER; + if (n === Pu) return s.RGBA_INTEGER; if (n === tl || n === nl || n === il || n === sl) if (o === lt) if (r = e.get("WEBGL_compressed_texture_s3tc_srgb"), r !== null) { @@ -25440,63 +25468,63 @@ function I2(s, e) { if (n === sl) return r.COMPRESSED_RGBA_S3TC_DXT5_EXT; } else return null; - if (n === bh || n === yh || n === _h || n === Mh) + if (n === vh || n === bh || n === yh || n === _h) if (r = e.get("WEBGL_compressed_texture_pvrtc"), r !== null) { - if (n === bh) return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; - if (n === yh) return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; - if (n === _h) return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; - if (n === Mh) return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; + if (n === vh) return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; + if (n === bh) return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; + if (n === yh) return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; + if (n === _h) return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; } else return null; - if (n === wh || n === Sh || n === Eh) + if (n === Mh || n === wh || n === Sh) if (r = e.get("WEBGL_compressed_texture_etc"), r !== null) { - if (n === wh || n === Sh) return o === lt ? r.COMPRESSED_SRGB8_ETC2 : r.COMPRESSED_RGB8_ETC2; - if (n === Eh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : r.COMPRESSED_RGBA8_ETC2_EAC; + if (n === Mh || n === wh) return o === lt ? r.COMPRESSED_SRGB8_ETC2 : r.COMPRESSED_RGB8_ETC2; + if (n === Sh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : r.COMPRESSED_RGBA8_ETC2_EAC; } else return null; - if (n === Th || n === Ah || n === Ch || n === Ph || n === Rh || n === Lh || n === Dh || n === Ih || n === Bh || n === Nh || n === kh || n === Uh || n === Oh || n === Fh) + if (n === Eh || n === Th || n === Ah || n === Ch || n === Ph || n === Rh || n === Lh || n === Dh || n === Ih || n === Bh || n === Nh || n === kh || n === Uh || n === Oh) if (r = e.get("WEBGL_compressed_texture_astc"), r !== null) { - if (n === Th) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : r.COMPRESSED_RGBA_ASTC_4x4_KHR; - if (n === Ah) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : r.COMPRESSED_RGBA_ASTC_5x4_KHR; - if (n === Ch) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : r.COMPRESSED_RGBA_ASTC_5x5_KHR; - if (n === Ph) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : r.COMPRESSED_RGBA_ASTC_6x5_KHR; - if (n === Rh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : r.COMPRESSED_RGBA_ASTC_6x6_KHR; - if (n === Lh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : r.COMPRESSED_RGBA_ASTC_8x5_KHR; - if (n === Dh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : r.COMPRESSED_RGBA_ASTC_8x6_KHR; - if (n === Ih) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : r.COMPRESSED_RGBA_ASTC_8x8_KHR; - if (n === Bh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : r.COMPRESSED_RGBA_ASTC_10x5_KHR; - if (n === Nh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : r.COMPRESSED_RGBA_ASTC_10x6_KHR; - if (n === kh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : r.COMPRESSED_RGBA_ASTC_10x8_KHR; - if (n === Uh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : r.COMPRESSED_RGBA_ASTC_10x10_KHR; - if (n === Oh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : r.COMPRESSED_RGBA_ASTC_12x10_KHR; - if (n === Fh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : r.COMPRESSED_RGBA_ASTC_12x12_KHR; + if (n === Eh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : r.COMPRESSED_RGBA_ASTC_4x4_KHR; + if (n === Th) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : r.COMPRESSED_RGBA_ASTC_5x4_KHR; + if (n === Ah) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : r.COMPRESSED_RGBA_ASTC_5x5_KHR; + if (n === Ch) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : r.COMPRESSED_RGBA_ASTC_6x5_KHR; + if (n === Ph) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : r.COMPRESSED_RGBA_ASTC_6x6_KHR; + if (n === Rh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : r.COMPRESSED_RGBA_ASTC_8x5_KHR; + if (n === Lh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : r.COMPRESSED_RGBA_ASTC_8x6_KHR; + if (n === Dh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : r.COMPRESSED_RGBA_ASTC_8x8_KHR; + if (n === Ih) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : r.COMPRESSED_RGBA_ASTC_10x5_KHR; + if (n === Bh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : r.COMPRESSED_RGBA_ASTC_10x6_KHR; + if (n === Nh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : r.COMPRESSED_RGBA_ASTC_10x8_KHR; + if (n === kh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : r.COMPRESSED_RGBA_ASTC_10x10_KHR; + if (n === Uh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : r.COMPRESSED_RGBA_ASTC_12x10_KHR; + if (n === Oh) return o === lt ? r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : r.COMPRESSED_RGBA_ASTC_12x12_KHR; } else return null; - if (n === zh || n === Hh || n === Vh) + if (n === Fh || n === zh || n === Hh) if (r = e.get("EXT_texture_compression_bptc"), r !== null) { - if (n === zh) return o === lt ? r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : r.COMPRESSED_RGBA_BPTC_UNORM_EXT; - if (n === Hh) return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT; - if (n === Vh) return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT; + if (n === Fh) return o === lt ? r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : r.COMPRESSED_RGBA_BPTC_UNORM_EXT; + if (n === zh) return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT; + if (n === Hh) return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT; } else return null; - if (n === Gh || n === Wh || n === Xh || n === jh) + if (n === Vh || n === Gh || n === Wh || n === Xh) if (r = e.get("EXT_texture_compression_rgtc"), r !== null) { - if (n === Gh) return r.COMPRESSED_RED_RGTC1_EXT; - if (n === Wh) return r.COMPRESSED_SIGNED_RED_RGTC1_EXT; - if (n === Xh) return r.COMPRESSED_RED_GREEN_RGTC2_EXT; - if (n === jh) return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT; + if (n === Vh) return r.COMPRESSED_RED_RGTC1_EXT; + if (n === Gh) return r.COMPRESSED_SIGNED_RED_RGTC1_EXT; + if (n === Wh) return r.COMPRESSED_RED_GREEN_RGTC2_EXT; + if (n === Xh) return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT; } else return null; return n === _r ? s.UNSIGNED_INT_24_8 : s[n] !== void 0 ? s[n] : null; } return { convert: t }; } -const B2 = ` +const I2 = ` void main() { gl_Position = vec4( position, 1.0 ); -}`, N2 = ` +}`, B2 = ` uniform sampler2DArray depthColor; uniform float depthWidth; uniform float depthHeight; @@ -25516,7 +25544,7 @@ void main() { } }`; -class k2 { +class N2 { /** * Constructs a new depth sensing module. */ @@ -25531,7 +25559,7 @@ class k2 { */ init(e, t) { if (this.texture === null) { - const n = new Bm(e.texture); + const n = new Im(e.texture); (e.depthNear !== t.depthNear || e.depthFar !== t.depthFar) && (this.depthNear = e.depthNear, this.depthFar = e.depthFar), this.texture = n; } } @@ -25544,8 +25572,8 @@ class k2 { getMesh(e) { if (this.texture !== null && this.mesh === null) { const t = e.cameras[0].viewport, n = new Ut({ - vertexShader: B2, - fragmentShader: N2, + vertexShader: I2, + fragmentShader: B2, uniforms: { depthColor: { value: this.texture }, depthWidth: { value: t.z }, @@ -25571,7 +25599,7 @@ class k2 { return this.texture; } } -class U2 extends As { +class k2 extends As { /** * Constructs a new WebGL renderer. * @@ -25582,7 +25610,7 @@ class U2 extends As { super(); const n = this; let i = null, r = 1, o = null, a = "local-floor", l = 1, c = null, h = null, u = null, d = null, f = null, p = null; - const g = typeof XRWebGLBinding < "u", x = new k2(), m = {}, b = t.getContextAttributes(); + const g = typeof XRWebGLBinding < "u", x = new N2(), m = {}, b = t.getContextAttributes(); let v = null, y = null; const M = [], E = [], A = new ce(); let R = null; @@ -25590,7 +25618,7 @@ class U2 extends As { _.viewport = new tt(); const S = new nn(); S.viewport = new tt(); - const D = [_, S], C = new Gv(); + const D = [_, S], C = new Vv(); let B = null, w = null; this.cameraAutoUpdate = !0, this.enabled = !1, this.isPresenting = !1, this.getController = function(ie) { let he = M[ie]; @@ -25652,7 +25680,7 @@ class U2 extends As { { format: xn, type: Jn, - depthTexture: new Uu(d.textureWidth, d.textureHeight, ve, void 0, void 0, void 0, void 0, void 0, void 0, fe), + depthTexture: new ku(d.textureWidth, d.textureHeight, ve, void 0, void 0, void 0, void 0, void 0, void 0, fe), stencilBuffer: b.stencil, colorSpace: e.outputColorSpace, samples: b.antialias ? 4 : 0, @@ -25791,7 +25819,7 @@ class U2 extends As { const T = fe[Ne].camera; if (T) { let I = m[T]; - I || (I = new Bm(), m[T] = I); + I || (I = new Im(), m[T] = I); const V = u.getCameraImage(T); I.sourceTexture = V; } @@ -25804,20 +25832,20 @@ class U2 extends As { } ge && ge(ie, he), he.detectedPlanes && n.dispatchEvent({ type: "planesdetected", data: he }), p = null; } - const de = new Zm(); + const de = new qm(); de.setAnimationLoop(pe), this.setAnimationLoop = function(ie) { ge = ie; }, this.dispose = function() { }; } } -const ls = /* @__PURE__ */ new wn(), O2 = /* @__PURE__ */ new ze(); -function F2(s, e) { +const ls = /* @__PURE__ */ new wn(), U2 = /* @__PURE__ */ new ze(); +function O2(s, e) { function t(x, m) { x.matrixAutoUpdate === !0 && x.updateMatrix(), m.value.copy(x.matrix); } function n(x, m) { - m.color.getRGB(x.fogColor.value, Em(s)), m.isFog ? (x.fogNear.value = m.near, x.fogFar.value = m.far) : m.isFogExp2 && (x.fogDensity.value = m.density); + m.color.getRGB(x.fogColor.value, Sm(s)), m.isFog ? (x.fogNear.value = m.near, x.fogFar.value = m.far) : m.isFogExp2 && (x.fogDensity.value = m.density); } function i(x, m, b, v, y) { m.isMeshBasicMaterial || m.isMeshLambertMaterial ? r(x, m) : m.isMeshToonMaterial ? (r(x, m), u(x, m)) : m.isMeshPhongMaterial ? (r(x, m), h(x, m)) : m.isMeshStandardMaterial ? (r(x, m), d(x, m), m.isMeshPhysicalMaterial && f(x, m, y)) : m.isMeshMatcapMaterial ? (r(x, m), p(x, m)) : m.isMeshDepthMaterial ? r(x, m) : m.isMeshDistanceMaterial ? (r(x, m), g(x, m)) : m.isMeshNormalMaterial ? r(x, m) : m.isLineBasicMaterial ? (o(x, m), m.isLineDashedMaterial && a(x, m)) : m.isPointsMaterial ? l(x, m, b, v) : m.isSpriteMaterial ? c(x, m) : m.isShadowMaterial ? (x.color.value.copy(m.color), x.opacity.value = m.opacity) : m.isShaderMaterial && (m.uniformsNeedUpdate = !1); @@ -25825,7 +25853,7 @@ function F2(s, e) { function r(x, m) { x.opacity.value = m.opacity, m.color && x.diffuse.value.copy(m.color), m.emissive && x.emissive.value.copy(m.emissive).multiplyScalar(m.emissiveIntensity), m.map && (x.map.value = m.map, t(m.map, x.mapTransform)), m.alphaMap && (x.alphaMap.value = m.alphaMap, t(m.alphaMap, x.alphaMapTransform)), m.bumpMap && (x.bumpMap.value = m.bumpMap, t(m.bumpMap, x.bumpMapTransform), x.bumpScale.value = m.bumpScale, m.side === un && (x.bumpScale.value *= -1)), m.normalMap && (x.normalMap.value = m.normalMap, t(m.normalMap, x.normalMapTransform), x.normalScale.value.copy(m.normalScale), m.side === un && x.normalScale.value.negate()), m.displacementMap && (x.displacementMap.value = m.displacementMap, t(m.displacementMap, x.displacementMapTransform), x.displacementScale.value = m.displacementScale, x.displacementBias.value = m.displacementBias), m.emissiveMap && (x.emissiveMap.value = m.emissiveMap, t(m.emissiveMap, x.emissiveMapTransform)), m.specularMap && (x.specularMap.value = m.specularMap, t(m.specularMap, x.specularMapTransform)), m.alphaTest > 0 && (x.alphaTest.value = m.alphaTest); const b = e.get(m), v = b.envMap, y = b.envMapRotation; - v && (x.envMap.value = v, ls.copy(y), ls.x *= -1, ls.y *= -1, ls.z *= -1, v.isCubeTexture && v.isRenderTargetTexture === !1 && (ls.y *= -1, ls.z *= -1), x.envMapRotation.value.setFromMatrix4(O2.makeRotationFromEuler(ls)), x.flipEnvMap.value = v.isCubeTexture && v.isRenderTargetTexture === !1 ? -1 : 1, x.reflectivity.value = m.reflectivity, x.ior.value = m.ior, x.refractionRatio.value = m.refractionRatio), m.lightMap && (x.lightMap.value = m.lightMap, x.lightMapIntensity.value = m.lightMapIntensity, t(m.lightMap, x.lightMapTransform)), m.aoMap && (x.aoMap.value = m.aoMap, x.aoMapIntensity.value = m.aoMapIntensity, t(m.aoMap, x.aoMapTransform)); + v && (x.envMap.value = v, ls.copy(y), ls.x *= -1, ls.y *= -1, ls.z *= -1, v.isCubeTexture && v.isRenderTargetTexture === !1 && (ls.y *= -1, ls.z *= -1), x.envMapRotation.value.setFromMatrix4(U2.makeRotationFromEuler(ls)), x.flipEnvMap.value = v.isCubeTexture && v.isRenderTargetTexture === !1 ? -1 : 1, x.reflectivity.value = m.reflectivity, x.ior.value = m.ior, x.refractionRatio.value = m.refractionRatio), m.lightMap && (x.lightMap.value = m.lightMap, x.lightMapIntensity.value = m.lightMapIntensity, t(m.lightMap, x.lightMapTransform)), m.aoMap && (x.aoMap.value = m.aoMap, x.aoMapIntensity.value = m.aoMapIntensity, t(m.aoMap, x.aoMapTransform)); } function o(x, m) { x.diffuse.value.copy(m.color), x.opacity.value = m.opacity, m.map && (x.map.value = m.map, t(m.map, x.mapTransform)); @@ -25863,7 +25891,7 @@ function F2(s, e) { refreshMaterialUniforms: i }; } -function z2(s, e, t, n) { +function F2(s, e, t, n) { let i = {}, r = {}, o = []; const a = s.getParameter(s.MAX_UNIFORM_BUFFER_BINDINGS); function l(b, v) { @@ -25967,7 +25995,7 @@ function z2(s, e, t, n) { dispose: m }; } -const H2 = new Uint16Array([ +const z2 = new Uint16Array([ 11481, 15204, 11534, @@ -28018,10 +28046,10 @@ const H2 = new Uint16Array([ 839 ]); let yi = null; -function V2() { - return yi === null && (yi = new Bo(H2, 32, 32, Cu, Un), yi.minFilter = Yt, yi.magFilter = Yt, yi.wrapS = ai, yi.wrapT = ai, yi.generateMipmaps = !1, yi.needsUpdate = !0), yi; +function H2() { + return yi === null && (yi = new Bo(z2, 32, 32, Au, Un), yi.minFilter = Yt, yi.magFilter = Yt, yi.wrapS = ai, yi.wrapT = ai, yi.generateMipmaps = !1, yi.needsUpdate = !0), yi; } -class Qm { +class Jm { /** * Constructs a new WebGL renderer. * @@ -28029,7 +28057,7 @@ class Qm { */ constructor(e = {}) { const { - canvas: t = Gg(), + canvas: t = Vg(), context: n = null, depth: i = !0, stencil: r = !1, @@ -28050,16 +28078,16 @@ class Qm { } else f = o; const p = /* @__PURE__ */ new Set([ - Ru, Pu, - Au + Cu, + Tu ]), g = /* @__PURE__ */ new Set([ Jn, Ms, wo, _r, - Su, - Eu + wu, + Su ]), x = new Uint32Array(4), m = new Int32Array(4); let b = null, v = null; const y = [], M = []; @@ -28085,7 +28113,7 @@ class Qm { let j = 0, $ = t.width, Z = t.height, re = 1, X = null, Y = null; const ge = new tt(0, 0, $, Z), pe = new tt(0, 0, $, Z); let de = !1; - const ie = new ku(); + const ie = new Nu(); let he = !1, fe = !1; const ve = new ze(), we = new P(), Be = new tt(), Ke = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: !0 }; let Ne = !1; @@ -28117,10 +28145,10 @@ class Qm { } let U, k, z, ee, J, G, N, L, H, K, le, te, Te, be, Re, De, ue, ye, Ve, ke, Ae, Ge, q, Ee; function _e() { - U = new $y(I), U.init(), Ge = new I2(I, U), k = new Vy(I, U, e, Ge), z = new L2(I, U), k.reversedDepthBuffer && d && z.buffers.depth.setReversed(!0), ee = new e_(I), J = new v2(), G = new D2(I, U, z, J, k, Ge, ee), N = new Wy(E), L = new Ky(E), H = new s1(I), q = new zy(I, H), K = new Jy(I, H, ee, q), le = new n_(I, K, H, ee), Ve = new t_(I, k, G), De = new Gy(J), te = new x2(E, N, L, U, k, q, De), Te = new F2(E, J), be = new y2(), Re = new T2(U), ye = new Fy(E, N, L, z, le, f, l), ue = new P2(E, le, k), Ee = new z2(I, ee, k, z), ke = new Hy(I, U, ee), Ae = new Qy(I, U, ee), ee.programs = te.programs, E.capabilities = k, E.extensions = U, E.properties = J, E.renderLists = be, E.shadowMap = ue, E.state = z, E.info = ee; + U = new Ky(I), U.init(), Ge = new D2(I, U), k = new Hy(I, U, e, Ge), z = new R2(I, U), k.reversedDepthBuffer && d && z.buffers.depth.setReversed(!0), ee = new Qy(I), J = new x2(), G = new L2(I, U, z, J, k, Ge, ee), N = new Gy(E), L = new Yy(E), H = new i1(I), q = new Fy(I, H), K = new $y(I, H, ee, q), le = new t_(I, K, H, ee), Ve = new e_(I, k, G), De = new Vy(J), te = new g2(E, N, L, U, k, q, De), Te = new O2(E, J), be = new b2(), Re = new E2(U), ye = new Oy(E, N, L, z, le, f, l), ue = new C2(E, le, k), Ee = new F2(I, ee, k, z), ke = new zy(I, U, ee), Ae = new Jy(I, U, ee), ee.programs = te.programs, E.capabilities = k, E.extensions = U, E.properties = J, E.renderLists = be, E.shadowMap = ue, E.state = z, E.info = ee; } _e(); - const Me = new U2(E, I); + const Me = new k2(E, I); this.xr = Me, this.getContext = function() { return I; }, this.getContextAttributes = function() { @@ -28195,7 +28223,7 @@ class Qm { }, this.clearStencil = function() { this.clear(!1, !1, !0); }, this.dispose = function() { - t.removeEventListener("webglcontextlost", xe, !1), t.removeEventListener("webglcontextrestored", me, !1), t.removeEventListener("webglcontextcreationerror", Ue, !1), ye.dispose(), be.dispose(), Re.dispose(), J.dispose(), N.dispose(), L.dispose(), le.dispose(), q.dispose(), Ee.dispose(), te.dispose(), Me.dispose(), Me.removeEventListener("sessionstart", id), Me.removeEventListener("sessionend", sd), ts.stop(); + t.removeEventListener("webglcontextlost", xe, !1), t.removeEventListener("webglcontextrestored", me, !1), t.removeEventListener("webglcontextcreationerror", Ue, !1), ye.dispose(), be.dispose(), Re.dispose(), J.dispose(), N.dispose(), L.dispose(), le.dispose(), q.dispose(), Ee.dispose(), te.dispose(), Me.dispose(), Me.removeEventListener("sessionstart", nd), Me.removeEventListener("sessionend", id), ts.stop(); }; function xe(O) { O.preventDefault(), xl("WebGLRenderer: Context Lost."), A = !0; @@ -28210,9 +28238,9 @@ class Qm { } function Ye(O) { const Q = O.target; - Q.removeEventListener("dispose", Ye), _t(Q); + Q.removeEventListener("dispose", Ye), yt(Q); } - function _t(O) { + function yt(O) { ft(O), J.remove(O); } function ft(O) { @@ -28223,7 +28251,7 @@ class Qm { } this.renderBufferDirect = function(O, Q, oe, ae, ne, Se) { Q === null && (Q = Ke); - const Le = ne.isMesh && ne.matrixWorld.determinant() < 0, Oe = Y0(O, Q, oe, ae, ne); + const Le = ne.isMesh && ne.matrixWorld.determinant() < 0, Oe = Z0(O, Q, oe, ae, ne); z.setMaterial(ae, Le); let Ie = oe.index, je = 1; if (ae.wireframe === !0) { @@ -28249,8 +28277,8 @@ class Qm { else if (U.get("WEBGL_multi_draw")) gt.renderMultiDraw(ne._multiDrawStarts, ne._multiDrawCounts, ne._multiDrawCount); else { - const Xe = ne._multiDrawStarts, Et = ne._multiDrawCounts, ot = ne._multiDrawCount, Sn = Ie ? H.get(Ie).bytesPerElement : 1, Is = J.get(ae).currentProgram.getUniforms(); - for (let En = 0; En < ot; En++) + const Xe = ne._multiDrawStarts, Et = ne._multiDrawCounts, rt = ne._multiDrawCount, Sn = Ie ? H.get(Ie).bytesPerElement : 1, Is = J.get(ae).currentProgram.getUniforms(); + for (let En = 0; En < rt; En++) Is.setValue(I, "_gl_DrawID", En), gt.render(Xe[En] / Sn, Et[En]); } else if (ne.isInstancedMesh) @@ -28300,19 +28328,19 @@ class Qm { }); }; let Gn = null; - function Z0(O) { + function q0(O) { Gn && Gn(O); } - function id() { + function nd() { ts.stop(); } - function sd() { + function id() { ts.start(); } - const ts = new Zm(); - ts.setAnimationLoop(Z0), typeof self < "u" && ts.setContext(self), this.setAnimationLoop = function(O) { + const ts = new qm(); + ts.setAnimationLoop(q0), typeof self < "u" && ts.setContext(self), this.setAnimationLoop = function(O) { Gn = O, Me.setAnimationLoop(O), O === null ? ts.stop() : ts.start(); - }, Me.addEventListener("sessionstart", id), Me.addEventListener("sessionend", sd), this.render = function(O, Q) { + }, Me.addEventListener("sessionstart", nd), Me.addEventListener("sessionend", id), this.render = function(O, Q) { if (Q !== void 0 && Q.isCamera !== !0) { et("WebGLRenderer.render: camera is not an instance of THREE.Camera."); return; @@ -28331,15 +28359,15 @@ class Qm { if (ne.length > 0) for (let Le = 0, Oe = Se.length; Le < Oe; Le++) { const Ie = Se[Le]; - od(ae, ne, O, Ie); + rd(ae, ne, O, Ie); } Ne && ye.render(O); for (let Le = 0, Oe = Se.length; Le < Oe; Le++) { const Ie = Se[Le]; - rd(b, O, Ie, Ie.viewport); + sd(b, O, Ie, Ie.viewport); } } else - ne.length > 0 && od(ae, ne, O, Q), Ne && ye.render(O), rd(b, O, Q); + ne.length > 0 && rd(ae, ne, O, Q), Ne && ye.render(O), sd(b, O, Q); S !== null && _ === 0 && (G.updateMultisampleRenderTarget(S), G.updateRenderTargetMipmap(S)), O.isScene === !0 && O.onAfterRender(E, O, Q), q.resetDefaultState(), D = -1, C = null, M.pop(), M.length > 0 ? (v = M[M.length - 1], he === !0 && De.setGlobalState(E.clippingPlanes, v.state.camera)) : v = null, y.pop(), y.length > 0 ? b = y[y.length - 1] : b = null; }; function Ol(O, Q, oe, ae) { @@ -28372,11 +28400,11 @@ class Qm { for (let Le = 0, Oe = Se.length; Le < Oe; Le++) Ol(Se[Le], Q, oe, ae); } - function rd(O, Q, oe, ae) { + function sd(O, Q, oe, ae) { const { opaque: ne, transmissive: Se, transparent: Le } = O; v.setupLightsView(oe), he === !0 && De.setGlobalState(E.clippingPlanes, oe), ae && z.viewport(B.copy(ae)), ne.length > 0 && Vo(ne, Q, oe), Se.length > 0 && Vo(Se, Q, oe), Le.length > 0 && Vo(Le, Q, oe), z.buffers.depth.setTest(!0), z.buffers.depth.setMask(!0), z.buffers.color.setMask(!0), z.setPolygonOffset(!1); } - function od(O, Q, oe, ae) { + function rd(O, Q, oe, ae) { if ((oe.isScene === !0 ? oe.overrideMaterial : null) !== null) return; v.state.transmissionRenderTarget[ae.id] === void 0 && (v.state.transmissionRenderTarget[ae.id] = new bn(1, 1, { @@ -28399,10 +28427,10 @@ class Qm { if (ae.viewport !== void 0 && (ae.viewport = void 0), v.setupLightsView(ae), he === !0 && De.setGlobalState(E.clippingPlanes, ae), Vo(O, oe, ae), G.updateMultisampleRenderTarget(Se), G.updateRenderTargetMipmap(Se), U.has("WEBGL_multisampled_render_to_texture") === !1) { let it = !1; for (let pt = 0, Rt = Q.length; pt < Rt; pt++) { - const Lt = Q[pt], { object: gt, geometry: Xe, material: Et, group: ot } = Lt; + const Lt = Q[pt], { object: gt, geometry: Xe, material: Et, group: rt } = Lt; if (Et.side === At && gt.layers.test(ae.layers)) { const Sn = Et.side; - Et.side = un, Et.needsUpdate = !0, ad(gt, oe, ae, Xe, Et, ot), Et.side = Sn, Et.needsUpdate = !0, it = !0; + Et.side = un, Et.needsUpdate = !0, od(gt, oe, ae, Xe, Et, rt), Et.side = Sn, Et.needsUpdate = !0, it = !0; } } it === !0 && (G.updateMultisampleRenderTarget(Se), G.updateRenderTargetMipmap(Se)); @@ -28414,10 +28442,10 @@ class Qm { for (let ne = 0, Se = O.length; ne < Se; ne++) { const Le = O[ne], { object: Oe, geometry: Ie, group: je } = Le; let qe = Le.material; - qe.allowOverride === !0 && ae !== null && (qe = ae), Oe.layers.test(oe.layers) && ad(Oe, Q, oe, Ie, qe, je); + qe.allowOverride === !0 && ae !== null && (qe = ae), Oe.layers.test(oe.layers) && od(Oe, Q, oe, Ie, qe, je); } } - function ad(O, Q, oe, ae, ne, Se) { + function od(O, Q, oe, ae, ne, Se) { O.onBeforeRender(E, Q, oe, ae, ne, Se), O.modelViewMatrix.multiplyMatrices(oe.matrixWorldInverse, O.matrixWorld), O.normalMatrix.getNormalMatrix(O.modelViewMatrix), ne.onBeforeRender(E, Q, oe, ae, O, Se), ne.transparent === !0 && ne.side === At && ne.forceSinglePass === !1 ? (ne.side = un, ne.needsUpdate = !0, E.renderBufferDirect(oe, Q, ae, ne, O, Se), ne.side = Fn, ne.needsUpdate = !0, E.renderBufferDirect(oe, Q, ae, ne, O, Se), ne.side = At) : E.renderBufferDirect(oe, Q, ae, ne, O, Se), O.onAfterRender(E, Q, oe, ae, ne, Se); } function Go(O, Q, oe) { @@ -28428,24 +28456,24 @@ class Qm { let qe = je.get(Ie); if (qe !== void 0) { if (ae.currentProgram === qe && ae.lightsStateVersion === Le) - return cd(O, Oe), qe; + return ld(O, Oe), qe; } else Oe.uniforms = te.getUniforms(O), O.onBeforeCompile(Oe, E), qe = te.acquireProgram(Oe, Ie), je.set(Ie, qe), ae.uniforms = Oe.uniforms; const We = ae.uniforms; - return (!O.isShaderMaterial && !O.isRawShaderMaterial || O.clipping === !0) && (We.clippingPlanes = De.uniform), cd(O, Oe), ae.needsLights = $0(O), ae.lightsStateVersion = Le, ae.needsLights && (We.ambientLightColor.value = ne.state.ambient, We.lightProbe.value = ne.state.probe, We.directionalLights.value = ne.state.directional, We.directionalLightShadows.value = ne.state.directionalShadow, We.spotLights.value = ne.state.spot, We.spotLightShadows.value = ne.state.spotShadow, We.rectAreaLights.value = ne.state.rectArea, We.ltc_1.value = ne.state.rectAreaLTC1, We.ltc_2.value = ne.state.rectAreaLTC2, We.pointLights.value = ne.state.point, We.pointLightShadows.value = ne.state.pointShadow, We.hemisphereLights.value = ne.state.hemi, We.directionalShadowMap.value = ne.state.directionalShadowMap, We.directionalShadowMatrix.value = ne.state.directionalShadowMatrix, We.spotShadowMap.value = ne.state.spotShadowMap, We.spotLightMatrix.value = ne.state.spotLightMatrix, We.spotLightMap.value = ne.state.spotLightMap, We.pointShadowMap.value = ne.state.pointShadowMap, We.pointShadowMatrix.value = ne.state.pointShadowMatrix), ae.currentProgram = qe, ae.uniformsList = null, qe; + return (!O.isShaderMaterial && !O.isRawShaderMaterial || O.clipping === !0) && (We.clippingPlanes = De.uniform), ld(O, Oe), ae.needsLights = K0(O), ae.lightsStateVersion = Le, ae.needsLights && (We.ambientLightColor.value = ne.state.ambient, We.lightProbe.value = ne.state.probe, We.directionalLights.value = ne.state.directional, We.directionalLightShadows.value = ne.state.directionalShadow, We.spotLights.value = ne.state.spot, We.spotLightShadows.value = ne.state.spotShadow, We.rectAreaLights.value = ne.state.rectArea, We.ltc_1.value = ne.state.rectAreaLTC1, We.ltc_2.value = ne.state.rectAreaLTC2, We.pointLights.value = ne.state.point, We.pointLightShadows.value = ne.state.pointShadow, We.hemisphereLights.value = ne.state.hemi, We.directionalShadowMap.value = ne.state.directionalShadowMap, We.directionalShadowMatrix.value = ne.state.directionalShadowMatrix, We.spotShadowMap.value = ne.state.spotShadowMap, We.spotLightMatrix.value = ne.state.spotLightMatrix, We.spotLightMap.value = ne.state.spotLightMap, We.pointShadowMap.value = ne.state.pointShadowMap, We.pointShadowMatrix.value = ne.state.pointShadowMatrix), ae.currentProgram = qe, ae.uniformsList = null, qe; } - function ld(O) { + function ad(O) { if (O.uniformsList === null) { const Q = O.currentProgram.getUniforms(); O.uniformsList = rl.seqWithValue(Q.seq, O.uniforms); } return O.uniformsList; } - function cd(O, Q) { + function ld(O, Q) { const oe = J.get(O); oe.outputColorSpace = Q.outputColorSpace, oe.batching = Q.batching, oe.batchingColor = Q.batchingColor, oe.instancing = Q.instancing, oe.instancingColor = Q.instancingColor, oe.instancingMorph = Q.instancingMorph, oe.skinning = Q.skinning, oe.morphTargets = Q.morphTargets, oe.morphNormals = Q.morphNormals, oe.morphColors = Q.morphColors, oe.morphTargetsCount = Q.morphTargetsCount, oe.numClippingPlanes = Q.numClippingPlanes, oe.numIntersection = Q.numClipIntersection, oe.vertexAlphas = Q.vertexAlphas, oe.vertexTangents = Q.vertexTangents, oe.toneMapping = Q.toneMapping; } - function Y0(O, Q, oe, ae, ne) { + function Z0(O, Q, oe, ae, ne) { Q.isScene !== !0 && (Q = Ke), G.resetTextureUnits(); const Se = Q.fog, Le = ae.isMeshStandardMaterial ? Q.environment : null, Oe = S === null ? E.outputColorSpace : S.isXRRenderTarget === !0 ? S.texture.colorSpace : Bt, Ie = (ae.isMeshStandardMaterial ? L : N).get(ae.envMap || Le), je = ae.vertexColors === !0 && !!oe.attributes.color && oe.attributes.color.itemSize === 4, qe = !!oe.attributes.tangent && (!!ae.normalMap || ae.anisotropy > 0), We = !!oe.morphAttributes.position, it = !!oe.morphAttributes.normal, pt = !!oe.morphAttributes.color; let Rt = Ki; @@ -28455,10 +28483,10 @@ class Qm { const on = O === C && ae.id === D; De.setState(ae, O, on); } - let ot = !1; - ae.version === Xe.__version ? (Xe.needsLights && Xe.lightsStateVersion !== Et.state.version || Xe.outputColorSpace !== Oe || ne.isBatchedMesh && Xe.batching === !1 || !ne.isBatchedMesh && Xe.batching === !0 || ne.isBatchedMesh && Xe.batchingColor === !0 && ne.colorTexture === null || ne.isBatchedMesh && Xe.batchingColor === !1 && ne.colorTexture !== null || ne.isInstancedMesh && Xe.instancing === !1 || !ne.isInstancedMesh && Xe.instancing === !0 || ne.isSkinnedMesh && Xe.skinning === !1 || !ne.isSkinnedMesh && Xe.skinning === !0 || ne.isInstancedMesh && Xe.instancingColor === !0 && ne.instanceColor === null || ne.isInstancedMesh && Xe.instancingColor === !1 && ne.instanceColor !== null || ne.isInstancedMesh && Xe.instancingMorph === !0 && ne.morphTexture === null || ne.isInstancedMesh && Xe.instancingMorph === !1 && ne.morphTexture !== null || Xe.envMap !== Ie || ae.fog === !0 && Xe.fog !== Se || Xe.numClippingPlanes !== void 0 && (Xe.numClippingPlanes !== De.numPlanes || Xe.numIntersection !== De.numIntersection) || Xe.vertexAlphas !== je || Xe.vertexTangents !== qe || Xe.morphTargets !== We || Xe.morphNormals !== it || Xe.morphColors !== pt || Xe.toneMapping !== Rt || Xe.morphTargetsCount !== gt) && (ot = !0) : (ot = !0, Xe.__version = ae.version); + let rt = !1; + ae.version === Xe.__version ? (Xe.needsLights && Xe.lightsStateVersion !== Et.state.version || Xe.outputColorSpace !== Oe || ne.isBatchedMesh && Xe.batching === !1 || !ne.isBatchedMesh && Xe.batching === !0 || ne.isBatchedMesh && Xe.batchingColor === !0 && ne.colorTexture === null || ne.isBatchedMesh && Xe.batchingColor === !1 && ne.colorTexture !== null || ne.isInstancedMesh && Xe.instancing === !1 || !ne.isInstancedMesh && Xe.instancing === !0 || ne.isSkinnedMesh && Xe.skinning === !1 || !ne.isSkinnedMesh && Xe.skinning === !0 || ne.isInstancedMesh && Xe.instancingColor === !0 && ne.instanceColor === null || ne.isInstancedMesh && Xe.instancingColor === !1 && ne.instanceColor !== null || ne.isInstancedMesh && Xe.instancingMorph === !0 && ne.morphTexture === null || ne.isInstancedMesh && Xe.instancingMorph === !1 && ne.morphTexture !== null || Xe.envMap !== Ie || ae.fog === !0 && Xe.fog !== Se || Xe.numClippingPlanes !== void 0 && (Xe.numClippingPlanes !== De.numPlanes || Xe.numIntersection !== De.numIntersection) || Xe.vertexAlphas !== je || Xe.vertexTangents !== qe || Xe.morphTargets !== We || Xe.morphNormals !== it || Xe.morphColors !== pt || Xe.toneMapping !== Rt || Xe.morphTargetsCount !== gt) && (rt = !0) : (rt = !0, Xe.__version = ae.version); let Sn = Xe.currentProgram; - ot === !0 && (Sn = Go(ae, Q, ne)); + rt === !0 && (Sn = Go(ae, Q, ne)); let Is = !1, En = !1, Fr = !1; const Tt = Sn.getUniforms(), fn = Xe.uniforms; if (z.useProgram(Sn.program) && (Is = !0, En = !0, Fr = !0), ae.id !== D && (D = ae.id, En = !0), Is || C !== O) { @@ -28477,7 +28505,7 @@ class Qm { } ne.isBatchedMesh && (Tt.setOptional(I, ne, "batchingTexture"), Tt.setValue(I, "batchingTexture", ne._matricesTexture, G), Tt.setOptional(I, ne, "batchingIdTexture"), Tt.setValue(I, "batchingIdTexture", ne._indirectTexture, G), Tt.setOptional(I, ne, "batchingColorTexture"), ne._colorsTexture !== null && Tt.setValue(I, "batchingColorTexture", ne._colorsTexture, G)); const Pn = oe.morphAttributes; - if ((Pn.position !== void 0 || Pn.normal !== void 0 || Pn.color !== void 0) && Ve.update(ne, oe, Sn), (En || Xe.receiveShadow !== ne.receiveShadow) && (Xe.receiveShadow = ne.receiveShadow, Tt.setValue(I, "receiveShadow", ne.receiveShadow)), ae.isMeshGouraudMaterial && ae.envMap !== null && (fn.envMap.value = Ie, fn.flipEnvMap.value = Ie.isCubeTexture && Ie.isRenderTargetTexture === !1 ? -1 : 1), ae.isMeshStandardMaterial && ae.envMap === null && Q.environment !== null && (fn.envMapIntensity.value = Q.environmentIntensity), fn.dfgLUT !== void 0 && (fn.dfgLUT.value = V2()), En && (Tt.setValue(I, "toneMappingExposure", E.toneMappingExposure), Xe.needsLights && K0(fn, Fr), Se && ae.fog === !0 && Te.refreshFogUniforms(fn, Se), Te.refreshMaterialUniforms(fn, ae, re, Z, v.state.transmissionRenderTarget[O.id]), rl.upload(I, ld(Xe), fn, G)), ae.isShaderMaterial && ae.uniformsNeedUpdate === !0 && (rl.upload(I, ld(Xe), fn, G), ae.uniformsNeedUpdate = !1), ae.isSpriteMaterial && Tt.setValue(I, "center", ne.center), Tt.setValue(I, "modelViewMatrix", ne.modelViewMatrix), Tt.setValue(I, "normalMatrix", ne.normalMatrix), Tt.setValue(I, "modelMatrix", ne.matrixWorld), ae.isShaderMaterial || ae.isRawShaderMaterial) { + if ((Pn.position !== void 0 || Pn.normal !== void 0 || Pn.color !== void 0) && Ve.update(ne, oe, Sn), (En || Xe.receiveShadow !== ne.receiveShadow) && (Xe.receiveShadow = ne.receiveShadow, Tt.setValue(I, "receiveShadow", ne.receiveShadow)), ae.isMeshGouraudMaterial && ae.envMap !== null && (fn.envMap.value = Ie, fn.flipEnvMap.value = Ie.isCubeTexture && Ie.isRenderTargetTexture === !1 ? -1 : 1), ae.isMeshStandardMaterial && ae.envMap === null && Q.environment !== null && (fn.envMapIntensity.value = Q.environmentIntensity), fn.dfgLUT !== void 0 && (fn.dfgLUT.value = H2()), En && (Tt.setValue(I, "toneMappingExposure", E.toneMappingExposure), Xe.needsLights && Y0(fn, Fr), Se && ae.fog === !0 && Te.refreshFogUniforms(fn, Se), Te.refreshMaterialUniforms(fn, ae, re, Z, v.state.transmissionRenderTarget[O.id]), rl.upload(I, ad(Xe), fn, G)), ae.isShaderMaterial && ae.uniformsNeedUpdate === !0 && (rl.upload(I, ad(Xe), fn, G), ae.uniformsNeedUpdate = !1), ae.isSpriteMaterial && Tt.setValue(I, "center", ne.center), Tt.setValue(I, "modelViewMatrix", ne.modelViewMatrix), Tt.setValue(I, "normalMatrix", ne.normalMatrix), Tt.setValue(I, "modelMatrix", ne.matrixWorld), ae.isShaderMaterial || ae.isRawShaderMaterial) { const on = ae.uniformsGroups; for (let pn = 0, Fl = on.length; pn < Fl; pn++) { const ns = on[pn]; @@ -28486,10 +28514,10 @@ class Qm { } return Sn; } - function K0(O, Q) { + function Y0(O, Q) { O.ambientLightColor.needsUpdate = Q, O.lightProbe.needsUpdate = Q, O.directionalLights.needsUpdate = Q, O.directionalLightShadows.needsUpdate = Q, O.pointLights.needsUpdate = Q, O.pointLightShadows.needsUpdate = Q, O.spotLights.needsUpdate = Q, O.spotLightShadows.needsUpdate = Q, O.rectAreaLights.needsUpdate = Q, O.hemisphereLights.needsUpdate = Q; } - function $0(O) { + function K0(O) { return O.isMeshLambertMaterial || O.isMeshToonMaterial || O.isMeshPhongMaterial || O.isMeshStandardMaterial || O.isShadowMaterial || O.isShaderMaterial && O.lights === !0; } this.getActiveCubeFace = function() { @@ -28505,7 +28533,7 @@ class Qm { const oe = J.get(O); oe.__webglFramebuffer = Q, oe.__useDefaultFramebuffer = Q === void 0; }; - const J0 = I.createFramebuffer(); + const $0 = I.createFramebuffer(); this.setRenderTarget = function(O, Q = 0, oe = 0) { S = O, R = Q, _ = oe; let ae = !0, ne = null, Se = !1, Le = !1; @@ -28531,7 +28559,7 @@ class Qm { O.isWebGLCubeRenderTarget ? (Array.isArray(qe[Q]) ? ne = qe[Q][oe] : ne = qe[Q], Se = !0) : O.samples > 0 && G.useMultisampledRTT(O) === !1 ? ne = J.get(O).__webglMultisampledFramebuffer : Array.isArray(qe) ? ne = qe[oe] : ne = qe, B.copy(O.viewport), w.copy(O.scissor), F = O.scissorTest; } else B.copy(ge).multiplyScalar(re).floor(), w.copy(pe).multiplyScalar(re).floor(), F = de; - if (oe !== 0 && (ne = J0), z.bindFramebuffer(I.FRAMEBUFFER, ne) && ae && z.drawBuffers(O, ne), z.viewport(B), z.scissor(w), z.setScissorTest(F), Se) { + if (oe !== 0 && (ne = $0), z.bindFramebuffer(I.FRAMEBUFFER, ne) && ae && z.drawBuffers(O, ne), z.viewport(B), z.scissor(w), z.setScissorTest(F), Se) { const Ie = J.get(O.texture); I.framebufferTexture2D(I.FRAMEBUFFER, I.COLOR_ATTACHMENT0, I.TEXTURE_CUBE_MAP_POSITIVE_X + Q, Ie.__webglTexture, oe); } else if (Le) { @@ -28586,14 +28614,14 @@ class Qm { const pt = S !== null ? J.get(S).__webglFramebuffer : null; z.bindFramebuffer(I.FRAMEBUFFER, pt); const Rt = I.fenceSync(I.SYNC_GPU_COMMANDS_COMPLETE, 0); - return I.flush(), await Wg(I, Rt, 4), I.bindBuffer(I.PIXEL_PACK_BUFFER, it), I.getBufferSubData(I.PIXEL_PACK_BUFFER, 0, Se), I.deleteBuffer(it), I.deleteSync(Rt), Se; + return I.flush(), await Gg(I, Rt, 4), I.bindBuffer(I.PIXEL_PACK_BUFFER, it), I.getBufferSubData(I.PIXEL_PACK_BUFFER, 0, Se), I.deleteBuffer(it), I.deleteSync(Rt), Se; } else throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range."); }, this.copyFramebufferToTexture = function(O, Q = null, oe = 0) { const ae = Math.pow(2, -oe), ne = Math.floor(O.image.width * ae), Se = Math.floor(O.image.height * ae), Le = Q !== null ? Q.x : 0, Oe = Q !== null ? Q.y : 0; G.setTexture2D(O, 0), I.copyTexSubImage2D(I.TEXTURE_2D, oe, 0, 0, Le, Oe, ne, Se), z.unbindTexture(); }; - const Q0 = I.createFramebuffer(), eg = I.createFramebuffer(); + const J0 = I.createFramebuffer(), Q0 = I.createFramebuffer(); this.copyTextureToTexture = function(O, Q, oe = null, ae = null, ne = 0, Se = null) { Se === null && (ne !== 0 ? (Co("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."), Se = ne, ne = 0) : Se = 0); let Le, Oe, Ie, je, qe, We, it, pt, Rt; @@ -28608,7 +28636,7 @@ class Qm { const gt = Ge.convert(Q.format), Xe = Ge.convert(Q.type); let Et; Q.isData3DTexture ? (G.setTexture3D(Q, 0), Et = I.TEXTURE_3D) : Q.isDataArrayTexture || Q.isCompressedArrayTexture ? (G.setTexture2DArray(Q, 0), Et = I.TEXTURE_2D_ARRAY) : (G.setTexture2D(Q, 0), Et = I.TEXTURE_2D), I.pixelStorei(I.UNPACK_FLIP_Y_WEBGL, Q.flipY), I.pixelStorei(I.UNPACK_PREMULTIPLY_ALPHA_WEBGL, Q.premultiplyAlpha), I.pixelStorei(I.UNPACK_ALIGNMENT, Q.unpackAlignment); - const ot = I.getParameter(I.UNPACK_ROW_LENGTH), Sn = I.getParameter(I.UNPACK_IMAGE_HEIGHT), Is = I.getParameter(I.UNPACK_SKIP_PIXELS), En = I.getParameter(I.UNPACK_SKIP_ROWS), Fr = I.getParameter(I.UNPACK_SKIP_IMAGES); + const rt = I.getParameter(I.UNPACK_ROW_LENGTH), Sn = I.getParameter(I.UNPACK_IMAGE_HEIGHT), Is = I.getParameter(I.UNPACK_SKIP_PIXELS), En = I.getParameter(I.UNPACK_SKIP_ROWS), Fr = I.getParameter(I.UNPACK_SKIP_IMAGES); I.pixelStorei(I.UNPACK_ROW_LENGTH, Lt.width), I.pixelStorei(I.UNPACK_IMAGE_HEIGHT, Lt.height), I.pixelStorei(I.UNPACK_SKIP_PIXELS, je), I.pixelStorei(I.UNPACK_SKIP_ROWS, qe), I.pixelStorei(I.UNPACK_SKIP_IMAGES, We); const Tt = O.isDataArrayTexture || O.isData3DTexture, fn = Q.isDataArrayTexture || Q.isData3DTexture; if (O.isDepthTexture) { @@ -28619,13 +28647,13 @@ class Qm { z.bindFramebuffer(I.READ_FRAMEBUFFER, null), z.bindFramebuffer(I.DRAW_FRAMEBUFFER, null); } else if (ne !== 0 || O.isRenderTargetTexture || J.has(O)) { const Pn = J.get(O), on = J.get(Q); - z.bindFramebuffer(I.READ_FRAMEBUFFER, Q0), z.bindFramebuffer(I.DRAW_FRAMEBUFFER, eg); + z.bindFramebuffer(I.READ_FRAMEBUFFER, J0), z.bindFramebuffer(I.DRAW_FRAMEBUFFER, Q0); for (let pn = 0; pn < Ie; pn++) Tt ? I.framebufferTextureLayer(I.READ_FRAMEBUFFER, I.COLOR_ATTACHMENT0, Pn.__webglTexture, ne, We + pn) : I.framebufferTexture2D(I.READ_FRAMEBUFFER, I.COLOR_ATTACHMENT0, I.TEXTURE_2D, Pn.__webglTexture, ne), fn ? I.framebufferTextureLayer(I.DRAW_FRAMEBUFFER, I.COLOR_ATTACHMENT0, on.__webglTexture, Se, Rt + pn) : I.framebufferTexture2D(I.DRAW_FRAMEBUFFER, I.COLOR_ATTACHMENT0, I.TEXTURE_2D, on.__webglTexture, Se), ne !== 0 ? I.blitFramebuffer(je, qe, Le, Oe, it, pt, Le, Oe, I.COLOR_BUFFER_BIT, I.NEAREST) : fn ? I.copyTexSubImage3D(Et, Se, it, pt, Rt + pn, je, qe, Le, Oe) : I.copyTexSubImage2D(Et, Se, it, pt, je, qe, Le, Oe); z.bindFramebuffer(I.READ_FRAMEBUFFER, null), z.bindFramebuffer(I.DRAW_FRAMEBUFFER, null); } else fn ? O.isDataTexture || O.isData3DTexture ? I.texSubImage3D(Et, Se, it, pt, Rt, Le, Oe, Ie, gt, Xe, Lt.data) : Q.isCompressedArrayTexture ? I.compressedTexSubImage3D(Et, Se, it, pt, Rt, Le, Oe, Ie, gt, Lt.data) : I.texSubImage3D(Et, Se, it, pt, Rt, Le, Oe, Ie, gt, Xe, Lt) : O.isDataTexture ? I.texSubImage2D(I.TEXTURE_2D, Se, it, pt, Le, Oe, gt, Xe, Lt.data) : O.isCompressedTexture ? I.compressedTexSubImage2D(I.TEXTURE_2D, Se, it, pt, Lt.width, Lt.height, gt, Lt.data) : I.texSubImage2D(I.TEXTURE_2D, Se, it, pt, Le, Oe, gt, Xe, Lt); - I.pixelStorei(I.UNPACK_ROW_LENGTH, ot), I.pixelStorei(I.UNPACK_IMAGE_HEIGHT, Sn), I.pixelStorei(I.UNPACK_SKIP_PIXELS, Is), I.pixelStorei(I.UNPACK_SKIP_ROWS, En), I.pixelStorei(I.UNPACK_SKIP_IMAGES, Fr), Se === 0 && Q.generateMipmaps && I.generateMipmap(Et), z.unbindTexture(); + I.pixelStorei(I.UNPACK_ROW_LENGTH, rt), I.pixelStorei(I.UNPACK_IMAGE_HEIGHT, Sn), I.pixelStorei(I.UNPACK_SKIP_PIXELS, Is), I.pixelStorei(I.UNPACK_SKIP_ROWS, En), I.pixelStorei(I.UNPACK_SKIP_IMAGES, Fr), Se === 0 && Q.generateMipmaps && I.generateMipmap(Et), z.unbindTexture(); }, this.initRenderTarget = function(O) { J.get(O).__webglFramebuffer === void 0 && G.setupRenderTarget(O); }, this.initTexture = function(O) { @@ -28661,16 +28689,16 @@ class Qm { t.drawingBufferColorSpace = st._getDrawingBufferColorSpace(e), t.unpackColorSpace = st._getUnpackColorSpace(); } } -class G2 { +class V2 { engine; scene; constructor(e) { - this.engine = e, this.scene = new Cm(); + this.engine = e, this.scene = new Am(); let t = new vn(); t.name = "groupEdge", this.scene.add(t); } } -class W2 { +class G2 { engine; // 透视相机 perspectiveCamera; @@ -28747,7 +28775,7 @@ class W2 { ), e.type === "orthographic" && e.zoom !== void 0 && (t.zoom = e.zoom, t.updateProjectionMatrix()), t.updateMatrix(), t.updateMatrixWorld(!0), this.engine.controls && this.engine.controls.update && this.engine.controls.update(); } } -class X2 { +class W2 { engine; deviceType; constructor(e) { @@ -28765,7 +28793,7 @@ class X2 { }; } } -class j2 { +class X2 { engine; renderer; constructor(e) { @@ -28773,18 +28801,18 @@ class j2 { } createRenderer() { const { width: e, height: t } = this.engine.deviceModule.getContainerSize(); - return this.renderer = new Qm({ + return this.renderer = new Jm({ antialias: this.engine.options.antialias ?? !0, alpha: !0, premultipliedAlpha: !1, stencil: !0 - }), this.renderer.setClearColor(0, 0), this.renderer.setSize(e, t), this.renderer.setPixelRatio(window.devicePixelRatio), this.renderer.shadowMap.enabled = !0, this.renderer.shadowMap.type = nm, this.renderer.localClippingEnabled = !0, this.renderer.outputColorSpace = xt, this.renderer.toneMapping = Mu, this.renderer.toneMappingExposure = 1.5, this.engine.container.appendChild(this.renderer.domElement), this.renderer; + }), this.renderer.setClearColor(0, 0), this.renderer.setSize(e, t), this.renderer.setPixelRatio(window.devicePixelRatio), this.renderer.shadowMap.enabled = !0, this.renderer.shadowMap.type = tm, this.renderer.localClippingEnabled = !0, this.renderer.outputColorSpace = xt, this.renderer.toneMapping = _u, this.renderer.toneMappingExposure = 1.5, this.engine.container.appendChild(this.renderer.domElement), this.renderer; } disposeRenderer() { this.renderer?.dispose(); } } -const Of = { type: "change" }, Wu = { type: "start" }, e0 = { type: "end" }, wa = new Qi(), Ff = new Mt(), q2 = Math.cos(70 * go.DEG2RAD), Ft = new P(), mn = 2 * Math.PI, mt = { +const Uf = { type: "change" }, Gu = { type: "start" }, Qm = { type: "end" }, wa = new Qi(), Of = new _t(), j2 = Math.cos(70 * go.DEG2RAD), Ft = new P(), mn = 2 * Math.PI, mt = { NONE: -1, ROTATE: 0, DOLLY: 1, @@ -28794,7 +28822,7 @@ const Of = { type: "change" }, Wu = { type: "start" }, e0 = { type: "end" }, wa TOUCH_DOLLY_PAN: 5, TOUCH_DOLLY_ROTATE: 6 }, Ec = 1e-6; -class Z2 extends n1 { +class q2 extends t1 { /** * Constructs a new controls instance. * @@ -28805,7 +28833,7 @@ class Z2 extends n1 { super(t, n), this.engine = e, this.state = mt.NONE, this.target = new P(), this.cursor = new P(), this.origin = new P(0, 0, 0), this.showOriginIcon = !0, this.originPosition = { x: 0, y: 0 - }, this.minDistance = 0, this.maxDistance = 1 / 0, this.minZoom = 0, this.maxZoom = 1 / 0, this.minTargetRadius = 0, this.maxTargetRadius = 1 / 0, this.minPolarAngle = 0, this.maxPolarAngle = Math.PI, this.minAzimuthAngle = -1 / 0, this.maxAzimuthAngle = 1 / 0, this.enableDamping = !1, this.dampingFactor = 0.05, this.enableZoom = !0, this.zoomSpeed = 1, this.enableRotate = !0, this.rotateSpeed = 1, this.keyRotateSpeed = 1, this.enablePan = !0, this.panSpeed = 1, this.screenSpacePanning = !0, this.keyPanSpeed = 7, this.zoomToCursor = !1, this.autoRotate = !1, this.autoRotateSpeed = 2, this.keys = { LEFT: "ArrowLeft", UP: "ArrowUp", RIGHT: "ArrowRight", BOTTOM: "ArrowDown" }, this.mouseButtons = { LEFT: fr.ROTATE, MIDDLE: fr.DOLLY, RIGHT: fr.PAN }, this.touches = { ONE: cr.ROTATE, TWO: cr.DOLLY_PAN }, this.target0 = this.target.clone(), this.position0 = this.object.position.clone(), this.zoom0 = this.object.zoom, this._domElementKeyEvents = null, this._lastPosition = new P(), this._lastQuaternion = new zn(), this._lastTargetPosition = new P(), this._quat = new zn().setFromUnitVectors(t.up, new P(0, 1, 0)), this._quatInverse = this._quat.clone().invert(), this._spherical = new df(), this._sphericalDelta = new df(), this._scale = 1, this._panOffset = new P(), this._rotateStart = new ce(), this._rotateEnd = new ce(), this._rotateDelta = new ce(), this._panStart = new ce(), this._panEnd = new ce(), this._panDelta = new ce(), this._dollyStart = new ce(), this._dollyEnd = new ce(), this._dollyDelta = new ce(), this._dollyDirection = new P(), this._mouse = new ce(), this._performCursorZoom = !1, this._pointers = [], this._pointerPositions = {}, this._controlActive = !1, this._onPointerMove = K2.bind(this), this._onPointerDown = Y2.bind(this), this._onPointerUp = $2.bind(this), this._onContextMenu = sM.bind(this), this._onMouseWheel = eM.bind(this), this._onKeyDown = tM.bind(this), this._onTouchStart = nM.bind(this), this._onTouchMove = iM.bind(this), this._onMouseDown = J2.bind(this), this._onMouseMove = Q2.bind(this), this._interceptControlDown = rM.bind(this), this._interceptControlUp = oM.bind(this), this.domElement !== null && this.connect(this.domElement), this.update(); + }, this.minDistance = 0, this.maxDistance = 1 / 0, this.minZoom = 0, this.maxZoom = 1 / 0, this.minTargetRadius = 0, this.maxTargetRadius = 1 / 0, this.minPolarAngle = 0, this.maxPolarAngle = Math.PI, this.minAzimuthAngle = -1 / 0, this.maxAzimuthAngle = 1 / 0, this.enableDamping = !1, this.dampingFactor = 0.05, this.enableZoom = !0, this.zoomSpeed = 1, this.enableRotate = !0, this.rotateSpeed = 1, this.keyRotateSpeed = 1, this.enablePan = !0, this.panSpeed = 1, this.screenSpacePanning = !0, this.keyPanSpeed = 7, this.zoomToCursor = !1, this.autoRotate = !1, this.autoRotateSpeed = 2, this.keys = { LEFT: "ArrowLeft", UP: "ArrowUp", RIGHT: "ArrowRight", BOTTOM: "ArrowDown" }, this.mouseButtons = { LEFT: fr.ROTATE, MIDDLE: fr.DOLLY, RIGHT: fr.PAN }, this.touches = { ONE: cr.ROTATE, TWO: cr.DOLLY_PAN }, this.target0 = this.target.clone(), this.position0 = this.object.position.clone(), this.zoom0 = this.object.zoom, this._domElementKeyEvents = null, this._lastPosition = new P(), this._lastQuaternion = new zn(), this._lastTargetPosition = new P(), this._quat = new zn().setFromUnitVectors(t.up, new P(0, 1, 0)), this._quatInverse = this._quat.clone().invert(), this._spherical = new uf(), this._sphericalDelta = new uf(), this._scale = 1, this._panOffset = new P(), this._rotateStart = new ce(), this._rotateEnd = new ce(), this._rotateDelta = new ce(), this._panStart = new ce(), this._panEnd = new ce(), this._panDelta = new ce(), this._dollyStart = new ce(), this._dollyEnd = new ce(), this._dollyDelta = new ce(), this._dollyDirection = new P(), this._mouse = new ce(), this._performCursorZoom = !1, this._pointers = [], this._pointerPositions = {}, this._controlActive = !1, this._onPointerMove = Y2.bind(this), this._onPointerDown = Z2.bind(this), this._onPointerUp = K2.bind(this), this._onContextMenu = iM.bind(this), this._onMouseWheel = Q2.bind(this), this._onKeyDown = eM.bind(this), this._onTouchStart = tM.bind(this), this._onTouchMove = nM.bind(this), this._onMouseDown = $2.bind(this), this._onMouseMove = J2.bind(this), this._interceptControlDown = sM.bind(this), this._interceptControlUp = rM.bind(this), this.domElement !== null && this.connect(this.domElement), this.update(); } connect(e) { super.connect(e), this.domElement.addEventListener("pointerdown", this._onPointerDown), this.domElement.addEventListener("pointercancel", this._onPointerUp), this.domElement.addEventListener("contextmenu", this._onContextMenu), this.domElement.addEventListener("wheel", this._onMouseWheel, { passive: !1 }), this.domElement.getRootNode().addEventListener("keydown", this._interceptControlDown, { passive: !0, capture: !0 }), this.domElement.style.touchAction = "none"; @@ -28866,7 +28894,7 @@ class Z2 extends n1 { * was called, or the initial state. */ reset() { - this.target.copy(this.target0), this.object.position.copy(this.position0), this.object.zoom = this.zoom0, this.object.updateProjectionMatrix(), this.dispatchEvent(Of), this.update(), this.state = mt.NONE; + this.target.copy(this.target0), this.object.position.copy(this.position0), this.object.zoom = this.zoom0, this.object.updateProjectionMatrix(), this.dispatchEvent(Uf), this.update(), this.state = mt.NONE; } update(e = null) { this.engine && this.engine.interactionManager && this.engine.interactionManager.origin && this.origin.copy(this.engine.interactionManager.origin); @@ -28918,12 +28946,12 @@ class Z2 extends n1 { c.unproject(this.object), this.object.position.sub(c).add(a), this.object.updateMatrixWorld(), o = Ft.length(); } else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."), this.zoomToCursor = !1; - o !== null && (this.screenSpacePanning ? this.target.set(0, 0, -1).transformDirection(this.object.matrix).multiplyScalar(o).add(this.object.position) : (wa.origin.copy(this.object.position), wa.direction.set(0, 0, -1).transformDirection(this.object.matrix), Math.abs(this.object.up.dot(wa.direction)) < q2 ? this.object.lookAt(this.target) : (Ff.setFromNormalAndCoplanarPoint(this.object.up, this.target), wa.intersectPlane(Ff, this.target)))); + o !== null && (this.screenSpacePanning ? this.target.set(0, 0, -1).transformDirection(this.object.matrix).multiplyScalar(o).add(this.object.position) : (wa.origin.copy(this.object.position), wa.direction.set(0, 0, -1).transformDirection(this.object.matrix), Math.abs(this.object.up.dot(wa.direction)) < j2 ? this.object.lookAt(this.target) : (Of.setFromNormalAndCoplanarPoint(this.object.up, this.target), wa.intersectPlane(Of, this.target)))); } else if (this.object.isOrthographicCamera) { const o = this.object.zoom; this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / this._scale)), o !== this.object.zoom && (this.object.updateProjectionMatrix(), r = !0); } - return this._scale = 1, this._performCursorZoom = !1, r || this._lastPosition.distanceToSquared(this.object.position) > Ec || 8 * (1 - this._lastQuaternion.dot(this.object.quaternion)) > Ec || this._lastTargetPosition.distanceToSquared(this.target) > Ec ? (this.dispatchEvent(Of), this._lastPosition.copy(this.object.position), this._lastQuaternion.copy(this.object.quaternion), this._lastTargetPosition.copy(this.target), !0) : !1; + return this._scale = 1, this._performCursorZoom = !1, r || this._lastPosition.distanceToSquared(this.object.position) > Ec || 8 * (1 - this._lastQuaternion.dot(this.object.quaternion)) > Ec || this._lastTargetPosition.distanceToSquared(this.target) > Ec ? (this.dispatchEvent(Uf), this._lastPosition.copy(this.object.position), this._lastQuaternion.copy(this.object.quaternion), this._lastTargetPosition.copy(this.target), !0) : !1; } _getAutoRotationAngle(e) { return e !== null ? mn / 60 * this.autoRotateSpeed * e : mn / 60 / 60 * this.autoRotateSpeed; @@ -29115,16 +29143,16 @@ class Z2 extends n1 { return e.ctrlKey && !this._controlActive && (n.deltaY *= 10), n; } } -function Y2(s) { +function Z2(s) { this.enabled !== !1 && (this._pointers.length === 0 && (this.domElement.setPointerCapture(s.pointerId), this.domElement.addEventListener("pointermove", this._onPointerMove), this.domElement.addEventListener("pointerup", this._onPointerUp)), !this._isTrackingPointer(s) && (this._addPointer(s), s.pointerType === "touch" ? this._onTouchStart(s) : this._onMouseDown(s))); } -function K2(s) { +function Y2(s) { this.enabled !== !1 && (s.pointerType === "touch" ? this._onTouchMove(s) : this._onMouseMove(s)); } -function $2(s) { +function K2(s) { switch (this._removePointer(s), this._pointers.length) { case 0: - this.domElement.releasePointerCapture(s.pointerId), this.domElement.removeEventListener("pointermove", this._onPointerMove), this.domElement.removeEventListener("pointerup", this._onPointerUp), this.dispatchEvent(e0), this.state = mt.NONE; + this.domElement.releasePointerCapture(s.pointerId), this.domElement.removeEventListener("pointermove", this._onPointerMove), this.domElement.removeEventListener("pointerup", this._onPointerUp), this.dispatchEvent(Qm), this.state = mt.NONE; break; case 1: const e = this._pointers[0], t = this._pointerPositions[e]; @@ -29132,7 +29160,7 @@ function $2(s) { break; } } -function J2(s) { +function $2(s) { if (this.showOriginIcon && this.engine && this.engine.ToolUntils) { const t = this.engine.scene?.camera || this.object; this.originPosition = this.engine.ToolUntils.WorldPointToScreenPoint(this.origin.clone(), t), console.log("Origin position:", this.originPosition, "Origin:", this.origin); @@ -29177,9 +29205,9 @@ function J2(s) { default: this.state = mt.NONE; } - this.state !== mt.NONE && this.dispatchEvent(Wu); + this.state !== mt.NONE && this.dispatchEvent(Gu); } -function Q2(s) { +function J2(s) { switch (this.state) { case mt.ROTATE: if (this.enableRotate === !1) return; @@ -29195,13 +29223,13 @@ function Q2(s) { break; } } -function eM(s) { - this.enabled === !1 || this.enableZoom === !1 || this.state !== mt.NONE || (s.preventDefault(), this.dispatchEvent(Wu), this._handleMouseWheel(this._customWheelEvent(s)), this.dispatchEvent(e0)); +function Q2(s) { + this.enabled === !1 || this.enableZoom === !1 || this.state !== mt.NONE || (s.preventDefault(), this.dispatchEvent(Gu), this._handleMouseWheel(this._customWheelEvent(s)), this.dispatchEvent(Qm)); } -function tM(s) { +function eM(s) { this.enabled !== !1 && this._handleKeyDown(s); } -function nM(s) { +function tM(s) { switch (this._trackPointer(s), this._pointers.length) { case 1: switch (this.touches.ONE) { @@ -29234,9 +29262,9 @@ function nM(s) { default: this.state = mt.NONE; } - this.state !== mt.NONE && this.dispatchEvent(Wu); + this.state !== mt.NONE && this.dispatchEvent(Gu); } -function iM(s) { +function nM(s) { switch (this._trackPointer(s), this.state) { case mt.TOUCH_ROTATE: if (this.enableRotate === !1) return; @@ -29258,16 +29286,16 @@ function iM(s) { this.state = mt.NONE; } } -function sM(s) { +function iM(s) { this.enabled !== !1 && s.preventDefault(); } -function rM(s) { +function sM(s) { s.key === "Control" && (this._controlActive = !0, this.domElement.getRootNode().addEventListener("keyup", this._interceptControlUp, { passive: !0, capture: !0 })); } -function oM(s) { +function rM(s) { s.key === "Control" && (this._controlActive = !1, this.domElement.getRootNode().removeEventListener("keyup", this._interceptControlUp, { passive: !0, capture: !0 })); } -class zf { +class Ff { constructor(e, t, n, i) { this._Engine = e, this.camera = t, this.domElement = n, this._isEnabled = !1, this._rayOriginOffset = new P(0, -1, 0), this._camerLocalDirection = new P(), this._tmpVector = new P(), this._rayCaster = new Es(), this._fallingTime = 0, this._euler = new wn(0, 0, 0, "YZX"), this._prevMouseX = 0, this._prevMouseY = 0, this.applyGravity = !1, this.gravityMinHeight = !0, this.applyCollision = !0, this.positionEasing = !0, this.lookflag = 1, this.lookSpeed = 8e-3, this.moveSpeed = 0.02, this.playerHeight = 1.4, this.maxRotateX = 0.8, this.g = 9.8, this.bindmousedown = this._Engine && this._Engine.DeviceType !== "PC" ? this.onTouchStart.bind(this) : this.onMouseDown.bind(this), this.bindmouseup = this._Engine && this._Engine.DeviceType !== "PC" ? this.onTouchEnd.bind(this) : this.onMouseUp.bind(this), this.bindmousemove = this._Engine && this._Engine.DeviceType !== "PC" ? this.onTouchMove.bind(this) : this.onMouseMove.bind(this), this.bindonKeyDown = this.onKeyDown.bind(this), this.bindonKeyUp = this.onKeyUp.bind(this), this.bindMousewheel = this.onMousewheel.bind(this), this.needMousewheel = !1, this.moveWheelRun = !0, this.moveWheelStop = !1, this.wheelClock, this.keydown = !1, this.GetEngine = () => e; } @@ -29507,7 +29535,7 @@ class zf { return t && t.material.type, null; } } -function Xu(s) { +function Wu(s) { const e = { self: null, // 当前激活的行为对象 @@ -29637,7 +29665,7 @@ function Xu(s) { } return e; } -class aM { +class oM { engine; orbitControls; firstPersonControls; @@ -29648,10 +29676,10 @@ class aM { isDown = !1; containerOffset = { left: 0, top: 0 }; constructor(e) { - this.engine = e, this.init(), this.handelBehaved = Xu(this.engine), this.handelBehaved.init(this, null), this.handelBehaved.active(); + this.engine = e, this.init(), this.handelBehaved = Wu(this.engine), this.handelBehaved.init(this, null), this.handelBehaved.active(); } init() { - this.orbitControls = new Z2(this.engine, this.engine.camera, this.engine.renderer.domElement), this.orbitControls.showOriginIcon = !0, this.firstPersonControls = new zf(this.engine, this.engine.camera, this.engine.renderer.domElement); + this.orbitControls = new q2(this.engine, this.engine.camera, this.engine.renderer.domElement), this.orbitControls.showOriginIcon = !0, this.firstPersonControls = new Ff(this.engine, this.engine.camera, this.engine.renderer.domElement); const e = document.createElement("div"); this.originDiv = e, e.className = "originDiv", e.style.position = "absolute", e.style.top = "0px", e.style.left = "0px", e.style.width = "30px", e.style.height = "30px", e.style.borderRadius = "50%", e.style.pointerEvents = "none", e.style.backgroundImage = "url(./assets/svg/rotate-orbit.svg)", this.engine.container.appendChild(this.originDiv); } @@ -29663,7 +29691,7 @@ class aM { } // 切换第一人称漫游模式 switchFirstPersonMode() { - this.firstPersonControls = new zf( + this.firstPersonControls = new Ff( this.engine, this.engine.camera, this.engine.renderer.domElement, @@ -29773,13 +29801,13 @@ class Ls { dispose() { } } -const lM = new Rs(-1, 1, 1, -1, 0, 1); -class cM extends ut { +const aM = new Rs(-1, 1, 1, -1, 0, 1); +class lM extends ut { constructor() { super(), this.setAttribute("position", new rn([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3)), this.setAttribute("uv", new rn([0, 2, 0, 0, 2, 0], 2)); } } -const hM = new cM(); +const cM = new lM(); class Ll { /** * Constructs a new full screen quad. @@ -29787,7 +29815,7 @@ class Ll { * @param {?Material} material - The material to render te full screen quad with. */ constructor(e) { - this._mesh = new dt(hM, e); + this._mesh = new dt(cM, e); } /** * Frees the GPU-related resources allocated by this instance. Call this @@ -29802,7 +29830,7 @@ class Ll { * @param {WebGLRenderer} renderer - The renderer. */ render(e) { - e.render(this._mesh, lM); + e.render(this._mesh, aM); } /** * The quad's material. @@ -29856,7 +29884,7 @@ class ol extends Ls { this.material.dispose(), this._fsQuad.dispose(); } } -class Hf extends Ls { +class zf extends Ls { /** * Constructs a new mask pass. * @@ -29884,7 +29912,7 @@ class Hf extends Ls { this.inverse ? (o = 0, a = 1) : (o = 1, a = 0), r.buffers.stencil.setTest(!0), r.buffers.stencil.setOp(i.REPLACE, i.REPLACE, i.REPLACE), r.buffers.stencil.setFunc(i.ALWAYS, o, 4294967295), r.buffers.stencil.setClear(a), r.buffers.stencil.setLocked(!0), e.setRenderTarget(n), this.clear && e.clear(), e.render(this.scene, this.camera), e.setRenderTarget(t), this.clear && e.clear(), e.render(this.scene, this.camera), r.buffers.color.setLocked(!1), r.buffers.depth.setLocked(!1), r.buffers.color.setMask(!0), r.buffers.depth.setMask(!0), r.buffers.stencil.setLocked(!1), r.buffers.stencil.setFunc(i.EQUAL, 1, 4294967295), r.buffers.stencil.setOp(i.KEEP, i.KEEP, i.KEEP), r.buffers.stencil.setLocked(!0); } } -class uM extends Ls { +class hM extends Ls { /** * Constructs a new clear mask pass. */ @@ -29906,7 +29934,7 @@ class uM extends Ls { e.state.buffers.stencil.setLocked(!1), e.state.buffers.stencil.setTest(!1); } } -class dM { +class uM { /** * Constructs a new effect composer. * @@ -29921,7 +29949,7 @@ class dM { this._width = n.width, this._height = n.height, t = new bn(this._width * this._pixelRatio, this._height * this._pixelRatio, { type: Un }), t.texture.name = "EffectComposer.rt1"; } else this._width = t.width, this._height = t.height; - this.renderTarget1 = t, this.renderTarget2 = t.clone(), this.renderTarget2.texture.name = "EffectComposer.rt2", this.writeBuffer = this.renderTarget1, this.readBuffer = this.renderTarget2, this.renderToScreen = !0, this.passes = [], this.copyPass = new ol(bs), this.copyPass.material.blending = Xt, this.clock = new Wv(); + this.renderTarget1 = t, this.renderTarget2 = t.clone(), this.renderTarget2.texture.name = "EffectComposer.rt2", this.writeBuffer = this.renderTarget1, this.readBuffer = this.renderTarget2, this.renderToScreen = !0, this.passes = [], this.copyPass = new ol(bs), this.copyPass.material.blending = Xt, this.clock = new Gv(); } /** * Swaps the internal read/write buffers. @@ -29988,7 +30016,7 @@ class dM { } this.swapBuffers(); } - Hf !== void 0 && (o instanceof Hf ? n = !0 : o instanceof uM && (n = !1)); + zf !== void 0 && (o instanceof zf ? n = !0 : o instanceof hM && (n = !1)); } } this.renderer.setRenderTarget(t); @@ -30037,7 +30065,7 @@ class dM { this.renderTarget1.dispose(), this.renderTarget2.dispose(), this.copyPass.dispose(); } } -class fM extends Ls { +class dM extends Ls { /** * Constructs a new render pass. * @@ -30361,8 +30389,8 @@ const Sa = { }` ) }; -function pM(s = 5) { - const e = Math.floor(s) % 2 === 0 ? Math.floor(s) + 1 : Math.floor(s), t = mM(e), n = t.length, i = new Uint8Array(n * 4); +function fM(s = 5) { + const e = Math.floor(s) % 2 === 0 ? Math.floor(s) + 1 : Math.floor(s), t = pM(e), n = t.length, i = new Uint8Array(n * 4); for (let o = 0; o < n; ++o) { const a = t[o], l = 2 * Math.PI * a / n, c = new P( Math.cos(l), @@ -30374,7 +30402,7 @@ function pM(s = 5) { const r = new Bo(i, e, e); return r.wrapS = hi, r.wrapT = hi, r.needsUpdate = !0, r; } -function mM(s) { +function pM(s) { const e = Math.floor(s) % 2 === 0 ? Math.floor(s) + 1 : Math.floor(s), t = e * e, n = Array(t).fill(0); let i = Math.floor(e / 2), r = e - 1; for (let o = 1; o <= t; ) { @@ -30390,7 +30418,7 @@ function mM(s) { const Ta = { defines: { SAMPLES: 16, - SAMPLE_VECTORS: t0(16, 2, 1), + SAMPLE_VECTORS: e0(16, 2, 1), NORMAL_VECTOR_TYPE: 1, DEPTH_VALUE_SOURCE: 0 }, @@ -30561,8 +30589,8 @@ const Ta = { }` ) }; -function t0(s, e, t) { - const n = gM( +function e0(s, e, t) { + const n = mM( s, e, t @@ -30574,7 +30602,7 @@ function t0(s, e, t) { } return i; } -function gM(s, e, t) { +function mM(s, e, t) { const n = []; for (let i = 0; i < s; i++) { const r = 2 * Math.PI * e * i / s, o = Math.pow(i / (s - 1), t); @@ -30582,7 +30610,7 @@ function gM(s, e, t) { } return n; } -class xM { +class gM { /** * Constructs a new simplex noise object. * @@ -30800,7 +30828,7 @@ class gn extends Ls { * @param {Object} [pdParameters] - The denoise parameters. */ constructor(e, t, n = 512, i = 512, r, o, a) { - super(), this.width = n, this.height = i, this.clear = !0, this.camera = t, this.scene = e, this.output = 0, this._renderGBuffer = !0, this._visibilityCache = [], this.blendIntensity = 1, this.pdRings = 2, this.pdRadiusExponent = 2, this.pdSamples = 16, this.gtaoNoiseTexture = pM(), this.pdNoiseTexture = this._generateNoise(), this.gtaoRenderTarget = new bn(this.width, this.height, { type: Un }), this.pdRenderTarget = this.gtaoRenderTarget.clone(), this.gtaoMaterial = new Ut({ + super(), this.width = n, this.height = i, this.clear = !0, this.camera = t, this.scene = e, this.output = 0, this._renderGBuffer = !0, this._visibilityCache = [], this.blendIntensity = 1, this.pdRings = 2, this.pdRadiusExponent = 2, this.pdSamples = 16, this.gtaoNoiseTexture = fM(), this.pdNoiseTexture = this._generateNoise(), this.gtaoRenderTarget = new bn(this.width, this.height, { type: Un }), this.pdRenderTarget = this.gtaoRenderTarget.clone(), this.gtaoMaterial = new Ut({ defines: Object.assign({}, Sa.defines), uniforms: oi.clone(Sa.uniforms), vertexShader: Sa.vertexShader, @@ -30808,7 +30836,7 @@ class gn extends Ls { blending: Xt, depthTest: !1, depthWrite: !1 - }), this.gtaoMaterial.defines.PERSPECTIVE_CAMERA = this.camera.isPerspectiveCamera ? 1 : 0, this.gtaoMaterial.uniforms.tNoise.value = this.gtaoNoiseTexture, this.gtaoMaterial.uniforms.resolution.value.set(this.width, this.height), this.gtaoMaterial.uniforms.cameraNear.value = this.camera.near, this.gtaoMaterial.uniforms.cameraFar.value = this.camera.far, this.normalMaterial = new _v(), this.normalMaterial.blending = Xt, this.pdMaterial = new Ut({ + }), this.gtaoMaterial.defines.PERSPECTIVE_CAMERA = this.camera.isPerspectiveCamera ? 1 : 0, this.gtaoMaterial.uniforms.tNoise.value = this.gtaoNoiseTexture, this.gtaoMaterial.uniforms.resolution.value.set(this.width, this.height), this.gtaoMaterial.uniforms.cameraNear.value = this.camera.near, this.gtaoMaterial.uniforms.cameraFar.value = this.camera.far, this.normalMaterial = new yv(), this.normalMaterial.blending = Xt, this.pdMaterial = new Ut({ defines: Object.assign({}, Ta.defines), uniforms: oi.clone(Ta.uniforms), vertexShader: Ta.vertexShader, @@ -30828,10 +30856,10 @@ class gn extends Ls { transparent: !0, depthTest: !1, depthWrite: !1, - blendSrc: ch, + blendSrc: lh, blendDst: lo, blendEquation: Zn, - blendSrcAlpha: lh, + blendSrcAlpha: ah, blendDstAlpha: lo, blendEquationAlpha: Zn }), this.blendMaterial = new Ut({ @@ -30841,11 +30869,11 @@ class gn extends Ls { transparent: !0, depthTest: !1, depthWrite: !1, - blending: im, - blendSrc: ch, + blending: nm, + blendSrc: lh, blendDst: lo, blendEquation: Zn, - blendSrcAlpha: lh, + blendSrcAlpha: ah, blendDstAlpha: lo, blendEquationAlpha: Zn }), this._fsQuad = new Ll(null), this._originalClearColor = new Fe(), this.setGBuffer(r ? r.depthTexture : void 0, r ? r.normalTexture : void 0), o !== void 0 && this.updateGtaoMaterial(o), a !== void 0 && this.updatePdMaterial(a); @@ -30884,7 +30912,7 @@ class gn extends Ls { * @param {DepthTexture} [normalTexture] - The normal texture. */ setGBuffer(e, t) { - e !== void 0 ? (this.depthTexture = e, this.normalTexture = t, this._renderGBuffer = !1) : (this.depthTexture = new Uu(), this.depthTexture.format = Mr, this.depthTexture.type = _r, this.normalRenderTarget = new bn(this.width, this.height, { + e !== void 0 ? (this.depthTexture = e, this.normalTexture = t, this._renderGBuffer = !1) : (this.depthTexture = new ku(), this.depthTexture.format = Mr, this.depthTexture.type = _r, this.normalRenderTarget = new bn(this.width, this.height, { minFilter: Qt, magFilter: Qt, type: Un, @@ -30917,7 +30945,7 @@ class gn extends Ls { */ updatePdMaterial(e) { let t = !1; - e.lumaPhi !== void 0 && (this.pdMaterial.uniforms.lumaPhi.value = e.lumaPhi), e.depthPhi !== void 0 && (this.pdMaterial.uniforms.depthPhi.value = e.depthPhi), e.normalPhi !== void 0 && (this.pdMaterial.uniforms.normalPhi.value = e.normalPhi), e.radius !== void 0 && e.radius !== this.radius && (this.pdMaterial.uniforms.radius.value = e.radius), e.radiusExponent !== void 0 && e.radiusExponent !== this.pdRadiusExponent && (this.pdRadiusExponent = e.radiusExponent, t = !0), e.rings !== void 0 && e.rings !== this.pdRings && (this.pdRings = e.rings, t = !0), e.samples !== void 0 && e.samples !== this.pdSamples && (this.pdSamples = e.samples, t = !0), t && (this.pdMaterial.defines.SAMPLES = this.pdSamples, this.pdMaterial.defines.SAMPLE_VECTORS = t0(this.pdSamples, this.pdRings, this.pdRadiusExponent), this.pdMaterial.needsUpdate = !0); + e.lumaPhi !== void 0 && (this.pdMaterial.uniforms.lumaPhi.value = e.lumaPhi), e.depthPhi !== void 0 && (this.pdMaterial.uniforms.depthPhi.value = e.depthPhi), e.normalPhi !== void 0 && (this.pdMaterial.uniforms.normalPhi.value = e.normalPhi), e.radius !== void 0 && e.radius !== this.radius && (this.pdMaterial.uniforms.radius.value = e.radius), e.radiusExponent !== void 0 && e.radiusExponent !== this.pdRadiusExponent && (this.pdRadiusExponent = e.radiusExponent, t = !0), e.rings !== void 0 && e.rings !== this.pdRings && (this.pdRings = e.rings, t = !0), e.samples !== void 0 && e.samples !== this.pdSamples && (this.pdSamples = e.samples, t = !0), t && (this.pdMaterial.defines.SAMPLES = this.pdSamples, this.pdMaterial.defines.SAMPLE_VECTORS = e0(this.pdSamples, this.pdRings, this.pdRadiusExponent), this.pdMaterial.needsUpdate = !0); } /** * Performs the GTAO pass. @@ -30980,7 +31008,7 @@ class gn extends Ls { e.length = 0; } _generateNoise(e = 64) { - const t = new xM(), n = e * e * 4, i = new Uint8Array(n); + const t = new gM(), n = e * e * 4, i = new Uint8Array(n); for (let o = 0; o < e; o++) for (let a = 0; a < e; a++) { const l = o, c = a; @@ -30999,7 +31027,7 @@ gn.OUTPUT = { AO: 4, Denoise: 5 }; -const vM = { +const xM = { uniforms: { tDiffuse: { value: null }, luminosityThreshold: { value: 1 }, @@ -31067,7 +31095,7 @@ class Rr extends Ls { const d = new bn(r, o, { type: Un }); d.texture.name = "UnrealBloomPass.v" + h, d.texture.generateMipmaps = !1, this.renderTargetsVertical.push(d), r = Math.round(r / 2), o = Math.round(o / 2); } - const a = vM; + const a = xM; this.highPassUniforms = oi.clone(a.uniforms), this.highPassUniforms.luminosityThreshold.value = i, this.highPassUniforms.smoothWidth.value = 0.01, this.materialHighPassFilter = new Ut({ uniforms: this.highPassUniforms, vertexShader: a.vertexShader, @@ -31083,7 +31111,7 @@ class Rr extends Ls { uniforms: this.copyUniforms, vertexShader: bs.vertexShader, fragmentShader: bs.fragmentShader, - blending: rh, + blending: sh, depthTest: !1, depthWrite: !1, transparent: !0 @@ -31314,12 +31342,12 @@ const Aa = { }` ) }; -class bM extends Ls { +class vM extends Ls { /** * Constructs a new output pass. */ constructor() { - super(), this.uniforms = oi.clone(Aa.uniforms), this.material = new bv({ + super(), this.uniforms = oi.clone(Aa.uniforms), this.material = new vv({ name: Aa.name, uniforms: this.uniforms, vertexShader: Aa.vertexShader, @@ -31338,7 +31366,7 @@ class bM extends Ls { * @param {boolean} maskActive - Whether masking is active or not. */ render(e, t, n) { - this.uniforms.tDiffuse.value = n.texture, this.uniforms.toneMappingExposure.value = e.toneMappingExposure, (this._outputColorSpace !== e.outputColorSpace || this._toneMapping !== e.toneMapping) && (this._outputColorSpace = e.outputColorSpace, this._toneMapping = e.toneMapping, this.material.defines = {}, st.getTransfer(this._outputColorSpace) === lt && (this.material.defines.SRGB_TRANSFER = ""), this._toneMapping === sm ? this.material.defines.LINEAR_TONE_MAPPING = "" : this._toneMapping === rm ? this.material.defines.REINHARD_TONE_MAPPING = "" : this._toneMapping === om ? this.material.defines.CINEON_TONE_MAPPING = "" : this._toneMapping === Mu ? this.material.defines.ACES_FILMIC_TONE_MAPPING = "" : this._toneMapping === lm ? this.material.defines.AGX_TONE_MAPPING = "" : this._toneMapping === cm ? this.material.defines.NEUTRAL_TONE_MAPPING = "" : this._toneMapping === am && (this.material.defines.CUSTOM_TONE_MAPPING = ""), this.material.needsUpdate = !0), this.renderToScreen === !0 ? (e.setRenderTarget(null), this._fsQuad.render(e)) : (e.setRenderTarget(t), this.clear && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil), this._fsQuad.render(e)); + this.uniforms.tDiffuse.value = n.texture, this.uniforms.toneMappingExposure.value = e.toneMappingExposure, (this._outputColorSpace !== e.outputColorSpace || this._toneMapping !== e.toneMapping) && (this._outputColorSpace = e.outputColorSpace, this._toneMapping = e.toneMapping, this.material.defines = {}, st.getTransfer(this._outputColorSpace) === lt && (this.material.defines.SRGB_TRANSFER = ""), this._toneMapping === im ? this.material.defines.LINEAR_TONE_MAPPING = "" : this._toneMapping === sm ? this.material.defines.REINHARD_TONE_MAPPING = "" : this._toneMapping === rm ? this.material.defines.CINEON_TONE_MAPPING = "" : this._toneMapping === _u ? this.material.defines.ACES_FILMIC_TONE_MAPPING = "" : this._toneMapping === am ? this.material.defines.AGX_TONE_MAPPING = "" : this._toneMapping === lm ? this.material.defines.NEUTRAL_TONE_MAPPING = "" : this._toneMapping === om && (this.material.defines.CUSTOM_TONE_MAPPING = ""), this.material.needsUpdate = !0), this.renderToScreen === !0 ? (e.setRenderTarget(null), this._fsQuad.render(e)) : (e.setRenderTarget(t), this.clear && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil), this._fsQuad.render(e)); } /** * Frees the GPU-related resources allocated by this instance. Call this @@ -31348,7 +31376,7 @@ class bM extends Ls { this.material.dispose(), this._fsQuad.dispose(); } } -const yM = { +const bM = { name: "FXAAShader", uniforms: { tDiffuse: { value: null }, @@ -31623,7 +31651,7 @@ const yM = { }` ) -}, _M = { +}, yM = { uniforms: { tDiffuse: { value: null }, saturation: { value: 1.2 }, @@ -31660,7 +31688,7 @@ const yM = { } ` }; -class MM { +class _M { engine; composer; saturationPass; @@ -31683,8 +31711,8 @@ class MM { samples: 4 // 启用多重采样抗锯齿 }); - this.composer = new dM(r, a), this.composer.setPixelRatio(o), this.composer.setSize(e, t); - const l = new fM(n, i); + this.composer = new uM(r, a), this.composer.setPixelRatio(o), this.composer.setSize(e, t); + const l = new dM(n, i); this.composer.addPass(l); const c = new gn(n, i, e, t); c.output = gn.OUTPUT.Default, c.blendIntensity = 0.5, c.updateGtaoMaterial && c.updateGtaoMaterial({ @@ -31707,23 +31735,23 @@ class MM { // 半径 0.5 // 阈值 - ), this.saturationPass = new ol(_M), this.saturationPass.uniforms.saturation.value = 1.3, this.saturationPass.uniforms.contrast.value = 1.1, this.composer.addPass(this.saturationPass); - const h = new bM(); + ), this.saturationPass = new ol(yM), this.saturationPass.uniforms.saturation.value = 1.3, this.saturationPass.uniforms.contrast.value = 1.1, this.composer.addPass(this.saturationPass); + const h = new vM(); this.composer.addPass(h); - const u = new ol(yM); + const u = new ol(bM); u.material.uniforms.resolution.value.x = 1 / (e * o), u.material.uniforms.resolution.value.y = 1 / (t * o), this.composer.addPass(u); } } var Ca = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {}; -function n0(s) { +function t0(s) { return s && s.__esModule && Object.prototype.hasOwnProperty.call(s, "default") ? s.default : s; } function Pa(s) { throw new Error('Could not dynamically require "' + s + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.'); } -var Vf = { exports: {} }, Gf; -function wM() { - return Gf || (Gf = 1, (function(s, e) { +var Hf = { exports: {} }, Vf; +function MM() { + return Vf || (Vf = 1, (function(s, e) { (function(t) { s.exports = t(); })(function() { @@ -34022,33 +34050,33 @@ function wM() { }).call(this, typeof Ca < "u" ? Ca : typeof self < "u" ? self : typeof window < "u" ? window : {}); }, {}] }, {}, [10])(10); }); - })(Vf)), Vf.exports; + })(Hf)), Hf.exports; } -var SM = wM(); -const i0 = /* @__PURE__ */ n0(SM); -function s0(s, e) { +var wM = MM(); +const n0 = /* @__PURE__ */ t0(wM); +function i0(s, e) { return function() { return s.apply(e, arguments); }; } -const { toString: EM } = Object.prototype, { getPrototypeOf: ju } = Object, { iterator: Dl, toStringTag: r0 } = Symbol, Il = /* @__PURE__ */ ((s) => (e) => { - const t = EM.call(e); +const { toString: SM } = Object.prototype, { getPrototypeOf: Xu } = Object, { iterator: Dl, toStringTag: s0 } = Symbol, Il = /* @__PURE__ */ ((s) => (e) => { + const t = SM.call(e); return s[t] || (s[t] = t.slice(8, -1).toLowerCase()); })(/* @__PURE__ */ Object.create(null)), ti = (s) => (s = s.toLowerCase(), (e) => Il(e) === s), Bl = (s) => (e) => typeof e === s, { isArray: kr } = Array, Lr = Bl("undefined"); function Oo(s) { return s !== null && !Lr(s) && s.constructor !== null && !Lr(s.constructor) && _n(s.constructor.isBuffer) && s.constructor.isBuffer(s); } -const o0 = ti("ArrayBuffer"); -function TM(s) { +const r0 = ti("ArrayBuffer"); +function EM(s) { let e; - return typeof ArrayBuffer < "u" && ArrayBuffer.isView ? e = ArrayBuffer.isView(s) : e = s && s.buffer && o0(s.buffer), e; + return typeof ArrayBuffer < "u" && ArrayBuffer.isView ? e = ArrayBuffer.isView(s) : e = s && s.buffer && r0(s.buffer), e; } -const AM = Bl("string"), _n = Bl("function"), a0 = Bl("number"), Fo = (s) => s !== null && typeof s == "object", CM = (s) => s === !0 || s === !1, al = (s) => { +const TM = Bl("string"), _n = Bl("function"), o0 = Bl("number"), Fo = (s) => s !== null && typeof s == "object", AM = (s) => s === !0 || s === !1, al = (s) => { if (Il(s) !== "object") return !1; - const e = ju(s); - return (e === null || e === Object.prototype || Object.getPrototypeOf(e) === null) && !(r0 in s) && !(Dl in s); -}, PM = (s) => { + const e = Xu(s); + return (e === null || e === Object.prototype || Object.getPrototypeOf(e) === null) && !(s0 in s) && !(Dl in s); +}, CM = (s) => { if (!Fo(s) || Oo(s)) return !1; try { @@ -34056,11 +34084,11 @@ const AM = Bl("string"), _n = Bl("function"), a0 = Bl("number"), Fo = (s) => s ! } catch { return !1; } -}, RM = ti("Date"), LM = ti("File"), DM = ti("Blob"), IM = ti("FileList"), BM = (s) => Fo(s) && _n(s.pipe), NM = (s) => { +}, PM = ti("Date"), RM = ti("File"), LM = ti("Blob"), DM = ti("FileList"), IM = (s) => Fo(s) && _n(s.pipe), BM = (s) => { let e; return s && (typeof FormData == "function" && s instanceof FormData || _n(s.append) && ((e = Il(s)) === "formdata" || // detect form-data instance e === "object" && _n(s.toString) && s.toString() === "[object FormData]")); -}, kM = ti("URLSearchParams"), [UM, OM, FM, zM] = ["ReadableStream", "Request", "Response", "Headers"].map(ti), HM = (s) => s.trim ? s.trim() : s.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ""); +}, NM = ti("URLSearchParams"), [kM, UM, OM, FM] = ["ReadableStream", "Request", "Response", "Headers"].map(ti), zM = (s) => s.trim ? s.trim() : s.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ""); function zo(s, e, { allOwnKeys: t = !1 } = {}) { if (s === null || typeof s > "u") return; @@ -34077,7 +34105,7 @@ function zo(s, e, { allOwnKeys: t = !1 } = {}) { a = r[n], e.call(null, s[a], a, s); } } -function l0(s, e) { +function a0(s, e) { if (Oo(s)) return null; e = e.toLowerCase(); @@ -34088,71 +34116,71 @@ function l0(s, e) { return i; return null; } -const vs = typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : typeof window < "u" ? window : global, c0 = (s) => !Lr(s) && s !== vs; -function nu() { - const { caseless: s, skipUndefined: e } = c0(this) && this || {}, t = {}, n = (i, r) => { - const o = s && l0(t, r) || r; - al(t[o]) && al(i) ? t[o] = nu(t[o], i) : al(i) ? t[o] = nu({}, i) : kr(i) ? t[o] = i.slice() : (!e || !Lr(i)) && (t[o] = i); +const vs = typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : typeof window < "u" ? window : global, l0 = (s) => !Lr(s) && s !== vs; +function tu() { + const { caseless: s, skipUndefined: e } = l0(this) && this || {}, t = {}, n = (i, r) => { + const o = s && a0(t, r) || r; + al(t[o]) && al(i) ? t[o] = tu(t[o], i) : al(i) ? t[o] = tu({}, i) : kr(i) ? t[o] = i.slice() : (!e || !Lr(i)) && (t[o] = i); }; for (let i = 0, r = arguments.length; i < r; i++) arguments[i] && zo(arguments[i], n); return t; } -const VM = (s, e, t, { allOwnKeys: n } = {}) => (zo(e, (i, r) => { - t && _n(i) ? s[r] = s0(i, t) : s[r] = i; -}, { allOwnKeys: n }), s), GM = (s) => (s.charCodeAt(0) === 65279 && (s = s.slice(1)), s), WM = (s, e, t, n) => { +const HM = (s, e, t, { allOwnKeys: n } = {}) => (zo(e, (i, r) => { + t && _n(i) ? s[r] = i0(i, t) : s[r] = i; +}, { allOwnKeys: n }), s), VM = (s) => (s.charCodeAt(0) === 65279 && (s = s.slice(1)), s), GM = (s, e, t, n) => { s.prototype = Object.create(e.prototype, n), s.prototype.constructor = s, Object.defineProperty(s, "super", { value: e.prototype }), t && Object.assign(s.prototype, t); -}, XM = (s, e, t, n) => { +}, WM = (s, e, t, n) => { let i, r, o; const a = {}; if (e = e || {}, s == null) return e; do { for (i = Object.getOwnPropertyNames(s), r = i.length; r-- > 0; ) o = i[r], (!n || n(o, s, e)) && !a[o] && (e[o] = s[o], a[o] = !0); - s = t !== !1 && ju(s); + s = t !== !1 && Xu(s); } while (s && (!t || t(s, e)) && s !== Object.prototype); return e; -}, jM = (s, e, t) => { +}, XM = (s, e, t) => { s = String(s), (t === void 0 || t > s.length) && (t = s.length), t -= e.length; const n = s.indexOf(e, t); return n !== -1 && n === t; -}, qM = (s) => { +}, jM = (s) => { if (!s) return null; if (kr(s)) return s; let e = s.length; - if (!a0(e)) return null; + if (!o0(e)) return null; const t = new Array(e); for (; e-- > 0; ) t[e] = s[e]; return t; -}, ZM = /* @__PURE__ */ ((s) => (e) => s && e instanceof s)(typeof Uint8Array < "u" && ju(Uint8Array)), YM = (s, e) => { +}, qM = /* @__PURE__ */ ((s) => (e) => s && e instanceof s)(typeof Uint8Array < "u" && Xu(Uint8Array)), ZM = (s, e) => { const t = (s && s[Dl]).call(s); let n; for (; (n = t.next()) && !n.done; ) { const i = n.value; e.call(s, i[0], i[1]); } -}, KM = (s, e) => { +}, YM = (s, e) => { let t; const n = []; for (; (t = s.exec(e)) !== null; ) n.push(t); return n; -}, $M = ti("HTMLFormElement"), JM = (s) => s.toLowerCase().replace( +}, KM = ti("HTMLFormElement"), $M = (s) => s.toLowerCase().replace( /[-_\s]([a-z\d])(\w*)/g, function(e, t, n) { return t.toUpperCase() + n; } -), Wf = (({ hasOwnProperty: s }) => (e, t) => s.call(e, t))(Object.prototype), QM = ti("RegExp"), h0 = (s, e) => { +), Gf = (({ hasOwnProperty: s }) => (e, t) => s.call(e, t))(Object.prototype), JM = ti("RegExp"), c0 = (s, e) => { const t = Object.getOwnPropertyDescriptors(s), n = {}; zo(t, (i, r) => { let o; (o = e(i, r, s)) !== !1 && (n[r] = o || i); }), Object.defineProperties(s, n); -}, e3 = (s) => { - h0(s, (e, t) => { +}, QM = (s) => { + c0(s, (e, t) => { if (_n(s) && ["arguments", "caller", "callee"].indexOf(t) !== -1) return !1; const n = s[t]; @@ -34166,19 +34194,19 @@ const VM = (s, e, t, { allOwnKeys: n } = {}) => (zo(e, (i, r) => { }); } }); -}, t3 = (s, e) => { +}, e3 = (s, e) => { const t = {}, n = (i) => { i.forEach((r) => { t[r] = !0; }); }; return kr(s) ? n(s) : n(String(s).split(e)), t; -}, n3 = () => { -}, i3 = (s, e) => s != null && Number.isFinite(s = +s) ? s : e; -function s3(s) { - return !!(s && _n(s.append) && s[r0] === "FormData" && s[Dl]); +}, t3 = () => { +}, n3 = (s, e) => s != null && Number.isFinite(s = +s) ? s : e; +function i3(s) { + return !!(s && _n(s.append) && s[s0] === "FormData" && s[Dl]); } -const r3 = (s) => { +const s3 = (s) => { const e = new Array(10), t = (n, i) => { if (Fo(n)) { if (e.indexOf(n) >= 0) @@ -34197,72 +34225,72 @@ const r3 = (s) => { return n; }; return t(s, 0); -}, o3 = ti("AsyncFunction"), a3 = (s) => s && (Fo(s) || _n(s)) && _n(s.then) && _n(s.catch), u0 = ((s, e) => s ? setImmediate : e ? ((t, n) => (vs.addEventListener("message", ({ source: i, data: r }) => { +}, r3 = ti("AsyncFunction"), o3 = (s) => s && (Fo(s) || _n(s)) && _n(s.then) && _n(s.catch), h0 = ((s, e) => s ? setImmediate : e ? ((t, n) => (vs.addEventListener("message", ({ source: i, data: r }) => { i === vs && r === t && n.length && n.shift()(); }, !1), (i) => { n.push(i), vs.postMessage(t, "*"); }))(`axios@${Math.random()}`, []) : (t) => setTimeout(t))( typeof setImmediate == "function", _n(vs.postMessage) -), l3 = typeof queueMicrotask < "u" ? queueMicrotask.bind(vs) : typeof process < "u" && process.nextTick || u0, c3 = (s) => s != null && _n(s[Dl]), se = { +), a3 = typeof queueMicrotask < "u" ? queueMicrotask.bind(vs) : typeof process < "u" && process.nextTick || h0, l3 = (s) => s != null && _n(s[Dl]), se = { isArray: kr, - isArrayBuffer: o0, + isArrayBuffer: r0, isBuffer: Oo, - isFormData: NM, - isArrayBufferView: TM, - isString: AM, - isNumber: a0, - isBoolean: CM, + isFormData: BM, + isArrayBufferView: EM, + isString: TM, + isNumber: o0, + isBoolean: AM, isObject: Fo, isPlainObject: al, - isEmptyObject: PM, - isReadableStream: UM, - isRequest: OM, - isResponse: FM, - isHeaders: zM, + isEmptyObject: CM, + isReadableStream: kM, + isRequest: UM, + isResponse: OM, + isHeaders: FM, isUndefined: Lr, - isDate: RM, - isFile: LM, - isBlob: DM, - isRegExp: QM, + isDate: PM, + isFile: RM, + isBlob: LM, + isRegExp: JM, isFunction: _n, - isStream: BM, - isURLSearchParams: kM, - isTypedArray: ZM, - isFileList: IM, + isStream: IM, + isURLSearchParams: NM, + isTypedArray: qM, + isFileList: DM, forEach: zo, - merge: nu, - extend: VM, - trim: HM, - stripBOM: GM, - inherits: WM, - toFlatObject: XM, + merge: tu, + extend: HM, + trim: zM, + stripBOM: VM, + inherits: GM, + toFlatObject: WM, kindOf: Il, kindOfTest: ti, - endsWith: jM, - toArray: qM, - forEachEntry: YM, - matchAll: KM, - isHTMLForm: $M, - hasOwnProperty: Wf, - hasOwnProp: Wf, + endsWith: XM, + toArray: jM, + forEachEntry: ZM, + matchAll: YM, + isHTMLForm: KM, + hasOwnProperty: Gf, + hasOwnProp: Gf, // an alias to avoid ESLint no-prototype-builtins detection - reduceDescriptors: h0, - freezeMethods: e3, - toObjectSet: t3, - toCamelCase: JM, - noop: n3, - toFiniteNumber: i3, - findKey: l0, + reduceDescriptors: c0, + freezeMethods: QM, + toObjectSet: e3, + toCamelCase: $M, + noop: t3, + toFiniteNumber: n3, + findKey: a0, global: vs, - isContextDefined: c0, - isSpecCompliantForm: s3, - toJSONObject: r3, - isAsyncFn: o3, - isThenable: a3, - setImmediate: u0, - asap: l3, - isIterable: c3 + isContextDefined: l0, + isSpecCompliantForm: i3, + toJSONObject: s3, + isAsyncFn: r3, + isThenable: o3, + setImmediate: h0, + asap: a3, + isIterable: l3 }; function Je(s, e, t, n, i) { Error.call(this), Error.captureStackTrace ? Error.captureStackTrace(this, this.constructor) : this.stack = new Error().stack, this.message = s, this.name = "AxiosError", e && (this.code = e), t && (this.config = t), n && (this.request = n), i && (this.response = i, this.status = i.status ? i.status : null); @@ -34288,7 +34316,7 @@ se.inherits(Je, Error, { }; } }); -const d0 = Je.prototype, f0 = {}; +const u0 = Je.prototype, d0 = {}; [ "ERR_BAD_OPTION_VALUE", "ERR_BAD_OPTION", @@ -34304,34 +34332,34 @@ const d0 = Je.prototype, f0 = {}; "ERR_INVALID_URL" // eslint-disable-next-line func-names ].forEach((s) => { - f0[s] = { value: s }; + d0[s] = { value: s }; }); -Object.defineProperties(Je, f0); -Object.defineProperty(d0, "isAxiosError", { value: !0 }); +Object.defineProperties(Je, d0); +Object.defineProperty(u0, "isAxiosError", { value: !0 }); Je.from = (s, e, t, n, i, r) => { - const o = Object.create(d0); + const o = Object.create(u0); se.toFlatObject(s, o, function(c) { return c !== Error.prototype; }, (c) => c !== "isAxiosError"); const a = s && s.message ? s.message : "Error", l = e == null && s ? s.code : e; return Je.call(o, a, l, t, n, i), s && o.cause == null && Object.defineProperty(o, "cause", { value: s, configurable: !0 }), o.name = s && s.name || "Error", r && Object.assign(o, r), o; }; -const h3 = null; -function iu(s) { +const c3 = null; +function nu(s) { return se.isPlainObject(s) || se.isArray(s); } -function p0(s) { +function f0(s) { return se.endsWith(s, "[]") ? s.slice(0, -2) : s; } -function Xf(s, e, t) { +function Wf(s, e, t) { return s ? s.concat(e).map(function(n, i) { - return n = p0(n), !t && i ? "[" + n + "]" : n; + return n = f0(n), !t && i ? "[" + n + "]" : n; }).join(t ? "." : "") : e; } -function u3(s) { - return se.isArray(s) && !s.some(iu); +function h3(s) { + return se.isArray(s) && !s.some(nu); } -const d3 = se.toFlatObject(se, {}, null, function(s) { +const u3 = se.toFlatObject(se, {}, null, function(s) { return /^is[A-Z]/.test(s); }); function Nl(s, e, t) { @@ -34362,21 +34390,21 @@ function Nl(s, e, t) { if (f && !g && typeof f == "object") { if (se.endsWith(p, "{}")) p = n ? p : p.slice(0, -2), f = JSON.stringify(f); - else if (se.isArray(f) && u3(f) || (se.isFileList(f) || se.endsWith(p, "[]")) && (x = se.toArray(f))) - return p = p0(p), x.forEach(function(m, b) { + else if (se.isArray(f) && h3(f) || (se.isFileList(f) || se.endsWith(p, "[]")) && (x = se.toArray(f))) + return p = f0(p), x.forEach(function(m, b) { !(se.isUndefined(m) || m === null) && e.append( // eslint-disable-next-line no-nested-ternary - o === !0 ? Xf([p], b, r) : o === null ? p : p + "[]", + o === !0 ? Wf([p], b, r) : o === null ? p : p + "[]", l(m) ); }), !1; } - return iu(f) ? !0 : (e.append(Xf(g, p, r), l(f)), !1); + return nu(f) ? !0 : (e.append(Wf(g, p, r), l(f)), !1); } - const h = [], u = Object.assign(d3, { + const h = [], u = Object.assign(u3, { defaultVisitor: c, convertValue: l, - isVisitable: iu + isVisitable: nu }); function d(f, p) { if (!se.isUndefined(f)) { @@ -34397,7 +34425,7 @@ function Nl(s, e, t) { throw new TypeError("data must be an object"); return d(s), e; } -function jf(s) { +function Xf(s) { const e = { "!": "%21", "'": "%27", @@ -34411,40 +34439,40 @@ function jf(s) { return e[t]; }); } -function qu(s, e) { +function ju(s, e) { this._pairs = [], s && Nl(s, this, e); } -const m0 = qu.prototype; -m0.append = function(s, e) { +const p0 = ju.prototype; +p0.append = function(s, e) { this._pairs.push([s, e]); }; -m0.toString = function(s) { +p0.toString = function(s) { const e = s ? function(t) { - return s.call(this, t, jf); - } : jf; + return s.call(this, t, Xf); + } : Xf; return this._pairs.map(function(t) { return e(t[0]) + "=" + e(t[1]); }, "").join("&"); }; -function f3(s) { +function d3(s) { return encodeURIComponent(s).replace(/%3A/gi, ":").replace(/%24/g, "$").replace(/%2C/gi, ",").replace(/%20/g, "+"); } -function g0(s, e, t) { +function m0(s, e, t) { if (!e) return s; - const n = t && t.encode || f3; + const n = t && t.encode || d3; se.isFunction(t) && (t = { serialize: t }); const i = t && t.serialize; let r; - if (i ? r = i(e, t) : r = se.isURLSearchParams(e) ? e.toString() : new qu(e, t).toString(n), r) { + if (i ? r = i(e, t) : r = se.isURLSearchParams(e) ? e.toString() : new ju(e, t).toString(n), r) { const o = s.indexOf("#"); o !== -1 && (s = s.slice(0, o)), s += (s.indexOf("?") === -1 ? "?" : "&") + r; } return s; } -class qf { +class jf { constructor() { this.handlers = []; } @@ -34498,31 +34526,31 @@ class qf { }); } } -const x0 = { +const g0 = { silentJSONParsing: !0, forcedJSONParsing: !0, clarifyTimeoutError: !1 -}, p3 = typeof URLSearchParams < "u" ? URLSearchParams : qu, m3 = typeof FormData < "u" ? FormData : null, g3 = typeof Blob < "u" ? Blob : null, x3 = { +}, f3 = typeof URLSearchParams < "u" ? URLSearchParams : ju, p3 = typeof FormData < "u" ? FormData : null, m3 = typeof Blob < "u" ? Blob : null, g3 = { isBrowser: !0, classes: { - URLSearchParams: p3, - FormData: m3, - Blob: g3 + URLSearchParams: f3, + FormData: p3, + Blob: m3 }, protocols: ["http", "https", "file", "blob", "url", "data"] -}, Zu = typeof window < "u" && typeof document < "u", su = typeof navigator == "object" && navigator || void 0, v3 = Zu && (!su || ["ReactNative", "NativeScript", "NS"].indexOf(su.product) < 0), b3 = typeof WorkerGlobalScope < "u" && // eslint-disable-next-line no-undef -self instanceof WorkerGlobalScope && typeof self.importScripts == "function", y3 = Zu && window.location.href || "http://localhost", _3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}, qu = typeof window < "u" && typeof document < "u", iu = typeof navigator == "object" && navigator || void 0, x3 = qu && (!iu || ["ReactNative", "NativeScript", "NS"].indexOf(iu.product) < 0), v3 = typeof WorkerGlobalScope < "u" && // eslint-disable-next-line no-undef +self instanceof WorkerGlobalScope && typeof self.importScripts == "function", b3 = qu && window.location.href || "http://localhost", y3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - hasBrowserEnv: Zu, - hasStandardBrowserEnv: v3, - hasStandardBrowserWebWorkerEnv: b3, - navigator: su, - origin: y3 + hasBrowserEnv: qu, + hasStandardBrowserEnv: x3, + hasStandardBrowserWebWorkerEnv: v3, + navigator: iu, + origin: b3 }, Symbol.toStringTag, { value: "Module" })), sn = { - ..._3, - ...x3 + ...y3, + ...g3 }; -function M3(s, e) { +function _3(s, e) { return Nl(s, new sn.classes.URLSearchParams(), { visitor: function(t, n, i, r) { return sn.isNode && se.isBuffer(t) ? (this.append(n, t.toString("base64")), !1) : r.defaultVisitor.apply(this, arguments); @@ -34530,10 +34558,10 @@ function M3(s, e) { ...e }); } -function w3(s) { +function M3(s) { return se.matchAll(/\w+|\[(\w*)]/g, s).map((e) => e[0] === "[]" ? "" : e[1] || e[0]); } -function S3(s) { +function w3(s) { const e = {}, t = Object.keys(s); let n; const i = t.length; @@ -34542,22 +34570,22 @@ function S3(s) { r = t[n], e[r] = s[r]; return e; } -function v0(s) { +function x0(s) { function e(t, n, i, r) { let o = t[r++]; if (o === "__proto__") return !0; const a = Number.isFinite(+o), l = r >= t.length; - return o = !o && se.isArray(i) ? i.length : o, l ? (se.hasOwnProp(i, o) ? i[o] = [i[o], n] : i[o] = n, !a) : ((!i[o] || !se.isObject(i[o])) && (i[o] = []), e(t, n, i[o], r) && se.isArray(i[o]) && (i[o] = S3(i[o])), !a); + return o = !o && se.isArray(i) ? i.length : o, l ? (se.hasOwnProp(i, o) ? i[o] = [i[o], n] : i[o] = n, !a) : ((!i[o] || !se.isObject(i[o])) && (i[o] = []), e(t, n, i[o], r) && se.isArray(i[o]) && (i[o] = w3(i[o])), !a); } if (se.isFormData(s) && se.isFunction(s.entries)) { const t = {}; return se.forEachEntry(s, (n, i) => { - e(w3(n), i, t, 0); + e(M3(n), i, t, 0); }), t; } return null; } -function E3(s, e, t) { +function S3(s, e, t) { if (se.isString(s)) try { return (e || JSON.parse)(s), se.trim(s); @@ -34568,12 +34596,12 @@ function E3(s, e, t) { return (t || JSON.stringify)(s); } const Ho = { - transitional: x0, + transitional: g0, adapter: ["xhr", "http", "fetch"], transformRequest: [function(s, e) { const t = e.getContentType() || "", n = t.indexOf("application/json") > -1, i = se.isObject(s); if (i && se.isHTMLForm(s) && (s = new FormData(s)), se.isFormData(s)) - return n ? JSON.stringify(v0(s)) : s; + return n ? JSON.stringify(x0(s)) : s; if (se.isArrayBuffer(s) || se.isBuffer(s) || se.isStream(s) || se.isFile(s) || se.isBlob(s) || se.isReadableStream(s)) return s; if (se.isArrayBufferView(s)) @@ -34583,7 +34611,7 @@ const Ho = { let r; if (i) { if (t.indexOf("application/x-www-form-urlencoded") > -1) - return M3(s, this.formSerializer).toString(); + return _3(s, this.formSerializer).toString(); if ((r = se.isFileList(s)) || t.indexOf("multipart/form-data") > -1) { const o = this.env && this.env.FormData; return Nl( @@ -34593,7 +34621,7 @@ const Ho = { ); } } - return i || n ? (e.setContentType("application/json", !1), E3(s)) : s; + return i || n ? (e.setContentType("application/json", !1), S3(s)) : s; }], transformResponse: [function(s) { const e = this.transitional || Ho.transitional, t = e && e.forcedJSONParsing, n = this.responseType === "json"; @@ -34636,7 +34664,7 @@ const Ho = { se.forEach(["delete", "get", "head", "post", "put", "patch"], (s) => { Ho.headers[s] = {}; }); -const T3 = se.toObjectSet([ +const E3 = se.toObjectSet([ "age", "authorization", "content-length", @@ -34654,28 +34682,28 @@ const T3 = se.toObjectSet([ "referer", "retry-after", "user-agent" -]), A3 = (s) => { +]), T3 = (s) => { const e = {}; let t, n, i; return s && s.split(` `).forEach(function(r) { - i = r.indexOf(":"), t = r.substring(0, i).trim().toLowerCase(), n = r.substring(i + 1).trim(), !(!t || e[t] && T3[t]) && (t === "set-cookie" ? e[t] ? e[t].push(n) : e[t] = [n] : e[t] = e[t] ? e[t] + ", " + n : n); + i = r.indexOf(":"), t = r.substring(0, i).trim().toLowerCase(), n = r.substring(i + 1).trim(), !(!t || e[t] && E3[t]) && (t === "set-cookie" ? e[t] ? e[t].push(n) : e[t] = [n] : e[t] = e[t] ? e[t] + ", " + n : n); }), e; -}, Zf = Symbol("internals"); +}, qf = Symbol("internals"); function Jr(s) { return s && String(s).trim().toLowerCase(); } function ll(s) { return s === !1 || s == null ? s : se.isArray(s) ? s.map(ll) : String(s); } -function C3(s) { +function A3(s) { const e = /* @__PURE__ */ Object.create(null), t = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g; let n; for (; n = t.exec(s); ) e[n[1]] = n[2]; return e; } -const P3 = (s) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(s.trim()); +const C3 = (s) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(s.trim()); function Ac(s, e, t, n, i) { if (se.isFunction(n)) return n.call(this, e, t); @@ -34686,10 +34714,10 @@ function Ac(s, e, t, n, i) { return n.test(e); } } -function R3(s) { +function P3(s) { return s.trim().toLowerCase().replace(/([a-z\d])(\w*)/g, (e, t, n) => t.toUpperCase() + n); } -function L3(s, e) { +function R3(s, e) { const t = se.toCamelCase(" " + e); ["get", "set", "has"].forEach((n) => { Object.defineProperty(s, n + t, { @@ -34716,8 +34744,8 @@ let Mn = class { const r = (o, a) => se.forEach(o, (l, c) => i(l, c, a)); if (se.isPlainObject(s) || s instanceof this.constructor) r(s, e); - else if (se.isString(s) && (s = s.trim()) && !P3(s)) - r(A3(s), e); + else if (se.isString(s) && (s = s.trim()) && !C3(s)) + r(T3(s), e); else if (se.isObject(s) && se.isIterable(s)) { let o = {}, a, l; for (const c of s) { @@ -34738,7 +34766,7 @@ let Mn = class { if (!e) return n; if (e === !0) - return C3(n); + return A3(n); if (se.isFunction(e)) return e.call(this, n, t); if (se.isRegExp(e)) @@ -34782,7 +34810,7 @@ let Mn = class { e[r] = ll(n), delete e[i]; return; } - const o = s ? R3(i) : String(i).trim(); + const o = s ? P3(i) : String(i).trim(); o !== i && delete e[i], e[o] = ll(n), t[o] = !0; }), this; } @@ -34816,12 +34844,12 @@ let Mn = class { return e.forEach((n) => t.set(n)), t; } static accessor(s) { - const e = (this[Zf] = this[Zf] = { + const e = (this[qf] = this[qf] = { accessors: {} }).accessors, t = this.prototype; function n(i) { const r = Jr(i); - e[r] || (L3(t, i), e[r] = !0); + e[r] || (R3(t, i), e[r] = !0); } return se.isArray(s) ? s.forEach(n) : n(s), this; } @@ -34844,7 +34872,7 @@ function Cc(s, e) { r = o.call(t, r, i.normalize(), e ? e.status : void 0); }), i.normalize(), r; } -function b0(s) { +function v0(s) { return !!(s && s.__CANCEL__); } function Ur(s, e, t) { @@ -34853,7 +34881,7 @@ function Ur(s, e, t) { se.inherits(Ur, Je, { __CANCEL__: !0 }); -function y0(s, e, t) { +function b0(s, e, t) { const n = t.config.validateStatus; !t.status || !n || n(t.status) ? s(t) : e(new Je( "Request failed with status code " + t.status, @@ -34863,11 +34891,11 @@ function y0(s, e, t) { t )); } -function D3(s) { +function L3(s) { const e = /^([-+\w]{1,25})(:?\/\/|:)/.exec(s); return e && e[1] || ""; } -function I3(s, e) { +function D3(s, e) { s = s || 10; const t = new Array(s), n = new Array(s); let i = 0, r = 0, o; @@ -34883,7 +34911,7 @@ function I3(s, e) { return d ? Math.round(u * 1e3 / d) : void 0; }; } -function B3(s, e) { +function I3(s, e) { let t = 0, n = 1e3 / e, i, r; const o = (a, l = Date.now()) => { t = l, i = null, r && (clearTimeout(r), r = null), s(...a); @@ -34897,8 +34925,8 @@ function B3(s, e) { } const Ml = (s, e, t = 3) => { let n = 0; - const i = I3(50, 250); - return B3((r) => { + const i = D3(50, 250); + return I3((r) => { const o = r.loaded, a = r.lengthComputable ? r.total : void 0, l = o - n, c = i(l), h = o <= a; n = o; const u = { @@ -34914,17 +34942,17 @@ const Ml = (s, e, t = 3) => { }; s(u); }, t); -}, Yf = (s, e) => { +}, Zf = (s, e) => { const t = s != null; return [(n) => e[0]({ lengthComputable: t, total: s, loaded: n }), e[1]]; -}, Kf = (s) => (...e) => se.asap(() => s(...e)), N3 = sn.hasStandardBrowserEnv ? /* @__PURE__ */ ((s, e) => (t) => (t = new URL(t, sn.origin), s.protocol === t.protocol && s.host === t.host && (e || s.port === t.port)))( +}, Yf = (s) => (...e) => se.asap(() => s(...e)), B3 = sn.hasStandardBrowserEnv ? /* @__PURE__ */ ((s, e) => (t) => (t = new URL(t, sn.origin), s.protocol === t.protocol && s.host === t.host && (e || s.port === t.port)))( new URL(sn.origin), sn.navigator && /(msie|trident)/i.test(sn.navigator.userAgent) -) : () => !0, k3 = sn.hasStandardBrowserEnv ? ( +) : () => !0, N3 = sn.hasStandardBrowserEnv ? ( // Standard browser envs support document.cookie { write(s, e, t, n, i, r, o) { @@ -34953,17 +34981,17 @@ const Ml = (s, e, t = 3) => { } } ); -function U3(s) { +function k3(s) { return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(s); } -function O3(s, e) { +function U3(s, e) { return e ? s.replace(/\/?\/$/, "") + "/" + e.replace(/^\/+/, "") : s; } -function _0(s, e, t) { - let n = !U3(e); - return s && (n || t == !1) ? O3(s, e) : e; +function y0(s, e, t) { + let n = !k3(e); + return s && (n || t == !1) ? U3(s, e) : e; } -const $f = (s) => s instanceof Mn ? { ...s } : s; +const Kf = (s) => s instanceof Mn ? { ...s } : s; function Ts(s, e) { e = e || {}; const t = {}; @@ -35021,17 +35049,17 @@ function Ts(s, e) { socketPath: o, responseEncoding: o, validateStatus: a, - headers: (c, h, u) => i($f(c), $f(h), u, !0) + headers: (c, h, u) => i(Kf(c), Kf(h), u, !0) }; return se.forEach(Object.keys({ ...s, ...e }), function(c) { const h = l[c] || i, u = h(s[c], e[c], c); se.isUndefined(u) && h !== a || (t[c] = u); }), t; } -const M0 = (s) => { +const _0 = (s) => { const e = Ts({}, s); let { data: t, withXSRFToken: n, xsrfHeaderName: i, xsrfCookieName: r, headers: o, auth: a } = e; - if (e.headers = o = Mn.from(o), e.url = g0(_0(e.baseURL, e.url, e.allowAbsoluteUrls), s.params, s.paramsSerializer), a && o.set( + if (e.headers = o = Mn.from(o), e.url = m0(y0(e.baseURL, e.url, e.allowAbsoluteUrls), s.params, s.paramsSerializer), a && o.set( "Authorization", "Basic " + btoa((a.username || "") + ":" + (a.password ? unescape(encodeURIComponent(a.password)) : "")) ), se.isFormData(t)) { @@ -35044,14 +35072,14 @@ const M0 = (s) => { }); } } - if (sn.hasStandardBrowserEnv && (n && se.isFunction(n) && (n = n(e)), n || n !== !1 && N3(e.url))) { - const l = i && r && k3.read(r); + if (sn.hasStandardBrowserEnv && (n && se.isFunction(n) && (n = n(e)), n || n !== !1 && B3(e.url))) { + const l = i && r && N3.read(r); l && o.set(i, l); } return e; -}, F3 = typeof XMLHttpRequest < "u", z3 = F3 && function(s) { +}, O3 = typeof XMLHttpRequest < "u", F3 = O3 && function(s) { return new Promise(function(e, t) { - const n = M0(s); + const n = _0(s); let i = n.data; const r = Mn.from(n.headers).normalize(); let { responseType: o, onUploadProgress: a, onDownloadProgress: l } = n, c, h, u, d, f; @@ -35073,7 +35101,7 @@ const M0 = (s) => { config: s, request: g }; - y0(function(y) { + b0(function(y) { e(y), p(); }, function(y) { t(y), p(); @@ -35088,7 +35116,7 @@ const M0 = (s) => { y.event = b || null, t(y), g = null; }, g.ontimeout = function() { let b = n.timeout ? "timeout of " + n.timeout + "ms exceeded" : "timeout exceeded"; - const v = n.transitional || x0; + const v = n.transitional || g0; n.timeoutErrorMessage && (b = n.timeoutErrorMessage), t(new Je( b, v.clarifyTimeoutError ? Je.ETIMEDOUT : Je.ECONNABORTED, @@ -35100,14 +35128,14 @@ const M0 = (s) => { }), se.isUndefined(n.withCredentials) || (g.withCredentials = !!n.withCredentials), o && o !== "json" && (g.responseType = n.responseType), l && ([u, f] = Ml(l, !0), g.addEventListener("progress", u)), a && g.upload && ([h, d] = Ml(a), g.upload.addEventListener("progress", h), g.upload.addEventListener("loadend", d)), (n.cancelToken || n.signal) && (c = (b) => { g && (t(!b || b.type ? new Ur(null, s, g) : b), g.abort(), g = null); }, n.cancelToken && n.cancelToken.subscribe(c), n.signal && (n.signal.aborted ? c() : n.signal.addEventListener("abort", c))); - const m = D3(n.url); + const m = L3(n.url); if (m && sn.protocols.indexOf(m) === -1) { t(new Je("Unsupported protocol " + m + ":", Je.ERR_BAD_REQUEST, s)); return; } g.send(i || null); }); -}, H3 = (s, e) => { +}, z3 = (s, e) => { const { length: t } = s = s ? s.filter(Boolean) : []; if (e || t) { let n = new AbortController(), i; @@ -35130,7 +35158,7 @@ const M0 = (s) => { const { signal: l } = n; return l.unsubscribe = () => se.asap(a), l; } -}, V3 = function* (s, e) { +}, H3 = function* (s, e) { let t = s.byteLength; if (t < e) { yield s; @@ -35139,10 +35167,10 @@ const M0 = (s) => { let n = 0, i; for (; n < t; ) i = n + e, yield s.slice(n, i), n = i; -}, G3 = async function* (s, e) { - for await (const t of W3(s)) - yield* V3(t, e); -}, W3 = async function* (s) { +}, V3 = async function* (s, e) { + for await (const t of G3(s)) + yield* H3(t, e); +}, G3 = async function* (s) { if (s[Symbol.asyncIterator]) { yield* s; return; @@ -35158,8 +35186,8 @@ const M0 = (s) => { } finally { await e.cancel(); } -}, Jf = (s, e, t, n) => { - const i = G3(s, e); +}, $f = (s, e, t, n) => { + const i = V3(s, e); let r = 0, o, a = (l) => { o || (o = !0, n && n(l)); }; @@ -35187,36 +35215,36 @@ const M0 = (s) => { }, { highWaterMark: 2 }); -}, Qf = 64 * 1024, { isFunction: Ra } = se, X3 = (({ Request: s, Response: e }) => ({ +}, Jf = 64 * 1024, { isFunction: Ra } = se, W3 = (({ Request: s, Response: e }) => ({ Request: s, Response: e }))(se.global), { - ReadableStream: ep, - TextEncoder: tp -} = se.global, np = (s, ...e) => { + ReadableStream: Qf, + TextEncoder: ep +} = se.global, tp = (s, ...e) => { try { return !!s(...e); } catch { return !1; } -}, j3 = (s) => { +}, X3 = (s) => { s = se.merge.call({ skipUndefined: !0 - }, X3, s); + }, W3, s); const { fetch: e, Request: t, Response: n } = s, i = e ? Ra(e) : typeof fetch == "function", r = Ra(t), o = Ra(n); if (!i) return !1; - const a = i && Ra(ep), l = i && (typeof tp == "function" ? /* @__PURE__ */ ((p) => (g) => p.encode(g))(new tp()) : async (p) => new Uint8Array(await new t(p).arrayBuffer())), c = r && a && np(() => { + const a = i && Ra(Qf), l = i && (typeof ep == "function" ? /* @__PURE__ */ ((p) => (g) => p.encode(g))(new ep()) : async (p) => new Uint8Array(await new t(p).arrayBuffer())), c = r && a && tp(() => { let p = !1; const g = new t(sn.origin, { - body: new ep(), + body: new Qf(), method: "POST", get duplex() { return p = !0, "half"; } }).headers.has("Content-Type"); return p && !g; - }), h = o && a && np(() => se.isReadableStream(new n("").body)), u = { + }), h = o && a && tp(() => se.isReadableStream(new n("").body)), u = { stream: h && ((p) => p.body) }; i && ["text", "arrayBuffer", "blob", "formData", "stream"].forEach((p) => { @@ -35256,9 +35284,9 @@ const M0 = (s) => { headers: R, withCredentials: _ = "same-origin", fetchOptions: S - } = M0(p), D = e || fetch; + } = _0(p), D = e || fetch; A = A ? (A + "").toLowerCase() : "text"; - let C = H3([b, v && v.toAbortSignal()], y), B = null; + let C = z3([b, v && v.toAbortSignal()], y), B = null; const w = C && C.unsubscribe && (() => { C.unsubscribe(); }); @@ -35271,11 +35299,11 @@ const M0 = (s) => { duplex: "half" }), Y; if (se.isFormData(m) && (Y = X.headers.get("content-type")) && R.setContentType(Y), X.body) { - const [ge, pe] = Yf( + const [ge, pe] = Zf( F, - Ml(Kf(E)) + Ml(Yf(E)) ); - m = Jf(X.body, Qf, ge, pe); + m = $f(X.body, Jf, ge, pe); } } se.isString(_) || (_ = _ ? "include" : "omit"); @@ -35296,12 +35324,12 @@ const M0 = (s) => { ["status", "statusText", "headers"].forEach((de) => { X[de] = $[de]; }); - const Y = se.toFiniteNumber($.headers.get("content-length")), [ge, pe] = M && Yf( + const Y = se.toFiniteNumber($.headers.get("content-length")), [ge, pe] = M && Zf( Y, - Ml(Kf(M), !0) + Ml(Yf(M), !0) ) || []; $ = new n( - Jf($.body, Qf, ge, () => { + $f($.body, Jf, ge, () => { pe && pe(), w && w(); }), X @@ -35310,7 +35338,7 @@ const M0 = (s) => { A = A || "text"; let re = await u[se.findKey(u, A) || "text"]($, p); return !Z && w && w(), await new Promise((X, Y) => { - y0(X, Y, { + b0(X, Y, { data: re, headers: Mn.from($.headers), status: $.status, @@ -35328,27 +35356,27 @@ const M0 = (s) => { ) : Je.from(W, W && W.code, p, B); } }; -}, q3 = /* @__PURE__ */ new Map(), w0 = (s) => { +}, j3 = /* @__PURE__ */ new Map(), M0 = (s) => { let e = s && s.env || {}; const { fetch: t, Request: n, Response: i } = e, r = [ n, i, t ]; - let o = r.length, a = o, l, c, h = q3; + let o = r.length, a = o, l, c, h = j3; for (; a--; ) - l = r[a], c = h.get(l), c === void 0 && h.set(l, c = a ? /* @__PURE__ */ new Map() : j3(e)), h = c; + l = r[a], c = h.get(l), c === void 0 && h.set(l, c = a ? /* @__PURE__ */ new Map() : X3(e)), h = c; return c; }; -w0(); -const Yu = { - http: h3, - xhr: z3, +M0(); +const Zu = { + http: c3, + xhr: F3, fetch: { - get: w0 + get: M0 } }; -se.forEach(Yu, (s, e) => { +se.forEach(Zu, (s, e) => { if (s) { try { Object.defineProperty(s, "name", { value: e }); @@ -35357,8 +35385,8 @@ se.forEach(Yu, (s, e) => { Object.defineProperty(s, "adapterName", { value: e }); } }); -const ip = (s) => `- ${s}`, Z3 = (s) => se.isFunction(s) || s === null || s === !1; -function Y3(s, e) { +const np = (s) => `- ${s}`, q3 = (s) => se.isFunction(s) || s === null || s === !1; +function Z3(s, e) { s = se.isArray(s) ? s : [s]; const { length: t } = s; let n, i; @@ -35366,7 +35394,7 @@ function Y3(s, e) { for (let o = 0; o < t; o++) { n = s[o]; let a; - if (i = n, !Z3(n) && (i = Yu[(a = String(n)).toLowerCase()], i === void 0)) + if (i = n, !q3(n) && (i = Zu[(a = String(n)).toLowerCase()], i === void 0)) throw new Je(`Unknown adapter '${a}'`); if (i && (se.isFunction(i) || (i = i.get(e)))) break; @@ -35377,8 +35405,8 @@ function Y3(s, e) { ([l, c]) => `adapter ${l} ` + (c === !1 ? "is not supported by the environment" : "is not available in the build") ); let a = t ? o.length > 1 ? `since : -` + o.map(ip).join(` -`) : " " + ip(o[0]) : "as no adapter specified"; +` + o.map(np).join(` +`) : " " + np(o[0]) : "as no adapter specified"; throw new Je( "There is no suitable adapter to dispatch the request " + a, "ERR_NOT_SUPPORT" @@ -35386,50 +35414,50 @@ function Y3(s, e) { } return i; } -const S0 = { +const w0 = { /** * Resolve an adapter from a list of adapter names or functions. * @type {Function} */ - getAdapter: Y3, + getAdapter: Z3, /** * Exposes all known adapters * @type {Object} */ - adapters: Yu + adapters: Zu }; function Pc(s) { if (s.cancelToken && s.cancelToken.throwIfRequested(), s.signal && s.signal.aborted) throw new Ur(null, s); } -function sp(s) { +function ip(s) { return Pc(s), s.headers = Mn.from(s.headers), s.data = Cc.call( s, s.transformRequest - ), ["post", "put", "patch"].indexOf(s.method) !== -1 && s.headers.setContentType("application/x-www-form-urlencoded", !1), S0.getAdapter(s.adapter || Ho.adapter, s)(s).then(function(e) { + ), ["post", "put", "patch"].indexOf(s.method) !== -1 && s.headers.setContentType("application/x-www-form-urlencoded", !1), w0.getAdapter(s.adapter || Ho.adapter, s)(s).then(function(e) { return Pc(s), e.data = Cc.call( s, s.transformResponse, e ), e.headers = Mn.from(e.headers), e; }, function(e) { - return b0(e) || (Pc(s), e && e.response && (e.response.data = Cc.call( + return v0(e) || (Pc(s), e && e.response && (e.response.data = Cc.call( s, s.transformResponse, e.response ), e.response.headers = Mn.from(e.response.headers))), Promise.reject(e); }); } -const E0 = "1.13.2", kl = {}; +const S0 = "1.13.2", kl = {}; ["object", "boolean", "number", "function", "string", "symbol"].forEach((s, e) => { kl[s] = function(t) { return typeof t === s || "a" + (e < 1 ? "n " : " ") + s; }; }); -const rp = {}; +const sp = {}; kl.transitional = function(s, e, t) { function n(i, r) { - return "[Axios v" + E0 + "] Transitional option '" + i + "'" + r + (t ? ". " + t : ""); + return "[Axios v" + S0 + "] Transitional option '" + i + "'" + r + (t ? ". " + t : ""); } return (i, r, o) => { if (s === !1) @@ -35437,7 +35465,7 @@ kl.transitional = function(s, e, t) { n(r, " has been removed" + (e ? " in " + e : "")), Je.ERR_DEPRECATED ); - return e && !rp[r] && (rp[r] = !0, console.warn( + return e && !sp[r] && (sp[r] = !0, console.warn( n( r, " has been deprecated since v" + e + " and will be removed in the near future" @@ -35448,7 +35476,7 @@ kl.transitional = function(s, e, t) { kl.spelling = function(s) { return (e, t) => (console.warn(`${t} is likely a misspelling of ${s}`), !0); }; -function K3(s, e, t) { +function Y3(s, e, t) { if (typeof s != "object") throw new Je("options must be an object", Je.ERR_BAD_OPTION_VALUE); const n = Object.keys(s); @@ -35466,14 +35494,14 @@ function K3(s, e, t) { } } const cl = { - assertOptions: K3, + assertOptions: Y3, validators: kl }, ii = cl.validators; let ys = class { constructor(s) { this.defaults = s || {}, this.interceptors = { - request: new qf(), - response: new qf() + request: new jf(), + response: new jf() }; } /** @@ -35538,7 +35566,7 @@ let ys = class { }); let c, h = 0, u; if (!a) { - const f = [sp.bind(this), void 0]; + const f = [ip.bind(this), void 0]; for (f.unshift(...o), f.push(...l), u = f.length, c = Promise.resolve(e); h < u; ) c = c.then(f[h++], f[h++]); return c; @@ -35555,7 +35583,7 @@ let ys = class { } } try { - c = sp.call(this, d); + c = ip.call(this, d); } catch (f) { return Promise.reject(f); } @@ -35565,8 +35593,8 @@ let ys = class { } getUri(s) { s = Ts(this.defaults, s); - const e = _0(s.baseURL, s.url, s.allowAbsoluteUrls); - return g0(e, s.params, s.paramsSerializer); + const e = y0(s.baseURL, s.url, s.allowAbsoluteUrls); + return m0(e, s.params, s.paramsSerializer); } }; se.forEach(["delete", "get", "head", "options"], function(s) { @@ -35593,7 +35621,7 @@ se.forEach(["post", "put", "patch"], function(s) { } ys.prototype[s] = e(), ys.prototype[s + "Form"] = e(!0); }); -let $3 = class T0 { +let K3 = class E0 { constructor(e) { if (typeof e != "function") throw new TypeError("executor must be a function."); @@ -35659,22 +35687,22 @@ let $3 = class T0 { static source() { let e; return { - token: new T0(function(t) { + token: new E0(function(t) { e = t; }), cancel: e }; } }; -function J3(s) { +function $3(s) { return function(e) { return s.apply(null, e); }; } -function Q3(s) { +function J3(s) { return se.isObject(s) && s.isAxiosError === !0; } -const ru = { +const su = { Continue: 100, SwitchingProtocols: 101, Processing: 102, @@ -35745,54 +35773,54 @@ const ru = { SslHandshakeFailed: 525, InvalidSslCertificate: 526 }; -Object.entries(ru).forEach(([s, e]) => { - ru[e] = s; +Object.entries(su).forEach(([s, e]) => { + su[e] = s; }); -function A0(s) { - const e = new ys(s), t = s0(ys.prototype.request, e); +function T0(s) { + const e = new ys(s), t = i0(ys.prototype.request, e); return se.extend(t, ys.prototype, e, { allOwnKeys: !0 }), se.extend(t, e, null, { allOwnKeys: !0 }), t.create = function(n) { - return A0(Ts(s, n)); + return T0(Ts(s, n)); }, t; } -const Nt = A0(Ho); +const Nt = T0(Ho); Nt.Axios = ys; Nt.CanceledError = Ur; -Nt.CancelToken = $3; -Nt.isCancel = b0; -Nt.VERSION = E0; +Nt.CancelToken = K3; +Nt.isCancel = v0; +Nt.VERSION = S0; Nt.toFormData = Nl; Nt.AxiosError = Je; Nt.Cancel = Nt.CanceledError; Nt.all = function(s) { return Promise.all(s); }; -Nt.spread = J3; -Nt.isAxiosError = Q3; +Nt.spread = $3; +Nt.isAxiosError = J3; Nt.mergeConfig = Ts; Nt.AxiosHeaders = Mn; -Nt.formToJSON = (s) => v0(se.isHTMLForm(s) ? new FormData(s) : s); -Nt.getAdapter = S0.getAdapter; -Nt.HttpStatusCode = ru; +Nt.formToJSON = (s) => x0(se.isHTMLForm(s) ? new FormData(s) : s); +Nt.getAdapter = w0.getAdapter; +Nt.HttpStatusCode = su; Nt.default = Nt; const { - Axios: AA, - AxiosError: CA, - CanceledError: PA, - isCancel: RA, - CancelToken: LA, - VERSION: DA, - all: IA, - Cancel: BA, - isAxiosError: NA, - spread: kA, - toFormData: UA, - AxiosHeaders: OA, - HttpStatusCode: FA, - formToJSON: zA, - getAdapter: HA, - mergeConfig: VA + Axios: MA, + AxiosError: wA, + CanceledError: SA, + isCancel: EA, + CancelToken: TA, + VERSION: AA, + all: CA, + Cancel: PA, + isAxiosError: RA, + spread: LA, + toFormData: DA, + AxiosHeaders: IA, + HttpStatusCode: BA, + formToJSON: NA, + getAdapter: kA, + mergeConfig: UA } = Nt; -function ew(s, e) { +function Q3(s, e) { var t; if (window.XMLHttpRequest ? t = new XMLHttpRequest() : window.ActiveXObject ? t = new window.ActiveXObject() : alert("请升级至最新版本的浏览器"), t != null) { let n = s; @@ -35803,7 +35831,7 @@ function ew(s, e) { }; } } -function tw(s, e) { +function ew(s, e) { Nt({ method: "get", responseType: "blob", @@ -35812,7 +35840,7 @@ function tw(s, e) { let n = new window.File([t.data], "zipFolder", { type: "zip" }); - i0.loadAsync(n).then((i) => { + n0.loadAsync(n).then((i) => { const r = /* @__PURE__ */ new Map(), o = []; for (let a in i.files) { if (i.files[a].dir) @@ -35838,7 +35866,7 @@ function tw(s, e) { console.error("下载zip文件失败:", t), e(/* @__PURE__ */ new Map()); }); } -function C0(s, e) { +function A0(s, e) { Nt({ method: "get", responseType: "blob", @@ -35847,7 +35875,7 @@ function C0(s, e) { let i = new window.File([n.data], "semantics", { type: "zip" }); - i0.loadAsync(i).then((r) => { + n0.loadAsync(i).then((r) => { for (let o in r.files) r.file(r.files[o].name).async("blob").then((a) => { t(a, "utf-8", function(l, c) { @@ -35866,7 +35894,7 @@ function C0(s, e) { } } const Rc = /* @__PURE__ */ new WeakMap(); -class nw extends Ps { +class tw extends Ps { /** * Constructs a new Draco loader. * @@ -35981,7 +36009,7 @@ class nw extends Ps { if (o === a) c = new at(r, o); else { - const h = new Bu(r, a); + const h = new Iu(r, a); c = new Er(h, o, 0); } i === "color" && (this._assignVertexColorSpace(c, l), c.normalized = !(r instanceof Float32Array)), t.setAttribute(i, c); @@ -36009,7 +36037,7 @@ class nw extends Ps { return e ? t.push(this._loadLibrary("draco_decoder.js", "text")) : (t.push(this._loadLibrary("draco_wasm_wrapper.js", "text")), t.push(this._loadLibrary("draco_decoder.wasm", "arraybuffer"))), this.decoderPending = Promise.all(t).then((n) => { const i = n[0]; e || (this.decoderConfig.wasmBinary = n[1]); - const r = iw.toString(), o = [ + const r = nw.toString(), o = [ "/* draco decoder */", i, "", @@ -36057,7 +36085,7 @@ class nw extends Ps { return this.workerPool.length = 0, this.workerSourceURL !== "" && URL.revokeObjectURL(this.workerSourceURL), this; } } -function iw() { +function nw() { let s, e; onmessage = function(o) { const a = o.data; @@ -36162,7 +36190,7 @@ function iw() { } } var Dr = /* @__PURE__ */ ((s) => (s.ModelLoadStart = "model-load-start", s.ModelLoadProgress = "model-load-progress", s.ModelLoaded = "model-loaded", s.ModelError = "model-error", s.SelectionChanged = "selection-changed", s.HoverChanged = "hover-changed", s.Click = "click", s.MouseMove = "mouse-move", s.CameraChanged = "camera-changed", s.CameraIdle = "camera-idle", s.ViewportResize = "viewport-resize", s.EngineFree = "engine-free", s.EngineBusy = "engine-busy", s))(Dr || {}); -function sw(s, e, t, n) { +function iw(s, e, t, n) { let i = 0, r = 0, o = 0, a = s.models.find((f) => f.url == t), l = e.circularMeps, c = e.rectMeps.filter((f) => f.type === "风管"), h = e.rectMeps.filter((f) => f.type === "桥架"), u = e.ellipseMeps, d = s.scene; if (new Zt(), new ut(), La(d, "InstancedMesh"), l && l.length) { let f = []; @@ -36305,7 +36333,7 @@ function Da(s, e, t, n, i) { }, r.meshs = u, r.instanceMatrix && r.instanceMatrix.array && (r.cloneInstanceMatrix = Array.from(r.instanceMatrix.array)), r.index = n, r.Version = "V1", e.children[n] = r; } function Ia(s, e, t) { - let n = new Fm(); + let n = new Om(); switch (e.width = e.width * 0.3048, e.height = e.height * 0.3048, e.diameter = e.diameter * 0.3048, s) { case "Rect": n.moveTo(-e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, e.height / 2), n.lineTo(e.width / 2, e.height / 2), n.lineTo(e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, -e.height / 2); @@ -36327,7 +36355,7 @@ function Ia(s, e, t) { }; return r(n, i, e.color, e.position, e.rotation); function r(o, a, l, c, h) { - let u = new zu(o, a), d = new yv({ + let u = new Fu(o, a), d = new bv({ color: l, side: At // depthTest:false @@ -36336,7 +36364,7 @@ function Ia(s, e, t) { return f.position.set(c.x, c.y, c.z), f.rotation._order = "YXZ", f.rotation.set(h.x, h.y, h.z), f; } } -function rw(s, e = !1) { +function sw(s, e = !1) { const t = s[0].index !== null, n = new Set(Object.keys(s[0].attributes)), i = new Set(Object.keys(s[0].morphAttributes)), r = {}, o = {}, a = s[0].morphTargetsRelative, l = new ut(); let c = 0; for (let h = 0; h < s.length; ++h) { @@ -36381,7 +36409,7 @@ function rw(s, e = !1) { l.setIndex(u); } for (const h in r) { - const u = op(r[h]); + const u = rp(r[h]); if (!u) return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the " + h + " attribute."), null; l.setAttribute(h, u); @@ -36394,7 +36422,7 @@ function rw(s, e = !1) { const f = []; for (let g = 0; g < o[h].length; ++g) f.push(o[h][g][d]); - const p = op(f); + const p = rp(f); if (!p) return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the " + h + " morphAttribute."), null; l.morphAttributes[h].push(p); @@ -36402,7 +36430,7 @@ function rw(s, e = !1) { } return l; } -function op(s) { +function rp(s) { let e, t, n, i = -1, r = 0; for (let c = 0; c < s.length; ++c) { const h = s[c]; @@ -36433,10 +36461,10 @@ function op(s) { } return i !== void 0 && (a.gpuType = i), a; } -function ap(s, e) { - if (e === Dg) +function op(s, e) { + if (e === Lg) return console.warn("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles."), s; - if (e === qh || e === vm) { + if (e === jh || e === xm) { let t = s.getIndex(); if (t === null) { const o = [], a = s.getAttribute("position"); @@ -36448,7 +36476,7 @@ function ap(s, e) { return console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible."), s; } const n = t.count - 2, i = []; - if (e === qh) + if (e === jh) for (let o = 1; o <= n; o++) i.push(t.getX(0)), i.push(t.getX(o)), i.push(t.getX(o + 1)); else @@ -36460,7 +36488,7 @@ function ap(s, e) { } else return console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:", e), s; } -class ow extends Ps { +class rw extends Ps { /** * Constructs a new glTF loader. * @@ -36468,39 +36496,39 @@ class ow extends Ps { */ constructor(e) { super(e), this.dracoLoader = null, this.ktx2Loader = null, this.meshoptDecoder = null, this.pluginCallbacks = [], this.register(function(t) { + return new hw(t); + }), this.register(function(t) { return new uw(t); }), this.register(function(t) { - return new dw(t); + return new yw(t); }), this.register(function(t) { return new _w(t); }), this.register(function(t) { return new Mw(t); }), this.register(function(t) { - return new ww(t); + return new fw(t); }), this.register(function(t) { return new pw(t); }), this.register(function(t) { return new mw(t); }), this.register(function(t) { return new gw(t); + }), this.register(function(t) { + return new cw(t); }), this.register(function(t) { return new xw(t); }), this.register(function(t) { - return new hw(t); - }), this.register(function(t) { - return new vw(t); - }), this.register(function(t) { - return new fw(t); - }), this.register(function(t) { - return new yw(t); + return new dw(t); }), this.register(function(t) { return new bw(t); }), this.register(function(t) { - return new lw(t); + return new vw(t); + }), this.register(function(t) { + return new aw(t); + }), this.register(function(t) { + return new ww(t); }), this.register(function(t) { return new Sw(t); - }), this.register(function(t) { - return new Ew(t); }); } /** @@ -36600,9 +36628,9 @@ class ow extends Ps { if (typeof e == "string") r = JSON.parse(e); else if (e instanceof ArrayBuffer) - if (l.decode(new Uint8Array(e, 0, 4)) === P0) { + if (l.decode(new Uint8Array(e, 0, 4)) === C0) { try { - o[nt.KHR_BINARY_GLTF] = new Tw(e); + o[nt.KHR_BINARY_GLTF] = new Ew(e); } catch (h) { i && i(h); return; @@ -36616,7 +36644,7 @@ class ow extends Ps { i && i(new Error("THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.")); return; } - const c = new Fw(r, { + const c = new Ow(r, { path: t || this.resourcePath || "", crossOrigin: this.crossOrigin, requestHeader: this.requestHeader, @@ -36634,16 +36662,16 @@ class ow extends Ps { const u = r.extensionsUsed[h], d = r.extensionsRequired || []; switch (u) { case nt.KHR_MATERIALS_UNLIT: - o[u] = new cw(); + o[u] = new lw(); break; case nt.KHR_DRACO_MESH_COMPRESSION: - o[u] = new Aw(r, this.dracoLoader); + o[u] = new Tw(r, this.dracoLoader); break; case nt.KHR_TEXTURE_TRANSFORM: - o[u] = new Cw(); + o[u] = new Aw(); break; case nt.KHR_MESH_QUANTIZATION: - o[u] = new Pw(); + o[u] = new Cw(); break; default: d.indexOf(u) >= 0 && a[u] === void 0 && console.warn('THREE.GLTFLoader: Unknown extension "' + u + '".'); @@ -36666,7 +36694,7 @@ class ow extends Ps { }); } } -function aw() { +function ow() { let s = {}; return { get: function(e) { @@ -36707,7 +36735,7 @@ const nt = { EXT_MESHOPT_COMPRESSION: "EXT_meshopt_compression", EXT_MESH_GPU_INSTANCING: "EXT_mesh_gpu_instancing" }; -class lw { +class aw { constructor(e) { this.parser = e, this.name = nt.KHR_LIGHTS_PUNCTUAL, this.cache = { refs: {}, uses: {} }; } @@ -36732,10 +36760,10 @@ class lw { a = new ur(l), a.target.position.set(0, 0, -1), a.add(a.target); break; case "point": - a = new zv(l), a.distance = c; + a = new Fv(l), a.distance = c; break; case "spot": - a = new Ov(l), a.distance = c, o.spot = o.spot || {}, o.spot.innerConeAngle = o.spot.innerConeAngle !== void 0 ? o.spot.innerConeAngle : 0, o.spot.outerConeAngle = o.spot.outerConeAngle !== void 0 ? o.spot.outerConeAngle : Math.PI / 4, a.angle = o.spot.outerConeAngle, a.penumbra = 1 - o.spot.innerConeAngle / o.spot.outerConeAngle, a.target.position.set(0, 0, -1), a.add(a.target); + a = new Uv(l), a.distance = c, o.spot = o.spot || {}, o.spot.innerConeAngle = o.spot.innerConeAngle !== void 0 ? o.spot.innerConeAngle : 0, o.spot.outerConeAngle = o.spot.outerConeAngle !== void 0 ? o.spot.outerConeAngle : Math.PI / 4, a.angle = o.spot.outerConeAngle, a.penumbra = 1 - o.spot.innerConeAngle / o.spot.outerConeAngle, a.target.position.set(0, 0, -1), a.add(a.target); break; default: throw new Error("THREE.GLTFLoader: Unexpected light type: " + o.type); @@ -36753,7 +36781,7 @@ class lw { }); } } -class cw { +class lw { constructor() { this.name = nt.KHR_MATERIALS_UNLIT; } @@ -36774,7 +36802,7 @@ class cw { return Promise.all(i); } } -class hw { +class cw { constructor(e) { this.parser = e, this.name = nt.KHR_MATERIALS_EMISSIVE_STRENGTH; } @@ -36786,7 +36814,7 @@ class hw { return i !== void 0 && (t.emissiveIntensity = i), Promise.resolve(); } } -class uw { +class hw { constructor(e) { this.parser = e, this.name = nt.KHR_MATERIALS_CLEARCOAT; } @@ -36806,7 +36834,7 @@ class uw { return Promise.all(r); } } -class dw { +class uw { constructor(e) { this.parser = e, this.name = nt.KHR_MATERIALS_DISPERSION; } @@ -36822,7 +36850,7 @@ class dw { return t.dispersion = i.dispersion !== void 0 ? i.dispersion : 0, Promise.resolve(); } } -class fw { +class dw { constructor(e) { this.parser = e, this.name = nt.KHR_MATERIALS_IRIDESCENCE; } @@ -36838,7 +36866,7 @@ class fw { return o.iridescenceFactor !== void 0 && (t.iridescence = o.iridescenceFactor), o.iridescenceTexture !== void 0 && r.push(n.assignTexture(t, "iridescenceMap", o.iridescenceTexture)), o.iridescenceIor !== void 0 && (t.iridescenceIOR = o.iridescenceIor), t.iridescenceThicknessRange === void 0 && (t.iridescenceThicknessRange = [100, 400]), o.iridescenceThicknessMinimum !== void 0 && (t.iridescenceThicknessRange[0] = o.iridescenceThicknessMinimum), o.iridescenceThicknessMaximum !== void 0 && (t.iridescenceThicknessRange[1] = o.iridescenceThicknessMaximum), o.iridescenceThicknessTexture !== void 0 && r.push(n.assignTexture(t, "iridescenceThicknessMap", o.iridescenceThicknessTexture)), Promise.all(r); } } -class pw { +class fw { constructor(e) { this.parser = e, this.name = nt.KHR_MATERIALS_SHEEN; } @@ -36860,7 +36888,7 @@ class pw { return o.sheenRoughnessFactor !== void 0 && (t.sheenRoughness = o.sheenRoughnessFactor), o.sheenColorTexture !== void 0 && r.push(n.assignTexture(t, "sheenColorMap", o.sheenColorTexture, xt)), o.sheenRoughnessTexture !== void 0 && r.push(n.assignTexture(t, "sheenRoughnessMap", o.sheenRoughnessTexture)), Promise.all(r); } } -class mw { +class pw { constructor(e) { this.parser = e, this.name = nt.KHR_MATERIALS_TRANSMISSION; } @@ -36876,7 +36904,7 @@ class mw { return o.transmissionFactor !== void 0 && (t.transmission = o.transmissionFactor), o.transmissionTexture !== void 0 && r.push(n.assignTexture(t, "transmissionMap", o.transmissionTexture)), Promise.all(r); } } -class gw { +class mw { constructor(e) { this.parser = e, this.name = nt.KHR_MATERIALS_VOLUME; } @@ -36894,7 +36922,7 @@ class gw { return t.attenuationColor = new Fe().setRGB(a[0], a[1], a[2], Bt), Promise.all(r); } } -class xw { +class gw { constructor(e) { this.parser = e, this.name = nt.KHR_MATERIALS_IOR; } @@ -36910,7 +36938,7 @@ class xw { return t.ior = i.ior !== void 0 ? i.ior : 1.5, Promise.resolve(); } } -class vw { +class xw { constructor(e) { this.parser = e, this.name = nt.KHR_MATERIALS_SPECULAR; } @@ -36928,7 +36956,7 @@ class vw { return t.specularColor = new Fe().setRGB(a[0], a[1], a[2], Bt), o.specularColorTexture !== void 0 && r.push(n.assignTexture(t, "specularColorMap", o.specularColorTexture, xt)), Promise.all(r); } } -class bw { +class vw { constructor(e) { this.parser = e, this.name = nt.EXT_MATERIALS_BUMP; } @@ -36944,7 +36972,7 @@ class bw { return t.bumpScale = o.bumpFactor !== void 0 ? o.bumpFactor : 1, o.bumpTexture !== void 0 && r.push(n.assignTexture(t, "bumpMap", o.bumpTexture)), Promise.all(r); } } -class yw { +class bw { constructor(e) { this.parser = e, this.name = nt.KHR_MATERIALS_ANISOTROPY; } @@ -36960,7 +36988,7 @@ class yw { return o.anisotropyStrength !== void 0 && (t.anisotropy = o.anisotropyStrength), o.anisotropyRotation !== void 0 && (t.anisotropyRotation = o.anisotropyRotation), o.anisotropyTexture !== void 0 && r.push(n.assignTexture(t, "anisotropyMap", o.anisotropyTexture)), Promise.all(r); } } -class _w { +class yw { constructor(e) { this.parser = e, this.name = nt.KHR_TEXTURE_BASISU; } @@ -36977,7 +37005,7 @@ class _w { return t.loadTextureImage(e, r.source, o); } } -class Mw { +class _w { constructor(e) { this.parser = e, this.name = nt.EXT_TEXTURE_WEBP; } @@ -36994,7 +37022,7 @@ class Mw { return n.loadTextureImage(e, o.source, l); } } -class ww { +class Mw { constructor(e) { this.parser = e, this.name = nt.EXT_TEXTURE_AVIF; } @@ -37011,7 +37039,7 @@ class ww { return n.loadTextureImage(e, o.source, l); } } -class Sw { +class ww { constructor(e) { this.name = nt.EXT_MESHOPT_COMPRESSION, this.parser = e; } @@ -37037,7 +37065,7 @@ class Sw { return null; } } -class Ew { +class Sw { constructor(e) { this.name = nt.EXT_MESH_GPU_INSTANCING, this.parser = e; } @@ -37061,7 +37089,7 @@ class Ew { for (const v in a) if (v === "_COLOR_0") { const y = a[v]; - b.instanceColor = new Yh(y.array, y.itemSize, y.normalized); + b.instanceColor = new Zh(y.array, y.itemSize, y.normalized); } else v !== "TRANSLATION" && v !== "ROTATION" && v !== "SCALE" && f.geometry.setAttribute(v, a[v]); St.prototype.copy.call(b, f), this.parser.assignFinalMaterial(b), d.push(b); } @@ -37069,8 +37097,8 @@ class Ew { })); } } -const P0 = "glTF", Qr = 12, lp = { JSON: 1313821514, BIN: 5130562 }; -class Tw { +const C0 = "glTF", Qr = 12, ap = { JSON: 1313821514, BIN: 5130562 }; +class Ew { constructor(e) { this.name = nt.KHR_BINARY_GLTF, this.content = null, this.body = null; const t = new DataView(e, 0, Qr), n = new TextDecoder(); @@ -37078,7 +37106,7 @@ class Tw { magic: n.decode(new Uint8Array(e.slice(0, 4))), version: t.getUint32(4, !0), length: t.getUint32(8, !0) - }, this.header.magic !== P0) + }, this.header.magic !== C0) throw new Error("THREE.GLTFLoader: Unsupported glTF-Binary header."); if (this.header.version < 2) throw new Error("THREE.GLTFLoader: Legacy binary file detected."); @@ -37088,10 +37116,10 @@ class Tw { const a = r.getUint32(o, !0); o += 4; const l = r.getUint32(o, !0); - if (o += 4, l === lp.JSON) { + if (o += 4, l === ap.JSON) { const c = new Uint8Array(e, Qr + o, a); this.content = n.decode(c); - } else if (l === lp.BIN) { + } else if (l === ap.BIN) { const c = Qr + o; this.body = e.slice(c, c + a); } @@ -37101,7 +37129,7 @@ class Tw { throw new Error("THREE.GLTFLoader: JSON content not found."); } } -class Aw { +class Tw { constructor(e, t) { if (!t) throw new Error("THREE.GLTFLoader: No DRACOLoader instance provided."); @@ -37110,11 +37138,11 @@ class Aw { decodePrimitive(e, t) { const n = this.json, i = this.dracoLoader, r = e.extensions[this.name].bufferView, o = e.extensions[this.name].attributes, a = {}, l = {}, c = {}; for (const h in o) { - const u = ou[h] || h.toLowerCase(); + const u = ru[h] || h.toLowerCase(); a[u] = o[h]; } for (const h in e.attributes) { - const u = ou[h] || h.toLowerCase(); + const u = ru[h] || h.toLowerCase(); if (o[h] !== void 0) { const d = n.accessors[e.attributes[h]], f = gr[d.componentType]; c[u] = f.name, l[u] = d.normalized === !0; @@ -37133,7 +37161,7 @@ class Aw { }); } } -class Cw { +class Aw { constructor() { this.name = nt.KHR_TEXTURE_TRANSFORM; } @@ -37141,12 +37169,12 @@ class Cw { return (t.texCoord === void 0 || t.texCoord === e.channel) && t.offset === void 0 && t.rotation === void 0 && t.scale === void 0 || (e = e.clone(), t.texCoord !== void 0 && (e.channel = t.texCoord), t.offset !== void 0 && e.offset.fromArray(t.offset), t.rotation !== void 0 && (e.rotation = t.rotation), t.scale !== void 0 && e.repeat.fromArray(t.scale), e.needsUpdate = !0), e; } } -class Pw { +class Cw { constructor() { this.name = nt.KHR_MESH_QUANTIZATION; } } -class R0 extends Uo { +class P0 extends Uo { constructor(e, t, n, i) { super(e, t, n, i); } @@ -37165,11 +37193,11 @@ class R0 extends Uo { return r; } } -const Rw = new zn(); -class Lw extends R0 { +const Pw = new zn(); +class Rw extends P0 { interpolate_(e, t, n, i) { const r = super.interpolate_(e, t, n, i); - return Rw.fromArray(r).normalize().toArray(r), r; + return Pw.fromArray(r).normalize().toArray(r), r; } } const In = { @@ -37187,14 +37215,14 @@ const In = { 5123: Uint16Array, 5125: Uint32Array, 5126: Float32Array -}, cp = { +}, lp = { 9728: Qt, 9729: Yt, - 9984: um, + 9984: hm, 9985: el, 9986: co, 9987: Ai -}, hp = { +}, cp = { 33071: ai, 33648: pl, 10497: hi @@ -37206,7 +37234,7 @@ const In = { MAT2: 4, MAT3: 9, MAT4: 16 -}, ou = { +}, ru = { POSITION: "position", NORMAL: "normal", TANGENT: "tangent", @@ -37222,7 +37250,7 @@ const In = { translation: "position", rotation: "quaternion", weights: "morphTargetInfluences" -}, Dw = { +}, Lw = { CUBICSPLINE: void 0, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each // keyframe track will be initialized with a default interpolation type, then modified. @@ -37233,7 +37261,7 @@ const In = { MASK: "MASK", BLEND: "BLEND" }; -function Iw(s) { +function Dw(s) { return s.DefaultMaterial === void 0 && (s.DefaultMaterial = new Ss({ color: 16777215, emissive: 0, @@ -37251,7 +37279,7 @@ function cs(s, e, t) { function si(s, e) { e.extras !== void 0 && (typeof e.extras == "object" ? Object.assign(s.userData, e.extras) : console.warn("THREE.GLTFLoader: Ignoring primitive type .extras, " + e.extras)); } -function Bw(s, e, t) { +function Iw(s, e, t) { let n = !1, i = !1, r = !1; for (let c = 0, h = e.length; c < h; c++) { const u = e[c]; @@ -37283,7 +37311,7 @@ function Bw(s, e, t) { return n && (s.morphAttributes.position = h), i && (s.morphAttributes.normal = u), r && (s.morphAttributes.color = d), s.morphTargetsRelative = !0, s; }); } -function Nw(s, e) { +function Bw(s, e) { if (s.updateMorphTargets(), e.weights !== void 0) for (let t = 0, n = e.weights.length; t < n; t++) s.morphTargetInfluences[t] = e.weights[t]; @@ -37297,7 +37325,7 @@ function Nw(s, e) { console.warn("THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names."); } } -function kw(s) { +function Nw(s) { let e; const t = s.extensions && s.extensions[nt.KHR_DRACO_MESH_COMPRESSION]; if (t ? e = "draco:" + t.bufferView + ":" + t.indices + ":" + Ic(t.attributes) : e = s.indices + ":" + Ic(s.attributes) + ":" + s.mode, s.targets !== void 0) @@ -37312,7 +37340,7 @@ function Ic(s) { e += t[n] + ":" + s[t[n]] + ";"; return e; } -function au(s) { +function ou(s) { switch (s) { case Int8Array: return 1 / 127; @@ -37326,13 +37354,13 @@ function au(s) { throw new Error("THREE.GLTFLoader: Unsupported normalized accessor component type."); } } -function Uw(s) { +function kw(s) { return s.search(/\.jpe?g($|\?)/i) > 0 || s.search(/^data\:image\/jpeg/) === 0 ? "image/jpeg" : s.search(/\.webp($|\?)/i) > 0 || s.search(/^data\:image\/webp/) === 0 ? "image/webp" : s.search(/\.ktx2($|\?)/i) > 0 || s.search(/^data\:image\/ktx2/) === 0 ? "image/ktx2" : "image/png"; } -const Ow = new ze(); -class Fw { +const Uw = new ze(); +class Ow { constructor(e = {}, t = {}) { - this.json = e, this.extensions = {}, this.plugins = {}, this.options = t, this.cache = new aw(), this.associations = /* @__PURE__ */ new Map(), this.primitiveCache = {}, this.nodeCache = {}, this.meshCache = { refs: {}, uses: {} }, this.cameraCache = { refs: {}, uses: {} }, this.lightCache = { refs: {}, uses: {} }, this.sourceCache = {}, this.textureCache = {}, this.nodeNamesUsed = {}; + this.json = e, this.extensions = {}, this.plugins = {}, this.options = t, this.cache = new ow(), this.associations = /* @__PURE__ */ new Map(), this.primitiveCache = {}, this.nodeCache = {}, this.meshCache = { refs: {}, uses: {} }, this.cameraCache = { refs: {}, uses: {} }, this.lightCache = { refs: {}, uses: {} }, this.sourceCache = {}, this.textureCache = {}, this.nodeNamesUsed = {}; let n = !1, i = -1, r = !1, o = -1; if (typeof navigator < "u") { const a = navigator.userAgent; @@ -37340,7 +37368,7 @@ class Fw { const l = a.match(/Version\/(\d+)/); i = n && l ? parseInt(l[1], 10) : -1, r = a.indexOf("Firefox") > -1, o = r ? a.match(/Firefox\/([0-9]+)\./)[1] : -1; } - typeof createImageBitmap > "u" || n && i < 17 || r && o < 98 ? this.textureLoader = new qm(this.options.manager) : this.textureLoader = new Vv(this.options.manager), this.textureLoader.setCrossOrigin(this.options.crossOrigin), this.textureLoader.setRequestHeader(this.options.requestHeader), this.fileLoader = new yl(this.options.manager), this.fileLoader.setResponseType("arraybuffer"), this.options.crossOrigin === "use-credentials" && this.fileLoader.setWithCredentials(!0); + typeof createImageBitmap > "u" || n && i < 17 || r && o < 98 ? this.textureLoader = new jm(this.options.manager) : this.textureLoader = new Hv(this.options.manager), this.textureLoader.setCrossOrigin(this.options.crossOrigin), this.textureLoader.setRequestHeader(this.options.requestHeader), this.fileLoader = new yl(this.options.manager), this.fileLoader.setResponseType("arraybuffer"), this.options.crossOrigin === "use-credentials" && this.fileLoader.setWithCredentials(!0); } setExtensions(e) { this.extensions = e; @@ -37590,7 +37618,7 @@ class Fw { if (f && f !== u) { const m = Math.floor(d / f), b = "InterleavedBuffer:" + i.bufferView + ":" + i.componentType + ":" + m + ":" + i.count; let v = t.cache.get(b); - v || (g = new c(a, m * f, i.count * f / h), v = new Bu(g, f / h), t.cache.add(b, v)), x = new Er(v, l, d % f / h, p); + v || (g = new c(a, m * f, i.count * f / h), v = new Iu(g, f / h), t.cache.add(b, v)), x = new Er(v, l, d % f / h, p); } else a === null ? g = new c(i.count * l) : g = new c(a, d, i.count * l), x = new at(g, l, p); if (i.sparse !== void 0) { @@ -37628,7 +37656,7 @@ class Fw { const c = this.loadImageSource(t, n).then(function(h) { h.flipY = !1, h.name = o.name || a.name || "", h.name === "" && typeof a.uri == "string" && a.uri.startsWith("data:image/") === !1 && (h.name = a.uri); const u = (r.samplers || {})[o.sampler] || {}; - return h.magFilter = cp[u.magFilter] || Yt, h.minFilter = cp[u.minFilter] || Ai, h.wrapS = hp[u.wrapS] || hi, h.wrapT = hp[u.wrapT] || hi, h.generateMipmaps = !h.isCompressedTexture && h.minFilter !== Qt && h.minFilter !== Yt, i.associations.set(h, { textures: e }), h; + return h.magFilter = lp[u.magFilter] || Yt, h.minFilter = lp[u.minFilter] || Ai, h.wrapS = cp[u.wrapS] || hi, h.wrapT = cp[u.wrapT] || hi, h.generateMipmaps = !h.isCompressedTexture && h.minFilter !== Qt && h.minFilter !== Yt, i.associations.set(h, { textures: e }), h; }).catch(function() { return null; }); @@ -37657,7 +37685,7 @@ class Fw { }), t.load(bo.resolveURL(u, r.path), p, void 0, f); }); }).then(function(u) { - return c === !0 && a.revokeObjectURL(l), si(u, o), u.userData.mimeType = o.mimeType || Uw(o.uri), u; + return c === !0 && a.revokeObjectURL(l), si(u, o), u.userData.mimeType = o.mimeType || kw(o.uri), u; }).catch(function(u) { throw console.error("THREE.GLTFLoader: Couldn't load texture", l), u; }); @@ -37704,7 +37732,7 @@ class Fw { if (e.isPoints) { const a = "PointsMaterial:" + n.uuid; let l = this.cache.get(a); - l || (l = new Dm(), yn.prototype.copy.call(l, n), l.color.copy(n.color), l.map = n.map, l.sizeAttenuation = !1, this.cache.add(a, l)), n = l; + l || (l = new Lm(), yn.prototype.copy.call(l, n), l.color.copy(n.color), l.map = n.map, l.sizeAttenuation = !1, this.cache.add(a, l)), n = l; } else if (e.isLine) { const a = "LineBasicMaterial:" + n.uuid; let l = this.cache.get(a); @@ -37786,17 +37814,17 @@ class Fw { const t = this, n = this.extensions, i = this.primitiveCache; function r(a) { return n[nt.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(a, t).then(function(l) { - return up(l, a, t); + return hp(l, a, t); }); } const o = []; for (let a = 0, l = e.length; a < l; a++) { - const c = e[a], h = kw(c), u = i[h]; + const c = e[a], h = Nw(c), u = i[h]; if (u) o.push(u.promise); else { let d; - c.extensions && c.extensions[nt.KHR_DRACO_MESH_COMPRESSION] ? d = r(c) : d = up(new ut(), c, t), i[h] = { primitive: c, promise: d }, o.push(d); + c.extensions && c.extensions[nt.KHR_DRACO_MESH_COMPRESSION] ? d = r(c) : d = hp(new ut(), c, t), i[h] = { primitive: c, promise: d }, o.push(d); } } return Promise.all(o); @@ -37811,7 +37839,7 @@ class Fw { loadMesh(e) { const t = this, n = this.json, i = this.extensions, r = n.meshes[e], o = r.primitives, a = []; for (let l = 0, c = o.length; l < c; l++) { - const h = o[l].material === void 0 ? Iw(this.cache) : this.getDependency("material", o[l].material); + const h = o[l].material === void 0 ? Dw(this.cache) : this.getDependency("material", o[l].material); a.push(h); } return a.push(t.loadGeometries(o)), Promise.all(a).then(function(l) { @@ -37821,18 +37849,18 @@ class Fw { let m; const b = c[f]; if (x.mode === In.TRIANGLES || x.mode === In.TRIANGLE_STRIP || x.mode === In.TRIANGLE_FAN || x.mode === void 0) - m = r.isSkinnedMesh === !0 ? new Ix(g, b) : new dt(g, b), m.isSkinnedMesh === !0 && m.normalizeSkinWeights(), x.mode === In.TRIANGLE_STRIP ? m.geometry = ap(m.geometry, vm) : x.mode === In.TRIANGLE_FAN && (m.geometry = ap(m.geometry, qh)); + m = r.isSkinnedMesh === !0 ? new Dx(g, b) : new dt(g, b), m.isSkinnedMesh === !0 && m.normalizeSkinWeights(), x.mode === In.TRIANGLE_STRIP ? m.geometry = op(m.geometry, xm) : x.mode === In.TRIANGLE_FAN && (m.geometry = op(m.geometry, jh)); else if (x.mode === In.LINES) - m = new Lm(g, b); + m = new Rm(g, b); else if (x.mode === In.LINE_STRIP) m = new es(g, b); else if (x.mode === In.LINE_LOOP) - m = new Fx(g, b); + m = new Ox(g, b); else if (x.mode === In.POINTS) - m = new Im(g, b); + m = new Dm(g, b); else throw new Error("THREE.GLTFLoader: Primitive mode unsupported: " + x.mode); - Object.keys(m.geometry.morphAttributes).length > 0 && Nw(m, r), m.name = t.createUniqueName(r.name || "mesh_" + e), si(m, r), x.extensions && cs(i, m, x), t.assignFinalMaterial(m), u.push(m); + Object.keys(m.geometry.morphAttributes).length > 0 && Bw(m, r), m.name = t.createUniqueName(r.name || "mesh_" + e), si(m, r), x.extensions && cs(i, m, x), t.assignFinalMaterial(m), u.push(m); } for (let f = 0, p = u.length; f < p; f++) t.associations.set(u[f], { @@ -37886,7 +37914,7 @@ class Fw { } else console.warn('THREE.GLTFLoader: Joint "%s" could not be found.', t.joints[c]); } - return new Nu(a, l); + return new Bu(a, l); }); } /** @@ -37919,7 +37947,7 @@ class Fw { for (let D = 0; D < S.length; D++) m.push(S[D]); } - const b = new Rv(r, void 0, m); + const b = new Pv(r, void 0, m); return si(b, i), b; }); } @@ -37953,7 +37981,7 @@ class Fw { ]).then(function(c) { const h = c[0], u = c[1], d = c[2]; d !== null && h.traverse(function(f) { - f.isSkinnedMesh && f.bind(d, Ow); + f.isSkinnedMesh && f.bind(d, Uw); }); for (let f = 0, p = u.length; f < p; f++) h.add(u[f]); @@ -37977,7 +38005,7 @@ class Fw { a.push(c); }), this.nodeCache[e] = Promise.all(a).then(function(c) { let h; - if (r.isBone === !0 ? h = new Rm() : c.length > 1 ? h = new vn() : c.length === 1 ? h = c[0] : h = new St(), h !== c[0]) + if (r.isBone === !0 ? h = new Pm() : c.length > 1 ? h = new vn() : c.length === 1 ? h = c[0] : h = new St(), h !== c[0]) for (let u = 0, d = c.length; u < d; u++) h.add(c[u]); if (r.name && (h.userData.name = r.name, h.name = o), si(h, r), r.extensions && cs(n, h, r), r.matrix !== void 0) { @@ -38052,7 +38080,7 @@ class Fw { } break; } - const h = i.interpolation !== void 0 ? Dw[i.interpolation] : To, u = this._getArrayFromAccessor(n); + const h = i.interpolation !== void 0 ? Lw[i.interpolation] : To, u = this._getArrayFromAccessor(n); for (let d = 0, f = l.length; d < f; d++) { const p = new c( l[d] + "." + Hi[r.path], @@ -38067,7 +38095,7 @@ class Fw { _getArrayFromAccessor(e) { let t = e.array; if (e.normalized) { - const n = au(t.constructor), i = new Float32Array(t.length); + const n = ou(t.constructor), i = new Float32Array(t.length); for (let r = 0, o = t.length; r < o; r++) i[r] = t[r] * n; t = i; @@ -38076,12 +38104,12 @@ class Fw { } _createCubicSplineTrackInterpolant(e) { e.createInterpolant = function(t) { - const n = this instanceof Cr ? Lw : R0; + const n = this instanceof Cr ? Rw : P0; return new n(this.times, this.values, this.getValueSize() / 3, t); }, e.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = !0; } } -function zw(s, e, t) { +function Fw(s, e, t) { const n = e.attributes, i = new vt(); if (n.POSITION !== void 0) { const a = t.json.accessors[n.POSITION], l = a.min, c = a.max; @@ -38090,7 +38118,7 @@ function zw(s, e, t) { new P(l[0], l[1], l[2]), new P(c[0], c[1], c[2]) ), a.normalized) { - const h = au(gr[a.componentType]); + const h = ou(gr[a.componentType]); i.min.multiplyScalar(h), i.max.multiplyScalar(h); } } else { @@ -38108,7 +38136,7 @@ function zw(s, e, t) { const d = t.json.accessors[u.POSITION], f = d.min, p = d.max; if (f !== void 0 && p !== void 0) { if (l.setX(Math.max(Math.abs(f[0]), Math.abs(p[0]))), l.setY(Math.max(Math.abs(f[1]), Math.abs(p[1]))), l.setZ(Math.max(Math.abs(f[2]), Math.abs(p[2]))), d.normalized) { - const g = au(gr[d.componentType]); + const g = ou(gr[d.componentType]); l.multiplyScalar(g); } a.max(l); @@ -38122,7 +38150,7 @@ function zw(s, e, t) { const o = new di(); i.getCenter(o.center), o.radius = i.min.distanceTo(i.max) / 2, s.boundingSphere = o; } -function up(s, e, t) { +function hp(s, e, t) { const n = e.attributes, i = []; function r(o, a) { return t.getDependency("accessor", o).then(function(l) { @@ -38130,7 +38158,7 @@ function up(s, e, t) { }); } for (const o in n) { - const a = ou[o] || o.toLowerCase(); + const a = ru[o] || o.toLowerCase(); a in s.attributes || i.push(r(n[o], a)); } if (e.indices !== void 0 && !s.index) { @@ -38139,13 +38167,13 @@ function up(s, e, t) { }); i.push(o); } - return st.workingColorSpace !== Bt && "COLOR_0" in n && console.warn(`THREE.GLTFLoader: Converting vertex colors from "srgb-linear" to "${st.workingColorSpace}" not supported.`), si(s, e), zw(s, e, t), Promise.all(i).then(function() { - return e.targets !== void 0 ? Bw(s, e.targets, t) : s; + return st.workingColorSpace !== Bt && "COLOR_0" in n && console.warn(`THREE.GLTFLoader: Converting vertex colors from "srgb-linear" to "${st.workingColorSpace}" not supported.`), si(s, e), Fw(s, e, t), Promise.all(i).then(function() { + return e.targets !== void 0 ? Iw(s, e.targets, t) : s; }); } -function Hw(s, e, t) { +function zw(s, e, t) { let n = new vn(); - n.name = e, s.scene.add(n), C0(e + "/info", (i) => { + n.name = e, s.scene.add(n), A0(e + "/info", (i) => { let r = JSON.parse(i); s.engineStatus.models.push({ type: "light", @@ -38164,23 +38192,23 @@ function Hw(s, e, t) { }), s.events.trigger(Dr.EngineFree, null); }); } -function Vw(s) { +function Hw(s) { s.engineStatus.models.forEach((e) => { e.loadStatus == null && (e.loadStatus = { mep: !1, instance: !1, normal: !1 - }), e.status === "loading" && e.type === "light" && (e.loadStatus.modelMep != !0 && (e.loadStatus.modelMep = !0, sw(s, e.info.modelMep, e.url)), e.loadStatus.normal != !0 && Gw(s, e)); + }), e.status === "loading" && e.type === "light" && (e.loadStatus.modelMep != !0 && (e.loadStatus.modelMep = !0, iw(s, e.info.modelMep, e.url)), e.loadStatus.normal != !0 && Vw(s, e)); }); } -function Gw(s, e) { +function Vw(s, e) { if (s.camera.position, e.size, e.info == null || e.info.lods == null) return; e.info.lods.forEach((n) => { if (n.status != !0) if (n.glbs == null) - console.log("加载GLB............."), n.glbs = {}, tw(e.url + n.path, (i) => { - ew(i.get("/nodes.json"), (r) => { + console.log("加载GLB............."), n.glbs = {}, ew(e.url + n.path, (i) => { + Q3(i.get("/nodes.json"), (r) => { let o = JSON.parse(r), a = /* @__PURE__ */ new Map(); s.models.find((c) => c.url == e.url).nodesMap = a; let l = 0; @@ -38188,8 +38216,8 @@ function Gw(s, e) { o[c].forEach((d) => { d.glb = c, a.has(d.id) == !1 ? a.set(d.id, { infos: [d] }) : a.get(d.id).infos.push(d); }); - let h = new ow(); - const u = new nw(); + let h = new rw(); + const u = new tw(); u.setDecoderPath("/static/js/draco/"), u.preload(), h.setDRACOLoader(u), h.load(i.get(c + ".glb"), (d) => { n.glbs[c] = d.scene.children, l++, l == Object.keys(o).length && s.engineStatus.isFree && (s.events.trigger(Dr.EngineFree, null), s.viewCube.CameraGoHome()); }); @@ -38209,7 +38237,7 @@ function Gw(s, e) { l.box = d, l.mesh = u, u.name = a, u.glb = l.glb, u.url = e.url, r.push(u); } }); - }), console.log("加载模型数量", r.length), Ww(e.url, s, r); + }), console.log("加载模型数量", r.length), Gw(e.url, s, r); } }); function t(n, i, r) { @@ -38229,7 +38257,7 @@ function Gw(s, e) { return o; } } -function Ww(s, e, t) { +function Gw(s, e, t) { let n = []; t.forEach((i) => { n.findIndex((o) => o.glb == i.glb) == -1 ? n.push({ @@ -38246,7 +38274,7 @@ function Ww(s, e, t) { r.castShadow = !0, r.receiveShadow = !0; else { let o = new ut(); - i.meshes.map((c) => c.material), o = rw(i.meshes.map((c) => c.geometry), !0); + i.meshes.map((c) => c.material), o = sw(i.meshes.map((c) => c.geometry), !0); let a = new dt(o, i.meshes.map((c) => c.material)); a.castShadow = !0, a.receiveShadow = !0, e.scene.add(a), a.index = e.scene.children.length - 1, a.url = s, a.glb = i.glb, a.indexes = i.indexes, a.materialClone = i.meshes[0].material; let l = e.models.find((c) => c.url == s); @@ -38257,15 +38285,15 @@ function Ww(s, e, t) { }); } a.material instanceof Array ? a.material.forEach((c) => { - dp(c); - }) : dp(a.material); + up(c); + }) : up(a.material); } }); } -function dp(s) { - s.shadowSide = Fn, s.roughness = 0.6, s.metalness = 0, s.side = At, s.map != null && (s.map.colorSpace = xt, s.map.needsUpdate = !0, console.log("优化贴图")), s instanceof Ss && (s.map && (s.map.colorSpace = xt, s.map.needsUpdate = !0), s.emissiveMap && (s.emissiveMap.colorSpace = xt, s.emissiveMap.needsUpdate = !0), s.roughnessMap && (s.roughnessMap.colorSpace = Bt, s.roughnessMap.needsUpdate = !0), s.metalnessMap && (s.metalnessMap.colorSpace = Bt, s.metalnessMap.needsUpdate = !0), s.normalMap && (s.normalMap.colorSpace = Bt, s.normalMap.needsUpdate = !0), s.aoMap && (s.aoMap.colorSpace = Bt, s.aoMap.needsUpdate = !0), s.roughness = Math.max(0.1, Math.min(1, s.roughness)), s.metalness = Math.max(0, Math.min(1, s.metalness)), s.envMapIntensity = s.envMapIntensity || 1, s.needsUpdate = !0), s instanceof Qn && (this.optimizeMaterial(s), s.transmissionMap && (s.transmissionMap.colorSpace = Bt, s.transmissionMap.needsUpdate = !0), s.thicknessMap && (s.thicknessMap.colorSpace = Bt, s.thicknessMap.needsUpdate = !0), s.transmission = Math.max(0, Math.min(1, s.transmission)), s.thickness = Math.max(0, Math.min(10, s.thickness))), s instanceof Zt && s.map && (s.map.colorSpace = xt, s.map.needsUpdate = !0), s instanceof Wm && (s.map && (s.map.colorSpace = xt, s.map.needsUpdate = !0), s.emissiveMap && (s.emissiveMap.colorSpace = xt, s.emissiveMap.needsUpdate = !0)); +function up(s) { + s.shadowSide = Fn, s.roughness = 0.6, s.metalness = 0, s.side = At, s.map != null && (s.map.colorSpace = xt, s.map.needsUpdate = !0, console.log("优化贴图")), s instanceof Ss && (s.map && (s.map.colorSpace = xt, s.map.needsUpdate = !0), s.emissiveMap && (s.emissiveMap.colorSpace = xt, s.emissiveMap.needsUpdate = !0), s.roughnessMap && (s.roughnessMap.colorSpace = Bt, s.roughnessMap.needsUpdate = !0), s.metalnessMap && (s.metalnessMap.colorSpace = Bt, s.metalnessMap.needsUpdate = !0), s.normalMap && (s.normalMap.colorSpace = Bt, s.normalMap.needsUpdate = !0), s.aoMap && (s.aoMap.colorSpace = Bt, s.aoMap.needsUpdate = !0), s.roughness = Math.max(0.1, Math.min(1, s.roughness)), s.metalness = Math.max(0, Math.min(1, s.metalness)), s.envMapIntensity = s.envMapIntensity || 1, s.needsUpdate = !0), s instanceof Qn && (this.optimizeMaterial(s), s.transmissionMap && (s.transmissionMap.colorSpace = Bt, s.transmissionMap.needsUpdate = !0), s.thicknessMap && (s.thicknessMap.colorSpace = Bt, s.thicknessMap.needsUpdate = !0), s.transmission = Math.max(0, Math.min(1, s.transmission)), s.thickness = Math.max(0, Math.min(10, s.thickness))), s instanceof Zt && s.map && (s.map.colorSpace = xt, s.map.needsUpdate = !0), s instanceof Gm && (s.map && (s.map.colorSpace = xt, s.map.needsUpdate = !0), s.emissiveMap && (s.emissiveMap.colorSpace = xt, s.emissiveMap.needsUpdate = !0)); } -class Xw { +class Ww { engine; constructor(e) { this.engine = e; @@ -38273,14 +38301,14 @@ class Xw { // 加载多个模型 async loadModels(e, t) { for (const i of e) - n(i) === "light" && Hw(this.engine, i); + n(i) === "light" && zw(this.engine, i); function n(i) { const r = i.split(".").pop(); return r === "glb" || r === "gltf" ? "gltf" : "light"; } } } -class jw { +class Xw { engine; isFree; highlightModels; @@ -38291,7 +38319,7 @@ class jw { } init() { this.engine.events.on(Dr.EngineFree, () => { - this.updateFree(!0), console.log("引擎空闲"), Vw(this.engine); + this.updateFree(!0), console.log("引擎空闲"), Hw(this.engine); }), this.engine.events.on(Dr.EngineBusy, () => { this.updateFree(!1), console.log("引擎繁忙"); }); @@ -38304,7 +38332,7 @@ class jw { closeAllFunction = () => { }; } -class qw { +class jw { listeners = /* @__PURE__ */ new Map(); on(e, t) { this.listeners.has(e) || this.listeners.set(e, []), this.listeners.get(e).push(t); @@ -38324,7 +38352,7 @@ class qw { }); } } -class Zw { +class qw { engine; constructor(e) { this.engine = e; @@ -38340,7 +38368,7 @@ class Zw { } } var Ri = /* @__PURE__ */ ((s) => (s.ModelLoadStart = "model-load-start", s.ModelLoadProgress = "model-load-progress", s.ModelLoaded = "model-loaded", s.ModelError = "model-error", s.SelectionChanged = "selection-changed", s.HoverChanged = "hover-changed", s.Click = "click", s.MouseMove = "mouse-move", s.CameraChanged = "camera-changed", s.CameraIdle = "camera-idle", s.EngineFree = "engine-free", s.EngineBusy = "engine-busy", s.MeasureChanged = "measure-changed", s))(Ri || {}); -class Yw { +class Zw { engine; behavior; isCtrlDown = !1; @@ -38393,7 +38421,7 @@ class Yw { return e.intersectObjects(this.engine.scene.children.filter((t) => t instanceof No), !0); } } -class Kw { +class Yw { engine; highlightMaterial; hideMaterial; @@ -38429,7 +38457,7 @@ class Kw { e.forEach((t) => { t.ids.forEach((n) => { this.engine.models.find((i) => i.url == t.url).nodesMap.get(n).indexes.forEach((i) => { - fp(this.engine.scene.children[i[0]]), this.engine.scene.children[i[0]].material[i[1]] = this.highlightMaterial; + dp(this.engine.scene.children[i[0]]), this.engine.scene.children[i[0]].material[i[1]] = this.highlightMaterial; }); }), this.engine.engineStatus.highlightModels.push(t); }); @@ -38456,7 +38484,7 @@ class Kw { t.ids.forEach((i) => { let r = this.engine.models.find((o) => o.url == t.url).nodesMap.get(i); this.engine.modelEdge.hideModelEdge(t.url, i), r.indexes.forEach((o) => { - fp(this.engine.scene.children[o[0]]), this.engine.scene.children[o[0]].material[o[1]] = this.hideMaterial; + dp(this.engine.scene.children[o[0]]), this.engine.scene.children[o[0]].material[o[1]] = this.hideMaterial; }); }); let n = this.engine.engineStatus.hideModels.find((i) => i.url == t.url); @@ -38542,7 +38570,7 @@ class Kw { getModelDescription(e) { } } -function fp(s) { +function dp(s) { (s.isSplit == null || s.isSplit == null || s.isSplit == !1) && (s.isSplit = !0); } class Dn { @@ -38639,12 +38667,12 @@ class Dn { this.scene = e; } } -var lu = { exports: {} }, $w = lu.exports, pp; -function Jw() { - return pp || (pp = 1, (function(s, e) { +var au = { exports: {} }, Kw = au.exports, fp; +function $w() { + return fp || (fp = 1, (function(s, e) { (function(t, n) { s.exports = n(); - })($w, function() { + })(Kw, function() { var t = function() { function n(f) { return o.appendChild(f.dom), f; @@ -38682,10 +38710,10 @@ function Jw() { } }; }, t; }); - })(lu)), lu.exports; + })(au)), au.exports; } -var Qw = Jw(); -const eS = /* @__PURE__ */ n0(Qw); +var Jw = $w(); +const Qw = /* @__PURE__ */ t0(Jw); var xr = Object.freeze({ Linear: Object.freeze({ None: function(s) { @@ -38829,7 +38857,7 @@ var xr = Object.freeze({ } }), fo = function() { return performance.now(); -}, tS = ( +}, eS = ( /** @class */ (function() { function s() { @@ -38862,9 +38890,9 @@ var xr = Object.freeze({ return !0; }, s; })() -), cu = { +), lu = { Linear: function(s, e) { - var t = s.length - 1, n = t * e, i = Math.floor(n), r = cu.Utils.Linear; + var t = s.length - 1, n = t * e, i = Math.floor(n), r = lu.Utils.Linear; return e < 0 ? r(s[0], s[1], n) : e > 1 ? r(s[t], s[t - 1], t - n) : r(s[i], s[i + 1 > t ? t : i + 1], n - i); }, Utils: { @@ -38872,7 +38900,7 @@ var xr = Object.freeze({ return (e - s) * t + s; } } -}, L0 = ( +}, R0 = ( /** @class */ (function() { function s() { @@ -38881,11 +38909,11 @@ var xr = Object.freeze({ return s._nextId++; }, s._nextId = 0, s; })() -), hu = new tS(), nS = ( +), cu = new eS(), tS = ( /** @class */ (function() { function s(e, t) { - t === void 0 && (t = hu), this._object = e, this._group = t, this._isPaused = !1, this._pauseStart = 0, this._valuesStart = {}, this._valuesEnd = {}, this._valuesStartRepeat = {}, this._duration = 1e3, this._isDynamic = !1, this._initialRepeat = 0, this._repeat = 0, this._yoyo = !1, this._isPlaying = !1, this._reversed = !1, this._delayTime = 0, this._startTime = 0, this._easingFunction = xr.Linear.None, this._interpolationFunction = cu.Linear, this._chainedTweens = [], this._onStartCallbackFired = !1, this._onEveryStartCallbackFired = !1, this._id = L0.nextId(), this._isChainStopped = !1, this._propertiesAreSetUp = !1, this._goToEnd = !1; + t === void 0 && (t = cu), this._object = e, this._group = t, this._isPaused = !1, this._pauseStart = 0, this._valuesStart = {}, this._valuesEnd = {}, this._valuesStartRepeat = {}, this._duration = 1e3, this._isDynamic = !1, this._initialRepeat = 0, this._repeat = 0, this._yoyo = !1, this._isPlaying = !1, this._reversed = !1, this._delayTime = 0, this._startTime = 0, this._easingFunction = xr.Linear.None, this._interpolationFunction = lu.Linear, this._chainedTweens = [], this._onStartCallbackFired = !1, this._onEveryStartCallbackFired = !1, this._id = R0.nextId(), this._isChainStopped = !1, this._propertiesAreSetUp = !1, this._goToEnd = !1; } return s.prototype.getId = function() { return this._id; @@ -38972,7 +39000,7 @@ var xr = Object.freeze({ this._chainedTweens[e].stop(); return this; }, s.prototype.group = function(e) { - return e === void 0 && (e = hu), this._group = e, this; + return e === void 0 && (e = cu), this._group = e, this; }, s.prototype.delay = function(e) { return e === void 0 && (e = 0), this._delayTime = e, this; }, s.prototype.repeat = function(e) { @@ -38984,7 +39012,7 @@ var xr = Object.freeze({ }, s.prototype.easing = function(e) { return e === void 0 && (e = xr.Linear.None), this._easingFunction = e, this; }, s.prototype.interpolation = function(e) { - return e === void 0 && (e = cu.Linear), this._interpolationFunction = e, this; + return e === void 0 && (e = lu.Linear), this._interpolationFunction = e, this; }, s.prototype.chain = function() { for (var e = [], t = 0; t < arguments.length; t++) e[t] = arguments[t]; @@ -39050,8 +39078,8 @@ var xr = Object.freeze({ }, s; })() ); -L0.nextId; -var ui = hu; +R0.nextId; +var ui = cu; ui.getAll.bind(ui); ui.removeAll.bind(ui); ui.add.bind(ui); @@ -39059,15 +39087,15 @@ ui.remove.bind(ui); ui.update.bind(ui); var Bc = { Easing: xr, - Tween: nS + Tween: tS }; -function iS() { - return new Cm(); +function nS() { + return new Am(); } -function sS(s, e) { +function iS(s, e) { s.appendChild(e.domElement); } -function rS(s, e, t) { +function sS(s, e, t) { var n = new Object(); n.visible = !0; let i = null, r, o, a = []; @@ -39245,7 +39273,7 @@ function rS(s, e, t) { } } function h() { - n.sceneOrtho = iS(); + n.sceneOrtho = nS(); var x = t.clientWidth, m = t.clientWidth, p = x > m ? x / m : m / x, g = 300; n.camera = new Rs( g * p / -2, @@ -39255,12 +39283,12 @@ function rS(s, e, t) { 0.01, 1e4 ); - var x = r.clientWidth, m = r.clientHeight, b = new Qm({ + var x = r.clientWidth, m = r.clientHeight, b = new Jm({ alpha: !0 }); b.setSize(x, m), b.setClearAlpha(0), n.sceneOrtho.renderer = b; let v = new _l(16777215, 0.8); - n.sceneOrtho.add(v), sS(r, b); + n.sceneOrtho.add(v), iS(r, b); } function u() { const p = "/assets/viewcube/"; @@ -39295,10 +39323,10 @@ function rS(s, e, t) { x.push( new Zt({ color: 16777215, - map: new qm().load(b.icon) + map: new jm().load(b.icon) }) ); - new Wm({ + new Gm({ color: 255 }); var m = new dt(new $i(110, 110, 110), x); @@ -39541,14 +39569,14 @@ function rS(s, e, t) { !document.fullscreenElement && !document.webkitFullscreenElement && !document.mozFullScreenElement && !document.msFullscreenElement ? (p.requestFullscreen ? p.requestFullscreen() : p.webkitRequestFullscreen ? p.webkitRequestFullscreen() : p.mozRequestFullScreen ? p.mozRequestFullScreen() : p.msRequestFullscreen && p.msRequestFullscreen(), console.log("已进入全屏模式")) : (document.exitFullscreen ? document.exitFullscreen() : document.webkitExitFullscreen ? document.webkitExitFullscreen() : document.mozCancelFullScreen ? document.mozCancelFullScreen() : document.msExitFullscreen && document.msExitFullscreen(), console.log("已退出全屏模式")); }, n; } -class oS { +class rS { engine; cubeTool; constructor(e) { this.engine = e; } init() { - this.cubeTool = rS(this.engine, this.engine.scene, this.engine.container), this.cubeTool.init(); + this.cubeTool = sS(this.engine, this.engine.scene, this.engine.container), this.cubeTool.init(); } // 相机回归正位 CameraGoHome() { @@ -39559,7 +39587,7 @@ class oS { this.cubeTool.zoomToBox(e); } } -function aS(s) { +function oS(s) { let e = new Object(); return e.getBoundingBox = function() { let t = s.models, n = new P(1e8, 1e9, 1e10), i = new P(-1e8, -1e9, -1e10); @@ -39611,7 +39639,7 @@ function aS(s) { } }, e; } -class lS { +class aS { engine; // 绘制状态 isDrawing = !1; @@ -39786,7 +39814,7 @@ class lS { } } } -class cS { +class lS { engine; ground = null; // 地面对象 @@ -39965,7 +39993,7 @@ class Bi { engine; handelBehaved; constructor(e) { - this.engine = e, this.handelBehaved = Xu(e), this.handelBehaved.init(this, null); + this.engine = e, this.handelBehaved = Wu(e), this.handelBehaved.init(this, null); } active() { this.handelBehaved.active(); @@ -40175,7 +40203,7 @@ class Bi { } } } -class hS { +class cS { engine; isActive = !1; tools; @@ -40227,7 +40255,7 @@ class hS { t.point1 = r.point, t.point2 = i[0].point, t.text = t.point1.clone().distanceTo(t.point2.clone()).toFixed(2) + " m"; } } -class uS { +class hS { engine; tools; isActive = !1; @@ -40280,7 +40308,7 @@ class uS { } // 按下esc } -class dS { +class uS { engine; isActive = !1; tools; @@ -40332,7 +40360,7 @@ class dS { t.point1 = r.point, t.point2 = i[0].point, t.text = t.point1.clone().distanceTo(t.point2.clone()).toFixed(2) + " m"; } } -class fS { +class dS { engine; isActive = !1; tools; @@ -40369,7 +40397,7 @@ class fS { t != null && (t.isSelect = !1, t.point = e.catch.point.clone(), t.text = Math.round(e.catch.point.y) + " m", this.engine.events.trigger(Ri.MeasureChanged, t)); } } -class pS { +class fS { engine; isActive = !1; tools; @@ -40406,7 +40434,7 @@ class pS { t != null && (t.isSelect = !1, t.point = e.catch.point.clone(), t.textX = Math.round(e.catch.point.x) + " m", t.textY = Math.round(e.catch.point.y) + " m", t.textZ = Math.round(e.catch.point.z) + " m", this.engine.events.trigger(Ri.MeasureChanged, t)); } } -class mS { +class pS { engine; tools; // 存储三个点:起点、顶点(中间点)、终点 @@ -40474,7 +40502,7 @@ class mS { } } } -class gS { +class mS { engine; tools; // 存储多个点,用于围成区域 @@ -40557,7 +40585,7 @@ class gS { e != null && e.points.length >= 3 && (e.points.length > this.points.length && (e.points = this.points.map((t) => t.clone())), e.area = this.calculateArea(e.points), e.text = e.area.toFixed(2) + " m²", e.isSelect = !1, this.points = [], this.engine.events.trigger(Ri.MeasureChanged, e)); } } -class xS { +class gS { engine; tools; // 存储两个点:起点和终点 @@ -40639,7 +40667,7 @@ class xS { } } } -class vS { +class xS { isActive = !1; engine; clearHeightMeasure; @@ -40665,7 +40693,7 @@ class vS { volumeAnnotation: [] }; constructor(e) { - this.engine = e, this.clearHeightMeasure = new hS(e), this.distanceMeasure = new uS(e), this.clearDistanceMeasure = new dS(e), this.elevationMeasure = new fS(e), this.pointMeasure = new pS(e), this.angleMeasure = new mS(e), this.areaMeasure = new gS(e), this.slopeMeasure = new xS(e), this.tools = new Bi(e), this.annotationContainer = document.createElement("div"), this.annotationContainer.className = "annotation-container", e.container.parentElement.appendChild(this.annotationContainer); + this.engine = e, this.clearHeightMeasure = new cS(e), this.distanceMeasure = new hS(e), this.clearDistanceMeasure = new uS(e), this.elevationMeasure = new dS(e), this.pointMeasure = new fS(e), this.angleMeasure = new pS(e), this.areaMeasure = new mS(e), this.slopeMeasure = new gS(e), this.tools = new Bi(e), this.annotationContainer = document.createElement("div"), this.annotationContainer.className = "annotation-container", e.container.parentElement.appendChild(this.annotationContainer); } active() { this.isActive = !0, this.tools.active(); @@ -40691,7 +40719,7 @@ class vS { this.isActive && this.tools.drawNormalAnnotation(); } } -class bS { +class vS { engine; isActive = !1; isDrag = !1; @@ -40821,11 +40849,11 @@ class bS { min: this.box.min.clone(), max: this.box.max.clone() }, this.pickNormal.y == 0) { - const n = new Mt(); + const n = new _t(); n.setFromNormalAndCoplanarPoint(new P(0, 1, 0), this.pickPoint), this.plane = n; } else { let n = new P(this.engine.camera.position.x, this.pickPoint.y, this.engine.camera.position.z); - const i = new Mt(); + const i = new _t(); i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1), this.pickPoint), this.plane = i; } } @@ -40846,34 +40874,34 @@ class bS { } } } -const D0 = 0, yS = 1, _S = 2, mp = 2, Nc = 1.25, gp = 1, hn = 32, jt = hn / 4, I0 = 65535, MS = Math.pow(2, -24), kc = Symbol("SKIP_GENERATION"); -function wS(s) { +const L0 = 0, bS = 1, yS = 2, pp = 2, Nc = 1.25, mp = 1, hn = 32, jt = hn / 4, D0 = 65535, _S = Math.pow(2, -24), kc = Symbol("SKIP_GENERATION"); +function MS(s) { return s.index ? s.index.count : s.attributes.position.count; } function Ds(s) { - return wS(s) / 3; + return MS(s) / 3; } -function SS(s, e = ArrayBuffer) { +function wS(s, e = ArrayBuffer) { return s > 65535 ? new Uint32Array(new e(4 * s)) : new Uint16Array(new e(2 * s)); } -function ES(s, e) { +function SS(s, e) { if (!s.index) { - const t = s.attributes.position.count, n = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, i = SS(t, n); + const t = s.attributes.position.count, n = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, i = wS(t, n); s.setIndex(new at(i, 1)); for (let r = 0; r < t; r++) i[r] = r; } } -function B0(s, e) { +function I0(s, e) { const t = Ds(s), n = e || s.drawRange, i = n.start / 3, r = (n.start + n.count) / 3, o = Math.max(0, i), a = Math.min(t, r) - o; return [{ offset: Math.floor(o), count: Math.floor(a) }]; } -function xp(s, e) { +function gp(s, e) { if (!s.groups || !s.groups.length) - return B0(s, e); + return I0(s, e); const t = [], n = e || s.drawRange, i = n.start / 3, r = (n.start + n.count) / 3, o = Ds(s), a = []; for (const h of s.groups) { const { start: u, count: d } = h, f = u / 3, p = isFinite(d) ? d : o * 3 - u, g = (u + p) / 3; @@ -40903,7 +40931,7 @@ function Uc(s, e, t, n, i) { } n[0] = r, n[1] = o, n[2] = a, n[3] = l, n[4] = c, n[5] = h, i[0] = u, i[1] = d, i[2] = f, i[3] = p, i[4] = g, i[5] = x; } -function vp(s, e, t = null, n = null, i = null) { +function xp(s, e, t = null, n = null, i = null) { const r = s.attributes.position, o = s.index ? s.index.array : null, a = r.normalized; if (i === null) i = new Float32Array(t * 6), i.offset = e; @@ -40925,7 +40953,7 @@ function vp(s, e, t = null, n = null, i = null) { let _ = M; E > _ && (_ = E), A > _ && (_ = A); const S = (_ - R) / 2, D = y * 2; - i[x + D + 0] = R + S, i[x + D + 1] = S + (Math.abs(R) + S) * MS; + i[x + D + 0] = R + S, i[x + D + 1] = S + (Math.abs(R) + S) * _S; } } return i; @@ -40933,7 +40961,7 @@ function vp(s, e, t = null, n = null, i = null) { function It(s, e, t) { return t.min.x = e[s], t.min.y = e[s + 1], t.min.z = e[s + 2], t.max.x = e[s + 3], t.max.y = e[s + 4], t.max.z = e[s + 5], t; } -function bp(s) { +function vp(s) { let e = -1, t = -1 / 0; for (let n = 0; n < 3; n++) { const i = s[n + 3] - s[n]; @@ -40941,10 +40969,10 @@ function bp(s) { } return e; } -function yp(s, e) { +function bp(s, e) { e.set(s); } -function _p(s, e, t) { +function yp(s, e, t) { let n, i; for (let r = 0; r < 3; r++) { const o = r + 3; @@ -40961,20 +40989,20 @@ function eo(s) { const e = s[3] - s[0], t = s[4] - s[1], n = s[5] - s[2]; return 2 * (e * t + t * n + n * e); } -const Ei = 32, TS = (s, e) => s.candidate - e.candidate, Vi = /* @__PURE__ */ new Array(Ei).fill().map(() => ({ +const Ei = 32, ES = (s, e) => s.candidate - e.candidate, Vi = /* @__PURE__ */ new Array(Ei).fill().map(() => ({ count: 0, bounds: new Float32Array(6), rightCacheBounds: new Float32Array(6), leftCacheBounds: new Float32Array(6), candidate: 0 })), Na = /* @__PURE__ */ new Float32Array(6); -function AS(s, e, t, n, i, r) { +function TS(s, e, t, n, i, r) { let o = -1, a = 0; - if (r === D0) - o = bp(e), o !== -1 && (a = (e[o] + e[o + 3]) / 2); - else if (r === yS) - o = bp(s), o !== -1 && (a = CS(t, n, i, o)); - else if (r === _S) { + if (r === L0) + o = vp(e), o !== -1 && (a = (e[o] + e[o + 3]) / 2); + else if (r === bS) + o = vp(s), o !== -1 && (a = AS(t, n, i, o)); + else if (r === yS) { const l = eo(s); let c = Nc * i; const h = t.offset || 0, u = (n - h) * 6, d = (n + i - h) * 6; @@ -40996,7 +41024,7 @@ function AS(s, e, t, n, i, r) { A[R] = 1 / 0, A[R + 3] = -1 / 0, E[R] = 1 / 0, E[R + 3] = -1 / 0, M[R] = 1 / 0, M[R + 3] = -1 / 0; Ba(v, t, M); } - x.sort(TS); + x.sort(ES); let b = i; for (let v = 0; v < b; v++) { const y = x[v]; @@ -41016,7 +41044,7 @@ function AS(s, e, t, n, i, r) { M !== 0 && (_ = eo(A) / l); let S = 0; E !== 0 && (S = eo(R) / l); - const D = gp + Nc * (_ * M + S * E); + const D = mp + Nc * (_ * M + S * E); D < c && (o = f, c = D, a = y.candidate); } } else { @@ -41034,20 +41062,20 @@ function AS(s, e, t, n, i, r) { y.count++, Ba(b, t, y.bounds); } const x = Vi[Ei - 1]; - yp(x.bounds, x.rightCacheBounds); + bp(x.bounds, x.rightCacheBounds); for (let b = Ei - 2; b >= 0; b--) { const v = Vi[b], y = Vi[b + 1]; - _p(v.bounds, y.rightCacheBounds, v.rightCacheBounds); + yp(v.bounds, y.rightCacheBounds, v.rightCacheBounds); } let m = 0; for (let b = 0; b < Ei - 1; b++) { const v = Vi[b], y = v.count, M = v.bounds, E = Vi[b + 1].rightCacheBounds; - y !== 0 && (m === 0 ? yp(M, Na) : _p(M, Na, Na)), m += y; + y !== 0 && (m === 0 ? bp(M, Na) : yp(M, Na, Na)), m += y; let A = 0, R = 0; m !== 0 && (A = eo(Na) / l); const _ = i - m; _ !== 0 && (R = eo(E) / l); - const S = gp + Nc * (A * m + R * _); + const S = mp + Nc * (A * m + R * _); S < c && (o = f, c = S, a = v.candidate); } } @@ -41056,7 +41084,7 @@ function AS(s, e, t, n, i, r) { console.warn(`MeshBVH: Invalid build strategy value ${r} used.`); return { axis: o, pos: a }; } -function CS(s, e, t, n) { +function AS(s, e, t, n) { let i = 0; const r = s.offset; for (let o = e, a = e + t; o < a; o++) @@ -41068,7 +41096,7 @@ class Oc { this.boundingData = new Float32Array(6); } } -function PS(s, e, t, n, i, r) { +function CS(s, e, t, n, i, r) { let o = n, a = n + i - 1; const l = r.pos, c = r.axis * 2, h = t.offset || 0; for (; ; ) { @@ -41090,7 +41118,7 @@ function PS(s, e, t, n, i, r) { return o; } } -function RS(s, e, t, n, i, r) { +function PS(s, e, t, n, i, r) { let o = n, a = n + i - 1; const l = r.pos, c = r.axis * 2, h = t.offset || 0; for (; ; ) { @@ -41110,30 +41138,30 @@ function RS(s, e, t, n, i, r) { return o; } } -let N0, hl, uu, k0; -const LS = Math.pow(2, 32); -function du(s) { - return "count" in s ? 1 : 1 + du(s.left) + du(s.right); +let B0, hl, hu, N0; +const RS = Math.pow(2, 32); +function uu(s) { + return "count" in s ? 1 : 1 + uu(s.left) + uu(s.right); } -function DS(s, e, t) { - return N0 = new Float32Array(t), hl = new Uint32Array(t), uu = new Uint16Array(t), k0 = new Uint8Array(t), fu(s, e); +function LS(s, e, t) { + return B0 = new Float32Array(t), hl = new Uint32Array(t), hu = new Uint16Array(t), N0 = new Uint8Array(t), du(s, e); } -function fu(s, e) { +function du(s, e) { const t = s / 4, n = s / 2, i = "count" in e, r = e.boundingData; for (let o = 0; o < 6; o++) - N0[t + o] = r[o]; + B0[t + o] = r[o]; if (i) - return e.buffer ? (k0.set(new Uint8Array(e.buffer), s), s + e.buffer.byteLength) : (hl[t + 6] = e.offset, uu[n + 14] = e.count, uu[n + 15] = I0, s + hn); + return e.buffer ? (N0.set(new Uint8Array(e.buffer), s), s + e.buffer.byteLength) : (hl[t + 6] = e.offset, hu[n + 14] = e.count, hu[n + 15] = D0, s + hn); { const { left: o, right: a, splitAxis: l } = e, c = s + hn; - let h = fu(c, o); + let h = du(c, o); const u = s / hn, d = h / hn - u; - if (d > LS) + if (d > RS) throw new Error("MeshBVH: Cannot store relative child node offset greater than 32 bits."); - return hl[t + 6] = d, hl[t + 7] = l, fu(h, a); + return hl[t + 6] = d, hl[t + 7] = l, du(h, a); } } -function IS(s, e, t) { +function DS(s, e, t) { const n = (s.index ? s.index.count : s.attributes.position.count) / 3 > 65536, i = t.reduce((c, h) => c + h.count, 0), r = n ? 4 : 2, o = e ? new SharedArrayBuffer(i * r) : new ArrayBuffer(i * r), a = n ? new Uint32Array(o) : new Uint16Array(o); let l = 0; for (let c = 0; c < t.length; c++) { @@ -41144,7 +41172,7 @@ function IS(s, e, t) { } return a; } -function BS(s, e, t, n, i) { +function IS(s, e, t, n, i) { const { maxDepth: r, verbose: o, @@ -41152,7 +41180,7 @@ function BS(s, e, t, n, i) { strategy: l, onProgress: c, indirect: h - } = i, u = s._indirectBuffer, d = s.geometry, f = d.index ? d.index.array : null, p = h ? RS : PS, g = Ds(d), x = new Float32Array(6); + } = i, u = s._indirectBuffer, d = s.geometry, f = d.index ? d.index.array : null, p = h ? PS : CS, g = Ds(d), x = new Float32Array(6); let m = !1; const b = new Oc(); return Uc(e, t, n, b.boundingData, x), y(b, t, n, x), b; @@ -41162,7 +41190,7 @@ function BS(s, e, t, n, i) { function y(M, E, A, R = null, _ = 0) { if (!m && _ >= r && (m = !0, o && (console.warn(`MeshBVH: Max depth of ${r} reached when generating BVH. Consider increasing maxDepth.`), console.warn(d))), A <= a || _ >= r) return v(E + A), M.offset = E, M.count = A, M; - const S = AS(M.boundingData, R, e, E, A, l); + const S = TS(M.boundingData, R, e, E, A, l); if (S.axis === -1) return v(E + A), M.offset = E, M.count = A, M; const D = p(u, f, e, E, A, S); @@ -41178,20 +41206,20 @@ function BS(s, e, t, n, i) { return M; } } -function NS(s, e) { +function BS(s, e) { const t = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, n = s.geometry; let i, r; if (e.indirect) { - const o = xp(n, e.range), a = IS(n, e.useSharedArrayBuffer, o); - s._indirectBuffer = a, i = vp(n, 0, a.length, a), r = [{ offset: 0, count: a.length }]; + const o = gp(n, e.range), a = DS(n, e.useSharedArrayBuffer, o); + s._indirectBuffer = a, i = xp(n, 0, a.length, a), r = [{ offset: 0, count: a.length }]; } else { - ES(n, e); - const o = B0(n, e.range)[0]; - i = vp(n, o.offset, o.count), r = xp(n, e.range); + SS(n, e); + const o = I0(n, e.range)[0]; + i = xp(n, o.offset, o.count), r = gp(n, e.range); } s._roots = r.map((o) => { - const a = BS(s, i, o.offset, o.count, e), l = du(a), c = new t(hn * l); - return DS(0, a, c), c; + const a = IS(s, i, o.offset, o.count, e), l = uu(a), c = new t(hn * l); + return LS(0, a, c), c; }); } class Di { @@ -41233,7 +41261,7 @@ Di.prototype.setFromBox = /* @__PURE__ */ (function() { this.min = r, this.max = o; }; })(); -const kS = /* @__PURE__ */ (function() { +const NS = /* @__PURE__ */ (function() { const s = /* @__PURE__ */ new P(), e = /* @__PURE__ */ new P(), t = /* @__PURE__ */ new P(); return function(n, i, r) { const o = n.start, a = s, l = i.start, c = e; @@ -41242,10 +41270,10 @@ const kS = /* @__PURE__ */ (function() { let g, x; p !== 0 ? g = (h * u - f * d) / p : g = 0, x = (h + g * u) / d, r.x = g, r.y = x; }; -})(), Ku = /* @__PURE__ */ (function() { +})(), Yu = /* @__PURE__ */ (function() { const s = /* @__PURE__ */ new ce(), e = /* @__PURE__ */ new P(), t = /* @__PURE__ */ new P(); return function(n, i, r, o) { - kS(n, i, s); + NS(n, i, s); let a = s.x, l = s.y; if (a >= 0 && a <= 1 && l >= 0 && l <= 1) { n.at(a, r), i.at(l, o); @@ -41271,8 +41299,8 @@ const kS = /* @__PURE__ */ (function() { } } }; -})(), US = /* @__PURE__ */ (function() { - const s = /* @__PURE__ */ new P(), e = /* @__PURE__ */ new P(), t = /* @__PURE__ */ new Mt(), n = /* @__PURE__ */ new Hn(); +})(), kS = /* @__PURE__ */ (function() { + const s = /* @__PURE__ */ new P(), e = /* @__PURE__ */ new P(), t = /* @__PURE__ */ new _t(), n = /* @__PURE__ */ new Hn(); return function(i, r) { const { radius: o, center: a } = i, { a: l, b: c, c: h } = r; if (n.start = l, n.end = c, n.closestPointToPoint(a, !0, s).distanceTo(a) <= o || (n.start = l, n.end = h, n.closestPointToPoint(a, !0, s).distanceTo(a) <= o) || (n.start = c, n.end = h, n.closestPointToPoint(a, !0, s).distanceTo(a) <= o)) return !0; @@ -41283,16 +41311,16 @@ const kS = /* @__PURE__ */ (function() { } return !1; }; -})(), OS = ["x", "y", "z"], Ti = 1e-15, Mp = Ti * Ti; +})(), US = ["x", "y", "z"], Ti = 1e-15, _p = Ti * Ti; function Ln(s) { return Math.abs(s) < Ti; } -class Vn extends yt { +class Vn extends bt { constructor(...e) { - super(...e), this.isExtendedTriangle = !0, this.satAxes = new Array(4).fill().map(() => new P()), this.satBounds = new Array(4).fill().map(() => new Di()), this.points = [this.a, this.b, this.c], this.plane = new Mt(), this.isDegenerateIntoSegment = !1, this.isDegenerateIntoPoint = !1, this.degenerateSegment = new Hn(), this.needsUpdate = !0; + super(...e), this.isExtendedTriangle = !0, this.satAxes = new Array(4).fill().map(() => new P()), this.satBounds = new Array(4).fill().map(() => new Di()), this.points = [this.a, this.b, this.c], this.plane = new _t(), this.isDegenerateIntoSegment = !1, this.isDegenerateIntoPoint = !1, this.degenerateSegment = new Hn(), this.needsUpdate = !0; } intersectsSphere(e) { - return US(e, this); + return kS(e, this); } update() { const e = this.a, t = this.b, n = this.c, i = this.points, r = this.satAxes, o = this.satBounds, a = r[0], l = o[0]; @@ -41314,7 +41342,7 @@ Vn.prototype.closestPointToSegment = /* @__PURE__ */ (function() { let c, h = 1 / 0; for (let u = 0; u < 3; u++) { const d = (u + 1) % 3; - t.start.copy(l[u]), t.end.copy(l[d]), Ku(t, n, s, e), c = s.distanceToSquared(e), c < h && (h = c, i && i.copy(s), r && r.copy(e)); + t.start.copy(l[u]), t.end.copy(l[d]), Yu(t, n, s, e), c = s.distanceToSquared(e), c < h && (h = c, i && i.copy(s), r && r.copy(e)); } return this.closestPointToPoint(o, s), c = o.distanceToSquared(s), c < h && (h = c, i && i.copy(s), r && r.copy(o)), this.closestPointToPoint(a, s), c = a.distanceToSquared(s), c < h && (h = c, i && i.copy(s), r && r.copy(a)), Math.sqrt(h); }; @@ -41365,7 +41393,7 @@ Vn.prototype.intersectsTriangle = /* @__PURE__ */ (function() { } function m(v, y, M) { const E = v.degenerateSegment, A = y.a; - return E.closestPointToPoint(A, !0, n), A.distanceToSquared(n) < Mp ? (M && (M.start.copy(A), M.end.copy(A)), !0) : !1; + return E.closestPointToPoint(A, !0, n), A.distanceToSquared(n) < _p ? (M && (M.start.copy(A), M.end.copy(A)), !0) : !1; } function b(v, y, M, E) { if (v.isDegenerateIntoSegment) @@ -41383,7 +41411,7 @@ Vn.prototype.intersectsTriangle = /* @__PURE__ */ (function() { } else return y.isDegenerateIntoPoint ? m(v, y, M) : g(y, v, M, E); else { if (v.isDegenerateIntoPoint) - return y.isDegenerateIntoPoint ? y.a.distanceToSquared(v.a) < Mp ? (M && (M.start.copy(v.a), M.end.copy(v.a)), !0) : !1 : y.isDegenerateIntoSegment ? m(y, v, M) : x(y, v, M); + return y.isDegenerateIntoPoint ? y.a.distanceToSquared(v.a) < _p ? (M && (M.start.copy(v.a), M.end.copy(v.a)), !0) : !1 : y.isDegenerateIntoSegment ? m(y, v, M) : x(y, v, M); if (y.isDegenerateIntoPoint) return x(v, y, M); if (y.isDegenerateIntoSegment) @@ -41411,7 +41439,7 @@ Vn.prototype.intersectsTriangle = /* @__PURE__ */ (function() { let re = 0, X = Math.abs(Z.x); const Y = Math.abs(Z.y); Y > X && (X = Y, re = 1), Math.abs(Z.z) > X && (re = 2); - const ge = OS[re], pe = this.a[ge], de = this.b[ge], ie = this.c[ge], he = v.a[ge], fe = v.b[ge], ve = v.c[ge]; + const ge = US[re], pe = this.a[ge], de = this.b[ge], ie = this.c[ge], he = v.a[ge], fe = v.b[ge], ve = v.c[ge]; if (p(this, pe, de, ie, C, B, _, S, D, h, a)) return d(this, v, y, M); if (p(v, he, fe, ve, j, $, w, F, W, u, l)) @@ -41452,7 +41480,7 @@ Vn.prototype.distanceToTriangle = /* @__PURE__ */ (function() { n.set(this[u], this[d]); for (let f = 0; f < 3; f++) { const p = t[f], g = t[(f + 1) % 3]; - i.set(r[p], r[g]), Ku(n, i, s, e); + i.set(r[p], r[g]), Yu(n, i, s, e); const x = s.distanceToSquared(e); x < c && (c = x, o && o.copy(s), a && a.copy(e)); } @@ -41573,7 +41601,7 @@ dn.prototype.distanceToBox = /* @__PURE__ */ (function() { const x = e[g]; for (let m = 0; m < 12; m++) { const b = t[m]; - Ku(x, b, n, i); + Yu(x, b, n, i); const v = n.distanceToSquared(i); if (v < f && (f = v, a && a.copy(n), l && l.copy(i), v < c)) return Math.sqrt(v); @@ -41582,7 +41610,7 @@ dn.prototype.distanceToBox = /* @__PURE__ */ (function() { return Math.sqrt(f); }; })(); -class $u { +class Ku { constructor(e) { this._getNewPrimitive = e, this._primitives = []; } @@ -41594,14 +41622,14 @@ class $u { this._primitives.push(e); } } -class FS extends $u { +class OS extends Ku { constructor() { super(() => new Vn()); } } -const Nn = /* @__PURE__ */ new FS(); +const Nn = /* @__PURE__ */ new OS(); function qt(s, e) { - return e[s + 15] === I0; + return e[s + 15] === D0; } function Cn(s, e) { return e[s + 6]; @@ -41616,10 +41644,10 @@ function $t(s, e) { const t = e[s + 6]; return s + t * jt; } -function Ju(s, e) { +function $u(s, e) { return e[s + 7]; } -class zS { +class FS { constructor() { this.float32Array = null, this.uint16Array = null, this.uint32Array = null; const e = []; @@ -41631,31 +41659,31 @@ class zS { }; } } -const wt = /* @__PURE__ */ new zS(); +const Mt = /* @__PURE__ */ new FS(); let Zi, dr; -const nr = [], ka = /* @__PURE__ */ new $u(() => new vt()); -function HS(s, e, t, n, i, r) { - Zi = ka.getPrimitive(), dr = ka.getPrimitive(), nr.push(Zi, dr), wt.setBuffer(s._roots[e]); - const o = pu(0, s.geometry, t, n, i, r); - wt.clearBuffer(), ka.releasePrimitive(Zi), ka.releasePrimitive(dr), nr.pop(), nr.pop(); +const nr = [], ka = /* @__PURE__ */ new Ku(() => new vt()); +function zS(s, e, t, n, i, r) { + Zi = ka.getPrimitive(), dr = ka.getPrimitive(), nr.push(Zi, dr), Mt.setBuffer(s._roots[e]); + const o = fu(0, s.geometry, t, n, i, r); + Mt.clearBuffer(), ka.releasePrimitive(Zi), ka.releasePrimitive(dr), nr.pop(), nr.pop(); const a = nr.length; return a > 0 && (dr = nr[a - 1], Zi = nr[a - 2]), o; } -function pu(s, e, t, n, i = null, r = 0, o = 0) { - const { float32Array: a, uint16Array: l, uint32Array: c } = wt; +function fu(s, e, t, n, i = null, r = 0, o = 0) { + const { float32Array: a, uint16Array: l, uint32Array: c } = Mt; let h = s * 2; if (qt(h, l)) { const u = Cn(s, c), d = kn(h, l); return It(s, a, Zi), n(u, d, !1, o, r + s / jt, Zi); } else { let u = function(D) { - const { uint16Array: C, uint32Array: B } = wt; + const { uint16Array: C, uint32Array: B } = Mt; let w = D * 2; for (; !qt(w, C); ) D = Kt(D), w = D * 2; return Cn(D, B); }, d = function(D) { - const { uint16Array: C, uint32Array: B } = wt; + const { uint16Array: C, uint32Array: B } = Mt; let w = D * 2; for (; !qt(w, C); ) D = $t(D, B), w = D * 2; @@ -41671,11 +41699,11 @@ function pu(s, e, t, n, i = null, r = 0, o = 0) { v || (v = Zi, It(g, a, v)); const M = qt(g * 2, l), E = t(v, M, m, o + 1, r + g / jt); let A; - if (E === mp) { + if (E === pp) { const D = u(g), C = d(g) - D; A = n(D, C, !0, o + 1, r + g / jt, v); } else - A = E && pu( + A = E && fu( g, e, t, @@ -41688,11 +41716,11 @@ function pu(s, e, t, n, i = null, r = 0, o = 0) { y = dr, It(x, a, y); const R = qt(x * 2, l), _ = t(y, R, b, o + 1, r + x / jt); let S; - if (_ === mp) { + if (_ === pp) { const D = u(x), C = d(x) - D; S = n(D, C, !0, o + 1, r + x / jt, y); } else - S = _ && pu( + S = _ && fu( x, e, t, @@ -41705,7 +41733,7 @@ function pu(s, e, t, n, i = null, r = 0, o = 0) { } } const to = /* @__PURE__ */ new P(), Fc = /* @__PURE__ */ new P(); -function VS(s, e, t = {}, n = 0, i = 1 / 0) { +function HS(s, e, t = {}, n = 0, i = 1 / 0) { const r = n * n, o = i * i; let a = 1 / 0, l = null; if (s.shapecast( @@ -41722,8 +41750,8 @@ function VS(s, e, t = {}, n = 0, i = 1 / 0) { const c = Math.sqrt(a); return t.point ? t.point.copy(Fc) : t.point = Fc.clone(), t.distance = c, t.faceIndex = l, t; } -const Ua = parseInt(Do) >= 169, GS = parseInt(Do) <= 161, hs = /* @__PURE__ */ new P(), us = /* @__PURE__ */ new P(), ds = /* @__PURE__ */ new P(), Oa = /* @__PURE__ */ new ce(), Fa = /* @__PURE__ */ new ce(), za = /* @__PURE__ */ new ce(), wp = /* @__PURE__ */ new P(), Sp = /* @__PURE__ */ new P(), Ep = /* @__PURE__ */ new P(), no = /* @__PURE__ */ new P(); -function WS(s, e, t, n, i, r, o, a) { +const Ua = parseInt(Do) >= 169, VS = parseInt(Do) <= 161, hs = /* @__PURE__ */ new P(), us = /* @__PURE__ */ new P(), ds = /* @__PURE__ */ new P(), Oa = /* @__PURE__ */ new ce(), Fa = /* @__PURE__ */ new ce(), za = /* @__PURE__ */ new ce(), Mp = /* @__PURE__ */ new P(), wp = /* @__PURE__ */ new P(), Sp = /* @__PURE__ */ new P(), no = /* @__PURE__ */ new P(); +function GS(s, e, t, n, i, r, o, a) { let l; if (r === un ? l = s.intersectTriangle(n, t, e, !0, i) : l = s.intersectTriangle(e, t, n, r !== At, i), l === null) return null; const c = s.origin.distanceTo(i); @@ -41732,23 +41760,23 @@ function WS(s, e, t, n, i, r, o, a) { point: i.clone() }; } -function Tp(s, e, t, n, i, r, o, a, l, c, h) { +function Ep(s, e, t, n, i, r, o, a, l, c, h) { hs.fromBufferAttribute(e, r), us.fromBufferAttribute(e, o), ds.fromBufferAttribute(e, a); - const u = WS(s, hs, us, ds, no, l, c, h); + const u = GS(s, hs, us, ds, no, l, c, h); if (u) { if (n) { Oa.fromBufferAttribute(n, r), Fa.fromBufferAttribute(n, o), za.fromBufferAttribute(n, a), u.uv = new ce(); - const f = yt.getInterpolation(no, hs, us, ds, Oa, Fa, za, u.uv); + const f = bt.getInterpolation(no, hs, us, ds, Oa, Fa, za, u.uv); Ua || (u.uv = f); } if (i) { Oa.fromBufferAttribute(i, r), Fa.fromBufferAttribute(i, o), za.fromBufferAttribute(i, a), u.uv1 = new ce(); - const f = yt.getInterpolation(no, hs, us, ds, Oa, Fa, za, u.uv1); - Ua || (u.uv1 = f), GS && (u.uv2 = u.uv1); + const f = bt.getInterpolation(no, hs, us, ds, Oa, Fa, za, u.uv1); + Ua || (u.uv1 = f), VS && (u.uv2 = u.uv1); } if (t) { - wp.fromBufferAttribute(t, r), Sp.fromBufferAttribute(t, o), Ep.fromBufferAttribute(t, a), u.normal = new P(); - const f = yt.getInterpolation(no, hs, us, ds, wp, Sp, Ep, u.normal); + Mp.fromBufferAttribute(t, r), wp.fromBufferAttribute(t, o), Sp.fromBufferAttribute(t, a), u.normal = new P(); + const f = bt.getInterpolation(no, hs, us, ds, Mp, wp, Sp, u.normal); u.normal.dot(s.direction) > 0 && u.normal.multiplyScalar(-1), Ua || (u.normal = f); } const d = { @@ -41758,14 +41786,14 @@ function Tp(s, e, t, n, i, r, o, a, l, c, h) { normal: new P(), materialIndex: 0 }; - if (yt.getNormal(hs, us, ds, d.normal), u.face = d, u.faceIndex = r, Ua) { + if (bt.getNormal(hs, us, ds, d.normal), u.face = d, u.faceIndex = r, Ua) { const f = new P(); - yt.getBarycoord(no, hs, us, ds, f), u.barycoord = f; + bt.getBarycoord(no, hs, us, ds, f), u.barycoord = f; } } return u; } -function Ap(s) { +function Tp(s) { return s && s.isMaterial ? s.side : s; } function Ul(s, e, t, n, i, r, o) { @@ -41779,7 +41807,7 @@ function Ul(s, e, t, n, i, r, o) { for (let b = 0, v = d.length; b < v; b++) { const { start: y, count: M, materialIndex: E } = d[b]; if (m >= y && m < y + M) { - const A = Ap(e[E]), R = Tp(t, f, p, g, x, l, c, h, A, r, o); + const A = Tp(e[E]), R = Ep(t, f, p, g, x, l, c, h, A, r, o); if (R) if (R.faceIndex = n, R.face.materialIndex = E, i) i.push(R); @@ -41788,7 +41816,7 @@ function Ul(s, e, t, n, i, r, o) { } } } else { - const m = Ap(e), b = Tp(t, f, p, g, x, l, c, h, m, r, o); + const m = Tp(e), b = Ep(t, f, p, g, x, l, c, h, m, r, o); if (b) if (b.faceIndex = n, b.face.materialIndex = 0, i) i.push(b); @@ -41802,12 +41830,12 @@ function zt(s, e, t, n) { let a = e, l = e + 1, c = e + 2; t && (a = t.getX(a), l = t.getX(l), c = t.getX(c)), i.x = n.getX(a), i.y = n.getY(a), i.z = n.getZ(a), r.x = n.getX(l), r.y = n.getY(l), r.z = n.getZ(l), o.x = n.getX(c), o.y = n.getY(c), o.z = n.getZ(c); } -function XS(s, e, t, n, i, r, o, a) { +function WS(s, e, t, n, i, r, o, a) { const { geometry: l, _indirectBuffer: c } = s; for (let h = n, u = n + i; h < u; h++) Ul(l, e, t, h, r, o, a); } -function jS(s, e, t, n, i, r, o) { +function XS(s, e, t, n, i, r, o) { const { geometry: a, _indirectBuffer: l } = s; let c = 1 / 0, h = null; for (let u = n, d = n + i; u < d; u++) { @@ -41816,7 +41844,7 @@ function jS(s, e, t, n, i, r, o) { } return h; } -function qS(s, e, t, n, i, r, o) { +function jS(s, e, t, n, i, r, o) { const { geometry: a } = t, { index: l } = a, c = a.attributes.position; for (let h = s, u = e + s; h < u; h++) { let d; @@ -41825,7 +41853,7 @@ function qS(s, e, t, n, i, r, o) { } return !1; } -function ZS(s, e = null) { +function qS(s, e = null) { e && Array.isArray(e) && (e = new Set(e)); const t = s.geometry, n = t.index ? t.index.array : null, i = t.attributes.position; let r, o, a, l, c = 0; @@ -41874,14 +41902,14 @@ function Ji(s, e, t, n, i) { let m = e[s], b = e[s + 3], v = e[s + 1], y = e[s + 3 + 1], M = e[s + 2], E = e[s + 3 + 2]; return u >= 0 ? (r = (m - p) * u, o = (b - p) * u) : (r = (b - p) * u, o = (m - p) * u), d >= 0 ? (a = (v - g) * d, l = (y - g) * d) : (a = (y - g) * d, l = (v - g) * d), r > l || a > o || ((a > r || isNaN(r)) && (r = a), (l < o || isNaN(o)) && (o = l), f >= 0 ? (c = (M - x) * f, h = (E - x) * f) : (c = (E - x) * f, h = (M - x) * f), r > h || c > o) ? !1 : ((c > r || r !== r) && (r = c), (h < o || o !== o) && (o = h), r <= i && o >= n); } -function YS(s, e, t, n, i, r, o, a) { +function ZS(s, e, t, n, i, r, o, a) { const { geometry: l, _indirectBuffer: c } = s; for (let h = n, u = n + i; h < u; h++) { let d = c ? c[h] : h; Ul(l, e, t, d, r, o, a); } } -function KS(s, e, t, n, i, r, o) { +function YS(s, e, t, n, i, r, o) { const { geometry: a, _indirectBuffer: l } = s; let c = 1 / 0, h = null; for (let u = n, d = n + i; u < d; u++) { @@ -41890,7 +41918,7 @@ function KS(s, e, t, n, i, r, o) { } return h; } -function $S(s, e, t, n, i, r, o) { +function KS(s, e, t, n, i, r, o) { const { geometry: a } = t, { index: l } = a, c = a.attributes.position; for (let h = s, u = e + s; h < u; h++) { let d; @@ -41899,38 +41927,38 @@ function $S(s, e, t, n, i, r, o) { } return !1; } -function JS(s, e, t, n, i, r, o) { - wt.setBuffer(s._roots[e]), mu(0, s, t, n, i, r, o), wt.clearBuffer(); +function $S(s, e, t, n, i, r, o) { + Mt.setBuffer(s._roots[e]), pu(0, s, t, n, i, r, o), Mt.clearBuffer(); } -function mu(s, e, t, n, i, r, o) { - const { float32Array: a, uint16Array: l, uint32Array: c } = wt, h = s * 2; +function pu(s, e, t, n, i, r, o) { + const { float32Array: a, uint16Array: l, uint32Array: c } = Mt, h = s * 2; if (qt(h, l)) { const u = Cn(s, c), d = kn(h, l); - XS(e, t, n, u, d, i, r, o); + WS(e, t, n, u, d, i, r, o); } else { const u = Kt(s); - Ji(u, a, n, r, o) && mu(u, e, t, n, i, r, o); + Ji(u, a, n, r, o) && pu(u, e, t, n, i, r, o); const d = $t(s, c); - Ji(d, a, n, r, o) && mu(d, e, t, n, i, r, o); + Ji(d, a, n, r, o) && pu(d, e, t, n, i, r, o); } } -const QS = ["x", "y", "z"]; -function eE(s, e, t, n, i, r) { - wt.setBuffer(s._roots[e]); - const o = gu(0, s, t, n, i, r); - return wt.clearBuffer(), o; +const JS = ["x", "y", "z"]; +function QS(s, e, t, n, i, r) { + Mt.setBuffer(s._roots[e]); + const o = mu(0, s, t, n, i, r); + return Mt.clearBuffer(), o; } -function gu(s, e, t, n, i, r) { - const { float32Array: o, uint16Array: a, uint32Array: l } = wt; +function mu(s, e, t, n, i, r) { + const { float32Array: o, uint16Array: a, uint32Array: l } = Mt; let c = s * 2; if (qt(c, a)) { const h = Cn(s, l), u = kn(c, a); - return jS(e, t, n, h, u, i, r); + return XS(e, t, n, h, u, i, r); } else { - const h = Ju(s, l), u = QS[h], d = n.direction[u] >= 0; + const h = $u(s, l), u = JS[h], d = n.direction[u] >= 0; let f, p; d ? (f = Kt(s), p = $t(s, l)) : (f = $t(s, l), p = Kt(s)); - const g = Ji(f, o, n, i, r) ? gu(f, e, t, n, i, r) : null; + const g = Ji(f, o, n, i, r) ? mu(f, e, t, n, i, r) : null; if (g) { const m = g.point[u]; if (d ? m <= o[p + h] : ( @@ -41939,20 +41967,20 @@ function gu(s, e, t, n, i, r) { )) return g; } - const x = Ji(p, o, n, i, r) ? gu(p, e, t, n, i, r) : null; + const x = Ji(p, o, n, i, r) ? mu(p, e, t, n, i, r) : null; return g && x ? g.distance <= x.distance ? g : x : g || x || null; } } -const Ha = /* @__PURE__ */ new vt(), ir = /* @__PURE__ */ new Vn(), sr = /* @__PURE__ */ new Vn(), io = /* @__PURE__ */ new ze(), Cp = /* @__PURE__ */ new dn(), Va = /* @__PURE__ */ new dn(); -function tE(s, e, t, n) { - wt.setBuffer(s._roots[e]); - const i = xu(0, s, t, n); - return wt.clearBuffer(), i; +const Ha = /* @__PURE__ */ new vt(), ir = /* @__PURE__ */ new Vn(), sr = /* @__PURE__ */ new Vn(), io = /* @__PURE__ */ new ze(), Ap = /* @__PURE__ */ new dn(), Va = /* @__PURE__ */ new dn(); +function eE(s, e, t, n) { + Mt.setBuffer(s._roots[e]); + const i = gu(0, s, t, n); + return Mt.clearBuffer(), i; } -function xu(s, e, t, n, i = null) { - const { float32Array: r, uint16Array: o, uint32Array: a } = wt; +function gu(s, e, t, n, i = null) { + const { float32Array: r, uint16Array: o, uint32Array: a } = Mt; let l = s * 2; - if (i === null && (t.boundingBox || t.computeBoundingBox(), Cp.set(t.boundingBox.min, t.boundingBox.max, n), i = Cp), qt(l, o)) { + if (i === null && (t.boundingBox || t.computeBoundingBox(), Ap.set(t.boundingBox.min, t.boundingBox.max, n), i = Ap), qt(l, o)) { const c = e.geometry, h = c.index, u = c.attributes.position, d = t.index, f = t.attributes.position, p = Cn(s, a), g = kn(l, o); if (io.copy(n).invert(), t.boundsTree) return It(s, r, Va), Va.matrix.copy(io), Va.needsUpdate = !0, t.boundsTree.shapecast({ @@ -41976,15 +42004,15 @@ function xu(s, e, t, n, i = null) { } } else { const c = Kt(s), h = $t(s, a); - return It(c, r, Ha), !!(i.intersectsBox(Ha) && xu(c, e, t, n, i) || (It(h, r, Ha), i.intersectsBox(Ha) && xu(h, e, t, n, i))); + return It(c, r, Ha), !!(i.intersectsBox(Ha) && gu(c, e, t, n, i) || (It(h, r, Ha), i.intersectsBox(Ha) && gu(h, e, t, n, i))); } } -const Ga = /* @__PURE__ */ new ze(), zc = /* @__PURE__ */ new dn(), so = /* @__PURE__ */ new dn(), nE = /* @__PURE__ */ new P(), iE = /* @__PURE__ */ new P(), sE = /* @__PURE__ */ new P(), rE = /* @__PURE__ */ new P(); -function oE(s, e, t, n = {}, i = {}, r = 0, o = 1 / 0) { +const Ga = /* @__PURE__ */ new ze(), zc = /* @__PURE__ */ new dn(), so = /* @__PURE__ */ new dn(), tE = /* @__PURE__ */ new P(), nE = /* @__PURE__ */ new P(), iE = /* @__PURE__ */ new P(), sE = /* @__PURE__ */ new P(); +function rE(s, e, t, n = {}, i = {}, r = 0, o = 1 / 0) { e.boundingBox || e.computeBoundingBox(), zc.set(e.boundingBox.min, e.boundingBox.max, t), zc.needsUpdate = !0; const a = s.geometry, l = a.attributes.position, c = a.index, h = e.attributes.position, u = e.index, d = Nn.getPrimitive(), f = Nn.getPrimitive(); - let p = nE, g = iE, x = null, m = null; - i && (x = sE, m = rE); + let p = tE, g = nE, x = null, m = null; + i && (x = iE, m = sE); let b = 1 / 0, v = null, y = null; return Ga.copy(t).invert(), so.matrix.copy(Ga), s.shapecast( { @@ -42023,7 +42051,7 @@ function oE(s, e, t, n = {}, i = {}, r = 0, o = 1 / 0) { } ), Nn.releasePrimitive(d), Nn.releasePrimitive(f), b === 1 / 0 ? null : (n.point ? n.point.copy(g) : n.point = g.clone(), n.distance = b, n.faceIndex = v, i && (i.point ? i.point.copy(m) : i.point = m.clone(), i.point.applyMatrix4(Ga), g.applyMatrix4(Ga), i.distance = g.sub(i.point).length(), i.faceIndex = y), n); } -function aE(s, e = null) { +function oE(s, e = null) { e && Array.isArray(e) && (e = new Set(e)); const t = s.geometry, n = t.index ? t.index.array : null, i = t.attributes.position; let r, o, a, l, c = 0; @@ -42070,38 +42098,38 @@ function aE(s, e = null) { } } } -function lE(s, e, t, n, i, r, o) { - wt.setBuffer(s._roots[e]), vu(0, s, t, n, i, r, o), wt.clearBuffer(); +function aE(s, e, t, n, i, r, o) { + Mt.setBuffer(s._roots[e]), xu(0, s, t, n, i, r, o), Mt.clearBuffer(); } -function vu(s, e, t, n, i, r, o) { - const { float32Array: a, uint16Array: l, uint32Array: c } = wt, h = s * 2; +function xu(s, e, t, n, i, r, o) { + const { float32Array: a, uint16Array: l, uint32Array: c } = Mt, h = s * 2; if (qt(h, l)) { const u = Cn(s, c), d = kn(h, l); - YS(e, t, n, u, d, i, r, o); + ZS(e, t, n, u, d, i, r, o); } else { const u = Kt(s); - Ji(u, a, n, r, o) && vu(u, e, t, n, i, r, o); + Ji(u, a, n, r, o) && xu(u, e, t, n, i, r, o); const d = $t(s, c); - Ji(d, a, n, r, o) && vu(d, e, t, n, i, r, o); + Ji(d, a, n, r, o) && xu(d, e, t, n, i, r, o); } } -const cE = ["x", "y", "z"]; -function hE(s, e, t, n, i, r) { - wt.setBuffer(s._roots[e]); - const o = bu(0, s, t, n, i, r); - return wt.clearBuffer(), o; +const lE = ["x", "y", "z"]; +function cE(s, e, t, n, i, r) { + Mt.setBuffer(s._roots[e]); + const o = vu(0, s, t, n, i, r); + return Mt.clearBuffer(), o; } -function bu(s, e, t, n, i, r) { - const { float32Array: o, uint16Array: a, uint32Array: l } = wt; +function vu(s, e, t, n, i, r) { + const { float32Array: o, uint16Array: a, uint32Array: l } = Mt; let c = s * 2; if (qt(c, a)) { const h = Cn(s, l), u = kn(c, a); - return KS(e, t, n, h, u, i, r); + return YS(e, t, n, h, u, i, r); } else { - const h = Ju(s, l), u = cE[h], d = n.direction[u] >= 0; + const h = $u(s, l), u = lE[h], d = n.direction[u] >= 0; let f, p; d ? (f = Kt(s), p = $t(s, l)) : (f = $t(s, l), p = Kt(s)); - const g = Ji(f, o, n, i, r) ? bu(f, e, t, n, i, r) : null; + const g = Ji(f, o, n, i, r) ? vu(f, e, t, n, i, r) : null; if (g) { const m = g.point[u]; if (d ? m <= o[p + h] : ( @@ -42110,20 +42138,20 @@ function bu(s, e, t, n, i, r) { )) return g; } - const x = Ji(p, o, n, i, r) ? bu(p, e, t, n, i, r) : null; + const x = Ji(p, o, n, i, r) ? vu(p, e, t, n, i, r) : null; return g && x ? g.distance <= x.distance ? g : x : g || x || null; } } -const Wa = /* @__PURE__ */ new vt(), rr = /* @__PURE__ */ new Vn(), or = /* @__PURE__ */ new Vn(), ro = /* @__PURE__ */ new ze(), Pp = /* @__PURE__ */ new dn(), Xa = /* @__PURE__ */ new dn(); -function uE(s, e, t, n) { - wt.setBuffer(s._roots[e]); - const i = yu(0, s, t, n); - return wt.clearBuffer(), i; +const Wa = /* @__PURE__ */ new vt(), rr = /* @__PURE__ */ new Vn(), or = /* @__PURE__ */ new Vn(), ro = /* @__PURE__ */ new ze(), Cp = /* @__PURE__ */ new dn(), Xa = /* @__PURE__ */ new dn(); +function hE(s, e, t, n) { + Mt.setBuffer(s._roots[e]); + const i = bu(0, s, t, n); + return Mt.clearBuffer(), i; } -function yu(s, e, t, n, i = null) { - const { float32Array: r, uint16Array: o, uint32Array: a } = wt; +function bu(s, e, t, n, i = null) { + const { float32Array: r, uint16Array: o, uint32Array: a } = Mt; let l = s * 2; - if (i === null && (t.boundingBox || t.computeBoundingBox(), Pp.set(t.boundingBox.min, t.boundingBox.max, n), i = Pp), qt(l, o)) { + if (i === null && (t.boundingBox || t.computeBoundingBox(), Cp.set(t.boundingBox.min, t.boundingBox.max, n), i = Cp), qt(l, o)) { const c = e.geometry, h = c.index, u = c.attributes.position, d = t.index, f = t.attributes.position, p = Cn(s, a), g = kn(l, o); if (ro.copy(n).invert(), t.boundsTree) return It(s, r, Xa), Xa.matrix.copy(ro), Xa.needsUpdate = !0, t.boundsTree.shapecast({ @@ -42148,15 +42176,15 @@ function yu(s, e, t, n, i = null) { } } else { const c = Kt(s), h = $t(s, a); - return It(c, r, Wa), !!(i.intersectsBox(Wa) && yu(c, e, t, n, i) || (It(h, r, Wa), i.intersectsBox(Wa) && yu(h, e, t, n, i))); + return It(c, r, Wa), !!(i.intersectsBox(Wa) && bu(c, e, t, n, i) || (It(h, r, Wa), i.intersectsBox(Wa) && bu(h, e, t, n, i))); } } -const ja = /* @__PURE__ */ new ze(), Hc = /* @__PURE__ */ new dn(), oo = /* @__PURE__ */ new dn(), dE = /* @__PURE__ */ new P(), fE = /* @__PURE__ */ new P(), pE = /* @__PURE__ */ new P(), mE = /* @__PURE__ */ new P(); -function gE(s, e, t, n = {}, i = {}, r = 0, o = 1 / 0) { +const ja = /* @__PURE__ */ new ze(), Hc = /* @__PURE__ */ new dn(), oo = /* @__PURE__ */ new dn(), uE = /* @__PURE__ */ new P(), dE = /* @__PURE__ */ new P(), fE = /* @__PURE__ */ new P(), pE = /* @__PURE__ */ new P(); +function mE(s, e, t, n = {}, i = {}, r = 0, o = 1 / 0) { e.boundingBox || e.computeBoundingBox(), Hc.set(e.boundingBox.min, e.boundingBox.max, t), Hc.needsUpdate = !0; const a = s.geometry, l = a.attributes.position, c = a.index, h = e.attributes.position, u = e.index, d = Nn.getPrimitive(), f = Nn.getPrimitive(); - let p = dE, g = fE, x = null, m = null; - i && (x = pE, m = mE); + let p = uE, g = dE, x = null, m = null; + i && (x = fE, m = pE); let b = 1 / 0, v = null, y = null; return ja.copy(t).invert(), oo.matrix.copy(ja), s.shapecast( { @@ -42199,12 +42227,12 @@ function gE(s, e, t, n = {}, i = {}, r = 0, o = 1 / 0) { } ), Nn.releasePrimitive(d), Nn.releasePrimitive(f), b === 1 / 0 ? null : (n.point ? n.point.copy(g) : n.point = g.clone(), n.distance = b, n.faceIndex = v, i && (i.point ? i.point.copy(m) : i.point = m.clone(), i.point.applyMatrix4(ja), g.applyMatrix4(ja), i.distance = g.sub(i.point).length(), i.faceIndex = y), n); } -function xE() { +function gE() { return typeof SharedArrayBuffer < "u"; } -const yo = /* @__PURE__ */ new wt.constructor(), wl = /* @__PURE__ */ new wt.constructor(), Wi = /* @__PURE__ */ new $u(() => new vt()), ar = /* @__PURE__ */ new vt(), lr = /* @__PURE__ */ new vt(), Vc = /* @__PURE__ */ new vt(), Gc = /* @__PURE__ */ new vt(); +const yo = /* @__PURE__ */ new Mt.constructor(), wl = /* @__PURE__ */ new Mt.constructor(), Wi = /* @__PURE__ */ new Ku(() => new vt()), ar = /* @__PURE__ */ new vt(), lr = /* @__PURE__ */ new vt(), Vc = /* @__PURE__ */ new vt(), Gc = /* @__PURE__ */ new vt(); let Wc = !1; -function vE(s, e, t, n) { +function xE(s, e, t, n) { if (Wc) throw new Error("MeshBVH: Recursive calls to bvhcast not supported."); Wc = !0; @@ -42416,8 +42444,8 @@ function qn(s, e, t, n, i, r = 0, o = 0, a = 0, l = 0, c = null, h = !1) { } return A; } -const qa = /* @__PURE__ */ new dn(), Rp = /* @__PURE__ */ new vt(), bE = { - strategy: D0, +const qa = /* @__PURE__ */ new dn(), Pp = /* @__PURE__ */ new vt(), vE = { + strategy: L0, maxDepth: 40, maxLeafTris: 10, useSharedArrayBuffer: !1, @@ -42427,7 +42455,7 @@ const qa = /* @__PURE__ */ new dn(), Rp = /* @__PURE__ */ new vt(), bE = { verbose: !0, range: null }; -class Qu { +class Ju { static serialize(e, t = {}) { t = { cloneBuffers: !0, @@ -42451,7 +42479,7 @@ class Qu { e.version || (console.warn( "MeshBVH.deserialize: Serialization format has been changed and will be fixed up. It is recommended to regenerate any stored serialized data." ), l(r)); - const a = new Qu(t, { ...n, [kc]: !0 }); + const a = new Ju(t, { ...n, [kc]: !0 }); if (a._roots = r, a._indirectBuffer = o || null, n.setIndex) { const c = t.getIndex(); if (c === null) { @@ -42479,13 +42507,13 @@ class Qu { throw new Error("MeshBVH: InterleavedBufferAttribute is not supported for the index attribute."); } else throw new Error("MeshBVH: Only BufferGeometries are supported."); if (t = Object.assign({ - ...bE, + ...vE, // undocumented options // Whether to skip generating the tree. Used for deserialization. [kc]: !1 - }, t), t.useSharedArrayBuffer && !xE()) + }, t), t.useSharedArrayBuffer && !gE()) throw new Error("MeshBVH: SharedArrayBuffer is not available."); - this.geometry = e, this._roots = null, this._indirectBuffer = null, t[kc] || (NS(this, t), !e.boundingBox && t.setBoundingBox && (e.boundingBox = this.getBoundingBox(new vt()))), this.resolveTriangleIndex = t.indirect ? (n) => this._indirectBuffer[n] : (n) => n; + this.geometry = e, this._roots = null, this._indirectBuffer = null, t[kc] || (BS(this, t), !e.boundingBox && t.setBoundingBox && (e.boundingBox = this.getBoundingBox(new vt()))), this.resolveTriangleIndex = t.indirect ? (n) => this._indirectBuffer[n] : (n) => n; } shiftTriangleOffsets(e) { const t = this._indirectBuffer; @@ -42504,7 +42532,7 @@ class Qu { } } refit(e = null) { - return (this.indirect ? aE : ZS)(this, e); + return (this.indirect ? oE : qS)(this, e); } traverse(e, t = 0) { const n = this._roots[t], i = new Uint32Array(n), r = new Uint16Array(n); @@ -42515,14 +42543,14 @@ class Qu { const u = i[a + 6], d = r[c + 14]; e(l, h, new Float32Array(n, a * 4, 6), u, d); } else { - const u = Kt(a), d = $t(a, i), f = Ju(a, i); + const u = Kt(a), d = $t(a, i), f = $u(a, i); e(l, h, new Float32Array(n, a * 4, 6), f) || (o(u, l + 1), o(d, l + 1)); } } } /* Core Cast Functions */ raycast(e, t = Fn, n = 0, i = 1 / 0) { - const r = this._roots, o = [], a = this.indirect ? lE : JS; + const r = this._roots, o = [], a = this.indirect ? aE : $S; for (let l = 0, c = r.length; l < c; l++) a(this, l, t, e, o, n, i); return o; @@ -42530,7 +42558,7 @@ class Qu { raycastFirst(e, t = Fn, n = 0, i = 1 / 0) { const r = this._roots; let o = null; - const a = this.indirect ? hE : eE; + const a = this.indirect ? cE : QS; for (let l = 0, c = r.length; l < c; l++) { const h = a(this, l, t, e, n, i); h != null && (o == null || h.distance < o.distance) && (o = h); @@ -42539,13 +42567,13 @@ class Qu { } intersectsGeometry(e, t) { let n = !1; - const i = this._roots, r = this.indirect ? uE : tE; + const i = this._roots, r = this.indirect ? hE : eE; for (let o = 0, a = i.length; o < a && (n = r(this, o, e, t), !n); o++) ; return n; } shapecast(e) { - const t = Nn.getPrimitive(), n = this.indirect ? $S : qS; + const t = Nn.getPrimitive(), n = this.indirect ? KS : jS; let { boundsTraverseOrder: i, intersectsBounds: r, @@ -42560,7 +42588,7 @@ class Qu { const h = this._roots; for (let u = 0, d = h.length; u < d; u++) { const f = h[u]; - if (l = HS(this, u, r, o, i, c), l) + if (l = zS(this, u, r, o, i, c), l) break; c += f.byteLength / hn; } @@ -42600,7 +42628,7 @@ class Qu { } else i = p; } - return vE(this, e, t, i); + return xE(this, e, t, i); } /* Derived Cast Functions */ intersectsBox(e, t) { @@ -42620,7 +42648,7 @@ class Qu { ); } closestPointToGeometry(e, t, n = {}, i = {}, r = 0, o = 1 / 0) { - return (this.indirect ? gE : oE)( + return (this.indirect ? mE : rE)( this, e, t, @@ -42631,7 +42659,7 @@ class Qu { ); } closestPointToPoint(e, t = {}, n = 0, i = 1 / 0) { - return VS( + return HS( this, e, t, @@ -42641,69 +42669,69 @@ class Qu { } getBoundingBox(e) { return e.makeEmpty(), this._roots.forEach((t) => { - It(0, new Float32Array(t), Rp), e.union(Rp); + It(0, new Float32Array(t), Pp), e.union(Pp); }), e; } } -const U0 = 1e-6, yE = U0 * 0.5, O0 = Math.pow(10, -Math.log10(U0)), _E = yE * O0; +const k0 = 1e-6, bE = k0 * 0.5, U0 = Math.pow(10, -Math.log10(k0)), yE = bE * U0; function ci(s) { - return ~~(s * O0 + _E); + return ~~(s * U0 + yE); } -function ME(s) { +function _E(s) { return `${ci(s.x)},${ci(s.y)}`; } -function Lp(s) { +function Rp(s) { return `${ci(s.x)},${ci(s.y)},${ci(s.z)}`; } -function wE(s) { +function ME(s) { return `${ci(s.x)},${ci(s.y)},${ci(s.z)},${ci(s.w)}`; } -function SE(s, e, t) { +function wE(s, e, t) { t.direction.subVectors(e, s).normalize(); const n = s.dot(t.direction); return t.origin.copy(s).addScaledVector(t.direction, -n), t; } -function F0() { +function O0() { return typeof SharedArrayBuffer < "u"; } -function EE(s) { +function SE(s) { if (s.buffer instanceof SharedArrayBuffer) return s; const e = s.constructor, t = s.buffer, n = new SharedArrayBuffer(t.byteLength), i = new Uint8Array(t); return new Uint8Array(n).set(i, 0), new e(n); } -function TE(s, e = ArrayBuffer) { +function EE(s, e = ArrayBuffer) { return s > 65535 ? new Uint32Array(new e(4 * s)) : new Uint16Array(new e(2 * s)); } -function AE(s, e) { +function TE(s, e) { if (!s.index) { - const t = s.attributes.position.count, n = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, i = TE(t, n); + const t = s.attributes.position.count, n = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, i = EE(t, n); s.setIndex(new at(i, 1)); for (let r = 0; r < t; r++) i[r] = r; } } -function CE(s) { +function AE(s) { return s.index ? s.index.count : s.attributes.position.count; } -function ed(s) { - return CE(s) / 3; +function Qu(s) { + return AE(s) / 3; } -const PE = 1e-8, RE = new P(); -function LE(s) { +const CE = 1e-8, PE = new P(); +function RE(s) { return ~~(s / 3); } -function DE(s) { +function LE(s) { return s % 3; } -function Dp(s, e) { +function Lp(s, e) { return s.start - e.start; } -function Ip(s, e) { - return RE.subVectors(e, s.origin).dot(s.direction); +function Dp(s, e) { + return PE.subVectors(e, s.origin).dot(s.direction); } -function IE(s, e, t, n = PE) { - s.sort(Dp), e.sort(Dp); +function DE(s, e, t, n = CE) { + s.sort(Lp), e.sort(Lp); for (let a = 0; a < s.length; a++) { const l = s[a]; for (let c = 0; c < e.length; c++) { @@ -42750,8 +42778,8 @@ function IE(s, e, t, n = PE) { return Math.abs(a.end - a.start) < n; } } -const Bp = 1e-5, Np = 1e-4; -class BE { +const Ip = 1e-5, Bp = 1e-4; +class IE { constructor() { this._rays = []; } @@ -42771,40 +42799,40 @@ class BE { } return r; function o(l, c) { - const h = l.origin.distanceTo(c.origin) > Bp; - return l.direction.angleTo(c.direction) > Np || h; + const h = l.origin.distanceTo(c.origin) > Ip; + return l.direction.angleTo(c.direction) > Bp || h; } function a(l, c) { const h = l.origin.distanceTo(c.origin), u = l.direction.angleTo(c.direction); - return h / Bp + u / Np; + return h / Ip + u / Bp; } } } const Xc = new P(), jc = new P(), Za = new Qi(); -function NE(s, e, t) { - const n = s.attributes, i = s.index, r = n.position, o = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), l = Array.from(e), c = new BE(); +function BE(s, e, t) { + const n = s.attributes, i = s.index, r = n.position, o = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), l = Array.from(e), c = new IE(); for (let h = 0, u = l.length; h < u; h++) { - const d = l[h], f = LE(d), p = DE(d); + const d = l[h], f = RE(d), p = LE(d); let g = 3 * f + p, x = 3 * f + (p + 1) % 3; - i && (g = i.getX(g), x = i.getX(x)), Xc.fromBufferAttribute(r, g), jc.fromBufferAttribute(r, x), SE(Xc, jc, Za); + i && (g = i.getX(g), x = i.getX(x)), Xc.fromBufferAttribute(r, g), jc.fromBufferAttribute(r, x), wE(Xc, jc, Za); let m, b = c.findClosestRay(Za); b === null && (b = Za.clone(), c.addRay(b)), a.has(b) || a.set(b, { forward: [], reverse: [], ray: b }), m = a.get(b); - let v = Ip(b, Xc), y = Ip(b, jc); + let v = Dp(b, Xc), y = Dp(b, jc); v > y && ([v, y] = [y, v]), Za.direction.dot(b.direction) < 0 ? m.reverse.push({ start: v, end: y, index: d }) : m.forward.push({ start: v, end: y, index: d }); } return a.forEach(({ forward: h, reverse: u }, d) => { - IE(h, u, o, t), h.length === 0 && u.length === 0 && a.delete(d); + DE(h, u, o, t), h.length === 0 && u.length === 0 && a.delete(d); }), { disjointConnectivityMap: o, fragmentMap: a }; } -const kE = new ce(), qc = new P(), UE = new tt(), Zc = ["", "", ""]; -class OE { +const NE = new ce(), qc = new P(), kE = new tt(), Zc = ["", "", ""]; +class UE { constructor(e = null) { this.data = null, this.disjointConnections = null, this.unmatchedDisjointEdges = null, this.unmatchedEdges = -1, this.matchedEdges = -1, this.useDrawRange = !0, this.useAllAttributes = !1, this.matchDisjointEdges = !1, this.degenerateEpsilon = 1e-8, e && this.updateFrom(e); } @@ -42829,7 +42857,7 @@ class OE { } updateFrom(e) { const { useAllAttributes: t, useDrawRange: n, matchDisjointEdges: i, degenerateEpsilon: r } = this, o = t ? v : b, a = /* @__PURE__ */ new Map(), { attributes: l } = e, c = t ? Object.keys(l) : null, h = e.index, u = l.position; - let d = ed(e); + let d = Qu(e); const f = d; let p = 0; n && (p = e.drawRange.start, e.drawRange.count !== 1 / 0 && (d = ~~(e.drawRange.count / 3))); @@ -42857,14 +42885,14 @@ class OE { const { fragmentMap: y, disjointConnectivityMap: M - } = NE(e, m, r); + } = BE(e, m, r); m.clear(), y.forEach(({ forward: E, reverse: A }) => { E.forEach(({ index: R }) => m.add(R)), A.forEach(({ index: R }) => m.add(R)); }), this.unmatchedDisjointEdges = y, this.disjointConnections = M, x = d * 3 - m.size; } this.matchedEdges = x, this.unmatchedEdges = m.size, this.data = g; function b(y) { - return qc.fromBufferAttribute(u, y), Lp(qc); + return qc.fromBufferAttribute(u, y), Rp(qc); } function v(y) { let M = ""; @@ -42876,13 +42904,13 @@ class OE { _ = ci(R.getX(y)); break; case 2: - _ = ME(kE.fromBufferAttribute(R, y)); + _ = _E(NE.fromBufferAttribute(R, y)); break; case 3: - _ = Lp(qc.fromBufferAttribute(R, y)); + _ = Rp(qc.fromBufferAttribute(R, y)); break; case 4: - _ = wE(UE.fromBufferAttribute(R, y)); + _ = ME(kE.fromBufferAttribute(R, y)); break; } M !== "" && (M += "|"), M += _; @@ -42906,16 +42934,16 @@ class Sl extends dt { return !1; } prepareGeometry() { - const e = this.geometry, t = e.attributes, n = F0(); + const e = this.geometry, t = e.attributes, n = O0(); if (n) for (const i in t) { const r = t[i]; if (r.isInterleavedBufferAttribute) throw new Error("Brush: InterleavedBufferAttributes are not supported."); - r.array = EE(r.array); + r.array = SE(r.array); } - if (e.boundsTree || (AE(e, { useSharedArrayBuffer: n }), e.boundsTree = new Qu(e, { maxLeafTris: 3, indirect: !0, useSharedArrayBuffer: n })), e.halfEdges || (e.halfEdges = new OE(e)), !e.groupIndices) { - const i = ed(e), r = new Uint16Array(i), o = e.groups; + if (e.boundsTree || (TE(e, { useSharedArrayBuffer: n }), e.boundsTree = new Ju(e, { maxLeafTris: 3, indirect: !0, useSharedArrayBuffer: n })), e.halfEdges || (e.halfEdges = new UE(e)), !e.groupIndices) { + const i = Qu(e), r = new Uint16Array(i), o = e.groups; for (let a = 0, l = o.length; a < l; a++) { const { start: c, count: h } = o[a]; for (let u = c / 3, d = (c + h) / 3; u < d; u++) @@ -42929,19 +42957,19 @@ class Sl extends dt { e.halfEdges = null, e.boundsTree = null, e.groupIndices = null; } } -const FE = 1e-14, Yc = new P(), kp = new P(), Up = new P(); -function ji(s, e = FE) { - Yc.subVectors(s.b, s.a), kp.subVectors(s.c, s.a), Up.subVectors(s.b, s.c); - const t = Yc.angleTo(kp), n = Yc.angleTo(Up), i = Math.PI - t - n; +const OE = 1e-14, Yc = new P(), Np = new P(), kp = new P(); +function ji(s, e = OE) { + Yc.subVectors(s.b, s.a), Np.subVectors(s.c, s.a), kp.subVectors(s.b, s.c); + const t = Yc.angleTo(Np), n = Yc.angleTo(kp), i = Math.PI - t - n; return Math.abs(t) < e || Math.abs(n) < e || Math.abs(i) < e || s.a.distanceToSquared(s.b) < e || s.a.distanceToSquared(s.c) < e || s.b.distanceToSquared(s.c) < e; } -const Kc = 1e-10, ao = 1e-10, zE = 1e-10, _i = new Hn(), kt = new Hn(), Mi = new P(), $c = new P(), Op = new P(), Ya = new Mt(), Jc = new Vn(); -class HE { +const Kc = 1e-10, ao = 1e-10, FE = 1e-10, _i = new Hn(), kt = new Hn(), Mi = new P(), $c = new P(), Up = new P(), Ya = new _t(), Jc = new Vn(); +class zE { constructor() { this._pool = [], this._index = 0; } getTriangle() { - return this._index >= this._pool.length && this._pool.push(new yt()), this._pool[this._index++]; + return this._index >= this._pool.length && this._pool.push(new bt()), this._pool[this._index++]; } clear() { this._index = 0; @@ -42950,9 +42978,9 @@ class HE { this._pool.length = 0, this._index = 0; } } -class VE { +class HE { constructor() { - this.trianglePool = new HE(), this.triangles = [], this.normal = new P(), this.coplanarTriangleUsed = !1; + this.trianglePool = new zE(), this.triangles = [], this.normal = new P(), this.coplanarTriangleUsed = !1; } // initialize the class with a triangle initialize(e) { @@ -42978,7 +43006,7 @@ class VE { // coplanar it will attempt to split by the triangle edge planes splitByTriangle(e) { const { normal: t, triangles: n } = this; - if (e.getNormal($c).normalize(), Math.abs(1 - Math.abs($c.dot(t))) < zE) { + if (e.getNormal($c).normalize(), Math.abs(1 - Math.abs($c.dot(t))) < FE) { this.coplanarTriangleUsed = !0; for (let r = 0, o = n.length; r < o; r++) { const a = n[r]; @@ -42987,7 +43015,7 @@ class VE { const i = [e.a, e.b, e.c]; for (let r = 0; r < 3; r++) { const o = (r + 1) % 3, a = i[r], l = i[o]; - Mi.subVectors(l, a).normalize(), Op.crossVectors($c, Mi), Ya.setFromNormalAndCoplanarPoint(Op, a), this.splitByPlane(Ya, e); + Mi.subVectors(l, a).normalize(), Up.crossVectors($c, Mi), Ya.setFromNormalAndCoplanarPoint(Up, a), this.splitByPlane(Ya, e); } } else e.getPlane(Ya), this.splitByPlane(Ya, e); @@ -43042,10 +43070,10 @@ class VE { this.triangles.length = 0, this.trianglePool.clear(), this.coplanarTriangleUsed = !1; } } -function GE(s) { +function VE(s) { return s = ~~s, s + 4 - s % 4; } -class Fp { +class Op { constructor(e, t = 500) { this.expansionFactor = 1.5, this.type = e, this.length = 0, this.array = null, this.setSize(t); } @@ -43058,7 +43086,7 @@ class Fp { setSize(e) { if (this.array && e === this.array.length) return; - const t = this.type, n = F0() ? SharedArrayBuffer : ArrayBuffer, i = new t(new n(GE(e * t.BYTES_PER_ELEMENT))); + const t = this.type, n = O0() ? SharedArrayBuffer : ArrayBuffer, i = new t(new n(VE(e * t.BYTES_PER_ELEMENT))); this.array && i.set(this.array, 0), this.array = i; } expand() { @@ -43076,7 +43104,7 @@ class Fp { this.length = 0; } } -class WE { +class GE { constructor() { this.groupAttributes = [{}], this.groupCount = 0; } @@ -43115,7 +43143,7 @@ class WE { const i = {}; t.push(i); for (const r in n) { - const o = n[r], a = new Fp(o.type); + const o = n[r], a = new Op(o.type); a.itemSize = o.itemSize, a.normalized = o.normalized, i[r] = a; } } @@ -43139,7 +43167,7 @@ class WE { } } else for (let a = 0, l = r.length; a < l; a++) { - const c = new Fp(t); + const c = new Op(t); c.itemSize = n, c.normalized = i, r[a][e] = c; } } @@ -43163,7 +43191,7 @@ class WE { this.groupAttributes = [], this.groupCount = 0; } } -class zp { +class Fp { constructor() { this.intersectionSet = {}, this.ids = []; } @@ -43172,17 +43200,17 @@ class zp { n[e] || (n[e] = [], i.push(e)), n[e].push(t); } } -const XE = 0, jE = 1, qE = 2, z0 = 3, ZE = 4, H0 = 5, V0 = 6, Bn = new Qi(), Hp = new ze(), ln = new yt(), wi = new P(), Vp = new tt(), Gp = new tt(), Wp = new tt(), Qc = new tt(), Ka = new tt(), $a = new tt(), Xp = new Hn(), eh = new P(), th = 1e-8, YE = 1e-15, gs = -1, xs = 1, ul = -2, dl = 2, _o = 0, fs = 1, td = 2, KE = 1e-14; +const WE = 0, XE = 1, jE = 2, F0 = 3, qE = 4, z0 = 5, H0 = 6, Bn = new Qi(), zp = new ze(), ln = new bt(), wi = new P(), Hp = new tt(), Vp = new tt(), Gp = new tt(), Qc = new tt(), Ka = new tt(), $a = new tt(), Wp = new Hn(), eh = new P(), th = 1e-8, ZE = 1e-15, gs = -1, xs = 1, ul = -2, dl = 2, _o = 0, fs = 1, ed = 2, YE = 1e-14; let fl = null; -function jp(s) { +function Xp(s) { fl = s; } -function G0(s, e) { +function V0(s, e) { s.getMidpoint(Bn.origin), s.getNormal(Bn.direction); const t = e.raycastFirst(Bn, At); return t && Bn.direction.dot(t.face.normal) > 0 ? gs : xs; } -function $E(s, e) { +function KE(s, e) { function t() { return Math.random() - 0.5; } @@ -43192,87 +43220,87 @@ function $E(s, e) { for (let o = 0; o < n; o++) { Bn.direction.x += t() * th, Bn.direction.y += t() * th, Bn.direction.z += t() * th, Bn.direction.multiplyScalar(-1); const a = e.raycastFirst(Bn, At); - if (a && Bn.direction.dot(a.face.normal) > 0 && i++, a !== null && (r = Math.min(r, a.distance)), r <= YE) + if (a && Bn.direction.dot(a.face.normal) > 0 && i++, a !== null && (r = Math.min(r, a.distance)), r <= ZE) return a.face.normal.dot(eh) > 0 ? dl : ul; if (i / n > 0.5 || (o - i + 1) / n > 0.5) break; } return i / n > 0.5 ? gs : xs; } -function JE(s, e) { - const t = new zp(), n = new zp(); - return Hp.copy(s.matrixWorld).invert().multiply(e.matrixWorld), s.geometry.boundsTree.bvhcast(e.geometry.boundsTree, Hp, { +function $E(s, e) { + const t = new Fp(), n = new Fp(); + return zp.copy(s.matrixWorld).invert().multiply(e.matrixWorld), s.geometry.boundsTree.bvhcast(e.geometry.boundsTree, zp, { intersectsTriangles(i, r, o, a) { if (!ji(i) && !ji(r)) { - let l = i.intersectsTriangle(r, Xp, !0); + let l = i.intersectsTriangle(r, Wp, !0); if (!l) { const c = i.plane, h = r.plane, u = c.normal, d = h.normal; - u.dot(d) === 1 && Math.abs(c.constant - h.constant) < KE && (l = !0); + u.dot(d) === 1 && Math.abs(c.constant - h.constant) < YE && (l = !0); } if (l) { let c = s.geometry.boundsTree.resolveTriangleIndex(o), h = e.geometry.boundsTree.resolveTriangleIndex(a); - t.add(c, h), n.add(h, c), fl && (fl.addEdge(Xp), fl.addIntersectingTriangles(o, i, a, r)); + t.add(c, h), n.add(h, c), fl && (fl.addEdge(Wp), fl.addIntersectingTriangles(o, i, a, r)); } } return !1; } }), { aIntersections: t, bIntersections: n }; } -function QE(s, e, t, n, i, r, o = !1) { +function JE(s, e, t, n, i, r, o = !1) { const a = t.attributes, l = t.index, c = s * 3, h = l.getX(c + 0), u = l.getX(c + 1), d = l.getX(c + 2); for (const f in r) { const p = a[f], g = r[f]; if (!(f in a)) throw new Error(`CSG Operations: Attribute ${f} not available on geometry.`); const x = p.itemSize; - f === "position" ? (ln.a.fromBufferAttribute(p, h).applyMatrix4(n), ln.b.fromBufferAttribute(p, u).applyMatrix4(n), ln.c.fromBufferAttribute(p, d).applyMatrix4(n), nh(ln.a, ln.b, ln.c, e, 3, g, o)) : f === "normal" ? (ln.a.fromBufferAttribute(p, h).applyNormalMatrix(i), ln.b.fromBufferAttribute(p, u).applyNormalMatrix(i), ln.c.fromBufferAttribute(p, d).applyNormalMatrix(i), o && (ln.a.multiplyScalar(-1), ln.b.multiplyScalar(-1), ln.c.multiplyScalar(-1)), nh(ln.a, ln.b, ln.c, e, 3, g, o, !0)) : (Vp.fromBufferAttribute(p, h), Gp.fromBufferAttribute(p, u), Wp.fromBufferAttribute(p, d), nh(Vp, Gp, Wp, e, x, g, o)); + f === "position" ? (ln.a.fromBufferAttribute(p, h).applyMatrix4(n), ln.b.fromBufferAttribute(p, u).applyMatrix4(n), ln.c.fromBufferAttribute(p, d).applyMatrix4(n), nh(ln.a, ln.b, ln.c, e, 3, g, o)) : f === "normal" ? (ln.a.fromBufferAttribute(p, h).applyNormalMatrix(i), ln.b.fromBufferAttribute(p, u).applyNormalMatrix(i), ln.c.fromBufferAttribute(p, d).applyNormalMatrix(i), o && (ln.a.multiplyScalar(-1), ln.b.multiplyScalar(-1), ln.c.multiplyScalar(-1)), nh(ln.a, ln.b, ln.c, e, 3, g, o, !0)) : (Hp.fromBufferAttribute(p, h), Vp.fromBufferAttribute(p, u), Gp.fromBufferAttribute(p, d), nh(Hp, Vp, Gp, e, x, g, o)); } } -function eT(s, e, t, n, i, r, o, a = !1) { +function QE(s, e, t, n, i, r, o, a = !1) { ih(s, n, i, r, o, a), ih(a ? t : e, n, i, r, o, a), ih(a ? e : t, n, i, r, o, a); } -function W0(s, e, t = !1) { +function G0(s, e, t = !1) { switch (s) { - case XE: + case WE: if (e === xs || e === dl && !t) return fs; break; - case jE: + case XE: if (t) { if (e === gs) return _o; } else if (e === xs || e === ul) return fs; break; - case qE: + case jE: if (t) { if (e === xs || e === ul) return fs; } else if (e === gs) return _o; break; - case ZE: + case qE: if (e === gs) return _o; if (e === xs) return fs; break; - case z0: + case F0: if (e === gs || e === dl && !t) return fs; break; - case H0: + case z0: if (!t && (e === xs || e === ul)) return fs; break; - case V0: + case H0: if (!t && (e === gs || e === dl)) return fs; break; default: throw new Error(`Unrecognized CSG operation enum "${s}".`); } - return td; + return ed; } function nh(s, e, t, n, i, r, o = !1, a = !1) { const l = (c) => { @@ -43289,12 +43317,12 @@ function ih(s, e, t, n, i, r = !1) { o === "position" ? (wi.fromBufferAttribute(a, s).applyMatrix4(t), l.push(wi.x, wi.y, wi.z)) : o === "normal" ? (wi.fromBufferAttribute(a, s).applyNormalMatrix(n), r && wi.multiplyScalar(-1), l.push(wi.x, wi.y, wi.z)) : (l.push(a.getX(s)), c > 1 && l.push(a.getY(s)), c > 2 && l.push(a.getZ(s)), c > 3 && l.push(a.getW(s))); } } -class tT { +class eT { constructor(e) { - this.triangle = new yt().copy(e), this.intersects = {}; + this.triangle = new bt().copy(e), this.intersects = {}; } addTriangle(e, t) { - this.intersects[e] = new yt().copy(t); + this.intersects[e] = new bt().copy(t); } getIntersectArray() { const e = [], { intersects: t } = this; @@ -43303,13 +43331,13 @@ class tT { return e; } } -class qp { +class jp { constructor() { this.data = {}; } addTriangleIntersection(e, t, n, i) { const { data: r } = this; - r[e] || (r[e] = new tT(t)), r[e].addTriangle(n, i); + r[e] || (r[e] = new eT(t)), r[e].addTriangle(n, i); } getTrianglesAsArray(e = null) { const { data: t } = this, n = []; @@ -43349,9 +43377,9 @@ class qp { this.data = {}; } } -class nT { +class tT { constructor() { - this.enabled = !1, this.triangleIntersectsA = new qp(), this.triangleIntersectsB = new qp(), this.intersectionEdges = []; + this.enabled = !1, this.triangleIntersectsA = new jp(), this.triangleIntersectsB = new jp(), this.intersectionEdges = []; } addIntersectingTriangles(e, t, n, i) { const { triangleIntersectsA: r, triangleIntersectsB: o } = this; @@ -43364,25 +43392,25 @@ class nT { this.triangleIntersectsA.reset(), this.triangleIntersectsB.reset(), this.intersectionEdges = []; } init() { - this.enabled && (this.reset(), jp(this)); + this.enabled && (this.reset(), Xp(this)); } complete() { - this.enabled && jp(null); + this.enabled && Xp(null); } } -const Yi = new ze(), El = new $e(), ps = new yt(), Ja = new yt(), Gi = new yt(), Qa = new yt(), Kn = [], _s = []; -function iT(s) { +const Yi = new ze(), El = new $e(), ps = new bt(), Ja = new bt(), Gi = new bt(), Qa = new bt(), Kn = [], _s = []; +function nT(s) { for (const e of s) return e; } -function sT(s, e, t, n, i, r = {}) { - const { useGroups: o = !0 } = r, { aIntersections: a, bIntersections: l } = JE(s, e), c = []; +function iT(s, e, t, n, i, r = {}) { + const { useGroups: o = !0 } = r, { aIntersections: a, bIntersections: l } = $E(s, e), c = []; let h = null, u; - return u = o ? 0 : -1, Zp(s, e, a, t, !1, n, i, u), Yp(s, e, a, t, !1, i, u), t.findIndex((d) => d !== V0 && d !== H0) !== -1 && (u = o ? s.geometry.groups.length || 1 : -1, Zp(e, s, l, t, !0, n, i, u), Yp(e, s, l, t, !0, i, u)), Kn.length = 0, _s.length = 0, { + return u = o ? 0 : -1, qp(s, e, a, t, !1, n, i, u), Zp(s, e, a, t, !1, i, u), t.findIndex((d) => d !== H0 && d !== z0) !== -1 && (u = o ? s.geometry.groups.length || 1 : -1, qp(e, s, l, t, !0, n, i, u), Zp(e, s, l, t, !0, i, u)), Kn.length = 0, _s.length = 0, { groups: c, materials: h }; } -function Zp(s, e, t, n, i, r, o, a = 0) { +function qp(s, e, t, n, i, r, o, a = 0) { const l = s.matrixWorld.determinant() < 0; Yi.copy(e.matrixWorld).invert().multiply(s.matrixWorld), El.getNormalMatrix(s.matrixWorld).multiplyScalar(l ? -1 : 1); const c = s.geometry.groupIndices, h = s.geometry.index, u = s.geometry.attributes.position, d = e.geometry.boundsTree, f = e.geometry.index, p = e.geometry.attributes.position, g = t.ids, x = t.intersectionSet; @@ -43396,39 +43424,39 @@ function Zp(s, e, t, n, i, r, o, a = 0) { } const S = r.triangles; for (let D = 0, C = S.length; D < C; D++) { - const B = S[D], w = r.coplanarTriangleUsed ? $E(B, d) : G0(B, d); + const B = S[D], w = r.coplanarTriangleUsed ? KE(B, d) : V0(B, d); Kn.length = 0, _s.length = 0; for (let F = 0, W = n.length; F < W; F++) { - const j = W0(n[F], w, i); - j !== td && (_s.push(j), Kn.push(o[F].getGroupAttrSet(y))); + const j = G0(n[F], w, i); + j !== ed && (_s.push(j), Kn.push(o[F].getGroupAttrSet(y))); } if (Kn.length !== 0) { ps.getBarycoord(B.a, Qa.a), ps.getBarycoord(B.b, Qa.b), ps.getBarycoord(B.c, Qa.c); for (let F = 0, W = Kn.length; F < W; F++) { const j = Kn[F], $ = _s[F] === _o; - QE(v, Qa, s.geometry, s.matrixWorld, El, j, l !== $); + JE(v, Qa, s.geometry, s.matrixWorld, El, j, l !== $); } } } } return g.length; } -function Yp(s, e, t, n, i, r, o = 0) { +function Zp(s, e, t, n, i, r, o = 0) { const a = s.matrixWorld.determinant() < 0; Yi.copy(e.matrixWorld).invert().multiply(s.matrixWorld), El.getNormalMatrix(s.matrixWorld).multiplyScalar(a ? -1 : 1); - const l = e.geometry.boundsTree, c = s.geometry.groupIndices, h = s.geometry.index, u = s.geometry.attributes, d = u.position, f = [], p = s.geometry.halfEdges, g = /* @__PURE__ */ new Set(), x = ed(s.geometry); + const l = e.geometry.boundsTree, c = s.geometry.groupIndices, h = s.geometry.index, u = s.geometry.attributes, d = u.position, f = [], p = s.geometry.halfEdges, g = /* @__PURE__ */ new Set(), x = Qu(s.geometry); for (let m = 0, b = x; m < b; m++) m in t.intersectionSet || g.add(m); for (; g.size > 0; ) { - const m = iT(g); + const m = nT(g); g.delete(m), f.push(m); const b = 3 * m, v = h.getX(b + 0), y = h.getX(b + 1), M = h.getX(b + 2); Gi.a.fromBufferAttribute(d, v).applyMatrix4(Yi), Gi.b.fromBufferAttribute(d, y).applyMatrix4(Yi), Gi.c.fromBufferAttribute(d, M).applyMatrix4(Yi); - const E = G0(Gi, l); + const E = V0(Gi, l); _s.length = 0, Kn.length = 0; for (let A = 0, R = n.length; A < R; A++) { - const _ = W0(n[A], E, i); - _ !== td && (_s.push(_), Kn.push(r[A])); + const _ = G0(n[A], E, i); + _ !== ed && (_s.push(_), Kn.push(r[A])); } for (; f.length > 0; ) { const A = f.pop(); @@ -43441,13 +43469,13 @@ function Yp(s, e, t, n, i, r, o = 0) { if (Gi.a.fromBufferAttribute(d, _), Gi.b.fromBufferAttribute(d, S), Gi.c.fromBufferAttribute(d, D), !ji(Gi)) for (let B = 0, w = Kn.length; B < w; B++) { const F = _s[B], W = Kn[B].getGroupAttrSet(C), j = F === _o; - eT(_, S, D, u, s.matrixWorld, El, W, j !== a); + QE(_, S, D, u, s.matrixWorld, El, W, j !== a); } } } } } -function rT(s) { +function sT(s) { for (let e = 0; e < s.length - 1; e++) { const t = s[e], n = s[e + 1]; if (t.materialIndex === n.materialIndex) { @@ -43456,7 +43484,7 @@ function rT(s) { } } } -function oT(s, e, t, n) { +function rT(s, e, t, n) { t.clear(); const i = s.attributes; for (let r = 0, o = n.length; r < o; r++) { @@ -43468,7 +43496,7 @@ function oT(s, e, t, n) { for (const r in e.attributes) n.includes(r) || (e.deleteAttribute(r), e.dispose()); } -function aT(s, e, t) { +function oT(s, e, t) { let n = !1, i = -1; const r = s.attributes, o = e.groupAttributes[0]; for (const l in o) { @@ -43498,15 +43526,15 @@ function aT(s, e, t) { } s.setDrawRange(0, i), s.boundsTree = null, n && s.dispose(); } -function Kp(s, e) { +function Yp(s, e) { let t = e; return Array.isArray(e) || (t = [], s.forEach((n) => { t[n.materialIndex] = e; })), t; } -class lT { +class aT { constructor() { - this.triangleSplitter = new VE(), this.attributeData = [], this.attributes = ["position", "uv", "normal"], this.useGroups = !0, this.consolidateGroups = !0, this.debug = new nT(); + this.triangleSplitter = new HE(), this.attributeData = [], this.attributes = ["position", "uv", "normal"], this.useGroups = !0, this.consolidateGroups = !0, this.debug = new tT(); } getGroupRanges(e) { return !this.useGroups || e.groups.length === 0 ? [{ start: 0, count: 1 / 0, materialIndex: 0 }] : e.groups.map((t) => ({ ...t })); @@ -43525,11 +43553,11 @@ class lT { debug: u } = this; for (; a.length < i.length; ) - a.push(new WE()); + a.push(new GE()); i.forEach((m, b) => { - oT(e.geometry, m.geometry, a[b], l); - }), u.init(), sT(e, t, n, o, a, { useGroups: c }), u.complete(); - const d = this.getGroupRanges(e.geometry), f = Kp(d, e.material), p = this.getGroupRanges(t.geometry), g = Kp(p, t.material); + rT(e.geometry, m.geometry, a[b], l); + }), u.init(), iT(e, t, n, o, a, { useGroups: c }), u.complete(); + const d = this.getGroupRanges(e.geometry), f = Yp(d, e.material), p = this.getGroupRanges(t.geometry), g = Yp(p, t.material); p.forEach((m) => m.materialIndex += f.length); let x = [...d, ...p].map((m, b) => ({ ...m, index: b })); if (c) { @@ -43556,7 +43584,7 @@ class lT { }); return i.forEach((m, b) => { const v = m.geometry; - aT(v, a[b], x), h && rT(v.groups); + oT(v, a[b], x), h && sT(v.groups); }), r ? i : i[0]; } // TODO: fix @@ -43590,7 +43618,7 @@ class lT { this.triangleSplitter.reset(); } } -class X0 { +class W0 { engine; planeObjects = []; planes = []; @@ -43617,7 +43645,7 @@ class X0 { // 平面变化检测 planeStates = /* @__PURE__ */ new Map(); constructor(e, t = {}) { - this.engine = e, this.evaluator = new lT(), this.planeGroup = new vn(), this.planeGroup.name = "CSG_ClippingPlanes_Optimized", t.updateThrottleTime !== void 0 && (this.updateThrottleTime = t.updateThrottleTime), t.cacheExpireTime !== void 0 && (this.cacheExpireTime = t.cacheExpireTime), t.planeThickness !== void 0 && (this.planeThickness = t.planeThickness), this.evaluator.attributes = ["position", "normal"], this.evaluator.useGroups = !1; + this.engine = e, this.evaluator = new aT(), this.planeGroup = new vn(), this.planeGroup.name = "CSG_ClippingPlanes_Optimized", t.updateThrottleTime !== void 0 && (this.updateThrottleTime = t.updateThrottleTime), t.cacheExpireTime !== void 0 && (this.cacheExpireTime = t.cacheExpireTime), t.planeThickness !== void 0 && (this.planeThickness = t.planeThickness), this.evaluator.attributes = ["position", "normal"], this.evaluator.useGroups = !1; } /** * 初始化剖切补面系统 @@ -43754,7 +43782,7 @@ class X0 { try { const h = this.createPlaneBrush(e), u = new Sl(o.geometry); o.updateMatrixWorld(!0), u.matrix.copy(o.matrixWorld), u.updateMatrixWorld(); - const d = this.evaluator.evaluate(h, u, z0); + const d = this.evaluator.evaluate(h, u, F0); d && d.geometry.attributes.position.count > 0 ? (r.push(d.geometry), this.geometryCache.set(l, { geometry: d.geometry.clone(), planeHash: i, @@ -43943,7 +43971,7 @@ class X0 { return t ? (t.visible = !t.visible, t.visible) : !1; } } -class cT { +class lT { engine; isActive = !1; isDrag = !1; @@ -43965,7 +43993,7 @@ class cT { * 初始化 CSG 剖切补面 */ initCsgClipping() { - this.csgClipping = new X0(this.engine, { + this.csgClipping = new W0(this.engine, { updateThrottleTime: 150, cacheExpireTime: 45e3 }), this.csgClipping.planes = this.engine.sectionPlane, this.csgClipping.init(); @@ -44095,7 +44123,7 @@ class cT { min: this.box.min.clone(), max: this.box.max.clone() }, this.pickNormal.y == 0) { - const n = new Mt(); + const n = new _t(); n.setFromNormalAndCoplanarPoint(new P(0, 1, 0), this.pickPoint), this.plane = n; } else { let n = new P( @@ -44103,7 +44131,7 @@ class cT { this.pickPoint.y, this.engine.camera.position.z ); - const i = new Mt(); + const i = new _t(); i.setFromNormalAndCoplanarPoint( n.clone().sub(this.pickPoint.clone()).setLength(1), this.pickPoint @@ -44175,7 +44203,7 @@ class cT { this.disActive(), this.csgClipping && (this.csgClipping.dispose(), this.csgClipping = null); } } -class hT { +class cT { engine; isActive = !1; isDrag = !1; @@ -44301,11 +44329,11 @@ class hT { min: this.box.min.clone(), max: this.box.max.clone() }, this.pickNormal.y == 0) { - const n = new Mt(); + const n = new _t(); n.setFromNormalAndCoplanarPoint(new P(0, 1, 0), this.pickPoint), this.plane = n; } else { let n = new P(this.engine.camera.position.x, this.pickPoint.y, this.engine.camera.position.z); - const i = new Mt(); + const i = new _t(); i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1), this.pickPoint), this.plane = i; } } @@ -44326,7 +44354,7 @@ class hT { } } } -class uT { +class hT { engine; isActive = !1; box; @@ -44348,7 +44376,7 @@ class uT { * 初始化 CSG 剖切补面 */ initCsgClipping() { - this.csgClipping = new X0(this.engine, { + this.csgClipping = new W0(this.engine, { updateThrottleTime: 150, cacheExpireTime: 45e3 }), this.csgClipping.planes = this.engine.sectionPlane, this.csgClipping.init(); @@ -44413,11 +44441,11 @@ class uT { min: this.box.min.clone(), max: this.box.max.clone() }, this.pickNormal.y == 0) { - const n = new Mt(); + const n = new _t(); n.setFromNormalAndCoplanarPoint(new P(0, 1, 0), this.pickPoint), this.plane = n; } else { let n = new P(this.engine.camera.position.x, this.pickPoint.y, this.engine.camera.position.z); - const i = new Mt(); + const i = new _t(); i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1), this.pickPoint), this.plane = i; } } @@ -44548,7 +44576,7 @@ class uT { } } } -class dT { +class uT { engine; sectionPlaneX; sectionPlaneY; @@ -44557,27 +44585,27 @@ class dT { clippingStencil; constructor(e) { this.engine = e; - let t = new Mt(new P(0, 0, 1), 1e5); + let t = new _t(new P(0, 0, 1), 1e5); t.name = "前"; - let n = new Mt(new P(0, 0, 1), 1e5); + let n = new _t(new P(0, 0, 1), 1e5); n.name = "左"; - let i = new Mt(new P(0, 0, 1), 1e5); + let i = new _t(new P(0, 0, 1), 1e5); i.name = "后"; - let r = new Mt(new P(0, 0, 1), 1e5); + let r = new _t(new P(0, 0, 1), 1e5); r.name = "右"; - let o = new Mt(new P(0, 0, 1), 1e5); + let o = new _t(new P(0, 0, 1), 1e5); o.name = "顶"; - let a = new Mt(new P(0, 0, 1), 1e5); + let a = new _t(new P(0, 0, 1), 1e5); a.name = "底", this.engine.sectionPlane = [t, n, i, r, o, a]; } init() { - this.sectionPlaneX = new bS(this.engine), this.sectionPlaneY = new cT(this.engine), this.sectionPlaneZ = new hT(this.engine), this.sectionBox = new uT(this.engine); + this.sectionPlaneX = new vS(this.engine), this.sectionPlaneY = new lT(this.engine), this.sectionPlaneZ = new cT(this.engine), this.sectionBox = new hT(this.engine); } disActive() { this.sectionPlaneX.disActive(), this.sectionPlaneY.disActive(), this.sectionPlaneZ.disActive(), this.sectionBox.disActive(); } } -class fT { +class dT { engine; constructor(e) { this.engine = e; @@ -44613,7 +44641,7 @@ class fT { }), e; } } -class pT { +class fT { engine; constructor(e) { this.engine = e; @@ -44649,7 +44677,7 @@ class pT { }); } } -class mT { +class pT { engine; constructor(e) { this.engine = e; @@ -44659,7 +44687,7 @@ class mT { // 查询构件属性 getModelProperties(e, t, n) { let i = this.engine.engineStatus.models.find((o) => o.url === e); - i.properties == null && C0(e + "/property", (o) => { + i.properties == null && A0(e + "/property", (o) => { let a = JSON.parse(o); i.properties = a, setTimeout(() => { r(a, t, n); @@ -44685,7 +44713,7 @@ class mT { } } } -class gT { +class mT { engine; constructor(e) { this.engine = e; @@ -44765,7 +44793,7 @@ class gT { }), t && t(n), n; } } -class xT { +class gT { engine; isActive = !1; groupEdge; @@ -44798,7 +44826,7 @@ class xT { }), this.indexes.set(e.url, i); let r = new ut(); r.setAttribute("position", new rn(n, 3)); - const o = new Lm(r, this.material); + const o = new Rm(r, this.material); o.url = e.url, this.groupEdge.add(o); } }); @@ -44852,7 +44880,7 @@ class xT { } } } -class vT { +class xT { config; constructor(e) { this.config = { @@ -44969,7 +44997,7 @@ class vT { return { ...this.config }; } } -class bT { +class vT { /** 引擎实例 */ engine; /** 步骤列表 */ @@ -45023,13 +45051,13 @@ class bT { } }; try { - this.config = i, this.llmApi = new vT(i.llmConfig); + this.config = i, this.llmApi = new xT(i.llmConfig); try { - const r = await Promise.resolve().then(() => MA); + const r = await Promise.resolve().then(() => xA); this.prompts.main = r.default; - const o = await Promise.resolve().then(() => SA); + const o = await Promise.resolve().then(() => bA); this.prompts.step = o.default; - const a = await Promise.resolve().then(() => TA); + const a = await Promise.resolve().then(() => _A); this.prompts.apiDoc = a.default; } catch (r) { throw console.error("[AI Manager] 提示词文件加载失败:", r), new Error(`提示词文件加载失败: ${r.message || "未知错误"}`); @@ -45343,7 +45371,7 @@ ${JSON.stringify(l, null, 2)} return new Map(this.stepResults); } } -class yT { +class bT { // 引擎参数 options; DeviceType; @@ -45394,7 +45422,7 @@ class yT { constructor(e) { if (this.options = e, this.container = document.getElementById(e.containerId), !this.container) throw new Error(`Container ${e.containerId} not found`); - this.ai = new bT(this), this.ai.init(), this.deviceModule = new X2(this), this.DeviceType = this.deviceModule.getDeviceType(), this.cameraModule = new W2(this), this.sceneModule = new G2(this), this.scene = this.sceneModule.scene, this.renderModule = new j2(this), this.renderer = this.renderModule.createRenderer(), this.camera = this.cameraModule.orthographicCamera, this.scene.camera = this.camera, this.controlModule = new aM(this), this.controlModule.switchDefaultMode(), this.controls = this.controlModule.orbitControls, this.composerModule = new MM(this), this.composerModule.init(), this.events = new qw(), this.engineStatus = new jw(this), this.engineStatus.init(), this.loaderModule = new Xw(this), this.lightModule = new Zw(this), this.lightModule.init(), this.viewCube = new oS(this), this.viewCube.init(), this.octreeBox = aS(this), this.rangeScale = new lS(this), this.rangeScale.init(), this.clipping = new dT(this), this.clipping.init(), this.setting = new cS(this), this.setting.init(), this.handelBehaved = Xu(this), this.modelMapperBatch = new gT(this), this.measure = new vS(this), this.modelToolModule = new Kw(this), this.modelProperties = new mT(this), this.interactionModule = new Yw(this), this.interactionModule.init(), this.interactionModule.active(), this.modelEdge = new xT(this), this.modelTree = new fT(this), this.engineInfo = new pT(this), this.worldToScreen = new Dn(this.camera, this.renderer, this.scene), this.reactBoundingClientRect = this.container.getBoundingClientRect(), this.stats = new eS(), this.stats.showPanel(0), this.stats.dom.style.position = "absolute", this.stats.dom.style.top = "0px", this.stats.dom.style.left = "0px", this.stats.dom.style.zIndex = "1000", this.container.appendChild(this.stats.dom); + this.ai = new vT(this), this.ai.init(), this.deviceModule = new W2(this), this.DeviceType = this.deviceModule.getDeviceType(), this.cameraModule = new G2(this), this.sceneModule = new V2(this), this.scene = this.sceneModule.scene, this.renderModule = new X2(this), this.renderer = this.renderModule.createRenderer(), this.camera = this.cameraModule.orthographicCamera, this.scene.camera = this.camera, this.controlModule = new oM(this), this.controlModule.switchDefaultMode(), this.controls = this.controlModule.orbitControls, this.composerModule = new _M(this), this.composerModule.init(), this.events = new jw(), this.engineStatus = new Xw(this), this.engineStatus.init(), this.loaderModule = new Ww(this), this.lightModule = new qw(this), this.lightModule.init(), this.viewCube = new rS(this), this.viewCube.init(), this.octreeBox = oS(this), this.rangeScale = new aS(this), this.rangeScale.init(), this.clipping = new uT(this), this.clipping.init(), this.setting = new lS(this), this.setting.init(), this.handelBehaved = Wu(this), this.modelMapperBatch = new mT(this), this.measure = new xS(this), this.modelToolModule = new Yw(this), this.modelProperties = new pT(this), this.interactionModule = new Zw(this), this.interactionModule.init(), this.interactionModule.active(), this.modelEdge = new gT(this), this.modelTree = new dT(this), this.engineInfo = new fT(this), this.worldToScreen = new Dn(this.camera, this.renderer, this.scene), this.reactBoundingClientRect = this.container.getBoundingClientRect(), this.stats = new Qw(), this.stats.showPanel(0), this.stats.dom.style.position = "absolute", this.stats.dom.style.top = "0px", this.stats.dom.style.left = "0px", this.stats.dom.style.zIndex = "1000", this.container.appendChild(this.stats.dom); let t = document.createElementNS("http://www.w3.org/2000/svg", "svg"); t.style.position = "absolute", t.style.width = "100%", t.style.height = "100%", t.style.zIndex = "1000", t.style.left = "0px", t.style.top = "0px", t.style.pointerEvents = "none"; const n = this.renderer?.domElement.width || 1920, i = this.renderer?.domElement.height || 1080; @@ -45498,7 +45526,7 @@ class yT { clearScene(e) { e && ([...e.children].forEach((t) => { this.clearScene(t); - }), e.parent && e.parent.remove(e), e instanceof dt && (e.geometry && e.geometry.dispose(), e.material && (Array.isArray(e.material) ? e.material.forEach((t) => this.disposeMaterial(t)) : this.disposeMaterial(e.material))), e instanceof es && (e.geometry && e.geometry.dispose(), e.material && this.disposeMaterial(e.material)), e instanceof Im && (e.geometry && e.geometry.dispose(), e.material && this.disposeMaterial(e.material)), e instanceof No && (e.geometry && e.geometry.dispose(), e.material && (Array.isArray(e.material) ? e.material.forEach((t) => this.disposeMaterial(t)) : this.disposeMaterial(e.material)), e.instanceMatrix && (e.instanceMatrix = null), e.instanceColor && (e.instanceColor = null)), e instanceof Lx && e.material && this.disposeMaterial(e.material)); + }), e.parent && e.parent.remove(e), e instanceof dt && (e.geometry && e.geometry.dispose(), e.material && (Array.isArray(e.material) ? e.material.forEach((t) => this.disposeMaterial(t)) : this.disposeMaterial(e.material))), e instanceof es && (e.geometry && e.geometry.dispose(), e.material && this.disposeMaterial(e.material)), e instanceof Dm && (e.geometry && e.geometry.dispose(), e.material && this.disposeMaterial(e.material)), e instanceof No && (e.geometry && e.geometry.dispose(), e.material && (Array.isArray(e.material) ? e.material.forEach((t) => this.disposeMaterial(t)) : this.disposeMaterial(e.material)), e.instanceMatrix && (e.instanceMatrix = null), e.instanceColor && (e.instanceColor = null)), e instanceof Rx && e.material && this.disposeMaterial(e.material)); } /** * 清理材质及其纹理 @@ -45535,10 +45563,10 @@ class yT { }), e.dispose()); } } -function _T(s) { - return new yT(s); +function yT(s) { + return new bT(s); } -class MT { +class _T { /** 第三方 3D 引擎实例 */ engine = null; /** 引擎挂载的容器元素 */ @@ -45561,6 +45589,8 @@ class MT { currentSectionAxis = null; /** 剖切盒是否激活 */ isSectionBoxActive = !1; + /** 当前选中的构件信息 */ + selectedComponent = null; /** * 构造函数 * @param options 3D 引擎配置选项 @@ -45599,11 +45629,17 @@ class MT { showStats: this.options.showStats, showViewCube: this.options.showViewCube }; - if (console.log("引擎配置信息:", e), this.engine = _T(e), !this.engine) + if (console.log("引擎配置信息:", e), this.engine = yT(e), !this.engine) throw new Error("Failed to create engine instance"); - this._isInitialized = !0, this.unsubscribeTheme = rt.subscribe((t) => { + this._isInitialized = !0, this.unsubscribeTheme = ot.subscribe((t) => { this.setTheme(t); - }), this.setTheme(rt.getTheme()); + }), this.setTheme(ot.getTheme()), this.engine.events.on("click", (t) => { + const n = wt.getInstance(); + t && t.object ? (this.selectedComponent = { + url: t.object.url, + id: t.object.name + }, console.log("[Engine] 构件选中:", this.selectedComponent), n.emit("component:selected", this.selectedComponent)) : (this.selectedComponent = null, console.log("[Engine] 取消选中"), n.emit("component:deselected", {})); + }); } catch (e) { throw console.error("[Engine] Failed to initialize engine:", e), this._isInitialized = !1, e; } @@ -45998,6 +46034,43 @@ class MT { return this.isWalkModeActive; } // ==================== 结束:漫游功能 ==================== + // ==================== 构件选中 ==================== + /** + * 获取当前选中的构件 + * @returns 选中构件的 URL 和 ID,未选中时返回 null + */ + getSelectedComponent() { + return this.selectedComponent; + } + /** + * 获取构件属性 + * @param url 模型 URL + * @param id 构件 ID + * @param callback 回调函数,接收属性数据 + */ + getComponentProperties(e, t, n) { + if (!this._isInitialized || !this.engine) { + console.error("[Engine] Cannot get component properties: engine not initialized."); + return; + } + if (!this.engine.modelProperties) { + console.error("[Engine] modelProperties not available"); + return; + } + console.log("[Engine] Getting component properties:", { url: e, id: t }), this.engine.modelProperties.getModelProperties(e, t, n); + } + // ==================== 结束:构件选中 ==================== + // ==================== 模型树 ==================== + getTypeTreeData() { + return !this._isInitialized || !this.engine?.modelTree ? [] : this.engine.modelTree.getTypeTreeData(); + } + getLevelTreeData() { + return !this._isInitialized || !this.engine?.modelTree ? [] : this.engine.modelTree.getLevelTreeData(); + } + getMajorTreeData() { + return !this._isInitialized || !this.engine?.modelTree ? [] : this.engine.modelTree.getMajorTreeData(); + } + // ==================== 结束:模型树 ==================== /** 激活框选放大功能 */ activateZoomBox() { if (!this._isInitialized || !this.engine) { @@ -46014,7 +46087,7 @@ class MT { this._isDestroyed || (this.deactivateMeasure(), this.unsubscribeTheme && (this.unsubscribeTheme(), this.unsubscribeTheme = null), this.engine && (this.engine.dispose(), this.engine = null), this.container.innerHTML = "", this.currentMeasureType = null, this.isMeasureActive = !1, this._isDestroyed = !0, this._isInitialized = !1); } } -class wT { +class MT { element; content = null; isVisible = !1; @@ -46093,7 +46166,7 @@ class wT { this.isVisible && (this.element.contains(e.target) || this.hide()); }; } -class nd { +class td { element; options; unsubscribeLocale = null; @@ -46110,7 +46183,7 @@ class nd { init() { this.render(), this.unsubscribeLocale = Jt.subscribe(() => { this.setLocales(); - }), this.unsubscribeTheme = rt.subscribe((e) => { + }), this.unsubscribeTheme = ot.subscribe((e) => { this.setTheme(e); }); } @@ -46143,12 +46216,13 @@ class nd { getElement() { return this.element; } - /** - * 核心渲染逻辑 - * 处理分组、排序和 DOM 生成 - */ + hasAnyIcon(e) { + return e.some((t) => t.icon ? !0 : t.children ? this.hasAnyIcon(t.children) : !1); + } render() { - const { items: e, groupOrder: t } = this.options, n = /* @__PURE__ */ new Map(), i = "default"; + const { items: e, groupOrder: t } = this.options; + this.hasAnyIcon(e) ? this.element.classList.add("has-icons") : this.element.classList.remove("has-icons"); + const n = /* @__PURE__ */ new Map(), i = "default"; e.forEach((o) => { const a = o.group || i; n.has(a) || n.set(a, []), n.get(a).push(o); @@ -46167,7 +46241,10 @@ class nd { } const l = n.get(o); l.sort((c, h) => (c.order || 0) - (h.order || 0)), l.forEach((c) => { - c.visible !== !1 && this.element.appendChild(this.createItemElement(c)); + if (c.visible !== !1 && (this.element.appendChild(this.createItemElement(c)), c.divider)) { + const h = document.createElement("li"); + h.className = "bim-menu-divider", this.element.appendChild(h); + } }); }); } @@ -46204,7 +46281,7 @@ class nd { i.style.position = "fixed", i.style.zIndex = "10001"; const r = t.getBoundingClientRect(); i.style.top = `${r.top}px`, i.style.left = `${r.right}px`, i.addEventListener("mousedown", (l) => l.stopPropagation()); - const o = new nd({ items: n }); + const o = new td({ items: n }); o.init(), i.appendChild(o.element), document.body.appendChild(i), this.activeSubMenu = { menu: o, container: i }; const a = i.getBoundingClientRect(); a.right > window.innerWidth && (i.style.left = `${r.left - a.width}px`); @@ -46216,7 +46293,7 @@ class nd { this.activeSubMenu && (this.activeSubMenu.menu.destroy(), this.activeSubMenu.container.remove(), this.activeSubMenu = null); } } -class j0 extends Ii { +class X0 extends Ii { /** 容器元素 */ container; /** 右键面板实例 */ @@ -46224,7 +46301,7 @@ class j0 extends Ii { /** 上下文处理器列表 */ contextHandlers = []; constructor(e) { - super(), this.container = e, this.rightKeyPanel = new wT({ + super(), this.container = e, this.rightKeyPanel = new MT({ zIndex: 9e3, container: this.container, onContext: this.handleContextMenu @@ -46250,7 +46327,7 @@ class j0 extends Ii { */ showMenu(e, t, n, i) { if (!n || n.length === 0) return; - const r = new nd({ items: n, groupOrder: i }); + const r = new td({ items: n, groupOrder: i }); r.init(), this.rightKeyPanel.mount(r), this.rightKeyPanel.show(e, t); } /** 隐藏菜单 */ @@ -46267,46 +46344,7 @@ class j0 extends Ii { t && t.length > 0 ? this.showMenu(e.clientX, e.clientY, t) : this.hide(); }; } -const ST = () => ({ - id: "infoMenu", - label: "menu.info", - group: "info", - icon: '', - onClick: () => { - console.log("dianjile"); - const s = bt.getInstance(); - s.dialog?.showInfoDialog(), s.engine3d?.rightKey?.hide(); - } -}), ET = () => ({ - id: "infoMenu", - label: "menu.info", - icon: '', - onClick: () => { - console.log("dianjile"); - const s = bt.getInstance(); - s.dialog?.showInfoDialog(), s.engine3d?.rightKey?.hide(); - } -}), TT = () => ({ - id: "fourMenu", - label: "menu.info", - icon: '', - onClick: () => { - console.log("dianjile"); - const s = bt.getInstance(); - s.dialog?.showInfoDialog(), s.engine3d?.rightKey?.hide(); - } -}), AT = () => ({ - id: "homeMenu", - label: "menu.home", - group: "home", - children: [ET(), TT()], - icon: '', - onClick: () => { - const s = bt.getInstance(); - s.dialog?.showInfoDialog(), s.engine3d?.rightKey?.hide(); - } -}); -class CT extends Ii { +class wT extends Ii { /** 容器元素 */ container; /** 引擎实例 */ @@ -46324,13 +46362,76 @@ class CT extends Ii { initialize(e) { this.engineInstance && this.engineInstance.isInitialized() && (console.warn("[EngineManager] 3D Engine already initialized. Destroying old instance..."), this.engineInstance.destroy(), this.engineInstance = null); try { - return this.engineInstance = new MT({ + return this.engineInstance = new _T({ container: this.container, ...e - }), this.engineInstance.init(), this.rightKey = new j0(this.container), this.rightKey.registerHandler((t) => [ - ST(), - AT() - ]), this.engineInstance.isInitialized(); + }), this.engineInstance.init(), this.rightKey = new X0(this.container), this.rightKey.registerHandler((t) => { + const n = this.getSelectedComponent(), i = []; + return n && (i.push({ + id: "componentDetail", + label: "menu.componentDetail", + group: "component", + order: 1, + divider: !0, + onClick: () => { + wt.getInstance().componentDetail?.show(), this.rightKey?.hide(); + } + }), i.push({ + id: "hideSelected", + label: "menu.hideSelected", + group: "component", + order: 2, + onClick: () => { + console.log("[Menu] 隐藏选中构件 - 暂未实现"), this.rightKey?.hide(); + } + }), i.push({ + id: "transparentSelected", + label: "menu.transparentSelected", + group: "component", + order: 3, + onClick: () => { + console.log("[Menu] 半透明选中构件 - 暂未实现"), this.rightKey?.hide(); + } + }), i.push({ + id: "isolateSelected", + label: "menu.isolateSelected", + group: "component", + order: 4, + divider: !0, + children: [ + { + id: "hideOthers", + label: "menu.hideOthers", + onClick: () => { + console.log("[Menu] 隔离 - 其他构件隐藏 - 暂未实现"), this.rightKey?.hide(); + } + }, + { + id: "transparentOthers", + label: "menu.transparentOthers", + onClick: () => { + console.log("[Menu] 隔离 - 其他构件半透明 - 暂未实现"), this.rightKey?.hide(); + } + } + ] + }), i.push({ + id: "fitSectionBox", + label: "menu.fitSectionBox", + group: "component", + order: 5, + onClick: () => { + console.log("[Menu] 剖切盒适应 - 暂未实现"), this.rightKey?.hide(); + } + })), i.push({ + id: "showAll", + label: "menu.showAll", + group: "component", + order: 6, + onClick: () => { + console.log("[Menu] 显示全部 - 暂未实现"), this.rightKey?.hide(); + } + }), i; + }), this.engineInstance.isInitialized(); } catch (t) { return console.error("[EngineManager] Failed to initialize 3D engine:", t), this.engineInstance = null, !1; } @@ -46529,13 +46630,42 @@ class CT extends Ii { return this.engineInstance ? this.engineInstance.isFirstPersonModeActive() : !1; } // ==================== 结束:漫游功能 ==================== + // ==================== 构件选中 ==================== + /** + * 获取当前选中的构件 + * @returns 选中构件的 URL 和 ID,未选中时返回 null + */ + getSelectedComponent() { + return this.engineInstance?.getSelectedComponent() ?? null; + } + /** + * 获取构件属性 + * @param url 模型 URL + * @param id 构件 ID + * @param callback 回调函数,接收属性数据 + */ + getComponentProperties(e, t, n) { + this.engineInstance?.getComponentProperties(e, t, n); + } + // ==================== 结束:构件选中 ==================== + // ==================== 模型树 ==================== + getTypeTreeData() { + return this.engineInstance?.getTypeTreeData() ?? []; + } + getLevelTreeData() { + return this.engineInstance?.getLevelTreeData() ?? []; + } + getMajorTreeData() { + return this.engineInstance?.getMajorTreeData() ?? []; + } + // ==================== 结束:模型树 ==================== /** 销毁引擎管理器 */ destroy() { this.engineInstance && (this.engineInstance.destroy(), this.engineInstance = null), this.rightKey && (this.rightKey.destroy(), this.rightKey = null), super.destroy(); } } var Dt = /* @__PURE__ */ ((s) => (s[s.Unchecked = 0] = "Unchecked", s[s.Checked = 1] = "Checked", s[s.Indeterminate = 2] = "Indeterminate", s))(Dt || {}); -class PT { +class ST { config; element; children = []; @@ -46641,7 +46771,7 @@ class PT { this.children.forEach((e) => e.destroy()), this.children = [], this.element.remove(), this.parent = null; } } -class RT { +class ET { element; contentElement; // 树内容容器 @@ -46685,7 +46815,7 @@ class RT { }, document.addEventListener("click", this.clickOutsideHandler); } init() { - this.render(), this.unsubscribeLocale = Jt.subscribe(() => this.setLocales()), this.unsubscribeTheme = rt.subscribe((e) => this.setTheme(e)), this.setTheme(rt.getTheme()); + this.render(), this.unsubscribeLocale = Jt.subscribe(() => this.setLocales()), this.unsubscribeTheme = ot.subscribe((e) => this.setTheme(e)), this.setTheme(ot.getTheme()); } /** * 处理搜索逻辑 @@ -46779,7 +46909,7 @@ class RT { */ createNodeRecursively(e, t) { e.expanded === void 0 && (e.expanded = this.options.defaultExpandAll); - const n = new PT(e, this.options, { + const n = new ST(e, this.options, { onExpand: (i) => { this.onNodeExpand && this.onNodeExpand(i); }, @@ -46836,7 +46966,7 @@ class RT { }), t; } } -class q0 { +class j0 { /** 组件根节点 */ element; /** 头部容器 */ @@ -46863,7 +46993,7 @@ class q0 { * 初始化组件 */ init() { - this.renderNav(), this.renderPanels(), this.setLocales(), this.setTheme(rt.getTheme()), this.unsubscribeLocale = Jt.subscribe(() => this.setLocales()), this.unsubscribeTheme = rt.subscribe((e) => this.setTheme(e)); + this.renderNav(), this.renderPanels(), this.setLocales(), this.setTheme(ot.getTheme()), this.unsubscribeLocale = Jt.subscribe(() => this.setLocales()), this.unsubscribeTheme = ot.subscribe((e) => this.setTheme(e)); } /** * 渲染头部标签 @@ -46946,7 +47076,7 @@ class q0 { } } } -const $p = { +const Kp = { // ========== 来自 assets 的图标 (48x48) ========== 测量: '', 地图: '', @@ -46999,74 +47129,32 @@ const $p = { default: '' }; function Pt(s) { - const e = $p[s]; - return e || (console.warn(`[IconManager] Icon "${s}" not found, using default icon`), $p.default); + const e = Kp[s]; + return e || (console.warn(`[IconManager] Icon "${s}" not found, using default icon`), Kp.default); } -const LT = [ - { - id: "root", - label: "全部构件", - expanded: !0, - clickAction: "expand", - children: [ - { - id: "level-1", - label: "一层", +function TT(s) { + return !s || s.length === 0 ? [] : s.map((e, t) => { + const n = (r, o) => { + const a = r.children && r.children.length > 0; + return { + id: r.id || `node-${t}-${o}`, + label: r.name || r.label || "未命名", expanded: !1, - icon: '', - clickAction: "expand", - children: [ - { id: "l1-wall", label: "墙体(128)" }, - { id: "l1-column", label: "柱(46)" }, - { id: "l1-beam", label: "梁(82)" }, - { id: "l1-slab", label: "楼板(12)" }, - { id: "l1-door", label: "门(24)" }, - { id: "l1-window", label: "窗(36)" } - ] - }, - { - id: "level-2", - label: "二层", - expanded: !1, - clickAction: "expand", - children: [ - { id: "l2-wall", label: "墙体(141)" }, - { id: "l2-column", label: "柱(52)" }, - { id: "l2-beam", label: "梁(90)" }, - { id: "l2-slab", label: "楼板(12)" }, - { id: "l2-door", label: "门(18)" }, - { id: "l2-window", label: "窗(40)" } - ] - }, - { - id: "level-3", - label: "三层", - expanded: !1, - clickAction: "expand", - children: [ - { id: "l3-wall", label: "墙体(136)" }, - { id: "l3-column", label: "柱(48)" }, - { id: "l3-beam", label: "梁(88)" }, - { id: "l3-slab", label: "楼板(12)" }, - { id: "l3-door", label: "门(16)" }, - { id: "l3-window", label: "窗(38)" } - ] - }, - { - id: "level-roof", - label: "屋面层", - expanded: !1, - clickAction: "expand", - children: [ - { id: "rf-slab", label: "屋面板(6)" }, - { id: "rf-beam", label: "屋面梁(24)" }, - { id: "rf-parapet", label: "女儿墙(18)" } - ] - } - ] - } -]; -class DT extends Ii { + clickAction: a ? "expand" : "select", + children: a ? r.children.map((l, c) => n(l, c)) : void 0, + data: r + }; + }, i = e.children && e.children.length > 0; + return { + id: `model-${t}`, + label: e.name || "模型", + expanded: !0, + clickAction: "expand", + children: i ? e.children.map((r, o) => n(r, o)) : void 0 + }; + }); +} +class AT extends Ii { /** 按钮组实例 */ toolbar = null; /** 按钮容器元素 */ @@ -47080,7 +47168,7 @@ class DT extends Ii { } /** 初始化按钮 */ init() { - this.toolbarContainer = document.createElement("div"), this.toolbarContainer.id = "bim-construct-tree", this.container.appendChild(this.toolbarContainer), this.toolbar = new _u({ + this.toolbarContainer = document.createElement("div"), this.toolbarContainer.id = "bim-construct-tree", this.container.appendChild(this.toolbarContainer), this.toolbar = new yu({ container: this.toolbarContainer, showLabel: !1, direction: "column", @@ -47098,57 +47186,58 @@ class DT extends Ii { } }), this.toolbar.render(); } - /** 打开构件树对话框 */ openConstructTreeDialog() { this.setVisible(!1); - const e = new RT({ - data: LT, - checkable: !0, - indent: 0, - enableSearch: !0, - checkStrictly: !0, - defaultExpandAll: !0, - renderActions: (a) => '', - onNodeCheck: (a) => { - console.log("onNodeCheck", a); - }, - onNodeSelect: (a) => { - console.log("onNodeSelect", a); - }, - onNodeExpand: (a) => { - console.log("onNodeExpand", a), this.dialog?.fitWidth(); - } - }); - e.init(); - const t = document.createElement("div"); - t.className = "construct-tab__panel-content"; - const n = document.createElement("div"); - n.className = "construct-tab__panel-content"; - const i = document.createElement("div"); - i.className = "construct-tab__panel-content", i.appendChild(e.element); - const r = document.createElement("div"); - r.className = "construct-tab__container", r.style.height = "100%", r.style.overflow = "hidden"; - const o = new q0({ - container: r, + const e = this.registry.engine3d?.getLevelTreeData() ?? [], t = this.registry.engine3d?.getTypeTreeData() ?? [], n = this.registry.engine3d?.getMajorTreeData() ?? []; + console.log("[ConstructTree] 构件树数据 (Level):", e), console.log("[ConstructTree] 类型树数据 (Type):", t), console.log("[ConstructTree] 专业树数据 (Major):", n); + const i = (f) => { + const p = new ET({ + data: TT(f), + checkable: !0, + indent: 0, + enableSearch: !0, + checkStrictly: !0, + defaultExpandAll: !0, + onNodeCheck: (g) => { + console.log("onNodeCheck", g); + }, + onNodeSelect: (g) => { + console.log("onNodeSelect", g); + }, + onNodeExpand: () => { + this.dialog?.fitWidth(); + } + }); + return p.init(), p; + }, r = i(e), o = i(t), a = i(n), l = document.createElement("div"); + l.className = "construct-tab__panel-content", l.appendChild(r.element); + const c = document.createElement("div"); + c.className = "construct-tab__panel-content", c.appendChild(o.element); + const h = document.createElement("div"); + h.className = "construct-tab__panel-content", h.appendChild(a.element); + const u = document.createElement("div"); + u.className = "construct-tab__container", u.style.height = "100%", u.style.overflow = "hidden"; + const d = new j0({ + container: u, tabs: [ - { id: "component", title: "tab.component", content: i }, - { id: "system", title: "tab.system", content: t }, - { id: "space", title: "tab.space", content: n } + { id: "component", title: "tab.component", content: l }, + { id: "type", title: "tab.type", content: c }, + { id: "major", title: "tab.major", content: h } ], activeId: "component", onChange: () => { this.dialog?.fitWidth(); } }); - o.init(), this.dialog = this.registry.dialog.create({ + d.init(), this.dialog = this.registry.dialog.create({ title: "constructTree.title", minWidth: 320, height: 420, - content: r, + content: u, position: { x: 20, y: 20 }, resizable: !1, onClose: () => { - o.destroy(), e.destroy(), this.setVisible(!0); + d.destroy(), r.destroy(), o.destroy(), a.destroy(), this.setVisible(!0); } }), this.dialog?.fitWidth(); } @@ -47212,291 +47301,6 @@ class DT extends Ii { this.toolbar?.setColors(e); } } -class IT { - element; - headerEl; - contentEl; - contentBoxEl; - arrowEl; - titleEl; - config; - parent; - constructor(e, t) { - this.config = e, this.parent = t, this.element = this.createDom(); - } - createDom() { - const e = document.createElement("div"); - if (e.className = `bim-collapse-item ${this.config.className || ""}`, this.config.disabled && e.classList.add("is-disabled"), e.dataset.id = this.config.id, this.headerEl = document.createElement("div"), this.headerEl.className = "bim-collapse-header", this.arrowEl = document.createElement("span"), this.arrowEl.className = "bim-collapse-arrow", this.arrowEl.innerHTML = '', this.headerEl.appendChild(this.arrowEl), this.config.icon) { - const t = document.createElement("span"); - t.className = "bim-collapse-icon", t.innerHTML = this.config.icon, this.headerEl.appendChild(t); - } - if (this.titleEl = document.createElement("span"), this.titleEl.className = "bim-collapse-title", this.titleEl.textContent = Ce(this.config.title), this.headerEl.appendChild(this.titleEl), this.config.extra) { - const t = document.createElement("div"); - t.className = "bim-collapse-extra", typeof this.config.extra == "string" ? t.innerHTML = this.config.extra : t.appendChild(this.config.extra), this.headerEl.appendChild(t); - } - return this.headerEl.addEventListener("click", () => { - this.config.disabled || this.parent.toggleItem(this.config.id); - }), e.appendChild(this.headerEl), this.contentEl = document.createElement("div"), this.contentEl.className = "bim-collapse-content is-hidden", this.contentBoxEl = document.createElement("div"), this.contentBoxEl.className = "bim-collapse-content-box", typeof this.config.content == "string" ? this.contentBoxEl.innerHTML = this.config.content : this.contentBoxEl.appendChild(this.config.content), this.contentEl.appendChild(this.contentBoxEl), e.appendChild(this.contentEl), e; - } - updateLocale() { - this.titleEl && (this.titleEl.textContent = Ce(this.config.title)); - } - setActive(e) { - e ? (this.element.classList.add("is-active"), this.contentEl.classList.remove("is-hidden")) : (this.element.classList.remove("is-active"), this.contentEl.classList.add("is-hidden")); - } -} -class Jp { - element; - options; - items = /* @__PURE__ */ new Map(); - activeIds = /* @__PURE__ */ new Set(); - unsubscribeLocale = null; - unsubscribeTheme = null; - constructor(e) { - this.options = { - bordered: !0, - accordion: !1, - ...e - }, this.element = document.createElement("div"), this.element.className = `bim-collapse ${this.options.className || ""}`, this.options.bordered || (this.element.style.border = "none"), this.options.ghost && this.element.classList.add("is-ghost"); - const t = typeof this.options.container == "string" ? document.getElementById(this.options.container) : this.options.container; - t && t.appendChild(this.element), this.options.activeIds && this.options.activeIds.forEach((n) => this.activeIds.add(n)), this.init(); - } - init() { - this.options.items.forEach((e) => { - const t = new IT(e, this); - this.items.set(e.id, t), this.element.appendChild(t.element), this.activeIds.has(e.id) && t.setActive(!0); - }), this.unsubscribeLocale = Jt.subscribe(() => { - this.setLocales(); - }), this.unsubscribeTheme = rt.subscribe((e) => { - this.setTheme(e); - }), this.setTheme(rt.getTheme()); - } - toggleItem(e) { - const t = this.activeIds.has(e); - this.options.accordion ? (this.activeIds.clear(), t || this.activeIds.add(e)) : t ? this.activeIds.delete(e) : this.activeIds.add(e), this.refreshState(), this.options.onChange && this.options.onChange(Array.from(this.activeIds)); - } - refreshState() { - this.items.forEach((e, t) => { - e.setActive(this.activeIds.has(t)); - }); - } - setTheme(e) { - const t = this.element.style; - t.setProperty("--bim-bg-color", e.bgElevated), t.setProperty("--bim-border-color", e.borderDefault), t.setProperty("--bim-text-color", e.textPrimary), t.setProperty("--bim-header-bg-color", e.componentBgHover), t.setProperty("--bim-header-hover-bg-color", e.componentBgActive), t.setProperty("--bim-content-bg-color", e.bgElevated), t.setProperty("--bim-disabled-color", e.textDisabled); - } - setLocales() { - this.items.forEach((e) => e.updateLocale()); - } - destroy() { - this.unsubscribeLocale && (this.unsubscribeLocale(), this.unsubscribeLocale = null), this.unsubscribeTheme && (this.unsubscribeTheme(), this.unsubscribeTheme = null), this.element.remove(), this.items.clear(); - } -} -class sh { - element; - options; - unsubscribeTheme = null; - constructor(e) { - this.options = { - bordered: !1, - ...e - }, this.element = this.createDom(); - const t = typeof this.options.container == "string" ? document.getElementById(this.options.container) : this.options.container; - t && t.appendChild(this.element), this.init(); - } - init() { - this.applyCustomStyles(), this.renderItems(), this.unsubscribeTheme = rt.subscribe((e) => { - this.setTheme(e); - }), this.setTheme(rt.getTheme()); - } - createDom() { - const e = document.createElement("div"); - return e.className = `bim-description ${this.options.className || ""}`, this.options.bordered && e.classList.add("is-bordered"), e; - } - applyCustomStyles() { - const e = this.element.style; - this.options.fontSize && e.setProperty("--bim-desc-font-size", this.options.fontSize), this.options.labelColor && e.setProperty("--bim-desc-label-color", this.options.labelColor), this.options.valueColor && e.setProperty("--bim-desc-value-color", this.options.valueColor), this.options.labelPadding && e.setProperty("--bim-desc-label-padding", this.options.labelPadding), this.options.valuePadding && e.setProperty("--bim-desc-value-padding", this.options.valuePadding); - } - renderItems() { - this.element.innerHTML = "", this.options.items.forEach((e) => { - const t = document.createElement("div"); - t.className = `bim-description-item ${e.className || ""}`; - const n = document.createElement("div"); - n.className = "bim-description-label", e.labelColor && (n.style.color = e.labelColor), this.options.labelWidth && (n.style.width = this.options.labelWidth), n.textContent = this.options.bordered ? e.label : e.label + ":"; - const i = document.createElement("div"); - i.className = "bim-description-value", e.valueColor && (i.style.color = e.valueColor), typeof e.value == "string" ? i.innerHTML = e.value : i.appendChild(e.value), t.appendChild(n), t.appendChild(i), this.element.appendChild(t); - }); - } - /** - * 动态更新数据 - */ - setItems(e) { - this.options.items = e, this.renderItems(); - } - setTheme(e) { - const t = this.element.style; - t.setProperty("--bim-text-color", e.textPrimary), t.setProperty("--bim-label-color", e.textSecondary), t.setProperty("--bim-value-color", e.textPrimary), t.setProperty("--bim-border-color", e.borderDefault); - } - setLocales() { - } - destroy() { - this.unsubscribeTheme && (this.unsubscribeTheme(), this.unsubscribeTheme = null), this.element.remove(); - } -} -class BT extends Ii { - /** 对话框 ID */ - dialogId = "property-panel-dialog"; - /** 对话框实例 */ - dialog = null; - constructor() { - super(); - } - /** 初始化,监听打开事件 */ - init() { - document.addEventListener("bim-demo:open-property-panel", () => { - this.show(); - }); - } - /** 显示属性面板 */ - show() { - if (!this.registry.dialog) { - console.warn("Dialog manager is not initialized"); - return; - } - if (this.isOpen()) - return; - const e = 360, t = document.body.clientWidth - e - 40; - this.dialog = this.registry.dialog.create({ - id: this.dialogId, - title: "panel.property.title", - content: "", - width: `${e}px`, - height: "500px", - position: { x: t, y: 20 }, - showMask: !1, - resizable: !0, - onClose: () => { - this.hide(); - } - }); - const n = document.createElement("div"); - n.style.height = "100%", n.style.display = "flex", n.style.flexDirection = "column", this.dialog.setContent(n), new q0({ - container: n, - tabs: [ - { - id: "props", - title: "panel.property.tab.props", - content: this.createPropsTabContent() - }, - { - id: "material", - title: "panel.property.tab.material", - content: this.createMaterialTabContent() - } - ] - }).init(); - } - /** 创建属性标签页内容 */ - createPropsTabContent() { - const e = document.createElement("div"); - return e.style.height = "100%", e.style.overflowY = "auto", new Jp({ - container: e, - accordion: !0, - activeIds: ["base", "location"], - items: [ - { - id: "base", - title: "panel.property.base", - content: this.createBaseInfoContent() - }, - { - id: "advanced", - title: "panel.property.advanced", - content: this.createAdvancedInfoContent(), - disabled: !1 - } - ] - }), e; - } - /** 创建材质标签页内容 */ - createMaterialTabContent() { - const e = document.createElement("div"); - return e.style.height = "100%", e.style.overflowY = "auto", new Jp({ - container: e, - accordion: !0, - activeIds: ["material"], - items: [ - { - id: "material", - title: "panel.property.material", - content: this.createMaterialContent() - } - ] - }), e; - } - /** 创建基本信息内容 */ - createBaseInfoContent() { - const e = document.createElement("div"); - return new sh({ - container: e, - labelWidth: "80px", - bordered: !0, - items: [ - { label: "Guid", value: '1f8d-4a2e-9c' }, - { label: "Name", value: "Basic Wall: Generic - 200mm" }, - { label: "Type", value: "Basic Wall" }, - { label: "Level", value: "Trane - Centrifugal Water Chiller - CVHF 2 Stage direct drive TAG(BP-RHS-1100RT) 0202104531 1" } - ] - }), e; - } - /** 创建高级信息内容 */ - createAdvancedInfoContent() { - const e = document.createElement("div"); - return new sh({ - container: e, - labelWidth: "100px", - bordered: !0, - items: [ - { label: "Area", value: "32.5 m²" }, - { label: "Volume", value: "6.5 m³" }, - { label: "Length", value: "5000 mm" }, - { label: "Phase", value: "New Construction" } - ] - }), e; - } - /** 创建材质内容 */ - createMaterialContent() { - const e = document.createElement("div"), t = document.createElement("div"); - t.style.display = "flex", t.style.alignItems = "center", t.style.marginBottom = "4px", t.innerHTML = ` -
- Concrete - Cast-in-Place Gray - `; - const n = document.createElement("div"); - return new sh({ - container: n, - items: [ - { label: "Preview", value: t }, - { label: "Class", value: "Concrete" }, - { label: "Density", value: "2400 kg/m³" }, - { label: "Thermal", value: "0.6 W/(m·K)" } - ] - }), e.appendChild(n), e; - } - /** - * 检查面板是否打开 - * @returns 是否打开 - */ - isOpen() { - return this.dialog !== null; - } - /** 隐藏面板 */ - hide() { - this.dialog && (this.dialog.destroy(), this.dialog = null); - } - /** 销毁管理器 */ - destroy() { - this.hide(), super.destroy(); - } -} class Or extends Ii { /** 对话框实例 */ dialog = null; @@ -47579,7 +47383,7 @@ class Or extends Ii { this.destroyDialog(), super.destroy(); } } -const NT = { +const CT = { distance: '', minDistance: '', angle: '', @@ -47651,9 +47455,9 @@ class Mo { init() { this.unsubscribeLocale = Jt.subscribe(() => { this.setLocales(); - }), this.unsubscribeTheme = rt.subscribe((e) => { + }), this.unsubscribeTheme = ot.subscribe((e) => { this.setTheme(e); - }), this.setLocales(), this.setTheme(rt.getTheme()), this.applyExpandedState(), this.applyActiveModeState(), this.applyViewState(), this.renderResult(), this.options.onModeChange && this.options.onModeChange(this.activeMode); + }), this.setLocales(), this.setTheme(ot.getTheme()), this.applyExpandedState(), this.applyActiveModeState(), this.applyViewState(), this.renderResult(), this.options.onModeChange && this.options.onModeChange(this.activeMode); } /** * 设置主题(实现 IBimComponent) @@ -47781,7 +47585,7 @@ class Mo { const x = i[g], m = document.createElement("button"); m.type = "button", m.className = "bim-measure-tool-btn", m.dataset.mode = x; const b = document.createElement("span"); - b.className = "bim-measure-tool-icon", b.innerHTML = NT[x] || r, m.appendChild(b), m.addEventListener("click", () => { + b.className = "bim-measure-tool-icon", b.innerHTML = CT[x] || r, m.appendChild(b), m.addEventListener("click", () => { this.setActiveMode(x); }), this.toolButtons.set(x, m), n.appendChild(m); } @@ -48087,7 +47891,7 @@ class Mo { return { numberText: this.formatNumberWithPrecision(n, this.config.precision), unitText: t }; } } -class kT extends Or { +class PT extends Or { /** 测量面板实例 */ panel = null; /** 测量配置(单位、精度等) */ @@ -48193,7 +47997,7 @@ class kT extends Or { this.panel && this.panel.openSettings(); } } -class UT { +class RT { element; options; // DOM 引用 @@ -48215,9 +48019,9 @@ class UT { init() { this.unsubscribeLocale = Jt.subscribe(() => { this.setLocales(); - }), this.unsubscribeTheme = rt.subscribe((e) => { + }), this.unsubscribeTheme = ot.subscribe((e) => { this.setTheme(e); - }), this.setLocales(), this.setTheme(rt.getTheme()); + }), this.setLocales(), this.setTheme(ot.getTheme()); } /** * 设置主题 @@ -48275,7 +48079,7 @@ class UT { return o.className = "section-plane-btn-label", i.appendChild(o), e === "hide" ? this.hideLabelEl = o : e === "reverse" ? this.reverseLabelEl = o : this.resetLabelEl = o, i.addEventListener("click", n), i; } } -class OT extends Or { +class LT extends Or { /** 剖切面板实例 */ panel = null; /** 对话框唯一标识 */ @@ -48312,7 +48116,7 @@ class OT extends Or { } /** 创建对话框内容 */ createContent() { - return this.panel = new UT({ + return this.panel = new RT({ onHide: () => { console.log("[SectionPlaneDialogManager] 隐藏"); }, @@ -48333,7 +48137,7 @@ class OT extends Or { this.panel && (this.panel.destroy(), this.panel = null); } } -class FT { +class DT { element; options; // 状态 @@ -48360,9 +48164,9 @@ class FT { init() { this.unsubscribeLocale = Jt.subscribe(() => { this.setLocales(); - }), this.unsubscribeTheme = rt.subscribe((e) => { + }), this.unsubscribeTheme = ot.subscribe((e) => { this.setTheme(e); - }), this.setLocales(), this.setTheme(rt.getTheme()), this.updateHideButtonState(), this.updateAxisButtonsState(); + }), this.setLocales(), this.setTheme(ot.getTheme()), this.updateHideButtonState(), this.updateAxisButtonsState(); } /** * 设置主题 @@ -48477,7 +48281,7 @@ class FT { this.axisXBtn.classList.toggle("active", this.activeAxis === "x"), this.axisYBtn.classList.toggle("active", this.activeAxis === "y"), this.axisZBtn.classList.toggle("active", this.activeAxis === "z"); } } -class zT extends Or { +class IT extends Or { /** 轴向剖切面板实例 */ panel = null; /** 对话框唯一标识 */ @@ -48510,7 +48314,7 @@ class zT extends Or { * 初始化轴向剖切面板并设置回调 */ createContent() { - return this.panel = new FT({ + return this.panel = new DT({ defaultAxis: "x", defaultHidden: !1, onHideToggle: (e) => { @@ -48569,12 +48373,12 @@ class zT extends Or { this.panel?.setActiveAxis(e); } } -const Qp = { +const $p = { x: { min: 0, max: 100 }, y: { min: 0, max: 100 }, z: { min: 0, max: 100 } }; -class HT { +class BT { element; options; isHidden = !1; @@ -48609,10 +48413,10 @@ class HT { pointerId: null }; constructor(e = {}) { - this.options = e, this.isHidden = e.defaultHidden ?? !1, this.isReversed = e.defaultReversed ?? !1, this.range = JSON.parse(JSON.stringify(e.defaultRange ?? Qp)); + this.options = e, this.isHidden = e.defaultHidden ?? !1, this.isReversed = e.defaultReversed ?? !1, this.range = JSON.parse(JSON.stringify(e.defaultRange ?? $p)); } init() { - this.element = this.createPanel(), this.unsubscribeLocale = Jt.subscribe(() => this.setLocales()), this.unsubscribeTheme = rt.subscribe((e) => this.setTheme(e)), this.setLocales(), this.setTheme(rt.getTheme()), this.updateButtonStates(), this.updateAllSlidersUI(), this.setupDragListeners(); + this.element = this.createPanel(), this.unsubscribeLocale = Jt.subscribe(() => this.setLocales()), this.unsubscribeTheme = ot.subscribe((e) => this.setTheme(e)), this.setLocales(), this.setTheme(ot.getTheme()), this.updateButtonStates(), this.updateAllSlidersUI(), this.setupDragListeners(); } // --- Public APIs --- setHiddenState(e) { @@ -48634,7 +48438,7 @@ class HT { return JSON.parse(JSON.stringify(this.range)); } reset() { - this.isHidden = this.options.defaultHidden ?? !1, this.isReversed = this.options.defaultReversed ?? !1, this.range = JSON.parse(JSON.stringify(this.options.defaultRange ?? Qp)), this.updateButtonStates(), this.updateAllSlidersUI(), this.options.onReset?.(), this.options.onRangeChange?.(this.range); + this.isHidden = this.options.defaultHidden ?? !1, this.isReversed = this.options.defaultReversed ?? !1, this.range = JSON.parse(JSON.stringify(this.options.defaultRange ?? $p)), this.updateButtonStates(), this.updateAllSlidersUI(), this.options.onReset?.(), this.options.onRangeChange?.(this.range); } // --- Private Setup --- createPanel() { @@ -48727,7 +48531,7 @@ class HT { this.unsubscribeLocale?.(), this.unsubscribeTheme?.(), this.element && this.element.parentElement && this.element.parentElement.removeChild(this.element); } } -class VT extends Or { +class NT extends Or { /** 剖切盒面板实例 */ panel = null; /** 对话框唯一标识 */ @@ -48760,7 +48564,7 @@ class VT extends Or { * 初始化剖切盒面板并设置回调 */ createContent() { - return this.panel = new HT({ + return this.panel = new BT({ defaultHidden: !1, defaultReversed: !1, onHideToggle: (e) => { @@ -48835,7 +48639,7 @@ class VT extends Or { this.panel?.setRange(e); } } -class GT { +class kT { element; options; // 状态 @@ -48875,7 +48679,7 @@ class GT { this.options = e, this.state.speed = e.defaultSpeed ?? 1, this.state.gravity = e.defaultGravity ?? !1, this.state.collision = e.defaultCollision ?? !1, this.state.characterModel = e.defaultCharacterModel ?? "construction-worker", this.state.walkMode = e.defaultWalkMode ?? "walk"; } init() { - this.element = this.createPanel(), this.updateSettingsView(), this.unsubscribeLocale = Jt.subscribe(() => this.setLocales()), this.unsubscribeTheme = rt.subscribe((e) => this.setTheme(e)), this.setLocales(), this.setTheme(rt.getTheme()); + this.element = this.createPanel(), this.updateSettingsView(), this.unsubscribeLocale = Jt.subscribe(() => this.setLocales()), this.unsubscribeTheme = ot.subscribe((e) => this.setTheme(e)), this.setLocales(), this.setTheme(ot.getTheme()); } // --- 公共方法 --- setPlanViewActive(e) { @@ -49000,14 +48804,14 @@ class GT { this.unsubscribeLocale?.(), this.unsubscribeTheme?.(), this.element && this.element.parentElement && this.element.parentElement.removeChild(this.element); } } -class WT { +class UT { element; unsubscribeLocale = null; unsubscribeTheme = null; constructor() { } init() { - this.element = this.createPanel(), this.unsubscribeLocale = Jt.subscribe(() => this.setLocales()), this.unsubscribeTheme = rt.subscribe((e) => this.setTheme(e)), this.setLocales(), this.setTheme(rt.getTheme()); + this.element = this.createPanel(), this.unsubscribeLocale = Jt.subscribe(() => this.setLocales()), this.unsubscribeTheme = ot.subscribe((e) => this.setTheme(e)), this.setLocales(), this.setTheme(ot.getTheme()); } createPanel() { const e = document.createElement("div"); @@ -49021,7 +48825,7 @@ class WT { this.unsubscribeLocale?.(), this.unsubscribeTheme?.(), this.element && this.element.parentElement && this.element.parentElement.removeChild(this.element); } } -class XT extends Or { +class OT extends Or { /** 漫游路径面板实例 */ panel = null; /** 对话框唯一标识 */ @@ -49058,7 +48862,7 @@ class XT extends Or { } /** 创建对话框内容 */ createContent() { - return this.panel = new WT(), this.panel.init(), this.panel.element; + return this.panel = new UT(), this.panel.init(), this.panel.element; } /** 对话框关闭时的回调 */ onDialogClose() { @@ -49069,7 +48873,7 @@ class XT extends Or { this.panel && (this.panel.destroy(), this.panel = null); } } -class jT extends Ii { +class FT extends Ii { /** 漫游控制面板实例 */ panel = null; /** 路径漫游对话框管理器 */ @@ -49079,7 +48883,7 @@ class jT extends Ii { } /** 初始化管理器 */ init() { - this.pathManager = new XT(), this.pathManager.init(); + this.pathManager = new OT(), this.pathManager.init(); } /** 显示漫游控制面板 */ show() { @@ -49087,7 +48891,7 @@ class jT extends Ii { console.warn("Toolbar not initialized"); return; } - this.registry.toolbar.hide(), console.log("[WalkControl] 打开漫游面板,激活第一人称模式"), this.registry.engine3d?.activateFirstPersonMode(), this.panel = new GT({ + this.registry.toolbar.hide(), console.log("[WalkControl] 打开漫游面板,激活第一人称模式"), this.registry.engine3d?.activateFirstPersonMode(), this.panel = new kT({ onPlanViewToggle: (e) => { console.log("[WalkControl] 地图:", e), e ? this.registry.map?.show() : this.registry.map?.hide(), this.emit("walk:plan-view-toggle", { isActive: e }); }, @@ -49132,14 +48936,14 @@ class jT extends Ii { this.hide(), this.pathManager?.destroy(), this.pathManager = null, super.destroy(); } } -class qT { +class zT { element; unsubscribeLocale = null; unsubscribeTheme = null; constructor() { } init() { - this.element = this.createPanel(), this.unsubscribeLocale = Jt.subscribe(() => this.setLocales()), this.unsubscribeTheme = rt.subscribe((e) => this.setTheme(e)), this.setLocales(), this.setTheme(rt.getTheme()); + this.element = this.createPanel(), this.unsubscribeLocale = Jt.subscribe(() => this.setLocales()), this.unsubscribeTheme = ot.subscribe((e) => this.setTheme(e)), this.setLocales(), this.setTheme(ot.getTheme()); } createPanel() { const e = document.createElement("div"); @@ -49153,7 +48957,7 @@ class qT { this.unsubscribeLocale?.(), this.unsubscribeTheme?.(), this.element && this.element.parentElement && this.element.parentElement.removeChild(this.element); } } -class ZT extends Or { +class HT extends Or { /** 地图面板实例 */ panel = null; /** 对话框唯一标识 */ @@ -49190,7 +48994,7 @@ class ZT extends Or { } /** 创建对话框内容 */ createContent() { - return this.panel = new qT(), this.panel.init(), this.panel.element; + return this.panel = new zT(), this.panel.init(), this.panel.element; } /** 对话框创建后的回调 */ onDialogCreated() { @@ -49209,7 +49013,258 @@ class ZT extends Or { super.hide(), this.emit("map:closed", {}); } } -class GA { +class VT { + element; + headerEl; + contentEl; + contentBoxEl; + arrowEl; + titleEl; + config; + parent; + constructor(e, t) { + this.config = e, this.parent = t, this.element = this.createDom(); + } + createDom() { + const e = document.createElement("div"); + if (e.className = `bim-collapse-item ${this.config.className || ""}`, this.config.disabled && e.classList.add("is-disabled"), e.dataset.id = this.config.id, this.headerEl = document.createElement("div"), this.headerEl.className = "bim-collapse-header", this.arrowEl = document.createElement("span"), this.arrowEl.className = "bim-collapse-arrow", this.arrowEl.innerHTML = '', this.headerEl.appendChild(this.arrowEl), this.config.icon) { + const t = document.createElement("span"); + t.className = "bim-collapse-icon", t.innerHTML = this.config.icon, this.headerEl.appendChild(t); + } + if (this.titleEl = document.createElement("span"), this.titleEl.className = "bim-collapse-title", this.titleEl.textContent = Ce(this.config.title), this.headerEl.appendChild(this.titleEl), this.config.extra) { + const t = document.createElement("div"); + t.className = "bim-collapse-extra", typeof this.config.extra == "string" ? t.innerHTML = this.config.extra : t.appendChild(this.config.extra), this.headerEl.appendChild(t); + } + return this.headerEl.addEventListener("click", () => { + this.config.disabled || this.parent.toggleItem(this.config.id); + }), e.appendChild(this.headerEl), this.contentEl = document.createElement("div"), this.contentEl.className = "bim-collapse-content is-hidden", this.contentBoxEl = document.createElement("div"), this.contentBoxEl.className = "bim-collapse-content-box", typeof this.config.content == "string" ? this.contentBoxEl.innerHTML = this.config.content : this.contentBoxEl.appendChild(this.config.content), this.contentEl.appendChild(this.contentBoxEl), e.appendChild(this.contentEl), e; + } + updateLocale() { + this.titleEl && (this.titleEl.textContent = Ce(this.config.title)); + } + setActive(e) { + e ? (this.element.classList.add("is-active"), this.contentEl.classList.remove("is-hidden")) : (this.element.classList.remove("is-active"), this.contentEl.classList.add("is-hidden")); + } +} +class Jp { + element; + options; + items = /* @__PURE__ */ new Map(); + activeIds = /* @__PURE__ */ new Set(); + unsubscribeLocale = null; + unsubscribeTheme = null; + constructor(e) { + this.options = { + bordered: !0, + accordion: !1, + ...e + }, this.element = document.createElement("div"), this.element.className = `bim-collapse ${this.options.className || ""}`, this.options.bordered || (this.element.style.border = "none"), this.options.ghost && this.element.classList.add("is-ghost"); + const t = typeof this.options.container == "string" ? document.getElementById(this.options.container) : this.options.container; + t && t.appendChild(this.element), this.options.activeIds && this.options.activeIds.forEach((n) => this.activeIds.add(n)), this.init(); + } + init() { + this.options.items.forEach((e) => { + const t = new VT(e, this); + this.items.set(e.id, t), this.element.appendChild(t.element), this.activeIds.has(e.id) && t.setActive(!0); + }), this.unsubscribeLocale = Jt.subscribe(() => { + this.setLocales(); + }), this.unsubscribeTheme = ot.subscribe((e) => { + this.setTheme(e); + }), this.setTheme(ot.getTheme()); + } + toggleItem(e) { + const t = this.activeIds.has(e); + this.options.accordion ? (this.activeIds.clear(), t || this.activeIds.add(e)) : t ? this.activeIds.delete(e) : this.activeIds.add(e), this.refreshState(), this.options.onChange && this.options.onChange(Array.from(this.activeIds)); + } + refreshState() { + this.items.forEach((e, t) => { + e.setActive(this.activeIds.has(t)); + }); + } + setTheme(e) { + const t = this.element.style; + t.setProperty("--bim-bg-elevated", e.bgElevated), t.setProperty("--bim-border-default", e.borderDefault), t.setProperty("--bim-border-subtle", e.borderSubtle), t.setProperty("--bim-border-strong", e.borderStrong), t.setProperty("--bim-text-primary", e.textPrimary), t.setProperty("--bim-text-disabled", e.textDisabled), t.setProperty("--bim-component-bg", e.componentBg), t.setProperty("--bim-component-bg-hover", e.componentBgHover), t.setProperty("--bim-component-bg-active", e.componentBgActive); + } + setLocales() { + this.items.forEach((e) => e.updateLocale()); + } + destroy() { + this.unsubscribeLocale && (this.unsubscribeLocale(), this.unsubscribeLocale = null), this.unsubscribeTheme && (this.unsubscribeTheme(), this.unsubscribeTheme = null), this.element.remove(), this.items.clear(); + } +} +class GT extends Ii { + dialogId = "component-detail-dialog"; + dialog = null; + currentSelection = null; + unsubscribeSelected = null; + unsubscribeDeselected = null; + tabInstance = null; + propertiesData = null; + constructor() { + super(); + } + init() { + this.unsubscribeSelected = this.registry.on("component:selected", (e) => { + this.currentSelection = e, this.isOpen() && this.loadAndRenderContent(); + }), this.unsubscribeDeselected = this.registry.on("component:deselected", () => { + this.currentSelection = null, this.isOpen() && this.renderNoSelection(); + }); + } + show() { + if (!this.registry.dialog) { + console.warn("[ComponentDetailManager] Dialog manager not initialized"); + return; + } + this.isOpen() || this.createDialog(), this.currentSelection ? this.loadAndRenderContent() : this.renderNoSelection(); + } + createDialog() { + const t = document.body.clientWidth - 300 - 40; + this.dialog = this.registry.dialog?.create({ + id: this.dialogId, + title: "panel.componentDetail.title", + content: "", + width: "300px", + height: "500px", + position: { x: t, y: 20 }, + resizable: !0, + onClose: () => this.hide() + }); + } + loadAndRenderContent() { + !this.dialog || !this.currentSelection || (this.showLoading(), this.registry.engine3d?.getComponentProperties( + this.currentSelection.url, + this.currentSelection.id, + (e) => { + this.propertiesData = e, this.renderTabbedContent(); + } + )); + } + showLoading() { + const e = document.createElement("div"); + e.style.cssText = "height:100%;display:flex;align-items:center;justify-content:center;", e.textContent = "加载中...", this.dialog?.setContent(e); + } + renderNoSelection() { + if (!this.dialog) return; + const e = document.createElement("div"); + e.style.cssText = "height:100%;display:flex;align-items:center;justify-content:center;color:var(--bim-text-secondary,#999);", e.textContent = Ce("panel.componentDetail.noSelection") || "请先选中构件", this.dialog.setContent(e); + } + renderTabbedContent() { + if (!this.dialog) return; + this.tabInstance && (this.tabInstance.destroy(), this.tabInstance = null); + const e = document.createElement("div"); + e.style.cssText = "height:100%;display:flex;flex-direction:column;"; + const t = this.createPropertiesPanel(), n = this.createMaterialsPanel(); + this.tabInstance = new j0({ + container: e, + activeId: "properties", + tabs: [ + { + id: "properties", + title: "panel.property.tab.props", + content: t + }, + { + id: "materials", + title: "panel.property.tab.material", + content: n + } + ] + }), this.tabInstance.init(), this.dialog.setContent(e); + } + createPropertiesPanel() { + const e = document.createElement("div"); + e.style.cssText = "height:100%;overflow-y:auto;"; + const t = this.propertiesData?.properties || []; + if (t.length === 0) + return e.innerHTML = '
无属性数据
', e; + const n = t.map((r, o) => ({ + id: `category-${o}`, + title: r.name || `分类 ${o + 1}`, + content: this.createCategoryContent(r.children || []) + })); + new Jp({ + container: e, + accordion: !1, + ghost: !0, + activeIds: n.length > 0 ? [n[0].id] : [], + items: n + }); + const i = document.createElement("style"); + return i.textContent = ` + #${this.dialogId} .bim-collapse-header { + background-color: var(--bim-component-bg-hover) !important; + } + #${this.dialogId} .bim-collapse-header:hover { + background-color: var(--bim-component-bg-active) !important; + } + `, e.appendChild(i), e; + } + createMaterialsPanel() { + const e = document.createElement("div"); + e.style.cssText = "height:100%;overflow-y:auto;"; + const t = this.propertiesData?.materials || []; + if (t.length === 0) + return e.innerHTML = '
无材质数据
', e; + const n = t.map((r, o) => ({ + id: `material-${o}`, + title: r.name || `材质 ${o + 1}`, + content: this.createCategoryContent(r.children || r.properties || []) + })); + new Jp({ + container: e, + accordion: !1, + ghost: !0, + activeIds: n.length > 0 ? [n[0].id] : [], + items: n + }); + const i = document.createElement("style"); + return i.textContent = ` + #${this.dialogId} .bim-collapse-header { + background-color: var(--bim-component-bg-hover) !important; + } + #${this.dialogId} .bim-collapse-header:hover { + background-color: var(--bim-component-bg-active) !important; + } + `, e.appendChild(i), e; + } + createCategoryContent(e) { + const t = document.createElement("div"); + return e.forEach((n, i) => { + const r = document.createElement("div"); + r.style.cssText = ` + display: flex; + border-bottom: 1px solid var(--bim-border-default, rgba(255,255,255,0.15)); + `, i === e.length - 1 && (r.style.borderBottom = "none"); + const o = document.createElement("div"); + o.style.cssText = ` + width: 120px; + flex-shrink: 0; + color: var(--bim-text-secondary, #999); + font-size: 13px; + padding: 8px 12px; + border-right: 1px solid var(--bim-border-default, rgba(255,255,255,0.15)); + `, o.textContent = n.name || "-"; + const a = document.createElement("div"); + a.style.cssText = ` + flex: 1; + color: var(--bim-text-primary, #fff); + font-size: 13px; + padding: 8px 12px; + word-break: break-all; + `, a.textContent = String(n.value ?? "-"), r.appendChild(o), r.appendChild(a), t.appendChild(r); + }), t; + } + isOpen() { + return this.dialog !== null; + } + hide() { + this.tabInstance && (this.tabInstance.destroy(), this.tabInstance = null), this.dialog && (this.dialog.destroy(), this.dialog = null); + } + destroy() { + this.unsubscribeSelected && (this.unsubscribeSelected(), this.unsubscribeSelected = null), this.unsubscribeDeselected && (this.unsubscribeDeselected(), this.unsubscribeDeselected = null), this.hide(), super.destroy(); + } +} +class OA { container; wrapper = null; registry; @@ -49219,17 +49274,17 @@ class GA { dialog = null; engine = null; rightKey = null; - propertyPanel = null; measure = null; sectionPlane = null; sectionAxis = null; sectionBox = null; walkControl = null; map = null; + componentDetail = null; constructor(e, t) { const n = typeof e == "string" ? document.getElementById(e) : e; if (!n) throw new Error("Container not found"); - this.container = n, this.registry = bt.getInstance(), t?.locale && Jt.setLocale(t.locale), t?.theme && (t.theme === "custom" ? console.warn("Custom theme should be set via setCustomTheme().") : rt.setTheme(t.theme)), this.init(); + this.container = n, this.registry = wt.getInstance(), t?.locale && Jt.setLocale(t.locale), t?.theme && (t.theme === "custom" ? console.warn("Custom theme should be set via setCustomTheme().") : ot.setTheme(t.theme)), this.init(); } emit(e, t) { this.registry.emit(e, t); @@ -49244,13 +49299,13 @@ class GA { return Jt.getLocale(); } setTheme(e) { - rt.setTheme(e); + ot.setTheme(e); } setCustomTheme(e) { - rt.setCustomTheme(e); + ot.setCustomTheme(e); } init() { - this.container.innerHTML = "", this.wrapper = document.createElement("div"), this.wrapper.className = "bim-engine-wrapper", this.container.appendChild(this.wrapper), this.registry.container = this.container, this.registry.wrapper = this.wrapper, this.engine = new CT(this.wrapper), this.dialog = new ug(this.wrapper), this.toolbar = new lg(this.wrapper), this.buttonGroup = new cg(this.wrapper), this.rightKey = new j0(this.wrapper), this.constructTreeBtn = new DT(this.wrapper), this.propertyPanel = new BT(), this.measure = new kT(), this.sectionPlane = new OT(), this.sectionAxis = new zT(), this.sectionBox = new VT(), this.walkControl = new jT(), this.walkControl.init(), this.map = new ZT(), this.map.init(), this.registry.engine3d = this.engine, this.registry.dialog = this.dialog, this.registry.toolbar = this.toolbar, this.registry.buttonGroup = this.buttonGroup, this.registry.rightKey = this.rightKey, this.registry.constructTree = this.constructTreeBtn, this.registry.propertyPanel = this.propertyPanel, this.registry.measure = this.measure, this.registry.sectionPlane = this.sectionPlane, this.registry.sectionAxis = this.sectionAxis, this.registry.sectionBox = this.sectionBox, this.registry.walkControl = this.walkControl, this.registry.map = this.map, this.updateTheme(rt.getTheme()), rt.subscribe((e) => { + this.container.innerHTML = "", this.wrapper = document.createElement("div"), this.wrapper.className = "bim-engine-wrapper", this.container.appendChild(this.wrapper), this.registry.container = this.container, this.registry.wrapper = this.wrapper, this.engine = new wT(this.wrapper), this.dialog = new hg(this.wrapper), this.toolbar = new ag(this.wrapper), this.buttonGroup = new lg(this.wrapper), this.rightKey = new X0(this.wrapper), this.constructTreeBtn = new AT(this.wrapper), this.measure = new PT(), this.sectionPlane = new LT(), this.sectionAxis = new IT(), this.sectionBox = new NT(), this.walkControl = new FT(), this.walkControl.init(), this.map = new HT(), this.map.init(), this.registry.engine3d = this.engine, this.registry.dialog = this.dialog, this.registry.toolbar = this.toolbar, this.registry.buttonGroup = this.buttonGroup, this.registry.rightKey = this.rightKey, this.registry.constructTree = this.constructTreeBtn, this.registry.measure = this.measure, this.registry.sectionPlane = this.sectionPlane, this.registry.sectionAxis = this.sectionAxis, this.registry.sectionBox = this.sectionBox, this.registry.walkControl = this.walkControl, this.registry.map = this.map, this.componentDetail = new GT(), this.registry.componentDetail = this.componentDetail, this.componentDetail.init(), this.updateTheme(ot.getTheme()), ot.subscribe((e) => { this.updateTheme(e); }); } @@ -49258,10 +49313,10 @@ class GA { this.wrapper && (this.wrapper.style.color = e.textPrimary); } destroy() { - this.toolbar?.destroy(), this.buttonGroup?.destroy(), this.engine?.destroy(), this.dialog?.destroy(), this.rightKey?.destroy(), this.propertyPanel?.destroy(), this.measure?.destroy(), this.sectionPlane?.destroy(), this.sectionAxis?.destroy(), this.sectionBox?.destroy(), this.walkControl?.destroy(), this.container.innerHTML = "", bt.reset(); + this.toolbar?.destroy(), this.buttonGroup?.destroy(), this.engine?.destroy(), this.dialog?.destroy(), this.rightKey?.destroy(), this.measure?.destroy(), this.sectionPlane?.destroy(), this.sectionAxis?.destroy(), this.sectionBox?.destroy(), this.walkControl?.destroy(), this.container.innerHTML = "", wt.reset(); } } -const YT = () => ({ +const WT = () => ({ id: "home", groupId: "group-1", type: "button", @@ -49269,12 +49324,12 @@ const YT = () => ({ icon: Pt("主视角"), keepActive: !1, onClick: (s) => { - console.log("首页按钮被点击:", s.id), bt.getInstance().engine3d?.CameraGoHome(); + console.log("首页按钮被点击:", s.id), wt.getInstance().engine3d?.CameraGoHome(); } -}), KT = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), XT = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createHomeButton: YT -}, Symbol.toStringTag, { value: "Module" })), $T = () => ({ + createHomeButton: WT +}, Symbol.toStringTag, { value: "Module" })), jT = () => ({ id: "zoom-box", groupId: "group-1", keepActive: !1, @@ -49282,12 +49337,12 @@ const YT = () => ({ label: "toolbar.zoomBox", icon: Pt("框选放大"), onClick: () => { - bt.getInstance().engine3d?.activateZoomBox(); + wt.getInstance().engine3d?.activateZoomBox(); } -}), JT = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), qT = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createZoomBoxButton: $T -}, Symbol.toStringTag, { value: "Module" })), QT = () => ({ + createZoomBoxButton: jT +}, Symbol.toStringTag, { value: "Module" })), ZT = () => ({ id: "walk", groupId: "group-1", type: "button", @@ -49295,13 +49350,13 @@ const YT = () => ({ align: "vertical", icon: Pt("漫游"), onClick: () => { - console.log("漫游按钮被点击"), bt.getInstance().walkControl?.show(); + console.log("漫游按钮被点击"), wt.getInstance().walkControl?.show(); } -}), eA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), YT = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createWalkMenuButton: QT -}, Symbol.toStringTag, { value: "Module" })), tA = () => { - const s = bt.getInstance(); + createWalkMenuButton: ZT +}, Symbol.toStringTag, { value: "Module" })), KT = () => { + const s = wt.getInstance(); return s.on("map:opened", () => { s.toolbar?.setBtnActive("map", !0); }), s.on("map:closed", () => { @@ -49318,10 +49373,10 @@ const YT = () => ({ s.map?.isOpen() ? s.map?.hide() : s.map?.show(); } }; -}, nA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}, $T = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createMapButton: tA -}, Symbol.toStringTag, { value: "Module" })), iA = () => ({ + createMapButton: KT +}, Symbol.toStringTag, { value: "Module" })), JT = () => ({ id: "property", groupId: "group-1", type: "button", @@ -49329,12 +49384,12 @@ const YT = () => ({ align: "vertical", icon: Pt("文档"), onClick: () => { - console.log("构件详情按钮被点击"), bt.getInstance().propertyPanel?.show(); + console.log("构件详情按钮被点击"), wt.getInstance().componentDetail?.show(); } -}), sA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), QT = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createPropertyButton: iA -}, Symbol.toStringTag, { value: "Module" })), rA = () => ({ + createPropertyButton: JT +}, Symbol.toStringTag, { value: "Module" })), eA = () => ({ id: "setting", groupId: "group-2", type: "button", @@ -49344,10 +49399,10 @@ const YT = () => ({ onClick: (s) => { console.log("设置按钮被点击:", s.id); } -}), oA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), tA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createSettingButton: rA -}, Symbol.toStringTag, { value: "Module" })), aA = () => ({ + createSettingButton: eA +}, Symbol.toStringTag, { value: "Module" })), nA = () => ({ id: "info", groupId: "group-2", type: "button", @@ -49355,12 +49410,12 @@ const YT = () => ({ icon: Pt("信息"), keepActive: !1, onClick: () => { - bt.getInstance().emit("ui:open-dialog", { id: "info" }); + wt.getInstance().emit("ui:open-dialog", { id: "info" }); } -}), lA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), iA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createInfoButton: aA -}, Symbol.toStringTag, { value: "Module" })), cA = () => ({ + createInfoButton: nA +}, Symbol.toStringTag, { value: "Module" })), sA = () => ({ id: "fullscreen", groupId: "group-2", type: "button", @@ -49386,10 +49441,10 @@ const YT = () => ({ console.error("全屏操作失败:", e), e && e.message && e.message.includes("denied") && console.error('全屏请求被拒绝。如果是 Iframe,请检查 allow="fullscreen"。如果是自动触发,请确保由用户点击触发。'); } } -}), hA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), rA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createFullscreenButton: cA -}, Symbol.toStringTag, { value: "Module" })), uA = () => ({ + createFullscreenButton: sA +}, Symbol.toStringTag, { value: "Module" })), oA = () => ({ id: "measure", groupId: "group-1", type: "button", @@ -49397,13 +49452,13 @@ const YT = () => ({ icon: Pt("测量"), keepActive: !0, onClick: (s) => { - const e = bt.getInstance(); + const e = wt.getInstance(); s.isActive ? e.measure?.show() : e.measure?.destroy(); } -}), dA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), aA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createMeasureButton: uA -}, Symbol.toStringTag, { value: "Module" })), fA = () => ({ + createMeasureButton: oA +}, Symbol.toStringTag, { value: "Module" })), lA = () => ({ id: "section", groupId: "group-1", type: "menu", @@ -49414,10 +49469,10 @@ const YT = () => ({ onClick: (s) => { console.log("剖切按钮被点击:", s.id); } -}), pA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), cA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createSectionMenuButton: fA -}, Symbol.toStringTag, { value: "Module" })), mA = () => ({ + createSectionMenuButton: lA +}, Symbol.toStringTag, { value: "Module" })), hA = () => ({ id: "section-plane", groupId: "group-1", parentId: "section", @@ -49429,13 +49484,13 @@ const YT = () => ({ icon: Pt("拾曲面剖切"), onClick: (s) => { console.log("拾取面剖切被点击:", s.id, "激活状态:", s.isActive); - const e = bt.getInstance(); + const e = wt.getInstance(); s.isActive ? e.sectionPlane?.show() : e.sectionPlane?.hide(); } -}), gA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), uA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createSectionPlaneButton: mA -}, Symbol.toStringTag, { value: "Module" })), xA = () => ({ + createSectionPlaneButton: hA +}, Symbol.toStringTag, { value: "Module" })), dA = () => ({ id: "section-axis", groupId: "group-1", parentId: "section", @@ -49446,13 +49501,13 @@ const YT = () => ({ label: "toolbar.sectionAxis", icon: Pt("轴向剖切"), onClick: (s) => { - const e = bt.getInstance(); + const e = wt.getInstance(); s.isActive ? e.sectionAxis?.show() : e.sectionAxis?.destroy(); } -}), vA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), fA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createSectionAxisButton: xA -}, Symbol.toStringTag, { value: "Module" })), bA = () => ({ + createSectionAxisButton: dA +}, Symbol.toStringTag, { value: "Module" })), pA = () => ({ id: "section-box", groupId: "group-1", parentId: "section", @@ -49464,13 +49519,13 @@ const YT = () => ({ icon: Pt("剖切盒"), onClick: (s) => { console.log("剖切盒被点击:", s.id, "激活状态:", s.isActive); - const e = bt.getInstance(); + const e = wt.getInstance(); s.isActive ? e.sectionBox?.show() : e.sectionBox?.hide(); } -}), yA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +}), mA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - createSectionBoxButton: bA -}, Symbol.toStringTag, { value: "Module" })), _A = `# BIM引擎AI助手 - 需求分析与步骤规划专家 + createSectionBoxButton: pA +}, Symbol.toStringTag, { value: "Module" })), gA = `# BIM引擎AI助手 - 需求分析与步骤规划专家 ## 角色定位 @@ -49640,10 +49695,10 @@ json内容 5. **用户友好**:步骤描述要清晰易懂,便于用户理解整个执行流程 -''`, MA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +''`, xA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - default: _A -}, Symbol.toStringTag, { value: "Module" })), wA = `# BIM引擎AI助手 - 代码生成专家 + default: gA +}, Symbol.toStringTag, { value: "Module" })), vA = `# BIM引擎AI助手 - 代码生成专家 ## 角色定位 @@ -49889,10 +49944,10 @@ try { 5. **代码可读性**:优先保证代码的可读性,而不是追求"高级"写法 6. **注释清晰**:关键逻辑要有注释,但不要过度注释 7. **性能考虑**:对于大量数据的处理,考虑性能优化 -8. **测试友好**:生成的代码应该便于测试和调试 `, SA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +8. **测试友好**:生成的代码应该便于测试和调试 `, bA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - default: wA -}, Symbol.toStringTag, { value: "Module" })), EA = `# BIM Engine SDK API 文档 + default: vA +}, Symbol.toStringTag, { value: "Module" })), yA = `# BIM Engine SDK API 文档 本文档为 BIM Engine SDK 的完整 API 参考,适合大模型阅读和理解引擎的功能结构。 @@ -51396,11 +51451,11 @@ BIM Engine SDK 提供了完整的 3D BIM 模型渲染和交互能力,主要特 - 施工模拟 - 运维管理 - AI 辅助设计 -`, TA = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +`, _A = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - default: EA + default: yA }, Symbol.toStringTag, { value: "Module" })); export { - GA as BimEngine + OA as BimEngine }; //# sourceMappingURL=iflow-engine.es.js.map diff --git a/demo/lib/iflow-engine.umd.js b/demo/lib/iflow-engine.umd.js index 1051a56..f92a9db 100644 --- a/demo/lib/iflow-engine.umd.js +++ b/demo/lib/iflow-engine.umd.js @@ -1,14 +1,14 @@ -(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode('.bim-engine-wrapper{position:relative;width:100%;height:100%;font-family:sans-serif;box-sizing:border-box;overflow:hidden;background:linear-gradient(to bottom,#d6e0eb,#f6faff)}.bim-engine-opt-btn-container{z-index:100}.bim-construct-tree-btn{position:absolute;top:20px;left:20px!important;z-index:100}.bim-btn-group-root{display:flex;gap:8px;z-index:1000;position:absolute;pointer-events:auto}.bim-btn-group-root.static{position:relative;inset:auto;transform:none}.bim-btn-group-root.dir-row{flex-direction:row;align-items:center}.bim-btn-group-root.dir-column{flex-direction:column;align-items:stretch}.bim-btn-group-section{display:flex;gap:4px;background-color:var(--bim-btn-group-section-bg, rgba(17, 17, 17, .88));border-radius:6px;padding:4px;box-shadow:0 2px 8px #0000004d,0 1px 3px #0003}.bim-btn-group-root.dir-row .bim-btn-group-section{flex-direction:row;align-items:center}.bim-btn-group-root.dir-column .bim-btn-group-section{flex-direction:column}.opt-btn-wrapper{position:relative}.opt-btn{display:flex;cursor:pointer;border-radius:4px;transition:background-color .2s,color .2s,border-color .2s;color:var(--bim-btn-text-color, #ccc);background-color:var(--bim-btn-bg, transparent);padding:6px;align-items:center;position:relative;justify-content:center;border:1px solid transparent;outline:none}.opt-btn:hover{background-color:var(--bim-btn-hover-bg, #444)}.opt-btn.active{background-color:var(--bim-btn-active-bg, rgba(255, 255, 255, .15));color:var(--bim-btn-text-active-color, #fff)}.opt-btn.disabled{opacity:.5;cursor:not-allowed}.opt-btn-icon{width:var(--bim-icon-size, 24px);height:var(--bim-icon-size, 24px);display:flex;align-items:center;justify-content:center;color:var(--bim-icon-color, #ccc);flex-shrink:0}.opt-btn-icon svg{width:100%;height:100%;fill:currentColor}.opt-btn-arrow{font-size:10px;opacity:.6;transition:transform .2s;display:inline-block;margin-left:4px}.opt-btn-arrow.rotated{transform:rotate(180deg)}.opt-btn-text-wrapper{display:flex;align-items:center;justify-content:center;pointer-events:none}.opt-btn-label{display:inline}.opt-btn.no-label .opt-btn-label{display:none}.opt-btn.align-vertical:not(.no-label){flex-direction:column;text-align:center}.opt-btn.align-vertical:not(.no-label) .opt-btn-text-wrapper{margin-top:4px}.opt-btn.align-vertical:not(.no-label) .opt-btn-label{font-size:12px;line-height:1.2}.opt-btn.align-horizontal:not(.no-label){flex-direction:row}.opt-btn.align-horizontal:not(.no-label) .opt-btn-text-wrapper{margin-left:8px}.opt-btn.align-horizontal:not(.no-label) .opt-btn-label{font-size:14px}.opt-btn.no-label .opt-btn-text-wrapper{width:0;height:0;margin:0;padding:0;overflow:visible;position:absolute;top:0;right:0}.opt-btn.no-label .opt-btn-arrow{position:absolute;top:2px;right:2px;margin:0;font-size:8px}.opt-btn-dropdown{position:absolute;background-color:var(--bim-toolbar-bg, rgba(17, 17, 17, .95));border-radius:4px;padding:4px;box-shadow:0 4px 12px #0003;z-index:1001;display:flex;flex-direction:column;border:1px solid rgba(255,255,255,.1);opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .2s ease,transform .2s cubic-bezier(.2,0,.2,1),visibility .2s}@keyframes dropdown-fade-in{0%{opacity:0;transform:translateY(-8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.opt-btn-dropdown{animation:dropdown-fade-in .2s cubic-bezier(.2,0,.2,1) forwards;opacity:1;visibility:visible;transform:none}.opt-btn-dropdown-item{display:flex;align-items:center;padding:8px 12px;cursor:pointer;border-radius:4px;color:var(--bim-btn-text-color, #ccc);transition:background .2s,border-color .2s,color .2s;box-sizing:border-box;border:1px solid transparent;outline:none}.opt-btn-dropdown-item .opt-btn-icon{color:var(--bim-icon-color, #ccc)}.opt-btn-dropdown-item:hover{background-color:var(--bim-btn-hover-bg, #444)}.opt-btn-dropdown-item.active{background-color:var(--bim-btn-active-bg, rgba(255, 255, 255, .15));color:var(--bim-btn-text-active-color, #fff)}.opt-btn-dropdown-item.align-horizontal{flex-direction:row}.opt-btn-dropdown-item.align-horizontal .opt-btn-icon{width:18px;height:18px;margin-right:8px}.opt-btn-dropdown-item.align-vertical{flex-direction:column;text-align:center}.opt-btn-dropdown-item.align-vertical .opt-btn-icon{width:24px;height:24px;margin-bottom:4px}.opt-btn-dropdown-item.align-vertical .opt-btn-dropdown-label{font-size:12px}.bim-btn-group-root.is-bottom-toolbar .opt-btn-icon{width:32px;height:32px}.bim-btn-group-root.is-bottom-toolbar .opt-btn{padding:8px}.bim-btn-group-root.type-glass-pill .bim-btn-group-section{background:var(--bim-floating-bg);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:1px solid var(--bim-floating-border);border-radius:9999px;box-shadow:var(--bim-floating-shadow);padding:8px;gap:10px}.bim-btn-group-root.type-glass-pill .opt-btn{width:48px;height:48px;min-width:48px;border-radius:9999px;background:var(--bim-floating-btn-bg);border:1px solid var(--bim-floating-btn-border);box-shadow:var(--bim-floating-btn-shadow);color:var(--bim-text-primary);padding:0;transition:all .2s ease-out}.bim-btn-group-root.type-glass-pill .opt-btn:hover{background:var(--bim-floating-btn-bg-hover);transform:scale(1.05);box-shadow:var(--bim-floating-btn-shadow-hover)}.bim-btn-group-root.type-glass-pill .opt-btn:active{transform:scale(.98)}.bim-btn-group-root.type-glass-pill .opt-btn.active{background:var(--bim-primary);border:1px solid var(--bim-primary-active);color:var(--bim-text-inverse);box-shadow:var(--bim-shadow-glow)}.bim-btn-group-root.type-glass-pill .opt-btn.active:hover{background:var(--bim-primary-hover);transform:scale(1.05)}.bim-btn-group-root.type-glass-pill .opt-btn.active:active{transform:scale(.98)}.bim-btn-group-root.type-glass-pill .opt-btn.active .opt-btn-icon{color:var(--bim-icon-inverse)}.bim-btn-group-root.type-glass-pill .opt-btn.disabled{opacity:.3;cursor:not-allowed;transform:none;box-shadow:none}.bim-btn-group-root.type-glass-pill .opt-btn-icon{width:18px;height:18px;color:var(--bim-floating-icon-color);transition:color .2s ease-out}.bim-btn-group-root.type-glass-pill .opt-btn-icon svg{width:18px;height:18px}.bim-btn-group-root.type-glass-pill .opt-btn:hover .opt-btn-icon{color:var(--bim-floating-icon-color-hover)}.bim-btn-group-root.type-glass-pill .opt-btn-label{display:none!important}.bim-btn-group-root.type-glass-pill .opt-btn-text-wrapper{position:absolute;top:2px;right:2px;width:0;height:0;margin:0;padding:0}.bim-btn-group-root.type-glass-pill .opt-btn-arrow{font-size:8px;position:absolute;top:0;right:0;color:var(--bim-text-tertiary)}.opt-btn-dropdown.type-glass-pill{background:#fffffff2;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid rgba(226,232,240,.6);border-radius:12px;box-shadow:0 8px 24px #0000001f;padding:6px}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item{display:flex;flex-direction:row;align-items:center;gap:10px;border-radius:8px;color:#334155;padding:8px 12px;font-size:13px;font-weight:400;transition:all .1s ease-out}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item:hover{background:#f1f5f9}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item:active{background:#e2e8f0}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item.active{background:#3b82f6;color:#fff}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item.active .opt-btn-icon,.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item.active .opt-btn-dropdown-label{color:#fff}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item .opt-btn-icon{width:18px;height:18px;color:#334155;flex-shrink:0}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item .opt-btn-icon svg{width:18px;height:18px}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item .opt-btn-dropdown-label{white-space:nowrap;color:#334155}.opt-btn-dropdown.type-glass-pill.theme-dark{background:var(--bim-bg-overlay);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid var(--bim-border-default);box-shadow:var(--bim-shadow-lg)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item{color:var(--bim-text-primary)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item:hover{background:var(--bim-floating-btn-bg)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item:active{background:var(--bim-floating-btn-bg-hover)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item.active{background:var(--bim-primary);color:var(--bim-text-inverse)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item .opt-btn-icon{color:var(--bim-floating-icon-color)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item .opt-btn-dropdown-label{color:var(--bim-text-primary)}.bim-dialog{position:absolute;background-color:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);border-radius:var(--bim-panel-radius, 12px);box-shadow:var(--bim-shadow-lg);display:flex;flex-direction:column;z-index:10001;color:var(--bim-dialog-title-color, var(--bim-text-primary));overflow:hidden;min-width:200px;min-height:100px;pointer-events:auto}.bim-dialog-header{height:40px;background-color:var(--bim-bg-inset);display:flex;align-items:center;justify-content:space-between;padding:0 12px;cursor:default;-webkit-user-select:none;user-select:none;border-bottom:1px solid var(--bim-border-default);flex-shrink:0}.bim-dialog-header.draggable{cursor:move}.bim-dialog-title{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--bim-dialog-title-color)}.bim-dialog-close{cursor:pointer;font-size:18px;color:var(--bim-text-tertiary);line-height:1;margin-left:8px}.bim-dialog-close:hover{color:var(--bim-text-primary)}.bim-dialog-content{flex:1;overflow:auto;font-size:14px;color:var(--bim-dialog-text-color, var(--bim-text-secondary))}.bim-dialog-resize-handle{position:absolute;width:10px;height:10px;bottom:0;right:0;cursor:se-resize;z-index:10}.bim-dialog-resize-handle:after{content:"";position:absolute;bottom:3px;right:3px;width:6px;height:6px;border-right:2px solid var(--bim-text-tertiary);border-bottom:2px solid var(--bim-text-tertiary)}.bim-dialog-resize-handle:hover:after{border-color:var(--bim-text-primary)}.bim-info-dialog-content{padding:16px;font-family:sans-serif;color:#333}.bim-info-dialog-content h3{margin-top:0;margin-bottom:12px;border-bottom:1px solid #eee;padding-bottom:8px;color:#0078d4}.bim-info-dialog-content ul{list-style:none;padding:0;margin:0}.bim-info-dialog-content li{margin-bottom:8px;font-size:14px;display:flex}.bim-info-dialog-content li strong{width:80px;color:#555}.bim-right-key{position:fixed;z-index:10000;display:none;background:transparent}.bim-right-key.visible{display:block}.bim-menu{display:flex;flex-direction:column;background:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);border-radius:8px;padding:6px;margin:0;list-style:none;min-width:160px;box-shadow:var(--bim-shadow-lg);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;-webkit-user-select:none;user-select:none;color:var(--bim-text-primary)}.bim-menu-group{display:flex;flex-direction:column}.bim-menu-divider{height:1px;background-color:var(--bim-divider);margin:4px 0}.bim-menu-item{display:flex;align-items:center;padding:8px 12px;cursor:pointer;transition:all .2s ease;font-size:13px;position:relative;color:var(--bim-text-primary);border-radius:6px}.bim-menu-item:hover{background-color:var(--bim-floating-btn-bg);transform:translate(2px)}.bim-menu-item.disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.bim-menu-item-icon{width:16px;height:16px;margin-right:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.bim-menu-item-icon svg{width:100%;height:100%;fill:currentColor}.bim-menu-item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bim-menu-item-arrow{width:12px;height:12px;margin-left:8px;display:flex;align-items:center;justify-content:center;opacity:.7}.bim-menu-item-arrow svg{width:100%;height:100%;fill:currentColor}.bim-tree{width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden;font-size:14px;color:var(--bim-text-primary);-webkit-user-select:none;user-select:none;position:relative;background:transparent}.bim-tree-search{padding:6px;background-color:transparent;flex-shrink:0;position:relative}.bim-tree-search-wrapper{position:relative;width:100%;display:flex;align-items:center}.bim-tree-search-icon{position:absolute;left:8px;width:16px;height:16px;color:var(--bim-text-secondary);pointer-events:none;display:flex;align-items:center;justify-content:center}.bim-tree-search-icon svg{width:100%;height:100%}.bim-tree-search-input{width:100%;height:30px;padding:4px 8px 4px 30px;border:1px solid var(--bim-border-default);border-radius:4px;outline:none;font-size:13px;color:inherit;background-color:var(--bim-bg-elevated);transition:all .2s;box-sizing:border-box}.bim-tree-search-input:focus{border-color:var(--bim-primary);box-shadow:var(--bim-focus-ring)}.bim-tree-search-results{position:absolute;top:100%;left:8px;right:8px;background-color:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);box-shadow:var(--bim-shadow-md);border-radius:4px;max-height:200px;overflow-y:auto;z-index:10;display:none}.bim-tree-search-results.is-visible{display:block}.bim-tree-search-item{padding:8px 12px;cursor:pointer;border-bottom:1px solid rgba(0,0,0,.03)}.bim-tree-search-item:last-child{border-bottom:none}.bim-tree-search-item:hover{background-color:var(--bim-component-bg-hover)}.bim-tree-search-item-title{font-weight:500;display:block}.bim-tree-search-item-path{font-size:12px;color:var(--bim-text-secondary);margin-top:2px;display:block}.bim-tree-content{flex:1;overflow-y:auto;padding:2px 0;min-height:0}.bim-tree-node{display:flex;flex-direction:column}.bim-tree-node-content{display:flex;align-items:center;height:32px;cursor:pointer;transition:background-color .2s;border-radius:4px;padding-right:8px}.bim-tree-node-content:hover{background-color:var(--bim-component-bg-hover)}.bim-tree-switcher{width:24px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--bim-text-secondary);transition:transform .2s;flex-shrink:0}.bim-tree-switcher svg{width:12px;height:12px;fill:currentColor;transition:transform .2s}.bim-tree-switcher.is-expanded svg{transform:rotate(90deg)}.bim-tree-switcher.is-hidden{visibility:hidden}.bim-tree-checkbox{width:16px;height:16px;border:1px solid var(--bim-border-default);border-radius:2px;margin-right:8px;background-color:var(--bim-bg-elevated);position:relative;cursor:pointer;flex-shrink:0;transition:all .2s}.bim-tree-checkbox:hover{border-color:var(--bim-primary)}.bim-tree-checkbox.is-checked{background-color:var(--bim-primary);border-color:var(--bim-primary)}.bim-tree-checkbox.is-checked:after{content:"";position:absolute;top:1px;left:4px;width:5px;height:9px;border:2px solid var(--bim-text-inverse);border-top:0;border-left:0;transform:rotate(45deg)}.bim-tree-checkbox.is-indeterminate{background-color:var(--bim-bg-elevated);border-color:var(--bim-primary)}.bim-tree-checkbox.is-indeterminate:after{content:"";position:absolute;top:6px;left:3px;width:8px;height:2px;background-color:var(--bim-primary)}.bim-tree-node.is-disabled .bim-tree-checkbox{background-color:var(--bim-component-bg-disabled);border-color:var(--bim-border-disabled);cursor:not-allowed}.bim-tree-node.is-disabled .bim-tree-checkbox.is-checked{background-color:var(--bim-text-disabled)}.bim-tree-node.is-disabled .bim-tree-node-content{color:var(--bim-text-disabled);cursor:not-allowed}.bim-tree-icon{width:16px;height:16px;margin-right:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.bim-tree-icon img,.bim-tree-icon svg{width:100%;height:100%}.bim-tree-title{flex:1;white-space:nowrap}.bim-tree-children{display:none;overflow:visible}.bim-tree-children.is-visible{display:block}.bim-tree-node-content.is-selected{background-color:var(--bim-component-bg-selected);color:var(--bim-primary)}.bim-tree-node-actions{display:none;align-items:center;margin-left:8px;flex-shrink:0}.bim-tree-node-content.is-selected .bim-tree-node-actions{display:flex}.bim-tree-content{flex:1;overflow:auto;padding:2px 0;min-height:0}.bim-tree-node{display:flex;flex-direction:column;width:fit-content;min-width:100%}.bim-tree-node-content{display:flex;align-items:center;height:32px;cursor:pointer;transition:background-color .2s;border-radius:4px;padding-right:8px;width:fit-content;min-width:100%;box-sizing:border-box}.bim-tab{display:flex;flex-direction:column;width:100%;height:100%;background:transparent;color:var(--bim-text-secondary)}.bim-tab__nav{display:flex;align-items:center;gap:4px;padding:4px;margin:8px 12px;background:var(--bim-bg-inset);border-radius:8px;border:1px solid var(--bim-border-subtle)}.bim-tab__item{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 12px;border:none;border-radius:6px;background:transparent;color:var(--bim-text-secondary);cursor:pointer;transition:all .2s ease;font-size:13px;font-weight:500}.bim-tab__item:hover{color:var(--bim-text-primary);background-color:var(--bim-component-bg-hover)}.bim-tab__item.is-active{color:var(--bim-primary);background-color:var(--bim-bg-elevated);box-shadow:0 1px 3px #0000001a}.bim-tab__item.is-disabled{opacity:.5;cursor:not-allowed}.bim-tab__icon{width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;color:var(--bim-tab-icon, currentColor)}.bim-tab__icon svg{width:100%;height:100%;fill:currentColor}.bim-tab__title{white-space:nowrap}.bim-tab__content{flex:1;display:flex;position:relative;min-height:0;overflow:hidden}.bim-tab__panel{display:none;width:100%;height:100%;flex:1}.bim-tab__panel.is-active{display:flex;flex-direction:column;height:100%}.construct-tab__container{height:100%;display:flex;flex-direction:column}.construct-tab__panel-content{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden}.construct-tab__panel-content .bim-tree{flex:1}.bim-collapse{background-color:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);border-radius:8px;font-size:14px;color:var(--bim-text-primary)}.bim-collapse.is-ghost{background-color:transparent;border:none}.bim-collapse.is-ghost .bim-collapse-item{border-bottom:none}.bim-collapse.is-ghost .bim-collapse-header{background-color:transparent;padding-left:0;padding-right:0}.bim-collapse.is-ghost .bim-collapse-content{background-color:transparent;border-top:none}.bim-collapse-item{border-bottom:1px solid var(--bim-border-subtle)}.bim-collapse-item:last-child{border-bottom:none}.bim-collapse-item.is-disabled .bim-collapse-header{color:var(--bim-text-disabled);cursor:not-allowed}.bim-collapse-header{display:flex;align-items:center;padding:12px 16px;background-color:var(--bim-component-bg);cursor:pointer;transition:all .2s ease;position:relative}.bim-collapse-header:hover{background-color:var(--bim-component-bg-hover)}.bim-collapse-arrow{margin-right:12px;font-size:12px;width:12px;height:12px;transition:transform .24s;display:inline-flex;align-items:center;justify-content:center}.bim-collapse-arrow svg{width:100%;height:100%;fill:currentColor}.bim-collapse-item.is-active .bim-collapse-arrow{transform:rotate(90deg)}.bim-collapse-icon{margin-right:8px;display:inline-flex;align-items:center}.bim-collapse-icon svg{width:16px;height:16px;fill:currentColor}.bim-collapse-title{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.bim-collapse-extra{margin-left:auto}.bim-collapse-content{overflow:hidden;background-color:var(--bim-bg-elevated);border-top:1px solid var(--bim-border-subtle);transition:height .2s ease-in-out,opacity .2s ease-in-out}.bim-collapse-content.is-hidden{display:none}.bim-description{display:flex;flex-direction:column;width:100%;font-size:14px;color:var(--bim-text-primary);padding:0}.bim-description-item{display:flex;align-items:stretch;padding:0;line-height:1.5}.bim-description.is-bordered{border-bottom:none}.bim-description.is-bordered .bim-description-item{border-bottom:1px solid var(--bim-border-subtle)}.bim-description-label{color:var(--bim-text-secondary);flex-shrink:0;padding:4px;display:flex;align-items:center}.bim-description.is-bordered .bim-description-label{border-right:1px solid var(--bim-border-subtle)}.bim-description-value{color:var(--bim-text-primary);flex:1;word-break:break-all;padding:4px;display:flex;align-items:center}.bim-measure-panel{width:100%;display:flex;flex-direction:column;box-sizing:border-box;color:var(--bim-text-secondary)}.bim-measure-settings{display:none;box-sizing:border-box;color:var(--bim-text-secondary)}.bim-measure-settings-title{font-size:14px;font-weight:600;margin-bottom:10px}.bim-measure-settings-row{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}.bim-measure-settings-row .label{color:var(--bim-text-secondary);font-size:13px;flex:0 0 auto}.bim-measure-settings-select{flex:0 0 auto;width:120px;height:28px;border-radius:6px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);color:var(--bim-text-primary);padding:0 8px;box-sizing:border-box;outline:none}.bim-measure-settings-hint{font-size:12px;line-height:1.4;color:var(--bim-text-tertiary);margin-top:-4px;margin-bottom:8px}.bim-measure-settings-actions{margin-top:14px;display:flex;justify-content:flex-start;gap:10px}.bim-measure-settings-save,.bim-measure-settings-cancel{flex:0 0 auto!important;width:auto;min-width:0;height:30px;padding:0 12px;border-radius:4px;cursor:pointer;box-sizing:border-box}.bim-measure-settings-save{border:none;background:var(--bim-primary);color:var(--bim-text-inverse)}.bim-measure-settings-cancel{border:1px solid var(--bim-border-default);background:transparent;color:var(--bim-text-secondary)}.bim-measure-settings-save:hover,.bim-measure-settings-save:active,.bim-measure-settings-save:focus,.bim-measure-settings-cancel:hover,.bim-measure-settings-cancel:active,.bim-measure-settings-cancel:focus{background:inherit;outline:none}.bim-measure-settings-save:hover{background:var(--bim-primary-hover)}.bim-measure-tools{display:flex;flex-direction:column;gap:8px}.bim-measure-tool-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.bim-measure-tool-btn{width:100%;height:42px;border-radius:6px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease;padding:0;box-sizing:border-box}.bim-measure-tool-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.bim-measure-tool-btn.is-active{border-color:var(--bim-primary);background:var(--bim-primary-subtle)}.bim-measure-tool-btn.is-active .bim-measure-tool-icon{color:var(--bim-primary)}.bim-measure-tool-icon{width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;color:var(--bim-icon-default)}.bim-measure-tool-icon svg{width:100%;height:100%;fill:currentColor}.bim-measure-toggle{display:flex;justify-content:flex-end}.bim-measure-toggle-btn{height:22px;border-radius:4px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:all .2s ease;padding:0 6px;gap:4px;font-size:12px;line-height:1}.bim-measure-toggle-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.bim-measure-toggle-text{color:var(--bim-text-secondary)}.bim-measure-toggle-icon svg{width:14px;height:14px;fill:currentColor;color:var(--bim-icon-default);transition:transform .15s ease}.bim-measure-toggle-btn.is-expanded .bim-measure-toggle-icon svg{transform:rotate(180deg)}.bim-measure-result{margin-top:12px;padding-top:12px;border-top:1px solid var(--bim-divider);display:flex;flex-direction:column;gap:10px}.bim-measure-row{display:flex;align-items:baseline;gap:8px;font-size:13px;line-height:1.4}.bim-measure-row .label{color:var(--bim-text-secondary);min-width:84px}.bim-measure-row .value{color:var(--bim-text-primary);flex:1;word-break:break-word}.bim-measure-main-number{color:#ffd24a}.bim-measure-main-number.is-laser-text,.bim-measure-main-unit{color:var(--bim-text-primary)}.bim-measure-xyz{display:flex;flex-direction:column;gap:6px}.bim-measure-xyz .value{font-variant-numeric:tabular-nums}.bim-measure-xyz-x{color:#ff4d4f!important}.bim-measure-xyz-y{color:#52c41a!important}.bim-measure-xyz-z{color:#1677ff!important}.bim-measure-footer{margin-top:12px;padding-top:10px;border-top:1px solid var(--bim-divider);display:flex;align-items:center;justify-content:flex-start;gap:10px}.bim-measure-clear-btn{background:transparent;border:none;color:var(--bim-danger);cursor:pointer;padding:0;font-size:13px;flex:0 0 auto!important;width:auto;min-width:0}.bim-measure-clear-btn:hover,.bim-measure-clear-btn:active,.bim-measure-clear-btn:focus{background:transparent;border:none;outline:none;text-decoration:none}.bim-measure-settings-btn{width:24px;height:24px;border-radius:4px;border:none;background:transparent;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0;margin-left:auto;flex:0 0 auto!important}.bim-measure-settings-btn:hover,.bim-measure-settings-btn:active,.bim-measure-settings-btn:focus{background:transparent;border:none;outline:none}.bim-measure-settings-btn svg{width:18px;height:18px;fill:currentColor;color:var(--bim-icon-default)}.section-plane-panel{display:flex;gap:8px;padding:12px 12px 16px;box-sizing:border-box}.section-plane-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:10px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);border-radius:8px;cursor:pointer;transition:all .2s ease;min-width:60px;outline:none;color:var(--bim-text-primary)}.section-plane-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.section-plane-btn:active{background:var(--bim-primary-subtle);border-color:var(--bim-primary)}.section-plane-btn.is-active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.section-plane-btn.is-active .section-plane-btn-icon{color:var(--bim-primary)}.section-plane-btn-icon{width:24px;height:24px;display:flex;align-items:center;justify-content:center;color:var(--bim-icon-default)}.section-plane-btn-icon svg{width:100%;height:100%;fill:currentColor}.section-plane-btn-label{font-size:12px;color:inherit;text-align:center;line-height:1.2}.section-axis-panel{display:flex;flex-direction:column;gap:8px;padding:12px 12px 16px;box-sizing:border-box}.section-axis-row-1{display:flex;gap:8px;padding-bottom:8px;border-bottom:1px solid var(--bim-divider)}.section-axis-row-2{display:flex;gap:8px;padding-top:8px}.section-axis-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:8px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:8px;cursor:pointer;transition:all .2s ease;outline:none;color:var(--bim-text-primary);min-height:48px}.section-axis-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.section-axis-btn.active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.section-axis-btn.active .section-axis-btn-icon{color:var(--bim-primary)}.section-axis-btn-icon{width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;color:var(--bim-icon-default)}.section-axis-btn-icon svg{width:100%;height:100%}.section-axis-btn-label{font-size:12px;color:inherit;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.section-axis-btn-text{min-height:40px}.section-axis-btn-text .section-axis-btn-label{font-size:18px;font-weight:600}.section-box-panel{display:flex;flex-direction:column;padding:12px;box-sizing:border-box;-webkit-user-select:none;user-select:none}.section-box-row-buttons{display:flex;gap:6px;padding-bottom:12px;border-bottom:1px solid var(--bim-divider)}.section-box-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:6px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:8px;cursor:pointer;color:var(--bim-text-primary);min-height:44px;transition:all .2s ease}.section-box-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.section-box-btn.active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.section-box-btn.active .section-box-btn-icon{color:var(--bim-primary)}.section-box-btn-icon{width:24px;height:24px;color:var(--bim-icon-default)}.section-box-btn-icon svg{width:100%;height:100%}.section-box-btn-label{font-size:11px;white-space:nowrap}.section-box-sliders{display:flex;flex-direction:column;gap:16px;padding-top:16px}.section-box-slider{display:flex;align-items:center;gap:12px;position:relative;z-index:1}.section-box-slider:hover{z-index:10}.section-box-slider-label{font-size:13px;font-weight:700;color:var(--bim-text-primary);min-width:14px}.section-box-slider-track{position:relative;flex:1;height:4px;background:var(--bim-border-default);border-radius:2px}.section-box-slider-range{position:absolute;top:0;height:100%;background:var(--bim-primary);border-radius:2px;pointer-events:none}.section-box-slider-handle{position:absolute;top:50%;width:14px;height:14px;background:var(--bim-bg-elevated);border:2px solid var(--bim-primary);border-radius:50%;transform:translate(-50%,-50%);cursor:grab;z-index:5;touch-action:none;transition:transform .2s,box-shadow .2s}.section-box-slider-handle:hover{transform:translate(-50%,-50%) scale(1.2);box-shadow:0 0 0 4px var(--bim-primary-subtle)}.section-box-slider-handle.dragging{cursor:grabbing;transform:translate(-50%,-50%) scale(1.2);background:var(--bim-primary)}.walk-control-panel{display:flex;align-items:center;gap:20px;padding:12px 20px;background-color:var(--bim-bg-base, #152232);border:1px solid var(--bim-border-strong, #475569);border-radius:12px;box-shadow:var(--bim-shadow-xl, 0 20px 40px rgba(0, 0, 0, .3));-webkit-user-select:none;user-select:none}.walk-divider{width:1px;height:40px;background:var(--bim-divider);flex-shrink:0}.walk-control-left{display:flex;gap:8px}.walk-icon-btn{width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:8px;cursor:pointer;transition:all .2s ease;color:var(--bim-icon-default);padding:8px}.walk-icon-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.walk-icon-btn.active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.walk-icon-btn.active svg{fill:var(--bim-primary)}.walk-icon-btn svg{width:32px;height:32px}.walk-control-settings{display:flex;align-items:center;gap:16px;flex:1}.walk-speed-control{display:flex;align-items:center;gap:12px}.walk-speed-label{color:var(--bim-text-primary);font-size:14px;white-space:nowrap}.walk-speed-group{display:flex;align-items:center;gap:8px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-subtle);border-radius:6px;padding:4px}.walk-speed-btn{width:32px;height:32px;background:var(--bim-bg-elevated);border:1px solid var(--bim-border-subtle);border-radius:4px;color:var(--bim-text-primary);font-size:18px;cursor:pointer;transition:all .2s ease}.walk-speed-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.walk-speed-btn:disabled{opacity:.5;cursor:not-allowed}.walk-speed-display{min-width:40px;text-align:center;color:var(--bim-text-primary);font-size:14px;font-weight:700}.walk-checkbox-wrapper{display:flex;align-items:center;gap:8px;cursor:pointer}.walk-checkbox{width:18px;height:18px;cursor:pointer}.walk-checkbox:disabled{opacity:.5;cursor:not-allowed}.walk-checkbox-label{color:var(--bim-text-primary);font-size:14px;white-space:nowrap}.walk-checkbox-wrapper input:disabled+.walk-checkbox-label{opacity:.5}.walk-select-wrapper{display:flex;align-items:center;gap:8px}.walk-select-label{color:var(--bim-text-primary);font-size:14px;white-space:nowrap}.walk-select{padding:6px 12px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:6px;color:var(--bim-text-primary);font-size:14px;cursor:pointer;min-width:120px}.walk-select option{background:var(--bim-bg-elevated);color:var(--bim-text-primary)}.walk-exit-btn{padding:10px 24px;background:var(--bim-primary);border:none;border-radius:8px;color:var(--bim-text-inverse);font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease;white-space:nowrap}.walk-exit-btn:hover{background:var(--bim-primary-hover);transform:scale(1.02)}')),document.head.appendChild(e)}}catch(o){console.error("vite-plugin-css-injected-by-js",o)}})(); -(function(Is,zr){typeof exports=="object"&&typeof module<"u"?zr(exports):typeof define=="function"&&define.amd?define(["exports"],zr):(Is=typeof globalThis<"u"?globalThis:Is||self,zr(Is.IflowEngine={}))})(this,(function(Is){"use strict";const zr={common:{title:"BimEngine",description:"这是一个使用 BIM-ENGINE。",openTestDialog:"打开测试弹窗",openInfoDialog:"打开信息弹窗 (封装版)"},toolbar:{home:"首页",measure:"测量",zoomBox:"选框放大",info:"信息",location:"定位",setting:"设置",walk:"漫游",map:"地图",property:"构件详情",fullscreen:"全屏",walkMenu:"漫游菜单",walkPerson:"第一人称",walkBird:"第三人称",tree:"模型树",section:"剖切",sectionPlane:"拾取面剖切",sectionAxis:"轴向剖切",sectionBox:"剖切盒"},dialog:{testTitle:"测试弹窗",testContent:'
这是一个 可拖拽可缩放 的弹窗。

你可以尝试拖动标题栏,或者拖动右下角改变大小。
'},menu:{info:"信息",home:"首页"},tree:{searchPlaceholder:"请输入要搜索的内容"},constructTree:{title:"目录树"},tab:{component:"构件",system:"系统",space:"空间"},panel:{property:{title:"构件详情",base:"基本属性",material:"材质信息",advanced:"高级设置",tab:{props:"属性",material:"材质"}}},measure:{btnName:"测量",dialogTitle:"测量",modes:{distance:"距离",minDistance:"最小距离",angle:"角度",elevation:"标高",volume:"体积",laserDistance:"激光测距",slope:"坡度",spaceVolume:"空间体积"},actions:{expand:"展开",collapse:"收起",clearAll:"删除全部",settings:"设置"},labels:{currentMode:"当前测量方式:",x:"X:",y:"Y:",z:"Z:",value:{distance:"距离:",minDistance:"最小距离:",angle:"角度:",elevation:"标高:",volume:"体积:",laserDistance:"激光测距:",slope:"坡度:",spaceVolume:"空间体积:"}},units:{mm:"mm",cm:"cm",m:"m",km:"km",deg:"°",m3:"m³",percent:"%"},settings:{title:"设置",unit:"单位:",precision:"精度:",hint:"距离、最小距离和标高默认使用该单位;角度和体积有各自默认单位。",save:"保存设置",cancel:"取消"}},sectionPlane:{dialogTitle:"拾取面剖切",actions:{hide:"隐藏",reverse:"反向",reset:"重置"}},sectionAxis:{dialogTitle:"轴向剖切",actions:{hide:"隐藏",reverse:"反向",axisX:"X",axisY:"Y",axisZ:"Z"}},sectionBox:{dialogTitle:"剖切盒",actions:{hide:"隐藏",reverse:"反向",fitToModel:"适应",reset:"重置"},axes:{x:"X",y:"Y",z:"Z"}},walkControl:{speed:"移动速度:",gravity:"重力",collision:"碰撞",characterModel:{label:"建筑工人",constructionWorker:"建筑工人",officeMale:"办公室男性"},walkMode:{label:"行走模式",walk:"行走模式",run:"奔跑模式"},exit:"退出",path:{dialogTitle:"路径漫游"}},map:{dialogTitle:"地图"}},K0={common:{title:"BimEngine",description:"This is a BIM-ENGINE demo.",openTestDialog:"Open Test Dialog",openInfoDialog:"Open Info Dialog (Wrapped)"},toolbar:{home:"Home",measure:"Measure",zoomBox:"Zoom Box",info:"Info",location:"Location",setting:"Settings",walk:"Walk",map:"Map",property:"Property",fullscreen:"Fullscreen",walkPerson:"Person",walkBird:"Bird Eye",walkMenu:"Menu",tree:"Tree",section:"Section",sectionPlane:"Plane Section",sectionAxis:"Axis Section",sectionBox:"Section Box"},dialog:{testTitle:"Test Dialog",testContent:'
This is a draggable and resizable dialog.

Try dragging the title bar or resizing from the bottom-right corner.
'},menu:{info:"Info",home:"Home"},tree:{searchPlaceholder:"Please enter content to search"},constructTree:{title:"Construct Tree"},tab:{component:"Component",system:"System",space:"Space"},panel:{property:{title:"Component Details",base:"Basic Info",material:"Material",advanced:"Advanced",tab:{props:"Properties",material:"Material"}}},measure:{btnName:"Measure",dialogTitle:"Measure",modes:{distance:"Distance",minDistance:"Min Distance",angle:"Angle",elevation:"Elevation",volume:"Volume",laserDistance:"Laser Distance",slope:"Slope",spaceVolume:"Space Volume"},actions:{expand:"Expand",collapse:"Collapse",clearAll:"Clear All",settings:"Settings"},labels:{currentMode:"Mode:",x:"X:",y:"Y:",z:"Z:",value:{distance:"Distance:",minDistance:"Min Distance:",angle:"Angle:",elevation:"Elevation:",volume:"Volume:",laserDistance:"Laser Distance:",slope:"Slope:",spaceVolume:"Space Volume:"}},units:{mm:"mm",cm:"cm",m:"m",km:"km",deg:"°",m3:"m³",percent:"%"},settings:{title:"Settings",unit:"Unit:",precision:"Precision:",hint:"Distance, min distance and elevation use this unit by default; angle and volume use their own units.",save:"Save",cancel:"Cancel"}},sectionPlane:{dialogTitle:"Plane Section",actions:{hide:"Hide",reverse:"Reverse",reset:"Reset"}},sectionAxis:{dialogTitle:"Axis Section",actions:{hide:"Hide",reverse:"Reverse",axisX:"X",axisY:"Y",axisZ:"Z"}},sectionBox:{dialogTitle:"Section Box",actions:{hide:"Hide",reverse:"Reverse",fitToModel:"Fit",reset:"Reset"},axes:{x:"X",y:"Y",z:"Z"}},walkControl:{speed:"Speed:",gravity:"Gravity",collision:"Collision",characterModel:{label:"Construction Worker",constructionWorker:"Construction Worker",officeMale:"Office Male"},walkMode:{label:"Walk Mode",walk:"Walk",run:"Run"},exit:"Exit",path:{dialogTitle:"Path Walk"}},map:{dialogTitle:"Map"}};class $0{currentLocale="zh-CN";messages={"zh-CN":zr,"en-US":K0};listeners=[];constructor(){}getLocale(){return this.currentLocale}setLocale(e){this.currentLocale!==e&&(this.currentLocale=e,this.notifyListeners())}t(e){if(!e)return"";const t=e.split(".");let n=this.messages[this.currentLocale];for(const i of t)if(n&&typeof n=="object"&&i in n)n=n[i];else return e;return n}subscribe(e){return this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e)}}notifyListeners(){this.listeners.forEach(e=>e(this.currentLocale))}}const Yt=new $0,Ce=s=>Yt.t(s),rd={name:"light",primary:"#2563eb",primaryHover:"#1d4ed8",primaryActive:"#1e40af",primarySubtle:"rgba(37, 99, 235, 0.1)",success:"#16a34a",successHover:"#15803d",successSubtle:"rgba(22, 163, 74, 0.1)",warning:"#d97706",warningHover:"#b45309",warningSubtle:"rgba(217, 119, 6, 0.1)",danger:"#dc2626",dangerHover:"#b91c1c",dangerSubtle:"rgba(220, 38, 38, 0.1)",info:"#0891b2",infoHover:"#0e7490",infoSubtle:"rgba(8, 145, 178, 0.1)",bgBase:"#f8fafc",bgElevated:"#ffffff",bgOverlay:"rgba(255, 255, 255, 0.98)",bgInset:"#f1f5f9",bgGlass:"rgba(255, 255, 255, 0.8)",bgGlassBlur:"24px",textPrimary:"#0f172a",textSecondary:"#475569",textTertiary:"#94a3b8",textDisabled:"#cbd5e1",textInverse:"#ffffff",textLink:"#2563eb",textLinkHover:"#1d4ed8",iconDefault:"#64748b",iconHover:"#334155",iconActive:"#2563eb",iconDisabled:"#cbd5e1",iconInverse:"#ffffff",borderDefault:"#e2e8f0",borderSubtle:"#f1f5f9",borderStrong:"#cbd5e1",borderDisabled:"#f1f5f9",divider:"#e2e8f0",componentBg:"transparent",componentBgHover:"rgba(15, 23, 42, 0.04)",componentBgActive:"rgba(15, 23, 42, 0.08)",componentBgSelected:"rgba(37, 99, 235, 0.08)",componentBgDisabled:"#f8fafc",focusRing:"rgba(37, 99, 235, 0.5)",focusRingOffset:"#ffffff",selectionBg:"rgba(37, 99, 235, 0.15)",selectionText:"#0f172a",shadowSm:"0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08)",shadowMd:"0 4px 12px rgba(0, 0, 0, 0.12), 0 6px 20px rgba(0, 0, 0, 0.1)",shadowLg:"0 10px 25px rgba(0, 0, 0, 0.15), 0 6px 10px rgba(0, 0, 0, 0.1)",shadowXl:"0 20px 40px rgba(0, 0, 0, 0.2), 0 10px 15px rgba(0, 0, 0, 0.1)",shadowGlow:"0 2px 8px rgba(59, 130, 246, 0.3), 0 4px 16px rgba(59, 130, 246, 0.2)",scrollbarTrack:"#f1f5f9",scrollbarThumb:"#cbd5e1",scrollbarThumbHover:"#94a3b8",floatingBg:"rgba(255, 255, 255, 0.8)",floatingBorder:"rgba(226, 232, 240, 0.5)",floatingShadow:"0 4px 24px rgba(0, 0, 0, 0.06)",floatingBtnBg:"rgba(255, 255, 255, 0.9)",floatingBtnBorder:"rgba(203, 213, 225, 0.6)",floatingBtnShadow:"0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08)",floatingBtnBgHover:"#ffffff",floatingBtnShadowHover:"0 4px 12px rgba(0, 0, 0, 0.12), 0 6px 20px rgba(0, 0, 0, 0.1)",floatingIconColor:"#334155",floatingIconColorHover:"#1e293b",panelBg:"rgba(255, 255, 255, 0.95)",panelBorder:"rgba(226, 232, 240, 0.6)",panelHeaderBg:"rgba(248, 250, 252, 0.9)",panelRadius:"12px",tabBg:"#f1f5f9",tabItemBg:"transparent",tabItemBgHover:"rgba(255, 255, 255, 0.6)",tabItemBgActive:"#ffffff",tabItemTextActive:"#2563eb",overrides:{dialog:{headerBg:"#f8fafc"},toolbar:{bg:"rgba(255, 255, 255, 0.9)",buttonBg:"rgba(255, 255, 255, 0.95)",buttonBgHover:"#ffffff",buttonBgActive:"#2563eb"},input:{bg:"#ffffff",bgFocus:"#ffffff",placeholder:"#94a3b8"}}},J0={name:"dark",primary:"#3b82f6",primaryHover:"#60a5fa",primaryActive:"#2563eb",primarySubtle:"rgba(59, 130, 246, 0.15)",success:"#22c55e",successHover:"#4ade80",successSubtle:"rgba(34, 197, 94, 0.15)",warning:"#f59e0b",warningHover:"#fbbf24",warningSubtle:"rgba(245, 158, 11, 0.15)",danger:"#ef4444",dangerHover:"#f87171",dangerSubtle:"rgba(239, 68, 68, 0.15)",info:"#06b6d4",infoHover:"#22d3ee",infoSubtle:"rgba(6, 182, 212, 0.15)",bgBase:"#152232",bgElevated:"#1f2d3e",bgOverlay:"rgba(21, 34, 50, 0.98)",bgInset:"#152232",bgGlass:"rgba(21, 34, 50, 0.85)",bgGlassBlur:"24px",textPrimary:"#ffffff",textSecondary:"#94a3b8",textTertiary:"#64748b",textDisabled:"#475569",textInverse:"#152232",textLink:"#60a5fa",textLinkHover:"#93c5fd",iconDefault:"#ffffff",iconHover:"#ffffff",iconActive:"#3b82f6",iconDisabled:"#475569",iconInverse:"#152232",borderDefault:"rgba(51, 65, 85, 0.5)",borderSubtle:"rgba(51, 65, 85, 0.5)",borderStrong:"#475569",borderDisabled:"#1e293b",divider:"#334155",componentBg:"transparent",componentBgHover:"rgba(248, 250, 252, 0.06)",componentBgActive:"rgba(248, 250, 252, 0.1)",componentBgSelected:"rgba(59, 130, 246, 0.2)",componentBgDisabled:"#1e293b",focusRing:"rgba(59, 130, 246, 0.5)",focusRingOffset:"#1e293b",selectionBg:"rgba(59, 130, 246, 0.3)",selectionText:"#f8fafc",shadowSm:"0 2px 8px rgba(0, 0, 0, 0.4), 0 4px 12px rgba(0, 0, 0, 0.3)",shadowMd:"0 4px 12px rgba(0, 0, 0, 0.5), 0 6px 20px rgba(0, 0, 0, 0.4)",shadowLg:"0 10px 25px rgba(0, 0, 0, 0.6), 0 6px 10px rgba(0, 0, 0, 0.4)",shadowXl:"0 20px 40px rgba(0, 0, 0, 0.7), 0 10px 15px rgba(0, 0, 0, 0.5)",shadowGlow:"0 2px 8px rgba(59, 130, 246, 0.4), 0 4px 16px rgba(59, 130, 246, 0.25)",scrollbarTrack:"#1e293b",scrollbarThumb:"#475569",scrollbarThumbHover:"#64748b",floatingBg:"rgba(15, 23, 42, 0.85)",floatingBorder:"rgba(51, 65, 85, 0.4)",floatingShadow:"0 4px 24px rgba(0, 0, 0, 0.25)",floatingBtnBg:"rgba(51, 65, 85, 0.6)",floatingBtnBorder:"rgba(100, 116, 139, 0.5)",floatingBtnShadow:"0 2px 8px rgba(0, 0, 0, 0.3), 0 4px 12px rgba(0, 0, 0, 0.25)",floatingBtnBgHover:"rgba(71, 85, 105, 0.7)",floatingBtnShadowHover:"0 4px 12px rgba(0, 0, 0, 0.35), 0 6px 20px rgba(0, 0, 0, 0.3)",floatingIconColor:"#e2e8f0",floatingIconColorHover:"#f8fafc",panelBg:"rgba(15, 23, 42, 0.95)",panelBorder:"rgba(51, 65, 85, 0.5)",panelHeaderBg:"rgba(15, 23, 42, 0.9)",panelRadius:"12px",tabBg:"rgba(30, 41, 59, 0.6)",tabItemBg:"transparent",tabItemBgHover:"rgba(51, 65, 85, 0.5)",tabItemBgActive:"rgba(51, 65, 85, 0.8)",tabItemTextActive:"#60a5fa",overrides:{dialog:{headerBg:"#0f172a"},toolbar:{bg:"rgba(30, 41, 59, 0.9)",buttonBg:"rgba(51, 65, 85, 0.6)",buttonBgHover:"rgba(71, 85, 105, 0.7)",buttonBgActive:"#3b82f6"},input:{bg:"#0f172a",bgFocus:"#1e293b",placeholder:"#64748b"}}};class Q0{currentTheme=rd;listeners=[];constructor(){}getTheme(){return this.currentTheme}setTheme(e){e==="light"?this.applyTheme(rd):this.applyTheme(J0)}setCustomTheme(e){this.applyTheme(e)}applyTheme(e){this.currentTheme=e,this.notifyListeners()}subscribe(e){return this.listeners.push(e),e(this.currentTheme),()=>{this.listeners=this.listeners.filter(t=>t!==e)}}notifyListeners(){this.listeners.forEach(e=>e(this.currentTheme))}}const rt=new Q0;class eg{events=new Map;on(e,t){return this.events.has(e)||this.events.set(e,[]),this.events.get(e).push(t),()=>this.off(e,t)}off(e,t){const n=this.events.get(e);if(!n)return;const i=n.indexOf(t);i!==-1&&n.splice(i,1)}emit(e,t){const n=this.events.get(e);n&&n.forEach(i=>{try{i(t)}catch(r){console.error(`[EventEmitter] Error in listener for event "${e}":`,r)}})}clear(){this.events.clear()}}class bt{static instance=null;eventEmitter=new eg;container=null;wrapper=null;toolbar=null;dialog=null;engine3d=null;buttonGroup=null;rightKey=null;constructTree=null;propertyPanel=null;measure=null;walkControl=null;map=null;sectionPlane=null;sectionAxis=null;sectionBox=null;walkPath=null;walkPlanView=null;constructor(){}static getInstance(){return bt.instance||(bt.instance=new bt),bt.instance}static reset(){bt.instance&&(bt.instance.eventEmitter.clear(),bt.instance=null)}emit(e,t){this.eventEmitter.emit(e,t)}on(e,t){return this.eventEmitter.on(e,t)}off(e,t){this.eventEmitter.off(e,t)}clearEvents(){this.eventEmitter.clear()}}class zl{container;options;groups=[];activeBtnIds=new Set;btnRefs=new Map;dropdownElement=null;hoverTimeout=null;customColors=new Set;unsubscribeLocale=null;unsubscribeTheme=null;DEFAULT_ICON='';constructor(e){const t=typeof e.container=="string"?document.getElementById(e.container):e.container;if(!t)throw new Error("Container not found");this.container=t,this.options={showLabel:!0,visibility:{},direction:"row",position:"static",align:"vertical",expand:"down",...e},["backgroundColor","btnBackgroundColor","btnHoverColor","btnActiveColor","iconColor","iconActiveColor","textColor","textActiveColor"].forEach(i=>{e[i]&&this.customColors.add(i)}),this.initContainer(),this.applyStyles()}emit(e,t){bt.getInstance().emit(e,t)}initContainer(){this.container.innerHTML="",this.container.classList.add("bim-btn-group-root"),this.options.direction==="column"?this.container.classList.add("dir-column"):this.container.classList.add("dir-row"),this.options.className&&this.container.classList.add(this.options.className),this.options.type&&this.options.type!=="default"&&this.container.classList.add(`type-${this.options.type}`),this.updatePosition(),this.setupEventInterception(this.container)}setupEventInterception(e){const t=i=>{i.stopPropagation()};["click","dblclick","contextmenu","wheel","mousedown","mouseup","mousemove","touchstart","touchend","touchmove","pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointerover","pointerout"].forEach(i=>{e.addEventListener(i,t,{passive:!1})})}updatePosition(){const e=this.options.position,t=this.container.style;if(t.top="",t.bottom="",t.left="",t.right="",t.transform="",e==="static"){this.container.classList.add("static");return}if(this.container.classList.remove("static"),this.container.style.position="absolute",typeof e=="object"&&"x"in e)t.left=`${e.x}px`,t.top=`${e.y}px`;else{const n="20px";switch(e){case"top-left":t.top=n,t.left=n;break;case"top-center":t.top=n,t.left="50%",t.transform="translateX(-50%)";break;case"top-right":t.top=n,t.right=n;break;case"bottom-left":t.bottom=n,t.left=n;break;case"bottom-center":t.bottom=n,t.left="50%",t.transform="translateX(-50%)";break;case"bottom-right":t.bottom=n,t.right=n;break;case"left-center":t.left=n,t.top="50%",t.transform="translateY(-50%)";break;case"right-center":t.right=n,t.top="50%",t.transform="translateY(-50%)";break;case"center":t.top="50%",t.left="50%",t.transform="translate(-50%, -50%)";break}}}applyStyles(){const e=this.container.style;this.options.backgroundColor&&e.setProperty("--bim-btn-group-section-bg",this.options.backgroundColor),this.options.btnBackgroundColor&&e.setProperty("--bim-btn-bg",this.options.btnBackgroundColor),this.options.btnHoverColor&&e.setProperty("--bim-btn-hover-bg",this.options.btnHoverColor),this.options.btnActiveColor&&e.setProperty("--bim-btn-active-bg",this.options.btnActiveColor),this.options.iconColor&&e.setProperty("--bim-icon-color",this.options.iconColor),this.options.iconActiveColor&&e.setProperty("--bim-icon-active-color",this.options.iconActiveColor),this.options.textColor&&e.setProperty("--bim-btn-text-color",this.options.textColor),this.options.textActiveColor&&e.setProperty("--bim-btn-text-active-color",this.options.textActiveColor),document.querySelectorAll(".opt-btn-dropdown").forEach(n=>{const i=n.style;this.options.iconColor&&i.setProperty("--bim-icon-color",this.options.iconColor),this.options.iconActiveColor&&i.setProperty("--bim-icon-active-color",this.options.iconActiveColor),this.options.textColor&&i.setProperty("--bim-btn-text-color",this.options.textColor),this.options.textActiveColor&&i.setProperty("--bim-btn-text-active-color",this.options.textActiveColor),this.options.btnBackgroundColor&&i.setProperty("--bim-btn-bg",this.options.btnBackgroundColor),this.options.btnHoverColor&&i.setProperty("--bim-btn-hover-bg",this.options.btnHoverColor),this.options.btnActiveColor&&i.setProperty("--bim-btn-active-bg",this.options.btnActiveColor)})}setPrimaryColor(e){this.container.style.setProperty("--bim-primary-color",e),document.querySelectorAll(".opt-btn-dropdown").forEach(n=>{n.style.setProperty("--bim-primary-color",e)})}setTheme(e){const t={backgroundColor:e.bgElevated,btnBackgroundColor:e.componentBg,btnHoverColor:e.componentBgHover,btnActiveColor:e.componentBgActive,iconColor:e.iconDefault,iconActiveColor:e.iconActive,textColor:e.textSecondary,textActiveColor:e.textPrimary};Object.entries(t).forEach(([n,i])=>{const r=n;this.customColors.has(r)||(this.options[r]=i)}),this.container.classList.remove("theme-dark","theme-light"),this.container.classList.add(`theme-${e.name}`),this.applyStyles(),this.setPrimaryColor(e.primary),this.applyThemeCssVars(e)}applyThemeCssVars(e){const t=this.container.style;t.setProperty("--bim-primary",e.primary),t.setProperty("--bim-primary-hover",e.primaryHover),t.setProperty("--bim-primary-active",e.primaryActive),t.setProperty("--bim-bg-glass",e.bgGlass),t.setProperty("--bim-bg-glass-blur",e.bgGlassBlur),t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-bg-overlay",e.bgOverlay),t.setProperty("--bim-bg-inset",e.bgInset),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-text-secondary",e.textSecondary),t.setProperty("--bim-text-tertiary",e.textTertiary),t.setProperty("--bim-text-inverse",e.textInverse),t.setProperty("--bim-icon-default",e.iconDefault),t.setProperty("--bim-icon-hover",e.iconHover),t.setProperty("--bim-icon-active",e.iconActive),t.setProperty("--bim-icon-inverse",e.iconInverse),t.setProperty("--bim-border-default",e.borderDefault),t.setProperty("--bim-border-subtle",e.borderSubtle),t.setProperty("--bim-component-bg-hover",e.componentBgHover),t.setProperty("--bim-component-bg-active",e.componentBgActive),t.setProperty("--bim-shadow-sm",e.shadowSm),t.setProperty("--bim-shadow-md",e.shadowMd),t.setProperty("--bim-shadow-lg",e.shadowLg),t.setProperty("--bim-shadow-glow",e.shadowGlow),t.setProperty("--bim-floating-bg",e.floatingBg),t.setProperty("--bim-floating-border",e.floatingBorder),t.setProperty("--bim-floating-shadow",e.floatingShadow),t.setProperty("--bim-floating-btn-bg",e.floatingBtnBg),t.setProperty("--bim-floating-btn-border",e.floatingBtnBorder),t.setProperty("--bim-floating-btn-shadow",e.floatingBtnShadow),t.setProperty("--bim-floating-btn-bg-hover",e.floatingBtnBgHover),t.setProperty("--bim-floating-btn-shadow-hover",e.floatingBtnShadowHover),t.setProperty("--bim-floating-icon-color",e.floatingIconColor),t.setProperty("--bim-floating-icon-color-hover",e.floatingIconColorHover),this.syncDropdownCssVars(e)}syncDropdownCssVars(e){document.querySelectorAll(".opt-btn-dropdown").forEach(n=>{const i=n.style;i.setProperty("--bim-primary",e.primary),i.setProperty("--bim-bg-overlay",e.bgOverlay),i.setProperty("--bim-border-default",e.borderDefault),i.setProperty("--bim-text-primary",e.textPrimary),i.setProperty("--bim-text-inverse",e.textInverse),i.setProperty("--bim-shadow-lg",e.shadowLg),i.setProperty("--bim-floating-btn-bg",e.floatingBtnBg),i.setProperty("--bim-floating-btn-bg-hover",e.floatingBtnBgHover),i.setProperty("--bim-floating-icon-color",e.floatingIconColor)})}setColors(e){this.options={...this.options,...e},Object.keys(e).forEach(t=>{this.customColors.add(t)}),this.applyStyles()}async init(){this.render(),this.unsubscribeLocale=Yt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=rt.subscribe(e=>{this.setTheme(e)})}setLocales(){this.render()}addGroup(e,t){if(this.groups.some(i=>i.id===e))return;const n={id:e,buttons:[]};if(t){const i=this.groups.findIndex(r=>r.id===t);i!==-1?this.groups.splice(i,0,n):this.groups.push(n)}else this.groups.push(n)}addButton(e){const{groupId:t,parentId:n}=e,i=this.groups.find(o=>o.id===t);if(!i)return;const r={...e,children:e.children||[]};if(n){const o=this.findButton(i.buttons,n);o&&(o.children||(o.children=[]),o.children.push(r))}else i.buttons.push(r)}findButton(e,t){for(const n of e){if(n.id===t)return n;if(n.children){const i=this.findButton(n.children,t);if(i)return i}}}render(){this.container.innerHTML="",this.btnRefs.clear(),this.groups.forEach((e,t)=>{const n=this.renderGroup(e,t,this.groups.length);this.container.appendChild(n)})}renderGroup(e,t,n){const i=document.createElement("div");return i.className="bim-btn-group-section",t{if(this.isVisible(r.id)){const o=this.renderButton(r);i.appendChild(o)}}),i}renderButton(e){const t=document.createElement("div");t.className="opt-btn-wrapper";const n=document.createElement("div");n.className="opt-btn",e.isActive&&this.activeBtnIds.add(e.id),(e.align||this.options.align||"vertical")==="horizontal"?n.classList.add("align-horizontal"):n.classList.add("align-vertical"),this.activeBtnIds.has(e.id)&&n.classList.add("active"),e.disabled&&n.classList.add("disabled"),this.options.showLabel&&e.label||(n.classList.add("no-label"),e.label&&(n.title=Ce(e.label)));const o=e.iconSize||32,a=e.minWidth||50;n.style.minWidth=`${a}px`;const l=document.createElement("div");l.className="opt-btn-icon",l.style.width=`${o}px`,l.style.height=`${o}px`,l.innerHTML=this.getIcon(e.icon),n.appendChild(l);const c=document.createElement("div");if(c.className="opt-btn-text-wrapper",this.options.showLabel&&e.label){const h=document.createElement("span");h.className="opt-btn-label",h.textContent=Ce(e.label),c.appendChild(h)}return c.hasChildNodes()&&n.appendChild(c),n.addEventListener("click",()=>this.handleClick(e)),n.addEventListener("mouseenter",()=>this.handleMouseEnter(e,n)),n.addEventListener("mouseleave",()=>this.handleMouseLeave()),this.btnRefs.set(e.id,n),t.appendChild(n),t}setBtnActive(e,t){const n=this.findButtonById(e);if(!n)return;const i=t!==void 0?t:!this.activeBtnIds.has(e);i?this.activeBtnIds.add(e):this.activeBtnIds.delete(e),n.isActive=i,this.updateButtonState(e)}handleClick(e){if(!e.disabled&&(!e.children||e.children.length===0)){if(e.keepActive){const n=!this.activeBtnIds.has(e.id);this.setBtnActive(e.id,n),n&&e.exclusive&&e.groupId&&this.deactivateExclusiveSiblings(e)}this.closeDropdown(),e.onClick&&e.onClick(e)}}deactivateExclusiveSiblings(e){const t=this.groups.find(n=>n.id===e.groupId);if(t){if(e.parentId){const i=this.findButton(t.buttons,e.parentId)?.children||[];for(const r of i)r&&r.id!==e.id&&r.parentId===e.parentId&&r.groupId===e.groupId&&this.activeBtnIds.has(r.id)&&(this.setBtnActive(r.id,!1),r.onClick&&r.onClick(r));return}for(const n of t.buttons)n.id!==e.id&&n.groupId===e.groupId&&(n.parentId||this.activeBtnIds.has(n.id)&&(this.setBtnActive(n.id,!1),n.onClick&&n.onClick(n)))}}handleMouseEnter(e,t){this.hoverTimeout&&clearTimeout(this.hoverTimeout),e.children&&e.children.length>0?this.showDropdown(e,t):this.closeDropdown()}handleMouseLeave(){this.hoverTimeout=window.setTimeout(()=>this.closeDropdown(),200)}showDropdown(e,t){if(this.closeDropdown(),!e.children)return;const n=document.createElement("div");n.className="opt-btn-dropdown",this.options.backgroundColor&&n.style.setProperty("--bim-toolbar-bg",this.options.backgroundColor);const i=n.style;this.options.iconColor&&i.setProperty("--bim-icon-color",this.options.iconColor),this.options.iconActiveColor&&i.setProperty("--bim-icon-active-color",this.options.iconActiveColor),this.options.textColor&&i.setProperty("--bim-btn-text-color",this.options.textColor),this.options.textActiveColor&&i.setProperty("--bim-btn-text-active-color",this.options.textActiveColor),this.options.btnBackgroundColor&&i.setProperty("--bim-btn-bg",this.options.btnBackgroundColor),this.options.btnHoverColor&&i.setProperty("--bim-btn-hover-bg",this.options.btnHoverColor),this.options.btnActiveColor&&i.setProperty("--bim-btn-active-bg",this.options.btnActiveColor);const r=t.getBoundingClientRect(),o=this.options.expand||"down";this.options.direction==="row"?n.style.flexDirection="column":n.style.flexDirection="row",this.options.type&&this.options.type!=="default"&&n.classList.add(`type-${this.options.type}`);const a=rt.getTheme();n.classList.add(`theme-${a.name}`),i.setProperty("--bim-primary",a.primary),i.setProperty("--bim-bg-overlay",a.bgOverlay),i.setProperty("--bim-border-default",a.borderDefault),i.setProperty("--bim-text-primary",a.textPrimary),i.setProperty("--bim-text-inverse",a.textInverse),i.setProperty("--bim-shadow-lg",a.shadowLg),i.setProperty("--bim-floating-btn-bg",a.floatingBtnBg),i.setProperty("--bim-floating-btn-bg-hover",a.floatingBtnBgHover),i.setProperty("--bim-floating-icon-color",a.floatingIconColor),document.body.appendChild(n),this.setupEventInterception(n),e.children.forEach(c=>{if(this.isVisible(c.id)){const h=this.renderDropdownItem(c);n.appendChild(h)}});const l=n.getBoundingClientRect();o==="up"?(n.style.bottom=window.innerHeight-r.top+8+"px",n.style.left=r.left+(r.width-l.width)/2+"px"):o==="down"?(n.style.top=r.bottom+8+"px",n.style.left=r.left+(r.width-l.width)/2+"px"):o==="right"?(n.style.top=r.top+(r.height-l.height)/2+"px",n.style.left=r.right+8+"px"):o==="left"&&(n.style.top=r.top+(r.height-l.height)/2+"px",n.style.right=window.innerWidth-r.left+8+"px"),n.addEventListener("mouseenter",()=>{this.hoverTimeout&&clearTimeout(this.hoverTimeout)}),n.addEventListener("mouseleave",()=>this.handleMouseLeave()),this.dropdownElement=n}renderDropdownItem(e){const t=document.createElement("div");t.className="opt-btn-dropdown-item",(e.align||"horizontal")==="horizontal"?t.classList.add("align-horizontal"):t.classList.add("align-vertical"),(this.activeBtnIds.has(e.id)||e.isActive)&&t.classList.add("active");const i=e.iconSize||32,r=e.minWidth;r&&(t.style.minWidth=`${r}px`);const o=document.createElement("div");if(o.className="opt-btn-icon",o.style.width=`${i}px`,o.style.height=`${i}px`,o.innerHTML=this.getIcon(e.icon),t.appendChild(o),this.options.showLabel&&e.label){const a=document.createElement("span");a.className="opt-btn-dropdown-label",a.textContent=Ce(e.label),t.appendChild(a)}else e.label&&(t.title=Ce(e.label));return t.addEventListener("click",a=>{a.stopPropagation(),this.handleClick(e)}),t}closeDropdown(){this.dropdownElement&&(this.dropdownElement.remove(),this.dropdownElement=null),this.btnRefs.forEach(e=>{const t=e.querySelector(".opt-btn-arrow");t&&t.classList.remove("rotated")})}updateButtonState(e){const t=this.btnRefs.get(e);t&&(this.activeBtnIds.has(e)?t.classList.add("active"):t.classList.remove("active"))}getIcon(e){return e||this.DEFAULT_ICON}updateButtonVisibility(e,t){this.options.visibility||(this.options.visibility={}),this.options.visibility[e]=t,this.render()}setShowLabel(e){this.options.showLabel=e,this.updateLabelsVisibility()}updateLabelsVisibility(){this.btnRefs.forEach((e,t)=>{const n=this.findButtonById(t);if(!n)return;this.options.showLabel&&n.label?(e.classList.remove("no-label"),e.removeAttribute("title")):(e.classList.add("no-label"),n.label&&(e.title=Ce(n.label)))})}findButtonById(e){for(const t of this.groups){const n=this.findButton(t.buttons,e);if(n)return n}}setBackgroundColor(e){this.setColors({backgroundColor:e})}isVisible(e){return this.options.visibility?.[e]!==!1}setType(e){this.container.classList.remove("type-default","type-glass-pill"),this.options.type=e,e&&e!=="default"&&this.container.classList.add(`type-${e}`),this.render()}getType(){return this.options.type||"default"}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.closeDropdown(),this.container.innerHTML="",this.btnRefs.clear()}}class tg extends zl{async init(){await super.init();const{createHomeButton:e}=await Promise.resolve().then(()=>hT),{createZoomBoxButton:t}=await Promise.resolve().then(()=>uT),{createWalkMenuButton:n}=await Promise.resolve().then(()=>dT),{createMapButton:i}=await Promise.resolve().then(()=>fT),{createPropertyButton:r}=await Promise.resolve().then(()=>pT),{createSettingButton:o}=await Promise.resolve().then(()=>mT),{createInfoButton:a}=await Promise.resolve().then(()=>gT),{createFullscreenButton:l}=await Promise.resolve().then(()=>xT),{createMeasureButton:c}=await Promise.resolve().then(()=>vT),{createSectionMenuButton:h}=await Promise.resolve().then(()=>bT),{createSectionPlaneButton:u}=await Promise.resolve().then(()=>yT),{createSectionAxisButton:d}=await Promise.resolve().then(()=>_T),{createSectionBoxButton:f}=await Promise.resolve().then(()=>MT);this.addGroup("group-1"),this.addButton(e()),this.addButton(t()),this.addButton(c()),this.addButton(h()),this.addButton(u()),this.addButton(d()),this.addButton(f()),this.addButton(n()),this.addButton(i()),this.addButton(r()),this.addGroup("group-2"),this.addButton(o()),this.addButton(a()),this.addButton(l()),this.render()}}class pi{registry;subscriptions=[];constructor(){this.registry=bt.getInstance()}subscribe(e,t){const n=this.registry.on(e,t);this.subscriptions.push(n)}emit(e,t){this.registry.emit(e,t)}destroy(){this.subscriptions.forEach(e=>e()),this.subscriptions=[]}}class ng extends pi{toolbar=null;toolbarContainer=null;container;constructor(e){super(),this.container=e,this.init()}init(){this.toolbarContainer=document.createElement("div"),this.toolbarContainer.id="opt-btn-groups",this.toolbarContainer.className="bim-engine-opt-btn-container is-bottom-toolbar",this.container.appendChild(this.toolbarContainer),this.toolbar=new tg({container:this.toolbarContainer,type:"glass-pill",showLabel:!0,direction:"row",position:"bottom-right",align:"vertical",expand:"up"}),this.toolbar.init()}updateTheme(e){this.toolbar?.setTheme(e)}refresh(){this.toolbar?.render()}destroy(){this.toolbar?.destroy(),this.toolbar=null,super.destroy()}addGroup(e,t){this.toolbar?.addGroup(e,t),this.toolbar?.render()}addButton(e){this.toolbar?.addButton(e),this.toolbar?.render()}setButtonVisibility(e,t){this.toolbar?.updateButtonVisibility(e,t)}setShowLabel(e){this.toolbar?.setShowLabel(e)}setBtnActive(e,t){this.toolbar?.setBtnActive(e,t)}setVisible(e){this.toolbarContainer&&(this.toolbarContainer.style.visibility=e?"visible":"hidden")}setBackgroundColor(e){this.toolbar?.setBackgroundColor(e)}setColors(e){this.toolbar?.setColors(e)}hide(){this.toolbarContainer&&(this.toolbarContainer.style.display="none")}show(){this.toolbarContainer&&(this.toolbarContainer.style.display="")}getContainer(){return this.toolbarContainer}setType(e){this.toolbar?.setType(e)}getType(){return this.toolbar?.getType()||"default"}}class ig extends pi{groups=new Map;container;constructor(e){super(),this.container=e}create(e,t){const n=new zl({container:this.container,...t});return n.init(),this.groups.set(e,n),n}get(e){return this.groups.get(e)}updateTheme(e){this.groups.forEach(t=>t.setTheme(e))}destroy(){this.groups.forEach(e=>e.destroy()),this.groups.clear(),super.destroy()}}class od{element;options;container;header;contentArea;_isDestroyed=!1;_isInitialized=!1;unsubscribeTheme=null;unsubscribeLocale=null;rafId=null;constructor(e){this.options={title:"Dialog",width:300,height:"auto",position:"center",draggable:!0,resizable:!1,minWidth:200,minHeight:100,...e},this.container=e.container,this.element=this.createDom(),this.header=this.element.querySelector(".bim-dialog-header"),this.contentArea=this.element.querySelector(".bim-dialog-content"),this.init()}setTheme(e){const t=this.element.style;this.options.backgroundColor||t.setProperty("--bim-dialog-bg",e.bgElevated),this.options.headerBackgroundColor||t.setProperty("--bim-dialog-header-bg",e.bgInset),this.options.titleColor||t.setProperty("--bim-dialog-title-color",e.textPrimary),this.options.textColor||t.setProperty("--bim-dialog-text-color",e.textSecondary),this.options.borderColor||t.setProperty("--bim-dialog-border-color",e.borderDefault),t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-bg-inset",e.bgInset),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-text-secondary",e.textSecondary),t.setProperty("--bim-text-tertiary",e.textTertiary),t.setProperty("--bim-border-default",e.borderDefault),t.setProperty("--bim-shadow-lg",e.shadowLg)}init(){this._isInitialized||(this.container.appendChild(this.element),this.initPosition(),this.options.draggable&&this.initDrag(),this.options.resizable&&this.initResize(),this._isInitialized=!0,this.options.onOpen&&this.options.onOpen(),this.unsubscribeTheme=rt.subscribe(e=>{this.setTheme(e)}),this.unsubscribeLocale=Yt.subscribe(()=>{this.setLocales()}))}setLocales(){if(this.options.title){const e=this.header.querySelector(".bim-dialog-title");e&&(e.textContent=Ce(this.options.title))}}createDom(){const e=document.createElement("div");e.className="bim-dialog",this.options.id&&(e.id=this.options.id);const t=e.style;this.options.backgroundColor&&t.setProperty("--bim-dialog-bg",this.options.backgroundColor),this.options.headerBackgroundColor&&t.setProperty("--bim-dialog-header-bg",this.options.headerBackgroundColor),this.options.titleColor&&t.setProperty("--bim-dialog-title-color",this.options.titleColor),this.options.textColor&&t.setProperty("--bim-dialog-text-color",this.options.textColor),this.options.borderColor&&t.setProperty("--bim-dialog-border-color",this.options.borderColor),this.setSize(e,this.options.width,this.options.height),this.options.minWidth&&(e.style.minWidth=`${this.options.minWidth}px`);const n=document.createElement("div");n.className="bim-dialog-header",this.options.draggable&&n.classList.add("draggable");const i=document.createElement("span");i.className="bim-dialog-title",i.textContent=this.options.title?Ce(this.options.title):"";const r=document.createElement("span");r.className="bim-dialog-close",r.innerHTML="×",r.onclick=()=>{this.close()},n.appendChild(i),n.appendChild(r);const o=document.createElement("div");if(o.className="bim-dialog-content",typeof this.options.content=="string"?o.innerHTML=this.options.content:this.options.content instanceof HTMLElement&&o.appendChild(this.options.content),e.appendChild(n),e.appendChild(o),this.options.resizable){const c=document.createElement("div");c.className="bim-dialog-resize-handle",e.appendChild(c)}const a=c=>{c.stopPropagation()};return["click","dblclick","contextmenu","wheel","mousedown","mouseup","mousemove","touchstart","touchend","touchmove","pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointerover","pointerout"].forEach(c=>{e.addEventListener(c,a,{passive:!1})}),e}setSize(e,t,n){t!==void 0&&(t==="auto"||t==="fit-content"?e.style.width=t:e.style.width=typeof t=="number"?`${t}px`:t),n!==void 0&&(n==="auto"||n==="fit-content"?e.style.height=n:e.style.height=typeof n=="number"?`${n}px`:n)}fitWidth(e=!1){this.element.style.width="fit-content",e&&this.initPosition()}fitHeight(e=!1){this.element.style.height="auto";const t=this.element.getBoundingClientRect().height,n=this.options.minHeight??100,i=this.container.clientHeight||0;let r=Math.max(n,t);i>0&&(r=Math.min(r,i)),this.element.style.height=`${r}px`,e?this.initPosition():this.clampToContainer()}clampToContainer(){const e=this.container.clientWidth,t=this.container.clientHeight,n=this.element.offsetWidth,i=this.element.offsetHeight,r=this.options.bottomOffset??70,o=this.element.offsetLeft,a=this.element.offsetTop,l=Math.max(0,e-n),c=Math.max(0,t-i-r),h=Math.max(0,Math.min(o,l)),u=Math.max(0,Math.min(a,c));this.element.style.left=`${h}px`,this.element.style.top=`${u}px`}initPosition(){const e=this.options.position,t=this.element.getBoundingClientRect(),n=this.options.bottomOffset??70;let i=0,r=0;const o=this.container.clientWidth,a=this.container.clientHeight,l=t.width,c=t.height;if(typeof e=="object"&&"x"in e)i=e.x,r=e.y;else switch(e){case"center":i=(o-l)/2,r=(a-c)/2;break;case"top-left":i=0,r=0;break;case"top-center":i=(o-l)/2,r=0;break;case"top-right":i=o-l,r=0;break;case"left-center":i=0,r=(a-c)/2;break;case"right-center":i=o-l,r=(a-c)/2;break;case"bottom-left":i=0,r=a-c-n;break;case"bottom-center":i=(o-l)/2,r=a-c-n;break;case"bottom-right":i=o-l,r=a-c-n;break;default:i=(o-l)/2,r=(a-c)/2}i=Math.max(0,Math.min(i,o-l)),r=Math.max(0,Math.min(r,a-c-n)),this.element.style.left=`${i}px`,this.element.style.top=`${r}px`}initDrag(){let e=0,t=0,n=0,i=0,r=0,o=0,a=0,l=0,c=0;const h=f=>{f.preventDefault(),f.stopPropagation(),e=f.clientX,t=f.clientY,n=this.element.offsetLeft,i=this.element.offsetTop,r=this.container.clientWidth,o=this.container.clientHeight,a=this.element.offsetWidth,l=this.element.offsetHeight,c=this.options.bottomOffset??70,document.addEventListener("mousemove",u,{capture:!0}),document.addEventListener("mouseup",d,{capture:!0})},u=f=>{f.preventDefault(),f.stopPropagation(),!this.rafId&&(this.rafId=requestAnimationFrame(()=>{const p=f.clientX-e,g=f.clientY-t;let x=n+p,m=i+g;const b=r-a,v=o-l-c;x=Math.max(0,Math.min(x,b)),m=Math.max(0,Math.min(m,v)),this.element.style.left=`${x}px`,this.element.style.top=`${m}px`,this.rafId=null}))},d=()=>{this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null),document.removeEventListener("mousemove",u,{capture:!0}),document.removeEventListener("mouseup",d,{capture:!0})};this.header.addEventListener("mousedown",h)}initResize(){const e=this.element.querySelector(".bim-dialog-resize-handle");if(!e)return;let t=0,n=0,i=0,r=0;const o=c=>{c.preventDefault(),c.stopPropagation(),t=c.clientX,n=c.clientY,i=this.element.offsetWidth,r=this.element.offsetHeight,document.addEventListener("mousemove",a,{capture:!0}),document.addEventListener("mouseup",l,{capture:!0})},a=c=>{c.preventDefault(),c.stopPropagation(),!this.rafId&&(this.rafId=requestAnimationFrame(()=>{const h=c.clientX-t,u=c.clientY-n,d=Math.max(this.options.minWidth||100,i+h),f=Math.max(this.options.minHeight||50,r+u);this.element.style.width=`${d}px`,this.element.style.height=`${f}px`,this.rafId=null}))},l=()=>{this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null),document.removeEventListener("mousemove",a,{capture:!0}),document.removeEventListener("mouseup",l,{capture:!0})};e.addEventListener("mousedown",o)}setContent(e){this.contentArea.innerHTML="",typeof e=="string"?this.contentArea.innerHTML=e:this.contentArea.appendChild(e)}close(){this._isDestroyed||(this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.element.remove(),this._isDestroyed=!0,this.options.onClose&&this.options.onClose())}destroy(){this.close()}}class sg extends od{constructor(e){const t=document.createElement("div");t.className="bim-info-dialog-content";const n=document.createElement("h3");n.textContent="Model Information";const i=document.createElement("ul");i.innerHTML=` +(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode('.bim-engine-wrapper{position:relative;width:100%;height:100%;font-family:sans-serif;box-sizing:border-box;overflow:hidden;background:linear-gradient(to bottom,#d6e0eb,#f6faff)}.bim-engine-opt-btn-container{z-index:100}.bim-construct-tree-btn{position:absolute;top:20px;left:20px!important;z-index:100}.bim-btn-group-root{display:flex;gap:8px;z-index:1000;position:absolute;pointer-events:auto}.bim-btn-group-root.static{position:relative;inset:auto;transform:none}.bim-btn-group-root.dir-row{flex-direction:row;align-items:center}.bim-btn-group-root.dir-column{flex-direction:column;align-items:stretch}.bim-btn-group-section{display:flex;gap:4px;background-color:var(--bim-btn-group-section-bg, rgba(17, 17, 17, .88));border-radius:6px;padding:4px;box-shadow:0 2px 8px #0000004d,0 1px 3px #0003}.bim-btn-group-root.dir-row .bim-btn-group-section{flex-direction:row;align-items:center}.bim-btn-group-root.dir-column .bim-btn-group-section{flex-direction:column}.opt-btn-wrapper{position:relative}.opt-btn{display:flex;cursor:pointer;border-radius:4px;transition:background-color .2s,color .2s,border-color .2s;color:var(--bim-btn-text-color, #ccc);background-color:var(--bim-btn-bg, transparent);padding:6px;align-items:center;position:relative;justify-content:center;border:1px solid transparent;outline:none}.opt-btn:hover{background-color:var(--bim-btn-hover-bg, #444)}.opt-btn.active{background-color:var(--bim-btn-active-bg, rgba(255, 255, 255, .15));color:var(--bim-btn-text-active-color, #fff)}.opt-btn.disabled{opacity:.5;cursor:not-allowed}.opt-btn-icon{width:var(--bim-icon-size, 24px);height:var(--bim-icon-size, 24px);display:flex;align-items:center;justify-content:center;color:var(--bim-icon-color, #ccc);flex-shrink:0}.opt-btn-icon svg{width:100%;height:100%;fill:currentColor}.opt-btn-arrow{font-size:10px;opacity:.6;transition:transform .2s;display:inline-block;margin-left:4px}.opt-btn-arrow.rotated{transform:rotate(180deg)}.opt-btn-text-wrapper{display:flex;align-items:center;justify-content:center;pointer-events:none}.opt-btn-label{display:inline}.opt-btn.no-label .opt-btn-label{display:none}.opt-btn.align-vertical:not(.no-label){flex-direction:column;text-align:center}.opt-btn.align-vertical:not(.no-label) .opt-btn-text-wrapper{margin-top:4px}.opt-btn.align-vertical:not(.no-label) .opt-btn-label{font-size:12px;line-height:1.2}.opt-btn.align-horizontal:not(.no-label){flex-direction:row}.opt-btn.align-horizontal:not(.no-label) .opt-btn-text-wrapper{margin-left:8px}.opt-btn.align-horizontal:not(.no-label) .opt-btn-label{font-size:14px}.opt-btn.no-label .opt-btn-text-wrapper{width:0;height:0;margin:0;padding:0;overflow:visible;position:absolute;top:0;right:0}.opt-btn.no-label .opt-btn-arrow{position:absolute;top:2px;right:2px;margin:0;font-size:8px}.opt-btn-dropdown{position:absolute;background-color:var(--bim-toolbar-bg, rgba(17, 17, 17, .95));border-radius:4px;padding:4px;box-shadow:0 4px 12px #0003;z-index:1001;display:flex;flex-direction:column;border:1px solid rgba(255,255,255,.1);opacity:0;visibility:hidden;transform:translateY(-10px);transition:opacity .2s ease,transform .2s cubic-bezier(.2,0,.2,1),visibility .2s}@keyframes dropdown-fade-in{0%{opacity:0;transform:translateY(-8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.opt-btn-dropdown{animation:dropdown-fade-in .2s cubic-bezier(.2,0,.2,1) forwards;opacity:1;visibility:visible;transform:none}.opt-btn-dropdown-item{display:flex;align-items:center;padding:8px 12px;cursor:pointer;border-radius:4px;color:var(--bim-btn-text-color, #ccc);transition:background .2s,border-color .2s,color .2s;box-sizing:border-box;border:1px solid transparent;outline:none}.opt-btn-dropdown-item .opt-btn-icon{color:var(--bim-icon-color, #ccc)}.opt-btn-dropdown-item:hover{background-color:var(--bim-btn-hover-bg, #444)}.opt-btn-dropdown-item.active{background-color:var(--bim-btn-active-bg, rgba(255, 255, 255, .15));color:var(--bim-btn-text-active-color, #fff)}.opt-btn-dropdown-item.align-horizontal{flex-direction:row}.opt-btn-dropdown-item.align-horizontal .opt-btn-icon{width:18px;height:18px;margin-right:8px}.opt-btn-dropdown-item.align-vertical{flex-direction:column;text-align:center}.opt-btn-dropdown-item.align-vertical .opt-btn-icon{width:24px;height:24px;margin-bottom:4px}.opt-btn-dropdown-item.align-vertical .opt-btn-dropdown-label{font-size:12px}.bim-btn-group-root.is-bottom-toolbar .opt-btn-icon{width:32px;height:32px}.bim-btn-group-root.is-bottom-toolbar .opt-btn{padding:8px}.bim-btn-group-root.type-glass-pill .bim-btn-group-section{background:var(--bim-floating-bg);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:1px solid var(--bim-floating-border);border-radius:9999px;box-shadow:var(--bim-floating-shadow);padding:8px;gap:10px}.bim-btn-group-root.type-glass-pill .opt-btn{width:48px;height:48px;min-width:48px;border-radius:9999px;background:var(--bim-floating-btn-bg);border:1px solid var(--bim-floating-btn-border);box-shadow:var(--bim-floating-btn-shadow);color:var(--bim-text-primary);padding:0;transition:all .2s ease-out}.bim-btn-group-root.type-glass-pill .opt-btn:hover{background:var(--bim-floating-btn-bg-hover);transform:scale(1.05);box-shadow:var(--bim-floating-btn-shadow-hover)}.bim-btn-group-root.type-glass-pill .opt-btn:active{transform:scale(.98)}.bim-btn-group-root.type-glass-pill .opt-btn.active{background:var(--bim-primary);border:1px solid var(--bim-primary-active);color:var(--bim-text-inverse);box-shadow:var(--bim-shadow-glow)}.bim-btn-group-root.type-glass-pill .opt-btn.active:hover{background:var(--bim-primary-hover);transform:scale(1.05)}.bim-btn-group-root.type-glass-pill .opt-btn.active:active{transform:scale(.98)}.bim-btn-group-root.type-glass-pill .opt-btn.active .opt-btn-icon{color:var(--bim-icon-inverse)}.bim-btn-group-root.type-glass-pill .opt-btn.disabled{opacity:.3;cursor:not-allowed;transform:none;box-shadow:none}.bim-btn-group-root.type-glass-pill .opt-btn-icon{width:18px;height:18px;color:var(--bim-floating-icon-color);transition:color .2s ease-out}.bim-btn-group-root.type-glass-pill .opt-btn-icon svg{width:18px;height:18px}.bim-btn-group-root.type-glass-pill .opt-btn:hover .opt-btn-icon{color:var(--bim-floating-icon-color-hover)}.bim-btn-group-root.type-glass-pill .opt-btn-label{display:none!important}.bim-btn-group-root.type-glass-pill .opt-btn-text-wrapper{position:absolute;top:2px;right:2px;width:0;height:0;margin:0;padding:0}.bim-btn-group-root.type-glass-pill .opt-btn-arrow{font-size:8px;position:absolute;top:0;right:0;color:var(--bim-text-tertiary)}.opt-btn-dropdown.type-glass-pill{background:#fffffff2;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid rgba(226,232,240,.6);border-radius:12px;box-shadow:0 8px 24px #0000001f;padding:6px}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item{display:flex;flex-direction:row;align-items:center;gap:10px;border-radius:8px;color:#334155;padding:8px 12px;font-size:13px;font-weight:400;transition:all .1s ease-out}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item:hover{background:#f1f5f9}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item:active{background:#e2e8f0}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item.active{background:#3b82f6;color:#fff}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item.active .opt-btn-icon,.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item.active .opt-btn-dropdown-label{color:#fff}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item .opt-btn-icon{width:18px;height:18px;color:#334155;flex-shrink:0}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item .opt-btn-icon svg{width:18px;height:18px}.opt-btn-dropdown.type-glass-pill .opt-btn-dropdown-item .opt-btn-dropdown-label{white-space:nowrap;color:#334155}.opt-btn-dropdown.type-glass-pill.theme-dark{background:var(--bim-bg-overlay);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid var(--bim-border-default);box-shadow:var(--bim-shadow-lg)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item{color:var(--bim-text-primary)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item:hover{background:var(--bim-floating-btn-bg)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item:active{background:var(--bim-floating-btn-bg-hover)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item.active{background:var(--bim-primary);color:var(--bim-text-inverse)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item .opt-btn-icon{color:var(--bim-floating-icon-color)}.opt-btn-dropdown.type-glass-pill.theme-dark .opt-btn-dropdown-item .opt-btn-dropdown-label{color:var(--bim-text-primary)}.bim-dialog{position:absolute;background-color:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);border-radius:var(--bim-panel-radius, 12px);box-shadow:var(--bim-shadow-lg);display:flex;flex-direction:column;z-index:10001;color:var(--bim-dialog-title-color, var(--bim-text-primary));overflow:hidden;min-width:200px;min-height:100px;pointer-events:auto}.bim-dialog-header{height:40px;background-color:var(--bim-bg-inset);display:flex;align-items:center;justify-content:space-between;padding:0 12px;cursor:default;-webkit-user-select:none;user-select:none;border-bottom:1px solid var(--bim-border-default);flex-shrink:0}.bim-dialog-header.draggable{cursor:move}.bim-dialog-title{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--bim-dialog-title-color)}.bim-dialog-close{cursor:pointer;font-size:18px;color:var(--bim-text-tertiary);line-height:1;margin-left:8px}.bim-dialog-close:hover{color:var(--bim-text-primary)}.bim-dialog-content{flex:1;overflow:auto;font-size:14px;color:var(--bim-dialog-text-color, var(--bim-text-secondary))}.bim-dialog-resize-handle{position:absolute;width:10px;height:10px;bottom:0;right:0;cursor:se-resize;z-index:10}.bim-dialog-resize-handle:after{content:"";position:absolute;bottom:3px;right:3px;width:6px;height:6px;border-right:2px solid var(--bim-text-tertiary);border-bottom:2px solid var(--bim-text-tertiary)}.bim-dialog-resize-handle:hover:after{border-color:var(--bim-text-primary)}.bim-info-dialog-content{padding:16px;font-family:sans-serif;color:#333}.bim-info-dialog-content h3{margin-top:0;margin-bottom:12px;border-bottom:1px solid #eee;padding-bottom:8px;color:#0078d4}.bim-info-dialog-content ul{list-style:none;padding:0;margin:0}.bim-info-dialog-content li{margin-bottom:8px;font-size:14px;display:flex}.bim-info-dialog-content li strong{width:80px;color:#555}.bim-right-key{position:fixed;z-index:10000;display:none;background:transparent}.bim-right-key.visible{display:block}.bim-menu{display:flex;flex-direction:column;background:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);border-radius:8px;padding:6px;margin:0;list-style:none;box-shadow:var(--bim-shadow-lg);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;-webkit-user-select:none;user-select:none;color:var(--bim-text-primary)}.bim-menu-group{display:flex;flex-direction:column}.bim-menu-divider{height:1px;background-color:var(--bim-divider);margin:4px 0}.bim-menu-item{display:flex;align-items:center;padding:8px 12px;cursor:pointer;transition:all .2s ease;font-size:13px;position:relative;color:var(--bim-text-primary);border-radius:6px}.bim-menu-item:hover{background-color:var(--bim-component-bg-hover)}.bim-menu-item.disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.bim-menu-item-icon{display:none}.bim-menu.has-icons .bim-menu-item-icon{width:16px;height:16px;margin-right:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.bim-menu-item-icon svg{width:100%;height:100%;fill:currentColor}.bim-menu-item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.bim-menu-item-arrow{width:12px;height:12px;margin-left:8px;display:flex;align-items:center;justify-content:center;opacity:.7}.bim-menu-item-arrow svg{width:100%;height:100%;fill:currentColor}.bim-tree{width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden;font-size:14px;color:var(--bim-text-primary);-webkit-user-select:none;user-select:none;position:relative;background:transparent}.bim-tree-search{padding:6px;background-color:transparent;flex-shrink:0;position:relative}.bim-tree-search-wrapper{position:relative;width:100%;display:flex;align-items:center}.bim-tree-search-icon{position:absolute;left:8px;width:16px;height:16px;color:var(--bim-text-secondary);pointer-events:none;display:flex;align-items:center;justify-content:center}.bim-tree-search-icon svg{width:100%;height:100%}.bim-tree-search-input{width:100%;height:30px;padding:4px 8px 4px 30px;border:1px solid var(--bim-border-default);border-radius:4px;outline:none;font-size:13px;color:inherit;background-color:var(--bim-bg-elevated);transition:all .2s;box-sizing:border-box}.bim-tree-search-input:focus{border-color:var(--bim-primary);box-shadow:var(--bim-focus-ring)}.bim-tree-search-results{position:absolute;top:100%;left:8px;right:8px;background-color:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);box-shadow:var(--bim-shadow-md);border-radius:4px;max-height:200px;overflow-y:auto;z-index:10;display:none}.bim-tree-search-results.is-visible{display:block}.bim-tree-search-item{padding:8px 12px;cursor:pointer;border-bottom:1px solid rgba(0,0,0,.03)}.bim-tree-search-item:last-child{border-bottom:none}.bim-tree-search-item:hover{background-color:var(--bim-component-bg-hover)}.bim-tree-search-item-title{font-weight:500;display:block}.bim-tree-search-item-path{font-size:12px;color:var(--bim-text-secondary);margin-top:2px;display:block}.bim-tree-content{flex:1;overflow-y:auto;padding:2px 0;min-height:0}.bim-tree-node{display:flex;flex-direction:column}.bim-tree-node-content{display:flex;align-items:center;height:32px;cursor:pointer;transition:background-color .2s;border-radius:4px;padding-right:8px}.bim-tree-node-content:hover{background-color:var(--bim-component-bg-hover)}.bim-tree-switcher{width:24px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--bim-text-secondary);transition:transform .2s;flex-shrink:0}.bim-tree-switcher svg{width:12px;height:12px;fill:currentColor;transition:transform .2s}.bim-tree-switcher.is-expanded svg{transform:rotate(90deg)}.bim-tree-switcher.is-hidden{visibility:hidden}.bim-tree-checkbox{width:16px;height:16px;border:1px solid var(--bim-border-default);border-radius:2px;margin-right:8px;background-color:var(--bim-bg-elevated);position:relative;cursor:pointer;flex-shrink:0;transition:all .2s}.bim-tree-checkbox:hover{border-color:var(--bim-primary)}.bim-tree-checkbox.is-checked{background-color:var(--bim-primary);border-color:var(--bim-primary)}.bim-tree-checkbox.is-checked:after{content:"";position:absolute;top:1px;left:4px;width:5px;height:9px;border:2px solid var(--bim-text-inverse);border-top:0;border-left:0;transform:rotate(45deg)}.bim-tree-checkbox.is-indeterminate{background-color:var(--bim-bg-elevated);border-color:var(--bim-primary)}.bim-tree-checkbox.is-indeterminate:after{content:"";position:absolute;top:6px;left:3px;width:8px;height:2px;background-color:var(--bim-primary)}.bim-tree-node.is-disabled .bim-tree-checkbox{background-color:var(--bim-component-bg-disabled);border-color:var(--bim-border-disabled);cursor:not-allowed}.bim-tree-node.is-disabled .bim-tree-checkbox.is-checked{background-color:var(--bim-text-disabled)}.bim-tree-node.is-disabled .bim-tree-node-content{color:var(--bim-text-disabled);cursor:not-allowed}.bim-tree-icon{width:16px;height:16px;margin-right:6px;display:flex;align-items:center;justify-content:center;flex-shrink:0}.bim-tree-icon img,.bim-tree-icon svg{width:100%;height:100%}.bim-tree-title{flex:1;white-space:nowrap}.bim-tree-children{display:none;overflow:visible}.bim-tree-children.is-visible{display:block}.bim-tree-node-content.is-selected{background-color:var(--bim-component-bg-selected);color:var(--bim-primary)}.bim-tree-node-actions{display:none;align-items:center;margin-left:8px;flex-shrink:0}.bim-tree-node-content.is-selected .bim-tree-node-actions{display:flex}.bim-tree-content{flex:1;overflow:auto;padding:2px 0;min-height:0}.bim-tree-node{display:flex;flex-direction:column;width:fit-content;min-width:100%}.bim-tree-node-content{display:flex;align-items:center;height:32px;cursor:pointer;transition:background-color .2s;border-radius:4px;padding-right:8px;width:fit-content;min-width:100%;box-sizing:border-box}.bim-tab{display:flex;flex-direction:column;width:100%;height:100%;background:transparent;color:var(--bim-text-secondary)}.bim-tab__nav{display:flex;align-items:center;gap:4px;padding:4px;margin:8px 12px;background:var(--bim-bg-inset);border-radius:8px;border:1px solid var(--bim-border-subtle)}.bim-tab__item{flex:1;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 12px;border:none;border-radius:6px;background:transparent;color:var(--bim-text-secondary);cursor:pointer;transition:all .2s ease;font-size:13px;font-weight:500}.bim-tab__item:hover{color:var(--bim-text-primary);background-color:var(--bim-component-bg-hover)}.bim-tab__item.is-active{color:var(--bim-primary);background-color:var(--bim-bg-elevated);box-shadow:0 1px 3px #0000001a}.bim-tab__item.is-disabled{opacity:.5;cursor:not-allowed}.bim-tab__icon{width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;color:var(--bim-tab-icon, currentColor)}.bim-tab__icon svg{width:100%;height:100%;fill:currentColor}.bim-tab__title{white-space:nowrap}.bim-tab__content{flex:1;display:flex;position:relative;min-height:0;overflow:hidden}.bim-tab__panel{display:none;width:100%;height:100%;flex:1}.bim-tab__panel.is-active{display:flex;flex-direction:column;height:100%}.construct-tab__container{height:100%;display:flex;flex-direction:column}.construct-tab__panel-content{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden}.construct-tab__panel-content .bim-tree{flex:1}.bim-measure-panel{width:100%;display:flex;flex-direction:column;box-sizing:border-box;color:var(--bim-text-secondary)}.bim-measure-settings{display:none;box-sizing:border-box;color:var(--bim-text-secondary)}.bim-measure-settings-title{font-size:14px;font-weight:600;margin-bottom:10px}.bim-measure-settings-row{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}.bim-measure-settings-row .label{color:var(--bim-text-secondary);font-size:13px;flex:0 0 auto}.bim-measure-settings-select{flex:0 0 auto;width:120px;height:28px;border-radius:6px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);color:var(--bim-text-primary);padding:0 8px;box-sizing:border-box;outline:none}.bim-measure-settings-hint{font-size:12px;line-height:1.4;color:var(--bim-text-tertiary);margin-top:-4px;margin-bottom:8px}.bim-measure-settings-actions{margin-top:14px;display:flex;justify-content:flex-start;gap:10px}.bim-measure-settings-save,.bim-measure-settings-cancel{flex:0 0 auto!important;width:auto;min-width:0;height:30px;padding:0 12px;border-radius:4px;cursor:pointer;box-sizing:border-box}.bim-measure-settings-save{border:none;background:var(--bim-primary);color:var(--bim-text-inverse)}.bim-measure-settings-cancel{border:1px solid var(--bim-border-default);background:transparent;color:var(--bim-text-secondary)}.bim-measure-settings-save:hover,.bim-measure-settings-save:active,.bim-measure-settings-save:focus,.bim-measure-settings-cancel:hover,.bim-measure-settings-cancel:active,.bim-measure-settings-cancel:focus{background:inherit;outline:none}.bim-measure-settings-save:hover{background:var(--bim-primary-hover)}.bim-measure-tools{display:flex;flex-direction:column;gap:8px}.bim-measure-tool-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.bim-measure-tool-btn{width:100%;height:42px;border-radius:6px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease;padding:0;box-sizing:border-box}.bim-measure-tool-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.bim-measure-tool-btn.is-active{border-color:var(--bim-primary);background:var(--bim-primary-subtle)}.bim-measure-tool-btn.is-active .bim-measure-tool-icon{color:var(--bim-primary)}.bim-measure-tool-icon{width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;color:var(--bim-icon-default)}.bim-measure-tool-icon svg{width:100%;height:100%;fill:currentColor}.bim-measure-toggle{display:flex;justify-content:flex-end}.bim-measure-toggle-btn{height:22px;border-radius:4px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:all .2s ease;padding:0 6px;gap:4px;font-size:12px;line-height:1}.bim-measure-toggle-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.bim-measure-toggle-text{color:var(--bim-text-secondary)}.bim-measure-toggle-icon svg{width:14px;height:14px;fill:currentColor;color:var(--bim-icon-default);transition:transform .15s ease}.bim-measure-toggle-btn.is-expanded .bim-measure-toggle-icon svg{transform:rotate(180deg)}.bim-measure-result{margin-top:12px;padding-top:12px;border-top:1px solid var(--bim-divider);display:flex;flex-direction:column;gap:10px}.bim-measure-row{display:flex;align-items:baseline;gap:8px;font-size:13px;line-height:1.4}.bim-measure-row .label{color:var(--bim-text-secondary);min-width:84px}.bim-measure-row .value{color:var(--bim-text-primary);flex:1;word-break:break-word}.bim-measure-main-number{color:#ffd24a}.bim-measure-main-number.is-laser-text,.bim-measure-main-unit{color:var(--bim-text-primary)}.bim-measure-xyz{display:flex;flex-direction:column;gap:6px}.bim-measure-xyz .value{font-variant-numeric:tabular-nums}.bim-measure-xyz-x{color:#ff4d4f!important}.bim-measure-xyz-y{color:#52c41a!important}.bim-measure-xyz-z{color:#1677ff!important}.bim-measure-footer{margin-top:12px;padding-top:10px;border-top:1px solid var(--bim-divider);display:flex;align-items:center;justify-content:flex-start;gap:10px}.bim-measure-clear-btn{background:transparent;border:none;color:var(--bim-danger);cursor:pointer;padding:0;font-size:13px;flex:0 0 auto!important;width:auto;min-width:0}.bim-measure-clear-btn:hover,.bim-measure-clear-btn:active,.bim-measure-clear-btn:focus{background:transparent;border:none;outline:none;text-decoration:none}.bim-measure-settings-btn{width:24px;height:24px;border-radius:4px;border:none;background:transparent;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0;margin-left:auto;flex:0 0 auto!important}.bim-measure-settings-btn:hover,.bim-measure-settings-btn:active,.bim-measure-settings-btn:focus{background:transparent;border:none;outline:none}.bim-measure-settings-btn svg{width:18px;height:18px;fill:currentColor;color:var(--bim-icon-default)}.section-plane-panel{display:flex;gap:8px;padding:12px 12px 16px;box-sizing:border-box}.section-plane-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:10px;border:1px solid var(--bim-border-default);background:var(--bim-bg-inset);border-radius:8px;cursor:pointer;transition:all .2s ease;min-width:60px;outline:none;color:var(--bim-text-primary)}.section-plane-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.section-plane-btn:active{background:var(--bim-primary-subtle);border-color:var(--bim-primary)}.section-plane-btn.is-active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.section-plane-btn.is-active .section-plane-btn-icon{color:var(--bim-primary)}.section-plane-btn-icon{width:24px;height:24px;display:flex;align-items:center;justify-content:center;color:var(--bim-icon-default)}.section-plane-btn-icon svg{width:100%;height:100%;fill:currentColor}.section-plane-btn-label{font-size:12px;color:inherit;text-align:center;line-height:1.2}.section-axis-panel{display:flex;flex-direction:column;gap:8px;padding:12px 12px 16px;box-sizing:border-box}.section-axis-row-1{display:flex;gap:8px;padding-bottom:8px;border-bottom:1px solid var(--bim-divider)}.section-axis-row-2{display:flex;gap:8px;padding-top:8px}.section-axis-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:8px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:8px;cursor:pointer;transition:all .2s ease;outline:none;color:var(--bim-text-primary);min-height:48px}.section-axis-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.section-axis-btn.active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.section-axis-btn.active .section-axis-btn-icon{color:var(--bim-primary)}.section-axis-btn-icon{width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;color:var(--bim-icon-default)}.section-axis-btn-icon svg{width:100%;height:100%}.section-axis-btn-label{font-size:12px;color:inherit;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.section-axis-btn-text{min-height:40px}.section-axis-btn-text .section-axis-btn-label{font-size:18px;font-weight:600}.section-box-panel{display:flex;flex-direction:column;padding:12px;box-sizing:border-box;-webkit-user-select:none;user-select:none}.section-box-row-buttons{display:flex;gap:6px;padding-bottom:12px;border-bottom:1px solid var(--bim-divider)}.section-box-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;padding:6px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:8px;cursor:pointer;color:var(--bim-text-primary);min-height:44px;transition:all .2s ease}.section-box-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.section-box-btn.active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.section-box-btn.active .section-box-btn-icon{color:var(--bim-primary)}.section-box-btn-icon{width:24px;height:24px;color:var(--bim-icon-default)}.section-box-btn-icon svg{width:100%;height:100%}.section-box-btn-label{font-size:11px;white-space:nowrap}.section-box-sliders{display:flex;flex-direction:column;gap:16px;padding-top:16px}.section-box-slider{display:flex;align-items:center;gap:12px;position:relative;z-index:1}.section-box-slider:hover{z-index:10}.section-box-slider-label{font-size:13px;font-weight:700;color:var(--bim-text-primary);min-width:14px}.section-box-slider-track{position:relative;flex:1;height:4px;background:var(--bim-border-default);border-radius:2px}.section-box-slider-range{position:absolute;top:0;height:100%;background:var(--bim-primary);border-radius:2px;pointer-events:none}.section-box-slider-handle{position:absolute;top:50%;width:14px;height:14px;background:var(--bim-bg-elevated);border:2px solid var(--bim-primary);border-radius:50%;transform:translate(-50%,-50%);cursor:grab;z-index:5;touch-action:none;transition:transform .2s,box-shadow .2s}.section-box-slider-handle:hover{transform:translate(-50%,-50%) scale(1.2);box-shadow:0 0 0 4px var(--bim-primary-subtle)}.section-box-slider-handle.dragging{cursor:grabbing;transform:translate(-50%,-50%) scale(1.2);background:var(--bim-primary)}.walk-control-panel{display:flex;align-items:center;gap:20px;padding:12px 20px;background-color:var(--bim-bg-base, #152232);border:1px solid var(--bim-border-strong, #475569);border-radius:12px;box-shadow:var(--bim-shadow-xl, 0 20px 40px rgba(0, 0, 0, .3));-webkit-user-select:none;user-select:none}.walk-divider{width:1px;height:40px;background:var(--bim-divider);flex-shrink:0}.walk-control-left{display:flex;gap:8px}.walk-icon-btn{width:48px;height:48px;display:flex;align-items:center;justify-content:center;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:8px;cursor:pointer;transition:all .2s ease;color:var(--bim-icon-default);padding:8px}.walk-icon-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.walk-icon-btn.active{background:var(--bim-primary-subtle);border-color:var(--bim-primary);color:var(--bim-primary)}.walk-icon-btn.active svg{fill:var(--bim-primary)}.walk-icon-btn svg{width:32px;height:32px}.walk-control-settings{display:flex;align-items:center;gap:16px;flex:1}.walk-speed-control{display:flex;align-items:center;gap:12px}.walk-speed-label{color:var(--bim-text-primary);font-size:14px;white-space:nowrap}.walk-speed-group{display:flex;align-items:center;gap:8px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-subtle);border-radius:6px;padding:4px}.walk-speed-btn{width:32px;height:32px;background:var(--bim-bg-elevated);border:1px solid var(--bim-border-subtle);border-radius:4px;color:var(--bim-text-primary);font-size:18px;cursor:pointer;transition:all .2s ease}.walk-speed-btn:hover{background:var(--bim-component-bg-hover);border-color:var(--bim-border-strong)}.walk-speed-btn:disabled{opacity:.5;cursor:not-allowed}.walk-speed-display{min-width:40px;text-align:center;color:var(--bim-text-primary);font-size:14px;font-weight:700}.walk-checkbox-wrapper{display:flex;align-items:center;gap:8px;cursor:pointer}.walk-checkbox{width:18px;height:18px;cursor:pointer}.walk-checkbox:disabled{opacity:.5;cursor:not-allowed}.walk-checkbox-label{color:var(--bim-text-primary);font-size:14px;white-space:nowrap}.walk-checkbox-wrapper input:disabled+.walk-checkbox-label{opacity:.5}.walk-select-wrapper{display:flex;align-items:center;gap:8px}.walk-select-label{color:var(--bim-text-primary);font-size:14px;white-space:nowrap}.walk-select{padding:6px 12px;background:var(--bim-bg-inset);border:1px solid var(--bim-border-default);border-radius:6px;color:var(--bim-text-primary);font-size:14px;cursor:pointer;min-width:120px}.walk-select option{background:var(--bim-bg-elevated);color:var(--bim-text-primary)}.walk-exit-btn{padding:10px 24px;background:var(--bim-primary);border:none;border-radius:8px;color:var(--bim-text-inverse);font-size:14px;font-weight:600;cursor:pointer;transition:all .2s ease;white-space:nowrap}.walk-exit-btn:hover{background:var(--bim-primary-hover);transform:scale(1.02)}.bim-collapse{background-color:var(--bim-bg-elevated);border:1px solid var(--bim-border-default);border-radius:8px;font-size:14px;color:var(--bim-text-primary)}.bim-collapse.is-ghost{background-color:transparent;border:none}.bim-collapse.is-ghost .bim-collapse-item{border-bottom:none}.bim-collapse.is-ghost .bim-collapse-header{background-color:var(--bim-component-bg);padding-left:12px;padding-right:0;border-bottom:1px solid var(--bim-border-default)}.bim-collapse.is-ghost .bim-collapse-header:hover{background-color:var(--bim-component-bg-hover)}.bim-collapse.is-ghost .bim-collapse-content{background-color:transparent;border-top:none}.bim-collapse-item{border-bottom:1px solid var(--bim-border-subtle)}.bim-collapse-item:last-child{border-bottom:none}.bim-collapse-item.is-disabled .bim-collapse-header{color:var(--bim-text-disabled);cursor:not-allowed}.bim-collapse-header{display:flex;align-items:center;padding:12px 16px;background-color:var(--bim-component-bg);cursor:pointer;transition:all .2s ease;position:relative}.bim-collapse-header:hover{background-color:var(--bim-component-bg-hover)}.bim-collapse-arrow{margin-right:12px;font-size:12px;width:12px;height:12px;transition:transform .24s;display:inline-flex;align-items:center;justify-content:center}.bim-collapse-arrow svg{width:100%;height:100%;fill:currentColor}.bim-collapse-item.is-active .bim-collapse-arrow{transform:rotate(90deg)}.bim-collapse-icon{margin-right:8px;display:inline-flex;align-items:center}.bim-collapse-icon svg{width:16px;height:16px;fill:currentColor}.bim-collapse-title{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.bim-collapse-extra{margin-left:auto}.bim-collapse-content{overflow:hidden;background-color:var(--bim-bg-elevated);border-top:1px solid var(--bim-border-subtle);transition:height .2s ease-in-out,opacity .2s ease-in-out}.bim-collapse-content.is-hidden{display:none}')),document.head.appendChild(e)}}catch(o){console.error("vite-plugin-css-injected-by-js",o)}})(); +(function(Is,zr){typeof exports=="object"&&typeof module<"u"?zr(exports):typeof define=="function"&&define.amd?define(["exports"],zr):(Is=typeof globalThis<"u"?globalThis:Is||self,zr(Is.IflowEngine={}))})(this,(function(Is){"use strict";const zr={common:{title:"BimEngine",description:"这是一个使用 BIM-ENGINE。",openTestDialog:"打开测试弹窗",openInfoDialog:"打开信息弹窗 (封装版)"},toolbar:{home:"首页",measure:"测量",zoomBox:"选框放大",info:"信息",location:"定位",setting:"设置",walk:"漫游",map:"地图",property:"构件详情",fullscreen:"全屏",walkMenu:"漫游菜单",walkPerson:"第一人称",walkBird:"第三人称",tree:"模型树",section:"剖切",sectionPlane:"拾取面剖切",sectionAxis:"轴向剖切",sectionBox:"剖切盒"},dialog:{testTitle:"测试弹窗",testContent:'
这是一个 可拖拽可缩放 的弹窗。

你可以尝试拖动标题栏,或者拖动右下角改变大小。
'},menu:{info:"信息",home:"首页",componentDetail:"构件详情",hideSelected:"隐藏选中构件",transparentSelected:"半透明选中构件",isolateSelected:"隔离选中构件",hideOthers:"其他构件隐藏",transparentOthers:"其他构件半透明",fitSectionBox:"剖切盒适应",showAll:"显示全部"},tree:{searchPlaceholder:"请输入要搜索的内容"},constructTree:{title:"目录树"},tab:{component:"构件",system:"系统",space:"空间",type:"类型",major:"专业"},panel:{property:{title:"构件详情",base:"基本属性",material:"材质信息",advanced:"高级设置",tab:{props:"属性",material:"材质"}},componentDetail:{title:"构件详情",noSelection:"请先选中构件"}},measure:{btnName:"测量",dialogTitle:"测量",modes:{distance:"距离",minDistance:"最小距离",angle:"角度",elevation:"标高",volume:"体积",laserDistance:"激光测距",slope:"坡度",spaceVolume:"空间体积"},actions:{expand:"展开",collapse:"收起",clearAll:"删除全部",settings:"设置"},labels:{currentMode:"当前测量方式:",x:"X:",y:"Y:",z:"Z:",value:{distance:"距离:",minDistance:"最小距离:",angle:"角度:",elevation:"标高:",volume:"体积:",laserDistance:"激光测距:",slope:"坡度:",spaceVolume:"空间体积:"}},units:{mm:"mm",cm:"cm",m:"m",km:"km",deg:"°",m3:"m³",percent:"%"},settings:{title:"设置",unit:"单位:",precision:"精度:",hint:"距离、最小距离和标高默认使用该单位;角度和体积有各自默认单位。",save:"保存设置",cancel:"取消"}},sectionPlane:{dialogTitle:"拾取面剖切",actions:{hide:"隐藏",reverse:"反向",reset:"重置"}},sectionAxis:{dialogTitle:"轴向剖切",actions:{hide:"隐藏",reverse:"反向",axisX:"X",axisY:"Y",axisZ:"Z"}},sectionBox:{dialogTitle:"剖切盒",actions:{hide:"隐藏",reverse:"反向",fitToModel:"适应",reset:"重置"},axes:{x:"X",y:"Y",z:"Z"}},walkControl:{speed:"移动速度:",gravity:"重力",collision:"碰撞",characterModel:{label:"建筑工人",constructionWorker:"建筑工人",officeMale:"办公室男性"},walkMode:{label:"行走模式",walk:"行走模式",run:"奔跑模式"},exit:"退出",path:{dialogTitle:"路径漫游"}},map:{dialogTitle:"地图"}},Y0={common:{title:"BimEngine",description:"This is a BIM-ENGINE demo.",openTestDialog:"Open Test Dialog",openInfoDialog:"Open Info Dialog (Wrapped)"},toolbar:{home:"Home",measure:"Measure",zoomBox:"Zoom Box",info:"Info",location:"Location",setting:"Settings",walk:"Walk",map:"Map",property:"Property",fullscreen:"Fullscreen",walkPerson:"Person",walkBird:"Bird Eye",walkMenu:"Menu",tree:"Tree",section:"Section",sectionPlane:"Plane Section",sectionAxis:"Axis Section",sectionBox:"Section Box"},dialog:{testTitle:"Test Dialog",testContent:'
This is a draggable and resizable dialog.

Try dragging the title bar or resizing from the bottom-right corner.
'},menu:{info:"Info",home:"Home",componentDetail:"Component Detail",hideSelected:"Hide Selected",transparentSelected:"Transparent Selected",isolateSelected:"Isolate Selected",hideOthers:"Hide Others",transparentOthers:"Transparent Others",fitSectionBox:"Fit Section Box",showAll:"Show All"},tree:{searchPlaceholder:"Please enter content to search"},constructTree:{title:"Construct Tree"},tab:{component:"Component",system:"System",space:"Space",type:"Type",major:"Major"},panel:{property:{title:"Component Details",base:"Basic Info",material:"Material",advanced:"Advanced",tab:{props:"Properties",material:"Material"}},componentDetail:{title:"Component Detail",noSelection:"Please select a component first"}},measure:{btnName:"Measure",dialogTitle:"Measure",modes:{distance:"Distance",minDistance:"Min Distance",angle:"Angle",elevation:"Elevation",volume:"Volume",laserDistance:"Laser Distance",slope:"Slope",spaceVolume:"Space Volume"},actions:{expand:"Expand",collapse:"Collapse",clearAll:"Clear All",settings:"Settings"},labels:{currentMode:"Mode:",x:"X:",y:"Y:",z:"Z:",value:{distance:"Distance:",minDistance:"Min Distance:",angle:"Angle:",elevation:"Elevation:",volume:"Volume:",laserDistance:"Laser Distance:",slope:"Slope:",spaceVolume:"Space Volume:"}},units:{mm:"mm",cm:"cm",m:"m",km:"km",deg:"°",m3:"m³",percent:"%"},settings:{title:"Settings",unit:"Unit:",precision:"Precision:",hint:"Distance, min distance and elevation use this unit by default; angle and volume use their own units.",save:"Save",cancel:"Cancel"}},sectionPlane:{dialogTitle:"Plane Section",actions:{hide:"Hide",reverse:"Reverse",reset:"Reset"}},sectionAxis:{dialogTitle:"Axis Section",actions:{hide:"Hide",reverse:"Reverse",axisX:"X",axisY:"Y",axisZ:"Z"}},sectionBox:{dialogTitle:"Section Box",actions:{hide:"Hide",reverse:"Reverse",fitToModel:"Fit",reset:"Reset"},axes:{x:"X",y:"Y",z:"Z"}},walkControl:{speed:"Speed:",gravity:"Gravity",collision:"Collision",characterModel:{label:"Construction Worker",constructionWorker:"Construction Worker",officeMale:"Office Male"},walkMode:{label:"Walk Mode",walk:"Walk",run:"Run"},exit:"Exit",path:{dialogTitle:"Path Walk"}},map:{dialogTitle:"Map"}};class K0{currentLocale="zh-CN";messages={"zh-CN":zr,"en-US":Y0};listeners=[];constructor(){}getLocale(){return this.currentLocale}setLocale(e){this.currentLocale!==e&&(this.currentLocale=e,this.notifyListeners())}t(e){if(!e)return"";const t=e.split(".");let n=this.messages[this.currentLocale];for(const i of t)if(n&&typeof n=="object"&&i in n)n=n[i];else return e;return n}subscribe(e){return this.listeners.push(e),()=>{this.listeners=this.listeners.filter(t=>t!==e)}}notifyListeners(){this.listeners.forEach(e=>e(this.currentLocale))}}const Yt=new K0,Te=s=>Yt.t(s),sd={name:"light",primary:"#2563eb",primaryHover:"#1d4ed8",primaryActive:"#1e40af",primarySubtle:"rgba(37, 99, 235, 0.1)",success:"#16a34a",successHover:"#15803d",successSubtle:"rgba(22, 163, 74, 0.1)",warning:"#d97706",warningHover:"#b45309",warningSubtle:"rgba(217, 119, 6, 0.1)",danger:"#dc2626",dangerHover:"#b91c1c",dangerSubtle:"rgba(220, 38, 38, 0.1)",info:"#0891b2",infoHover:"#0e7490",infoSubtle:"rgba(8, 145, 178, 0.1)",bgBase:"#f8fafc",bgElevated:"#ffffff",bgOverlay:"rgba(255, 255, 255, 0.98)",bgInset:"#f1f5f9",bgGlass:"rgba(255, 255, 255, 0.8)",bgGlassBlur:"24px",textPrimary:"#0f172a",textSecondary:"#475569",textTertiary:"#94a3b8",textDisabled:"#cbd5e1",textInverse:"#ffffff",textLink:"#2563eb",textLinkHover:"#1d4ed8",iconDefault:"#64748b",iconHover:"#334155",iconActive:"#2563eb",iconDisabled:"#cbd5e1",iconInverse:"#ffffff",borderDefault:"#e2e8f0",borderSubtle:"#f1f5f9",borderStrong:"#cbd5e1",borderDisabled:"#f1f5f9",divider:"#e2e8f0",componentBg:"transparent",componentBgHover:"rgba(15, 23, 42, 0.04)",componentBgActive:"rgba(15, 23, 42, 0.08)",componentBgSelected:"rgba(37, 99, 235, 0.08)",componentBgDisabled:"#f8fafc",focusRing:"rgba(37, 99, 235, 0.5)",focusRingOffset:"#ffffff",selectionBg:"rgba(37, 99, 235, 0.15)",selectionText:"#0f172a",shadowSm:"0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08)",shadowMd:"0 4px 12px rgba(0, 0, 0, 0.12), 0 6px 20px rgba(0, 0, 0, 0.1)",shadowLg:"0 10px 25px rgba(0, 0, 0, 0.15), 0 6px 10px rgba(0, 0, 0, 0.1)",shadowXl:"0 20px 40px rgba(0, 0, 0, 0.2), 0 10px 15px rgba(0, 0, 0, 0.1)",shadowGlow:"0 2px 8px rgba(59, 130, 246, 0.3), 0 4px 16px rgba(59, 130, 246, 0.2)",scrollbarTrack:"#f1f5f9",scrollbarThumb:"#cbd5e1",scrollbarThumbHover:"#94a3b8",floatingBg:"rgba(255, 255, 255, 0.8)",floatingBorder:"rgba(226, 232, 240, 0.5)",floatingShadow:"0 4px 24px rgba(0, 0, 0, 0.06)",floatingBtnBg:"rgba(255, 255, 255, 0.9)",floatingBtnBorder:"rgba(203, 213, 225, 0.6)",floatingBtnShadow:"0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08)",floatingBtnBgHover:"#ffffff",floatingBtnShadowHover:"0 4px 12px rgba(0, 0, 0, 0.12), 0 6px 20px rgba(0, 0, 0, 0.1)",floatingIconColor:"#334155",floatingIconColorHover:"#1e293b",panelBg:"rgba(255, 255, 255, 0.95)",panelBorder:"rgba(226, 232, 240, 0.6)",panelHeaderBg:"rgba(248, 250, 252, 0.9)",panelRadius:"12px",tabBg:"#f1f5f9",tabItemBg:"transparent",tabItemBgHover:"rgba(255, 255, 255, 0.6)",tabItemBgActive:"#ffffff",tabItemTextActive:"#2563eb",overrides:{dialog:{headerBg:"#f8fafc"},toolbar:{bg:"rgba(255, 255, 255, 0.9)",buttonBg:"rgba(255, 255, 255, 0.95)",buttonBgHover:"#ffffff",buttonBgActive:"#2563eb"},input:{bg:"#ffffff",bgFocus:"#ffffff",placeholder:"#94a3b8"}}},$0={name:"dark",primary:"#3b82f6",primaryHover:"#60a5fa",primaryActive:"#2563eb",primarySubtle:"rgba(59, 130, 246, 0.15)",success:"#22c55e",successHover:"#4ade80",successSubtle:"rgba(34, 197, 94, 0.15)",warning:"#f59e0b",warningHover:"#fbbf24",warningSubtle:"rgba(245, 158, 11, 0.15)",danger:"#ef4444",dangerHover:"#f87171",dangerSubtle:"rgba(239, 68, 68, 0.15)",info:"#06b6d4",infoHover:"#22d3ee",infoSubtle:"rgba(6, 182, 212, 0.15)",bgBase:"#152232",bgElevated:"#1f2d3e",bgOverlay:"rgba(21, 34, 50, 0.98)",bgInset:"#152232",bgGlass:"rgba(21, 34, 50, 0.85)",bgGlassBlur:"24px",textPrimary:"#ffffff",textSecondary:"#94a3b8",textTertiary:"#64748b",textDisabled:"#475569",textInverse:"#152232",textLink:"#60a5fa",textLinkHover:"#93c5fd",iconDefault:"#ffffff",iconHover:"#ffffff",iconActive:"#3b82f6",iconDisabled:"#475569",iconInverse:"#152232",borderDefault:"rgba(51, 65, 85, 0.5)",borderSubtle:"rgba(51, 65, 85, 0.5)",borderStrong:"#475569",borderDisabled:"#1e293b",divider:"#334155",componentBg:"transparent",componentBgHover:"rgba(248, 250, 252, 0.06)",componentBgActive:"rgba(248, 250, 252, 0.1)",componentBgSelected:"rgba(59, 130, 246, 0.2)",componentBgDisabled:"#1e293b",focusRing:"rgba(59, 130, 246, 0.5)",focusRingOffset:"#1e293b",selectionBg:"rgba(59, 130, 246, 0.3)",selectionText:"#f8fafc",shadowSm:"0 2px 8px rgba(0, 0, 0, 0.4), 0 4px 12px rgba(0, 0, 0, 0.3)",shadowMd:"0 4px 12px rgba(0, 0, 0, 0.5), 0 6px 20px rgba(0, 0, 0, 0.4)",shadowLg:"0 10px 25px rgba(0, 0, 0, 0.6), 0 6px 10px rgba(0, 0, 0, 0.4)",shadowXl:"0 20px 40px rgba(0, 0, 0, 0.7), 0 10px 15px rgba(0, 0, 0, 0.5)",shadowGlow:"0 2px 8px rgba(59, 130, 246, 0.4), 0 4px 16px rgba(59, 130, 246, 0.25)",scrollbarTrack:"#1e293b",scrollbarThumb:"#475569",scrollbarThumbHover:"#64748b",floatingBg:"rgba(15, 23, 42, 0.85)",floatingBorder:"rgba(51, 65, 85, 0.4)",floatingShadow:"0 4px 24px rgba(0, 0, 0, 0.25)",floatingBtnBg:"rgba(51, 65, 85, 0.6)",floatingBtnBorder:"rgba(100, 116, 139, 0.5)",floatingBtnShadow:"0 2px 8px rgba(0, 0, 0, 0.3), 0 4px 12px rgba(0, 0, 0, 0.25)",floatingBtnBgHover:"rgba(71, 85, 105, 0.7)",floatingBtnShadowHover:"0 4px 12px rgba(0, 0, 0, 0.35), 0 6px 20px rgba(0, 0, 0, 0.3)",floatingIconColor:"#e2e8f0",floatingIconColorHover:"#f8fafc",panelBg:"rgba(15, 23, 42, 0.95)",panelBorder:"rgba(51, 65, 85, 0.5)",panelHeaderBg:"rgba(15, 23, 42, 0.9)",panelRadius:"12px",tabBg:"rgba(30, 41, 59, 0.6)",tabItemBg:"transparent",tabItemBgHover:"rgba(51, 65, 85, 0.5)",tabItemBgActive:"rgba(51, 65, 85, 0.8)",tabItemTextActive:"#60a5fa",overrides:{dialog:{headerBg:"#0f172a"},toolbar:{bg:"rgba(30, 41, 59, 0.9)",buttonBg:"rgba(51, 65, 85, 0.6)",buttonBgHover:"rgba(71, 85, 105, 0.7)",buttonBgActive:"#3b82f6"},input:{bg:"#0f172a",bgFocus:"#1e293b",placeholder:"#64748b"}}};class J0{currentTheme=sd;listeners=[];constructor(){}getTheme(){return this.currentTheme}setTheme(e){e==="light"?this.applyTheme(sd):this.applyTheme($0)}setCustomTheme(e){this.applyTheme(e)}applyTheme(e){this.currentTheme=e,this.notifyListeners()}subscribe(e){return this.listeners.push(e),e(this.currentTheme),()=>{this.listeners=this.listeners.filter(t=>t!==e)}}notifyListeners(){this.listeners.forEach(e=>e(this.currentTheme))}}const rt=new J0;class Q0{events=new Map;on(e,t){return this.events.has(e)||this.events.set(e,[]),this.events.get(e).push(t),()=>this.off(e,t)}off(e,t){const n=this.events.get(e);if(!n)return;const i=n.indexOf(t);i!==-1&&n.splice(i,1)}emit(e,t){const n=this.events.get(e);n&&n.forEach(i=>{try{i(t)}catch(r){console.error(`[EventEmitter] Error in listener for event "${e}":`,r)}})}clear(){this.events.clear()}}class wt{static instance=null;eventEmitter=new Q0;container=null;wrapper=null;toolbar=null;dialog=null;engine3d=null;buttonGroup=null;rightKey=null;constructTree=null;measure=null;walkControl=null;map=null;sectionPlane=null;sectionAxis=null;sectionBox=null;walkPath=null;walkPlanView=null;componentDetail=null;constructor(){}static getInstance(){return wt.instance||(wt.instance=new wt),wt.instance}static reset(){wt.instance&&(wt.instance.eventEmitter.clear(),wt.instance=null)}emit(e,t){this.eventEmitter.emit(e,t)}on(e,t){return this.eventEmitter.on(e,t)}off(e,t){this.eventEmitter.off(e,t)}clearEvents(){this.eventEmitter.clear()}}class zl{container;options;groups=[];activeBtnIds=new Set;btnRefs=new Map;dropdownElement=null;hoverTimeout=null;customColors=new Set;unsubscribeLocale=null;unsubscribeTheme=null;DEFAULT_ICON='';constructor(e){const t=typeof e.container=="string"?document.getElementById(e.container):e.container;if(!t)throw new Error("Container not found");this.container=t,this.options={showLabel:!0,visibility:{},direction:"row",position:"static",align:"vertical",expand:"down",...e},["backgroundColor","btnBackgroundColor","btnHoverColor","btnActiveColor","iconColor","iconActiveColor","textColor","textActiveColor"].forEach(i=>{e[i]&&this.customColors.add(i)}),this.initContainer(),this.applyStyles()}emit(e,t){wt.getInstance().emit(e,t)}initContainer(){this.container.innerHTML="",this.container.classList.add("bim-btn-group-root"),this.options.direction==="column"?this.container.classList.add("dir-column"):this.container.classList.add("dir-row"),this.options.className&&this.container.classList.add(this.options.className),this.options.type&&this.options.type!=="default"&&this.container.classList.add(`type-${this.options.type}`),this.updatePosition(),this.setupEventInterception(this.container)}setupEventInterception(e){const t=i=>{i.stopPropagation()};["click","dblclick","contextmenu","wheel","mousedown","mouseup","mousemove","touchstart","touchend","touchmove","pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointerover","pointerout"].forEach(i=>{e.addEventListener(i,t,{passive:!1})})}updatePosition(){const e=this.options.position,t=this.container.style;if(t.top="",t.bottom="",t.left="",t.right="",t.transform="",e==="static"){this.container.classList.add("static");return}if(this.container.classList.remove("static"),this.container.style.position="absolute",typeof e=="object"&&"x"in e)t.left=`${e.x}px`,t.top=`${e.y}px`;else{const n="20px";switch(e){case"top-left":t.top=n,t.left=n;break;case"top-center":t.top=n,t.left="50%",t.transform="translateX(-50%)";break;case"top-right":t.top=n,t.right=n;break;case"bottom-left":t.bottom=n,t.left=n;break;case"bottom-center":t.bottom=n,t.left="50%",t.transform="translateX(-50%)";break;case"bottom-right":t.bottom=n,t.right=n;break;case"left-center":t.left=n,t.top="50%",t.transform="translateY(-50%)";break;case"right-center":t.right=n,t.top="50%",t.transform="translateY(-50%)";break;case"center":t.top="50%",t.left="50%",t.transform="translate(-50%, -50%)";break}}}applyStyles(){const e=this.container.style;this.options.backgroundColor&&e.setProperty("--bim-btn-group-section-bg",this.options.backgroundColor),this.options.btnBackgroundColor&&e.setProperty("--bim-btn-bg",this.options.btnBackgroundColor),this.options.btnHoverColor&&e.setProperty("--bim-btn-hover-bg",this.options.btnHoverColor),this.options.btnActiveColor&&e.setProperty("--bim-btn-active-bg",this.options.btnActiveColor),this.options.iconColor&&e.setProperty("--bim-icon-color",this.options.iconColor),this.options.iconActiveColor&&e.setProperty("--bim-icon-active-color",this.options.iconActiveColor),this.options.textColor&&e.setProperty("--bim-btn-text-color",this.options.textColor),this.options.textActiveColor&&e.setProperty("--bim-btn-text-active-color",this.options.textActiveColor),document.querySelectorAll(".opt-btn-dropdown").forEach(n=>{const i=n.style;this.options.iconColor&&i.setProperty("--bim-icon-color",this.options.iconColor),this.options.iconActiveColor&&i.setProperty("--bim-icon-active-color",this.options.iconActiveColor),this.options.textColor&&i.setProperty("--bim-btn-text-color",this.options.textColor),this.options.textActiveColor&&i.setProperty("--bim-btn-text-active-color",this.options.textActiveColor),this.options.btnBackgroundColor&&i.setProperty("--bim-btn-bg",this.options.btnBackgroundColor),this.options.btnHoverColor&&i.setProperty("--bim-btn-hover-bg",this.options.btnHoverColor),this.options.btnActiveColor&&i.setProperty("--bim-btn-active-bg",this.options.btnActiveColor)})}setPrimaryColor(e){this.container.style.setProperty("--bim-primary-color",e),document.querySelectorAll(".opt-btn-dropdown").forEach(n=>{n.style.setProperty("--bim-primary-color",e)})}setTheme(e){const t={backgroundColor:e.bgElevated,btnBackgroundColor:e.componentBg,btnHoverColor:e.componentBgHover,btnActiveColor:e.componentBgActive,iconColor:e.iconDefault,iconActiveColor:e.iconActive,textColor:e.textSecondary,textActiveColor:e.textPrimary};Object.entries(t).forEach(([n,i])=>{const r=n;this.customColors.has(r)||(this.options[r]=i)}),this.container.classList.remove("theme-dark","theme-light"),this.container.classList.add(`theme-${e.name}`),this.applyStyles(),this.setPrimaryColor(e.primary),this.applyThemeCssVars(e)}applyThemeCssVars(e){const t=this.container.style;t.setProperty("--bim-primary",e.primary),t.setProperty("--bim-primary-hover",e.primaryHover),t.setProperty("--bim-primary-active",e.primaryActive),t.setProperty("--bim-bg-glass",e.bgGlass),t.setProperty("--bim-bg-glass-blur",e.bgGlassBlur),t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-bg-overlay",e.bgOverlay),t.setProperty("--bim-bg-inset",e.bgInset),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-text-secondary",e.textSecondary),t.setProperty("--bim-text-tertiary",e.textTertiary),t.setProperty("--bim-text-inverse",e.textInverse),t.setProperty("--bim-icon-default",e.iconDefault),t.setProperty("--bim-icon-hover",e.iconHover),t.setProperty("--bim-icon-active",e.iconActive),t.setProperty("--bim-icon-inverse",e.iconInverse),t.setProperty("--bim-border-default",e.borderDefault),t.setProperty("--bim-border-subtle",e.borderSubtle),t.setProperty("--bim-component-bg-hover",e.componentBgHover),t.setProperty("--bim-component-bg-active",e.componentBgActive),t.setProperty("--bim-shadow-sm",e.shadowSm),t.setProperty("--bim-shadow-md",e.shadowMd),t.setProperty("--bim-shadow-lg",e.shadowLg),t.setProperty("--bim-shadow-glow",e.shadowGlow),t.setProperty("--bim-floating-bg",e.floatingBg),t.setProperty("--bim-floating-border",e.floatingBorder),t.setProperty("--bim-floating-shadow",e.floatingShadow),t.setProperty("--bim-floating-btn-bg",e.floatingBtnBg),t.setProperty("--bim-floating-btn-border",e.floatingBtnBorder),t.setProperty("--bim-floating-btn-shadow",e.floatingBtnShadow),t.setProperty("--bim-floating-btn-bg-hover",e.floatingBtnBgHover),t.setProperty("--bim-floating-btn-shadow-hover",e.floatingBtnShadowHover),t.setProperty("--bim-floating-icon-color",e.floatingIconColor),t.setProperty("--bim-floating-icon-color-hover",e.floatingIconColorHover),this.syncDropdownCssVars(e)}syncDropdownCssVars(e){document.querySelectorAll(".opt-btn-dropdown").forEach(n=>{const i=n.style;i.setProperty("--bim-primary",e.primary),i.setProperty("--bim-bg-overlay",e.bgOverlay),i.setProperty("--bim-border-default",e.borderDefault),i.setProperty("--bim-text-primary",e.textPrimary),i.setProperty("--bim-text-inverse",e.textInverse),i.setProperty("--bim-shadow-lg",e.shadowLg),i.setProperty("--bim-floating-btn-bg",e.floatingBtnBg),i.setProperty("--bim-floating-btn-bg-hover",e.floatingBtnBgHover),i.setProperty("--bim-floating-icon-color",e.floatingIconColor)})}setColors(e){this.options={...this.options,...e},Object.keys(e).forEach(t=>{this.customColors.add(t)}),this.applyStyles()}async init(){this.render(),this.unsubscribeLocale=Yt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=rt.subscribe(e=>{this.setTheme(e)})}setLocales(){this.render()}addGroup(e,t){if(this.groups.some(i=>i.id===e))return;const n={id:e,buttons:[]};if(t){const i=this.groups.findIndex(r=>r.id===t);i!==-1?this.groups.splice(i,0,n):this.groups.push(n)}else this.groups.push(n)}addButton(e){const{groupId:t,parentId:n}=e,i=this.groups.find(o=>o.id===t);if(!i)return;const r={...e,children:e.children||[]};if(n){const o=this.findButton(i.buttons,n);o&&(o.children||(o.children=[]),o.children.push(r))}else i.buttons.push(r)}findButton(e,t){for(const n of e){if(n.id===t)return n;if(n.children){const i=this.findButton(n.children,t);if(i)return i}}}render(){this.container.innerHTML="",this.btnRefs.clear(),this.groups.forEach((e,t)=>{const n=this.renderGroup(e,t,this.groups.length);this.container.appendChild(n)})}renderGroup(e,t,n){const i=document.createElement("div");return i.className="bim-btn-group-section",t{if(this.isVisible(r.id)){const o=this.renderButton(r);i.appendChild(o)}}),i}renderButton(e){const t=document.createElement("div");t.className="opt-btn-wrapper";const n=document.createElement("div");n.className="opt-btn",e.isActive&&this.activeBtnIds.add(e.id),(e.align||this.options.align||"vertical")==="horizontal"?n.classList.add("align-horizontal"):n.classList.add("align-vertical"),this.activeBtnIds.has(e.id)&&n.classList.add("active"),e.disabled&&n.classList.add("disabled"),this.options.showLabel&&e.label||(n.classList.add("no-label"),e.label&&(n.title=Te(e.label)));const o=e.iconSize||32,a=e.minWidth||50;n.style.minWidth=`${a}px`;const l=document.createElement("div");l.className="opt-btn-icon",l.style.width=`${o}px`,l.style.height=`${o}px`,l.innerHTML=this.getIcon(e.icon),n.appendChild(l);const c=document.createElement("div");if(c.className="opt-btn-text-wrapper",this.options.showLabel&&e.label){const h=document.createElement("span");h.className="opt-btn-label",h.textContent=Te(e.label),c.appendChild(h)}return c.hasChildNodes()&&n.appendChild(c),n.addEventListener("click",()=>this.handleClick(e)),n.addEventListener("mouseenter",()=>this.handleMouseEnter(e,n)),n.addEventListener("mouseleave",()=>this.handleMouseLeave()),this.btnRefs.set(e.id,n),t.appendChild(n),t}setBtnActive(e,t){const n=this.findButtonById(e);if(!n)return;const i=t!==void 0?t:!this.activeBtnIds.has(e);i?this.activeBtnIds.add(e):this.activeBtnIds.delete(e),n.isActive=i,this.updateButtonState(e)}handleClick(e){if(!e.disabled&&(!e.children||e.children.length===0)){if(e.keepActive){const n=!this.activeBtnIds.has(e.id);this.setBtnActive(e.id,n),n&&e.exclusive&&e.groupId&&this.deactivateExclusiveSiblings(e)}this.closeDropdown(),e.onClick&&e.onClick(e)}}deactivateExclusiveSiblings(e){const t=this.groups.find(n=>n.id===e.groupId);if(t){if(e.parentId){const i=this.findButton(t.buttons,e.parentId)?.children||[];for(const r of i)r&&r.id!==e.id&&r.parentId===e.parentId&&r.groupId===e.groupId&&this.activeBtnIds.has(r.id)&&(this.setBtnActive(r.id,!1),r.onClick&&r.onClick(r));return}for(const n of t.buttons)n.id!==e.id&&n.groupId===e.groupId&&(n.parentId||this.activeBtnIds.has(n.id)&&(this.setBtnActive(n.id,!1),n.onClick&&n.onClick(n)))}}handleMouseEnter(e,t){this.hoverTimeout&&clearTimeout(this.hoverTimeout),e.children&&e.children.length>0?this.showDropdown(e,t):this.closeDropdown()}handleMouseLeave(){this.hoverTimeout=window.setTimeout(()=>this.closeDropdown(),200)}showDropdown(e,t){if(this.closeDropdown(),!e.children)return;const n=document.createElement("div");n.className="opt-btn-dropdown",this.options.backgroundColor&&n.style.setProperty("--bim-toolbar-bg",this.options.backgroundColor);const i=n.style;this.options.iconColor&&i.setProperty("--bim-icon-color",this.options.iconColor),this.options.iconActiveColor&&i.setProperty("--bim-icon-active-color",this.options.iconActiveColor),this.options.textColor&&i.setProperty("--bim-btn-text-color",this.options.textColor),this.options.textActiveColor&&i.setProperty("--bim-btn-text-active-color",this.options.textActiveColor),this.options.btnBackgroundColor&&i.setProperty("--bim-btn-bg",this.options.btnBackgroundColor),this.options.btnHoverColor&&i.setProperty("--bim-btn-hover-bg",this.options.btnHoverColor),this.options.btnActiveColor&&i.setProperty("--bim-btn-active-bg",this.options.btnActiveColor);const r=t.getBoundingClientRect(),o=this.options.expand||"down";this.options.direction==="row"?n.style.flexDirection="column":n.style.flexDirection="row",this.options.type&&this.options.type!=="default"&&n.classList.add(`type-${this.options.type}`);const a=rt.getTheme();n.classList.add(`theme-${a.name}`),i.setProperty("--bim-primary",a.primary),i.setProperty("--bim-bg-overlay",a.bgOverlay),i.setProperty("--bim-border-default",a.borderDefault),i.setProperty("--bim-text-primary",a.textPrimary),i.setProperty("--bim-text-inverse",a.textInverse),i.setProperty("--bim-shadow-lg",a.shadowLg),i.setProperty("--bim-floating-btn-bg",a.floatingBtnBg),i.setProperty("--bim-floating-btn-bg-hover",a.floatingBtnBgHover),i.setProperty("--bim-floating-icon-color",a.floatingIconColor),document.body.appendChild(n),this.setupEventInterception(n),e.children.forEach(c=>{if(this.isVisible(c.id)){const h=this.renderDropdownItem(c);n.appendChild(h)}});const l=n.getBoundingClientRect();o==="up"?(n.style.bottom=window.innerHeight-r.top+8+"px",n.style.left=r.left+(r.width-l.width)/2+"px"):o==="down"?(n.style.top=r.bottom+8+"px",n.style.left=r.left+(r.width-l.width)/2+"px"):o==="right"?(n.style.top=r.top+(r.height-l.height)/2+"px",n.style.left=r.right+8+"px"):o==="left"&&(n.style.top=r.top+(r.height-l.height)/2+"px",n.style.right=window.innerWidth-r.left+8+"px"),n.addEventListener("mouseenter",()=>{this.hoverTimeout&&clearTimeout(this.hoverTimeout)}),n.addEventListener("mouseleave",()=>this.handleMouseLeave()),this.dropdownElement=n}renderDropdownItem(e){const t=document.createElement("div");t.className="opt-btn-dropdown-item",(e.align||"horizontal")==="horizontal"?t.classList.add("align-horizontal"):t.classList.add("align-vertical"),(this.activeBtnIds.has(e.id)||e.isActive)&&t.classList.add("active");const i=e.iconSize||32,r=e.minWidth;r&&(t.style.minWidth=`${r}px`);const o=document.createElement("div");if(o.className="opt-btn-icon",o.style.width=`${i}px`,o.style.height=`${i}px`,o.innerHTML=this.getIcon(e.icon),t.appendChild(o),this.options.showLabel&&e.label){const a=document.createElement("span");a.className="opt-btn-dropdown-label",a.textContent=Te(e.label),t.appendChild(a)}else e.label&&(t.title=Te(e.label));return t.addEventListener("click",a=>{a.stopPropagation(),this.handleClick(e)}),t}closeDropdown(){this.dropdownElement&&(this.dropdownElement.remove(),this.dropdownElement=null),this.btnRefs.forEach(e=>{const t=e.querySelector(".opt-btn-arrow");t&&t.classList.remove("rotated")})}updateButtonState(e){const t=this.btnRefs.get(e);t&&(this.activeBtnIds.has(e)?t.classList.add("active"):t.classList.remove("active"))}getIcon(e){return e||this.DEFAULT_ICON}updateButtonVisibility(e,t){this.options.visibility||(this.options.visibility={}),this.options.visibility[e]=t,this.render()}setShowLabel(e){this.options.showLabel=e,this.updateLabelsVisibility()}updateLabelsVisibility(){this.btnRefs.forEach((e,t)=>{const n=this.findButtonById(t);if(!n)return;this.options.showLabel&&n.label?(e.classList.remove("no-label"),e.removeAttribute("title")):(e.classList.add("no-label"),n.label&&(e.title=Te(n.label)))})}findButtonById(e){for(const t of this.groups){const n=this.findButton(t.buttons,e);if(n)return n}}setBackgroundColor(e){this.setColors({backgroundColor:e})}isVisible(e){return this.options.visibility?.[e]!==!1}setType(e){this.container.classList.remove("type-default","type-glass-pill"),this.options.type=e,e&&e!=="default"&&this.container.classList.add(`type-${e}`),this.render()}getType(){return this.options.type||"default"}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.closeDropdown(),this.container.innerHTML="",this.btnRefs.clear()}}class eg extends zl{async init(){await super.init();const{createHomeButton:e}=await Promise.resolve().then(()=>rT),{createZoomBoxButton:t}=await Promise.resolve().then(()=>oT),{createWalkMenuButton:n}=await Promise.resolve().then(()=>aT),{createMapButton:i}=await Promise.resolve().then(()=>lT),{createPropertyButton:r}=await Promise.resolve().then(()=>cT),{createSettingButton:o}=await Promise.resolve().then(()=>hT),{createInfoButton:a}=await Promise.resolve().then(()=>uT),{createFullscreenButton:l}=await Promise.resolve().then(()=>dT),{createMeasureButton:c}=await Promise.resolve().then(()=>fT),{createSectionMenuButton:h}=await Promise.resolve().then(()=>pT),{createSectionPlaneButton:u}=await Promise.resolve().then(()=>mT),{createSectionAxisButton:d}=await Promise.resolve().then(()=>gT),{createSectionBoxButton:f}=await Promise.resolve().then(()=>xT);this.addGroup("group-1"),this.addButton(e()),this.addButton(t()),this.addButton(c()),this.addButton(h()),this.addButton(u()),this.addButton(d()),this.addButton(f()),this.addButton(n()),this.addButton(i()),this.addButton(r()),this.addGroup("group-2"),this.addButton(o()),this.addButton(a()),this.addButton(l()),this.render()}}class pi{registry;subscriptions=[];constructor(){this.registry=wt.getInstance()}subscribe(e,t){const n=this.registry.on(e,t);this.subscriptions.push(n)}emit(e,t){this.registry.emit(e,t)}destroy(){this.subscriptions.forEach(e=>e()),this.subscriptions=[]}}class tg extends pi{toolbar=null;toolbarContainer=null;container;constructor(e){super(),this.container=e,this.init()}init(){this.toolbarContainer=document.createElement("div"),this.toolbarContainer.id="opt-btn-groups",this.toolbarContainer.className="bim-engine-opt-btn-container is-bottom-toolbar",this.container.appendChild(this.toolbarContainer),this.toolbar=new eg({container:this.toolbarContainer,type:"glass-pill",showLabel:!0,direction:"row",position:"bottom-right",align:"vertical",expand:"up"}),this.toolbar.init()}updateTheme(e){this.toolbar?.setTheme(e)}refresh(){this.toolbar?.render()}destroy(){this.toolbar?.destroy(),this.toolbar=null,super.destroy()}addGroup(e,t){this.toolbar?.addGroup(e,t),this.toolbar?.render()}addButton(e){this.toolbar?.addButton(e),this.toolbar?.render()}setButtonVisibility(e,t){this.toolbar?.updateButtonVisibility(e,t)}setShowLabel(e){this.toolbar?.setShowLabel(e)}setBtnActive(e,t){this.toolbar?.setBtnActive(e,t)}setVisible(e){this.toolbarContainer&&(this.toolbarContainer.style.visibility=e?"visible":"hidden")}setBackgroundColor(e){this.toolbar?.setBackgroundColor(e)}setColors(e){this.toolbar?.setColors(e)}hide(){this.toolbarContainer&&(this.toolbarContainer.style.display="none")}show(){this.toolbarContainer&&(this.toolbarContainer.style.display="")}getContainer(){return this.toolbarContainer}setType(e){this.toolbar?.setType(e)}getType(){return this.toolbar?.getType()||"default"}}class ng extends pi{groups=new Map;container;constructor(e){super(),this.container=e}create(e,t){const n=new zl({container:this.container,...t});return n.init(),this.groups.set(e,n),n}get(e){return this.groups.get(e)}updateTheme(e){this.groups.forEach(t=>t.setTheme(e))}destroy(){this.groups.forEach(e=>e.destroy()),this.groups.clear(),super.destroy()}}class rd{element;options;container;header;contentArea;_isDestroyed=!1;_isInitialized=!1;unsubscribeTheme=null;unsubscribeLocale=null;rafId=null;constructor(e){this.options={title:"Dialog",width:300,height:"auto",position:"center",draggable:!0,resizable:!1,minWidth:200,minHeight:100,...e},this.container=e.container,this.element=this.createDom(),this.header=this.element.querySelector(".bim-dialog-header"),this.contentArea=this.element.querySelector(".bim-dialog-content"),this.init()}setTheme(e){const t=this.element.style;this.options.backgroundColor||t.setProperty("--bim-dialog-bg",e.bgElevated),this.options.headerBackgroundColor||t.setProperty("--bim-dialog-header-bg",e.bgInset),this.options.titleColor||t.setProperty("--bim-dialog-title-color",e.textPrimary),this.options.textColor||t.setProperty("--bim-dialog-text-color",e.textSecondary),this.options.borderColor||t.setProperty("--bim-dialog-border-color",e.borderDefault),t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-bg-inset",e.bgInset),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-text-secondary",e.textSecondary),t.setProperty("--bim-text-tertiary",e.textTertiary),t.setProperty("--bim-border-default",e.borderDefault),t.setProperty("--bim-shadow-lg",e.shadowLg)}init(){this._isInitialized||(this.container.appendChild(this.element),this.initPosition(),this.options.draggable&&this.initDrag(),this.options.resizable&&this.initResize(),this._isInitialized=!0,this.options.onOpen&&this.options.onOpen(),this.unsubscribeTheme=rt.subscribe(e=>{this.setTheme(e)}),this.unsubscribeLocale=Yt.subscribe(()=>{this.setLocales()}))}setLocales(){if(this.options.title){const e=this.header.querySelector(".bim-dialog-title");e&&(e.textContent=Te(this.options.title))}}createDom(){const e=document.createElement("div");e.className="bim-dialog",this.options.id&&(e.id=this.options.id);const t=e.style;this.options.backgroundColor&&t.setProperty("--bim-dialog-bg",this.options.backgroundColor),this.options.headerBackgroundColor&&t.setProperty("--bim-dialog-header-bg",this.options.headerBackgroundColor),this.options.titleColor&&t.setProperty("--bim-dialog-title-color",this.options.titleColor),this.options.textColor&&t.setProperty("--bim-dialog-text-color",this.options.textColor),this.options.borderColor&&t.setProperty("--bim-dialog-border-color",this.options.borderColor),this.setSize(e,this.options.width,this.options.height),this.options.minWidth&&(e.style.minWidth=`${this.options.minWidth}px`);const n=document.createElement("div");n.className="bim-dialog-header",this.options.draggable&&n.classList.add("draggable");const i=document.createElement("span");i.className="bim-dialog-title",i.textContent=this.options.title?Te(this.options.title):"";const r=document.createElement("span");r.className="bim-dialog-close",r.innerHTML="×",r.onclick=()=>{this.close()},n.appendChild(i),n.appendChild(r);const o=document.createElement("div");if(o.className="bim-dialog-content",typeof this.options.content=="string"?o.innerHTML=this.options.content:this.options.content instanceof HTMLElement&&o.appendChild(this.options.content),e.appendChild(n),e.appendChild(o),this.options.resizable){const c=document.createElement("div");c.className="bim-dialog-resize-handle",e.appendChild(c)}const a=c=>{c.stopPropagation()};return["click","dblclick","contextmenu","wheel","mousedown","mouseup","mousemove","touchstart","touchend","touchmove","pointerdown","pointerup","pointermove","pointerenter","pointerleave","pointerover","pointerout"].forEach(c=>{e.addEventListener(c,a,{passive:!1})}),e}setSize(e,t,n){t!==void 0&&(t==="auto"||t==="fit-content"?e.style.width=t:e.style.width=typeof t=="number"?`${t}px`:t),n!==void 0&&(n==="auto"||n==="fit-content"?e.style.height=n:e.style.height=typeof n=="number"?`${n}px`:n)}fitWidth(e=!1){this.element.style.width="fit-content",e&&this.initPosition()}fitHeight(e=!1){this.element.style.height="auto";const t=this.element.getBoundingClientRect().height,n=this.options.minHeight??100,i=this.container.clientHeight||0;let r=Math.max(n,t);i>0&&(r=Math.min(r,i)),this.element.style.height=`${r}px`,e?this.initPosition():this.clampToContainer()}clampToContainer(){const e=this.container.clientWidth,t=this.container.clientHeight,n=this.element.offsetWidth,i=this.element.offsetHeight,r=this.options.bottomOffset??70,o=this.element.offsetLeft,a=this.element.offsetTop,l=Math.max(0,e-n),c=Math.max(0,t-i-r),h=Math.max(0,Math.min(o,l)),u=Math.max(0,Math.min(a,c));this.element.style.left=`${h}px`,this.element.style.top=`${u}px`}initPosition(){const e=this.options.position,t=this.element.getBoundingClientRect(),n=this.options.bottomOffset??70;let i=0,r=0;const o=this.container.clientWidth,a=this.container.clientHeight,l=t.width,c=t.height;if(typeof e=="object"&&"x"in e)i=e.x,r=e.y;else switch(e){case"center":i=(o-l)/2,r=(a-c)/2;break;case"top-left":i=0,r=0;break;case"top-center":i=(o-l)/2,r=0;break;case"top-right":i=o-l,r=0;break;case"left-center":i=0,r=(a-c)/2;break;case"right-center":i=o-l,r=(a-c)/2;break;case"bottom-left":i=0,r=a-c-n;break;case"bottom-center":i=(o-l)/2,r=a-c-n;break;case"bottom-right":i=o-l,r=a-c-n;break;default:i=(o-l)/2,r=(a-c)/2}i=Math.max(0,Math.min(i,o-l)),r=Math.max(0,Math.min(r,a-c-n)),this.element.style.left=`${i}px`,this.element.style.top=`${r}px`}initDrag(){let e=0,t=0,n=0,i=0,r=0,o=0,a=0,l=0,c=0;const h=f=>{f.preventDefault(),f.stopPropagation(),e=f.clientX,t=f.clientY,n=this.element.offsetLeft,i=this.element.offsetTop,r=this.container.clientWidth,o=this.container.clientHeight,a=this.element.offsetWidth,l=this.element.offsetHeight,c=this.options.bottomOffset??70,document.addEventListener("mousemove",u,{capture:!0}),document.addEventListener("mouseup",d,{capture:!0})},u=f=>{f.preventDefault(),f.stopPropagation(),!this.rafId&&(this.rafId=requestAnimationFrame(()=>{const p=f.clientX-e,g=f.clientY-t;let x=n+p,m=i+g;const b=r-a,v=o-l-c;x=Math.max(0,Math.min(x,b)),m=Math.max(0,Math.min(m,v)),this.element.style.left=`${x}px`,this.element.style.top=`${m}px`,this.rafId=null}))},d=()=>{this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null),document.removeEventListener("mousemove",u,{capture:!0}),document.removeEventListener("mouseup",d,{capture:!0})};this.header.addEventListener("mousedown",h)}initResize(){const e=this.element.querySelector(".bim-dialog-resize-handle");if(!e)return;let t=0,n=0,i=0,r=0;const o=c=>{c.preventDefault(),c.stopPropagation(),t=c.clientX,n=c.clientY,i=this.element.offsetWidth,r=this.element.offsetHeight,document.addEventListener("mousemove",a,{capture:!0}),document.addEventListener("mouseup",l,{capture:!0})},a=c=>{c.preventDefault(),c.stopPropagation(),!this.rafId&&(this.rafId=requestAnimationFrame(()=>{const h=c.clientX-t,u=c.clientY-n,d=Math.max(this.options.minWidth||100,i+h),f=Math.max(this.options.minHeight||50,r+u);this.element.style.width=`${d}px`,this.element.style.height=`${f}px`,this.rafId=null}))},l=()=>{this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null),document.removeEventListener("mousemove",a,{capture:!0}),document.removeEventListener("mouseup",l,{capture:!0})};e.addEventListener("mousedown",o)}setContent(e){this.contentArea.innerHTML="",typeof e=="string"?this.contentArea.innerHTML=e:this.contentArea.appendChild(e)}close(){this._isDestroyed||(this.rafId&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.element.remove(),this._isDestroyed=!0,this.options.onClose&&this.options.onClose())}destroy(){this.close()}}class ig extends rd{constructor(e){const t=document.createElement("div");t.className="bim-info-dialog-content";const n=document.createElement("h3");n.textContent="Model Information";const i=document.createElement("ul");i.innerHTML=`
  • Name: Sample Project
  • Version: 1.0.0
  • Date: ${new Date().toLocaleDateString()}
  • Status: Active
  • - `;const r=document.createElement("button");r.textContent="Update Status",r.style.marginTop="10px",r.onclick=()=>{alert("Status updated!")},t.appendChild(n),t.appendChild(i),t.appendChild(r),super({container:e,title:"dialog.testTitle",content:t,width:320,height:"auto",position:"center",resizable:!0,draggable:!0,onClose:()=>{console.log("Info dialog closed")},onOpen:()=>{console.log("Info dialog opened")}})}}class rg extends pi{container;activeDialogs=[];constructor(e){super(),this.container=e,this.subscribe("ui:open-dialog",t=>{console.log("[DialogManager] Received open-dialog event:",t),t.id==="info"&&this.showInfoDialog()})}create(e){const t=new od({container:this.container,...e,onClose:()=>{this.activeDialogs=this.activeDialogs.filter(n=>n!==t),e.onClose&&e.onClose()}});return t.setTheme(rt.getTheme()),this.activeDialogs.push(t),t}showInfoDialog(){new sg(this.container)}updateTheme(e){this.activeDialogs.forEach(t=>{t.setTheme&&t.setTheme(e)})}destroy(){this.activeDialogs.forEach(e=>e.destroy()),this.activeDialogs=[],super.destroy()}}const Hr="181",Bs={ROTATE:0,DOLLY:1,PAN:2},Ns={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},og=0,ad=1,ag=2,ld=1,cd=2,mi=3,Pn=0,on=1,Et=2,Wt=0,ks=1,Hl=2,hd=3,ud=4,dd=5,Gn=100,lg=101,cg=102,hg=103,ug=104,Vr=200,dg=201,fg=202,pg=203,Vl=204,Gl=205,Wl=206,mg=207,Xl=208,gg=209,xg=210,vg=211,bg=212,yg=213,_g=214,jl=0,ql=1,Zl=2,Us=3,Yl=4,Kl=5,$l=6,Jl=7,Wo=0,Mg=1,wg=2,Ni=0,fd=1,pd=2,md=3,Ql=4,gd=5,xd=6,vd=7,bd="attached",Sg="detached",yd=300,Os=301,Fs=302,ec=303,tc=304,Xo=306,ni=1e3,ii=1001,jo=1002,Kt=1003,_d=1004,Gr=1005,$t=1006,qo=1007,gi=1008,Wn=1009,Md=1010,wd=1011,Wr=1012,nc=1013,ts=1014,Xn=1015,Rn=1016,ic=1017,sc=1018,zs=1020,Sd=35902,Ed=35899,Td=1021,Ad=1022,fn=1023,Xr=1026,Hs=1027,rc=1028,oc=1029,ac=1030,lc=1031,cc=1033,Zo=33776,Yo=33777,Ko=33778,$o=33779,hc=35840,uc=35841,dc=35842,fc=35843,pc=36196,mc=37492,gc=37496,xc=37808,vc=37809,bc=37810,yc=37811,_c=37812,Mc=37813,wc=37814,Sc=37815,Ec=37816,Tc=37817,Ac=37818,Cc=37819,Pc=37820,Rc=37821,Lc=36492,Dc=36494,Ic=36495,Bc=36283,Nc=36284,kc=36285,Uc=36286,jr=2300,qr=2301,Oc=2302,Cd=2400,Pd=2401,Rd=2402,Eg=2500,Tg=0,Ld=1,Fc=2,Ag=3200,Cg=3201,Zr=0,Pg=1,ki="",gt="srgb",Rt="srgb-linear",Jo="linear",lt="srgb",Vs=7680,Dd=519,Rg=512,Lg=513,Dg=514,Id=515,Ig=516,Bg=517,Ng=518,kg=519,zc=35044,Bd="300 es",si=2e3,Qo=2001;function Nd(s){for(let e=s.length-1;e>=0;--e)if(s[e]>=65535)return!0;return!1}function Yr(s){return document.createElementNS("http://www.w3.org/1999/xhtml",s)}function Ug(){const s=Yr("canvas");return s.style.display="block",s}const kd={};function ea(...s){const e="THREE."+s.shift();console.log(e,...s)}function He(...s){const e="THREE."+s.shift();console.warn(e,...s)}function Qe(...s){const e="THREE."+s.shift();console.error(e,...s)}function Kr(...s){const e=s.join(" ");e in kd||(kd[e]=!0,He(...s))}function Og(s,e,t){return new Promise(function(n,i){function r(){switch(s.clientWaitSync(e,s.SYNC_FLUSH_COMMANDS_BIT,0)){case s.WAIT_FAILED:i();break;case s.TIMEOUT_EXPIRED:setTimeout(r,t);break;default:n()}}setTimeout(r,t)})}class ns{addEventListener(e,t){this._listeners===void 0&&(this._listeners={});const n=this._listeners;n[e]===void 0&&(n[e]=[]),n[e].indexOf(t)===-1&&n[e].push(t)}hasEventListener(e,t){const n=this._listeners;return n===void 0?!1:n[e]!==void 0&&n[e].indexOf(t)!==-1}removeEventListener(e,t){const n=this._listeners;if(n===void 0)return;const i=n[e];if(i!==void 0){const r=i.indexOf(t);r!==-1&&i.splice(r,1)}}dispatchEvent(e){const t=this._listeners;if(t===void 0)return;const n=t[e.type];if(n!==void 0){e.target=this;const i=n.slice(0);for(let r=0,o=i.length;r>8&255]+en[s>>16&255]+en[s>>24&255]+"-"+en[e&255]+en[e>>8&255]+"-"+en[e>>16&15|64]+en[e>>24&255]+"-"+en[t&63|128]+en[t>>8&255]+"-"+en[t>>16&255]+en[t>>24&255]+en[n&255]+en[n>>8&255]+en[n>>16&255]+en[n>>24&255]).toLowerCase()}function qe(s,e,t){return Math.max(e,Math.min(t,s))}function Hc(s,e){return(s%e+e)%e}function Fg(s,e,t,n,i){return n+(s-e)*(i-n)/(t-e)}function zg(s,e,t){return s!==e?(t-s)/(e-s):0}function Jr(s,e,t){return(1-t)*s+t*e}function Hg(s,e,t,n){return Jr(s,e,1-Math.exp(-t*n))}function Vg(s,e=1){return e-Math.abs(Hc(s,e*2)-e)}function Gg(s,e,t){return s<=e?0:s>=t?1:(s=(s-e)/(t-e),s*s*(3-2*s))}function Wg(s,e,t){return s<=e?0:s>=t?1:(s=(s-e)/(t-e),s*s*s*(s*(s*6-15)+10))}function Xg(s,e){return s+Math.floor(Math.random()*(e-s+1))}function jg(s,e){return s+Math.random()*(e-s)}function qg(s){return s*(.5-Math.random())}function Zg(s){s!==void 0&&(Ud=s);let e=Ud+=1831565813;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}function Yg(s){return s*$r}function Kg(s){return s*Gs}function $g(s){return(s&s-1)===0&&s!==0}function Jg(s){return Math.pow(2,Math.ceil(Math.log(s)/Math.LN2))}function Qg(s){return Math.pow(2,Math.floor(Math.log(s)/Math.LN2))}function ex(s,e,t,n,i){const r=Math.cos,o=Math.sin,a=r(t/2),l=o(t/2),c=r((e+n)/2),h=o((e+n)/2),u=r((e-n)/2),d=o((e-n)/2),f=r((n-e)/2),p=o((n-e)/2);switch(i){case"XYX":s.set(a*h,l*u,l*d,a*c);break;case"YZY":s.set(l*d,a*h,l*u,a*c);break;case"ZXZ":s.set(l*u,l*d,a*h,a*c);break;case"XZX":s.set(a*h,l*p,l*f,a*c);break;case"YXY":s.set(l*f,a*h,l*p,a*c);break;case"ZYZ":s.set(l*p,l*f,a*h,a*c);break;default:He("MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+i)}}function jn(s,e){switch(e.constructor){case Float32Array:return s;case Uint32Array:return s/4294967295;case Uint16Array:return s/65535;case Uint8Array:return s/255;case Int32Array:return Math.max(s/2147483647,-1);case Int16Array:return Math.max(s/32767,-1);case Int8Array:return Math.max(s/127,-1);default:throw new Error("Invalid component type.")}}function ct(s,e){switch(e.constructor){case Float32Array:return s;case Uint32Array:return Math.round(s*4294967295);case Uint16Array:return Math.round(s*65535);case Uint8Array:return Math.round(s*255);case Int32Array:return Math.round(s*2147483647);case Int16Array:return Math.round(s*32767);case Int8Array:return Math.round(s*127);default:throw new Error("Invalid component type.")}}const Qr={DEG2RAD:$r,RAD2DEG:Gs,generateUUID:Ln,clamp:qe,euclideanModulo:Hc,mapLinear:Fg,inverseLerp:zg,lerp:Jr,damp:Hg,pingpong:Vg,smoothstep:Gg,smootherstep:Wg,randInt:Xg,randFloat:jg,randFloatSpread:qg,seededRandom:Zg,degToRad:Yg,radToDeg:Kg,isPowerOfTwo:$g,ceilPowerOfTwo:Jg,floorPowerOfTwo:Qg,setQuaternionFromProperEuler:ex,normalize:ct,denormalize:jn};class ce{constructor(e=0,t=0){ce.prototype.isVector2=!0,this.x=e,this.y=t}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,t){return this.x=e,this.y=t,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const t=this.x,n=this.y,i=e.elements;return this.x=i[0]*t+i[3]*n+i[6],this.y=i[1]*t+i[4]*n+i[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,t){return this.x=qe(this.x,e.x,t.x),this.y=qe(this.y,e.y,t.y),this}clampScalar(e,t){return this.x=qe(this.x,e,t),this.y=qe(this.y,e,t),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(qe(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;const n=this.dot(e)/t;return Math.acos(qe(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y;return t*t+n*n}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this}rotateAround(e,t){const n=Math.cos(t),i=Math.sin(t),r=this.x-e.x,o=this.y-e.y;return this.x=r*n-o*i+e.x,this.y=r*i+o*n+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class Dn{constructor(e=0,t=0,n=0,i=1){this.isQuaternion=!0,this._x=e,this._y=t,this._z=n,this._w=i}static slerpFlat(e,t,n,i,r,o,a){let l=n[i+0],c=n[i+1],h=n[i+2],u=n[i+3],d=r[o+0],f=r[o+1],p=r[o+2],g=r[o+3];if(a<=0){e[t+0]=l,e[t+1]=c,e[t+2]=h,e[t+3]=u;return}if(a>=1){e[t+0]=d,e[t+1]=f,e[t+2]=p,e[t+3]=g;return}if(u!==g||l!==d||c!==f||h!==p){let x=l*d+c*f+h*p+u*g;x<0&&(d=-d,f=-f,p=-p,g=-g,x=-x);let m=1-a;if(x<.9995){const b=Math.acos(x),v=Math.sin(b);m=Math.sin(m*b)/v,a=Math.sin(a*b)/v,l=l*m+d*a,c=c*m+f*a,h=h*m+p*a,u=u*m+g*a}else{l=l*m+d*a,c=c*m+f*a,h=h*m+p*a,u=u*m+g*a;const b=1/Math.sqrt(l*l+c*c+h*h+u*u);l*=b,c*=b,h*=b,u*=b}}e[t]=l,e[t+1]=c,e[t+2]=h,e[t+3]=u}static multiplyQuaternionsFlat(e,t,n,i,r,o){const a=n[i],l=n[i+1],c=n[i+2],h=n[i+3],u=r[o],d=r[o+1],f=r[o+2],p=r[o+3];return e[t]=a*p+h*u+l*f-c*d,e[t+1]=l*p+h*d+c*u-a*f,e[t+2]=c*p+h*f+a*d-l*u,e[t+3]=h*p-a*u-l*d-c*f,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,t,n,i){return this._x=e,this._y=t,this._z=n,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,t=!0){const n=e._x,i=e._y,r=e._z,o=e._order,a=Math.cos,l=Math.sin,c=a(n/2),h=a(i/2),u=a(r/2),d=l(n/2),f=l(i/2),p=l(r/2);switch(o){case"XYZ":this._x=d*h*u+c*f*p,this._y=c*f*u-d*h*p,this._z=c*h*p+d*f*u,this._w=c*h*u-d*f*p;break;case"YXZ":this._x=d*h*u+c*f*p,this._y=c*f*u-d*h*p,this._z=c*h*p-d*f*u,this._w=c*h*u+d*f*p;break;case"ZXY":this._x=d*h*u-c*f*p,this._y=c*f*u+d*h*p,this._z=c*h*p+d*f*u,this._w=c*h*u-d*f*p;break;case"ZYX":this._x=d*h*u-c*f*p,this._y=c*f*u+d*h*p,this._z=c*h*p-d*f*u,this._w=c*h*u+d*f*p;break;case"YZX":this._x=d*h*u+c*f*p,this._y=c*f*u+d*h*p,this._z=c*h*p-d*f*u,this._w=c*h*u-d*f*p;break;case"XZY":this._x=d*h*u-c*f*p,this._y=c*f*u-d*h*p,this._z=c*h*p+d*f*u,this._w=c*h*u+d*f*p;break;default:He("Quaternion: .setFromEuler() encountered an unknown order: "+o)}return t===!0&&this._onChangeCallback(),this}setFromAxisAngle(e,t){const n=t/2,i=Math.sin(n);return this._x=e.x*i,this._y=e.y*i,this._z=e.z*i,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(e){const t=e.elements,n=t[0],i=t[4],r=t[8],o=t[1],a=t[5],l=t[9],c=t[2],h=t[6],u=t[10],d=n+a+u;if(d>0){const f=.5/Math.sqrt(d+1);this._w=.25/f,this._x=(h-l)*f,this._y=(r-c)*f,this._z=(o-i)*f}else if(n>a&&n>u){const f=2*Math.sqrt(1+n-a-u);this._w=(h-l)/f,this._x=.25*f,this._y=(i+o)/f,this._z=(r+c)/f}else if(a>u){const f=2*Math.sqrt(1+a-n-u);this._w=(r-c)/f,this._x=(i+o)/f,this._y=.25*f,this._z=(l+h)/f}else{const f=2*Math.sqrt(1+u-n-a);this._w=(o-i)/f,this._x=(r+c)/f,this._y=(l+h)/f,this._z=.25*f}return this._onChangeCallback(),this}setFromUnitVectors(e,t){let n=e.dot(t)+1;return n<1e-8?(n=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=n):(this._x=0,this._y=-e.z,this._z=e.y,this._w=n)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=n),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(qe(this.dot(e),-1,1)))}rotateTowards(e,t){const n=this.angleTo(e);if(n===0)return this;const i=Math.min(1,t/n);return this.slerp(e,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,t){const n=e._x,i=e._y,r=e._z,o=e._w,a=t._x,l=t._y,c=t._z,h=t._w;return this._x=n*h+o*a+i*c-r*l,this._y=i*h+o*l+r*a-n*c,this._z=r*h+o*c+n*l-i*a,this._w=o*h-n*a-i*l-r*c,this._onChangeCallback(),this}slerp(e,t){if(t<=0)return this;if(t>=1)return this.copy(e);let n=e._x,i=e._y,r=e._z,o=e._w,a=this.dot(e);a<0&&(n=-n,i=-i,r=-r,o=-o,a=-a);let l=1-t;if(a<.9995){const c=Math.acos(a),h=Math.sin(c);l=Math.sin(l*c)/h,t=Math.sin(t*c)/h,this._x=this._x*l+n*t,this._y=this._y*l+i*t,this._z=this._z*l+r*t,this._w=this._w*l+o*t,this._onChangeCallback()}else this._x=this._x*l+n*t,this._y=this._y*l+i*t,this._z=this._z*l+r*t,this._w=this._w*l+o*t,this.normalize();return this}slerpQuaternions(e,t,n){return this.copy(e).slerp(t,n)}random(){const e=2*Math.PI*Math.random(),t=2*Math.PI*Math.random(),n=Math.random(),i=Math.sqrt(1-n),r=Math.sqrt(n);return this.set(i*Math.sin(e),i*Math.cos(e),r*Math.sin(t),r*Math.cos(t))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,t=0){return this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e}fromBufferAttribute(e,t){return this._x=e.getX(t),this._y=e.getY(t),this._z=e.getZ(t),this._w=e.getW(t),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class P{constructor(e=0,t=0,n=0){P.prototype.isVector3=!0,this.x=e,this.y=t,this.z=n}set(e,t,n){return n===void 0&&(n=this.z),this.x=e,this.y=t,this.z=n,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}applyEuler(e){return this.applyQuaternion(Od.setFromEuler(e))}applyAxisAngle(e,t){return this.applyQuaternion(Od.setFromAxisAngle(e,t))}applyMatrix3(e){const t=this.x,n=this.y,i=this.z,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6]*i,this.y=r[1]*t+r[4]*n+r[7]*i,this.z=r[2]*t+r[5]*n+r[8]*i,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const t=this.x,n=this.y,i=this.z,r=e.elements,o=1/(r[3]*t+r[7]*n+r[11]*i+r[15]);return this.x=(r[0]*t+r[4]*n+r[8]*i+r[12])*o,this.y=(r[1]*t+r[5]*n+r[9]*i+r[13])*o,this.z=(r[2]*t+r[6]*n+r[10]*i+r[14])*o,this}applyQuaternion(e){const t=this.x,n=this.y,i=this.z,r=e.x,o=e.y,a=e.z,l=e.w,c=2*(o*i-a*n),h=2*(a*t-r*i),u=2*(r*n-o*t);return this.x=t+l*c+o*u-a*h,this.y=n+l*h+a*c-r*u,this.z=i+l*u+r*h-o*c,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const t=this.x,n=this.y,i=this.z,r=e.elements;return this.x=r[0]*t+r[4]*n+r[8]*i,this.y=r[1]*t+r[5]*n+r[9]*i,this.z=r[2]*t+r[6]*n+r[10]*i,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,t){return this.x=qe(this.x,e.x,t.x),this.y=qe(this.y,e.y,t.y),this.z=qe(this.z,e.z,t.z),this}clampScalar(e,t){return this.x=qe(this.x,e,t),this.y=qe(this.y,e,t),this.z=qe(this.z,e,t),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(qe(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,t){const n=e.x,i=e.y,r=e.z,o=t.x,a=t.y,l=t.z;return this.x=i*l-r*a,this.y=r*o-n*l,this.z=n*a-i*o,this}projectOnVector(e){const t=e.lengthSq();if(t===0)return this.set(0,0,0);const n=e.dot(this)/t;return this.copy(e).multiplyScalar(n)}projectOnPlane(e){return Vc.copy(this).projectOnVector(e),this.sub(Vc)}reflect(e){return this.sub(Vc.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;const n=this.dot(e)/t;return Math.acos(qe(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y,i=this.z-e.z;return t*t+n*n+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,t,n){const i=Math.sin(t)*e;return this.x=i*Math.sin(n),this.y=Math.cos(t)*e,this.z=i*Math.cos(n),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,t,n){return this.x=e*Math.sin(t),this.y=n,this.z=e*Math.cos(t),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(e){const t=this.setFromMatrixColumn(e,0).length(),n=this.setFromMatrixColumn(e,1).length(),i=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=n,this.z=i,this}setFromMatrixColumn(e,t){return this.fromArray(e.elements,t*4)}setFromMatrix3Column(e,t){return this.fromArray(e.elements,t*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}setFromColor(e){return this.x=e.r,this.y=e.g,this.z=e.b,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=Math.random()*Math.PI*2,t=Math.random()*2-1,n=Math.sqrt(1-t*t);return this.x=n*Math.cos(e),this.y=t,this.z=n*Math.sin(e),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Vc=new P,Od=new Dn;class Ke{constructor(e,t,n,i,r,o,a,l,c){Ke.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],e!==void 0&&this.set(e,t,n,i,r,o,a,l,c)}set(e,t,n,i,r,o,a,l,c){const h=this.elements;return h[0]=e,h[1]=i,h[2]=a,h[3]=t,h[4]=r,h[5]=l,h[6]=n,h[7]=o,h[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}extractBasis(e,t,n){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,i=t.elements,r=this.elements,o=n[0],a=n[3],l=n[6],c=n[1],h=n[4],u=n[7],d=n[2],f=n[5],p=n[8],g=i[0],x=i[3],m=i[6],b=i[1],v=i[4],y=i[7],M=i[2],E=i[5],A=i[8];return r[0]=o*g+a*b+l*M,r[3]=o*x+a*v+l*E,r[6]=o*m+a*y+l*A,r[1]=c*g+h*b+u*M,r[4]=c*x+h*v+u*E,r[7]=c*m+h*y+u*A,r[2]=d*g+f*b+p*M,r[5]=d*x+f*v+p*E,r[8]=d*m+f*y+p*A,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}determinant(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],o=e[4],a=e[5],l=e[6],c=e[7],h=e[8];return t*o*h-t*a*c-n*r*h+n*a*l+i*r*c-i*o*l}invert(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],o=e[4],a=e[5],l=e[6],c=e[7],h=e[8],u=h*o-a*c,d=a*l-h*r,f=c*r-o*l,p=t*u+n*d+i*f;if(p===0)return this.set(0,0,0,0,0,0,0,0,0);const g=1/p;return e[0]=u*g,e[1]=(i*c-h*n)*g,e[2]=(a*n-i*o)*g,e[3]=d*g,e[4]=(h*t-i*l)*g,e[5]=(i*r-a*t)*g,e[6]=f*g,e[7]=(n*l-c*t)*g,e[8]=(o*t-n*r)*g,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this}setUvTransform(e,t,n,i,r,o,a){const l=Math.cos(r),c=Math.sin(r);return this.set(n*l,n*c,-n*(l*o+c*a)+o+e,-i*c,i*l,-i*(-c*o+l*a)+a+t,0,0,1),this}scale(e,t){return this.premultiply(Gc.makeScale(e,t)),this}rotate(e){return this.premultiply(Gc.makeRotation(-e)),this}translate(e,t){return this.premultiply(Gc.makeTranslation(e,t)),this}makeTranslation(e,t){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,n,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}equals(e){const t=this.elements,n=e.elements;for(let i=0;i<9;i++)if(t[i]!==n[i])return!1;return!0}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){const n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e}clone(){return new this.constructor().fromArray(this.elements)}}const Gc=new Ke,Fd=new Ke().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),zd=new Ke().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function tx(){const s={enabled:!0,workingColorSpace:Rt,spaces:{},convert:function(i,r,o){return this.enabled===!1||r===o||!r||!o||(this.spaces[r].transfer===lt&&(i.r=xi(i.r),i.g=xi(i.g),i.b=xi(i.b)),this.spaces[r].primaries!==this.spaces[o].primaries&&(i.applyMatrix3(this.spaces[r].toXYZ),i.applyMatrix3(this.spaces[o].fromXYZ)),this.spaces[o].transfer===lt&&(i.r=Ws(i.r),i.g=Ws(i.g),i.b=Ws(i.b))),i},workingToColorSpace:function(i,r){return this.convert(i,this.workingColorSpace,r)},colorSpaceToWorking:function(i,r){return this.convert(i,r,this.workingColorSpace)},getPrimaries:function(i){return this.spaces[i].primaries},getTransfer:function(i){return i===ki?Jo:this.spaces[i].transfer},getToneMappingMode:function(i){return this.spaces[i].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(i,r=this.workingColorSpace){return i.fromArray(this.spaces[r].luminanceCoefficients)},define:function(i){Object.assign(this.spaces,i)},_getMatrix:function(i,r,o){return i.copy(this.spaces[r].toXYZ).multiply(this.spaces[o].fromXYZ)},_getDrawingBufferColorSpace:function(i){return this.spaces[i].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(i=this.workingColorSpace){return this.spaces[i].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(i,r){return Kr("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),s.workingToColorSpace(i,r)},toWorkingColorSpace:function(i,r){return Kr("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),s.colorSpaceToWorking(i,r)}},e=[.64,.33,.3,.6,.15,.06],t=[.2126,.7152,.0722],n=[.3127,.329];return s.define({[Rt]:{primaries:e,whitePoint:n,transfer:Jo,toXYZ:Fd,fromXYZ:zd,luminanceCoefficients:t,workingColorSpaceConfig:{unpackColorSpace:gt},outputColorSpaceConfig:{drawingBufferColorSpace:gt}},[gt]:{primaries:e,whitePoint:n,transfer:lt,toXYZ:Fd,fromXYZ:zd,luminanceCoefficients:t,outputColorSpaceConfig:{drawingBufferColorSpace:gt}}}),s}const it=tx();function xi(s){return s<.04045?s*.0773993808:Math.pow(s*.9478672986+.0521327014,2.4)}function Ws(s){return s<.0031308?s*12.92:1.055*Math.pow(s,.41666)-.055}let Xs;class nx{static getDataURL(e,t="image/png"){if(/^data:/i.test(e.src)||typeof HTMLCanvasElement>"u")return e.src;let n;if(e instanceof HTMLCanvasElement)n=e;else{Xs===void 0&&(Xs=Yr("canvas")),Xs.width=e.width,Xs.height=e.height;const i=Xs.getContext("2d");e instanceof ImageData?i.putImageData(e,0,0):i.drawImage(e,0,0,e.width,e.height),n=Xs}return n.toDataURL(t)}static sRGBToLinear(e){if(typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&e instanceof ImageBitmap){const t=Yr("canvas");t.width=e.width,t.height=e.height;const n=t.getContext("2d");n.drawImage(e,0,0,e.width,e.height);const i=n.getImageData(0,0,e.width,e.height),r=i.data;for(let o=0;o1),this.pmremVersion=0}get width(){return this.source.getSize(jc).x}get height(){return this.source.getSize(jc).y}get depth(){return this.source.getSize(jc).z}get image(){return this.source.data}set image(e=null){this.source.data=e}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return new this.constructor().copy(this)}copy(e){return this.name=e.name,this.source=e.source,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.channel=e.channel,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.colorSpace=e.colorSpace,this.renderTarget=e.renderTarget,this.isRenderTargetTexture=e.isRenderTargetTexture,this.isArrayTexture=e.isArrayTexture,this.userData=JSON.parse(JSON.stringify(e.userData)),this.needsUpdate=!0,this}setValues(e){for(const t in e){const n=e[t];if(n===void 0){He(`Texture.setValues(): parameter '${t}' has value of undefined.`);continue}const i=this[t];if(i===void 0){He(`Texture.setValues(): property '${t}' does not exist.`);continue}i&&n&&i.isVector2&&n.isVector2||i&&n&&i.isVector3&&n.isVector3||i&&n&&i.isMatrix3&&n.isMatrix3?i.copy(n):this[t]=n}}toJSON(e){const t=e===void 0||typeof e=="string";if(!t&&e.textures[this.uuid]!==void 0)return e.textures[this.uuid];const n={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(e).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(n.userData=this.userData),t||(e.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(e){if(this.mapping!==yd)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case ni:e.x=e.x-Math.floor(e.x);break;case ii:e.x=e.x<0?0:1;break;case jo:Math.abs(Math.floor(e.x)%2)===1?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x);break}if(e.y<0||e.y>1)switch(this.wrapT){case ni:e.y=e.y-Math.floor(e.y);break;case ii:e.y=e.y<0?0:1;break;case jo:Math.abs(Math.floor(e.y)%2)===1?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y);break}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){e===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(e){e===!0&&this.pmremVersion++}}Ht.DEFAULT_IMAGE=null,Ht.DEFAULT_MAPPING=yd,Ht.DEFAULT_ANISOTROPY=1;class tt{constructor(e=0,t=0,n=0,i=1){tt.prototype.isVector4=!0,this.x=e,this.y=t,this.z=n,this.w=i}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,t,n,i){return this.x=e,this.y=t,this.z=n,this.w=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w!==void 0?e.w:1,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const t=this.x,n=this.y,i=this.z,r=this.w,o=e.elements;return this.x=o[0]*t+o[4]*n+o[8]*i+o[12]*r,this.y=o[1]*t+o[5]*n+o[9]*i+o[13]*r,this.z=o[2]*t+o[6]*n+o[10]*i+o[14]*r,this.w=o[3]*t+o[7]*n+o[11]*i+o[15]*r,this}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this.w/=e.w,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this}setAxisAngleFromRotationMatrix(e){let t,n,i,r;const l=e.elements,c=l[0],h=l[4],u=l[8],d=l[1],f=l[5],p=l[9],g=l[2],x=l[6],m=l[10];if(Math.abs(h-d)<.01&&Math.abs(u-g)<.01&&Math.abs(p-x)<.01){if(Math.abs(h+d)<.1&&Math.abs(u+g)<.1&&Math.abs(p+x)<.1&&Math.abs(c+f+m-3)<.1)return this.set(1,0,0,0),this;t=Math.PI;const v=(c+1)/2,y=(f+1)/2,M=(m+1)/2,E=(h+d)/4,A=(u+g)/4,R=(p+x)/4;return v>y&&v>M?v<.01?(n=0,i=.707106781,r=.707106781):(n=Math.sqrt(v),i=E/n,r=A/n):y>M?y<.01?(n=.707106781,i=0,r=.707106781):(i=Math.sqrt(y),n=E/i,r=R/i):M<.01?(n=.707106781,i=.707106781,r=0):(r=Math.sqrt(M),n=A/r,i=R/r),this.set(n,i,r,t),this}let b=Math.sqrt((x-p)*(x-p)+(u-g)*(u-g)+(d-h)*(d-h));return Math.abs(b)<.001&&(b=1),this.x=(x-p)/b,this.y=(u-g)/b,this.z=(d-h)/b,this.w=Math.acos((c+f+m-1)/2),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this.w=t[15],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,t){return this.x=qe(this.x,e.x,t.x),this.y=qe(this.y,e.y,t.y),this.z=qe(this.z,e.z,t.z),this.w=qe(this.w,e.w,t.w),this}clampScalar(e,t){return this.x=qe(this.x,e,t),this.y=qe(this.y,e,t),this.z=qe(this.z,e,t),this.w=qe(this.w,e,t),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(qe(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this.w=e.w+(t.w-e.w)*n,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this.w=e.getW(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}class rx extends ns{constructor(e=1,t=1,n={}){super(),n=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:$t,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1,depth:1,multiview:!1},n),this.isRenderTarget=!0,this.width=e,this.height=t,this.depth=n.depth,this.scissor=new tt(0,0,e,t),this.scissorTest=!1,this.viewport=new tt(0,0,e,t);const i={width:e,height:t,depth:n.depth},r=new Ht(i);this.textures=[];const o=n.count;for(let a=0;a1);this.dispose()}this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t)}clone(){return new this.constructor().copy(this)}copy(e){this.width=e.width,this.height=e.height,this.depth=e.depth,this.scissor.copy(e.scissor),this.scissorTest=e.scissorTest,this.viewport.copy(e.viewport),this.textures.length=0;for(let t=0,n=e.textures.length;t=this.min.x&&e.x<=this.max.x&&e.y>=this.min.y&&e.y<=this.max.y&&e.z>=this.min.z&&e.z<=this.max.z}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,t){return t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return e.max.x>=this.min.x&&e.min.x<=this.max.x&&e.max.y>=this.min.y&&e.min.y<=this.max.y&&e.max.z>=this.min.z&&e.min.z<=this.max.z}intersectsSphere(e){return this.clampPoint(e.center,qn),qn.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let t,n;return e.normal.x>0?(t=e.normal.x*this.min.x,n=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,n=e.normal.x*this.min.x),e.normal.y>0?(t+=e.normal.y*this.min.y,n+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,n+=e.normal.y*this.min.y),e.normal.z>0?(t+=e.normal.z*this.min.z,n+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,n+=e.normal.z*this.min.z),t<=-e.constant&&n>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(eo),na.subVectors(this.max,eo),js.subVectors(e.a,eo),qs.subVectors(e.b,eo),Zs.subVectors(e.c,eo),Ui.subVectors(qs,js),Oi.subVectors(Zs,qs),is.subVectors(js,Zs);let t=[0,-Ui.z,Ui.y,0,-Oi.z,Oi.y,0,-is.z,is.y,Ui.z,0,-Ui.x,Oi.z,0,-Oi.x,is.z,0,-is.x,-Ui.y,Ui.x,0,-Oi.y,Oi.x,0,-is.y,is.x,0];return!qc(t,js,qs,Zs,na)||(t=[1,0,0,0,1,0,0,0,1],!qc(t,js,qs,Zs,na))?!1:(ia.crossVectors(Ui,Oi),t=[ia.x,ia.y,ia.z],qc(t,js,qs,Zs,na))}clampPoint(e,t){return t.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,qn).distanceTo(e)}getBoundingSphere(e){return this.isEmpty()?e.makeEmpty():(this.getCenter(e.center),e.radius=this.getSize(qn).length()*.5),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()?this:(vi[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),vi[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),vi[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),vi[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),vi[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),vi[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),vi[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),vi[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(vi),this)}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(e){return this.min.fromArray(e.min),this.max.fromArray(e.max),this}}const vi=[new P,new P,new P,new P,new P,new P,new P,new P],qn=new P,ta=new xt,js=new P,qs=new P,Zs=new P,Ui=new P,Oi=new P,is=new P,eo=new P,na=new P,ia=new P,ss=new P;function qc(s,e,t,n,i){for(let r=0,o=s.length-3;r<=o;r+=3){ss.fromArray(s,r);const a=i.x*Math.abs(ss.x)+i.y*Math.abs(ss.y)+i.z*Math.abs(ss.z),l=e.dot(ss),c=t.dot(ss),h=n.dot(ss);if(Math.max(-Math.max(l,c,h),Math.min(l,c,h))>a)return!1}return!0}const ax=new xt,to=new P,Zc=new P;class ri{constructor(e=new P,t=-1){this.isSphere=!0,this.center=e,this.radius=t}set(e,t){return this.center.copy(e),this.radius=t,this}setFromPoints(e,t){const n=this.center;t!==void 0?n.copy(t):ax.setFromPoints(e).getCenter(n);let i=0;for(let r=0,o=e.length;rthis.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){if(this.isEmpty())return this.center.copy(e),this.radius=0,this;to.subVectors(e,this.center);const t=to.lengthSq();if(t>this.radius*this.radius){const n=Math.sqrt(t),i=(n-this.radius)*.5;this.center.addScaledVector(to,i/n),this.radius+=i}return this}union(e){return e.isEmpty()?this:this.isEmpty()?(this.copy(e),this):(this.center.equals(e.center)===!0?this.radius=Math.max(this.radius,e.radius):(Zc.subVectors(e.center,this.center).setLength(e.radius),this.expandByPoint(to.copy(e.center).add(Zc)),this.expandByPoint(to.copy(e.center).sub(Zc))),this)}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return new this.constructor().copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(e){return this.radius=e.radius,this.center.fromArray(e.center),this}}const bi=new P,Yc=new P,sa=new P,Fi=new P,Kc=new P,ra=new P,$c=new P;class zi{constructor(e=new P,t=new P(0,0,-1)){this.origin=e,this.direction=t}set(e,t){return this.origin.copy(e),this.direction.copy(t),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,t){return t.copy(this.origin).addScaledVector(this.direction,e)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,bi)),this}closestPointToPoint(e,t){t.subVectors(e,this.origin);const n=t.dot(this.direction);return n<0?t.copy(this.origin):t.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const t=bi.subVectors(e,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(e):(bi.copy(this.origin).addScaledVector(this.direction,t),bi.distanceToSquared(e))}distanceSqToSegment(e,t,n,i){Yc.copy(e).add(t).multiplyScalar(.5),sa.copy(t).sub(e).normalize(),Fi.copy(this.origin).sub(Yc);const r=e.distanceTo(t)*.5,o=-this.direction.dot(sa),a=Fi.dot(this.direction),l=-Fi.dot(sa),c=Fi.lengthSq(),h=Math.abs(1-o*o);let u,d,f,p;if(h>0)if(u=o*l-a,d=o*a-l,p=r*h,u>=0)if(d>=-p)if(d<=p){const g=1/h;u*=g,d*=g,f=u*(u+o*d+2*a)+d*(o*u+d+2*l)+c}else d=r,u=Math.max(0,-(o*d+a)),f=-u*u+d*(d+2*l)+c;else d=-r,u=Math.max(0,-(o*d+a)),f=-u*u+d*(d+2*l)+c;else d<=-p?(u=Math.max(0,-(-o*r+a)),d=u>0?-r:Math.min(Math.max(-r,-l),r),f=-u*u+d*(d+2*l)+c):d<=p?(u=0,d=Math.min(Math.max(-r,-l),r),f=d*(d+2*l)+c):(u=Math.max(0,-(o*r+a)),d=u>0?r:Math.min(Math.max(-r,-l),r),f=-u*u+d*(d+2*l)+c);else d=o>0?-r:r,u=Math.max(0,-(o*d+a)),f=-u*u+d*(d+2*l)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,u),i&&i.copy(Yc).addScaledVector(sa,d),f}intersectSphere(e,t){bi.subVectors(e.center,this.origin);const n=bi.dot(this.direction),i=bi.dot(bi)-n*n,r=e.radius*e.radius;if(i>r)return null;const o=Math.sqrt(r-i),a=n-o,l=n+o;return l<0?null:a<0?this.at(l,t):this.at(a,t)}intersectsSphere(e){return e.radius<0?!1:this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const t=e.normal.dot(this.direction);if(t===0)return e.distanceToPoint(this.origin)===0?0:null;const n=-(this.origin.dot(e.normal)+e.constant)/t;return n>=0?n:null}intersectPlane(e,t){const n=this.distanceToPlane(e);return n===null?null:this.at(n,t)}intersectsPlane(e){const t=e.distanceToPoint(this.origin);return t===0||e.normal.dot(this.direction)*t<0}intersectBox(e,t){let n,i,r,o,a,l;const c=1/this.direction.x,h=1/this.direction.y,u=1/this.direction.z,d=this.origin;return c>=0?(n=(e.min.x-d.x)*c,i=(e.max.x-d.x)*c):(n=(e.max.x-d.x)*c,i=(e.min.x-d.x)*c),h>=0?(r=(e.min.y-d.y)*h,o=(e.max.y-d.y)*h):(r=(e.max.y-d.y)*h,o=(e.min.y-d.y)*h),n>o||r>i||((r>n||isNaN(n))&&(n=r),(o=0?(a=(e.min.z-d.z)*u,l=(e.max.z-d.z)*u):(a=(e.max.z-d.z)*u,l=(e.min.z-d.z)*u),n>l||a>i)||((a>n||n!==n)&&(n=a),(l=0?n:i,t)}intersectsBox(e){return this.intersectBox(e,bi)!==null}intersectTriangle(e,t,n,i,r){Kc.subVectors(t,e),ra.subVectors(n,e),$c.crossVectors(Kc,ra);let o=this.direction.dot($c),a;if(o>0){if(i)return null;a=1}else if(o<0)a=-1,o=-o;else return null;Fi.subVectors(this.origin,e);const l=a*this.direction.dot(ra.crossVectors(Fi,ra));if(l<0)return null;const c=a*this.direction.dot(Kc.cross(Fi));if(c<0||l+c>o)return null;const h=-a*Fi.dot($c);return h<0?null:this.at(h/o,r)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class ze{constructor(e,t,n,i,r,o,a,l,c,h,u,d,f,p,g,x){ze.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],e!==void 0&&this.set(e,t,n,i,r,o,a,l,c,h,u,d,f,p,g,x)}set(e,t,n,i,r,o,a,l,c,h,u,d,f,p,g,x){const m=this.elements;return m[0]=e,m[4]=t,m[8]=n,m[12]=i,m[1]=r,m[5]=o,m[9]=a,m[13]=l,m[2]=c,m[6]=h,m[10]=u,m[14]=d,m[3]=f,m[7]=p,m[11]=g,m[15]=x,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new ze().fromArray(this.elements)}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],this}copyPosition(e){const t=this.elements,n=e.elements;return t[12]=n[12],t[13]=n[13],t[14]=n[14],this}setFromMatrix3(e){const t=e.elements;return this.set(t[0],t[3],t[6],0,t[1],t[4],t[7],0,t[2],t[5],t[8],0,0,0,0,1),this}extractBasis(e,t,n){return e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(e,t,n){return this.set(e.x,t.x,n.x,0,e.y,t.y,n.y,0,e.z,t.z,n.z,0,0,0,0,1),this}extractRotation(e){const t=this.elements,n=e.elements,i=1/Ys.setFromMatrixColumn(e,0).length(),r=1/Ys.setFromMatrixColumn(e,1).length(),o=1/Ys.setFromMatrixColumn(e,2).length();return t[0]=n[0]*i,t[1]=n[1]*i,t[2]=n[2]*i,t[3]=0,t[4]=n[4]*r,t[5]=n[5]*r,t[6]=n[6]*r,t[7]=0,t[8]=n[8]*o,t[9]=n[9]*o,t[10]=n[10]*o,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromEuler(e){const t=this.elements,n=e.x,i=e.y,r=e.z,o=Math.cos(n),a=Math.sin(n),l=Math.cos(i),c=Math.sin(i),h=Math.cos(r),u=Math.sin(r);if(e.order==="XYZ"){const d=o*h,f=o*u,p=a*h,g=a*u;t[0]=l*h,t[4]=-l*u,t[8]=c,t[1]=f+p*c,t[5]=d-g*c,t[9]=-a*l,t[2]=g-d*c,t[6]=p+f*c,t[10]=o*l}else if(e.order==="YXZ"){const d=l*h,f=l*u,p=c*h,g=c*u;t[0]=d+g*a,t[4]=p*a-f,t[8]=o*c,t[1]=o*u,t[5]=o*h,t[9]=-a,t[2]=f*a-p,t[6]=g+d*a,t[10]=o*l}else if(e.order==="ZXY"){const d=l*h,f=l*u,p=c*h,g=c*u;t[0]=d-g*a,t[4]=-o*u,t[8]=p+f*a,t[1]=f+p*a,t[5]=o*h,t[9]=g-d*a,t[2]=-o*c,t[6]=a,t[10]=o*l}else if(e.order==="ZYX"){const d=o*h,f=o*u,p=a*h,g=a*u;t[0]=l*h,t[4]=p*c-f,t[8]=d*c+g,t[1]=l*u,t[5]=g*c+d,t[9]=f*c-p,t[2]=-c,t[6]=a*l,t[10]=o*l}else if(e.order==="YZX"){const d=o*l,f=o*c,p=a*l,g=a*c;t[0]=l*h,t[4]=g-d*u,t[8]=p*u+f,t[1]=u,t[5]=o*h,t[9]=-a*h,t[2]=-c*h,t[6]=f*u+p,t[10]=d-g*u}else if(e.order==="XZY"){const d=o*l,f=o*c,p=a*l,g=a*c;t[0]=l*h,t[4]=-u,t[8]=c*h,t[1]=d*u+g,t[5]=o*h,t[9]=f*u-p,t[2]=p*u-f,t[6]=a*h,t[10]=g*u+d}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromQuaternion(e){return this.compose(lx,e,cx)}lookAt(e,t,n){const i=this.elements;return Sn.subVectors(e,t),Sn.lengthSq()===0&&(Sn.z=1),Sn.normalize(),Hi.crossVectors(n,Sn),Hi.lengthSq()===0&&(Math.abs(n.z)===1?Sn.x+=1e-4:Sn.z+=1e-4,Sn.normalize(),Hi.crossVectors(n,Sn)),Hi.normalize(),oa.crossVectors(Sn,Hi),i[0]=Hi.x,i[4]=oa.x,i[8]=Sn.x,i[1]=Hi.y,i[5]=oa.y,i[9]=Sn.y,i[2]=Hi.z,i[6]=oa.z,i[10]=Sn.z,this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,i=t.elements,r=this.elements,o=n[0],a=n[4],l=n[8],c=n[12],h=n[1],u=n[5],d=n[9],f=n[13],p=n[2],g=n[6],x=n[10],m=n[14],b=n[3],v=n[7],y=n[11],M=n[15],E=i[0],A=i[4],R=i[8],_=i[12],S=i[1],D=i[5],C=i[9],B=i[13],w=i[2],F=i[6],W=i[10],j=i[14],$=i[3],Z=i[7],re=i[11],X=i[15];return r[0]=o*E+a*S+l*w+c*$,r[4]=o*A+a*D+l*F+c*Z,r[8]=o*R+a*C+l*W+c*re,r[12]=o*_+a*B+l*j+c*X,r[1]=h*E+u*S+d*w+f*$,r[5]=h*A+u*D+d*F+f*Z,r[9]=h*R+u*C+d*W+f*re,r[13]=h*_+u*B+d*j+f*X,r[2]=p*E+g*S+x*w+m*$,r[6]=p*A+g*D+x*F+m*Z,r[10]=p*R+g*C+x*W+m*re,r[14]=p*_+g*B+x*j+m*X,r[3]=b*E+v*S+y*w+M*$,r[7]=b*A+v*D+y*F+M*Z,r[11]=b*R+v*C+y*W+M*re,r[15]=b*_+v*B+y*j+M*X,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this}determinant(){const e=this.elements,t=e[0],n=e[4],i=e[8],r=e[12],o=e[1],a=e[5],l=e[9],c=e[13],h=e[2],u=e[6],d=e[10],f=e[14],p=e[3],g=e[7],x=e[11],m=e[15];return p*(+r*l*u-i*c*u-r*a*d+n*c*d+i*a*f-n*l*f)+g*(+t*l*f-t*c*d+r*o*d-i*o*f+i*c*h-r*l*h)+x*(+t*c*u-t*a*f-r*o*u+n*o*f+r*a*h-n*c*h)+m*(-i*a*h-t*l*u+t*a*d+i*o*u-n*o*d+n*l*h)}transpose(){const e=this.elements;let t;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this}setPosition(e,t,n){const i=this.elements;return e.isVector3?(i[12]=e.x,i[13]=e.y,i[14]=e.z):(i[12]=e,i[13]=t,i[14]=n),this}invert(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],o=e[4],a=e[5],l=e[6],c=e[7],h=e[8],u=e[9],d=e[10],f=e[11],p=e[12],g=e[13],x=e[14],m=e[15],b=u*x*c-g*d*c+g*l*f-a*x*f-u*l*m+a*d*m,v=p*d*c-h*x*c-p*l*f+o*x*f+h*l*m-o*d*m,y=h*g*c-p*u*c+p*a*f-o*g*f-h*a*m+o*u*m,M=p*u*l-h*g*l-p*a*d+o*g*d+h*a*x-o*u*x,E=t*b+n*v+i*y+r*M;if(E===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const A=1/E;return e[0]=b*A,e[1]=(g*d*r-u*x*r-g*i*f+n*x*f+u*i*m-n*d*m)*A,e[2]=(a*x*r-g*l*r+g*i*c-n*x*c-a*i*m+n*l*m)*A,e[3]=(u*l*r-a*d*r-u*i*c+n*d*c+a*i*f-n*l*f)*A,e[4]=v*A,e[5]=(h*x*r-p*d*r+p*i*f-t*x*f-h*i*m+t*d*m)*A,e[6]=(p*l*r-o*x*r-p*i*c+t*x*c+o*i*m-t*l*m)*A,e[7]=(o*d*r-h*l*r+h*i*c-t*d*c-o*i*f+t*l*f)*A,e[8]=y*A,e[9]=(p*u*r-h*g*r-p*n*f+t*g*f+h*n*m-t*u*m)*A,e[10]=(o*g*r-p*a*r+p*n*c-t*g*c-o*n*m+t*a*m)*A,e[11]=(h*a*r-o*u*r-h*n*c+t*u*c+o*n*f-t*a*f)*A,e[12]=M*A,e[13]=(h*g*i-p*u*i+p*n*d-t*g*d-h*n*x+t*u*x)*A,e[14]=(p*a*i-o*g*i-p*n*l+t*g*l+o*n*x-t*a*x)*A,e[15]=(o*u*i-h*a*i+h*n*l-t*u*l-o*n*d+t*a*d)*A,this}scale(e){const t=this.elements,n=e.x,i=e.y,r=e.z;return t[0]*=n,t[4]*=i,t[8]*=r,t[1]*=n,t[5]*=i,t[9]*=r,t[2]*=n,t[6]*=i,t[10]*=r,t[3]*=n,t[7]*=i,t[11]*=r,this}getMaxScaleOnAxis(){const e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],n=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],i=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,n,i))}makeTranslation(e,t,n){return e.isVector3?this.set(1,0,0,e.x,0,1,0,e.y,0,0,1,e.z,0,0,0,1):this.set(1,0,0,e,0,1,0,t,0,0,1,n,0,0,0,1),this}makeRotationX(e){const t=Math.cos(e),n=Math.sin(e);return this.set(1,0,0,0,0,t,-n,0,0,n,t,0,0,0,0,1),this}makeRotationY(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,0,n,0,0,1,0,0,-n,0,t,0,0,0,0,1),this}makeRotationZ(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,0,n,t,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,t){const n=Math.cos(t),i=Math.sin(t),r=1-n,o=e.x,a=e.y,l=e.z,c=r*o,h=r*a;return this.set(c*o+n,c*a-i*l,c*l+i*a,0,c*a+i*l,h*a+n,h*l-i*o,0,c*l-i*a,h*l+i*o,r*l*l+n,0,0,0,0,1),this}makeScale(e,t,n){return this.set(e,0,0,0,0,t,0,0,0,0,n,0,0,0,0,1),this}makeShear(e,t,n,i,r,o){return this.set(1,n,r,0,e,1,o,0,t,i,1,0,0,0,0,1),this}compose(e,t,n){const i=this.elements,r=t._x,o=t._y,a=t._z,l=t._w,c=r+r,h=o+o,u=a+a,d=r*c,f=r*h,p=r*u,g=o*h,x=o*u,m=a*u,b=l*c,v=l*h,y=l*u,M=n.x,E=n.y,A=n.z;return i[0]=(1-(g+m))*M,i[1]=(f+y)*M,i[2]=(p-v)*M,i[3]=0,i[4]=(f-y)*E,i[5]=(1-(d+m))*E,i[6]=(x+b)*E,i[7]=0,i[8]=(p+v)*A,i[9]=(x-b)*A,i[10]=(1-(d+g))*A,i[11]=0,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=1,this}decompose(e,t,n){const i=this.elements;let r=Ys.set(i[0],i[1],i[2]).length();const o=Ys.set(i[4],i[5],i[6]).length(),a=Ys.set(i[8],i[9],i[10]).length();this.determinant()<0&&(r=-r),e.x=i[12],e.y=i[13],e.z=i[14],Zn.copy(this);const c=1/r,h=1/o,u=1/a;return Zn.elements[0]*=c,Zn.elements[1]*=c,Zn.elements[2]*=c,Zn.elements[4]*=h,Zn.elements[5]*=h,Zn.elements[6]*=h,Zn.elements[8]*=u,Zn.elements[9]*=u,Zn.elements[10]*=u,t.setFromRotationMatrix(Zn),n.x=r,n.y=o,n.z=a,this}makePerspective(e,t,n,i,r,o,a=si,l=!1){const c=this.elements,h=2*r/(t-e),u=2*r/(n-i),d=(t+e)/(t-e),f=(n+i)/(n-i);let p,g;if(l)p=r/(o-r),g=o*r/(o-r);else if(a===si)p=-(o+r)/(o-r),g=-2*o*r/(o-r);else if(a===Qo)p=-o/(o-r),g=-o*r/(o-r);else throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+a);return c[0]=h,c[4]=0,c[8]=d,c[12]=0,c[1]=0,c[5]=u,c[9]=f,c[13]=0,c[2]=0,c[6]=0,c[10]=p,c[14]=g,c[3]=0,c[7]=0,c[11]=-1,c[15]=0,this}makeOrthographic(e,t,n,i,r,o,a=si,l=!1){const c=this.elements,h=2/(t-e),u=2/(n-i),d=-(t+e)/(t-e),f=-(n+i)/(n-i);let p,g;if(l)p=1/(o-r),g=o/(o-r);else if(a===si)p=-2/(o-r),g=-(o+r)/(o-r);else if(a===Qo)p=-1/(o-r),g=-r/(o-r);else throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+a);return c[0]=h,c[4]=0,c[8]=0,c[12]=d,c[1]=0,c[5]=u,c[9]=0,c[13]=f,c[2]=0,c[6]=0,c[10]=p,c[14]=g,c[3]=0,c[7]=0,c[11]=0,c[15]=1,this}equals(e){const t=this.elements,n=e.elements;for(let i=0;i<16;i++)if(t[i]!==n[i])return!1;return!0}fromArray(e,t=0){for(let n=0;n<16;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){const n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e[t+9]=n[9],e[t+10]=n[10],e[t+11]=n[11],e[t+12]=n[12],e[t+13]=n[13],e[t+14]=n[14],e[t+15]=n[15],e}}const Ys=new P,Zn=new ze,lx=new P(0,0,0),cx=new P(1,1,1),Hi=new P,oa=new P,Sn=new P,Vd=new ze,Gd=new Dn;class mn{constructor(e=0,t=0,n=0,i=mn.DEFAULT_ORDER){this.isEuler=!0,this._x=e,this._y=t,this._z=n,this._order=i}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,t,n,i=this._order){return this._x=e,this._y=t,this._z=n,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,t=this._order,n=!0){const i=e.elements,r=i[0],o=i[4],a=i[8],l=i[1],c=i[5],h=i[9],u=i[2],d=i[6],f=i[10];switch(t){case"XYZ":this._y=Math.asin(qe(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-h,f),this._z=Math.atan2(-o,r)):(this._x=Math.atan2(d,c),this._z=0);break;case"YXZ":this._x=Math.asin(-qe(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(a,f),this._z=Math.atan2(l,c)):(this._y=Math.atan2(-u,r),this._z=0);break;case"ZXY":this._x=Math.asin(qe(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(-u,f),this._z=Math.atan2(-o,c)):(this._y=0,this._z=Math.atan2(l,r));break;case"ZYX":this._y=Math.asin(-qe(u,-1,1)),Math.abs(u)<.9999999?(this._x=Math.atan2(d,f),this._z=Math.atan2(l,r)):(this._x=0,this._z=Math.atan2(-o,c));break;case"YZX":this._z=Math.asin(qe(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-h,c),this._y=Math.atan2(-u,r)):(this._x=0,this._y=Math.atan2(a,f));break;case"XZY":this._z=Math.asin(-qe(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(d,c),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-h,f),this._y=0);break;default:He("Euler: .setFromRotationMatrix() encountered an unknown order: "+t)}return this._order=t,n===!0&&this._onChangeCallback(),this}setFromQuaternion(e,t,n){return Vd.makeRotationFromQuaternion(e),this.setFromRotationMatrix(Vd,t,n)}setFromVector3(e,t=this._order){return this.set(e.x,e.y,e.z,t)}reorder(e){return Gd.setFromEuler(this),this.setFromQuaternion(Gd,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],e[3]!==void 0&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}mn.DEFAULT_ORDER="XYZ";class Jc{constructor(){this.mask=1}set(e){this.mask=(1<>>0}enable(e){this.mask|=1<1){for(let t=0;t1){for(let n=0;n0&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),i.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(i.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(i.type="BatchedMesh",i.perObjectFrustumCulled=this.perObjectFrustumCulled,i.sortObjects=this.sortObjects,i.drawRanges=this._drawRanges,i.reservedRanges=this._reservedRanges,i.geometryInfo=this._geometryInfo.map(a=>({...a,boundingBox:a.boundingBox?a.boundingBox.toJSON():void 0,boundingSphere:a.boundingSphere?a.boundingSphere.toJSON():void 0})),i.instanceInfo=this._instanceInfo.map(a=>({...a})),i.availableInstanceIds=this._availableInstanceIds.slice(),i.availableGeometryIds=this._availableGeometryIds.slice(),i.nextIndexStart=this._nextIndexStart,i.nextVertexStart=this._nextVertexStart,i.geometryCount=this._geometryCount,i.maxInstanceCount=this._maxInstanceCount,i.maxVertexCount=this._maxVertexCount,i.maxIndexCount=this._maxIndexCount,i.geometryInitialized=this._geometryInitialized,i.matricesTexture=this._matricesTexture.toJSON(e),i.indirectTexture=this._indirectTexture.toJSON(e),this._colorsTexture!==null&&(i.colorsTexture=this._colorsTexture.toJSON(e)),this.boundingSphere!==null&&(i.boundingSphere=this.boundingSphere.toJSON()),this.boundingBox!==null&&(i.boundingBox=this.boundingBox.toJSON()));function r(a,l){return a[l.uuid]===void 0&&(a[l.uuid]=l.toJSON(e)),l.uuid}if(this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(i.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=r(e.geometries,this.geometry);const a=this.geometry.parameters;if(a!==void 0&&a.shapes!==void 0){const l=a.shapes;if(Array.isArray(l))for(let c=0,h=l.length;c0){i.children=[];for(let a=0;a0){i.animations=[];for(let a=0;a0&&(n.geometries=a),l.length>0&&(n.materials=l),c.length>0&&(n.textures=c),h.length>0&&(n.images=h),u.length>0&&(n.shapes=u),d.length>0&&(n.skeletons=d),f.length>0&&(n.animations=f),p.length>0&&(n.nodes=p)}return n.object=i,n;function o(a){const l=[];for(const c in a){const h=a[c];delete h.metadata,l.push(h)}return l}}clone(e){return new this.constructor().copy(this,e)}copy(e,t=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldAutoUpdate=e.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.animations=e.animations.slice(),this.userData=JSON.parse(JSON.stringify(e.userData)),t===!0)for(let n=0;n0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)}static getBarycoord(e,t,n,i,r){Yn.subVectors(i,t),_i.subVectors(n,t),eh.subVectors(e,t);const o=Yn.dot(Yn),a=Yn.dot(_i),l=Yn.dot(eh),c=_i.dot(_i),h=_i.dot(eh),u=o*c-a*a;if(u===0)return r.set(0,0,0),null;const d=1/u,f=(c*l-a*h)*d,p=(o*h-a*l)*d;return r.set(1-f-p,p,f)}static containsPoint(e,t,n,i){return this.getBarycoord(e,t,n,i,Mi)===null?!1:Mi.x>=0&&Mi.y>=0&&Mi.x+Mi.y<=1}static getInterpolation(e,t,n,i,r,o,a,l){return this.getBarycoord(e,t,n,i,Mi)===null?(l.x=0,l.y=0,"z"in l&&(l.z=0),"w"in l&&(l.w=0),null):(l.setScalar(0),l.addScaledVector(r,Mi.x),l.addScaledVector(o,Mi.y),l.addScaledVector(a,Mi.z),l)}static getInterpolatedAttribute(e,t,n,i,r,o){return sh.setScalar(0),rh.setScalar(0),oh.setScalar(0),sh.fromBufferAttribute(e,t),rh.fromBufferAttribute(e,n),oh.fromBufferAttribute(e,i),o.setScalar(0),o.addScaledVector(sh,r.x),o.addScaledVector(rh,r.y),o.addScaledVector(oh,r.z),o}static isFrontFacing(e,t,n,i){return Yn.subVectors(n,t),_i.subVectors(e,t),Yn.cross(_i).dot(i)<0}set(e,t,n){return this.a.copy(e),this.b.copy(t),this.c.copy(n),this}setFromPointsAndIndices(e,t,n,i){return this.a.copy(e[t]),this.b.copy(e[n]),this.c.copy(e[i]),this}setFromAttributeAndIndices(e,t,n,i){return this.a.fromBufferAttribute(e,t),this.b.fromBufferAttribute(e,n),this.c.fromBufferAttribute(e,i),this}clone(){return new this.constructor().copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return Yn.subVectors(this.c,this.b),_i.subVectors(this.a,this.b),Yn.cross(_i).length()*.5}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return yt.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,t){return yt.getBarycoord(e,this.a,this.b,this.c,t)}getInterpolation(e,t,n,i,r){return yt.getInterpolation(e,this.a,this.b,this.c,t,n,i,r)}containsPoint(e){return yt.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return yt.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,t){const n=this.a,i=this.b,r=this.c;let o,a;Js.subVectors(i,n),Qs.subVectors(r,n),th.subVectors(e,n);const l=Js.dot(th),c=Qs.dot(th);if(l<=0&&c<=0)return t.copy(n);nh.subVectors(e,i);const h=Js.dot(nh),u=Qs.dot(nh);if(h>=0&&u<=h)return t.copy(i);const d=l*u-h*c;if(d<=0&&l>=0&&h<=0)return o=l/(l-h),t.copy(n).addScaledVector(Js,o);ih.subVectors(e,r);const f=Js.dot(ih),p=Qs.dot(ih);if(p>=0&&f<=p)return t.copy(r);const g=f*c-l*p;if(g<=0&&c>=0&&p<=0)return a=c/(c-p),t.copy(n).addScaledVector(Qs,a);const x=h*p-f*u;if(x<=0&&u-h>=0&&f-p>=0)return Yd.subVectors(r,i),a=(u-h)/(u-h+(f-p)),t.copy(i).addScaledVector(Yd,a);const m=1/(x+g+d);return o=g*m,a=d*m,t.copy(n).addScaledVector(Js,o).addScaledVector(Qs,a)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}const Kd={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Vi={h:0,s:0,l:0},la={h:0,s:0,l:0};function ah(s,e,t){return t<0&&(t+=1),t>1&&(t-=1),t<1/6?s+(e-s)*6*t:t<1/2?e:t<2/3?s+(e-s)*6*(2/3-t):s}class Ue{constructor(e,t,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(e,t,n)}set(e,t,n){if(t===void 0&&n===void 0){const i=e;i&&i.isColor?this.copy(i):typeof i=="number"?this.setHex(i):typeof i=="string"&&this.setStyle(i)}else this.setRGB(e,t,n);return this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,t=gt){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(e&255)/255,it.colorSpaceToWorking(this,t),this}setRGB(e,t,n,i=it.workingColorSpace){return this.r=e,this.g=t,this.b=n,it.colorSpaceToWorking(this,i),this}setHSL(e,t,n,i=it.workingColorSpace){if(e=Hc(e,1),t=qe(t,0,1),n=qe(n,0,1),t===0)this.r=this.g=this.b=n;else{const r=n<=.5?n*(1+t):n+t-n*t,o=2*n-r;this.r=ah(o,r,e+1/3),this.g=ah(o,r,e),this.b=ah(o,r,e-1/3)}return it.colorSpaceToWorking(this,i),this}setStyle(e,t=gt){function n(r){r!==void 0&&parseFloat(r)<1&&He("Color: Alpha component of "+e+" will be ignored.")}let i;if(i=/^(\w+)\(([^\)]*)\)/.exec(e)){let r;const o=i[1],a=i[2];switch(o){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return n(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,t);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return n(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,t);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return n(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,t);break;default:He("Color: Unknown color model "+e)}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(e)){const r=i[1],o=r.length;if(o===3)return this.setRGB(parseInt(r.charAt(0),16)/15,parseInt(r.charAt(1),16)/15,parseInt(r.charAt(2),16)/15,t);if(o===6)return this.setHex(parseInt(r,16),t);He("Color: Invalid hex color "+e)}else if(e&&e.length>0)return this.setColorName(e,t);return this}setColorName(e,t=gt){const n=Kd[e.toLowerCase()];return n!==void 0?this.setHex(n,t):He("Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=xi(e.r),this.g=xi(e.g),this.b=xi(e.b),this}copyLinearToSRGB(e){return this.r=Ws(e.r),this.g=Ws(e.g),this.b=Ws(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=gt){return it.workingToColorSpace(tn.copy(this),e),Math.round(qe(tn.r*255,0,255))*65536+Math.round(qe(tn.g*255,0,255))*256+Math.round(qe(tn.b*255,0,255))}getHexString(e=gt){return("000000"+this.getHex(e).toString(16)).slice(-6)}getHSL(e,t=it.workingColorSpace){it.workingToColorSpace(tn.copy(this),t);const n=tn.r,i=tn.g,r=tn.b,o=Math.max(n,i,r),a=Math.min(n,i,r);let l,c;const h=(a+o)/2;if(a===o)l=0,c=0;else{const u=o-a;switch(c=h<=.5?u/(o+a):u/(2-o-a),o){case n:l=(i-r)/u+(i0!=e>0&&this.version++,this._alphaTest=e}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(e!==void 0)for(const t in e){const n=e[t];if(n===void 0){He(`Material: parameter '${t}' has value of undefined.`);continue}const i=this[t];if(i===void 0){He(`Material: '${t}' is not a property of THREE.${this.type}.`);continue}i&&i.isColor?i.set(n):i&&i.isVector3&&n&&n.isVector3?i.copy(n):this[t]=n}}toJSON(e){const t=e===void 0||typeof e=="string";t&&(e={textures:{},images:{}});const n={metadata:{version:4.7,type:"Material",generator:"Material.toJSON"}};n.uuid=this.uuid,n.type=this.type,this.name!==""&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(n.sheenColorMap=this.sheenColorMap.toJSON(e).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(n.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(e).uuid),this.dispersion!==void 0&&(n.dispersion=this.dispersion),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(e).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(e).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(e).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(e).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(e).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(e).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(e).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(e).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(e).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapRotation!==void 0&&(n.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(e).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(e).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(e).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==ks&&(n.blending=this.blending),this.side!==Pn&&(n.side=this.side),this.vertexColors===!0&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=!0),this.blendSrc!==Vl&&(n.blendSrc=this.blendSrc),this.blendDst!==Gl&&(n.blendDst=this.blendDst),this.blendEquation!==Gn&&(n.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(n.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(n.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==Us&&(n.depthFunc=this.depthFunc),this.depthTest===!1&&(n.depthTest=this.depthTest),this.depthWrite===!1&&(n.depthWrite=this.depthWrite),this.colorWrite===!1&&(n.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==Dd&&(n.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(n.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==Vs&&(n.stencilFail=this.stencilFail),this.stencilZFail!==Vs&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==Vs&&(n.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(n.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaHash===!0&&(n.alphaHash=!0),this.alphaToCoverage===!0&&(n.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=!0),this.forceSinglePass===!0&&(n.forceSinglePass=!0),this.wireframe===!0&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=!0),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function i(r){const o=[];for(const a in r){const l=r[a];delete l.metadata,o.push(l)}return o}if(t){const r=i(e.textures),o=i(e.images);r.length>0&&(n.textures=r),o.length>0&&(n.images=o)}return n}clone(){return new this.constructor().copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.blendColor.copy(e.blendColor),this.blendAlpha=e.blendAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const t=e.clippingPlanes;let n=null;if(t!==null){const i=t.length;n=new Array(i);for(let r=0;r!==i;++r)n[r]=t[r].clone()}return this.clippingPlanes=n,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaHash=e.alphaHash,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.forceSinglePass=e.forceSinglePass,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){e===!0&&this.version++}}class Xt extends gn{constructor(e){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new Ue(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new mn,this.combine=Wo,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}const Ot=new P,ca=new ce;let mx=0;class at{constructor(e,t,n=!1){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:mx++}),this.name="",this.array=e,this.itemSize=t,this.count=e!==void 0?e.length/t:0,this.normalized=n,this.usage=zc,this.updateRanges=[],this.gpuType=Xn,this.version=0}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this.gpuType=e.gpuType,this}copyAt(e,t,n){e*=this.itemSize,n*=t.itemSize;for(let i=0,r=this.itemSize;it.count&&He("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),t.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new xt);const e=this.attributes.position,t=this.morphAttributes.position;if(e&&e.isGLBufferAttribute){Qe("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),this.boundingBox.set(new P(-1/0,-1/0,-1/0),new P(1/0,1/0,1/0));return}if(e!==void 0){if(this.boundingBox.setFromBufferAttribute(e),t)for(let n=0,i=t.length;n0&&(e.userData=this.userData),this.parameters!==void 0){const l=this.parameters;for(const c in l)l[c]!==void 0&&(e[c]=l[c]);return e}e.data={attributes:{}};const t=this.index;t!==null&&(e.data.index={type:t.array.constructor.name,array:Array.prototype.slice.call(t.array)});const n=this.attributes;for(const l in n){const c=n[l];e.data.attributes[l]=c.toJSON(e.data)}const i={};let r=!1;for(const l in this.morphAttributes){const c=this.morphAttributes[l],h=[];for(let u=0,d=c.length;u0&&(i[l]=h,r=!0)}r&&(e.data.morphAttributes=i,e.data.morphTargetsRelative=this.morphTargetsRelative);const o=this.groups;o.length>0&&(e.data.groups=JSON.parse(JSON.stringify(o)));const a=this.boundingSphere;return a!==null&&(e.data.boundingSphere=a.toJSON()),e}clone(){return new this.constructor().copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const t={};this.name=e.name;const n=e.index;n!==null&&this.setIndex(n.clone());const i=e.attributes;for(const c in i){const h=i[c];this.setAttribute(c,h.clone(t))}const r=e.morphAttributes;for(const c in r){const h=[],u=r[c];for(let d=0,f=u.length;d0){const i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,o=i.length;r(e.far-e.near)**2))&&(Qd.copy(r).invert(),rs.copy(e.ray).applyMatrix4(Qd),!(n.boundingBox!==null&&rs.intersectsBox(n.boundingBox)===!1)&&this._computeIntersections(e,t,rs)))}_computeIntersections(e,t,n){let i;const r=this.geometry,o=this.material,a=r.index,l=r.attributes.position,c=r.attributes.uv,h=r.attributes.uv1,u=r.attributes.normal,d=r.groups,f=r.drawRange;if(a!==null)if(Array.isArray(o))for(let p=0,g=d.length;pt.far?null:{distance:c,point:ma.clone(),object:s}}function ga(s,e,t,n,i,r,o,a,l,c){s.getVertexPosition(a,ua),s.getVertexPosition(l,da),s.getVertexPosition(c,fa);const h=xx(s,e,t,n,ua,da,fa,tf);if(h){const u=new P;yt.getBarycoord(tf,ua,da,fa,u),i&&(h.uv=yt.getInterpolatedAttribute(i,a,l,c,u,new ce)),r&&(h.uv1=yt.getInterpolatedAttribute(r,a,l,c,u,new ce)),o&&(h.normal=yt.getInterpolatedAttribute(o,a,l,c,u,new P),h.normal.dot(n.direction)>0&&h.normal.multiplyScalar(-1));const d={a,b:l,c,normal:new P,materialIndex:0};yt.getNormal(ua,da,fa,d.normal),h.face=d,h.barycoord=u}return h}class Gi extends ht{constructor(e=1,t=1,n=1,i=1,r=1,o=1){super(),this.type="BoxGeometry",this.parameters={width:e,height:t,depth:n,widthSegments:i,heightSegments:r,depthSegments:o};const a=this;i=Math.floor(i),r=Math.floor(r),o=Math.floor(o);const l=[],c=[],h=[],u=[];let d=0,f=0;p("z","y","x",-1,-1,n,t,e,o,r,0),p("z","y","x",1,-1,n,t,-e,o,r,1),p("x","z","y",1,1,e,n,t,i,o,2),p("x","z","y",1,-1,e,n,-t,i,o,3),p("x","y","z",1,-1,e,t,n,i,r,4),p("x","y","z",-1,-1,e,t,-n,i,r,5),this.setIndex(l),this.setAttribute("position",new nn(c,3)),this.setAttribute("normal",new nn(h,3)),this.setAttribute("uv",new nn(u,2));function p(g,x,m,b,v,y,M,E,A,R,_){const S=y/A,D=M/R,C=y/2,B=M/2,w=E/2,F=A+1,W=R+1;let j=0,$=0;const Z=new P;for(let re=0;re0?1:-1,h.push(Z.x,Z.y,Z.z),u.push(Y/A),u.push(1-re/R),j+=1}}for(let re=0;re{alert("Status updated!")},t.appendChild(n),t.appendChild(i),t.appendChild(r),super({container:e,title:"dialog.testTitle",content:t,width:320,height:"auto",position:"center",resizable:!0,draggable:!0,onClose:()=>{console.log("Info dialog closed")},onOpen:()=>{console.log("Info dialog opened")}})}}class sg extends pi{container;activeDialogs=[];constructor(e){super(),this.container=e,this.subscribe("ui:open-dialog",t=>{console.log("[DialogManager] Received open-dialog event:",t),t.id==="info"&&this.showInfoDialog()})}create(e){const t=new rd({container:this.container,...e,onClose:()=>{this.activeDialogs=this.activeDialogs.filter(n=>n!==t),e.onClose&&e.onClose()}});return t.setTheme(rt.getTheme()),this.activeDialogs.push(t),t}showInfoDialog(){new ig(this.container)}updateTheme(e){this.activeDialogs.forEach(t=>{t.setTheme&&t.setTheme(e)})}destroy(){this.activeDialogs.forEach(e=>e.destroy()),this.activeDialogs=[],super.destroy()}}const Hr="181",Bs={ROTATE:0,DOLLY:1,PAN:2},Ns={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},rg=0,od=1,og=2,ad=1,ld=2,mi=3,Pn=0,on=1,Et=2,Wt=0,ks=1,Hl=2,cd=3,hd=4,ud=5,Gn=100,ag=101,lg=102,cg=103,hg=104,Vr=200,ug=201,dg=202,fg=203,Vl=204,Gl=205,Wl=206,pg=207,Xl=208,mg=209,gg=210,xg=211,vg=212,bg=213,yg=214,jl=0,ql=1,Zl=2,Us=3,Yl=4,Kl=5,$l=6,Jl=7,Wo=0,_g=1,Mg=2,Ni=0,dd=1,fd=2,pd=3,Ql=4,md=5,gd=6,xd=7,vd="attached",wg="detached",bd=300,Os=301,Fs=302,ec=303,tc=304,Xo=306,ni=1e3,ii=1001,jo=1002,Kt=1003,yd=1004,Gr=1005,$t=1006,qo=1007,gi=1008,Wn=1009,_d=1010,Md=1011,Wr=1012,nc=1013,ts=1014,Xn=1015,Rn=1016,ic=1017,sc=1018,zs=1020,wd=35902,Sd=35899,Ed=1021,Td=1022,fn=1023,Xr=1026,Hs=1027,rc=1028,oc=1029,ac=1030,lc=1031,cc=1033,Zo=33776,Yo=33777,Ko=33778,$o=33779,hc=35840,uc=35841,dc=35842,fc=35843,pc=36196,mc=37492,gc=37496,xc=37808,vc=37809,bc=37810,yc=37811,_c=37812,Mc=37813,wc=37814,Sc=37815,Ec=37816,Tc=37817,Ac=37818,Cc=37819,Pc=37820,Rc=37821,Lc=36492,Dc=36494,Ic=36495,Bc=36283,Nc=36284,kc=36285,Uc=36286,jr=2300,qr=2301,Oc=2302,Ad=2400,Cd=2401,Pd=2402,Sg=2500,Eg=0,Rd=1,Fc=2,Tg=3200,Ag=3201,Zr=0,Cg=1,ki="",gt="srgb",Rt="srgb-linear",Jo="linear",lt="srgb",Vs=7680,Ld=519,Pg=512,Rg=513,Lg=514,Dd=515,Dg=516,Ig=517,Bg=518,Ng=519,zc=35044,Id="300 es",si=2e3,Qo=2001;function Bd(s){for(let e=s.length-1;e>=0;--e)if(s[e]>=65535)return!0;return!1}function Yr(s){return document.createElementNS("http://www.w3.org/1999/xhtml",s)}function kg(){const s=Yr("canvas");return s.style.display="block",s}const Nd={};function ea(...s){const e="THREE."+s.shift();console.log(e,...s)}function He(...s){const e="THREE."+s.shift();console.warn(e,...s)}function Qe(...s){const e="THREE."+s.shift();console.error(e,...s)}function Kr(...s){const e=s.join(" ");e in Nd||(Nd[e]=!0,He(...s))}function Ug(s,e,t){return new Promise(function(n,i){function r(){switch(s.clientWaitSync(e,s.SYNC_FLUSH_COMMANDS_BIT,0)){case s.WAIT_FAILED:i();break;case s.TIMEOUT_EXPIRED:setTimeout(r,t);break;default:n()}}setTimeout(r,t)})}class ns{addEventListener(e,t){this._listeners===void 0&&(this._listeners={});const n=this._listeners;n[e]===void 0&&(n[e]=[]),n[e].indexOf(t)===-1&&n[e].push(t)}hasEventListener(e,t){const n=this._listeners;return n===void 0?!1:n[e]!==void 0&&n[e].indexOf(t)!==-1}removeEventListener(e,t){const n=this._listeners;if(n===void 0)return;const i=n[e];if(i!==void 0){const r=i.indexOf(t);r!==-1&&i.splice(r,1)}}dispatchEvent(e){const t=this._listeners;if(t===void 0)return;const n=t[e.type];if(n!==void 0){e.target=this;const i=n.slice(0);for(let r=0,o=i.length;r>8&255]+en[s>>16&255]+en[s>>24&255]+"-"+en[e&255]+en[e>>8&255]+"-"+en[e>>16&15|64]+en[e>>24&255]+"-"+en[t&63|128]+en[t>>8&255]+"-"+en[t>>16&255]+en[t>>24&255]+en[n&255]+en[n>>8&255]+en[n>>16&255]+en[n>>24&255]).toLowerCase()}function qe(s,e,t){return Math.max(e,Math.min(t,s))}function Hc(s,e){return(s%e+e)%e}function Og(s,e,t,n,i){return n+(s-e)*(i-n)/(t-e)}function Fg(s,e,t){return s!==e?(t-s)/(e-s):0}function Jr(s,e,t){return(1-t)*s+t*e}function zg(s,e,t,n){return Jr(s,e,1-Math.exp(-t*n))}function Hg(s,e=1){return e-Math.abs(Hc(s,e*2)-e)}function Vg(s,e,t){return s<=e?0:s>=t?1:(s=(s-e)/(t-e),s*s*(3-2*s))}function Gg(s,e,t){return s<=e?0:s>=t?1:(s=(s-e)/(t-e),s*s*s*(s*(s*6-15)+10))}function Wg(s,e){return s+Math.floor(Math.random()*(e-s+1))}function Xg(s,e){return s+Math.random()*(e-s)}function jg(s){return s*(.5-Math.random())}function qg(s){s!==void 0&&(kd=s);let e=kd+=1831565813;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}function Zg(s){return s*$r}function Yg(s){return s*Gs}function Kg(s){return(s&s-1)===0&&s!==0}function $g(s){return Math.pow(2,Math.ceil(Math.log(s)/Math.LN2))}function Jg(s){return Math.pow(2,Math.floor(Math.log(s)/Math.LN2))}function Qg(s,e,t,n,i){const r=Math.cos,o=Math.sin,a=r(t/2),l=o(t/2),c=r((e+n)/2),h=o((e+n)/2),u=r((e-n)/2),d=o((e-n)/2),f=r((n-e)/2),p=o((n-e)/2);switch(i){case"XYX":s.set(a*h,l*u,l*d,a*c);break;case"YZY":s.set(l*d,a*h,l*u,a*c);break;case"ZXZ":s.set(l*u,l*d,a*h,a*c);break;case"XZX":s.set(a*h,l*p,l*f,a*c);break;case"YXY":s.set(l*f,a*h,l*p,a*c);break;case"ZYZ":s.set(l*p,l*f,a*h,a*c);break;default:He("MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+i)}}function jn(s,e){switch(e.constructor){case Float32Array:return s;case Uint32Array:return s/4294967295;case Uint16Array:return s/65535;case Uint8Array:return s/255;case Int32Array:return Math.max(s/2147483647,-1);case Int16Array:return Math.max(s/32767,-1);case Int8Array:return Math.max(s/127,-1);default:throw new Error("Invalid component type.")}}function ct(s,e){switch(e.constructor){case Float32Array:return s;case Uint32Array:return Math.round(s*4294967295);case Uint16Array:return Math.round(s*65535);case Uint8Array:return Math.round(s*255);case Int32Array:return Math.round(s*2147483647);case Int16Array:return Math.round(s*32767);case Int8Array:return Math.round(s*127);default:throw new Error("Invalid component type.")}}const Qr={DEG2RAD:$r,RAD2DEG:Gs,generateUUID:Ln,clamp:qe,euclideanModulo:Hc,mapLinear:Og,inverseLerp:Fg,lerp:Jr,damp:zg,pingpong:Hg,smoothstep:Vg,smootherstep:Gg,randInt:Wg,randFloat:Xg,randFloatSpread:jg,seededRandom:qg,degToRad:Zg,radToDeg:Yg,isPowerOfTwo:Kg,ceilPowerOfTwo:$g,floorPowerOfTwo:Jg,setQuaternionFromProperEuler:Qg,normalize:ct,denormalize:jn};class ce{constructor(e=0,t=0){ce.prototype.isVector2=!0,this.x=e,this.y=t}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,t){return this.x=e,this.y=t,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const t=this.x,n=this.y,i=e.elements;return this.x=i[0]*t+i[3]*n+i[6],this.y=i[1]*t+i[4]*n+i[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,t){return this.x=qe(this.x,e.x,t.x),this.y=qe(this.y,e.y,t.y),this}clampScalar(e,t){return this.x=qe(this.x,e,t),this.y=qe(this.y,e,t),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(qe(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;const n=this.dot(e)/t;return Math.acos(qe(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y;return t*t+n*n}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this}rotateAround(e,t){const n=Math.cos(t),i=Math.sin(t),r=this.x-e.x,o=this.y-e.y;return this.x=r*n-o*i+e.x,this.y=r*i+o*n+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class Dn{constructor(e=0,t=0,n=0,i=1){this.isQuaternion=!0,this._x=e,this._y=t,this._z=n,this._w=i}static slerpFlat(e,t,n,i,r,o,a){let l=n[i+0],c=n[i+1],h=n[i+2],u=n[i+3],d=r[o+0],f=r[o+1],p=r[o+2],g=r[o+3];if(a<=0){e[t+0]=l,e[t+1]=c,e[t+2]=h,e[t+3]=u;return}if(a>=1){e[t+0]=d,e[t+1]=f,e[t+2]=p,e[t+3]=g;return}if(u!==g||l!==d||c!==f||h!==p){let x=l*d+c*f+h*p+u*g;x<0&&(d=-d,f=-f,p=-p,g=-g,x=-x);let m=1-a;if(x<.9995){const b=Math.acos(x),v=Math.sin(b);m=Math.sin(m*b)/v,a=Math.sin(a*b)/v,l=l*m+d*a,c=c*m+f*a,h=h*m+p*a,u=u*m+g*a}else{l=l*m+d*a,c=c*m+f*a,h=h*m+p*a,u=u*m+g*a;const b=1/Math.sqrt(l*l+c*c+h*h+u*u);l*=b,c*=b,h*=b,u*=b}}e[t]=l,e[t+1]=c,e[t+2]=h,e[t+3]=u}static multiplyQuaternionsFlat(e,t,n,i,r,o){const a=n[i],l=n[i+1],c=n[i+2],h=n[i+3],u=r[o],d=r[o+1],f=r[o+2],p=r[o+3];return e[t]=a*p+h*u+l*f-c*d,e[t+1]=l*p+h*d+c*u-a*f,e[t+2]=c*p+h*f+a*d-l*u,e[t+3]=h*p-a*u-l*d-c*f,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,t,n,i){return this._x=e,this._y=t,this._z=n,this._w=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,t=!0){const n=e._x,i=e._y,r=e._z,o=e._order,a=Math.cos,l=Math.sin,c=a(n/2),h=a(i/2),u=a(r/2),d=l(n/2),f=l(i/2),p=l(r/2);switch(o){case"XYZ":this._x=d*h*u+c*f*p,this._y=c*f*u-d*h*p,this._z=c*h*p+d*f*u,this._w=c*h*u-d*f*p;break;case"YXZ":this._x=d*h*u+c*f*p,this._y=c*f*u-d*h*p,this._z=c*h*p-d*f*u,this._w=c*h*u+d*f*p;break;case"ZXY":this._x=d*h*u-c*f*p,this._y=c*f*u+d*h*p,this._z=c*h*p+d*f*u,this._w=c*h*u-d*f*p;break;case"ZYX":this._x=d*h*u-c*f*p,this._y=c*f*u+d*h*p,this._z=c*h*p-d*f*u,this._w=c*h*u+d*f*p;break;case"YZX":this._x=d*h*u+c*f*p,this._y=c*f*u+d*h*p,this._z=c*h*p-d*f*u,this._w=c*h*u-d*f*p;break;case"XZY":this._x=d*h*u-c*f*p,this._y=c*f*u-d*h*p,this._z=c*h*p+d*f*u,this._w=c*h*u+d*f*p;break;default:He("Quaternion: .setFromEuler() encountered an unknown order: "+o)}return t===!0&&this._onChangeCallback(),this}setFromAxisAngle(e,t){const n=t/2,i=Math.sin(n);return this._x=e.x*i,this._y=e.y*i,this._z=e.z*i,this._w=Math.cos(n),this._onChangeCallback(),this}setFromRotationMatrix(e){const t=e.elements,n=t[0],i=t[4],r=t[8],o=t[1],a=t[5],l=t[9],c=t[2],h=t[6],u=t[10],d=n+a+u;if(d>0){const f=.5/Math.sqrt(d+1);this._w=.25/f,this._x=(h-l)*f,this._y=(r-c)*f,this._z=(o-i)*f}else if(n>a&&n>u){const f=2*Math.sqrt(1+n-a-u);this._w=(h-l)/f,this._x=.25*f,this._y=(i+o)/f,this._z=(r+c)/f}else if(a>u){const f=2*Math.sqrt(1+a-n-u);this._w=(r-c)/f,this._x=(i+o)/f,this._y=.25*f,this._z=(l+h)/f}else{const f=2*Math.sqrt(1+u-n-a);this._w=(o-i)/f,this._x=(r+c)/f,this._y=(l+h)/f,this._z=.25*f}return this._onChangeCallback(),this}setFromUnitVectors(e,t){let n=e.dot(t)+1;return n<1e-8?(n=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=n):(this._x=0,this._y=-e.z,this._z=e.y,this._w=n)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=n),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(qe(this.dot(e),-1,1)))}rotateTowards(e,t){const n=this.angleTo(e);if(n===0)return this;const i=Math.min(1,t/n);return this.slerp(e,i),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,t){const n=e._x,i=e._y,r=e._z,o=e._w,a=t._x,l=t._y,c=t._z,h=t._w;return this._x=n*h+o*a+i*c-r*l,this._y=i*h+o*l+r*a-n*c,this._z=r*h+o*c+n*l-i*a,this._w=o*h-n*a-i*l-r*c,this._onChangeCallback(),this}slerp(e,t){if(t<=0)return this;if(t>=1)return this.copy(e);let n=e._x,i=e._y,r=e._z,o=e._w,a=this.dot(e);a<0&&(n=-n,i=-i,r=-r,o=-o,a=-a);let l=1-t;if(a<.9995){const c=Math.acos(a),h=Math.sin(c);l=Math.sin(l*c)/h,t=Math.sin(t*c)/h,this._x=this._x*l+n*t,this._y=this._y*l+i*t,this._z=this._z*l+r*t,this._w=this._w*l+o*t,this._onChangeCallback()}else this._x=this._x*l+n*t,this._y=this._y*l+i*t,this._z=this._z*l+r*t,this._w=this._w*l+o*t,this.normalize();return this}slerpQuaternions(e,t,n){return this.copy(e).slerp(t,n)}random(){const e=2*Math.PI*Math.random(),t=2*Math.PI*Math.random(),n=Math.random(),i=Math.sqrt(1-n),r=Math.sqrt(n);return this.set(i*Math.sin(e),i*Math.cos(e),r*Math.sin(t),r*Math.cos(t))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,t=0){return this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e}fromBufferAttribute(e,t){return this._x=e.getX(t),this._y=e.getY(t),this._z=e.getZ(t),this._w=e.getW(t),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class P{constructor(e=0,t=0,n=0){P.prototype.isVector3=!0,this.x=e,this.y=t,this.z=n}set(e,t,n){return n===void 0&&(n=this.z),this.x=e,this.y=t,this.z=n,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}applyEuler(e){return this.applyQuaternion(Ud.setFromEuler(e))}applyAxisAngle(e,t){return this.applyQuaternion(Ud.setFromAxisAngle(e,t))}applyMatrix3(e){const t=this.x,n=this.y,i=this.z,r=e.elements;return this.x=r[0]*t+r[3]*n+r[6]*i,this.y=r[1]*t+r[4]*n+r[7]*i,this.z=r[2]*t+r[5]*n+r[8]*i,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const t=this.x,n=this.y,i=this.z,r=e.elements,o=1/(r[3]*t+r[7]*n+r[11]*i+r[15]);return this.x=(r[0]*t+r[4]*n+r[8]*i+r[12])*o,this.y=(r[1]*t+r[5]*n+r[9]*i+r[13])*o,this.z=(r[2]*t+r[6]*n+r[10]*i+r[14])*o,this}applyQuaternion(e){const t=this.x,n=this.y,i=this.z,r=e.x,o=e.y,a=e.z,l=e.w,c=2*(o*i-a*n),h=2*(a*t-r*i),u=2*(r*n-o*t);return this.x=t+l*c+o*u-a*h,this.y=n+l*h+a*c-r*u,this.z=i+l*u+r*h-o*c,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const t=this.x,n=this.y,i=this.z,r=e.elements;return this.x=r[0]*t+r[4]*n+r[8]*i,this.y=r[1]*t+r[5]*n+r[9]*i,this.z=r[2]*t+r[6]*n+r[10]*i,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,t){return this.x=qe(this.x,e.x,t.x),this.y=qe(this.y,e.y,t.y),this.z=qe(this.z,e.z,t.z),this}clampScalar(e,t){return this.x=qe(this.x,e,t),this.y=qe(this.y,e,t),this.z=qe(this.z,e,t),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(qe(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,t){const n=e.x,i=e.y,r=e.z,o=t.x,a=t.y,l=t.z;return this.x=i*l-r*a,this.y=r*o-n*l,this.z=n*a-i*o,this}projectOnVector(e){const t=e.lengthSq();if(t===0)return this.set(0,0,0);const n=e.dot(this)/t;return this.copy(e).multiplyScalar(n)}projectOnPlane(e){return Vc.copy(this).projectOnVector(e),this.sub(Vc)}reflect(e){return this.sub(Vc.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;const n=this.dot(e)/t;return Math.acos(qe(n,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,n=this.y-e.y,i=this.z-e.z;return t*t+n*n+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,t,n){const i=Math.sin(t)*e;return this.x=i*Math.sin(n),this.y=Math.cos(t)*e,this.z=i*Math.cos(n),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,t,n){return this.x=e*Math.sin(t),this.y=n,this.z=e*Math.cos(t),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(e){const t=this.setFromMatrixColumn(e,0).length(),n=this.setFromMatrixColumn(e,1).length(),i=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=n,this.z=i,this}setFromMatrixColumn(e,t){return this.fromArray(e.elements,t*4)}setFromMatrix3Column(e,t){return this.fromArray(e.elements,t*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}setFromColor(e){return this.x=e.r,this.y=e.g,this.z=e.b,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=Math.random()*Math.PI*2,t=Math.random()*2-1,n=Math.sqrt(1-t*t);return this.x=n*Math.cos(e),this.y=t,this.z=n*Math.sin(e),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Vc=new P,Ud=new Dn;class Ke{constructor(e,t,n,i,r,o,a,l,c){Ke.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],e!==void 0&&this.set(e,t,n,i,r,o,a,l,c)}set(e,t,n,i,r,o,a,l,c){const h=this.elements;return h[0]=e,h[1]=i,h[2]=a,h[3]=t,h[4]=r,h[5]=l,h[6]=n,h[7]=o,h[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],this}extractBasis(e,t,n){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),n.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,i=t.elements,r=this.elements,o=n[0],a=n[3],l=n[6],c=n[1],h=n[4],u=n[7],d=n[2],f=n[5],p=n[8],g=i[0],x=i[3],m=i[6],b=i[1],v=i[4],y=i[7],M=i[2],E=i[5],A=i[8];return r[0]=o*g+a*b+l*M,r[3]=o*x+a*v+l*E,r[6]=o*m+a*y+l*A,r[1]=c*g+h*b+u*M,r[4]=c*x+h*v+u*E,r[7]=c*m+h*y+u*A,r[2]=d*g+f*b+p*M,r[5]=d*x+f*v+p*E,r[8]=d*m+f*y+p*A,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}determinant(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],o=e[4],a=e[5],l=e[6],c=e[7],h=e[8];return t*o*h-t*a*c-n*r*h+n*a*l+i*r*c-i*o*l}invert(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],o=e[4],a=e[5],l=e[6],c=e[7],h=e[8],u=h*o-a*c,d=a*l-h*r,f=c*r-o*l,p=t*u+n*d+i*f;if(p===0)return this.set(0,0,0,0,0,0,0,0,0);const g=1/p;return e[0]=u*g,e[1]=(i*c-h*n)*g,e[2]=(a*n-i*o)*g,e[3]=d*g,e[4]=(h*t-i*l)*g,e[5]=(i*r-a*t)*g,e[6]=f*g,e[7]=(n*l-c*t)*g,e[8]=(o*t-n*r)*g,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this}setUvTransform(e,t,n,i,r,o,a){const l=Math.cos(r),c=Math.sin(r);return this.set(n*l,n*c,-n*(l*o+c*a)+o+e,-i*c,i*l,-i*(-c*o+l*a)+a+t,0,0,1),this}scale(e,t){return this.premultiply(Gc.makeScale(e,t)),this}rotate(e){return this.premultiply(Gc.makeRotation(-e)),this}translate(e,t){return this.premultiply(Gc.makeTranslation(e,t)),this}makeTranslation(e,t){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,n,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}equals(e){const t=this.elements,n=e.elements;for(let i=0;i<9;i++)if(t[i]!==n[i])return!1;return!0}fromArray(e,t=0){for(let n=0;n<9;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){const n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e}clone(){return new this.constructor().fromArray(this.elements)}}const Gc=new Ke,Od=new Ke().set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),Fd=new Ke().set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function ex(){const s={enabled:!0,workingColorSpace:Rt,spaces:{},convert:function(i,r,o){return this.enabled===!1||r===o||!r||!o||(this.spaces[r].transfer===lt&&(i.r=xi(i.r),i.g=xi(i.g),i.b=xi(i.b)),this.spaces[r].primaries!==this.spaces[o].primaries&&(i.applyMatrix3(this.spaces[r].toXYZ),i.applyMatrix3(this.spaces[o].fromXYZ)),this.spaces[o].transfer===lt&&(i.r=Ws(i.r),i.g=Ws(i.g),i.b=Ws(i.b))),i},workingToColorSpace:function(i,r){return this.convert(i,this.workingColorSpace,r)},colorSpaceToWorking:function(i,r){return this.convert(i,r,this.workingColorSpace)},getPrimaries:function(i){return this.spaces[i].primaries},getTransfer:function(i){return i===ki?Jo:this.spaces[i].transfer},getToneMappingMode:function(i){return this.spaces[i].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(i,r=this.workingColorSpace){return i.fromArray(this.spaces[r].luminanceCoefficients)},define:function(i){Object.assign(this.spaces,i)},_getMatrix:function(i,r,o){return i.copy(this.spaces[r].toXYZ).multiply(this.spaces[o].fromXYZ)},_getDrawingBufferColorSpace:function(i){return this.spaces[i].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(i=this.workingColorSpace){return this.spaces[i].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(i,r){return Kr("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),s.workingToColorSpace(i,r)},toWorkingColorSpace:function(i,r){return Kr("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),s.colorSpaceToWorking(i,r)}},e=[.64,.33,.3,.6,.15,.06],t=[.2126,.7152,.0722],n=[.3127,.329];return s.define({[Rt]:{primaries:e,whitePoint:n,transfer:Jo,toXYZ:Od,fromXYZ:Fd,luminanceCoefficients:t,workingColorSpaceConfig:{unpackColorSpace:gt},outputColorSpaceConfig:{drawingBufferColorSpace:gt}},[gt]:{primaries:e,whitePoint:n,transfer:lt,toXYZ:Od,fromXYZ:Fd,luminanceCoefficients:t,outputColorSpaceConfig:{drawingBufferColorSpace:gt}}}),s}const it=ex();function xi(s){return s<.04045?s*.0773993808:Math.pow(s*.9478672986+.0521327014,2.4)}function Ws(s){return s<.0031308?s*12.92:1.055*Math.pow(s,.41666)-.055}let Xs;class tx{static getDataURL(e,t="image/png"){if(/^data:/i.test(e.src)||typeof HTMLCanvasElement>"u")return e.src;let n;if(e instanceof HTMLCanvasElement)n=e;else{Xs===void 0&&(Xs=Yr("canvas")),Xs.width=e.width,Xs.height=e.height;const i=Xs.getContext("2d");e instanceof ImageData?i.putImageData(e,0,0):i.drawImage(e,0,0,e.width,e.height),n=Xs}return n.toDataURL(t)}static sRGBToLinear(e){if(typeof HTMLImageElement<"u"&&e instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&e instanceof ImageBitmap){const t=Yr("canvas");t.width=e.width,t.height=e.height;const n=t.getContext("2d");n.drawImage(e,0,0,e.width,e.height);const i=n.getImageData(0,0,e.width,e.height),r=i.data;for(let o=0;o1),this.pmremVersion=0}get width(){return this.source.getSize(jc).x}get height(){return this.source.getSize(jc).y}get depth(){return this.source.getSize(jc).z}get image(){return this.source.data}set image(e=null){this.source.data=e}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return new this.constructor().copy(this)}copy(e){return this.name=e.name,this.source=e.source,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.channel=e.channel,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.colorSpace=e.colorSpace,this.renderTarget=e.renderTarget,this.isRenderTargetTexture=e.isRenderTargetTexture,this.isArrayTexture=e.isArrayTexture,this.userData=JSON.parse(JSON.stringify(e.userData)),this.needsUpdate=!0,this}setValues(e){for(const t in e){const n=e[t];if(n===void 0){He(`Texture.setValues(): parameter '${t}' has value of undefined.`);continue}const i=this[t];if(i===void 0){He(`Texture.setValues(): property '${t}' does not exist.`);continue}i&&n&&i.isVector2&&n.isVector2||i&&n&&i.isVector3&&n.isVector3||i&&n&&i.isMatrix3&&n.isMatrix3?i.copy(n):this[t]=n}}toJSON(e){const t=e===void 0||typeof e=="string";if(!t&&e.textures[this.uuid]!==void 0)return e.textures[this.uuid];const n={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(e).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(n.userData=this.userData),t||(e.textures[this.uuid]=n),n}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(e){if(this.mapping!==bd)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case ni:e.x=e.x-Math.floor(e.x);break;case ii:e.x=e.x<0?0:1;break;case jo:Math.abs(Math.floor(e.x)%2)===1?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x);break}if(e.y<0||e.y>1)switch(this.wrapT){case ni:e.y=e.y-Math.floor(e.y);break;case ii:e.y=e.y<0?0:1;break;case jo:Math.abs(Math.floor(e.y)%2)===1?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y);break}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){e===!0&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(e){e===!0&&this.pmremVersion++}}Ht.DEFAULT_IMAGE=null,Ht.DEFAULT_MAPPING=bd,Ht.DEFAULT_ANISOTROPY=1;class tt{constructor(e=0,t=0,n=0,i=1){tt.prototype.isVector4=!0,this.x=e,this.y=t,this.z=n,this.w=i}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,t,n,i){return this.x=e,this.y=t,this.z=n,this.w=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w!==void 0?e.w:1,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const t=this.x,n=this.y,i=this.z,r=this.w,o=e.elements;return this.x=o[0]*t+o[4]*n+o[8]*i+o[12]*r,this.y=o[1]*t+o[5]*n+o[9]*i+o[13]*r,this.z=o[2]*t+o[6]*n+o[10]*i+o[14]*r,this.w=o[3]*t+o[7]*n+o[11]*i+o[15]*r,this}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this.w/=e.w,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this}setAxisAngleFromRotationMatrix(e){let t,n,i,r;const l=e.elements,c=l[0],h=l[4],u=l[8],d=l[1],f=l[5],p=l[9],g=l[2],x=l[6],m=l[10];if(Math.abs(h-d)<.01&&Math.abs(u-g)<.01&&Math.abs(p-x)<.01){if(Math.abs(h+d)<.1&&Math.abs(u+g)<.1&&Math.abs(p+x)<.1&&Math.abs(c+f+m-3)<.1)return this.set(1,0,0,0),this;t=Math.PI;const v=(c+1)/2,y=(f+1)/2,M=(m+1)/2,E=(h+d)/4,A=(u+g)/4,R=(p+x)/4;return v>y&&v>M?v<.01?(n=0,i=.707106781,r=.707106781):(n=Math.sqrt(v),i=E/n,r=A/n):y>M?y<.01?(n=.707106781,i=0,r=.707106781):(i=Math.sqrt(y),n=E/i,r=R/i):M<.01?(n=.707106781,i=.707106781,r=0):(r=Math.sqrt(M),n=A/r,i=R/r),this.set(n,i,r,t),this}let b=Math.sqrt((x-p)*(x-p)+(u-g)*(u-g)+(d-h)*(d-h));return Math.abs(b)<.001&&(b=1),this.x=(x-p)/b,this.y=(u-g)/b,this.z=(d-h)/b,this.w=Math.acos((c+f+m-1)/2),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this.w=t[15],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,t){return this.x=qe(this.x,e.x,t.x),this.y=qe(this.y,e.y,t.y),this.z=qe(this.z,e.z,t.z),this.w=qe(this.w,e.w,t.w),this}clampScalar(e,t){return this.x=qe(this.x,e,t),this.y=qe(this.y,e,t),this.z=qe(this.z,e,t),this.w=qe(this.w,e,t),this}clampLength(e,t){const n=this.length();return this.divideScalar(n||1).multiplyScalar(qe(n,e,t))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this}lerpVectors(e,t,n){return this.x=e.x+(t.x-e.x)*n,this.y=e.y+(t.y-e.y)*n,this.z=e.z+(t.z-e.z)*n,this.w=e.w+(t.w-e.w)*n,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e}fromBufferAttribute(e,t){return this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this.w=e.getW(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}class sx extends ns{constructor(e=1,t=1,n={}){super(),n=Object.assign({generateMipmaps:!1,internalFormat:null,minFilter:$t,depthBuffer:!0,stencilBuffer:!1,resolveDepthBuffer:!0,resolveStencilBuffer:!0,depthTexture:null,samples:0,count:1,depth:1,multiview:!1},n),this.isRenderTarget=!0,this.width=e,this.height=t,this.depth=n.depth,this.scissor=new tt(0,0,e,t),this.scissorTest=!1,this.viewport=new tt(0,0,e,t);const i={width:e,height:t,depth:n.depth},r=new Ht(i);this.textures=[];const o=n.count;for(let a=0;a1);this.dispose()}this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t)}clone(){return new this.constructor().copy(this)}copy(e){this.width=e.width,this.height=e.height,this.depth=e.depth,this.scissor.copy(e.scissor),this.scissorTest=e.scissorTest,this.viewport.copy(e.viewport),this.textures.length=0;for(let t=0,n=e.textures.length;t=this.min.x&&e.x<=this.max.x&&e.y>=this.min.y&&e.y<=this.max.y&&e.z>=this.min.z&&e.z<=this.max.z}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,t){return t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return e.max.x>=this.min.x&&e.min.x<=this.max.x&&e.max.y>=this.min.y&&e.min.y<=this.max.y&&e.max.z>=this.min.z&&e.min.z<=this.max.z}intersectsSphere(e){return this.clampPoint(e.center,qn),qn.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let t,n;return e.normal.x>0?(t=e.normal.x*this.min.x,n=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,n=e.normal.x*this.min.x),e.normal.y>0?(t+=e.normal.y*this.min.y,n+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,n+=e.normal.y*this.min.y),e.normal.z>0?(t+=e.normal.z*this.min.z,n+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,n+=e.normal.z*this.min.z),t<=-e.constant&&n>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(eo),na.subVectors(this.max,eo),js.subVectors(e.a,eo),qs.subVectors(e.b,eo),Zs.subVectors(e.c,eo),Ui.subVectors(qs,js),Oi.subVectors(Zs,qs),is.subVectors(js,Zs);let t=[0,-Ui.z,Ui.y,0,-Oi.z,Oi.y,0,-is.z,is.y,Ui.z,0,-Ui.x,Oi.z,0,-Oi.x,is.z,0,-is.x,-Ui.y,Ui.x,0,-Oi.y,Oi.x,0,-is.y,is.x,0];return!qc(t,js,qs,Zs,na)||(t=[1,0,0,0,1,0,0,0,1],!qc(t,js,qs,Zs,na))?!1:(ia.crossVectors(Ui,Oi),t=[ia.x,ia.y,ia.z],qc(t,js,qs,Zs,na))}clampPoint(e,t){return t.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return this.clampPoint(e,qn).distanceTo(e)}getBoundingSphere(e){return this.isEmpty()?e.makeEmpty():(this.getCenter(e.center),e.radius=this.getSize(qn).length()*.5),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()?this:(vi[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),vi[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),vi[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),vi[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),vi[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),vi[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),vi[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),vi[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(vi),this)}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(e){return this.min.fromArray(e.min),this.max.fromArray(e.max),this}}const vi=[new P,new P,new P,new P,new P,new P,new P,new P],qn=new P,ta=new xt,js=new P,qs=new P,Zs=new P,Ui=new P,Oi=new P,is=new P,eo=new P,na=new P,ia=new P,ss=new P;function qc(s,e,t,n,i){for(let r=0,o=s.length-3;r<=o;r+=3){ss.fromArray(s,r);const a=i.x*Math.abs(ss.x)+i.y*Math.abs(ss.y)+i.z*Math.abs(ss.z),l=e.dot(ss),c=t.dot(ss),h=n.dot(ss);if(Math.max(-Math.max(l,c,h),Math.min(l,c,h))>a)return!1}return!0}const ox=new xt,to=new P,Zc=new P;class ri{constructor(e=new P,t=-1){this.isSphere=!0,this.center=e,this.radius=t}set(e,t){return this.center.copy(e),this.radius=t,this}setFromPoints(e,t){const n=this.center;t!==void 0?n.copy(t):ox.setFromPoints(e).getCenter(n);let i=0;for(let r=0,o=e.length;rthis.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){if(this.isEmpty())return this.center.copy(e),this.radius=0,this;to.subVectors(e,this.center);const t=to.lengthSq();if(t>this.radius*this.radius){const n=Math.sqrt(t),i=(n-this.radius)*.5;this.center.addScaledVector(to,i/n),this.radius+=i}return this}union(e){return e.isEmpty()?this:this.isEmpty()?(this.copy(e),this):(this.center.equals(e.center)===!0?this.radius=Math.max(this.radius,e.radius):(Zc.subVectors(e.center,this.center).setLength(e.radius),this.expandByPoint(to.copy(e.center).add(Zc)),this.expandByPoint(to.copy(e.center).sub(Zc))),this)}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return new this.constructor().copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(e){return this.radius=e.radius,this.center.fromArray(e.center),this}}const bi=new P,Yc=new P,sa=new P,Fi=new P,Kc=new P,ra=new P,$c=new P;class zi{constructor(e=new P,t=new P(0,0,-1)){this.origin=e,this.direction=t}set(e,t){return this.origin.copy(e),this.direction.copy(t),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,t){return t.copy(this.origin).addScaledVector(this.direction,e)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,bi)),this}closestPointToPoint(e,t){t.subVectors(e,this.origin);const n=t.dot(this.direction);return n<0?t.copy(this.origin):t.copy(this.origin).addScaledVector(this.direction,n)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const t=bi.subVectors(e,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(e):(bi.copy(this.origin).addScaledVector(this.direction,t),bi.distanceToSquared(e))}distanceSqToSegment(e,t,n,i){Yc.copy(e).add(t).multiplyScalar(.5),sa.copy(t).sub(e).normalize(),Fi.copy(this.origin).sub(Yc);const r=e.distanceTo(t)*.5,o=-this.direction.dot(sa),a=Fi.dot(this.direction),l=-Fi.dot(sa),c=Fi.lengthSq(),h=Math.abs(1-o*o);let u,d,f,p;if(h>0)if(u=o*l-a,d=o*a-l,p=r*h,u>=0)if(d>=-p)if(d<=p){const g=1/h;u*=g,d*=g,f=u*(u+o*d+2*a)+d*(o*u+d+2*l)+c}else d=r,u=Math.max(0,-(o*d+a)),f=-u*u+d*(d+2*l)+c;else d=-r,u=Math.max(0,-(o*d+a)),f=-u*u+d*(d+2*l)+c;else d<=-p?(u=Math.max(0,-(-o*r+a)),d=u>0?-r:Math.min(Math.max(-r,-l),r),f=-u*u+d*(d+2*l)+c):d<=p?(u=0,d=Math.min(Math.max(-r,-l),r),f=d*(d+2*l)+c):(u=Math.max(0,-(o*r+a)),d=u>0?r:Math.min(Math.max(-r,-l),r),f=-u*u+d*(d+2*l)+c);else d=o>0?-r:r,u=Math.max(0,-(o*d+a)),f=-u*u+d*(d+2*l)+c;return n&&n.copy(this.origin).addScaledVector(this.direction,u),i&&i.copy(Yc).addScaledVector(sa,d),f}intersectSphere(e,t){bi.subVectors(e.center,this.origin);const n=bi.dot(this.direction),i=bi.dot(bi)-n*n,r=e.radius*e.radius;if(i>r)return null;const o=Math.sqrt(r-i),a=n-o,l=n+o;return l<0?null:a<0?this.at(l,t):this.at(a,t)}intersectsSphere(e){return e.radius<0?!1:this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const t=e.normal.dot(this.direction);if(t===0)return e.distanceToPoint(this.origin)===0?0:null;const n=-(this.origin.dot(e.normal)+e.constant)/t;return n>=0?n:null}intersectPlane(e,t){const n=this.distanceToPlane(e);return n===null?null:this.at(n,t)}intersectsPlane(e){const t=e.distanceToPoint(this.origin);return t===0||e.normal.dot(this.direction)*t<0}intersectBox(e,t){let n,i,r,o,a,l;const c=1/this.direction.x,h=1/this.direction.y,u=1/this.direction.z,d=this.origin;return c>=0?(n=(e.min.x-d.x)*c,i=(e.max.x-d.x)*c):(n=(e.max.x-d.x)*c,i=(e.min.x-d.x)*c),h>=0?(r=(e.min.y-d.y)*h,o=(e.max.y-d.y)*h):(r=(e.max.y-d.y)*h,o=(e.min.y-d.y)*h),n>o||r>i||((r>n||isNaN(n))&&(n=r),(o=0?(a=(e.min.z-d.z)*u,l=(e.max.z-d.z)*u):(a=(e.max.z-d.z)*u,l=(e.min.z-d.z)*u),n>l||a>i)||((a>n||n!==n)&&(n=a),(l=0?n:i,t)}intersectsBox(e){return this.intersectBox(e,bi)!==null}intersectTriangle(e,t,n,i,r){Kc.subVectors(t,e),ra.subVectors(n,e),$c.crossVectors(Kc,ra);let o=this.direction.dot($c),a;if(o>0){if(i)return null;a=1}else if(o<0)a=-1,o=-o;else return null;Fi.subVectors(this.origin,e);const l=a*this.direction.dot(ra.crossVectors(Fi,ra));if(l<0)return null;const c=a*this.direction.dot(Kc.cross(Fi));if(c<0||l+c>o)return null;const h=-a*Fi.dot($c);return h<0?null:this.at(h/o,r)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return new this.constructor().copy(this)}}class ze{constructor(e,t,n,i,r,o,a,l,c,h,u,d,f,p,g,x){ze.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],e!==void 0&&this.set(e,t,n,i,r,o,a,l,c,h,u,d,f,p,g,x)}set(e,t,n,i,r,o,a,l,c,h,u,d,f,p,g,x){const m=this.elements;return m[0]=e,m[4]=t,m[8]=n,m[12]=i,m[1]=r,m[5]=o,m[9]=a,m[13]=l,m[2]=c,m[6]=h,m[10]=u,m[14]=d,m[3]=f,m[7]=p,m[11]=g,m[15]=x,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new ze().fromArray(this.elements)}copy(e){const t=this.elements,n=e.elements;return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],this}copyPosition(e){const t=this.elements,n=e.elements;return t[12]=n[12],t[13]=n[13],t[14]=n[14],this}setFromMatrix3(e){const t=e.elements;return this.set(t[0],t[3],t[6],0,t[1],t[4],t[7],0,t[2],t[5],t[8],0,0,0,0,1),this}extractBasis(e,t,n){return e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),n.setFromMatrixColumn(this,2),this}makeBasis(e,t,n){return this.set(e.x,t.x,n.x,0,e.y,t.y,n.y,0,e.z,t.z,n.z,0,0,0,0,1),this}extractRotation(e){const t=this.elements,n=e.elements,i=1/Ys.setFromMatrixColumn(e,0).length(),r=1/Ys.setFromMatrixColumn(e,1).length(),o=1/Ys.setFromMatrixColumn(e,2).length();return t[0]=n[0]*i,t[1]=n[1]*i,t[2]=n[2]*i,t[3]=0,t[4]=n[4]*r,t[5]=n[5]*r,t[6]=n[6]*r,t[7]=0,t[8]=n[8]*o,t[9]=n[9]*o,t[10]=n[10]*o,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromEuler(e){const t=this.elements,n=e.x,i=e.y,r=e.z,o=Math.cos(n),a=Math.sin(n),l=Math.cos(i),c=Math.sin(i),h=Math.cos(r),u=Math.sin(r);if(e.order==="XYZ"){const d=o*h,f=o*u,p=a*h,g=a*u;t[0]=l*h,t[4]=-l*u,t[8]=c,t[1]=f+p*c,t[5]=d-g*c,t[9]=-a*l,t[2]=g-d*c,t[6]=p+f*c,t[10]=o*l}else if(e.order==="YXZ"){const d=l*h,f=l*u,p=c*h,g=c*u;t[0]=d+g*a,t[4]=p*a-f,t[8]=o*c,t[1]=o*u,t[5]=o*h,t[9]=-a,t[2]=f*a-p,t[6]=g+d*a,t[10]=o*l}else if(e.order==="ZXY"){const d=l*h,f=l*u,p=c*h,g=c*u;t[0]=d-g*a,t[4]=-o*u,t[8]=p+f*a,t[1]=f+p*a,t[5]=o*h,t[9]=g-d*a,t[2]=-o*c,t[6]=a,t[10]=o*l}else if(e.order==="ZYX"){const d=o*h,f=o*u,p=a*h,g=a*u;t[0]=l*h,t[4]=p*c-f,t[8]=d*c+g,t[1]=l*u,t[5]=g*c+d,t[9]=f*c-p,t[2]=-c,t[6]=a*l,t[10]=o*l}else if(e.order==="YZX"){const d=o*l,f=o*c,p=a*l,g=a*c;t[0]=l*h,t[4]=g-d*u,t[8]=p*u+f,t[1]=u,t[5]=o*h,t[9]=-a*h,t[2]=-c*h,t[6]=f*u+p,t[10]=d-g*u}else if(e.order==="XZY"){const d=o*l,f=o*c,p=a*l,g=a*c;t[0]=l*h,t[4]=-u,t[8]=c*h,t[1]=d*u+g,t[5]=o*h,t[9]=f*u-p,t[2]=p*u-f,t[6]=a*h,t[10]=g*u+d}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromQuaternion(e){return this.compose(ax,e,lx)}lookAt(e,t,n){const i=this.elements;return Sn.subVectors(e,t),Sn.lengthSq()===0&&(Sn.z=1),Sn.normalize(),Hi.crossVectors(n,Sn),Hi.lengthSq()===0&&(Math.abs(n.z)===1?Sn.x+=1e-4:Sn.z+=1e-4,Sn.normalize(),Hi.crossVectors(n,Sn)),Hi.normalize(),oa.crossVectors(Sn,Hi),i[0]=Hi.x,i[4]=oa.x,i[8]=Sn.x,i[1]=Hi.y,i[5]=oa.y,i[9]=Sn.y,i[2]=Hi.z,i[6]=oa.z,i[10]=Sn.z,this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const n=e.elements,i=t.elements,r=this.elements,o=n[0],a=n[4],l=n[8],c=n[12],h=n[1],u=n[5],d=n[9],f=n[13],p=n[2],g=n[6],x=n[10],m=n[14],b=n[3],v=n[7],y=n[11],M=n[15],E=i[0],A=i[4],R=i[8],_=i[12],S=i[1],D=i[5],C=i[9],B=i[13],w=i[2],F=i[6],W=i[10],j=i[14],$=i[3],Z=i[7],re=i[11],X=i[15];return r[0]=o*E+a*S+l*w+c*$,r[4]=o*A+a*D+l*F+c*Z,r[8]=o*R+a*C+l*W+c*re,r[12]=o*_+a*B+l*j+c*X,r[1]=h*E+u*S+d*w+f*$,r[5]=h*A+u*D+d*F+f*Z,r[9]=h*R+u*C+d*W+f*re,r[13]=h*_+u*B+d*j+f*X,r[2]=p*E+g*S+x*w+m*$,r[6]=p*A+g*D+x*F+m*Z,r[10]=p*R+g*C+x*W+m*re,r[14]=p*_+g*B+x*j+m*X,r[3]=b*E+v*S+y*w+M*$,r[7]=b*A+v*D+y*F+M*Z,r[11]=b*R+v*C+y*W+M*re,r[15]=b*_+v*B+y*j+M*X,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this}determinant(){const e=this.elements,t=e[0],n=e[4],i=e[8],r=e[12],o=e[1],a=e[5],l=e[9],c=e[13],h=e[2],u=e[6],d=e[10],f=e[14],p=e[3],g=e[7],x=e[11],m=e[15];return p*(+r*l*u-i*c*u-r*a*d+n*c*d+i*a*f-n*l*f)+g*(+t*l*f-t*c*d+r*o*d-i*o*f+i*c*h-r*l*h)+x*(+t*c*u-t*a*f-r*o*u+n*o*f+r*a*h-n*c*h)+m*(-i*a*h-t*l*u+t*a*d+i*o*u-n*o*d+n*l*h)}transpose(){const e=this.elements;let t;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this}setPosition(e,t,n){const i=this.elements;return e.isVector3?(i[12]=e.x,i[13]=e.y,i[14]=e.z):(i[12]=e,i[13]=t,i[14]=n),this}invert(){const e=this.elements,t=e[0],n=e[1],i=e[2],r=e[3],o=e[4],a=e[5],l=e[6],c=e[7],h=e[8],u=e[9],d=e[10],f=e[11],p=e[12],g=e[13],x=e[14],m=e[15],b=u*x*c-g*d*c+g*l*f-a*x*f-u*l*m+a*d*m,v=p*d*c-h*x*c-p*l*f+o*x*f+h*l*m-o*d*m,y=h*g*c-p*u*c+p*a*f-o*g*f-h*a*m+o*u*m,M=p*u*l-h*g*l-p*a*d+o*g*d+h*a*x-o*u*x,E=t*b+n*v+i*y+r*M;if(E===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const A=1/E;return e[0]=b*A,e[1]=(g*d*r-u*x*r-g*i*f+n*x*f+u*i*m-n*d*m)*A,e[2]=(a*x*r-g*l*r+g*i*c-n*x*c-a*i*m+n*l*m)*A,e[3]=(u*l*r-a*d*r-u*i*c+n*d*c+a*i*f-n*l*f)*A,e[4]=v*A,e[5]=(h*x*r-p*d*r+p*i*f-t*x*f-h*i*m+t*d*m)*A,e[6]=(p*l*r-o*x*r-p*i*c+t*x*c+o*i*m-t*l*m)*A,e[7]=(o*d*r-h*l*r+h*i*c-t*d*c-o*i*f+t*l*f)*A,e[8]=y*A,e[9]=(p*u*r-h*g*r-p*n*f+t*g*f+h*n*m-t*u*m)*A,e[10]=(o*g*r-p*a*r+p*n*c-t*g*c-o*n*m+t*a*m)*A,e[11]=(h*a*r-o*u*r-h*n*c+t*u*c+o*n*f-t*a*f)*A,e[12]=M*A,e[13]=(h*g*i-p*u*i+p*n*d-t*g*d-h*n*x+t*u*x)*A,e[14]=(p*a*i-o*g*i-p*n*l+t*g*l+o*n*x-t*a*x)*A,e[15]=(o*u*i-h*a*i+h*n*l-t*u*l-o*n*d+t*a*d)*A,this}scale(e){const t=this.elements,n=e.x,i=e.y,r=e.z;return t[0]*=n,t[4]*=i,t[8]*=r,t[1]*=n,t[5]*=i,t[9]*=r,t[2]*=n,t[6]*=i,t[10]*=r,t[3]*=n,t[7]*=i,t[11]*=r,this}getMaxScaleOnAxis(){const e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],n=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],i=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,n,i))}makeTranslation(e,t,n){return e.isVector3?this.set(1,0,0,e.x,0,1,0,e.y,0,0,1,e.z,0,0,0,1):this.set(1,0,0,e,0,1,0,t,0,0,1,n,0,0,0,1),this}makeRotationX(e){const t=Math.cos(e),n=Math.sin(e);return this.set(1,0,0,0,0,t,-n,0,0,n,t,0,0,0,0,1),this}makeRotationY(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,0,n,0,0,1,0,0,-n,0,t,0,0,0,0,1),this}makeRotationZ(e){const t=Math.cos(e),n=Math.sin(e);return this.set(t,-n,0,0,n,t,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,t){const n=Math.cos(t),i=Math.sin(t),r=1-n,o=e.x,a=e.y,l=e.z,c=r*o,h=r*a;return this.set(c*o+n,c*a-i*l,c*l+i*a,0,c*a+i*l,h*a+n,h*l-i*o,0,c*l-i*a,h*l+i*o,r*l*l+n,0,0,0,0,1),this}makeScale(e,t,n){return this.set(e,0,0,0,0,t,0,0,0,0,n,0,0,0,0,1),this}makeShear(e,t,n,i,r,o){return this.set(1,n,r,0,e,1,o,0,t,i,1,0,0,0,0,1),this}compose(e,t,n){const i=this.elements,r=t._x,o=t._y,a=t._z,l=t._w,c=r+r,h=o+o,u=a+a,d=r*c,f=r*h,p=r*u,g=o*h,x=o*u,m=a*u,b=l*c,v=l*h,y=l*u,M=n.x,E=n.y,A=n.z;return i[0]=(1-(g+m))*M,i[1]=(f+y)*M,i[2]=(p-v)*M,i[3]=0,i[4]=(f-y)*E,i[5]=(1-(d+m))*E,i[6]=(x+b)*E,i[7]=0,i[8]=(p+v)*A,i[9]=(x-b)*A,i[10]=(1-(d+g))*A,i[11]=0,i[12]=e.x,i[13]=e.y,i[14]=e.z,i[15]=1,this}decompose(e,t,n){const i=this.elements;let r=Ys.set(i[0],i[1],i[2]).length();const o=Ys.set(i[4],i[5],i[6]).length(),a=Ys.set(i[8],i[9],i[10]).length();this.determinant()<0&&(r=-r),e.x=i[12],e.y=i[13],e.z=i[14],Zn.copy(this);const c=1/r,h=1/o,u=1/a;return Zn.elements[0]*=c,Zn.elements[1]*=c,Zn.elements[2]*=c,Zn.elements[4]*=h,Zn.elements[5]*=h,Zn.elements[6]*=h,Zn.elements[8]*=u,Zn.elements[9]*=u,Zn.elements[10]*=u,t.setFromRotationMatrix(Zn),n.x=r,n.y=o,n.z=a,this}makePerspective(e,t,n,i,r,o,a=si,l=!1){const c=this.elements,h=2*r/(t-e),u=2*r/(n-i),d=(t+e)/(t-e),f=(n+i)/(n-i);let p,g;if(l)p=r/(o-r),g=o*r/(o-r);else if(a===si)p=-(o+r)/(o-r),g=-2*o*r/(o-r);else if(a===Qo)p=-o/(o-r),g=-o*r/(o-r);else throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+a);return c[0]=h,c[4]=0,c[8]=d,c[12]=0,c[1]=0,c[5]=u,c[9]=f,c[13]=0,c[2]=0,c[6]=0,c[10]=p,c[14]=g,c[3]=0,c[7]=0,c[11]=-1,c[15]=0,this}makeOrthographic(e,t,n,i,r,o,a=si,l=!1){const c=this.elements,h=2/(t-e),u=2/(n-i),d=-(t+e)/(t-e),f=-(n+i)/(n-i);let p,g;if(l)p=1/(o-r),g=o/(o-r);else if(a===si)p=-2/(o-r),g=-(o+r)/(o-r);else if(a===Qo)p=-1/(o-r),g=-r/(o-r);else throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+a);return c[0]=h,c[4]=0,c[8]=0,c[12]=d,c[1]=0,c[5]=u,c[9]=0,c[13]=f,c[2]=0,c[6]=0,c[10]=p,c[14]=g,c[3]=0,c[7]=0,c[11]=0,c[15]=1,this}equals(e){const t=this.elements,n=e.elements;for(let i=0;i<16;i++)if(t[i]!==n[i])return!1;return!0}fromArray(e,t=0){for(let n=0;n<16;n++)this.elements[n]=e[n+t];return this}toArray(e=[],t=0){const n=this.elements;return e[t]=n[0],e[t+1]=n[1],e[t+2]=n[2],e[t+3]=n[3],e[t+4]=n[4],e[t+5]=n[5],e[t+6]=n[6],e[t+7]=n[7],e[t+8]=n[8],e[t+9]=n[9],e[t+10]=n[10],e[t+11]=n[11],e[t+12]=n[12],e[t+13]=n[13],e[t+14]=n[14],e[t+15]=n[15],e}}const Ys=new P,Zn=new ze,ax=new P(0,0,0),lx=new P(1,1,1),Hi=new P,oa=new P,Sn=new P,Hd=new ze,Vd=new Dn;class mn{constructor(e=0,t=0,n=0,i=mn.DEFAULT_ORDER){this.isEuler=!0,this._x=e,this._y=t,this._z=n,this._order=i}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,t,n,i=this._order){return this._x=e,this._y=t,this._z=n,this._order=i,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,t=this._order,n=!0){const i=e.elements,r=i[0],o=i[4],a=i[8],l=i[1],c=i[5],h=i[9],u=i[2],d=i[6],f=i[10];switch(t){case"XYZ":this._y=Math.asin(qe(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-h,f),this._z=Math.atan2(-o,r)):(this._x=Math.atan2(d,c),this._z=0);break;case"YXZ":this._x=Math.asin(-qe(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(a,f),this._z=Math.atan2(l,c)):(this._y=Math.atan2(-u,r),this._z=0);break;case"ZXY":this._x=Math.asin(qe(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(-u,f),this._z=Math.atan2(-o,c)):(this._y=0,this._z=Math.atan2(l,r));break;case"ZYX":this._y=Math.asin(-qe(u,-1,1)),Math.abs(u)<.9999999?(this._x=Math.atan2(d,f),this._z=Math.atan2(l,r)):(this._x=0,this._z=Math.atan2(-o,c));break;case"YZX":this._z=Math.asin(qe(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-h,c),this._y=Math.atan2(-u,r)):(this._x=0,this._y=Math.atan2(a,f));break;case"XZY":this._z=Math.asin(-qe(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(d,c),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-h,f),this._y=0);break;default:He("Euler: .setFromRotationMatrix() encountered an unknown order: "+t)}return this._order=t,n===!0&&this._onChangeCallback(),this}setFromQuaternion(e,t,n){return Hd.makeRotationFromQuaternion(e),this.setFromRotationMatrix(Hd,t,n)}setFromVector3(e,t=this._order){return this.set(e.x,e.y,e.z,t)}reorder(e){return Vd.setFromEuler(this),this.setFromQuaternion(Vd,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],e[3]!==void 0&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}mn.DEFAULT_ORDER="XYZ";class Jc{constructor(){this.mask=1}set(e){this.mask=(1<>>0}enable(e){this.mask|=1<1){for(let t=0;t1){for(let n=0;n0&&(i.userData=this.userData),i.layers=this.layers.mask,i.matrix=this.matrix.toArray(),i.up=this.up.toArray(),this.matrixAutoUpdate===!1&&(i.matrixAutoUpdate=!1),this.isInstancedMesh&&(i.type="InstancedMesh",i.count=this.count,i.instanceMatrix=this.instanceMatrix.toJSON(),this.instanceColor!==null&&(i.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(i.type="BatchedMesh",i.perObjectFrustumCulled=this.perObjectFrustumCulled,i.sortObjects=this.sortObjects,i.drawRanges=this._drawRanges,i.reservedRanges=this._reservedRanges,i.geometryInfo=this._geometryInfo.map(a=>({...a,boundingBox:a.boundingBox?a.boundingBox.toJSON():void 0,boundingSphere:a.boundingSphere?a.boundingSphere.toJSON():void 0})),i.instanceInfo=this._instanceInfo.map(a=>({...a})),i.availableInstanceIds=this._availableInstanceIds.slice(),i.availableGeometryIds=this._availableGeometryIds.slice(),i.nextIndexStart=this._nextIndexStart,i.nextVertexStart=this._nextVertexStart,i.geometryCount=this._geometryCount,i.maxInstanceCount=this._maxInstanceCount,i.maxVertexCount=this._maxVertexCount,i.maxIndexCount=this._maxIndexCount,i.geometryInitialized=this._geometryInitialized,i.matricesTexture=this._matricesTexture.toJSON(e),i.indirectTexture=this._indirectTexture.toJSON(e),this._colorsTexture!==null&&(i.colorsTexture=this._colorsTexture.toJSON(e)),this.boundingSphere!==null&&(i.boundingSphere=this.boundingSphere.toJSON()),this.boundingBox!==null&&(i.boundingBox=this.boundingBox.toJSON()));function r(a,l){return a[l.uuid]===void 0&&(a[l.uuid]=l.toJSON(e)),l.uuid}if(this.isScene)this.background&&(this.background.isColor?i.background=this.background.toJSON():this.background.isTexture&&(i.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&this.environment.isRenderTargetTexture!==!0&&(i.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){i.geometry=r(e.geometries,this.geometry);const a=this.geometry.parameters;if(a!==void 0&&a.shapes!==void 0){const l=a.shapes;if(Array.isArray(l))for(let c=0,h=l.length;c0){i.children=[];for(let a=0;a0){i.animations=[];for(let a=0;a0&&(n.geometries=a),l.length>0&&(n.materials=l),c.length>0&&(n.textures=c),h.length>0&&(n.images=h),u.length>0&&(n.shapes=u),d.length>0&&(n.skeletons=d),f.length>0&&(n.animations=f),p.length>0&&(n.nodes=p)}return n.object=i,n;function o(a){const l=[];for(const c in a){const h=a[c];delete h.metadata,l.push(h)}return l}}clone(e){return new this.constructor().copy(this,e)}copy(e,t=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldAutoUpdate=e.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.animations=e.animations.slice(),this.userData=JSON.parse(JSON.stringify(e.userData)),t===!0)for(let n=0;n0?i.multiplyScalar(1/Math.sqrt(r)):i.set(0,0,0)}static getBarycoord(e,t,n,i,r){Yn.subVectors(i,t),_i.subVectors(n,t),eh.subVectors(e,t);const o=Yn.dot(Yn),a=Yn.dot(_i),l=Yn.dot(eh),c=_i.dot(_i),h=_i.dot(eh),u=o*c-a*a;if(u===0)return r.set(0,0,0),null;const d=1/u,f=(c*l-a*h)*d,p=(o*h-a*l)*d;return r.set(1-f-p,p,f)}static containsPoint(e,t,n,i){return this.getBarycoord(e,t,n,i,Mi)===null?!1:Mi.x>=0&&Mi.y>=0&&Mi.x+Mi.y<=1}static getInterpolation(e,t,n,i,r,o,a,l){return this.getBarycoord(e,t,n,i,Mi)===null?(l.x=0,l.y=0,"z"in l&&(l.z=0),"w"in l&&(l.w=0),null):(l.setScalar(0),l.addScaledVector(r,Mi.x),l.addScaledVector(o,Mi.y),l.addScaledVector(a,Mi.z),l)}static getInterpolatedAttribute(e,t,n,i,r,o){return sh.setScalar(0),rh.setScalar(0),oh.setScalar(0),sh.fromBufferAttribute(e,t),rh.fromBufferAttribute(e,n),oh.fromBufferAttribute(e,i),o.setScalar(0),o.addScaledVector(sh,r.x),o.addScaledVector(rh,r.y),o.addScaledVector(oh,r.z),o}static isFrontFacing(e,t,n,i){return Yn.subVectors(n,t),_i.subVectors(e,t),Yn.cross(_i).dot(i)<0}set(e,t,n){return this.a.copy(e),this.b.copy(t),this.c.copy(n),this}setFromPointsAndIndices(e,t,n,i){return this.a.copy(e[t]),this.b.copy(e[n]),this.c.copy(e[i]),this}setFromAttributeAndIndices(e,t,n,i){return this.a.fromBufferAttribute(e,t),this.b.fromBufferAttribute(e,n),this.c.fromBufferAttribute(e,i),this}clone(){return new this.constructor().copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return Yn.subVectors(this.c,this.b),_i.subVectors(this.a,this.b),Yn.cross(_i).length()*.5}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return bt.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,t){return bt.getBarycoord(e,this.a,this.b,this.c,t)}getInterpolation(e,t,n,i,r){return bt.getInterpolation(e,this.a,this.b,this.c,t,n,i,r)}containsPoint(e){return bt.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return bt.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,t){const n=this.a,i=this.b,r=this.c;let o,a;Js.subVectors(i,n),Qs.subVectors(r,n),th.subVectors(e,n);const l=Js.dot(th),c=Qs.dot(th);if(l<=0&&c<=0)return t.copy(n);nh.subVectors(e,i);const h=Js.dot(nh),u=Qs.dot(nh);if(h>=0&&u<=h)return t.copy(i);const d=l*u-h*c;if(d<=0&&l>=0&&h<=0)return o=l/(l-h),t.copy(n).addScaledVector(Js,o);ih.subVectors(e,r);const f=Js.dot(ih),p=Qs.dot(ih);if(p>=0&&f<=p)return t.copy(r);const g=f*c-l*p;if(g<=0&&c>=0&&p<=0)return a=c/(c-p),t.copy(n).addScaledVector(Qs,a);const x=h*p-f*u;if(x<=0&&u-h>=0&&f-p>=0)return Zd.subVectors(r,i),a=(u-h)/(u-h+(f-p)),t.copy(i).addScaledVector(Zd,a);const m=1/(x+g+d);return o=g*m,a=d*m,t.copy(n).addScaledVector(Js,o).addScaledVector(Qs,a)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}const Yd={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},Vi={h:0,s:0,l:0},la={h:0,s:0,l:0};function ah(s,e,t){return t<0&&(t+=1),t>1&&(t-=1),t<1/6?s+(e-s)*6*t:t<1/2?e:t<2/3?s+(e-s)*6*(2/3-t):s}class Ue{constructor(e,t,n){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(e,t,n)}set(e,t,n){if(t===void 0&&n===void 0){const i=e;i&&i.isColor?this.copy(i):typeof i=="number"?this.setHex(i):typeof i=="string"&&this.setStyle(i)}else this.setRGB(e,t,n);return this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e,t=gt){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(e&255)/255,it.colorSpaceToWorking(this,t),this}setRGB(e,t,n,i=it.workingColorSpace){return this.r=e,this.g=t,this.b=n,it.colorSpaceToWorking(this,i),this}setHSL(e,t,n,i=it.workingColorSpace){if(e=Hc(e,1),t=qe(t,0,1),n=qe(n,0,1),t===0)this.r=this.g=this.b=n;else{const r=n<=.5?n*(1+t):n+t-n*t,o=2*n-r;this.r=ah(o,r,e+1/3),this.g=ah(o,r,e),this.b=ah(o,r,e-1/3)}return it.colorSpaceToWorking(this,i),this}setStyle(e,t=gt){function n(r){r!==void 0&&parseFloat(r)<1&&He("Color: Alpha component of "+e+" will be ignored.")}let i;if(i=/^(\w+)\(([^\)]*)\)/.exec(e)){let r;const o=i[1],a=i[2];switch(o){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return n(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,t);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return n(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,t);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return n(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,t);break;default:He("Color: Unknown color model "+e)}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(e)){const r=i[1],o=r.length;if(o===3)return this.setRGB(parseInt(r.charAt(0),16)/15,parseInt(r.charAt(1),16)/15,parseInt(r.charAt(2),16)/15,t);if(o===6)return this.setHex(parseInt(r,16),t);He("Color: Invalid hex color "+e)}else if(e&&e.length>0)return this.setColorName(e,t);return this}setColorName(e,t=gt){const n=Yd[e.toLowerCase()];return n!==void 0?this.setHex(n,t):He("Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copySRGBToLinear(e){return this.r=xi(e.r),this.g=xi(e.g),this.b=xi(e.b),this}copyLinearToSRGB(e){return this.r=Ws(e.r),this.g=Ws(e.g),this.b=Ws(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(e=gt){return it.workingToColorSpace(tn.copy(this),e),Math.round(qe(tn.r*255,0,255))*65536+Math.round(qe(tn.g*255,0,255))*256+Math.round(qe(tn.b*255,0,255))}getHexString(e=gt){return("000000"+this.getHex(e).toString(16)).slice(-6)}getHSL(e,t=it.workingColorSpace){it.workingToColorSpace(tn.copy(this),t);const n=tn.r,i=tn.g,r=tn.b,o=Math.max(n,i,r),a=Math.min(n,i,r);let l,c;const h=(a+o)/2;if(a===o)l=0,c=0;else{const u=o-a;switch(c=h<=.5?u/(o+a):u/(2-o-a),o){case n:l=(i-r)/u+(i0!=e>0&&this.version++,this._alphaTest=e}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(e!==void 0)for(const t in e){const n=e[t];if(n===void 0){He(`Material: parameter '${t}' has value of undefined.`);continue}const i=this[t];if(i===void 0){He(`Material: '${t}' is not a property of THREE.${this.type}.`);continue}i&&i.isColor?i.set(n):i&&i.isVector3&&n&&n.isVector3?i.copy(n):this[t]=n}}toJSON(e){const t=e===void 0||typeof e=="string";t&&(e={textures:{},images:{}});const n={metadata:{version:4.7,type:"Material",generator:"Material.toJSON"}};n.uuid=this.uuid,n.type=this.type,this.name!==""&&(n.name=this.name),this.color&&this.color.isColor&&(n.color=this.color.getHex()),this.roughness!==void 0&&(n.roughness=this.roughness),this.metalness!==void 0&&(n.metalness=this.metalness),this.sheen!==void 0&&(n.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(n.sheenColor=this.sheenColor.getHex()),this.sheenRoughness!==void 0&&(n.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(n.emissive=this.emissive.getHex()),this.emissiveIntensity!==void 0&&this.emissiveIntensity!==1&&(n.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(n.specular=this.specular.getHex()),this.specularIntensity!==void 0&&(n.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(n.specularColor=this.specularColor.getHex()),this.shininess!==void 0&&(n.shininess=this.shininess),this.clearcoat!==void 0&&(n.clearcoat=this.clearcoat),this.clearcoatRoughness!==void 0&&(n.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(n.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(n.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(n.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,n.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(n.sheenColorMap=this.sheenColorMap.toJSON(e).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(n.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(e).uuid),this.dispersion!==void 0&&(n.dispersion=this.dispersion),this.iridescence!==void 0&&(n.iridescence=this.iridescence),this.iridescenceIOR!==void 0&&(n.iridescenceIOR=this.iridescenceIOR),this.iridescenceThicknessRange!==void 0&&(n.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(n.iridescenceMap=this.iridescenceMap.toJSON(e).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(n.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(e).uuid),this.anisotropy!==void 0&&(n.anisotropy=this.anisotropy),this.anisotropyRotation!==void 0&&(n.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(n.anisotropyMap=this.anisotropyMap.toJSON(e).uuid),this.map&&this.map.isTexture&&(n.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(n.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(n.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(n.lightMap=this.lightMap.toJSON(e).uuid,n.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(n.aoMap=this.aoMap.toJSON(e).uuid,n.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(n.bumpMap=this.bumpMap.toJSON(e).uuid,n.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(n.normalMap=this.normalMap.toJSON(e).uuid,n.normalMapType=this.normalMapType,n.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(n.displacementMap=this.displacementMap.toJSON(e).uuid,n.displacementScale=this.displacementScale,n.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(n.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(n.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(n.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(n.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(n.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(n.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(n.envMap=this.envMap.toJSON(e).uuid,this.combine!==void 0&&(n.combine=this.combine)),this.envMapRotation!==void 0&&(n.envMapRotation=this.envMapRotation.toArray()),this.envMapIntensity!==void 0&&(n.envMapIntensity=this.envMapIntensity),this.reflectivity!==void 0&&(n.reflectivity=this.reflectivity),this.refractionRatio!==void 0&&(n.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(n.gradientMap=this.gradientMap.toJSON(e).uuid),this.transmission!==void 0&&(n.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(n.transmissionMap=this.transmissionMap.toJSON(e).uuid),this.thickness!==void 0&&(n.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(n.thicknessMap=this.thicknessMap.toJSON(e).uuid),this.attenuationDistance!==void 0&&this.attenuationDistance!==1/0&&(n.attenuationDistance=this.attenuationDistance),this.attenuationColor!==void 0&&(n.attenuationColor=this.attenuationColor.getHex()),this.size!==void 0&&(n.size=this.size),this.shadowSide!==null&&(n.shadowSide=this.shadowSide),this.sizeAttenuation!==void 0&&(n.sizeAttenuation=this.sizeAttenuation),this.blending!==ks&&(n.blending=this.blending),this.side!==Pn&&(n.side=this.side),this.vertexColors===!0&&(n.vertexColors=!0),this.opacity<1&&(n.opacity=this.opacity),this.transparent===!0&&(n.transparent=!0),this.blendSrc!==Vl&&(n.blendSrc=this.blendSrc),this.blendDst!==Gl&&(n.blendDst=this.blendDst),this.blendEquation!==Gn&&(n.blendEquation=this.blendEquation),this.blendSrcAlpha!==null&&(n.blendSrcAlpha=this.blendSrcAlpha),this.blendDstAlpha!==null&&(n.blendDstAlpha=this.blendDstAlpha),this.blendEquationAlpha!==null&&(n.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(n.blendColor=this.blendColor.getHex()),this.blendAlpha!==0&&(n.blendAlpha=this.blendAlpha),this.depthFunc!==Us&&(n.depthFunc=this.depthFunc),this.depthTest===!1&&(n.depthTest=this.depthTest),this.depthWrite===!1&&(n.depthWrite=this.depthWrite),this.colorWrite===!1&&(n.colorWrite=this.colorWrite),this.stencilWriteMask!==255&&(n.stencilWriteMask=this.stencilWriteMask),this.stencilFunc!==Ld&&(n.stencilFunc=this.stencilFunc),this.stencilRef!==0&&(n.stencilRef=this.stencilRef),this.stencilFuncMask!==255&&(n.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==Vs&&(n.stencilFail=this.stencilFail),this.stencilZFail!==Vs&&(n.stencilZFail=this.stencilZFail),this.stencilZPass!==Vs&&(n.stencilZPass=this.stencilZPass),this.stencilWrite===!0&&(n.stencilWrite=this.stencilWrite),this.rotation!==void 0&&this.rotation!==0&&(n.rotation=this.rotation),this.polygonOffset===!0&&(n.polygonOffset=!0),this.polygonOffsetFactor!==0&&(n.polygonOffsetFactor=this.polygonOffsetFactor),this.polygonOffsetUnits!==0&&(n.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth!==void 0&&this.linewidth!==1&&(n.linewidth=this.linewidth),this.dashSize!==void 0&&(n.dashSize=this.dashSize),this.gapSize!==void 0&&(n.gapSize=this.gapSize),this.scale!==void 0&&(n.scale=this.scale),this.dithering===!0&&(n.dithering=!0),this.alphaTest>0&&(n.alphaTest=this.alphaTest),this.alphaHash===!0&&(n.alphaHash=!0),this.alphaToCoverage===!0&&(n.alphaToCoverage=!0),this.premultipliedAlpha===!0&&(n.premultipliedAlpha=!0),this.forceSinglePass===!0&&(n.forceSinglePass=!0),this.wireframe===!0&&(n.wireframe=!0),this.wireframeLinewidth>1&&(n.wireframeLinewidth=this.wireframeLinewidth),this.wireframeLinecap!=="round"&&(n.wireframeLinecap=this.wireframeLinecap),this.wireframeLinejoin!=="round"&&(n.wireframeLinejoin=this.wireframeLinejoin),this.flatShading===!0&&(n.flatShading=!0),this.visible===!1&&(n.visible=!1),this.toneMapped===!1&&(n.toneMapped=!1),this.fog===!1&&(n.fog=!1),Object.keys(this.userData).length>0&&(n.userData=this.userData);function i(r){const o=[];for(const a in r){const l=r[a];delete l.metadata,o.push(l)}return o}if(t){const r=i(e.textures),o=i(e.images);r.length>0&&(n.textures=r),o.length>0&&(n.images=o)}return n}clone(){return new this.constructor().copy(this)}copy(e){this.name=e.name,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.blendColor.copy(e.blendColor),this.blendAlpha=e.blendAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const t=e.clippingPlanes;let n=null;if(t!==null){const i=t.length;n=new Array(i);for(let r=0;r!==i;++r)n[r]=t[r].clone()}return this.clippingPlanes=n,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaHash=e.alphaHash,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.forceSinglePass=e.forceSinglePass,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){e===!0&&this.version++}}class Xt extends gn{constructor(e){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new Ue(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new mn,this.combine=Wo,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.fog=e.fog,this}}const Ot=new P,ca=new ce;let px=0;class at{constructor(e,t,n=!1){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:px++}),this.name="",this.array=e,this.itemSize=t,this.count=e!==void 0?e.length/t:0,this.normalized=n,this.usage=zc,this.updateRanges=[],this.gpuType=Xn,this.version=0}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this.gpuType=e.gpuType,this}copyAt(e,t,n){e*=this.itemSize,n*=t.itemSize;for(let i=0,r=this.itemSize;it.count&&He("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),t.needsUpdate=!0}return this}computeBoundingBox(){this.boundingBox===null&&(this.boundingBox=new xt);const e=this.attributes.position,t=this.morphAttributes.position;if(e&&e.isGLBufferAttribute){Qe("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),this.boundingBox.set(new P(-1/0,-1/0,-1/0),new P(1/0,1/0,1/0));return}if(e!==void 0){if(this.boundingBox.setFromBufferAttribute(e),t)for(let n=0,i=t.length;n0&&(e.userData=this.userData),this.parameters!==void 0){const l=this.parameters;for(const c in l)l[c]!==void 0&&(e[c]=l[c]);return e}e.data={attributes:{}};const t=this.index;t!==null&&(e.data.index={type:t.array.constructor.name,array:Array.prototype.slice.call(t.array)});const n=this.attributes;for(const l in n){const c=n[l];e.data.attributes[l]=c.toJSON(e.data)}const i={};let r=!1;for(const l in this.morphAttributes){const c=this.morphAttributes[l],h=[];for(let u=0,d=c.length;u0&&(i[l]=h,r=!0)}r&&(e.data.morphAttributes=i,e.data.morphTargetsRelative=this.morphTargetsRelative);const o=this.groups;o.length>0&&(e.data.groups=JSON.parse(JSON.stringify(o)));const a=this.boundingSphere;return a!==null&&(e.data.boundingSphere=a.toJSON()),e}clone(){return new this.constructor().copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const t={};this.name=e.name;const n=e.index;n!==null&&this.setIndex(n.clone());const i=e.attributes;for(const c in i){const h=i[c];this.setAttribute(c,h.clone(t))}const r=e.morphAttributes;for(const c in r){const h=[],u=r[c];for(let d=0,f=u.length;d0){const i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,o=i.length;r(e.far-e.near)**2))&&(Jd.copy(r).invert(),rs.copy(e.ray).applyMatrix4(Jd),!(n.boundingBox!==null&&rs.intersectsBox(n.boundingBox)===!1)&&this._computeIntersections(e,t,rs)))}_computeIntersections(e,t,n){let i;const r=this.geometry,o=this.material,a=r.index,l=r.attributes.position,c=r.attributes.uv,h=r.attributes.uv1,u=r.attributes.normal,d=r.groups,f=r.drawRange;if(a!==null)if(Array.isArray(o))for(let p=0,g=d.length;pt.far?null:{distance:c,point:ma.clone(),object:s}}function ga(s,e,t,n,i,r,o,a,l,c){s.getVertexPosition(a,ua),s.getVertexPosition(l,da),s.getVertexPosition(c,fa);const h=gx(s,e,t,n,ua,da,fa,ef);if(h){const u=new P;bt.getBarycoord(ef,ua,da,fa,u),i&&(h.uv=bt.getInterpolatedAttribute(i,a,l,c,u,new ce)),r&&(h.uv1=bt.getInterpolatedAttribute(r,a,l,c,u,new ce)),o&&(h.normal=bt.getInterpolatedAttribute(o,a,l,c,u,new P),h.normal.dot(n.direction)>0&&h.normal.multiplyScalar(-1));const d={a,b:l,c,normal:new P,materialIndex:0};bt.getNormal(ua,da,fa,d.normal),h.face=d,h.barycoord=u}return h}class Gi extends ht{constructor(e=1,t=1,n=1,i=1,r=1,o=1){super(),this.type="BoxGeometry",this.parameters={width:e,height:t,depth:n,widthSegments:i,heightSegments:r,depthSegments:o};const a=this;i=Math.floor(i),r=Math.floor(r),o=Math.floor(o);const l=[],c=[],h=[],u=[];let d=0,f=0;p("z","y","x",-1,-1,n,t,e,o,r,0),p("z","y","x",1,-1,n,t,-e,o,r,1),p("x","z","y",1,1,e,n,t,i,o,2),p("x","z","y",1,-1,e,n,-t,i,o,3),p("x","y","z",1,-1,e,t,n,i,r,4),p("x","y","z",-1,-1,e,t,-n,i,r,5),this.setIndex(l),this.setAttribute("position",new nn(c,3)),this.setAttribute("normal",new nn(h,3)),this.setAttribute("uv",new nn(u,2));function p(g,x,m,b,v,y,M,E,A,R,_){const S=y/A,D=M/R,C=y/2,B=M/2,w=E/2,F=A+1,W=R+1;let j=0,$=0;const Z=new P;for(let re=0;re0?1:-1,h.push(Z.x,Z.y,Z.z),u.push(Y/A),u.push(1-re/R),j+=1}}for(let re=0;re0&&(t.defines=this.defines),t.vertexShader=this.vertexShader,t.fragmentShader=this.fragmentShader,t.lights=this.lights,t.clipping=this.clipping;const n={};for(const i in this.extensions)this.extensions[i]===!0&&(n[i]=!0);return Object.keys(n).length>0&&(t.extensions=n),t}}class sf extends St{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new ze,this.projectionMatrix=new ze,this.projectionMatrixInverse=new ze,this.coordinateSystem=si,this._reversedDepth=!1}get reversedDepth(){return this._reversedDepth}copy(e,t){return super.copy(e,t),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this.projectionMatrixInverse.copy(e.projectionMatrixInverse),this.coordinateSystem=e.coordinateSystem,this}getWorldDirection(e){return super.getWorldDirection(e).negate()}updateMatrixWorld(e){super.updateMatrixWorld(e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(e,t){super.updateWorldMatrix(e,t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}}const Wi=new P,rf=new ce,of=new ce;class sn extends sf{constructor(e=50,t=1,n=.1,i=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=e,this.zoom=1,this.near=n,this.far=i,this.focus=10,this.aspect=t,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=e.view===null?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this}setFocalLength(e){const t=.5*this.getFilmHeight()/e;this.fov=Gs*2*Math.atan(t),this.updateProjectionMatrix()}getFocalLength(){const e=Math.tan($r*.5*this.fov);return .5*this.getFilmHeight()/e}getEffectiveFOV(){return Gs*2*Math.atan(Math.tan($r*.5*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(e,t,n){Wi.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),t.set(Wi.x,Wi.y).multiplyScalar(-e/Wi.z),Wi.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),n.set(Wi.x,Wi.y).multiplyScalar(-e/Wi.z)}getViewSize(e,t){return this.getViewBounds(e,rf,of),t.subVectors(of,rf)}setViewOffset(e,t,n,i,r,o){this.aspect=e/t,this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=n,this.view.offsetY=i,this.view.width=r,this.view.height=o,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=this.near;let t=e*Math.tan($r*.5*this.fov)/this.zoom,n=2*t,i=this.aspect*n,r=-.5*i;const o=this.view;if(this.view!==null&&this.view.enabled){const l=o.fullWidth,c=o.fullHeight;r+=o.offsetX*i/l,t-=o.offsetY*n/c,i*=o.width/l,n*=o.height/c}const a=this.filmOffset;a!==0&&(r+=e*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+i,t,t-n,e,this.far,this.coordinateSystem,this.reversedDepth),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const t=super.toJSON(e);return t.object.fov=this.fov,t.object.zoom=this.zoom,t.object.near=this.near,t.object.far=this.far,t.object.focus=this.focus,t.object.aspect=this.aspect,this.view!==null&&(t.object.view=Object.assign({},this.view)),t.object.filmGauge=this.filmGauge,t.object.filmOffset=this.filmOffset,t}}const nr=-90,ir=1;class _x extends St{constructor(e,t,n){super(),this.type="CubeCamera",this.renderTarget=n,this.coordinateSystem=null,this.activeMipmapLevel=0;const i=new sn(nr,ir,e,t);i.layers=this.layers,this.add(i);const r=new sn(nr,ir,e,t);r.layers=this.layers,this.add(r);const o=new sn(nr,ir,e,t);o.layers=this.layers,this.add(o);const a=new sn(nr,ir,e,t);a.layers=this.layers,this.add(a);const l=new sn(nr,ir,e,t);l.layers=this.layers,this.add(l);const c=new sn(nr,ir,e,t);c.layers=this.layers,this.add(c)}updateCoordinateSystem(){const e=this.coordinateSystem,t=this.children.concat(),[n,i,r,o,a,l]=t;for(const c of t)this.remove(c);if(e===si)n.up.set(0,1,0),n.lookAt(1,0,0),i.up.set(0,1,0),i.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),o.up.set(0,0,1),o.lookAt(0,-1,0),a.up.set(0,1,0),a.lookAt(0,0,1),l.up.set(0,1,0),l.lookAt(0,0,-1);else if(e===Qo)n.up.set(0,-1,0),n.lookAt(-1,0,0),i.up.set(0,-1,0),i.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),o.up.set(0,0,-1),o.lookAt(0,-1,0),a.up.set(0,-1,0),a.lookAt(0,0,1),l.up.set(0,-1,0),l.lookAt(0,0,-1);else throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+e);for(const c of t)this.add(c),c.updateMatrixWorld()}update(e,t){this.parent===null&&this.updateMatrixWorld();const{renderTarget:n,activeMipmapLevel:i}=this;this.coordinateSystem!==e.coordinateSystem&&(this.coordinateSystem=e.coordinateSystem,this.updateCoordinateSystem());const[r,o,a,l,c,h]=this.children,u=e.getRenderTarget(),d=e.getActiveCubeFace(),f=e.getActiveMipmapLevel(),p=e.xr.enabled;e.xr.enabled=!1;const g=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,e.setRenderTarget(n,0,i),e.render(t,r),e.setRenderTarget(n,1,i),e.render(t,o),e.setRenderTarget(n,2,i),e.render(t,a),e.setRenderTarget(n,3,i),e.render(t,l),e.setRenderTarget(n,4,i),e.render(t,c),n.texture.generateMipmaps=g,e.setRenderTarget(n,5,i),e.render(t,h),e.setRenderTarget(u,d,f),e.xr.enabled=p,n.texture.needsPMREMUpdate=!0}}class af extends Ht{constructor(e=[],t=Os,n,i,r,o,a,l,c,h){super(e,t,n,i,r,o,a,l,c,h),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(e){this.image=e}}class Mx extends pn{constructor(e=1,t={}){super(e,e,t),this.isWebGLCubeRenderTarget=!0;const n={width:e,height:e,depth:1},i=[n,n,n,n,n,n];this.texture=new af(i),this._setTextureOptions(t),this.texture.isRenderTargetTexture=!0}fromEquirectangularTexture(e,t){this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:` +}`;class kt extends gn{constructor(e){super(),this.isShaderMaterial=!0,this.type="ShaderMaterial",this.defines={},this.uniforms={},this.uniformsGroups=[],this.vertexShader=vx,this.fragmentShader=bx,this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.forceSinglePass=!0,this.extensions={clipCullDistance:!1,multiDraw:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv1:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,this.glslVersion=null,e!==void 0&&this.setValues(e)}copy(e){return super.copy(e),this.fragmentShader=e.fragmentShader,this.vertexShader=e.vertexShader,this.uniforms=tr(e.uniforms),this.uniformsGroups=xx(e.uniformsGroups),this.defines=Object.assign({},e.defines),this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.fog=e.fog,this.lights=e.lights,this.clipping=e.clipping,this.extensions=Object.assign({},e.extensions),this.glslVersion=e.glslVersion,this}toJSON(e){const t=super.toJSON(e);t.glslVersion=this.glslVersion,t.uniforms={};for(const i in this.uniforms){const o=this.uniforms[i].value;o&&o.isTexture?t.uniforms[i]={type:"t",value:o.toJSON(e).uuid}:o&&o.isColor?t.uniforms[i]={type:"c",value:o.getHex()}:o&&o.isVector2?t.uniforms[i]={type:"v2",value:o.toArray()}:o&&o.isVector3?t.uniforms[i]={type:"v3",value:o.toArray()}:o&&o.isVector4?t.uniforms[i]={type:"v4",value:o.toArray()}:o&&o.isMatrix3?t.uniforms[i]={type:"m3",value:o.toArray()}:o&&o.isMatrix4?t.uniforms[i]={type:"m4",value:o.toArray()}:t.uniforms[i]={value:o}}Object.keys(this.defines).length>0&&(t.defines=this.defines),t.vertexShader=this.vertexShader,t.fragmentShader=this.fragmentShader,t.lights=this.lights,t.clipping=this.clipping;const n={};for(const i in this.extensions)this.extensions[i]===!0&&(n[i]=!0);return Object.keys(n).length>0&&(t.extensions=n),t}}class nf extends St{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new ze,this.projectionMatrix=new ze,this.projectionMatrixInverse=new ze,this.coordinateSystem=si,this._reversedDepth=!1}get reversedDepth(){return this._reversedDepth}copy(e,t){return super.copy(e,t),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this.projectionMatrixInverse.copy(e.projectionMatrixInverse),this.coordinateSystem=e.coordinateSystem,this}getWorldDirection(e){return super.getWorldDirection(e).negate()}updateMatrixWorld(e){super.updateMatrixWorld(e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(e,t){super.updateWorldMatrix(e,t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return new this.constructor().copy(this)}}const Wi=new P,sf=new ce,rf=new ce;class sn extends nf{constructor(e=50,t=1,n=.1,i=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=e,this.zoom=1,this.near=n,this.far=i,this.focus=10,this.aspect=t,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=e.view===null?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this}setFocalLength(e){const t=.5*this.getFilmHeight()/e;this.fov=Gs*2*Math.atan(t),this.updateProjectionMatrix()}getFocalLength(){const e=Math.tan($r*.5*this.fov);return .5*this.getFilmHeight()/e}getEffectiveFOV(){return Gs*2*Math.atan(Math.tan($r*.5*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(e,t,n){Wi.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),t.set(Wi.x,Wi.y).multiplyScalar(-e/Wi.z),Wi.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),n.set(Wi.x,Wi.y).multiplyScalar(-e/Wi.z)}getViewSize(e,t){return this.getViewBounds(e,sf,rf),t.subVectors(rf,sf)}setViewOffset(e,t,n,i,r,o){this.aspect=e/t,this.view===null&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=n,this.view.offsetY=i,this.view.width=r,this.view.height=o,this.updateProjectionMatrix()}clearViewOffset(){this.view!==null&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=this.near;let t=e*Math.tan($r*.5*this.fov)/this.zoom,n=2*t,i=this.aspect*n,r=-.5*i;const o=this.view;if(this.view!==null&&this.view.enabled){const l=o.fullWidth,c=o.fullHeight;r+=o.offsetX*i/l,t-=o.offsetY*n/c,i*=o.width/l,n*=o.height/c}const a=this.filmOffset;a!==0&&(r+=e*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+i,t,t-n,e,this.far,this.coordinateSystem,this.reversedDepth),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const t=super.toJSON(e);return t.object.fov=this.fov,t.object.zoom=this.zoom,t.object.near=this.near,t.object.far=this.far,t.object.focus=this.focus,t.object.aspect=this.aspect,this.view!==null&&(t.object.view=Object.assign({},this.view)),t.object.filmGauge=this.filmGauge,t.object.filmOffset=this.filmOffset,t}}const nr=-90,ir=1;class yx extends St{constructor(e,t,n){super(),this.type="CubeCamera",this.renderTarget=n,this.coordinateSystem=null,this.activeMipmapLevel=0;const i=new sn(nr,ir,e,t);i.layers=this.layers,this.add(i);const r=new sn(nr,ir,e,t);r.layers=this.layers,this.add(r);const o=new sn(nr,ir,e,t);o.layers=this.layers,this.add(o);const a=new sn(nr,ir,e,t);a.layers=this.layers,this.add(a);const l=new sn(nr,ir,e,t);l.layers=this.layers,this.add(l);const c=new sn(nr,ir,e,t);c.layers=this.layers,this.add(c)}updateCoordinateSystem(){const e=this.coordinateSystem,t=this.children.concat(),[n,i,r,o,a,l]=t;for(const c of t)this.remove(c);if(e===si)n.up.set(0,1,0),n.lookAt(1,0,0),i.up.set(0,1,0),i.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),o.up.set(0,0,1),o.lookAt(0,-1,0),a.up.set(0,1,0),a.lookAt(0,0,1),l.up.set(0,1,0),l.lookAt(0,0,-1);else if(e===Qo)n.up.set(0,-1,0),n.lookAt(-1,0,0),i.up.set(0,-1,0),i.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),o.up.set(0,0,-1),o.lookAt(0,-1,0),a.up.set(0,-1,0),a.lookAt(0,0,1),l.up.set(0,-1,0),l.lookAt(0,0,-1);else throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+e);for(const c of t)this.add(c),c.updateMatrixWorld()}update(e,t){this.parent===null&&this.updateMatrixWorld();const{renderTarget:n,activeMipmapLevel:i}=this;this.coordinateSystem!==e.coordinateSystem&&(this.coordinateSystem=e.coordinateSystem,this.updateCoordinateSystem());const[r,o,a,l,c,h]=this.children,u=e.getRenderTarget(),d=e.getActiveCubeFace(),f=e.getActiveMipmapLevel(),p=e.xr.enabled;e.xr.enabled=!1;const g=n.texture.generateMipmaps;n.texture.generateMipmaps=!1,e.setRenderTarget(n,0,i),e.render(t,r),e.setRenderTarget(n,1,i),e.render(t,o),e.setRenderTarget(n,2,i),e.render(t,a),e.setRenderTarget(n,3,i),e.render(t,l),e.setRenderTarget(n,4,i),e.render(t,c),n.texture.generateMipmaps=g,e.setRenderTarget(n,5,i),e.render(t,h),e.setRenderTarget(u,d,f),e.xr.enabled=p,n.texture.needsPMREMUpdate=!0}}class of extends Ht{constructor(e=[],t=Os,n,i,r,o,a,l,c,h){super(e,t,n,i,r,o,a,l,c,h),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(e){this.image=e}}class _x extends pn{constructor(e=1,t={}){super(e,e,t),this.isWebGLCubeRenderTarget=!0;const n={width:e,height:e,depth:1},i=[n,n,n,n,n,n];this.texture=new of(i),this._setTextureOptions(t),this.texture.isRenderTargetTexture=!0}fromEquirectangularTexture(e,t){this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const n={uniforms:{tEquirect:{value:null}},vertexShader:` varying vec3 vWorldDirection; @@ -43,9 +43,9 @@ gl_FragColor = texture2D( tEquirect, sampleUV ); } - `},i=new Gi(5,5,5),r=new kt({name:"CubemapFromEquirect",uniforms:tr(n.uniforms),vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,side:on,blending:Wt});r.uniforms.tEquirect.value=t;const o=new ut(i,r),a=t.minFilter;return t.minFilter===gi&&(t.minFilter=$t),new _x(1,10,this).update(e,o),t.minFilter=a,o.geometry.dispose(),o.material.dispose(),this}clear(e,t=!0,n=!0,i=!0){const r=e.getRenderTarget();for(let o=0;o<6;o++)e.setRenderTarget(this,o),e.clear(t,n,i);e.setRenderTarget(r)}}class xn extends St{constructor(){super(),this.isGroup=!0,this.type="Group"}}const wx={type:"move"};class hh{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return this._hand===null&&(this._hand=new xn,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return this._targetRay===null&&(this._targetRay=new xn,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new P,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new P),this._targetRay}getGripSpace(){return this._grip===null&&(this._grip=new xn,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new P,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new P),this._grip}dispatchEvent(e){return this._targetRay!==null&&this._targetRay.dispatchEvent(e),this._grip!==null&&this._grip.dispatchEvent(e),this._hand!==null&&this._hand.dispatchEvent(e),this}connect(e){if(e&&e.hand){const t=this._hand;if(t)for(const n of e.hand.values())this._getHandJoint(t,n)}return this.dispatchEvent({type:"connected",data:e}),this}disconnect(e){return this.dispatchEvent({type:"disconnected",data:e}),this._targetRay!==null&&(this._targetRay.visible=!1),this._grip!==null&&(this._grip.visible=!1),this._hand!==null&&(this._hand.visible=!1),this}update(e,t,n){let i=null,r=null,o=null;const a=this._targetRay,l=this._grip,c=this._hand;if(e&&t.session.visibilityState!=="visible-blurred"){if(c&&e.hand){o=!0;for(const g of e.hand.values()){const x=t.getJointPose(g,n),m=this._getHandJoint(c,g);x!==null&&(m.matrix.fromArray(x.transform.matrix),m.matrix.decompose(m.position,m.rotation,m.scale),m.matrixWorldNeedsUpdate=!0,m.jointRadius=x.radius),m.visible=x!==null}const h=c.joints["index-finger-tip"],u=c.joints["thumb-tip"],d=h.position.distanceTo(u.position),f=.02,p=.005;c.inputState.pinching&&d>f+p?(c.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:e.handedness,target:this})):!c.inputState.pinching&&d<=f-p&&(c.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:e.handedness,target:this}))}else l!==null&&e.gripSpace&&(r=t.getPose(e.gripSpace,n),r!==null&&(l.matrix.fromArray(r.transform.matrix),l.matrix.decompose(l.position,l.rotation,l.scale),l.matrixWorldNeedsUpdate=!0,r.linearVelocity?(l.hasLinearVelocity=!0,l.linearVelocity.copy(r.linearVelocity)):l.hasLinearVelocity=!1,r.angularVelocity?(l.hasAngularVelocity=!0,l.angularVelocity.copy(r.angularVelocity)):l.hasAngularVelocity=!1));a!==null&&(i=t.getPose(e.targetRaySpace,n),i===null&&r!==null&&(i=r),i!==null&&(a.matrix.fromArray(i.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),a.matrixWorldNeedsUpdate=!0,i.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(i.linearVelocity)):a.hasLinearVelocity=!1,i.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(i.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(wx)))}return a!==null&&(a.visible=i!==null),l!==null&&(l.visible=r!==null),c!==null&&(c.visible=o!==null),this}_getHandJoint(e,t){if(e.joints[t.jointName]===void 0){const n=new xn;n.matrixAutoUpdate=!1,n.visible=!1,e.joints[t.jointName]=n,e.add(n)}return e.joints[t.jointName]}}class lf extends St{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new mn,this.environmentIntensity=1,this.environmentRotation=new mn,this.overrideMaterial=null,typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(e,t){return super.copy(e,t),e.background!==null&&(this.background=e.background.clone()),e.environment!==null&&(this.environment=e.environment.clone()),e.fog!==null&&(this.fog=e.fog.clone()),this.backgroundBlurriness=e.backgroundBlurriness,this.backgroundIntensity=e.backgroundIntensity,this.backgroundRotation.copy(e.backgroundRotation),this.environmentIntensity=e.environmentIntensity,this.environmentRotation.copy(e.environmentRotation),e.overrideMaterial!==null&&(this.overrideMaterial=e.overrideMaterial.clone()),this.matrixAutoUpdate=e.matrixAutoUpdate,this}toJSON(e){const t=super.toJSON(e);return this.fog!==null&&(t.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(t.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(t.object.backgroundIntensity=this.backgroundIntensity),t.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(t.object.environmentIntensity=this.environmentIntensity),t.object.environmentRotation=this.environmentRotation.toArray(),t}}class uh{constructor(e,t){this.isInterleavedBuffer=!0,this.array=e,this.stride=t,this.count=e!==void 0?e.length/t:0,this.usage=zc,this.updateRanges=[],this.version=0,this.uuid=Ln()}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.array=new e.array.constructor(e.array),this.count=e.count,this.stride=e.stride,this.usage=e.usage,this}copyAt(e,t,n){e*=this.stride,n*=t.stride;for(let i=0,r=this.stride;ie.far||t.push({distance:l,point:so.clone(),uv:yt.getInterpolation(so,xa,oo,va,hf,dh,uf,new ce),face:null,object:this})}copy(e,t){return super.copy(e,t),e.center!==void 0&&this.center.copy(e.center),this.material=e.material,this}}function ba(s,e,t,n,i,r){lr.subVectors(s,t).addScalar(.5).multiply(n),i!==void 0?(ro.x=r*lr.x-i*lr.y,ro.y=i*lr.x+r*lr.y):ro.copy(lr),s.copy(e),s.x+=ro.x,s.y+=ro.y,s.applyMatrix4(cf)}const df=new P,ff=new tt,pf=new tt,Tx=new P,mf=new ze,ya=new P,fh=new ri,gf=new ze,ph=new zi;class Ax extends ut{constructor(e,t){super(e,t),this.isSkinnedMesh=!0,this.type="SkinnedMesh",this.bindMode=bd,this.bindMatrix=new ze,this.bindMatrixInverse=new ze,this.boundingBox=null,this.boundingSphere=null}computeBoundingBox(){const e=this.geometry;this.boundingBox===null&&(this.boundingBox=new xt),this.boundingBox.makeEmpty();const t=e.getAttribute("position");for(let n=0;n1?null:t.copy(e.start).addScaledVector(n,r)}intersectsLine(e){const t=this.distanceToPoint(e.start),n=this.distanceToPoint(e.end);return t<0&&n>0||n<0&&t>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,t){const n=t||Lx.getNormalMatrix(e),i=this.coplanarPoint(xh).applyMatrix4(e),r=this.normal.applyMatrix3(n).normalize();return this.constant=-i.dot(r),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return new this.constructor().copy(this)}}const os=new ri,Dx=new ce(.5,.5),Ma=new P;class vh{constructor(e=new _t,t=new _t,n=new _t,i=new _t,r=new _t,o=new _t){this.planes=[e,t,n,i,r,o]}set(e,t,n,i,r,o){const a=this.planes;return a[0].copy(e),a[1].copy(t),a[2].copy(n),a[3].copy(i),a[4].copy(r),a[5].copy(o),this}copy(e){const t=this.planes;for(let n=0;n<6;n++)t[n].copy(e.planes[n]);return this}setFromProjectionMatrix(e,t=si,n=!1){const i=this.planes,r=e.elements,o=r[0],a=r[1],l=r[2],c=r[3],h=r[4],u=r[5],d=r[6],f=r[7],p=r[8],g=r[9],x=r[10],m=r[11],b=r[12],v=r[13],y=r[14],M=r[15];if(i[0].setComponents(c-o,f-h,m-p,M-b).normalize(),i[1].setComponents(c+o,f+h,m+p,M+b).normalize(),i[2].setComponents(c+a,f+u,m+g,M+v).normalize(),i[3].setComponents(c-a,f-u,m-g,M-v).normalize(),n)i[4].setComponents(l,d,x,y).normalize(),i[5].setComponents(c-l,f-d,m-x,M-y).normalize();else if(i[4].setComponents(c-l,f-d,m-x,M-y).normalize(),t===si)i[5].setComponents(c+l,f+d,m+x,M+y).normalize();else if(t===Qo)i[5].setComponents(l,d,x,y).normalize();else throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+t);return this}intersectsObject(e){if(e.boundingSphere!==void 0)e.boundingSphere===null&&e.computeBoundingSphere(),os.copy(e.boundingSphere).applyMatrix4(e.matrixWorld);else{const t=e.geometry;t.boundingSphere===null&&t.computeBoundingSphere(),os.copy(t.boundingSphere).applyMatrix4(e.matrixWorld)}return this.intersectsSphere(os)}intersectsSprite(e){os.center.set(0,0,0);const t=Dx.distanceTo(e.center);return os.radius=.7071067811865476+t,os.applyMatrix4(e.matrixWorld),this.intersectsSphere(os)}intersectsSphere(e){const t=this.planes,n=e.center,i=-e.radius;for(let r=0;r<6;r++)if(t[r].distanceToPoint(n)0?e.max.x:e.min.x,Ma.y=i.normal.y>0?e.max.y:e.min.y,Ma.z=i.normal.z>0?e.max.z:e.min.z,i.distanceToPoint(Ma)<0)return!1}return!0}containsPoint(e){const t=this.planes;for(let n=0;n<6;n++)if(t[n].distanceToPoint(e)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}}class as extends gn{constructor(e){super(),this.isLineBasicMaterial=!0,this.type="LineBasicMaterial",this.color=new Ue(16777215),this.map=null,this.linewidth=1,this.linecap="round",this.linejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this.fog=e.fog,this}}const wa=new P,Sa=new P,_f=new ze,uo=new zi,Ea=new ri,bh=new P,Mf=new P;class Xi extends St{constructor(e=new ht,t=new as){super(),this.isLine=!0,this.type="Line",this.geometry=e,this.material=t,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}computeLineDistances(){const e=this.geometry;if(e.index===null){const t=e.attributes.position,n=[0];for(let i=1,r=t.count;i0){const i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,o=i.length;rn)return;bh.applyMatrix4(s.matrixWorld);const c=e.ray.origin.distanceTo(bh);if(!(ce.far))return{distance:c,point:Mf.clone().applyMatrix4(s.matrixWorld),index:o,face:null,faceIndex:null,barycoord:null,object:s}}const wf=new P,Sf=new P;class Ef extends Xi{constructor(e,t){super(e,t),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const e=this.geometry;if(e.index===null){const t=e.attributes.position,n=[];for(let i=0,r=t.count;i0){const i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,o=i.length;ri.far)return;r.push({distance:c,distanceToRay:Math.sqrt(a),point:l,index:e,face:null,faceIndex:null,barycoord:null,object:o})}}class _h extends Ht{constructor(e,t,n=ts,i,r,o,a=Kt,l=Kt,c,h=Xr,u=1){if(h!==Xr&&h!==Hs)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");const d={width:e,height:t,depth:u};super(d,i,r,o,a,l,h,n,c),this.isDepthTexture=!0,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(e){return super.copy(e),this.source=new Wc(Object.assign({},e.image)),this.compareFunction=e.compareFunction,this}toJSON(e){const t=super.toJSON(e);return this.compareFunction!==null&&(t.compareFunction=this.compareFunction),t}}class Rf extends Ht{constructor(e=null){super(),this.sourceTexture=e,this.isExternalTexture=!0}copy(e){return super.copy(e),this.sourceTexture=e.sourceTexture,this}}class ai{constructor(){this.type="Curve",this.arcLengthDivisions=200,this.needsUpdate=!1,this.cacheArcLengths=null}getPoint(){He("Curve: .getPoint() not implemented.")}getPointAt(e,t){const n=this.getUtoTmapping(e);return this.getPoint(n,t)}getPoints(e=5){const t=[];for(let n=0;n<=e;n++)t.push(this.getPoint(n/e));return t}getSpacedPoints(e=5){const t=[];for(let n=0;n<=e;n++)t.push(this.getPointAt(n/e));return t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===e+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const t=[];let n,i=this.getPoint(0),r=0;t.push(0);for(let o=1;o<=e;o++)n=this.getPoint(o/e),r+=n.distanceTo(i),t.push(r),i=n;return this.cacheArcLengths=t,t}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(e,t=null){const n=this.getLengths();let i=0;const r=n.length;let o;t?o=t:o=e*n[r-1];let a=0,l=r-1,c;for(;a<=l;)if(i=Math.floor(a+(l-a)/2),c=n[i]-o,c<0)a=i+1;else if(c>0)l=i-1;else{l=i;break}if(i=l,n[i]===o)return i/(r-1);const h=n[i],d=n[i+1]-h,f=(o-h)/d;return(i+f)/(r-1)}getTangent(e,t){let i=e-1e-4,r=e+1e-4;i<0&&(i=0),r>1&&(r=1);const o=this.getPoint(i),a=this.getPoint(r),l=t||(o.isVector2?new ce:new P);return l.copy(a).sub(o).normalize(),l}getTangentAt(e,t){const n=this.getUtoTmapping(e);return this.getTangent(n,t)}computeFrenetFrames(e,t=!1){const n=new P,i=[],r=[],o=[],a=new P,l=new ze;for(let f=0;f<=e;f++){const p=f/e;i[f]=this.getTangentAt(p,new P)}r[0]=new P,o[0]=new P;let c=Number.MAX_VALUE;const h=Math.abs(i[0].x),u=Math.abs(i[0].y),d=Math.abs(i[0].z);h<=c&&(c=h,n.set(1,0,0)),u<=c&&(c=u,n.set(0,1,0)),d<=c&&n.set(0,0,1),a.crossVectors(i[0],n).normalize(),r[0].crossVectors(i[0],a),o[0].crossVectors(i[0],r[0]);for(let f=1;f<=e;f++){if(r[f]=r[f-1].clone(),o[f]=o[f-1].clone(),a.crossVectors(i[f-1],i[f]),a.length()>Number.EPSILON){a.normalize();const p=Math.acos(qe(i[f-1].dot(i[f]),-1,1));r[f].applyMatrix4(l.makeRotationAxis(a,p))}o[f].crossVectors(i[f],r[f])}if(t===!0){let f=Math.acos(qe(r[0].dot(r[e]),-1,1));f/=e,i[0].dot(a.crossVectors(r[0],r[e]))>0&&(f=-f);for(let p=1;p<=e;p++)r[p].applyMatrix4(l.makeRotationAxis(i[p],f*p)),o[p].crossVectors(i[p],r[p])}return{tangents:i,normals:r,binormals:o}}clone(){return new this.constructor().copy(this)}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}toJSON(){const e={metadata:{version:4.7,type:"Curve",generator:"Curve.toJSON"}};return e.arcLengthDivisions=this.arcLengthDivisions,e.type=this.type,e}fromJSON(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}class Mh extends ai{constructor(e=0,t=0,n=1,i=1,r=0,o=Math.PI*2,a=!1,l=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=e,this.aY=t,this.xRadius=n,this.yRadius=i,this.aStartAngle=r,this.aEndAngle=o,this.aClockwise=a,this.aRotation=l}getPoint(e,t=new ce){const n=t,i=Math.PI*2;let r=this.aEndAngle-this.aStartAngle;const o=Math.abs(r)i;)r-=i;r0?0:(Math.floor(Math.abs(a)/r)+1)*r:l===0&&a===r-1&&(a=r-2,l=1);let c,h;this.closed||a>0?c=i[(a-1)%r]:(Pa.subVectors(i[0],i[1]).add(i[0]),c=Pa);const u=i[a%r],d=i[(a+1)%r];if(this.closed||a+2i.length-2?i.length-1:o+1],u=i[o>i.length-3?i.length-1:o+2];return n.set(Lf(a,l.x,c.x,h.x,u.x),Lf(a,l.y,c.y,h.y,u.y)),n}copy(e){super.copy(e),this.points=[];for(let t=0,n=e.points.length;t=n){const o=i[r]-n,a=this.curves[r],l=a.getLength(),c=l===0?0:1-o/l;return a.getPointAt(c,t)}r++}return null}getLength(){const e=this.getCurveLengths();return e[e.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const e=[];let t=0;for(let n=0,i=this.curves.length;n1&&!t[t.length-1].equals(t[0])&&t.push(t[0]),t}copy(e){super.copy(e),this.curves=[];for(let t=0,n=e.curves.length;t0){const u=c.getPoint(0);u.equals(this.currentPoint)||this.lineTo(u.x,u.y)}this.curves.push(c);const h=c.getPoint(1);return this.currentPoint.copy(h),this}copy(e){return super.copy(e),this.currentPoint.copy(e.currentPoint),this}toJSON(){const e=super.toJSON();return e.currentPoint=this.currentPoint.toArray(),e}fromJSON(e){return super.fromJSON(e),this.currentPoint.fromArray(e.currentPoint),this}}class Uf extends kf{constructor(e){super(e),this.uuid=Ln(),this.type="Shape",this.holes=[]}getPointsHoles(e){const t=[];for(let n=0,i=this.holes.length;n80*t){a=s[0],l=s[1];let h=a,u=l;for(let d=t;dh&&(h=f),p>u&&(u=p)}c=Math.max(h-a,u-l),c=c!==0?32767/c:0}return mo(r,o,t,a,l,c,0),o}function Of(s,e,t,n,i){let r;if(i===cv(s,e,t,n)>0)for(let o=e;o=e;o-=n)r=Vf(o/n|0,s[o],s[o+1],r);return r&&hr(r,r.next)&&(vo(r),r=r.next),r}function ls(s,e){if(!s)return s;e||(e=s);let t=s,n;do if(n=!1,!t.steiner&&(hr(t,t.next)||Tt(t.prev,t,t.next)===0)){if(vo(t),t=e=t.prev,t===t.next)break;n=!0}else t=t.next;while(n||t!==e);return e}function mo(s,e,t,n,i,r,o){if(!s)return;!o&&r&&iv(s,n,i,r);let a=s;for(;s.prev!==s.next;){const l=s.prev,c=s.next;if(r?Yx(s,n,i,r):Zx(s)){e.push(l.i,s.i,c.i),vo(s),s=c.next,a=c.next;continue}if(s=c,s===a){o?o===1?(s=Kx(ls(s),e),mo(s,e,t,n,i,r,2)):o===2&&$x(s,e,t,n,i,r):mo(ls(s),e,t,n,i,r,1);break}}}function Zx(s){const e=s.prev,t=s,n=s.next;if(Tt(e,t,n)>=0)return!1;const i=e.x,r=t.x,o=n.x,a=e.y,l=t.y,c=n.y,h=Math.min(i,r,o),u=Math.min(a,l,c),d=Math.max(i,r,o),f=Math.max(a,l,c);let p=n.next;for(;p!==e;){if(p.x>=h&&p.x<=d&&p.y>=u&&p.y<=f&&go(i,a,r,l,o,c,p.x,p.y)&&Tt(p.prev,p,p.next)>=0)return!1;p=p.next}return!0}function Yx(s,e,t,n){const i=s.prev,r=s,o=s.next;if(Tt(i,r,o)>=0)return!1;const a=i.x,l=r.x,c=o.x,h=i.y,u=r.y,d=o.y,f=Math.min(a,l,c),p=Math.min(h,u,d),g=Math.max(a,l,c),x=Math.max(h,u,d),m=Ch(f,p,e,t,n),b=Ch(g,x,e,t,n);let v=s.prevZ,y=s.nextZ;for(;v&&v.z>=m&&y&&y.z<=b;){if(v.x>=f&&v.x<=g&&v.y>=p&&v.y<=x&&v!==i&&v!==o&&go(a,h,l,u,c,d,v.x,v.y)&&Tt(v.prev,v,v.next)>=0||(v=v.prevZ,y.x>=f&&y.x<=g&&y.y>=p&&y.y<=x&&y!==i&&y!==o&&go(a,h,l,u,c,d,y.x,y.y)&&Tt(y.prev,y,y.next)>=0))return!1;y=y.nextZ}for(;v&&v.z>=m;){if(v.x>=f&&v.x<=g&&v.y>=p&&v.y<=x&&v!==i&&v!==o&&go(a,h,l,u,c,d,v.x,v.y)&&Tt(v.prev,v,v.next)>=0)return!1;v=v.prevZ}for(;y&&y.z<=b;){if(y.x>=f&&y.x<=g&&y.y>=p&&y.y<=x&&y!==i&&y!==o&&go(a,h,l,u,c,d,y.x,y.y)&&Tt(y.prev,y,y.next)>=0)return!1;y=y.nextZ}return!0}function Kx(s,e){let t=s;do{const n=t.prev,i=t.next.next;!hr(n,i)&&zf(n,t,t.next,i)&&xo(n,i)&&xo(i,n)&&(e.push(n.i,t.i,i.i),vo(t),vo(t.next),t=s=i),t=t.next}while(t!==s);return ls(t)}function $x(s,e,t,n,i,r){let o=s;do{let a=o.next.next;for(;a!==o.prev;){if(o.i!==a.i&&ov(o,a)){let l=Hf(o,a);o=ls(o,o.next),l=ls(l,l.next),mo(o,e,t,n,i,r,0),mo(l,e,t,n,i,r,0);return}a=a.next}o=o.next}while(o!==s)}function Jx(s,e,t,n){const i=[];for(let r=0,o=e.length;r=t.next.y&&t.next.y!==t.y){const u=t.x+(i-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(u<=n&&u>r&&(r=u,o=t.x=t.x&&t.x>=l&&n!==t.x&&Ff(io.x||t.x===o.x&&nv(o,t)))&&(o=t,h=u)}t=t.next}while(t!==a);return o}function nv(s,e){return Tt(s.prev,s,e.prev)<0&&Tt(e.next,s,s.next)<0}function iv(s,e,t,n){let i=s;do i.z===0&&(i.z=Ch(i.x,i.y,e,t,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==s);i.prevZ.nextZ=null,i.prevZ=null,sv(i)}function sv(s){let e,t=1;do{let n=s,i;s=null;let r=null;for(e=0;n;){e++;let o=n,a=0;for(let c=0;c0||l>0&&o;)a!==0&&(l===0||!o||n.z<=o.z)?(i=n,n=n.nextZ,a--):(i=o,o=o.nextZ,l--),r?r.nextZ=i:s=i,i.prevZ=r,r=i;n=o}r.nextZ=null,t*=2}while(e>1);return s}function Ch(s,e,t,n,i){return s=(s-t)*i|0,e=(e-n)*i|0,s=(s|s<<8)&16711935,s=(s|s<<4)&252645135,s=(s|s<<2)&858993459,s=(s|s<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,s|e<<1}function rv(s){let e=s,t=s;do(e.x=(s-o)*(r-a)&&(s-o)*(n-a)>=(t-o)*(e-a)&&(t-o)*(r-a)>=(i-o)*(n-a)}function go(s,e,t,n,i,r,o,a){return!(s===o&&e===a)&&Ff(s,e,t,n,i,r,o,a)}function ov(s,e){return s.next.i!==e.i&&s.prev.i!==e.i&&!av(s,e)&&(xo(s,e)&&xo(e,s)&&lv(s,e)&&(Tt(s.prev,s,e.prev)||Tt(s,e.prev,e))||hr(s,e)&&Tt(s.prev,s,s.next)>0&&Tt(e.prev,e,e.next)>0)}function Tt(s,e,t){return(e.y-s.y)*(t.x-e.x)-(e.x-s.x)*(t.y-e.y)}function hr(s,e){return s.x===e.x&&s.y===e.y}function zf(s,e,t,n){const i=La(Tt(s,e,t)),r=La(Tt(s,e,n)),o=La(Tt(t,n,s)),a=La(Tt(t,n,e));return!!(i!==r&&o!==a||i===0&&Ra(s,t,e)||r===0&&Ra(s,n,e)||o===0&&Ra(t,s,n)||a===0&&Ra(t,e,n))}function Ra(s,e,t){return e.x<=Math.max(s.x,t.x)&&e.x>=Math.min(s.x,t.x)&&e.y<=Math.max(s.y,t.y)&&e.y>=Math.min(s.y,t.y)}function La(s){return s>0?1:s<0?-1:0}function av(s,e){let t=s;do{if(t.i!==s.i&&t.next.i!==s.i&&t.i!==e.i&&t.next.i!==e.i&&zf(t,t.next,s,e))return!0;t=t.next}while(t!==s);return!1}function xo(s,e){return Tt(s.prev,s,s.next)<0?Tt(s,e,s.next)>=0&&Tt(s,s.prev,e)>=0:Tt(s,e,s.prev)<0||Tt(s,s.next,e)<0}function lv(s,e){let t=s,n=!1;const i=(s.x+e.x)/2,r=(s.y+e.y)/2;do t.y>r!=t.next.y>r&&t.next.y!==t.y&&i<(t.next.x-t.x)*(r-t.y)/(t.next.y-t.y)+t.x&&(n=!n),t=t.next;while(t!==s);return n}function Hf(s,e){const t=Ph(s.i,s.x,s.y),n=Ph(e.i,e.x,e.y),i=s.next,r=e.prev;return s.next=e,e.prev=s,t.next=i,i.prev=t,n.next=t,t.prev=n,r.next=n,n.prev=r,n}function Vf(s,e,t,n){const i=Ph(s,e,t);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function vo(s){s.next.prev=s.prev,s.prev.next=s.next,s.prevZ&&(s.prevZ.nextZ=s.nextZ),s.nextZ&&(s.nextZ.prevZ=s.prevZ)}function Ph(s,e,t){return{i:s,x:e,y:t,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function cv(s,e,t,n){let i=0;for(let r=e,o=t-n;r2&&s[e-1].equals(s[0])&&s.pop()}function Wf(s,e){for(let t=0;tNumber.EPSILON){const K=Math.sqrt(L),le=Math.sqrt(G*G+N*N),te=I.x-J/K,Te=I.y+ee/K,be=V.x-N/le,Re=V.y+G/le,De=((be-te)*N-(Re-Te)*G)/(ee*N-J*G);U=te+ee*De-T.x,k=Te+J*De-T.y;const ue=U*U+k*k;if(ue<=2)return new ce(U,k);z=Math.sqrt(ue/2)}else{let K=!1;ee>Number.EPSILON?G>Number.EPSILON&&(K=!0):ee<-Number.EPSILON?G<-Number.EPSILON&&(K=!0):Math.sign(J)===Math.sign(N)&&(K=!0),K?(U=-J,k=ee,z=Math.sqrt(L)):(U=ee,k=J,z=Math.sqrt(L/2))}return new ce(U/z,k/z)}const Z=[];for(let T=0,I=F.length,V=I-1,U=T+1;T=0;T--){const I=T/x,V=f*Math.cos(I*Math.PI/2),U=p*Math.sin(I*Math.PI/2)+g;for(let k=0,z=F.length;k=0;){const U=V;let k=V-1;k<0&&(k=T.length-1);for(let z=0,ee=h+x*2;z0!=e>0&&this.version++,this._anisotropy=e}get clearcoat(){return this._clearcoat}set clearcoat(e){this._clearcoat>0!=e>0&&this.version++,this._clearcoat=e}get iridescence(){return this._iridescence}set iridescence(e){this._iridescence>0!=e>0&&this.version++,this._iridescence=e}get dispersion(){return this._dispersion}set dispersion(e){this._dispersion>0!=e>0&&this.version++,this._dispersion=e}get sheen(){return this._sheen}set sheen(e){this._sheen>0!=e>0&&this.version++,this._sheen=e}get transmission(){return this._transmission}set transmission(e){this._transmission>0!=e>0&&this.version++,this._transmission=e}copy(e){return super.copy(e),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=e.anisotropy,this.anisotropyRotation=e.anisotropyRotation,this.anisotropyMap=e.anisotropyMap,this.clearcoat=e.clearcoat,this.clearcoatMap=e.clearcoatMap,this.clearcoatRoughness=e.clearcoatRoughness,this.clearcoatRoughnessMap=e.clearcoatRoughnessMap,this.clearcoatNormalMap=e.clearcoatNormalMap,this.clearcoatNormalScale.copy(e.clearcoatNormalScale),this.dispersion=e.dispersion,this.ior=e.ior,this.iridescence=e.iridescence,this.iridescenceMap=e.iridescenceMap,this.iridescenceIOR=e.iridescenceIOR,this.iridescenceThicknessRange=[...e.iridescenceThicknessRange],this.iridescenceThicknessMap=e.iridescenceThicknessMap,this.sheen=e.sheen,this.sheenColor.copy(e.sheenColor),this.sheenColorMap=e.sheenColorMap,this.sheenRoughness=e.sheenRoughness,this.sheenRoughnessMap=e.sheenRoughnessMap,this.transmission=e.transmission,this.transmissionMap=e.transmissionMap,this.thickness=e.thickness,this.thicknessMap=e.thicknessMap,this.attenuationDistance=e.attenuationDistance,this.attenuationColor.copy(e.attenuationColor),this.specularIntensity=e.specularIntensity,this.specularIntensityMap=e.specularIntensityMap,this.specularColor.copy(e.specularColor),this.specularColorMap=e.specularColorMap,this}}class pv extends gn{constructor(e){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new Ue(16777215),this.specular=new Ue(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Ue(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Zr,this.normalScale=new ce(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new mn,this.combine=Wo,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.specular.copy(e.specular),this.shininess=e.shininess,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class mv extends gn{constructor(e){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Zr,this.normalScale=new ce(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(e)}copy(e){return super.copy(e),this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.flatShading=e.flatShading,this}}class Xf extends gn{constructor(e){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new Ue(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Ue(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Zr,this.normalScale=new ce(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new mn,this.combine=Wo,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class gv extends gn{constructor(e){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=Ag,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(e)}copy(e){return super.copy(e),this.depthPacking=e.depthPacking,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this}}class xv extends gn{constructor(e){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(e)}copy(e){return super.copy(e),this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this}}function Da(s,e){return!s||s.constructor===e?s:typeof e.BYTES_PER_ELEMENT=="number"?new e(s):Array.prototype.slice.call(s)}function vv(s){return ArrayBuffer.isView(s)&&!(s instanceof DataView)}function bv(s){function e(i,r){return s[i]-s[r]}const t=s.length,n=new Array(t);for(let i=0;i!==t;++i)n[i]=i;return n.sort(e),n}function jf(s,e,t){const n=s.length,i=new s.constructor(n);for(let r=0,o=0;o!==n;++r){const a=t[r]*e;for(let l=0;l!==e;++l)i[o++]=s[a+l]}return i}function qf(s,e,t,n){let i=1,r=s[0];for(;r!==void 0&&r[n]===void 0;)r=s[i++];if(r===void 0)return;let o=r[n];if(o!==void 0)if(Array.isArray(o))do o=r[n],o!==void 0&&(e.push(r.time),t.push(...o)),r=s[i++];while(r!==void 0);else if(o.toArray!==void 0)do o=r[n],o!==void 0&&(e.push(r.time),o.toArray(t,t.length)),r=s[i++];while(r!==void 0);else do o=r[n],o!==void 0&&(e.push(r.time),t.push(o)),r=s[i++];while(r!==void 0)}class yo{constructor(e,t,n,i){this.parameterPositions=e,this._cachedIndex=0,this.resultBuffer=i!==void 0?i:new t.constructor(n),this.sampleValues=t,this.valueSize=n,this.settings=null,this.DefaultSettings_={}}evaluate(e){const t=this.parameterPositions;let n=this._cachedIndex,i=t[n],r=t[n-1];e:{t:{let o;n:{i:if(!(e=r)){const a=t[1];e=r)break t}o=n,n=0;break n}break e}for(;n>>1;et;)--o;if(++o,r!==0||o!==i){r>=o&&(o=Math.max(o,1),r=o-1);const a=this.getValueSize();this.times=n.slice(r,o),this.values=this.values.slice(r*a,o*a)}return this}validate(){let e=!0;const t=this.getValueSize();t-Math.floor(t)!==0&&(Qe("KeyframeTrack: Invalid value size in track.",this),e=!1);const n=this.times,i=this.values,r=n.length;r===0&&(Qe("KeyframeTrack: Track is empty.",this),e=!1);let o=null;for(let a=0;a!==r;a++){const l=n[a];if(typeof l=="number"&&isNaN(l)){Qe("KeyframeTrack: Time is not a valid number.",this,a,l),e=!1;break}if(o!==null&&o>l){Qe("KeyframeTrack: Out of order keys.",this,a,l,o),e=!1;break}o=l}if(i!==void 0&&vv(i))for(let a=0,l=i.length;a!==l;++a){const c=i[a];if(isNaN(c)){Qe("KeyframeTrack: Value is not a valid number.",this,a,c),e=!1;break}}return e}optimize(){const e=this.times.slice(),t=this.values.slice(),n=this.getValueSize(),i=this.getInterpolation()===Oc,r=e.length-1;let o=1;for(let a=1;a0){e[o]=e[r];for(let a=r*n,l=o*n,c=0;c!==n;++c)t[l+c]=t[a+c];++o}return o!==e.length?(this.times=e.slice(0,o),this.values=t.slice(0,o*n)):(this.times=e,this.values=t),this}clone(){const e=this.times.slice(),t=this.values.slice(),n=this.constructor,i=new n(this.name,e,t);return i.createInterpolant=this.createInterpolant,i}}$n.prototype.ValueTypeName="",$n.prototype.TimeBufferType=Float32Array,$n.prototype.ValueBufferType=Float32Array,$n.prototype.DefaultInterpolation=qr;class dr extends $n{constructor(e,t,n){super(e,t,n)}}dr.prototype.ValueTypeName="bool",dr.prototype.ValueBufferType=Array,dr.prototype.DefaultInterpolation=jr,dr.prototype.InterpolantFactoryMethodLinear=void 0,dr.prototype.InterpolantFactoryMethodSmooth=void 0;class Zf extends $n{constructor(e,t,n,i){super(e,t,n,i)}}Zf.prototype.ValueTypeName="color";class fr extends $n{constructor(e,t,n,i){super(e,t,n,i)}}fr.prototype.ValueTypeName="number";class wv extends yo{constructor(e,t,n,i){super(e,t,n,i)}interpolate_(e,t,n,i){const r=this.resultBuffer,o=this.sampleValues,a=this.valueSize,l=(n-t)/(i-t);let c=e*a;for(let h=c+a;c!==h;c+=4)Dn.slerpFlat(r,0,o,c-a,o,c,l);return r}}class pr extends $n{constructor(e,t,n,i){super(e,t,n,i)}InterpolantFactoryMethodLinear(e){return new wv(this.times,this.values,this.getValueSize(),e)}}pr.prototype.ValueTypeName="quaternion",pr.prototype.InterpolantFactoryMethodSmooth=void 0;class mr extends $n{constructor(e,t,n){super(e,t,n)}}mr.prototype.ValueTypeName="string",mr.prototype.ValueBufferType=Array,mr.prototype.DefaultInterpolation=jr,mr.prototype.InterpolantFactoryMethodLinear=void 0,mr.prototype.InterpolantFactoryMethodSmooth=void 0;class gr extends $n{constructor(e,t,n,i){super(e,t,n,i)}}gr.prototype.ValueTypeName="vector";class Sv{constructor(e="",t=-1,n=[],i=Eg){this.name=e,this.tracks=n,this.duration=t,this.blendMode=i,this.uuid=Ln(),this.userData={},this.duration<0&&this.resetDuration()}static parse(e){const t=[],n=e.tracks,i=1/(e.fps||1);for(let o=0,a=n.length;o!==a;++o)t.push(Tv(n[o]).scale(i));const r=new this(e.name,e.duration,t,e.blendMode);return r.uuid=e.uuid,r.userData=JSON.parse(e.userData||"{}"),r}static toJSON(e){const t=[],n=e.tracks,i={name:e.name,duration:e.duration,tracks:t,uuid:e.uuid,blendMode:e.blendMode,userData:JSON.stringify(e.userData)};for(let r=0,o=n.length;r!==o;++r)t.push($n.toJSON(n[r]));return i}static CreateFromMorphTargetSequence(e,t,n,i){const r=t.length,o=[];for(let a=0;a1){const u=h[1];let d=i[u];d||(i[u]=d=[]),d.push(c)}}const o=[];for(const a in i)o.push(this.CreateFromMorphTargetSequence(a,i[a],t,n));return o}static parseAnimation(e,t){if(He("AnimationClip: parseAnimation() is deprecated and will be removed with r185"),!e)return Qe("AnimationClip: No animation in JSONLoader data."),null;const n=function(u,d,f,p,g){if(f.length!==0){const x=[],m=[];qf(f,x,m,p),x.length!==0&&g.push(new u(d,x,m))}},i=[],r=e.name||"default",o=e.fps||30,a=e.blendMode;let l=e.length||-1;const c=e.hierarchy||[];for(let u=0;u{t&&t(r),this.manager.itemEnd(e)},0),r;if(Si[e]!==void 0){Si[e].push({onLoad:t,onProgress:n,onError:i});return}Si[e]=[],Si[e].push({onLoad:t,onProgress:n,onError:i});const o=new Request(e,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin",signal:typeof AbortSignal.any=="function"?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal}),a=this.mimeType,l=this.responseType;fetch(o).then(c=>{if(c.status===200||c.status===0){if(c.status===0&&He("FileLoader: HTTP Status 0 received."),typeof ReadableStream>"u"||c.body===void 0||c.body.getReader===void 0)return c;const h=Si[e],u=c.body.getReader(),d=c.headers.get("X-File-Size")||c.headers.get("Content-Length"),f=d?parseInt(d):0,p=f!==0;let g=0;const x=new ReadableStream({start(m){b();function b(){u.read().then(({done:v,value:y})=>{if(v)m.close();else{g+=y.byteLength;const M=new ProgressEvent("progress",{lengthComputable:p,loaded:g,total:f});for(let E=0,A=h.length;E{m.error(v)})}}});return new Response(x)}else throw new Pv(`fetch for "${c.url}" responded with ${c.status}: ${c.statusText}`,c)}).then(c=>{switch(l){case"arraybuffer":return c.arrayBuffer();case"blob":return c.blob();case"document":return c.text().then(h=>new DOMParser().parseFromString(h,a));case"json":return c.json();default:if(a==="")return c.text();{const u=/charset="?([^;"\s]*)"?/i.exec(a),d=u&&u[1]?u[1].toLowerCase():void 0,f=new TextDecoder(d);return c.arrayBuffer().then(p=>f.decode(p))}}}).then(c=>{wi.add(`file:${e}`,c);const h=Si[e];delete Si[e];for(let u=0,d=h.length;u{const h=Si[e];if(h===void 0)throw this.manager.itemError(e),c;delete Si[e];for(let u=0,d=h.length;u{this.manager.itemEnd(e)}),this.manager.itemStart(e)}setResponseType(e){return this.responseType=e,this}setMimeType(e){return this.mimeType=e,this}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}const xr=new WeakMap;class Rv extends hs{constructor(e){super(e)}load(e,t,n,i){this.path!==void 0&&(e=this.path+e),e=this.manager.resolveURL(e);const r=this,o=wi.get(`image:${e}`);if(o!==void 0){if(o.complete===!0)r.manager.itemStart(e),setTimeout(function(){t&&t(o),r.manager.itemEnd(e)},0);else{let u=xr.get(o);u===void 0&&(u=[],xr.set(o,u)),u.push({onLoad:t,onError:i})}return o}const a=Yr("img");function l(){h(),t&&t(this);const u=xr.get(this)||[];for(let d=0;d"u"&&He("ImageBitmapLoader: createImageBitmap() not supported."),typeof fetch>"u"&&He("ImageBitmapLoader: fetch() not supported."),this.options={premultiplyAlpha:"none"},this._abortController=new AbortController}setOptions(e){return this.options=e,this}load(e,t,n,i){e===void 0&&(e=""),this.path!==void 0&&(e=this.path+e),e=this.manager.resolveURL(e);const r=this,o=wi.get(`image-bitmap:${e}`);if(o!==void 0){if(r.manager.itemStart(e),o.then){o.then(c=>{if(Bh.has(o)===!0)i&&i(Bh.get(o)),r.manager.itemError(e),r.manager.itemEnd(e);else return t&&t(c),r.manager.itemEnd(e),c});return}return setTimeout(function(){t&&t(o),r.manager.itemEnd(e)},0),o}const a={};a.credentials=this.crossOrigin==="anonymous"?"same-origin":"include",a.headers=this.requestHeader,a.signal=typeof AbortSignal.any=="function"?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal;const l=fetch(e,a).then(function(c){return c.blob()}).then(function(c){return createImageBitmap(c,Object.assign(r.options,{colorSpaceConversion:"none"}))}).then(function(c){return wi.add(`image-bitmap:${e}`,c),t&&t(c),r.manager.itemEnd(e),c}).catch(function(c){i&&i(c),Bh.set(l,c),wi.remove(`image-bitmap:${e}`),r.manager.itemError(e),r.manager.itemEnd(e)});wi.add(`image-bitmap:${e}`,l),r.manager.itemStart(e)}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}class Uv extends sn{constructor(e=[]){super(),this.isArrayCamera=!0,this.isMultiViewCamera=!1,this.cameras=e}}class Ov{constructor(e=!0){this.autoStart=e,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=performance.now(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let e=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const t=performance.now();e=(t-this.oldTime)/1e3,this.oldTime=t,this.elapsedTime+=e}return e}}const Nh="\\[\\]\\.:\\/",Fv=new RegExp("["+Nh+"]","g"),kh="[^"+Nh+"]",zv="[^"+Nh.replace("\\.","")+"]",Hv=/((?:WC+[\/:])*)/.source.replace("WC",kh),Vv=/(WCOD+)?/.source.replace("WCOD",zv),Gv=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",kh),Wv=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",kh),Xv=new RegExp("^"+Hv+Vv+Gv+Wv+"$"),jv=["material","materials","bones","map"];class qv{constructor(e,t,n){const i=n||dt.parseTrackName(t);this._targetGroup=e,this._bindings=e.subscribe_(t,i)}getValue(e,t){this.bind();const n=this._targetGroup.nCachedObjects_,i=this._bindings[n];i!==void 0&&i.getValue(e,t)}setValue(e,t){const n=this._bindings;for(let i=this._targetGroup.nCachedObjects_,r=n.length;i!==r;++i)n[i].setValue(e,t)}bind(){const e=this._bindings;for(let t=this._targetGroup.nCachedObjects_,n=e.length;t!==n;++t)e[t].bind()}unbind(){const e=this._bindings;for(let t=this._targetGroup.nCachedObjects_,n=e.length;t!==n;++t)e[t].unbind()}}class dt{constructor(e,t,n){this.path=t,this.parsedPath=n||dt.parseTrackName(t),this.node=dt.findNode(e,this.parsedPath.nodeName),this.rootNode=e,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(e,t,n){return e&&e.isAnimationObjectGroup?new dt.Composite(e,t,n):new dt(e,t,n)}static sanitizeNodeName(e){return e.replace(/\s/g,"_").replace(Fv,"")}static parseTrackName(e){const t=Xv.exec(e);if(t===null)throw new Error("PropertyBinding: Cannot parse trackName: "+e);const n={nodeName:t[2],objectName:t[3],objectIndex:t[4],propertyName:t[5],propertyIndex:t[6]},i=n.nodeName&&n.nodeName.lastIndexOf(".");if(i!==void 0&&i!==-1){const r=n.nodeName.substring(i+1);jv.indexOf(r)!==-1&&(n.nodeName=n.nodeName.substring(0,i),n.objectName=r)}if(n.propertyName===null||n.propertyName.length===0)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+e);return n}static findNode(e,t){if(t===void 0||t===""||t==="."||t===-1||t===e.name||t===e.uuid)return e;if(e.skeleton){const n=e.skeleton.getBoneByName(t);if(n!==void 0)return n}if(e.children){const n=function(r){for(let o=0;o1&&(o=1,r=qe((g-p)/u,0,1))}}return t.copy(a).add(br.multiplyScalar(r)),n.copy(l).add(yr.multiplyScalar(o)),t.sub(n),t.dot(t)}applyMatrix4(e){return this.start.applyMatrix4(e),this.end.applyMatrix4(e),this}equals(e){return e.start.equals(this.start)&&e.end.equals(this.end)}clone(){return new this.constructor().copy(this)}}class Kv extends ns{constructor(e,t=null){super(),this.object=e,this.domElement=t,this.enabled=!0,this.state=-1,this.keys={},this.mouseButtons={LEFT:null,MIDDLE:null,RIGHT:null},this.touches={ONE:null,TWO:null}}connect(e){if(e===void 0){He("Controls: connect() now requires an element.");return}this.domElement!==null&&this.disconnect(),this.domElement=e}disconnect(){}dispose(){}update(){}}function ip(s,e,t,n){const i=$v(n);switch(t){case Td:return s*e;case rc:return s*e/i.components*i.byteLength;case oc:return s*e/i.components*i.byteLength;case ac:return s*e*2/i.components*i.byteLength;case lc:return s*e*2/i.components*i.byteLength;case Ad:return s*e*3/i.components*i.byteLength;case fn:return s*e*4/i.components*i.byteLength;case cc:return s*e*4/i.components*i.byteLength;case Zo:case Yo:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*8;case Ko:case $o:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*16;case uc:case fc:return Math.max(s,16)*Math.max(e,8)/4;case hc:case dc:return Math.max(s,8)*Math.max(e,8)/2;case pc:case mc:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*8;case gc:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*16;case xc:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*16;case vc:return Math.floor((s+4)/5)*Math.floor((e+3)/4)*16;case bc:return Math.floor((s+4)/5)*Math.floor((e+4)/5)*16;case yc:return Math.floor((s+5)/6)*Math.floor((e+4)/5)*16;case _c:return Math.floor((s+5)/6)*Math.floor((e+5)/6)*16;case Mc:return Math.floor((s+7)/8)*Math.floor((e+4)/5)*16;case wc:return Math.floor((s+7)/8)*Math.floor((e+5)/6)*16;case Sc:return Math.floor((s+7)/8)*Math.floor((e+7)/8)*16;case Ec:return Math.floor((s+9)/10)*Math.floor((e+4)/5)*16;case Tc:return Math.floor((s+9)/10)*Math.floor((e+5)/6)*16;case Ac:return Math.floor((s+9)/10)*Math.floor((e+7)/8)*16;case Cc:return Math.floor((s+9)/10)*Math.floor((e+9)/10)*16;case Pc:return Math.floor((s+11)/12)*Math.floor((e+9)/10)*16;case Rc:return Math.floor((s+11)/12)*Math.floor((e+11)/12)*16;case Lc:case Dc:case Ic:return Math.ceil(s/4)*Math.ceil(e/4)*16;case Bc:case Nc:return Math.ceil(s/4)*Math.ceil(e/4)*8;case kc:case Uc:return Math.ceil(s/4)*Math.ceil(e/4)*16}throw new Error(`Unable to determine texture byte length for ${t} format.`)}function $v(s){switch(s){case Wn:case Md:return{byteLength:1,components:1};case Wr:case wd:case Rn:return{byteLength:2,components:1};case ic:case sc:return{byteLength:2,components:4};case ts:case nc:case Xn:return{byteLength:4,components:1};case Sd:case Ed:return{byteLength:4,components:3}}throw new Error(`Unknown texture type ${s}.`)}typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:Hr}})),typeof window<"u"&&(window.__THREE__?He("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=Hr);function sp(){let s=null,e=!1,t=null,n=null;function i(r,o){t(r,o),n=s.requestAnimationFrame(i)}return{start:function(){e!==!0&&t!==null&&(n=s.requestAnimationFrame(i),e=!0)},stop:function(){s.cancelAnimationFrame(n),e=!1},setAnimationLoop:function(r){t=r},setContext:function(r){s=r}}}function Jv(s){const e=new WeakMap;function t(a,l){const c=a.array,h=a.usage,u=c.byteLength,d=s.createBuffer();s.bindBuffer(l,d),s.bufferData(l,c,h),a.onUploadCallback();let f;if(c instanceof Float32Array)f=s.FLOAT;else if(typeof Float16Array<"u"&&c instanceof Float16Array)f=s.HALF_FLOAT;else if(c instanceof Uint16Array)a.isFloat16BufferAttribute?f=s.HALF_FLOAT:f=s.UNSIGNED_SHORT;else if(c instanceof Int16Array)f=s.SHORT;else if(c instanceof Uint32Array)f=s.UNSIGNED_INT;else if(c instanceof Int32Array)f=s.INT;else if(c instanceof Int8Array)f=s.BYTE;else if(c instanceof Uint8Array)f=s.UNSIGNED_BYTE;else if(c instanceof Uint8ClampedArray)f=s.UNSIGNED_BYTE;else throw new Error("THREE.WebGLAttributes: Unsupported buffer data format: "+c);return{buffer:d,type:f,bytesPerElement:c.BYTES_PER_ELEMENT,version:a.version,size:u}}function n(a,l,c){const h=l.array,u=l.updateRanges;if(s.bindBuffer(c,a),u.length===0)s.bufferSubData(c,0,h);else{u.sort((f,p)=>f.start-p.start);let d=0;for(let f=1;ff+p?(c.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:e.handedness,target:this})):!c.inputState.pinching&&d<=f-p&&(c.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:e.handedness,target:this}))}else l!==null&&e.gripSpace&&(r=t.getPose(e.gripSpace,n),r!==null&&(l.matrix.fromArray(r.transform.matrix),l.matrix.decompose(l.position,l.rotation,l.scale),l.matrixWorldNeedsUpdate=!0,r.linearVelocity?(l.hasLinearVelocity=!0,l.linearVelocity.copy(r.linearVelocity)):l.hasLinearVelocity=!1,r.angularVelocity?(l.hasAngularVelocity=!0,l.angularVelocity.copy(r.angularVelocity)):l.hasAngularVelocity=!1));a!==null&&(i=t.getPose(e.targetRaySpace,n),i===null&&r!==null&&(i=r),i!==null&&(a.matrix.fromArray(i.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),a.matrixWorldNeedsUpdate=!0,i.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(i.linearVelocity)):a.hasLinearVelocity=!1,i.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(i.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(Mx)))}return a!==null&&(a.visible=i!==null),l!==null&&(l.visible=r!==null),c!==null&&(c.visible=o!==null),this}_getHandJoint(e,t){if(e.joints[t.jointName]===void 0){const n=new xn;n.matrixAutoUpdate=!1,n.visible=!1,e.joints[t.jointName]=n,e.add(n)}return e.joints[t.jointName]}}class af extends St{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new mn,this.environmentIntensity=1,this.environmentRotation=new mn,this.overrideMaterial=null,typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(e,t){return super.copy(e,t),e.background!==null&&(this.background=e.background.clone()),e.environment!==null&&(this.environment=e.environment.clone()),e.fog!==null&&(this.fog=e.fog.clone()),this.backgroundBlurriness=e.backgroundBlurriness,this.backgroundIntensity=e.backgroundIntensity,this.backgroundRotation.copy(e.backgroundRotation),this.environmentIntensity=e.environmentIntensity,this.environmentRotation.copy(e.environmentRotation),e.overrideMaterial!==null&&(this.overrideMaterial=e.overrideMaterial.clone()),this.matrixAutoUpdate=e.matrixAutoUpdate,this}toJSON(e){const t=super.toJSON(e);return this.fog!==null&&(t.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(t.object.backgroundBlurriness=this.backgroundBlurriness),this.backgroundIntensity!==1&&(t.object.backgroundIntensity=this.backgroundIntensity),t.object.backgroundRotation=this.backgroundRotation.toArray(),this.environmentIntensity!==1&&(t.object.environmentIntensity=this.environmentIntensity),t.object.environmentRotation=this.environmentRotation.toArray(),t}}class uh{constructor(e,t){this.isInterleavedBuffer=!0,this.array=e,this.stride=t,this.count=e!==void 0?e.length/t:0,this.usage=zc,this.updateRanges=[],this.version=0,this.uuid=Ln()}onUploadCallback(){}set needsUpdate(e){e===!0&&this.version++}setUsage(e){return this.usage=e,this}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}copy(e){return this.array=new e.array.constructor(e.array),this.count=e.count,this.stride=e.stride,this.usage=e.usage,this}copyAt(e,t,n){e*=this.stride,n*=t.stride;for(let i=0,r=this.stride;ie.far||t.push({distance:l,point:so.clone(),uv:bt.getInterpolation(so,xa,oo,va,cf,dh,hf,new ce),face:null,object:this})}copy(e,t){return super.copy(e,t),e.center!==void 0&&this.center.copy(e.center),this.material=e.material,this}}function ba(s,e,t,n,i,r){lr.subVectors(s,t).addScalar(.5).multiply(n),i!==void 0?(ro.x=r*lr.x-i*lr.y,ro.y=i*lr.x+r*lr.y):ro.copy(lr),s.copy(e),s.x+=ro.x,s.y+=ro.y,s.applyMatrix4(lf)}const uf=new P,df=new tt,ff=new tt,Ex=new P,pf=new ze,ya=new P,fh=new ri,mf=new ze,ph=new zi;class Tx extends ut{constructor(e,t){super(e,t),this.isSkinnedMesh=!0,this.type="SkinnedMesh",this.bindMode=vd,this.bindMatrix=new ze,this.bindMatrixInverse=new ze,this.boundingBox=null,this.boundingSphere=null}computeBoundingBox(){const e=this.geometry;this.boundingBox===null&&(this.boundingBox=new xt),this.boundingBox.makeEmpty();const t=e.getAttribute("position");for(let n=0;n1?null:t.copy(e.start).addScaledVector(n,r)}intersectsLine(e){const t=this.distanceToPoint(e.start),n=this.distanceToPoint(e.end);return t<0&&n>0||n<0&&t>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,t){const n=t||Rx.getNormalMatrix(e),i=this.coplanarPoint(xh).applyMatrix4(e),r=this.normal.applyMatrix3(n).normalize();return this.constant=-i.dot(r),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return new this.constructor().copy(this)}}const os=new ri,Lx=new ce(.5,.5),Ma=new P;class vh{constructor(e=new yt,t=new yt,n=new yt,i=new yt,r=new yt,o=new yt){this.planes=[e,t,n,i,r,o]}set(e,t,n,i,r,o){const a=this.planes;return a[0].copy(e),a[1].copy(t),a[2].copy(n),a[3].copy(i),a[4].copy(r),a[5].copy(o),this}copy(e){const t=this.planes;for(let n=0;n<6;n++)t[n].copy(e.planes[n]);return this}setFromProjectionMatrix(e,t=si,n=!1){const i=this.planes,r=e.elements,o=r[0],a=r[1],l=r[2],c=r[3],h=r[4],u=r[5],d=r[6],f=r[7],p=r[8],g=r[9],x=r[10],m=r[11],b=r[12],v=r[13],y=r[14],M=r[15];if(i[0].setComponents(c-o,f-h,m-p,M-b).normalize(),i[1].setComponents(c+o,f+h,m+p,M+b).normalize(),i[2].setComponents(c+a,f+u,m+g,M+v).normalize(),i[3].setComponents(c-a,f-u,m-g,M-v).normalize(),n)i[4].setComponents(l,d,x,y).normalize(),i[5].setComponents(c-l,f-d,m-x,M-y).normalize();else if(i[4].setComponents(c-l,f-d,m-x,M-y).normalize(),t===si)i[5].setComponents(c+l,f+d,m+x,M+y).normalize();else if(t===Qo)i[5].setComponents(l,d,x,y).normalize();else throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+t);return this}intersectsObject(e){if(e.boundingSphere!==void 0)e.boundingSphere===null&&e.computeBoundingSphere(),os.copy(e.boundingSphere).applyMatrix4(e.matrixWorld);else{const t=e.geometry;t.boundingSphere===null&&t.computeBoundingSphere(),os.copy(t.boundingSphere).applyMatrix4(e.matrixWorld)}return this.intersectsSphere(os)}intersectsSprite(e){os.center.set(0,0,0);const t=Lx.distanceTo(e.center);return os.radius=.7071067811865476+t,os.applyMatrix4(e.matrixWorld),this.intersectsSphere(os)}intersectsSphere(e){const t=this.planes,n=e.center,i=-e.radius;for(let r=0;r<6;r++)if(t[r].distanceToPoint(n)0?e.max.x:e.min.x,Ma.y=i.normal.y>0?e.max.y:e.min.y,Ma.z=i.normal.z>0?e.max.z:e.min.z,i.distanceToPoint(Ma)<0)return!1}return!0}containsPoint(e){const t=this.planes;for(let n=0;n<6;n++)if(t[n].distanceToPoint(e)<0)return!1;return!0}clone(){return new this.constructor().copy(this)}}class as extends gn{constructor(e){super(),this.isLineBasicMaterial=!0,this.type="LineBasicMaterial",this.color=new Ue(16777215),this.map=null,this.linewidth=1,this.linecap="round",this.linejoin="round",this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this.fog=e.fog,this}}const wa=new P,Sa=new P,yf=new ze,uo=new zi,Ea=new ri,bh=new P,_f=new P;class Xi extends St{constructor(e=new ht,t=new as){super(),this.isLine=!0,this.type="Line",this.geometry=e,this.material=t,this.morphTargetDictionary=void 0,this.morphTargetInfluences=void 0,this.updateMorphTargets()}copy(e,t){return super.copy(e,t),this.material=Array.isArray(e.material)?e.material.slice():e.material,this.geometry=e.geometry,this}computeLineDistances(){const e=this.geometry;if(e.index===null){const t=e.attributes.position,n=[0];for(let i=1,r=t.count;i0){const i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,o=i.length;rn)return;bh.applyMatrix4(s.matrixWorld);const c=e.ray.origin.distanceTo(bh);if(!(ce.far))return{distance:c,point:_f.clone().applyMatrix4(s.matrixWorld),index:o,face:null,faceIndex:null,barycoord:null,object:s}}const Mf=new P,wf=new P;class Sf extends Xi{constructor(e,t){super(e,t),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const e=this.geometry;if(e.index===null){const t=e.attributes.position,n=[];for(let i=0,r=t.count;i0){const i=t[n[0]];if(i!==void 0){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let r=0,o=i.length;ri.far)return;r.push({distance:c,distanceToRay:Math.sqrt(a),point:l,index:e,face:null,faceIndex:null,barycoord:null,object:o})}}class _h extends Ht{constructor(e,t,n=ts,i,r,o,a=Kt,l=Kt,c,h=Xr,u=1){if(h!==Xr&&h!==Hs)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");const d={width:e,height:t,depth:u};super(d,i,r,o,a,l,h,n,c),this.isDepthTexture=!0,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(e){return super.copy(e),this.source=new Wc(Object.assign({},e.image)),this.compareFunction=e.compareFunction,this}toJSON(e){const t=super.toJSON(e);return this.compareFunction!==null&&(t.compareFunction=this.compareFunction),t}}class Pf extends Ht{constructor(e=null){super(),this.sourceTexture=e,this.isExternalTexture=!0}copy(e){return super.copy(e),this.sourceTexture=e.sourceTexture,this}}class ai{constructor(){this.type="Curve",this.arcLengthDivisions=200,this.needsUpdate=!1,this.cacheArcLengths=null}getPoint(){He("Curve: .getPoint() not implemented.")}getPointAt(e,t){const n=this.getUtoTmapping(e);return this.getPoint(n,t)}getPoints(e=5){const t=[];for(let n=0;n<=e;n++)t.push(this.getPoint(n/e));return t}getSpacedPoints(e=5){const t=[];for(let n=0;n<=e;n++)t.push(this.getPointAt(n/e));return t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===e+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const t=[];let n,i=this.getPoint(0),r=0;t.push(0);for(let o=1;o<=e;o++)n=this.getPoint(o/e),r+=n.distanceTo(i),t.push(r),i=n;return this.cacheArcLengths=t,t}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(e,t=null){const n=this.getLengths();let i=0;const r=n.length;let o;t?o=t:o=e*n[r-1];let a=0,l=r-1,c;for(;a<=l;)if(i=Math.floor(a+(l-a)/2),c=n[i]-o,c<0)a=i+1;else if(c>0)l=i-1;else{l=i;break}if(i=l,n[i]===o)return i/(r-1);const h=n[i],d=n[i+1]-h,f=(o-h)/d;return(i+f)/(r-1)}getTangent(e,t){let i=e-1e-4,r=e+1e-4;i<0&&(i=0),r>1&&(r=1);const o=this.getPoint(i),a=this.getPoint(r),l=t||(o.isVector2?new ce:new P);return l.copy(a).sub(o).normalize(),l}getTangentAt(e,t){const n=this.getUtoTmapping(e);return this.getTangent(n,t)}computeFrenetFrames(e,t=!1){const n=new P,i=[],r=[],o=[],a=new P,l=new ze;for(let f=0;f<=e;f++){const p=f/e;i[f]=this.getTangentAt(p,new P)}r[0]=new P,o[0]=new P;let c=Number.MAX_VALUE;const h=Math.abs(i[0].x),u=Math.abs(i[0].y),d=Math.abs(i[0].z);h<=c&&(c=h,n.set(1,0,0)),u<=c&&(c=u,n.set(0,1,0)),d<=c&&n.set(0,0,1),a.crossVectors(i[0],n).normalize(),r[0].crossVectors(i[0],a),o[0].crossVectors(i[0],r[0]);for(let f=1;f<=e;f++){if(r[f]=r[f-1].clone(),o[f]=o[f-1].clone(),a.crossVectors(i[f-1],i[f]),a.length()>Number.EPSILON){a.normalize();const p=Math.acos(qe(i[f-1].dot(i[f]),-1,1));r[f].applyMatrix4(l.makeRotationAxis(a,p))}o[f].crossVectors(i[f],r[f])}if(t===!0){let f=Math.acos(qe(r[0].dot(r[e]),-1,1));f/=e,i[0].dot(a.crossVectors(r[0],r[e]))>0&&(f=-f);for(let p=1;p<=e;p++)r[p].applyMatrix4(l.makeRotationAxis(i[p],f*p)),o[p].crossVectors(i[p],r[p])}return{tangents:i,normals:r,binormals:o}}clone(){return new this.constructor().copy(this)}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}toJSON(){const e={metadata:{version:4.7,type:"Curve",generator:"Curve.toJSON"}};return e.arcLengthDivisions=this.arcLengthDivisions,e.type=this.type,e}fromJSON(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}class Mh extends ai{constructor(e=0,t=0,n=1,i=1,r=0,o=Math.PI*2,a=!1,l=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=e,this.aY=t,this.xRadius=n,this.yRadius=i,this.aStartAngle=r,this.aEndAngle=o,this.aClockwise=a,this.aRotation=l}getPoint(e,t=new ce){const n=t,i=Math.PI*2;let r=this.aEndAngle-this.aStartAngle;const o=Math.abs(r)i;)r-=i;r0?0:(Math.floor(Math.abs(a)/r)+1)*r:l===0&&a===r-1&&(a=r-2,l=1);let c,h;this.closed||a>0?c=i[(a-1)%r]:(Pa.subVectors(i[0],i[1]).add(i[0]),c=Pa);const u=i[a%r],d=i[(a+1)%r];if(this.closed||a+2i.length-2?i.length-1:o+1],u=i[o>i.length-3?i.length-1:o+2];return n.set(Rf(a,l.x,c.x,h.x,u.x),Rf(a,l.y,c.y,h.y,u.y)),n}copy(e){super.copy(e),this.points=[];for(let t=0,n=e.points.length;t=n){const o=i[r]-n,a=this.curves[r],l=a.getLength(),c=l===0?0:1-o/l;return a.getPointAt(c,t)}r++}return null}getLength(){const e=this.getCurveLengths();return e[e.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const e=[];let t=0;for(let n=0,i=this.curves.length;n1&&!t[t.length-1].equals(t[0])&&t.push(t[0]),t}copy(e){super.copy(e),this.curves=[];for(let t=0,n=e.curves.length;t0){const u=c.getPoint(0);u.equals(this.currentPoint)||this.lineTo(u.x,u.y)}this.curves.push(c);const h=c.getPoint(1);return this.currentPoint.copy(h),this}copy(e){return super.copy(e),this.currentPoint.copy(e.currentPoint),this}toJSON(){const e=super.toJSON();return e.currentPoint=this.currentPoint.toArray(),e}fromJSON(e){return super.fromJSON(e),this.currentPoint.fromArray(e.currentPoint),this}}class kf extends Nf{constructor(e){super(e),this.uuid=Ln(),this.type="Shape",this.holes=[]}getPointsHoles(e){const t=[];for(let n=0,i=this.holes.length;n80*t){a=s[0],l=s[1];let h=a,u=l;for(let d=t;dh&&(h=f),p>u&&(u=p)}c=Math.max(h-a,u-l),c=c!==0?32767/c:0}return mo(r,o,t,a,l,c,0),o}function Uf(s,e,t,n,i){let r;if(i===lv(s,e,t,n)>0)for(let o=e;o=e;o-=n)r=Hf(o/n|0,s[o],s[o+1],r);return r&&hr(r,r.next)&&(vo(r),r=r.next),r}function ls(s,e){if(!s)return s;e||(e=s);let t=s,n;do if(n=!1,!t.steiner&&(hr(t,t.next)||Tt(t.prev,t,t.next)===0)){if(vo(t),t=e=t.prev,t===t.next)break;n=!0}else t=t.next;while(n||t!==e);return e}function mo(s,e,t,n,i,r,o){if(!s)return;!o&&r&&nv(s,n,i,r);let a=s;for(;s.prev!==s.next;){const l=s.prev,c=s.next;if(r?Zx(s,n,i,r):qx(s)){e.push(l.i,s.i,c.i),vo(s),s=c.next,a=c.next;continue}if(s=c,s===a){o?o===1?(s=Yx(ls(s),e),mo(s,e,t,n,i,r,2)):o===2&&Kx(s,e,t,n,i,r):mo(ls(s),e,t,n,i,r,1);break}}}function qx(s){const e=s.prev,t=s,n=s.next;if(Tt(e,t,n)>=0)return!1;const i=e.x,r=t.x,o=n.x,a=e.y,l=t.y,c=n.y,h=Math.min(i,r,o),u=Math.min(a,l,c),d=Math.max(i,r,o),f=Math.max(a,l,c);let p=n.next;for(;p!==e;){if(p.x>=h&&p.x<=d&&p.y>=u&&p.y<=f&&go(i,a,r,l,o,c,p.x,p.y)&&Tt(p.prev,p,p.next)>=0)return!1;p=p.next}return!0}function Zx(s,e,t,n){const i=s.prev,r=s,o=s.next;if(Tt(i,r,o)>=0)return!1;const a=i.x,l=r.x,c=o.x,h=i.y,u=r.y,d=o.y,f=Math.min(a,l,c),p=Math.min(h,u,d),g=Math.max(a,l,c),x=Math.max(h,u,d),m=Ch(f,p,e,t,n),b=Ch(g,x,e,t,n);let v=s.prevZ,y=s.nextZ;for(;v&&v.z>=m&&y&&y.z<=b;){if(v.x>=f&&v.x<=g&&v.y>=p&&v.y<=x&&v!==i&&v!==o&&go(a,h,l,u,c,d,v.x,v.y)&&Tt(v.prev,v,v.next)>=0||(v=v.prevZ,y.x>=f&&y.x<=g&&y.y>=p&&y.y<=x&&y!==i&&y!==o&&go(a,h,l,u,c,d,y.x,y.y)&&Tt(y.prev,y,y.next)>=0))return!1;y=y.nextZ}for(;v&&v.z>=m;){if(v.x>=f&&v.x<=g&&v.y>=p&&v.y<=x&&v!==i&&v!==o&&go(a,h,l,u,c,d,v.x,v.y)&&Tt(v.prev,v,v.next)>=0)return!1;v=v.prevZ}for(;y&&y.z<=b;){if(y.x>=f&&y.x<=g&&y.y>=p&&y.y<=x&&y!==i&&y!==o&&go(a,h,l,u,c,d,y.x,y.y)&&Tt(y.prev,y,y.next)>=0)return!1;y=y.nextZ}return!0}function Yx(s,e){let t=s;do{const n=t.prev,i=t.next.next;!hr(n,i)&&Ff(n,t,t.next,i)&&xo(n,i)&&xo(i,n)&&(e.push(n.i,t.i,i.i),vo(t),vo(t.next),t=s=i),t=t.next}while(t!==s);return ls(t)}function Kx(s,e,t,n,i,r){let o=s;do{let a=o.next.next;for(;a!==o.prev;){if(o.i!==a.i&&rv(o,a)){let l=zf(o,a);o=ls(o,o.next),l=ls(l,l.next),mo(o,e,t,n,i,r,0),mo(l,e,t,n,i,r,0);return}a=a.next}o=o.next}while(o!==s)}function $x(s,e,t,n){const i=[];for(let r=0,o=e.length;r=t.next.y&&t.next.y!==t.y){const u=t.x+(i-t.y)*(t.next.x-t.x)/(t.next.y-t.y);if(u<=n&&u>r&&(r=u,o=t.x=t.x&&t.x>=l&&n!==t.x&&Of(io.x||t.x===o.x&&tv(o,t)))&&(o=t,h=u)}t=t.next}while(t!==a);return o}function tv(s,e){return Tt(s.prev,s,e.prev)<0&&Tt(e.next,s,s.next)<0}function nv(s,e,t,n){let i=s;do i.z===0&&(i.z=Ch(i.x,i.y,e,t,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==s);i.prevZ.nextZ=null,i.prevZ=null,iv(i)}function iv(s){let e,t=1;do{let n=s,i;s=null;let r=null;for(e=0;n;){e++;let o=n,a=0;for(let c=0;c0||l>0&&o;)a!==0&&(l===0||!o||n.z<=o.z)?(i=n,n=n.nextZ,a--):(i=o,o=o.nextZ,l--),r?r.nextZ=i:s=i,i.prevZ=r,r=i;n=o}r.nextZ=null,t*=2}while(e>1);return s}function Ch(s,e,t,n,i){return s=(s-t)*i|0,e=(e-n)*i|0,s=(s|s<<8)&16711935,s=(s|s<<4)&252645135,s=(s|s<<2)&858993459,s=(s|s<<1)&1431655765,e=(e|e<<8)&16711935,e=(e|e<<4)&252645135,e=(e|e<<2)&858993459,e=(e|e<<1)&1431655765,s|e<<1}function sv(s){let e=s,t=s;do(e.x=(s-o)*(r-a)&&(s-o)*(n-a)>=(t-o)*(e-a)&&(t-o)*(r-a)>=(i-o)*(n-a)}function go(s,e,t,n,i,r,o,a){return!(s===o&&e===a)&&Of(s,e,t,n,i,r,o,a)}function rv(s,e){return s.next.i!==e.i&&s.prev.i!==e.i&&!ov(s,e)&&(xo(s,e)&&xo(e,s)&&av(s,e)&&(Tt(s.prev,s,e.prev)||Tt(s,e.prev,e))||hr(s,e)&&Tt(s.prev,s,s.next)>0&&Tt(e.prev,e,e.next)>0)}function Tt(s,e,t){return(e.y-s.y)*(t.x-e.x)-(e.x-s.x)*(t.y-e.y)}function hr(s,e){return s.x===e.x&&s.y===e.y}function Ff(s,e,t,n){const i=La(Tt(s,e,t)),r=La(Tt(s,e,n)),o=La(Tt(t,n,s)),a=La(Tt(t,n,e));return!!(i!==r&&o!==a||i===0&&Ra(s,t,e)||r===0&&Ra(s,n,e)||o===0&&Ra(t,s,n)||a===0&&Ra(t,e,n))}function Ra(s,e,t){return e.x<=Math.max(s.x,t.x)&&e.x>=Math.min(s.x,t.x)&&e.y<=Math.max(s.y,t.y)&&e.y>=Math.min(s.y,t.y)}function La(s){return s>0?1:s<0?-1:0}function ov(s,e){let t=s;do{if(t.i!==s.i&&t.next.i!==s.i&&t.i!==e.i&&t.next.i!==e.i&&Ff(t,t.next,s,e))return!0;t=t.next}while(t!==s);return!1}function xo(s,e){return Tt(s.prev,s,s.next)<0?Tt(s,e,s.next)>=0&&Tt(s,s.prev,e)>=0:Tt(s,e,s.prev)<0||Tt(s,s.next,e)<0}function av(s,e){let t=s,n=!1;const i=(s.x+e.x)/2,r=(s.y+e.y)/2;do t.y>r!=t.next.y>r&&t.next.y!==t.y&&i<(t.next.x-t.x)*(r-t.y)/(t.next.y-t.y)+t.x&&(n=!n),t=t.next;while(t!==s);return n}function zf(s,e){const t=Ph(s.i,s.x,s.y),n=Ph(e.i,e.x,e.y),i=s.next,r=e.prev;return s.next=e,e.prev=s,t.next=i,i.prev=t,n.next=t,t.prev=n,r.next=n,n.prev=r,n}function Hf(s,e,t,n){const i=Ph(s,e,t);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function vo(s){s.next.prev=s.prev,s.prev.next=s.next,s.prevZ&&(s.prevZ.nextZ=s.nextZ),s.nextZ&&(s.nextZ.prevZ=s.prevZ)}function Ph(s,e,t){return{i:s,x:e,y:t,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}function lv(s,e,t,n){let i=0;for(let r=e,o=t-n;r2&&s[e-1].equals(s[0])&&s.pop()}function Gf(s,e){for(let t=0;tNumber.EPSILON){const K=Math.sqrt(L),le=Math.sqrt(G*G+N*N),te=I.x-J/K,Ae=I.y+ee/K,be=V.x-N/le,Re=V.y+G/le,De=((be-te)*N-(Re-Ae)*G)/(ee*N-J*G);U=te+ee*De-T.x,k=Ae+J*De-T.y;const ue=U*U+k*k;if(ue<=2)return new ce(U,k);z=Math.sqrt(ue/2)}else{let K=!1;ee>Number.EPSILON?G>Number.EPSILON&&(K=!0):ee<-Number.EPSILON?G<-Number.EPSILON&&(K=!0):Math.sign(J)===Math.sign(N)&&(K=!0),K?(U=-J,k=ee,z=Math.sqrt(L)):(U=ee,k=J,z=Math.sqrt(L/2))}return new ce(U/z,k/z)}const Z=[];for(let T=0,I=F.length,V=I-1,U=T+1;T=0;T--){const I=T/x,V=f*Math.cos(I*Math.PI/2),U=p*Math.sin(I*Math.PI/2)+g;for(let k=0,z=F.length;k=0;){const U=V;let k=V-1;k<0&&(k=T.length-1);for(let z=0,ee=h+x*2;z0!=e>0&&this.version++,this._anisotropy=e}get clearcoat(){return this._clearcoat}set clearcoat(e){this._clearcoat>0!=e>0&&this.version++,this._clearcoat=e}get iridescence(){return this._iridescence}set iridescence(e){this._iridescence>0!=e>0&&this.version++,this._iridescence=e}get dispersion(){return this._dispersion}set dispersion(e){this._dispersion>0!=e>0&&this.version++,this._dispersion=e}get sheen(){return this._sheen}set sheen(e){this._sheen>0!=e>0&&this.version++,this._sheen=e}get transmission(){return this._transmission}set transmission(e){this._transmission>0!=e>0&&this.version++,this._transmission=e}copy(e){return super.copy(e),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=e.anisotropy,this.anisotropyRotation=e.anisotropyRotation,this.anisotropyMap=e.anisotropyMap,this.clearcoat=e.clearcoat,this.clearcoatMap=e.clearcoatMap,this.clearcoatRoughness=e.clearcoatRoughness,this.clearcoatRoughnessMap=e.clearcoatRoughnessMap,this.clearcoatNormalMap=e.clearcoatNormalMap,this.clearcoatNormalScale.copy(e.clearcoatNormalScale),this.dispersion=e.dispersion,this.ior=e.ior,this.iridescence=e.iridescence,this.iridescenceMap=e.iridescenceMap,this.iridescenceIOR=e.iridescenceIOR,this.iridescenceThicknessRange=[...e.iridescenceThicknessRange],this.iridescenceThicknessMap=e.iridescenceThicknessMap,this.sheen=e.sheen,this.sheenColor.copy(e.sheenColor),this.sheenColorMap=e.sheenColorMap,this.sheenRoughness=e.sheenRoughness,this.sheenRoughnessMap=e.sheenRoughnessMap,this.transmission=e.transmission,this.transmissionMap=e.transmissionMap,this.thickness=e.thickness,this.thicknessMap=e.thicknessMap,this.attenuationDistance=e.attenuationDistance,this.attenuationColor.copy(e.attenuationColor),this.specularIntensity=e.specularIntensity,this.specularIntensityMap=e.specularIntensityMap,this.specularColor.copy(e.specularColor),this.specularColorMap=e.specularColorMap,this}}class fv extends gn{constructor(e){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new Ue(16777215),this.specular=new Ue(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Ue(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Zr,this.normalScale=new ce(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new mn,this.combine=Wo,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.specular.copy(e.specular),this.shininess=e.shininess,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class pv extends gn{constructor(e){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Zr,this.normalScale=new ce(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(e)}copy(e){return super.copy(e),this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.flatShading=e.flatShading,this}}class Wf extends gn{constructor(e){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new Ue(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new Ue(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=Zr,this.normalScale=new ce(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new mn,this.combine=Wo,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapRotation.copy(e.envMapRotation),this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this.fog=e.fog,this}}class mv extends gn{constructor(e){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=Tg,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(e)}copy(e){return super.copy(e),this.depthPacking=e.depthPacking,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this}}class gv extends gn{constructor(e){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(e)}copy(e){return super.copy(e),this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this}}function Da(s,e){return!s||s.constructor===e?s:typeof e.BYTES_PER_ELEMENT=="number"?new e(s):Array.prototype.slice.call(s)}function xv(s){return ArrayBuffer.isView(s)&&!(s instanceof DataView)}function vv(s){function e(i,r){return s[i]-s[r]}const t=s.length,n=new Array(t);for(let i=0;i!==t;++i)n[i]=i;return n.sort(e),n}function Xf(s,e,t){const n=s.length,i=new s.constructor(n);for(let r=0,o=0;o!==n;++r){const a=t[r]*e;for(let l=0;l!==e;++l)i[o++]=s[a+l]}return i}function jf(s,e,t,n){let i=1,r=s[0];for(;r!==void 0&&r[n]===void 0;)r=s[i++];if(r===void 0)return;let o=r[n];if(o!==void 0)if(Array.isArray(o))do o=r[n],o!==void 0&&(e.push(r.time),t.push(...o)),r=s[i++];while(r!==void 0);else if(o.toArray!==void 0)do o=r[n],o!==void 0&&(e.push(r.time),o.toArray(t,t.length)),r=s[i++];while(r!==void 0);else do o=r[n],o!==void 0&&(e.push(r.time),t.push(o)),r=s[i++];while(r!==void 0)}class yo{constructor(e,t,n,i){this.parameterPositions=e,this._cachedIndex=0,this.resultBuffer=i!==void 0?i:new t.constructor(n),this.sampleValues=t,this.valueSize=n,this.settings=null,this.DefaultSettings_={}}evaluate(e){const t=this.parameterPositions;let n=this._cachedIndex,i=t[n],r=t[n-1];e:{t:{let o;n:{i:if(!(e=r)){const a=t[1];e=r)break t}o=n,n=0;break n}break e}for(;n>>1;et;)--o;if(++o,r!==0||o!==i){r>=o&&(o=Math.max(o,1),r=o-1);const a=this.getValueSize();this.times=n.slice(r,o),this.values=this.values.slice(r*a,o*a)}return this}validate(){let e=!0;const t=this.getValueSize();t-Math.floor(t)!==0&&(Qe("KeyframeTrack: Invalid value size in track.",this),e=!1);const n=this.times,i=this.values,r=n.length;r===0&&(Qe("KeyframeTrack: Track is empty.",this),e=!1);let o=null;for(let a=0;a!==r;a++){const l=n[a];if(typeof l=="number"&&isNaN(l)){Qe("KeyframeTrack: Time is not a valid number.",this,a,l),e=!1;break}if(o!==null&&o>l){Qe("KeyframeTrack: Out of order keys.",this,a,l,o),e=!1;break}o=l}if(i!==void 0&&xv(i))for(let a=0,l=i.length;a!==l;++a){const c=i[a];if(isNaN(c)){Qe("KeyframeTrack: Value is not a valid number.",this,a,c),e=!1;break}}return e}optimize(){const e=this.times.slice(),t=this.values.slice(),n=this.getValueSize(),i=this.getInterpolation()===Oc,r=e.length-1;let o=1;for(let a=1;a0){e[o]=e[r];for(let a=r*n,l=o*n,c=0;c!==n;++c)t[l+c]=t[a+c];++o}return o!==e.length?(this.times=e.slice(0,o),this.values=t.slice(0,o*n)):(this.times=e,this.values=t),this}clone(){const e=this.times.slice(),t=this.values.slice(),n=this.constructor,i=new n(this.name,e,t);return i.createInterpolant=this.createInterpolant,i}}$n.prototype.ValueTypeName="",$n.prototype.TimeBufferType=Float32Array,$n.prototype.ValueBufferType=Float32Array,$n.prototype.DefaultInterpolation=qr;class dr extends $n{constructor(e,t,n){super(e,t,n)}}dr.prototype.ValueTypeName="bool",dr.prototype.ValueBufferType=Array,dr.prototype.DefaultInterpolation=jr,dr.prototype.InterpolantFactoryMethodLinear=void 0,dr.prototype.InterpolantFactoryMethodSmooth=void 0;class qf extends $n{constructor(e,t,n,i){super(e,t,n,i)}}qf.prototype.ValueTypeName="color";class fr extends $n{constructor(e,t,n,i){super(e,t,n,i)}}fr.prototype.ValueTypeName="number";class Mv extends yo{constructor(e,t,n,i){super(e,t,n,i)}interpolate_(e,t,n,i){const r=this.resultBuffer,o=this.sampleValues,a=this.valueSize,l=(n-t)/(i-t);let c=e*a;for(let h=c+a;c!==h;c+=4)Dn.slerpFlat(r,0,o,c-a,o,c,l);return r}}class pr extends $n{constructor(e,t,n,i){super(e,t,n,i)}InterpolantFactoryMethodLinear(e){return new Mv(this.times,this.values,this.getValueSize(),e)}}pr.prototype.ValueTypeName="quaternion",pr.prototype.InterpolantFactoryMethodSmooth=void 0;class mr extends $n{constructor(e,t,n){super(e,t,n)}}mr.prototype.ValueTypeName="string",mr.prototype.ValueBufferType=Array,mr.prototype.DefaultInterpolation=jr,mr.prototype.InterpolantFactoryMethodLinear=void 0,mr.prototype.InterpolantFactoryMethodSmooth=void 0;class gr extends $n{constructor(e,t,n,i){super(e,t,n,i)}}gr.prototype.ValueTypeName="vector";class wv{constructor(e="",t=-1,n=[],i=Sg){this.name=e,this.tracks=n,this.duration=t,this.blendMode=i,this.uuid=Ln(),this.userData={},this.duration<0&&this.resetDuration()}static parse(e){const t=[],n=e.tracks,i=1/(e.fps||1);for(let o=0,a=n.length;o!==a;++o)t.push(Ev(n[o]).scale(i));const r=new this(e.name,e.duration,t,e.blendMode);return r.uuid=e.uuid,r.userData=JSON.parse(e.userData||"{}"),r}static toJSON(e){const t=[],n=e.tracks,i={name:e.name,duration:e.duration,tracks:t,uuid:e.uuid,blendMode:e.blendMode,userData:JSON.stringify(e.userData)};for(let r=0,o=n.length;r!==o;++r)t.push($n.toJSON(n[r]));return i}static CreateFromMorphTargetSequence(e,t,n,i){const r=t.length,o=[];for(let a=0;a1){const u=h[1];let d=i[u];d||(i[u]=d=[]),d.push(c)}}const o=[];for(const a in i)o.push(this.CreateFromMorphTargetSequence(a,i[a],t,n));return o}static parseAnimation(e,t){if(He("AnimationClip: parseAnimation() is deprecated and will be removed with r185"),!e)return Qe("AnimationClip: No animation in JSONLoader data."),null;const n=function(u,d,f,p,g){if(f.length!==0){const x=[],m=[];jf(f,x,m,p),x.length!==0&&g.push(new u(d,x,m))}},i=[],r=e.name||"default",o=e.fps||30,a=e.blendMode;let l=e.length||-1;const c=e.hierarchy||[];for(let u=0;u{t&&t(r),this.manager.itemEnd(e)},0),r;if(Si[e]!==void 0){Si[e].push({onLoad:t,onProgress:n,onError:i});return}Si[e]=[],Si[e].push({onLoad:t,onProgress:n,onError:i});const o=new Request(e,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin",signal:typeof AbortSignal.any=="function"?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal}),a=this.mimeType,l=this.responseType;fetch(o).then(c=>{if(c.status===200||c.status===0){if(c.status===0&&He("FileLoader: HTTP Status 0 received."),typeof ReadableStream>"u"||c.body===void 0||c.body.getReader===void 0)return c;const h=Si[e],u=c.body.getReader(),d=c.headers.get("X-File-Size")||c.headers.get("Content-Length"),f=d?parseInt(d):0,p=f!==0;let g=0;const x=new ReadableStream({start(m){b();function b(){u.read().then(({done:v,value:y})=>{if(v)m.close();else{g+=y.byteLength;const M=new ProgressEvent("progress",{lengthComputable:p,loaded:g,total:f});for(let E=0,A=h.length;E{m.error(v)})}}});return new Response(x)}else throw new Cv(`fetch for "${c.url}" responded with ${c.status}: ${c.statusText}`,c)}).then(c=>{switch(l){case"arraybuffer":return c.arrayBuffer();case"blob":return c.blob();case"document":return c.text().then(h=>new DOMParser().parseFromString(h,a));case"json":return c.json();default:if(a==="")return c.text();{const u=/charset="?([^;"\s]*)"?/i.exec(a),d=u&&u[1]?u[1].toLowerCase():void 0,f=new TextDecoder(d);return c.arrayBuffer().then(p=>f.decode(p))}}}).then(c=>{wi.add(`file:${e}`,c);const h=Si[e];delete Si[e];for(let u=0,d=h.length;u{const h=Si[e];if(h===void 0)throw this.manager.itemError(e),c;delete Si[e];for(let u=0,d=h.length;u{this.manager.itemEnd(e)}),this.manager.itemStart(e)}setResponseType(e){return this.responseType=e,this}setMimeType(e){return this.mimeType=e,this}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}const xr=new WeakMap;class Pv extends hs{constructor(e){super(e)}load(e,t,n,i){this.path!==void 0&&(e=this.path+e),e=this.manager.resolveURL(e);const r=this,o=wi.get(`image:${e}`);if(o!==void 0){if(o.complete===!0)r.manager.itemStart(e),setTimeout(function(){t&&t(o),r.manager.itemEnd(e)},0);else{let u=xr.get(o);u===void 0&&(u=[],xr.set(o,u)),u.push({onLoad:t,onError:i})}return o}const a=Yr("img");function l(){h(),t&&t(this);const u=xr.get(this)||[];for(let d=0;d"u"&&He("ImageBitmapLoader: createImageBitmap() not supported."),typeof fetch>"u"&&He("ImageBitmapLoader: fetch() not supported."),this.options={premultiplyAlpha:"none"},this._abortController=new AbortController}setOptions(e){return this.options=e,this}load(e,t,n,i){e===void 0&&(e=""),this.path!==void 0&&(e=this.path+e),e=this.manager.resolveURL(e);const r=this,o=wi.get(`image-bitmap:${e}`);if(o!==void 0){if(r.manager.itemStart(e),o.then){o.then(c=>{if(Bh.has(o)===!0)i&&i(Bh.get(o)),r.manager.itemError(e),r.manager.itemEnd(e);else return t&&t(c),r.manager.itemEnd(e),c});return}return setTimeout(function(){t&&t(o),r.manager.itemEnd(e)},0),o}const a={};a.credentials=this.crossOrigin==="anonymous"?"same-origin":"include",a.headers=this.requestHeader,a.signal=typeof AbortSignal.any=="function"?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal;const l=fetch(e,a).then(function(c){return c.blob()}).then(function(c){return createImageBitmap(c,Object.assign(r.options,{colorSpaceConversion:"none"}))}).then(function(c){return wi.add(`image-bitmap:${e}`,c),t&&t(c),r.manager.itemEnd(e),c}).catch(function(c){i&&i(c),Bh.set(l,c),wi.remove(`image-bitmap:${e}`),r.manager.itemError(e),r.manager.itemEnd(e)});wi.add(`image-bitmap:${e}`,l),r.manager.itemStart(e)}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}class kv extends sn{constructor(e=[]){super(),this.isArrayCamera=!0,this.isMultiViewCamera=!1,this.cameras=e}}class Uv{constructor(e=!0){this.autoStart=e,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=performance.now(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let e=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const t=performance.now();e=(t-this.oldTime)/1e3,this.oldTime=t,this.elapsedTime+=e}return e}}const Nh="\\[\\]\\.:\\/",Ov=new RegExp("["+Nh+"]","g"),kh="[^"+Nh+"]",Fv="[^"+Nh.replace("\\.","")+"]",zv=/((?:WC+[\/:])*)/.source.replace("WC",kh),Hv=/(WCOD+)?/.source.replace("WCOD",Fv),Vv=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",kh),Gv=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",kh),Wv=new RegExp("^"+zv+Hv+Vv+Gv+"$"),Xv=["material","materials","bones","map"];class jv{constructor(e,t,n){const i=n||dt.parseTrackName(t);this._targetGroup=e,this._bindings=e.subscribe_(t,i)}getValue(e,t){this.bind();const n=this._targetGroup.nCachedObjects_,i=this._bindings[n];i!==void 0&&i.getValue(e,t)}setValue(e,t){const n=this._bindings;for(let i=this._targetGroup.nCachedObjects_,r=n.length;i!==r;++i)n[i].setValue(e,t)}bind(){const e=this._bindings;for(let t=this._targetGroup.nCachedObjects_,n=e.length;t!==n;++t)e[t].bind()}unbind(){const e=this._bindings;for(let t=this._targetGroup.nCachedObjects_,n=e.length;t!==n;++t)e[t].unbind()}}class dt{constructor(e,t,n){this.path=t,this.parsedPath=n||dt.parseTrackName(t),this.node=dt.findNode(e,this.parsedPath.nodeName),this.rootNode=e,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(e,t,n){return e&&e.isAnimationObjectGroup?new dt.Composite(e,t,n):new dt(e,t,n)}static sanitizeNodeName(e){return e.replace(/\s/g,"_").replace(Ov,"")}static parseTrackName(e){const t=Wv.exec(e);if(t===null)throw new Error("PropertyBinding: Cannot parse trackName: "+e);const n={nodeName:t[2],objectName:t[3],objectIndex:t[4],propertyName:t[5],propertyIndex:t[6]},i=n.nodeName&&n.nodeName.lastIndexOf(".");if(i!==void 0&&i!==-1){const r=n.nodeName.substring(i+1);Xv.indexOf(r)!==-1&&(n.nodeName=n.nodeName.substring(0,i),n.objectName=r)}if(n.propertyName===null||n.propertyName.length===0)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+e);return n}static findNode(e,t){if(t===void 0||t===""||t==="."||t===-1||t===e.name||t===e.uuid)return e;if(e.skeleton){const n=e.skeleton.getBoneByName(t);if(n!==void 0)return n}if(e.children){const n=function(r){for(let o=0;o1&&(o=1,r=qe((g-p)/u,0,1))}}return t.copy(a).add(br.multiplyScalar(r)),n.copy(l).add(yr.multiplyScalar(o)),t.sub(n),t.dot(t)}applyMatrix4(e){return this.start.applyMatrix4(e),this.end.applyMatrix4(e),this}equals(e){return e.start.equals(this.start)&&e.end.equals(this.end)}clone(){return new this.constructor().copy(this)}}class Yv extends ns{constructor(e,t=null){super(),this.object=e,this.domElement=t,this.enabled=!0,this.state=-1,this.keys={},this.mouseButtons={LEFT:null,MIDDLE:null,RIGHT:null},this.touches={ONE:null,TWO:null}}connect(e){if(e===void 0){He("Controls: connect() now requires an element.");return}this.domElement!==null&&this.disconnect(),this.domElement=e}disconnect(){}dispose(){}update(){}}function np(s,e,t,n){const i=Kv(n);switch(t){case Ed:return s*e;case rc:return s*e/i.components*i.byteLength;case oc:return s*e/i.components*i.byteLength;case ac:return s*e*2/i.components*i.byteLength;case lc:return s*e*2/i.components*i.byteLength;case Td:return s*e*3/i.components*i.byteLength;case fn:return s*e*4/i.components*i.byteLength;case cc:return s*e*4/i.components*i.byteLength;case Zo:case Yo:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*8;case Ko:case $o:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*16;case uc:case fc:return Math.max(s,16)*Math.max(e,8)/4;case hc:case dc:return Math.max(s,8)*Math.max(e,8)/2;case pc:case mc:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*8;case gc:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*16;case xc:return Math.floor((s+3)/4)*Math.floor((e+3)/4)*16;case vc:return Math.floor((s+4)/5)*Math.floor((e+3)/4)*16;case bc:return Math.floor((s+4)/5)*Math.floor((e+4)/5)*16;case yc:return Math.floor((s+5)/6)*Math.floor((e+4)/5)*16;case _c:return Math.floor((s+5)/6)*Math.floor((e+5)/6)*16;case Mc:return Math.floor((s+7)/8)*Math.floor((e+4)/5)*16;case wc:return Math.floor((s+7)/8)*Math.floor((e+5)/6)*16;case Sc:return Math.floor((s+7)/8)*Math.floor((e+7)/8)*16;case Ec:return Math.floor((s+9)/10)*Math.floor((e+4)/5)*16;case Tc:return Math.floor((s+9)/10)*Math.floor((e+5)/6)*16;case Ac:return Math.floor((s+9)/10)*Math.floor((e+7)/8)*16;case Cc:return Math.floor((s+9)/10)*Math.floor((e+9)/10)*16;case Pc:return Math.floor((s+11)/12)*Math.floor((e+9)/10)*16;case Rc:return Math.floor((s+11)/12)*Math.floor((e+11)/12)*16;case Lc:case Dc:case Ic:return Math.ceil(s/4)*Math.ceil(e/4)*16;case Bc:case Nc:return Math.ceil(s/4)*Math.ceil(e/4)*8;case kc:case Uc:return Math.ceil(s/4)*Math.ceil(e/4)*16}throw new Error(`Unable to determine texture byte length for ${t} format.`)}function Kv(s){switch(s){case Wn:case _d:return{byteLength:1,components:1};case Wr:case Md:case Rn:return{byteLength:2,components:1};case ic:case sc:return{byteLength:2,components:4};case ts:case nc:case Xn:return{byteLength:4,components:1};case wd:case Sd:return{byteLength:4,components:3}}throw new Error(`Unknown texture type ${s}.`)}typeof __THREE_DEVTOOLS__<"u"&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:Hr}})),typeof window<"u"&&(window.__THREE__?He("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=Hr);function ip(){let s=null,e=!1,t=null,n=null;function i(r,o){t(r,o),n=s.requestAnimationFrame(i)}return{start:function(){e!==!0&&t!==null&&(n=s.requestAnimationFrame(i),e=!0)},stop:function(){s.cancelAnimationFrame(n),e=!1},setAnimationLoop:function(r){t=r},setContext:function(r){s=r}}}function $v(s){const e=new WeakMap;function t(a,l){const c=a.array,h=a.usage,u=c.byteLength,d=s.createBuffer();s.bindBuffer(l,d),s.bufferData(l,c,h),a.onUploadCallback();let f;if(c instanceof Float32Array)f=s.FLOAT;else if(typeof Float16Array<"u"&&c instanceof Float16Array)f=s.HALF_FLOAT;else if(c instanceof Uint16Array)a.isFloat16BufferAttribute?f=s.HALF_FLOAT:f=s.UNSIGNED_SHORT;else if(c instanceof Int16Array)f=s.SHORT;else if(c instanceof Uint32Array)f=s.UNSIGNED_INT;else if(c instanceof Int32Array)f=s.INT;else if(c instanceof Int8Array)f=s.BYTE;else if(c instanceof Uint8Array)f=s.UNSIGNED_BYTE;else if(c instanceof Uint8ClampedArray)f=s.UNSIGNED_BYTE;else throw new Error("THREE.WebGLAttributes: Unsupported buffer data format: "+c);return{buffer:d,type:f,bytesPerElement:c.BYTES_PER_ELEMENT,version:a.version,size:u}}function n(a,l,c){const h=l.array,u=l.updateRanges;if(s.bindBuffer(c,a),u.length===0)s.bufferSubData(c,0,h);else{u.sort((f,p)=>f.start-p.start);let d=0;for(let f=1;f 0 +#endif`,f1=`#if NUM_CLIPPING_PLANES > 0 vec4 plane; #ifdef ALPHA_TO_COVERAGE float distanceToPlane, distanceGradient; @@ -295,26 +295,26 @@ vec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in ve if ( clipped ) discard; #endif #endif -#endif`,m1=`#if NUM_CLIPPING_PLANES > 0 +#endif`,p1=`#if NUM_CLIPPING_PLANES > 0 varying vec3 vClipPosition; uniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ]; -#endif`,g1=`#if NUM_CLIPPING_PLANES > 0 +#endif`,m1=`#if NUM_CLIPPING_PLANES > 0 varying vec3 vClipPosition; -#endif`,x1=`#if NUM_CLIPPING_PLANES > 0 +#endif`,g1=`#if NUM_CLIPPING_PLANES > 0 vClipPosition = - mvPosition.xyz; -#endif`,v1=`#if defined( USE_COLOR_ALPHA ) +#endif`,x1=`#if defined( USE_COLOR_ALPHA ) diffuseColor *= vColor; #elif defined( USE_COLOR ) diffuseColor.rgb *= vColor; -#endif`,b1=`#if defined( USE_COLOR_ALPHA ) +#endif`,v1=`#if defined( USE_COLOR_ALPHA ) varying vec4 vColor; #elif defined( USE_COLOR ) varying vec3 vColor; -#endif`,y1=`#if defined( USE_COLOR_ALPHA ) +#endif`,b1=`#if defined( USE_COLOR_ALPHA ) varying vec4 vColor; #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) varying vec3 vColor; -#endif`,_1=`#if defined( USE_COLOR_ALPHA ) +#endif`,y1=`#if defined( USE_COLOR_ALPHA ) vColor = vec4( 1.0 ); #elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR ) vColor = vec3( 1.0 ); @@ -328,7 +328,7 @@ vec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in ve #ifdef USE_BATCHING_COLOR vec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) ); vColor.xyz *= batchingColor.xyz; -#endif`,M1=`#define PI 3.141592653589793 +#endif`,_1=`#define PI 3.141592653589793 #define PI2 6.283185307179586 #define PI_HALF 1.5707963267948966 #define RECIPROCAL_PI 0.3183098861837907 @@ -395,7 +395,7 @@ vec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) { float F_Schlick( const in float f0, const in float f90, const in float dotVH ) { float fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH ); return f0 * ( 1.0 - fresnel ) + ( f90 * fresnel ); -} // validated`,w1=`#ifdef ENVMAP_TYPE_CUBE_UV +} // validated`,M1=`#ifdef ENVMAP_TYPE_CUBE_UV #define cubeUV_minMipLevel 4.0 #define cubeUV_minTileSize 16.0 float getFace( vec3 direction ) { @@ -488,7 +488,7 @@ float F_Schlick( const in float f0, const in float f90, const in float dotVH ) { return vec4( mix( color0, color1, mipF ), 1.0 ); } } -#endif`,S1=`vec3 transformedNormal = objectNormal; +#endif`,w1=`vec3 transformedNormal = objectNormal; #ifdef USE_TANGENT vec3 transformedTangent = objectTangent; #endif @@ -517,21 +517,21 @@ transformedNormal = normalMatrix * transformedNormal; #ifdef FLIP_SIDED transformedTangent = - transformedTangent; #endif -#endif`,E1=`#ifdef USE_DISPLACEMENTMAP +#endif`,S1=`#ifdef USE_DISPLACEMENTMAP uniform sampler2D displacementMap; uniform float displacementScale; uniform float displacementBias; -#endif`,T1=`#ifdef USE_DISPLACEMENTMAP +#endif`,E1=`#ifdef USE_DISPLACEMENTMAP transformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias ); -#endif`,A1=`#ifdef USE_EMISSIVEMAP +#endif`,T1=`#ifdef USE_EMISSIVEMAP vec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv ); #ifdef DECODE_VIDEO_TEXTURE_EMISSIVE emissiveColor = sRGBTransferEOTF( emissiveColor ); #endif totalEmissiveRadiance *= emissiveColor.rgb; -#endif`,C1=`#ifdef USE_EMISSIVEMAP +#endif`,A1=`#ifdef USE_EMISSIVEMAP uniform sampler2D emissiveMap; -#endif`,P1="gl_FragColor = linearToOutputTexel( gl_FragColor );",R1=`vec4 LinearTransferOETF( in vec4 value ) { +#endif`,C1="gl_FragColor = linearToOutputTexel( gl_FragColor );",P1=`vec4 LinearTransferOETF( in vec4 value ) { return value; } vec4 sRGBTransferEOTF( in vec4 value ) { @@ -539,7 +539,7 @@ vec4 sRGBTransferEOTF( in vec4 value ) { } vec4 sRGBTransferOETF( in vec4 value ) { return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a ); -}`,L1=`#ifdef USE_ENVMAP +}`,R1=`#ifdef USE_ENVMAP #ifdef ENV_WORLDPOS vec3 cameraToFrag; if ( isOrthographic ) { @@ -568,7 +568,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { #elif defined( ENVMAP_BLENDING_ADD ) outgoingLight += envColor.xyz * specularStrength * reflectivity; #endif -#endif`,D1=`#ifdef USE_ENVMAP +#endif`,L1=`#ifdef USE_ENVMAP uniform float envMapIntensity; uniform float flipEnvMap; uniform mat3 envMapRotation; @@ -577,7 +577,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { #else uniform sampler2D envMap; #endif -#endif`,I1=`#ifdef USE_ENVMAP +#endif`,D1=`#ifdef USE_ENVMAP uniform float reflectivity; #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) #define ENV_WORLDPOS @@ -588,7 +588,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { #else varying vec3 vReflect; #endif -#endif`,B1=`#ifdef USE_ENVMAP +#endif`,I1=`#ifdef USE_ENVMAP #if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT ) #define ENV_WORLDPOS #endif @@ -599,7 +599,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { varying vec3 vReflect; uniform float refractionRatio; #endif -#endif`,N1=`#ifdef USE_ENVMAP +#endif`,B1=`#ifdef USE_ENVMAP #ifdef ENV_WORLDPOS vWorldPosition = worldPosition.xyz; #else @@ -616,18 +616,18 @@ vec4 sRGBTransferOETF( in vec4 value ) { vReflect = refract( cameraToVertex, worldNormal, refractionRatio ); #endif #endif -#endif`,k1=`#ifdef USE_FOG +#endif`,N1=`#ifdef USE_FOG vFogDepth = - mvPosition.z; -#endif`,U1=`#ifdef USE_FOG +#endif`,k1=`#ifdef USE_FOG varying float vFogDepth; -#endif`,O1=`#ifdef USE_FOG +#endif`,U1=`#ifdef USE_FOG #ifdef FOG_EXP2 float fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth ); #else float fogFactor = smoothstep( fogNear, fogFar, vFogDepth ); #endif gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor ); -#endif`,F1=`#ifdef USE_FOG +#endif`,O1=`#ifdef USE_FOG uniform vec3 fogColor; varying float vFogDepth; #ifdef FOG_EXP2 @@ -636,7 +636,7 @@ vec4 sRGBTransferOETF( in vec4 value ) { uniform float fogNear; uniform float fogFar; #endif -#endif`,z1=`#ifdef USE_GRADIENTMAP +#endif`,F1=`#ifdef USE_GRADIENTMAP uniform sampler2D gradientMap; #endif vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { @@ -648,12 +648,12 @@ vec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) { vec2 fw = fwidth( coord ) * 0.5; return mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) ); #endif -}`,H1=`#ifdef USE_LIGHTMAP +}`,z1=`#ifdef USE_LIGHTMAP uniform sampler2D lightMap; uniform float lightMapIntensity; -#endif`,V1=`LambertMaterial material; +#endif`,H1=`LambertMaterial material; material.diffuseColor = diffuseColor.rgb; -material.specularStrength = specularStrength;`,G1=`varying vec3 vViewPosition; +material.specularStrength = specularStrength;`,V1=`varying vec3 vViewPosition; struct LambertMaterial { vec3 diffuseColor; float specularStrength; @@ -667,7 +667,7 @@ void RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometr reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); } #define RE_Direct RE_Direct_Lambert -#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert`,W1=`uniform bool receiveShadow; +#define RE_IndirectDiffuse RE_IndirectDiffuse_Lambert`,G1=`uniform bool receiveShadow; uniform vec3 ambientLightColor; #if defined( USE_LIGHT_PROBES ) uniform vec3 lightProbe[ 9 ]; @@ -783,7 +783,7 @@ float getSpotAttenuation( const in float coneCosine, const in float penumbraCosi vec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight ); return irradiance; } -#endif`,X1=`#ifdef USE_ENVMAP +#endif`,W1=`#ifdef USE_ENVMAP vec3 getIBLIrradiance( const in vec3 normal ) { #ifdef ENVMAP_TYPE_CUBE_UV vec3 worldNormal = inverseTransformDirection( normal, viewMatrix ); @@ -816,8 +816,8 @@ float getSpotAttenuation( const in float coneCosine, const in float penumbraCosi #endif } #endif -#endif`,j1=`ToonMaterial material; -material.diffuseColor = diffuseColor.rgb;`,q1=`varying vec3 vViewPosition; +#endif`,X1=`ToonMaterial material; +material.diffuseColor = diffuseColor.rgb;`,j1=`varying vec3 vViewPosition; struct ToonMaterial { vec3 diffuseColor; }; @@ -829,11 +829,11 @@ void RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPo reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); } #define RE_Direct RE_Direct_Toon -#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon`,Z1=`BlinnPhongMaterial material; +#define RE_IndirectDiffuse RE_IndirectDiffuse_Toon`,q1=`BlinnPhongMaterial material; material.diffuseColor = diffuseColor.rgb; material.specularColor = specular; material.specularShininess = shininess; -material.specularStrength = specularStrength;`,Y1=`varying vec3 vViewPosition; +material.specularStrength = specularStrength;`,Z1=`varying vec3 vViewPosition; struct BlinnPhongMaterial { vec3 diffuseColor; vec3 specularColor; @@ -850,7 +850,7 @@ void RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geom reflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor ); } #define RE_Direct RE_Direct_BlinnPhong -#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong`,K1=`PhysicalMaterial material; +#define RE_IndirectDiffuse RE_IndirectDiffuse_BlinnPhong`,Y1=`PhysicalMaterial material; material.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor ); vec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) ); float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z ); @@ -936,7 +936,7 @@ material.roughness = min( material.roughness, 1.0 ); material.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) ); material.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y; material.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y; -#endif`,$1=`uniform sampler2D dfgLUT; +#endif`,K1=`uniform sampler2D dfgLUT; struct PhysicalMaterial { vec3 diffuseColor; float roughness; @@ -1252,7 +1252,7 @@ void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradia #define RE_IndirectSpecular RE_IndirectSpecular_Physical float computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) { return saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion ); -}`,J1=` +}`,$1=` vec3 geometryPosition = - vViewPosition; vec3 geometryNormal = normal; vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition ); @@ -1367,7 +1367,7 @@ IncidentLight directLight; #if defined( RE_IndirectSpecular ) vec3 radiance = vec3( 0.0 ); vec3 clearcoatRadiance = vec3( 0.0 ); -#endif`,Q1=`#if defined( RE_IndirectDiffuse ) +#endif`,J1=`#if defined( RE_IndirectDiffuse ) #ifdef USE_LIGHTMAP vec4 lightMapTexel = texture2D( lightMap, vLightMapUv ); vec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity; @@ -1386,32 +1386,32 @@ IncidentLight directLight; #ifdef USE_CLEARCOAT clearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness ); #endif -#endif`,eb=`#if defined( RE_IndirectDiffuse ) +#endif`,Q1=`#if defined( RE_IndirectDiffuse ) RE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); #endif #if defined( RE_IndirectSpecular ) RE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight ); -#endif`,tb=`#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) +#endif`,eb=`#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) gl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5; -#endif`,nb=`#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) +#endif`,tb=`#if defined( USE_LOGARITHMIC_DEPTH_BUFFER ) uniform float logDepthBufFC; varying float vFragDepth; varying float vIsPerspective; -#endif`,ib=`#ifdef USE_LOGARITHMIC_DEPTH_BUFFER +#endif`,nb=`#ifdef USE_LOGARITHMIC_DEPTH_BUFFER varying float vFragDepth; varying float vIsPerspective; -#endif`,sb=`#ifdef USE_LOGARITHMIC_DEPTH_BUFFER +#endif`,ib=`#ifdef USE_LOGARITHMIC_DEPTH_BUFFER vFragDepth = 1.0 + gl_Position.w; vIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) ); -#endif`,rb=`#ifdef USE_MAP +#endif`,sb=`#ifdef USE_MAP vec4 sampledDiffuseColor = texture2D( map, vMapUv ); #ifdef DECODE_VIDEO_TEXTURE sampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor ); #endif diffuseColor *= sampledDiffuseColor; -#endif`,ob=`#ifdef USE_MAP +#endif`,rb=`#ifdef USE_MAP uniform sampler2D map; -#endif`,ab=`#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) +#endif`,ob=`#if defined( USE_MAP ) || defined( USE_ALPHAMAP ) #if defined( USE_POINTS_UV ) vec2 uv = vUv; #else @@ -1423,7 +1423,7 @@ IncidentLight directLight; #endif #ifdef USE_ALPHAMAP diffuseColor.a *= texture2D( alphaMap, uv ).g; -#endif`,lb=`#if defined( USE_POINTS_UV ) +#endif`,ab=`#if defined( USE_POINTS_UV ) varying vec2 vUv; #else #if defined( USE_MAP ) || defined( USE_ALPHAMAP ) @@ -1435,19 +1435,19 @@ IncidentLight directLight; #endif #ifdef USE_ALPHAMAP uniform sampler2D alphaMap; -#endif`,cb=`float metalnessFactor = metalness; +#endif`,lb=`float metalnessFactor = metalness; #ifdef USE_METALNESSMAP vec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv ); metalnessFactor *= texelMetalness.b; -#endif`,hb=`#ifdef USE_METALNESSMAP +#endif`,cb=`#ifdef USE_METALNESSMAP uniform sampler2D metalnessMap; -#endif`,ub=`#ifdef USE_INSTANCING_MORPH +#endif`,hb=`#ifdef USE_INSTANCING_MORPH float morphTargetInfluences[ MORPHTARGETS_COUNT ]; float morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { morphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r; } -#endif`,db=`#if defined( USE_MORPHCOLORS ) +#endif`,ub=`#if defined( USE_MORPHCOLORS ) vColor *= morphTargetBaseInfluence; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { #if defined( USE_COLOR_ALPHA ) @@ -1456,12 +1456,12 @@ IncidentLight directLight; if ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ]; #endif } -#endif`,fb=`#ifdef USE_MORPHNORMALS +#endif`,db=`#ifdef USE_MORPHNORMALS objectNormal *= morphTargetBaseInfluence; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { if ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ]; } -#endif`,pb=`#ifdef USE_MORPHTARGETS +#endif`,fb=`#ifdef USE_MORPHTARGETS #ifndef USE_INSTANCING_MORPH uniform float morphTargetBaseInfluence; uniform float morphTargetInfluences[ MORPHTARGETS_COUNT ]; @@ -1475,12 +1475,12 @@ IncidentLight directLight; ivec3 morphUV = ivec3( x, y, morphTargetIndex ); return texelFetch( morphTargetsTexture, morphUV, 0 ); } -#endif`,mb=`#ifdef USE_MORPHTARGETS +#endif`,pb=`#ifdef USE_MORPHTARGETS transformed *= morphTargetBaseInfluence; for ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) { if ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ]; } -#endif`,gb=`float faceDirection = gl_FrontFacing ? 1.0 : - 1.0; +#endif`,mb=`float faceDirection = gl_FrontFacing ? 1.0 : - 1.0; #ifdef FLAT_SHADED vec3 fdx = dFdx( vViewPosition ); vec3 fdy = dFdy( vViewPosition ); @@ -1521,7 +1521,7 @@ IncidentLight directLight; tbn2[1] *= faceDirection; #endif #endif -vec3 nonPerturbedNormal = normal;`,xb=`#ifdef USE_NORMALMAP_OBJECTSPACE +vec3 nonPerturbedNormal = normal;`,gb=`#ifdef USE_NORMALMAP_OBJECTSPACE normal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0; #ifdef FLIP_SIDED normal = - normal; @@ -1536,6 +1536,12 @@ vec3 nonPerturbedNormal = normal;`,xb=`#ifdef USE_NORMALMAP_OBJECTSPACE normal = normalize( tbn * mapN ); #elif defined( USE_BUMPMAP ) normal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection ); +#endif`,xb=`#ifndef FLAT_SHADED + varying vec3 vNormal; + #ifdef USE_TANGENT + varying vec3 vTangent; + varying vec3 vBitangent; + #endif #endif`,vb=`#ifndef FLAT_SHADED varying vec3 vNormal; #ifdef USE_TANGENT @@ -1543,18 +1549,12 @@ vec3 nonPerturbedNormal = normal;`,xb=`#ifdef USE_NORMALMAP_OBJECTSPACE varying vec3 vBitangent; #endif #endif`,bb=`#ifndef FLAT_SHADED - varying vec3 vNormal; - #ifdef USE_TANGENT - varying vec3 vTangent; - varying vec3 vBitangent; - #endif -#endif`,yb=`#ifndef FLAT_SHADED vNormal = normalize( transformedNormal ); #ifdef USE_TANGENT vTangent = normalize( transformedTangent ); vBitangent = normalize( cross( vNormal, vTangent ) * tangent.w ); #endif -#endif`,_b=`#ifdef USE_NORMALMAP +#endif`,yb=`#ifdef USE_NORMALMAP uniform sampler2D normalMap; uniform vec2 normalScale; #endif @@ -1576,13 +1576,13 @@ vec3 nonPerturbedNormal = normal;`,xb=`#ifdef USE_NORMALMAP_OBJECTSPACE float scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det ); return mat3( T * scale, B * scale, N ); } -#endif`,Mb=`#ifdef USE_CLEARCOAT +#endif`,_b=`#ifdef USE_CLEARCOAT vec3 clearcoatNormal = nonPerturbedNormal; -#endif`,wb=`#ifdef USE_CLEARCOAT_NORMALMAP +#endif`,Mb=`#ifdef USE_CLEARCOAT_NORMALMAP vec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0; clearcoatMapN.xy *= clearcoatNormalScale; clearcoatNormal = normalize( tbn2 * clearcoatMapN ); -#endif`,Sb=`#ifdef USE_CLEARCOATMAP +#endif`,wb=`#ifdef USE_CLEARCOATMAP uniform sampler2D clearcoatMap; #endif #ifdef USE_CLEARCOAT_NORMALMAP @@ -1591,18 +1591,18 @@ vec3 nonPerturbedNormal = normal;`,xb=`#ifdef USE_NORMALMAP_OBJECTSPACE #endif #ifdef USE_CLEARCOAT_ROUGHNESSMAP uniform sampler2D clearcoatRoughnessMap; -#endif`,Eb=`#ifdef USE_IRIDESCENCEMAP +#endif`,Sb=`#ifdef USE_IRIDESCENCEMAP uniform sampler2D iridescenceMap; #endif #ifdef USE_IRIDESCENCE_THICKNESSMAP uniform sampler2D iridescenceThicknessMap; -#endif`,Tb=`#ifdef OPAQUE +#endif`,Eb=`#ifdef OPAQUE diffuseColor.a = 1.0; #endif #ifdef USE_TRANSMISSION diffuseColor.a *= material.transmissionAlpha; #endif -gl_FragColor = vec4( outgoingLight, diffuseColor.a );`,Ab=`vec3 packNormalToRGB( const in vec3 normal ) { +gl_FragColor = vec4( outgoingLight, diffuseColor.a );`,Tb=`vec3 packNormalToRGB( const in vec3 normal ) { return normalize( normal ) * 0.5 + 0.5; } vec3 unpackRGBToNormal( const in vec3 rgb ) { @@ -1671,9 +1671,9 @@ float viewZToPerspectiveDepth( const in float viewZ, const in float near, const } float perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) { return ( near * far ) / ( ( far - near ) * depth - far ); -}`,Cb=`#ifdef PREMULTIPLIED_ALPHA +}`,Ab=`#ifdef PREMULTIPLIED_ALPHA gl_FragColor.rgb *= gl_FragColor.a; -#endif`,Pb=`vec4 mvPosition = vec4( transformed, 1.0 ); +#endif`,Cb=`vec4 mvPosition = vec4( transformed, 1.0 ); #ifdef USE_BATCHING mvPosition = batchingMatrix * mvPosition; #endif @@ -1681,22 +1681,22 @@ float perspectiveDepthToViewZ( const in float depth, const in float near, const mvPosition = instanceMatrix * mvPosition; #endif mvPosition = modelViewMatrix * mvPosition; -gl_Position = projectionMatrix * mvPosition;`,Rb=`#ifdef DITHERING +gl_Position = projectionMatrix * mvPosition;`,Pb=`#ifdef DITHERING gl_FragColor.rgb = dithering( gl_FragColor.rgb ); -#endif`,Lb=`#ifdef DITHERING +#endif`,Rb=`#ifdef DITHERING vec3 dithering( vec3 color ) { float grid_position = rand( gl_FragCoord.xy ); vec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 ); dither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position ); return color + dither_shift_RGB; } -#endif`,Db=`float roughnessFactor = roughness; +#endif`,Lb=`float roughnessFactor = roughness; #ifdef USE_ROUGHNESSMAP vec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv ); roughnessFactor *= texelRoughness.g; -#endif`,Ib=`#ifdef USE_ROUGHNESSMAP +#endif`,Db=`#ifdef USE_ROUGHNESSMAP uniform sampler2D roughnessMap; -#endif`,Bb=`#if NUM_SPOT_LIGHT_COORDS > 0 +#endif`,Ib=`#if NUM_SPOT_LIGHT_COORDS > 0 varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; #endif #if NUM_SPOT_LIGHT_MAPS > 0 @@ -1891,7 +1891,7 @@ gl_Position = projectionMatrix * mvPosition;`,Rb=`#ifdef DITHERING } return mix( 1.0, shadow, shadowIntensity ); } -#endif`,Nb=`#if NUM_SPOT_LIGHT_COORDS > 0 +#endif`,Bb=`#if NUM_SPOT_LIGHT_COORDS > 0 uniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ]; varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ]; #endif @@ -1932,7 +1932,7 @@ gl_Position = projectionMatrix * mvPosition;`,Rb=`#ifdef DITHERING }; uniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ]; #endif -#endif`,kb=`#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 ) +#endif`,Nb=`#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 ) vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix ); vec4 shadowWorldPosition; #endif @@ -1964,7 +1964,7 @@ gl_Position = projectionMatrix * mvPosition;`,Rb=`#ifdef DITHERING vSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition; } #pragma unroll_loop_end -#endif`,Ub=`float getShadowMask() { +#endif`,kb=`float getShadowMask() { float shadow = 1.0; #ifdef USE_SHADOWMAP #if NUM_DIR_LIGHT_SHADOWS > 0 @@ -1996,12 +1996,12 @@ gl_Position = projectionMatrix * mvPosition;`,Rb=`#ifdef DITHERING #endif #endif return shadow; -}`,Ob=`#ifdef USE_SKINNING +}`,Ub=`#ifdef USE_SKINNING mat4 boneMatX = getBoneMatrix( skinIndex.x ); mat4 boneMatY = getBoneMatrix( skinIndex.y ); mat4 boneMatZ = getBoneMatrix( skinIndex.z ); mat4 boneMatW = getBoneMatrix( skinIndex.w ); -#endif`,Fb=`#ifdef USE_SKINNING +#endif`,Ob=`#ifdef USE_SKINNING uniform mat4 bindMatrix; uniform mat4 bindMatrixInverse; uniform highp sampler2D boneTexture; @@ -2016,7 +2016,7 @@ gl_Position = projectionMatrix * mvPosition;`,Rb=`#ifdef DITHERING vec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 ); return mat4( v1, v2, v3, v4 ); } -#endif`,zb=`#ifdef USE_SKINNING +#endif`,Fb=`#ifdef USE_SKINNING vec4 skinVertex = bindMatrix * vec4( transformed, 1.0 ); vec4 skinned = vec4( 0.0 ); skinned += boneMatX * skinVertex * skinWeight.x; @@ -2024,7 +2024,7 @@ gl_Position = projectionMatrix * mvPosition;`,Rb=`#ifdef DITHERING skinned += boneMatZ * skinVertex * skinWeight.z; skinned += boneMatW * skinVertex * skinWeight.w; transformed = ( bindMatrixInverse * skinned ).xyz; -#endif`,Hb=`#ifdef USE_SKINNING +#endif`,zb=`#ifdef USE_SKINNING mat4 skinMatrix = mat4( 0.0 ); skinMatrix += skinWeight.x * boneMatX; skinMatrix += skinWeight.y * boneMatY; @@ -2035,17 +2035,17 @@ gl_Position = projectionMatrix * mvPosition;`,Rb=`#ifdef DITHERING #ifdef USE_TANGENT objectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz; #endif -#endif`,Vb=`float specularStrength; +#endif`,Hb=`float specularStrength; #ifdef USE_SPECULARMAP vec4 texelSpecular = texture2D( specularMap, vSpecularMapUv ); specularStrength = texelSpecular.r; #else specularStrength = 1.0; -#endif`,Gb=`#ifdef USE_SPECULARMAP +#endif`,Vb=`#ifdef USE_SPECULARMAP uniform sampler2D specularMap; -#endif`,Wb=`#if defined( TONE_MAPPING ) +#endif`,Gb=`#if defined( TONE_MAPPING ) gl_FragColor.rgb = toneMapping( gl_FragColor.rgb ); -#endif`,Xb=`#ifndef saturate +#endif`,Wb=`#ifndef saturate #define saturate( a ) clamp( a, 0.0, 1.0 ) #endif uniform float toneMappingExposure; @@ -2142,7 +2142,7 @@ vec3 NeutralToneMapping( vec3 color ) { float g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. ); return mix( color, vec3( newPeak ), g ); } -vec3 CustomToneMapping( vec3 color ) { return color; }`,jb=`#ifdef USE_TRANSMISSION +vec3 CustomToneMapping( vec3 color ) { return color; }`,Xb=`#ifdef USE_TRANSMISSION material.transmission = transmission; material.transmissionAlpha = 1.0; material.thickness = thickness; @@ -2163,7 +2163,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,jb=`#ifdef USE_TRANSMISS material.attenuationColor, material.attenuationDistance ); material.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission ); totalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission ); -#endif`,qb=`#ifdef USE_TRANSMISSION +#endif`,jb=`#ifdef USE_TRANSMISSION uniform float transmission; uniform float thickness; uniform float attenuationDistance; @@ -2289,7 +2289,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,jb=`#ifdef USE_TRANSMISS float transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0; return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor ); } -#endif`,Zb=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`,qb=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) varying vec2 vUv; #endif #ifdef USE_MAP @@ -2359,7 +2359,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,jb=`#ifdef USE_TRANSMISS #ifdef USE_THICKNESSMAP uniform mat3 thicknessMapTransform; varying vec2 vThicknessMapUv; -#endif`,Yb=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`,Zb=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) varying vec2 vUv; #endif #ifdef USE_MAP @@ -2453,7 +2453,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,jb=`#ifdef USE_TRANSMISS #ifdef USE_THICKNESSMAP uniform mat3 thicknessMapTransform; varying vec2 vThicknessMapUv; -#endif`,Kb=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) +#endif`,Yb=`#if defined( USE_UV ) || defined( USE_ANISOTROPY ) vUv = vec3( uv, 1 ).xy; #endif #ifdef USE_MAP @@ -2524,7 +2524,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,jb=`#ifdef USE_TRANSMISS #endif #ifdef USE_THICKNESSMAP vThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy; -#endif`,$b=`#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0 +#endif`,Kb=`#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0 vec4 worldPosition = vec4( transformed, 1.0 ); #ifdef USE_BATCHING worldPosition = batchingMatrix * worldPosition; @@ -2533,7 +2533,7 @@ vec3 CustomToneMapping( vec3 color ) { return color; }`,jb=`#ifdef USE_TRANSMISS worldPosition = instanceMatrix * worldPosition; #endif worldPosition = modelMatrix * worldPosition; -#endif`;const et={alphahash_fragment:Qv,alphahash_pars_fragment:e1,alphamap_fragment:t1,alphamap_pars_fragment:n1,alphatest_fragment:i1,alphatest_pars_fragment:s1,aomap_fragment:r1,aomap_pars_fragment:o1,batching_pars_vertex:a1,batching_vertex:l1,begin_vertex:c1,beginnormal_vertex:h1,bsdfs:u1,iridescence_fragment:d1,bumpmap_pars_fragment:f1,clipping_planes_fragment:p1,clipping_planes_pars_fragment:m1,clipping_planes_pars_vertex:g1,clipping_planes_vertex:x1,color_fragment:v1,color_pars_fragment:b1,color_pars_vertex:y1,color_vertex:_1,common:M1,cube_uv_reflection_fragment:w1,defaultnormal_vertex:S1,displacementmap_pars_vertex:E1,displacementmap_vertex:T1,emissivemap_fragment:A1,emissivemap_pars_fragment:C1,colorspace_fragment:P1,colorspace_pars_fragment:R1,envmap_fragment:L1,envmap_common_pars_fragment:D1,envmap_pars_fragment:I1,envmap_pars_vertex:B1,envmap_physical_pars_fragment:X1,envmap_vertex:N1,fog_vertex:k1,fog_pars_vertex:U1,fog_fragment:O1,fog_pars_fragment:F1,gradientmap_pars_fragment:z1,lightmap_pars_fragment:H1,lights_lambert_fragment:V1,lights_lambert_pars_fragment:G1,lights_pars_begin:W1,lights_toon_fragment:j1,lights_toon_pars_fragment:q1,lights_phong_fragment:Z1,lights_phong_pars_fragment:Y1,lights_physical_fragment:K1,lights_physical_pars_fragment:$1,lights_fragment_begin:J1,lights_fragment_maps:Q1,lights_fragment_end:eb,logdepthbuf_fragment:tb,logdepthbuf_pars_fragment:nb,logdepthbuf_pars_vertex:ib,logdepthbuf_vertex:sb,map_fragment:rb,map_pars_fragment:ob,map_particle_fragment:ab,map_particle_pars_fragment:lb,metalnessmap_fragment:cb,metalnessmap_pars_fragment:hb,morphinstance_vertex:ub,morphcolor_vertex:db,morphnormal_vertex:fb,morphtarget_pars_vertex:pb,morphtarget_vertex:mb,normal_fragment_begin:gb,normal_fragment_maps:xb,normal_pars_fragment:vb,normal_pars_vertex:bb,normal_vertex:yb,normalmap_pars_fragment:_b,clearcoat_normal_fragment_begin:Mb,clearcoat_normal_fragment_maps:wb,clearcoat_pars_fragment:Sb,iridescence_pars_fragment:Eb,opaque_fragment:Tb,packing:Ab,premultiplied_alpha_fragment:Cb,project_vertex:Pb,dithering_fragment:Rb,dithering_pars_fragment:Lb,roughnessmap_fragment:Db,roughnessmap_pars_fragment:Ib,shadowmap_pars_fragment:Bb,shadowmap_pars_vertex:Nb,shadowmap_vertex:kb,shadowmask_pars_fragment:Ub,skinbase_vertex:Ob,skinning_pars_vertex:Fb,skinning_vertex:zb,skinnormal_vertex:Hb,specularmap_fragment:Vb,specularmap_pars_fragment:Gb,tonemapping_fragment:Wb,tonemapping_pars_fragment:Xb,transmission_fragment:jb,transmission_pars_fragment:qb,uv_pars_fragment:Zb,uv_pars_vertex:Yb,uv_vertex:Kb,worldpos_vertex:$b,background_vert:`varying vec2 vUv; +#endif`;const et={alphahash_fragment:Jv,alphahash_pars_fragment:Qv,alphamap_fragment:e1,alphamap_pars_fragment:t1,alphatest_fragment:n1,alphatest_pars_fragment:i1,aomap_fragment:s1,aomap_pars_fragment:r1,batching_pars_vertex:o1,batching_vertex:a1,begin_vertex:l1,beginnormal_vertex:c1,bsdfs:h1,iridescence_fragment:u1,bumpmap_pars_fragment:d1,clipping_planes_fragment:f1,clipping_planes_pars_fragment:p1,clipping_planes_pars_vertex:m1,clipping_planes_vertex:g1,color_fragment:x1,color_pars_fragment:v1,color_pars_vertex:b1,color_vertex:y1,common:_1,cube_uv_reflection_fragment:M1,defaultnormal_vertex:w1,displacementmap_pars_vertex:S1,displacementmap_vertex:E1,emissivemap_fragment:T1,emissivemap_pars_fragment:A1,colorspace_fragment:C1,colorspace_pars_fragment:P1,envmap_fragment:R1,envmap_common_pars_fragment:L1,envmap_pars_fragment:D1,envmap_pars_vertex:I1,envmap_physical_pars_fragment:W1,envmap_vertex:B1,fog_vertex:N1,fog_pars_vertex:k1,fog_fragment:U1,fog_pars_fragment:O1,gradientmap_pars_fragment:F1,lightmap_pars_fragment:z1,lights_lambert_fragment:H1,lights_lambert_pars_fragment:V1,lights_pars_begin:G1,lights_toon_fragment:X1,lights_toon_pars_fragment:j1,lights_phong_fragment:q1,lights_phong_pars_fragment:Z1,lights_physical_fragment:Y1,lights_physical_pars_fragment:K1,lights_fragment_begin:$1,lights_fragment_maps:J1,lights_fragment_end:Q1,logdepthbuf_fragment:eb,logdepthbuf_pars_fragment:tb,logdepthbuf_pars_vertex:nb,logdepthbuf_vertex:ib,map_fragment:sb,map_pars_fragment:rb,map_particle_fragment:ob,map_particle_pars_fragment:ab,metalnessmap_fragment:lb,metalnessmap_pars_fragment:cb,morphinstance_vertex:hb,morphcolor_vertex:ub,morphnormal_vertex:db,morphtarget_pars_vertex:fb,morphtarget_vertex:pb,normal_fragment_begin:mb,normal_fragment_maps:gb,normal_pars_fragment:xb,normal_pars_vertex:vb,normal_vertex:bb,normalmap_pars_fragment:yb,clearcoat_normal_fragment_begin:_b,clearcoat_normal_fragment_maps:Mb,clearcoat_pars_fragment:wb,iridescence_pars_fragment:Sb,opaque_fragment:Eb,packing:Tb,premultiplied_alpha_fragment:Ab,project_vertex:Cb,dithering_fragment:Pb,dithering_pars_fragment:Rb,roughnessmap_fragment:Lb,roughnessmap_pars_fragment:Db,shadowmap_pars_fragment:Ib,shadowmap_pars_vertex:Bb,shadowmap_vertex:Nb,shadowmask_pars_fragment:kb,skinbase_vertex:Ub,skinning_pars_vertex:Ob,skinning_vertex:Fb,skinnormal_vertex:zb,specularmap_fragment:Hb,specularmap_pars_fragment:Vb,tonemapping_fragment:Gb,tonemapping_pars_fragment:Wb,transmission_fragment:Xb,transmission_pars_fragment:jb,uv_pars_fragment:qb,uv_pars_vertex:Zb,uv_vertex:Yb,worldpos_vertex:Kb,background_vert:`varying vec2 vUv; uniform mat3 uvTransform; void main() { vUv = ( uvTransform * vec3( uv, 1 ) ).xy; @@ -3589,7 +3589,7 @@ void main() { #include #include #include -}`},Pe={common:{diffuse:{value:new Ue(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new Ke},alphaMap:{value:null},alphaMapTransform:{value:new Ke},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new Ke}},envmap:{envMap:{value:null},envMapRotation:{value:new Ke},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},dfgLUT:{value:null}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new Ke}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new Ke}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new Ke},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new Ke},normalScale:{value:new ce(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new Ke},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new Ke}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new Ke}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new Ke}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Ue(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new Ue(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new Ke},alphaTest:{value:0},uvTransform:{value:new Ke}},sprite:{diffuse:{value:new Ue(16777215)},opacity:{value:1},center:{value:new ce(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new Ke},alphaMap:{value:null},alphaMapTransform:{value:new Ke},alphaTest:{value:0}}},li={basic:{uniforms:an([Pe.common,Pe.specularmap,Pe.envmap,Pe.aomap,Pe.lightmap,Pe.fog]),vertexShader:et.meshbasic_vert,fragmentShader:et.meshbasic_frag},lambert:{uniforms:an([Pe.common,Pe.specularmap,Pe.envmap,Pe.aomap,Pe.lightmap,Pe.emissivemap,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.fog,Pe.lights,{emissive:{value:new Ue(0)}}]),vertexShader:et.meshlambert_vert,fragmentShader:et.meshlambert_frag},phong:{uniforms:an([Pe.common,Pe.specularmap,Pe.envmap,Pe.aomap,Pe.lightmap,Pe.emissivemap,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.fog,Pe.lights,{emissive:{value:new Ue(0)},specular:{value:new Ue(1118481)},shininess:{value:30}}]),vertexShader:et.meshphong_vert,fragmentShader:et.meshphong_frag},standard:{uniforms:an([Pe.common,Pe.envmap,Pe.aomap,Pe.lightmap,Pe.emissivemap,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.roughnessmap,Pe.metalnessmap,Pe.fog,Pe.lights,{emissive:{value:new Ue(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:et.meshphysical_vert,fragmentShader:et.meshphysical_frag},toon:{uniforms:an([Pe.common,Pe.aomap,Pe.lightmap,Pe.emissivemap,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.gradientmap,Pe.fog,Pe.lights,{emissive:{value:new Ue(0)}}]),vertexShader:et.meshtoon_vert,fragmentShader:et.meshtoon_frag},matcap:{uniforms:an([Pe.common,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.fog,{matcap:{value:null}}]),vertexShader:et.meshmatcap_vert,fragmentShader:et.meshmatcap_frag},points:{uniforms:an([Pe.points,Pe.fog]),vertexShader:et.points_vert,fragmentShader:et.points_frag},dashed:{uniforms:an([Pe.common,Pe.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:et.linedashed_vert,fragmentShader:et.linedashed_frag},depth:{uniforms:an([Pe.common,Pe.displacementmap]),vertexShader:et.depth_vert,fragmentShader:et.depth_frag},normal:{uniforms:an([Pe.common,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,{opacity:{value:1}}]),vertexShader:et.meshnormal_vert,fragmentShader:et.meshnormal_frag},sprite:{uniforms:an([Pe.sprite,Pe.fog]),vertexShader:et.sprite_vert,fragmentShader:et.sprite_frag},background:{uniforms:{uvTransform:{value:new Ke},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:et.background_vert,fragmentShader:et.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new Ke}},vertexShader:et.backgroundCube_vert,fragmentShader:et.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:et.cube_vert,fragmentShader:et.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:et.equirect_vert,fragmentShader:et.equirect_frag},distanceRGBA:{uniforms:an([Pe.common,Pe.displacementmap,{referencePosition:{value:new P},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:et.distanceRGBA_vert,fragmentShader:et.distanceRGBA_frag},shadow:{uniforms:an([Pe.lights,Pe.fog,{color:{value:new Ue(0)},opacity:{value:1}}]),vertexShader:et.shadow_vert,fragmentShader:et.shadow_frag}};li.physical={uniforms:an([li.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new Ke},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new Ke},clearcoatNormalScale:{value:new ce(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new Ke},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new Ke},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new Ke},sheen:{value:0},sheenColor:{value:new Ue(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new Ke},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new Ke},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new Ke},transmissionSamplerSize:{value:new ce},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new Ke},attenuationDistance:{value:0},attenuationColor:{value:new Ue(0)},specularColor:{value:new Ue(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new Ke},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new Ke},anisotropyVector:{value:new ce},anisotropyMap:{value:null},anisotropyMapTransform:{value:new Ke}}]),vertexShader:et.meshphysical_vert,fragmentShader:et.meshphysical_frag};const Ua={r:0,b:0,g:0},fs=new mn,Jb=new ze;function Qb(s,e,t,n,i,r,o){const a=new Ue(0);let l=r===!0?0:1,c,h,u=null,d=0,f=null;function p(v){let y=v.isScene===!0?v.background:null;return y&&y.isTexture&&(y=(v.backgroundBlurriness>0?t:e).get(y)),y}function g(v){let y=!1;const M=p(v);M===null?m(a,l):M&&M.isColor&&(m(M,1),y=!0);const E=s.xr.getEnvironmentBlendMode();E==="additive"?n.buffers.color.setClear(0,0,0,1,o):E==="alpha-blend"&&n.buffers.color.setClear(0,0,0,0,o),(s.autoClear||y)&&(n.buffers.depth.setTest(!0),n.buffers.depth.setMask(!0),n.buffers.color.setMask(!0),s.clear(s.autoClearColor,s.autoClearDepth,s.autoClearStencil))}function x(v,y){const M=p(y);M&&(M.isCubeTexture||M.mapping===Xo)?(h===void 0&&(h=new ut(new Gi(1,1,1),new kt({name:"BackgroundCubeMaterial",uniforms:tr(li.backgroundCube.uniforms),vertexShader:li.backgroundCube.vertexShader,fragmentShader:li.backgroundCube.fragmentShader,side:on,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),h.geometry.deleteAttribute("normal"),h.geometry.deleteAttribute("uv"),h.onBeforeRender=function(E,A,R){this.matrixWorld.copyPosition(R.matrixWorld)},Object.defineProperty(h.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),i.update(h)),fs.copy(y.backgroundRotation),fs.x*=-1,fs.y*=-1,fs.z*=-1,M.isCubeTexture&&M.isRenderTargetTexture===!1&&(fs.y*=-1,fs.z*=-1),h.material.uniforms.envMap.value=M,h.material.uniforms.flipEnvMap.value=M.isCubeTexture&&M.isRenderTargetTexture===!1?-1:1,h.material.uniforms.backgroundBlurriness.value=y.backgroundBlurriness,h.material.uniforms.backgroundIntensity.value=y.backgroundIntensity,h.material.uniforms.backgroundRotation.value.setFromMatrix4(Jb.makeRotationFromEuler(fs)),h.material.toneMapped=it.getTransfer(M.colorSpace)!==lt,(u!==M||d!==M.version||f!==s.toneMapping)&&(h.material.needsUpdate=!0,u=M,d=M.version,f=s.toneMapping),h.layers.enableAll(),v.unshift(h,h.geometry,h.material,0,0,null)):M&&M.isTexture&&(c===void 0&&(c=new ut(new bo(2,2),new kt({name:"BackgroundMaterial",uniforms:tr(li.background.uniforms),vertexShader:li.background.vertexShader,fragmentShader:li.background.fragmentShader,side:Pn,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),c.geometry.deleteAttribute("normal"),Object.defineProperty(c.material,"map",{get:function(){return this.uniforms.t2D.value}}),i.update(c)),c.material.uniforms.t2D.value=M,c.material.uniforms.backgroundIntensity.value=y.backgroundIntensity,c.material.toneMapped=it.getTransfer(M.colorSpace)!==lt,M.matrixAutoUpdate===!0&&M.updateMatrix(),c.material.uniforms.uvTransform.value.copy(M.matrix),(u!==M||d!==M.version||f!==s.toneMapping)&&(c.material.needsUpdate=!0,u=M,d=M.version,f=s.toneMapping),c.layers.enableAll(),v.unshift(c,c.geometry,c.material,0,0,null))}function m(v,y){v.getRGB(Ua,nf(s)),n.buffers.color.setClear(Ua.r,Ua.g,Ua.b,y,o)}function b(){h!==void 0&&(h.geometry.dispose(),h.material.dispose(),h=void 0),c!==void 0&&(c.geometry.dispose(),c.material.dispose(),c=void 0)}return{getClearColor:function(){return a},setClearColor:function(v,y=1){a.set(v),l=y,m(a,l)},getClearAlpha:function(){return l},setClearAlpha:function(v){l=v,m(a,l)},render:g,addToRenderList:x,dispose:b}}function ey(s,e){const t=s.getParameter(s.MAX_VERTEX_ATTRIBS),n={},i=d(null);let r=i,o=!1;function a(S,D,C,B,w){let F=!1;const W=u(B,C,D);r!==W&&(r=W,c(r.object)),F=f(S,B,C,w),F&&p(S,B,C,w),w!==null&&e.update(w,s.ELEMENT_ARRAY_BUFFER),(F||o)&&(o=!1,y(S,D,C,B),w!==null&&s.bindBuffer(s.ELEMENT_ARRAY_BUFFER,e.get(w).buffer))}function l(){return s.createVertexArray()}function c(S){return s.bindVertexArray(S)}function h(S){return s.deleteVertexArray(S)}function u(S,D,C){const B=C.wireframe===!0;let w=n[S.id];w===void 0&&(w={},n[S.id]=w);let F=w[D.id];F===void 0&&(F={},w[D.id]=F);let W=F[B];return W===void 0&&(W=d(l()),F[B]=W),W}function d(S){const D=[],C=[],B=[];for(let w=0;w=0){const re=w[$];let X=F[$];if(X===void 0&&($==="instanceMatrix"&&S.instanceMatrix&&(X=S.instanceMatrix),$==="instanceColor"&&S.instanceColor&&(X=S.instanceColor)),re===void 0||re.attribute!==X||X&&re.data!==X.data)return!0;W++}return r.attributesNum!==W||r.index!==B}function p(S,D,C,B){const w={},F=D.attributes;let W=0;const j=C.getAttributes();for(const $ in j)if(j[$].location>=0){let re=F[$];re===void 0&&($==="instanceMatrix"&&S.instanceMatrix&&(re=S.instanceMatrix),$==="instanceColor"&&S.instanceColor&&(re=S.instanceColor));const X={};X.attribute=re,re&&re.data&&(X.data=re.data),w[$]=X,W++}r.attributes=w,r.attributesNum=W,r.index=B}function g(){const S=r.newAttributes;for(let D=0,C=S.length;D=0){let Z=w[j];if(Z===void 0&&(j==="instanceMatrix"&&S.instanceMatrix&&(Z=S.instanceMatrix),j==="instanceColor"&&S.instanceColor&&(Z=S.instanceColor)),Z!==void 0){const re=Z.normalized,X=Z.itemSize,Y=e.get(Z);if(Y===void 0)continue;const ge=Y.buffer,pe=Y.type,de=Y.bytesPerElement,ie=pe===s.INT||pe===s.UNSIGNED_INT||Z.gpuType===nc;if(Z.isInterleavedBufferAttribute){const he=Z.data,fe=he.stride,ve=Z.offset;if(he.isInstancedInterleavedBuffer){for(let we=0;we<$.locationSize;we++)m($.location+we,he.meshPerAttribute);S.isInstancedMesh!==!0&&B._maxInstanceCount===void 0&&(B._maxInstanceCount=he.meshPerAttribute*he.count)}else for(let we=0;we<$.locationSize;we++)x($.location+we);s.bindBuffer(s.ARRAY_BUFFER,ge);for(let we=0;we<$.locationSize;we++)v($.location+we,X/$.locationSize,pe,re,fe*de,(ve+X/$.locationSize*we)*de,ie)}else{if(Z.isInstancedBufferAttribute){for(let he=0;he<$.locationSize;he++)m($.location+he,Z.meshPerAttribute);S.isInstancedMesh!==!0&&B._maxInstanceCount===void 0&&(B._maxInstanceCount=Z.meshPerAttribute*Z.count)}else for(let he=0;he<$.locationSize;he++)x($.location+he);s.bindBuffer(s.ARRAY_BUFFER,ge);for(let he=0;he<$.locationSize;he++)v($.location+he,X/$.locationSize,pe,re,X*de,X/$.locationSize*he*de,ie)}}else if(W!==void 0){const re=W[j];if(re!==void 0)switch(re.length){case 2:s.vertexAttrib2fv($.location,re);break;case 3:s.vertexAttrib3fv($.location,re);break;case 4:s.vertexAttrib4fv($.location,re);break;default:s.vertexAttrib1fv($.location,re)}}}}b()}function M(){R();for(const S in n){const D=n[S];for(const C in D){const B=D[C];for(const w in B)h(B[w].object),delete B[w];delete D[C]}delete n[S]}}function E(S){if(n[S.id]===void 0)return;const D=n[S.id];for(const C in D){const B=D[C];for(const w in B)h(B[w].object),delete B[w];delete D[C]}delete n[S.id]}function A(S){for(const D in n){const C=n[D];if(C[S.id]===void 0)continue;const B=C[S.id];for(const w in B)h(B[w].object),delete B[w];delete C[S.id]}}function R(){_(),o=!0,r!==i&&(r=i,c(r.object))}function _(){i.geometry=null,i.program=null,i.wireframe=!1}return{setup:a,reset:R,resetDefaultState:_,dispose:M,releaseStatesOfGeometry:E,releaseStatesOfProgram:A,initAttributes:g,enableAttribute:x,disableUnusedAttributes:b}}function ty(s,e,t){let n;function i(c){n=c}function r(c,h){s.drawArrays(n,c,h),t.update(h,n,1)}function o(c,h,u){u!==0&&(s.drawArraysInstanced(n,c,h,u),t.update(h,n,u))}function a(c,h,u){if(u===0)return;e.get("WEBGL_multi_draw").multiDrawArraysWEBGL(n,c,0,h,0,u);let f=0;for(let p=0;p0&&s.getShaderPrecisionFormat(s.FRAGMENT_SHADER,s.HIGH_FLOAT).precision>0)return"highp";A="mediump"}return A==="mediump"&&s.getShaderPrecisionFormat(s.VERTEX_SHADER,s.MEDIUM_FLOAT).precision>0&&s.getShaderPrecisionFormat(s.FRAGMENT_SHADER,s.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let c=t.precision!==void 0?t.precision:"highp";const h=l(c);h!==c&&(He("WebGLRenderer:",c,"not supported, using",h,"instead."),c=h);const u=t.logarithmicDepthBuffer===!0,d=t.reversedDepthBuffer===!0&&e.has("EXT_clip_control"),f=s.getParameter(s.MAX_TEXTURE_IMAGE_UNITS),p=s.getParameter(s.MAX_VERTEX_TEXTURE_IMAGE_UNITS),g=s.getParameter(s.MAX_TEXTURE_SIZE),x=s.getParameter(s.MAX_CUBE_MAP_TEXTURE_SIZE),m=s.getParameter(s.MAX_VERTEX_ATTRIBS),b=s.getParameter(s.MAX_VERTEX_UNIFORM_VECTORS),v=s.getParameter(s.MAX_VARYING_VECTORS),y=s.getParameter(s.MAX_FRAGMENT_UNIFORM_VECTORS),M=p>0,E=s.getParameter(s.MAX_SAMPLES);return{isWebGL2:!0,getMaxAnisotropy:r,getMaxPrecision:l,textureFormatReadable:o,textureTypeReadable:a,precision:c,logarithmicDepthBuffer:u,reversedDepthBuffer:d,maxTextures:f,maxVertexTextures:p,maxTextureSize:g,maxCubemapSize:x,maxAttributes:m,maxVertexUniforms:b,maxVaryings:v,maxFragmentUniforms:y,vertexTextures:M,maxSamples:E}}function iy(s){const e=this;let t=null,n=0,i=!1,r=!1;const o=new _t,a=new Ke,l={value:null,needsUpdate:!1};this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(u,d){const f=u.length!==0||d||n!==0||i;return i=d,n=u.length,f},this.beginShadows=function(){r=!0,h(null)},this.endShadows=function(){r=!1},this.setGlobalState=function(u,d){t=h(u,d,0)},this.setState=function(u,d,f){const p=u.clippingPlanes,g=u.clipIntersection,x=u.clipShadows,m=s.get(u);if(!i||p===null||p.length===0||r&&!x)r?h(null):c();else{const b=r?0:n,v=b*4;let y=m.clippingState||null;l.value=y,y=h(p,d,v,f);for(let M=0;M!==v;++M)y[M]=t[M];m.clippingState=y,this.numIntersection=g?this.numPlanes:0,this.numPlanes+=b}};function c(){l.value!==t&&(l.value=t,l.needsUpdate=n>0),e.numPlanes=n,e.numIntersection=0}function h(u,d,f,p){const g=u!==null?u.length:0;let x=null;if(g!==0){if(x=l.value,p!==!0||x===null){const m=f+g*4,b=d.matrixWorldInverse;a.getNormalMatrix(b),(x===null||x.length0){const c=new Mx(l.height);return c.fromEquirectangularTexture(s,o),e.set(o,c),o.addEventListener("dispose",i),t(c.texture,o.mapping)}else return null}}return o}function i(o){const a=o.target;a.removeEventListener("dispose",i);const l=e.get(a);l!==void 0&&(e.delete(a),l.dispose())}function r(){e=new WeakMap}return{get:n,dispose:r}}const ji=4,rp=[.125,.215,.35,.446,.526,.582],ps=20,ry=256,wo=new us,op=new Ue;let Fh=null,zh=0,Hh=0,Vh=!1;const oy=new P;class ap{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._backgroundBox=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._blurMaterial=null,this._ggxMaterial=null}fromScene(e,t=0,n=.1,i=100,r={}){const{size:o=256,position:a=oy}=r;Fh=this._renderer.getRenderTarget(),zh=this._renderer.getActiveCubeFace(),Hh=this._renderer.getActiveMipmapLevel(),Vh=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(o);const l=this._allocateTargets();return l.depthBuffer=!0,this._sceneToCubeUV(e,n,i,l,a),t>0&&this._blur(l,0,0,t),this._applyPMREM(l),this._cleanup(l),l}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=hp(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=cp(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose(),this._backgroundBox!==null&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._ggxMaterial!==null&&this._ggxMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let e=0;e2?M:0,M,M),u.setRenderTarget(i),m&&u.render(g,l),u.render(e,l)}u.toneMapping=f,u.autoClear=d,e.background=b}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===Os||e.mapping===Fs;i?(this._cubemapMaterial===null&&(this._cubemapMaterial=hp()),this._cubemapMaterial.uniforms.flipEnvMap.value=e.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=cp());const r=i?this._cubemapMaterial:this._equirectMaterial,o=this._lodMeshes[0];o.material=r;const a=r.uniforms;a.envMap.value=e;const l=this._cubeSize;_r(t,0,0,3*l,2*l),n.setRenderTarget(t),n.render(o,wo)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodMeshes.length;for(let r=1;rp-ji?n-p+ji:0),m=4*(this._cubeSize-g);l.envMap.value=e.texture,l.roughness.value=f,l.mipInt.value=p-t,_r(r,x,m,3*g,2*g),i.setRenderTarget(r),i.render(a,wo),l.envMap.value=r.texture,l.roughness.value=0,l.mipInt.value=p-n,_r(e,x,m,3*g,2*g),i.setRenderTarget(e),i.render(a,wo)}_blur(e,t,n,i,r){const o=this._pingPongRenderTarget;this._halfBlur(e,o,t,n,i,"latitudinal",r),this._halfBlur(o,e,n,n,i,"longitudinal",r)}_halfBlur(e,t,n,i,r,o,a){const l=this._renderer,c=this._blurMaterial;o!=="latitudinal"&&o!=="longitudinal"&&Qe("blur direction must be either latitudinal or longitudinal!");const h=3,u=this._lodMeshes[i];u.material=c;const d=c.uniforms,f=this._sizeLods[n]-1,p=isFinite(r)?Math.PI/(2*f):2*Math.PI/(2*ps-1),g=r/p,x=isFinite(r)?1+Math.floor(h*g):ps;x>ps&&He(`sigmaRadians, ${r}, is too large and will clip, as it requested ${x} samples when the maximum is set to ${ps}`);const m=[];let b=0;for(let A=0;Av-ji?i-v+ji:0),E=4*(this._cubeSize-y);_r(t,M,E,3*y,2*y),l.setRenderTarget(t),l.render(u,wo)}}function ay(s){const e=[],t=[],n=[];let i=s;const r=s-ji+1+rp.length;for(let o=0;os-ji?l=rp[o-s+ji-1]:o===0&&(l=0),t.push(l);const c=1/(a-2),h=-c,u=1+c,d=[h,h,u,h,u,u,h,h,u,u,h,u],f=6,p=6,g=3,x=2,m=1,b=new Float32Array(g*p*f),v=new Float32Array(x*p*f),y=new Float32Array(m*p*f);for(let E=0;E2?0:-1,_=[A,R,0,A+2/3,R,0,A+2/3,R+1,0,A,R,0,A+2/3,R+1,0,A,R+1,0];b.set(_,g*p*E),v.set(d,x*p*E);const S=[E,E,E,E,E,E];y.set(S,m*p*E)}const M=new ht;M.setAttribute("position",new at(b,g)),M.setAttribute("uv",new at(v,x)),M.setAttribute("faceIndex",new at(y,m)),n.push(new ut(M,null)),i>ji&&i--}return{lodMeshes:n,sizeLods:e,sigmas:t}}function lp(s,e,t){const n=new pn(s,e,t);return n.texture.mapping=Xo,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function _r(s,e,t,n,i){s.viewport.set(e,t,n,i),s.scissor.set(e,t,n,i)}function ly(s,e,t){return new kt({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:ry,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/t,CUBEUV_MAX_MIP:`${s}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:Oa(),fragmentShader:` +}`},Pe={common:{diffuse:{value:new Ue(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new Ke},alphaMap:{value:null},alphaMapTransform:{value:new Ke},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new Ke}},envmap:{envMap:{value:null},envMapRotation:{value:new Ke},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},dfgLUT:{value:null}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new Ke}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new Ke}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new Ke},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new Ke},normalScale:{value:new ce(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new Ke},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new Ke}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new Ke}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new Ke}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new Ue(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new Ue(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new Ke},alphaTest:{value:0},uvTransform:{value:new Ke}},sprite:{diffuse:{value:new Ue(16777215)},opacity:{value:1},center:{value:new ce(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new Ke},alphaMap:{value:null},alphaMapTransform:{value:new Ke},alphaTest:{value:0}}},li={basic:{uniforms:an([Pe.common,Pe.specularmap,Pe.envmap,Pe.aomap,Pe.lightmap,Pe.fog]),vertexShader:et.meshbasic_vert,fragmentShader:et.meshbasic_frag},lambert:{uniforms:an([Pe.common,Pe.specularmap,Pe.envmap,Pe.aomap,Pe.lightmap,Pe.emissivemap,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.fog,Pe.lights,{emissive:{value:new Ue(0)}}]),vertexShader:et.meshlambert_vert,fragmentShader:et.meshlambert_frag},phong:{uniforms:an([Pe.common,Pe.specularmap,Pe.envmap,Pe.aomap,Pe.lightmap,Pe.emissivemap,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.fog,Pe.lights,{emissive:{value:new Ue(0)},specular:{value:new Ue(1118481)},shininess:{value:30}}]),vertexShader:et.meshphong_vert,fragmentShader:et.meshphong_frag},standard:{uniforms:an([Pe.common,Pe.envmap,Pe.aomap,Pe.lightmap,Pe.emissivemap,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.roughnessmap,Pe.metalnessmap,Pe.fog,Pe.lights,{emissive:{value:new Ue(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:et.meshphysical_vert,fragmentShader:et.meshphysical_frag},toon:{uniforms:an([Pe.common,Pe.aomap,Pe.lightmap,Pe.emissivemap,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.gradientmap,Pe.fog,Pe.lights,{emissive:{value:new Ue(0)}}]),vertexShader:et.meshtoon_vert,fragmentShader:et.meshtoon_frag},matcap:{uniforms:an([Pe.common,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,Pe.fog,{matcap:{value:null}}]),vertexShader:et.meshmatcap_vert,fragmentShader:et.meshmatcap_frag},points:{uniforms:an([Pe.points,Pe.fog]),vertexShader:et.points_vert,fragmentShader:et.points_frag},dashed:{uniforms:an([Pe.common,Pe.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:et.linedashed_vert,fragmentShader:et.linedashed_frag},depth:{uniforms:an([Pe.common,Pe.displacementmap]),vertexShader:et.depth_vert,fragmentShader:et.depth_frag},normal:{uniforms:an([Pe.common,Pe.bumpmap,Pe.normalmap,Pe.displacementmap,{opacity:{value:1}}]),vertexShader:et.meshnormal_vert,fragmentShader:et.meshnormal_frag},sprite:{uniforms:an([Pe.sprite,Pe.fog]),vertexShader:et.sprite_vert,fragmentShader:et.sprite_frag},background:{uniforms:{uvTransform:{value:new Ke},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:et.background_vert,fragmentShader:et.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new Ke}},vertexShader:et.backgroundCube_vert,fragmentShader:et.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:et.cube_vert,fragmentShader:et.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:et.equirect_vert,fragmentShader:et.equirect_frag},distanceRGBA:{uniforms:an([Pe.common,Pe.displacementmap,{referencePosition:{value:new P},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:et.distanceRGBA_vert,fragmentShader:et.distanceRGBA_frag},shadow:{uniforms:an([Pe.lights,Pe.fog,{color:{value:new Ue(0)},opacity:{value:1}}]),vertexShader:et.shadow_vert,fragmentShader:et.shadow_frag}};li.physical={uniforms:an([li.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new Ke},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new Ke},clearcoatNormalScale:{value:new ce(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new Ke},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new Ke},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new Ke},sheen:{value:0},sheenColor:{value:new Ue(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new Ke},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new Ke},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new Ke},transmissionSamplerSize:{value:new ce},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new Ke},attenuationDistance:{value:0},attenuationColor:{value:new Ue(0)},specularColor:{value:new Ue(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new Ke},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new Ke},anisotropyVector:{value:new ce},anisotropyMap:{value:null},anisotropyMapTransform:{value:new Ke}}]),vertexShader:et.meshphysical_vert,fragmentShader:et.meshphysical_frag};const Ua={r:0,b:0,g:0},fs=new mn,$b=new ze;function Jb(s,e,t,n,i,r,o){const a=new Ue(0);let l=r===!0?0:1,c,h,u=null,d=0,f=null;function p(v){let y=v.isScene===!0?v.background:null;return y&&y.isTexture&&(y=(v.backgroundBlurriness>0?t:e).get(y)),y}function g(v){let y=!1;const M=p(v);M===null?m(a,l):M&&M.isColor&&(m(M,1),y=!0);const E=s.xr.getEnvironmentBlendMode();E==="additive"?n.buffers.color.setClear(0,0,0,1,o):E==="alpha-blend"&&n.buffers.color.setClear(0,0,0,0,o),(s.autoClear||y)&&(n.buffers.depth.setTest(!0),n.buffers.depth.setMask(!0),n.buffers.color.setMask(!0),s.clear(s.autoClearColor,s.autoClearDepth,s.autoClearStencil))}function x(v,y){const M=p(y);M&&(M.isCubeTexture||M.mapping===Xo)?(h===void 0&&(h=new ut(new Gi(1,1,1),new kt({name:"BackgroundCubeMaterial",uniforms:tr(li.backgroundCube.uniforms),vertexShader:li.backgroundCube.vertexShader,fragmentShader:li.backgroundCube.fragmentShader,side:on,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),h.geometry.deleteAttribute("normal"),h.geometry.deleteAttribute("uv"),h.onBeforeRender=function(E,A,R){this.matrixWorld.copyPosition(R.matrixWorld)},Object.defineProperty(h.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),i.update(h)),fs.copy(y.backgroundRotation),fs.x*=-1,fs.y*=-1,fs.z*=-1,M.isCubeTexture&&M.isRenderTargetTexture===!1&&(fs.y*=-1,fs.z*=-1),h.material.uniforms.envMap.value=M,h.material.uniforms.flipEnvMap.value=M.isCubeTexture&&M.isRenderTargetTexture===!1?-1:1,h.material.uniforms.backgroundBlurriness.value=y.backgroundBlurriness,h.material.uniforms.backgroundIntensity.value=y.backgroundIntensity,h.material.uniforms.backgroundRotation.value.setFromMatrix4($b.makeRotationFromEuler(fs)),h.material.toneMapped=it.getTransfer(M.colorSpace)!==lt,(u!==M||d!==M.version||f!==s.toneMapping)&&(h.material.needsUpdate=!0,u=M,d=M.version,f=s.toneMapping),h.layers.enableAll(),v.unshift(h,h.geometry,h.material,0,0,null)):M&&M.isTexture&&(c===void 0&&(c=new ut(new bo(2,2),new kt({name:"BackgroundMaterial",uniforms:tr(li.background.uniforms),vertexShader:li.background.vertexShader,fragmentShader:li.background.fragmentShader,side:Pn,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),c.geometry.deleteAttribute("normal"),Object.defineProperty(c.material,"map",{get:function(){return this.uniforms.t2D.value}}),i.update(c)),c.material.uniforms.t2D.value=M,c.material.uniforms.backgroundIntensity.value=y.backgroundIntensity,c.material.toneMapped=it.getTransfer(M.colorSpace)!==lt,M.matrixAutoUpdate===!0&&M.updateMatrix(),c.material.uniforms.uvTransform.value.copy(M.matrix),(u!==M||d!==M.version||f!==s.toneMapping)&&(c.material.needsUpdate=!0,u=M,d=M.version,f=s.toneMapping),c.layers.enableAll(),v.unshift(c,c.geometry,c.material,0,0,null))}function m(v,y){v.getRGB(Ua,tf(s)),n.buffers.color.setClear(Ua.r,Ua.g,Ua.b,y,o)}function b(){h!==void 0&&(h.geometry.dispose(),h.material.dispose(),h=void 0),c!==void 0&&(c.geometry.dispose(),c.material.dispose(),c=void 0)}return{getClearColor:function(){return a},setClearColor:function(v,y=1){a.set(v),l=y,m(a,l)},getClearAlpha:function(){return l},setClearAlpha:function(v){l=v,m(a,l)},render:g,addToRenderList:x,dispose:b}}function Qb(s,e){const t=s.getParameter(s.MAX_VERTEX_ATTRIBS),n={},i=d(null);let r=i,o=!1;function a(S,D,C,B,w){let F=!1;const W=u(B,C,D);r!==W&&(r=W,c(r.object)),F=f(S,B,C,w),F&&p(S,B,C,w),w!==null&&e.update(w,s.ELEMENT_ARRAY_BUFFER),(F||o)&&(o=!1,y(S,D,C,B),w!==null&&s.bindBuffer(s.ELEMENT_ARRAY_BUFFER,e.get(w).buffer))}function l(){return s.createVertexArray()}function c(S){return s.bindVertexArray(S)}function h(S){return s.deleteVertexArray(S)}function u(S,D,C){const B=C.wireframe===!0;let w=n[S.id];w===void 0&&(w={},n[S.id]=w);let F=w[D.id];F===void 0&&(F={},w[D.id]=F);let W=F[B];return W===void 0&&(W=d(l()),F[B]=W),W}function d(S){const D=[],C=[],B=[];for(let w=0;w=0){const re=w[$];let X=F[$];if(X===void 0&&($==="instanceMatrix"&&S.instanceMatrix&&(X=S.instanceMatrix),$==="instanceColor"&&S.instanceColor&&(X=S.instanceColor)),re===void 0||re.attribute!==X||X&&re.data!==X.data)return!0;W++}return r.attributesNum!==W||r.index!==B}function p(S,D,C,B){const w={},F=D.attributes;let W=0;const j=C.getAttributes();for(const $ in j)if(j[$].location>=0){let re=F[$];re===void 0&&($==="instanceMatrix"&&S.instanceMatrix&&(re=S.instanceMatrix),$==="instanceColor"&&S.instanceColor&&(re=S.instanceColor));const X={};X.attribute=re,re&&re.data&&(X.data=re.data),w[$]=X,W++}r.attributes=w,r.attributesNum=W,r.index=B}function g(){const S=r.newAttributes;for(let D=0,C=S.length;D=0){let Z=w[j];if(Z===void 0&&(j==="instanceMatrix"&&S.instanceMatrix&&(Z=S.instanceMatrix),j==="instanceColor"&&S.instanceColor&&(Z=S.instanceColor)),Z!==void 0){const re=Z.normalized,X=Z.itemSize,Y=e.get(Z);if(Y===void 0)continue;const ge=Y.buffer,pe=Y.type,de=Y.bytesPerElement,ie=pe===s.INT||pe===s.UNSIGNED_INT||Z.gpuType===nc;if(Z.isInterleavedBufferAttribute){const he=Z.data,fe=he.stride,ve=Z.offset;if(he.isInstancedInterleavedBuffer){for(let we=0;we<$.locationSize;we++)m($.location+we,he.meshPerAttribute);S.isInstancedMesh!==!0&&B._maxInstanceCount===void 0&&(B._maxInstanceCount=he.meshPerAttribute*he.count)}else for(let we=0;we<$.locationSize;we++)x($.location+we);s.bindBuffer(s.ARRAY_BUFFER,ge);for(let we=0;we<$.locationSize;we++)v($.location+we,X/$.locationSize,pe,re,fe*de,(ve+X/$.locationSize*we)*de,ie)}else{if(Z.isInstancedBufferAttribute){for(let he=0;he<$.locationSize;he++)m($.location+he,Z.meshPerAttribute);S.isInstancedMesh!==!0&&B._maxInstanceCount===void 0&&(B._maxInstanceCount=Z.meshPerAttribute*Z.count)}else for(let he=0;he<$.locationSize;he++)x($.location+he);s.bindBuffer(s.ARRAY_BUFFER,ge);for(let he=0;he<$.locationSize;he++)v($.location+he,X/$.locationSize,pe,re,X*de,X/$.locationSize*he*de,ie)}}else if(W!==void 0){const re=W[j];if(re!==void 0)switch(re.length){case 2:s.vertexAttrib2fv($.location,re);break;case 3:s.vertexAttrib3fv($.location,re);break;case 4:s.vertexAttrib4fv($.location,re);break;default:s.vertexAttrib1fv($.location,re)}}}}b()}function M(){R();for(const S in n){const D=n[S];for(const C in D){const B=D[C];for(const w in B)h(B[w].object),delete B[w];delete D[C]}delete n[S]}}function E(S){if(n[S.id]===void 0)return;const D=n[S.id];for(const C in D){const B=D[C];for(const w in B)h(B[w].object),delete B[w];delete D[C]}delete n[S.id]}function A(S){for(const D in n){const C=n[D];if(C[S.id]===void 0)continue;const B=C[S.id];for(const w in B)h(B[w].object),delete B[w];delete C[S.id]}}function R(){_(),o=!0,r!==i&&(r=i,c(r.object))}function _(){i.geometry=null,i.program=null,i.wireframe=!1}return{setup:a,reset:R,resetDefaultState:_,dispose:M,releaseStatesOfGeometry:E,releaseStatesOfProgram:A,initAttributes:g,enableAttribute:x,disableUnusedAttributes:b}}function ey(s,e,t){let n;function i(c){n=c}function r(c,h){s.drawArrays(n,c,h),t.update(h,n,1)}function o(c,h,u){u!==0&&(s.drawArraysInstanced(n,c,h,u),t.update(h,n,u))}function a(c,h,u){if(u===0)return;e.get("WEBGL_multi_draw").multiDrawArraysWEBGL(n,c,0,h,0,u);let f=0;for(let p=0;p0&&s.getShaderPrecisionFormat(s.FRAGMENT_SHADER,s.HIGH_FLOAT).precision>0)return"highp";A="mediump"}return A==="mediump"&&s.getShaderPrecisionFormat(s.VERTEX_SHADER,s.MEDIUM_FLOAT).precision>0&&s.getShaderPrecisionFormat(s.FRAGMENT_SHADER,s.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let c=t.precision!==void 0?t.precision:"highp";const h=l(c);h!==c&&(He("WebGLRenderer:",c,"not supported, using",h,"instead."),c=h);const u=t.logarithmicDepthBuffer===!0,d=t.reversedDepthBuffer===!0&&e.has("EXT_clip_control"),f=s.getParameter(s.MAX_TEXTURE_IMAGE_UNITS),p=s.getParameter(s.MAX_VERTEX_TEXTURE_IMAGE_UNITS),g=s.getParameter(s.MAX_TEXTURE_SIZE),x=s.getParameter(s.MAX_CUBE_MAP_TEXTURE_SIZE),m=s.getParameter(s.MAX_VERTEX_ATTRIBS),b=s.getParameter(s.MAX_VERTEX_UNIFORM_VECTORS),v=s.getParameter(s.MAX_VARYING_VECTORS),y=s.getParameter(s.MAX_FRAGMENT_UNIFORM_VECTORS),M=p>0,E=s.getParameter(s.MAX_SAMPLES);return{isWebGL2:!0,getMaxAnisotropy:r,getMaxPrecision:l,textureFormatReadable:o,textureTypeReadable:a,precision:c,logarithmicDepthBuffer:u,reversedDepthBuffer:d,maxTextures:f,maxVertexTextures:p,maxTextureSize:g,maxCubemapSize:x,maxAttributes:m,maxVertexUniforms:b,maxVaryings:v,maxFragmentUniforms:y,vertexTextures:M,maxSamples:E}}function ny(s){const e=this;let t=null,n=0,i=!1,r=!1;const o=new yt,a=new Ke,l={value:null,needsUpdate:!1};this.uniform=l,this.numPlanes=0,this.numIntersection=0,this.init=function(u,d){const f=u.length!==0||d||n!==0||i;return i=d,n=u.length,f},this.beginShadows=function(){r=!0,h(null)},this.endShadows=function(){r=!1},this.setGlobalState=function(u,d){t=h(u,d,0)},this.setState=function(u,d,f){const p=u.clippingPlanes,g=u.clipIntersection,x=u.clipShadows,m=s.get(u);if(!i||p===null||p.length===0||r&&!x)r?h(null):c();else{const b=r?0:n,v=b*4;let y=m.clippingState||null;l.value=y,y=h(p,d,v,f);for(let M=0;M!==v;++M)y[M]=t[M];m.clippingState=y,this.numIntersection=g?this.numPlanes:0,this.numPlanes+=b}};function c(){l.value!==t&&(l.value=t,l.needsUpdate=n>0),e.numPlanes=n,e.numIntersection=0}function h(u,d,f,p){const g=u!==null?u.length:0;let x=null;if(g!==0){if(x=l.value,p!==!0||x===null){const m=f+g*4,b=d.matrixWorldInverse;a.getNormalMatrix(b),(x===null||x.length0){const c=new _x(l.height);return c.fromEquirectangularTexture(s,o),e.set(o,c),o.addEventListener("dispose",i),t(c.texture,o.mapping)}else return null}}return o}function i(o){const a=o.target;a.removeEventListener("dispose",i);const l=e.get(a);l!==void 0&&(e.delete(a),l.dispose())}function r(){e=new WeakMap}return{get:n,dispose:r}}const ji=4,sp=[.125,.215,.35,.446,.526,.582],ps=20,sy=256,wo=new us,rp=new Ue;let Fh=null,zh=0,Hh=0,Vh=!1;const ry=new P;class op{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._backgroundBox=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._blurMaterial=null,this._ggxMaterial=null}fromScene(e,t=0,n=.1,i=100,r={}){const{size:o=256,position:a=ry}=r;Fh=this._renderer.getRenderTarget(),zh=this._renderer.getActiveCubeFace(),Hh=this._renderer.getActiveMipmapLevel(),Vh=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(o);const l=this._allocateTargets();return l.depthBuffer=!0,this._sceneToCubeUV(e,n,i,l,a),t>0&&this._blur(l,0,0,t),this._applyPMREM(l),this._cleanup(l),l}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){this._cubemapMaterial===null&&(this._cubemapMaterial=cp(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){this._equirectMaterial===null&&(this._equirectMaterial=lp(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),this._cubemapMaterial!==null&&this._cubemapMaterial.dispose(),this._equirectMaterial!==null&&this._equirectMaterial.dispose(),this._backgroundBox!==null&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){this._blurMaterial!==null&&this._blurMaterial.dispose(),this._ggxMaterial!==null&&this._ggxMaterial.dispose(),this._pingPongRenderTarget!==null&&this._pingPongRenderTarget.dispose();for(let e=0;e2?M:0,M,M),u.setRenderTarget(i),m&&u.render(g,l),u.render(e,l)}u.toneMapping=f,u.autoClear=d,e.background=b}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===Os||e.mapping===Fs;i?(this._cubemapMaterial===null&&(this._cubemapMaterial=cp()),this._cubemapMaterial.uniforms.flipEnvMap.value=e.isRenderTargetTexture===!1?-1:1):this._equirectMaterial===null&&(this._equirectMaterial=lp());const r=i?this._cubemapMaterial:this._equirectMaterial,o=this._lodMeshes[0];o.material=r;const a=r.uniforms;a.envMap.value=e;const l=this._cubeSize;_r(t,0,0,3*l,2*l),n.setRenderTarget(t),n.render(o,wo)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodMeshes.length;for(let r=1;rp-ji?n-p+ji:0),m=4*(this._cubeSize-g);l.envMap.value=e.texture,l.roughness.value=f,l.mipInt.value=p-t,_r(r,x,m,3*g,2*g),i.setRenderTarget(r),i.render(a,wo),l.envMap.value=r.texture,l.roughness.value=0,l.mipInt.value=p-n,_r(e,x,m,3*g,2*g),i.setRenderTarget(e),i.render(a,wo)}_blur(e,t,n,i,r){const o=this._pingPongRenderTarget;this._halfBlur(e,o,t,n,i,"latitudinal",r),this._halfBlur(o,e,n,n,i,"longitudinal",r)}_halfBlur(e,t,n,i,r,o,a){const l=this._renderer,c=this._blurMaterial;o!=="latitudinal"&&o!=="longitudinal"&&Qe("blur direction must be either latitudinal or longitudinal!");const h=3,u=this._lodMeshes[i];u.material=c;const d=c.uniforms,f=this._sizeLods[n]-1,p=isFinite(r)?Math.PI/(2*f):2*Math.PI/(2*ps-1),g=r/p,x=isFinite(r)?1+Math.floor(h*g):ps;x>ps&&He(`sigmaRadians, ${r}, is too large and will clip, as it requested ${x} samples when the maximum is set to ${ps}`);const m=[];let b=0;for(let A=0;Av-ji?i-v+ji:0),E=4*(this._cubeSize-y);_r(t,M,E,3*y,2*y),l.setRenderTarget(t),l.render(u,wo)}}function oy(s){const e=[],t=[],n=[];let i=s;const r=s-ji+1+sp.length;for(let o=0;os-ji?l=sp[o-s+ji-1]:o===0&&(l=0),t.push(l);const c=1/(a-2),h=-c,u=1+c,d=[h,h,u,h,u,u,h,h,u,u,h,u],f=6,p=6,g=3,x=2,m=1,b=new Float32Array(g*p*f),v=new Float32Array(x*p*f),y=new Float32Array(m*p*f);for(let E=0;E2?0:-1,_=[A,R,0,A+2/3,R,0,A+2/3,R+1,0,A,R,0,A+2/3,R+1,0,A,R+1,0];b.set(_,g*p*E),v.set(d,x*p*E);const S=[E,E,E,E,E,E];y.set(S,m*p*E)}const M=new ht;M.setAttribute("position",new at(b,g)),M.setAttribute("uv",new at(v,x)),M.setAttribute("faceIndex",new at(y,m)),n.push(new ut(M,null)),i>ji&&i--}return{lodMeshes:n,sizeLods:e,sigmas:t}}function ap(s,e,t){const n=new pn(s,e,t);return n.texture.mapping=Xo,n.texture.name="PMREM.cubeUv",n.scissorTest=!0,n}function _r(s,e,t,n,i){s.viewport.set(e,t,n,i),s.scissor.set(e,t,n,i)}function ay(s,e,t){return new kt({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:sy,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/t,CUBEUV_MAX_MIP:`${s}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:Oa(),fragmentShader:` precision highp float; precision highp int; @@ -3697,7 +3697,7 @@ void main() { gl_FragColor = vec4(prefilteredColor, 1.0); } - `,blending:Wt,depthTest:!1,depthWrite:!1})}function cy(s,e,t){const n=new Float32Array(ps),i=new P(0,1,0);return new kt({name:"SphericalGaussianBlur",defines:{n:ps,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/t,CUBEUV_MAX_MIP:`${s}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:i}},vertexShader:Oa(),fragmentShader:` + `,blending:Wt,depthTest:!1,depthWrite:!1})}function ly(s,e,t){const n=new Float32Array(ps),i=new P(0,1,0);return new kt({name:"SphericalGaussianBlur",defines:{n:ps,CUBEUV_TEXEL_WIDTH:1/e,CUBEUV_TEXEL_HEIGHT:1/t,CUBEUV_MAX_MIP:`${s}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:n},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:i}},vertexShader:Oa(),fragmentShader:` precision mediump float; precision mediump int; @@ -3757,7 +3757,7 @@ void main() { } } - `,blending:Wt,depthTest:!1,depthWrite:!1})}function cp(){return new kt({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:Oa(),fragmentShader:` + `,blending:Wt,depthTest:!1,depthWrite:!1})}function lp(){return new kt({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:Oa(),fragmentShader:` precision mediump float; precision mediump int; @@ -3776,7 +3776,7 @@ void main() { gl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 ); } - `,blending:Wt,depthTest:!1,depthWrite:!1})}function hp(){return new kt({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:Oa(),fragmentShader:` + `,blending:Wt,depthTest:!1,depthWrite:!1})}function cp(){return new kt({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:Oa(),fragmentShader:` precision mediump float; precision mediump int; @@ -3847,17 +3847,17 @@ void main() { gl_Position = vec4( position, 1.0 ); } - `}function hy(s){let e=new WeakMap,t=null;function n(a){if(a&&a.isTexture){const l=a.mapping,c=l===ec||l===tc,h=l===Os||l===Fs;if(c||h){let u=e.get(a);const d=u!==void 0?u.texture.pmremVersion:0;if(a.isRenderTargetTexture&&a.pmremVersion!==d)return t===null&&(t=new ap(s)),u=c?t.fromEquirectangular(a,u):t.fromCubemap(a,u),u.texture.pmremVersion=a.pmremVersion,e.set(a,u),u.texture;if(u!==void 0)return u.texture;{const f=a.image;return c&&f&&f.height>0||h&&f&&i(f)?(t===null&&(t=new ap(s)),u=c?t.fromEquirectangular(a):t.fromCubemap(a),u.texture.pmremVersion=a.pmremVersion,e.set(a,u),a.addEventListener("dispose",r),u.texture):null}}}return a}function i(a){let l=0;const c=6;for(let h=0;he.maxTextureSize&&(M=Math.ceil(y/e.maxTextureSize),y=e.maxTextureSize);const E=new Float32Array(y*M*4*u),A=new Hd(E,y,M,u);A.type=Xn,A.needsUpdate=!0;const R=v*4;for(let S=0;S0)return s;const i=e*t;let r=gp[i];if(r===void 0&&(r=new Float32Array(i),gp[i]=r),e!==0){n.toArray(r,0);for(let o=1,a=0;o!==e;++o)a+=t,s[o].toArray(r,a)}return r}function Vt(s,e){if(s.length!==e.length)return!1;for(let t=0,n=s.length;t0||h&&f&&i(f)?(t===null&&(t=new op(s)),u=c?t.fromEquirectangular(a):t.fromCubemap(a),u.texture.pmremVersion=a.pmremVersion,e.set(a,u),a.addEventListener("dispose",r),u.texture):null}}}return a}function i(a){let l=0;const c=6;for(let h=0;he.maxTextureSize&&(M=Math.ceil(y/e.maxTextureSize),y=e.maxTextureSize);const E=new Float32Array(y*M*4*u),A=new zd(E,y,M,u);A.type=Xn,A.needsUpdate=!0;const R=v*4;for(let S=0;S0)return s;const i=e*t;let r=mp[i];if(r===void 0&&(r=new Float32Array(i),mp[i]=r),e!==0){n.toArray(r,0);for(let o=1,a=0;o!==e;++o)a+=t,s[o].toArray(r,a)}return r}function Vt(s,e){if(s.length!==e.length)return!1;for(let t=0,n=s.length;t":" "} ${a}: ${t[o]}`)}return n.join(` -`)}const wp=new Ke;function h_(s){it._getMatrix(wp,it.workingColorSpace,s);const e=`mat3( ${wp.elements.map(t=>t.toFixed(4))} )`;switch(it.getTransfer(s)){case Jo:return[e,"LinearTransferOETF"];case lt:return[e,"sRGBTransferOETF"];default:return He("WebGLProgram: Unsupported color space: ",s),[e,"LinearTransferOETF"]}}function Sp(s,e,t){const n=s.getShaderParameter(e,s.COMPILE_STATUS),r=(s.getShaderInfoLog(e)||"").trim();if(n&&r==="")return"";const o=/ERROR: 0:(\d+)/.exec(r);if(o){const a=parseInt(o[1]);return t.toUpperCase()+` +`)}const Mp=new Ke;function c_(s){it._getMatrix(Mp,it.workingColorSpace,s);const e=`mat3( ${Mp.elements.map(t=>t.toFixed(4))} )`;switch(it.getTransfer(s)){case Jo:return[e,"LinearTransferOETF"];case lt:return[e,"sRGBTransferOETF"];default:return He("WebGLProgram: Unsupported color space: ",s),[e,"LinearTransferOETF"]}}function wp(s,e,t){const n=s.getShaderParameter(e,s.COMPILE_STATUS),r=(s.getShaderInfoLog(e)||"").trim();if(n&&r==="")return"";const o=/ERROR: 0:(\d+)/.exec(r);if(o){const a=parseInt(o[1]);return t.toUpperCase()+` `+r+` -`+c_(s.getShaderSource(e),a)}else return r}function u_(s,e){const t=h_(e);return[`vec4 ${s}( vec4 value ) {`,` return ${t[1]}( vec4( value.rgb * ${t[0]}, value.a ) );`,"}"].join(` -`)}function d_(s,e){let t;switch(e){case fd:t="Linear";break;case pd:t="Reinhard";break;case md:t="Cineon";break;case Ql:t="ACESFilmic";break;case xd:t="AgX";break;case vd:t="Neutral";break;case gd:t="Custom";break;default:He("WebGLProgram: Unsupported toneMapping:",e),t="Linear"}return"vec3 "+s+"( vec3 color ) { return "+t+"ToneMapping( color ); }"}const Ha=new P;function f_(){it.getLuminanceCoefficients(Ha);const s=Ha.x.toFixed(4),e=Ha.y.toFixed(4),t=Ha.z.toFixed(4);return["float luminance( const in vec3 rgb ) {",` const vec3 weights = vec3( ${s}, ${e}, ${t} );`," return dot( weights, rgb );","}"].join(` -`)}function p_(s){return[s.extensionClipCullDistance?"#extension GL_ANGLE_clip_cull_distance : require":"",s.extensionMultiDraw?"#extension GL_ANGLE_multi_draw : require":""].filter(So).join(` -`)}function m_(s){const e=[];for(const t in s){const n=s[t];n!==!1&&e.push("#define "+t+" "+n)}return e.join(` -`)}function g_(s,e){const t={},n=s.getProgramParameter(e,s.ACTIVE_ATTRIBUTES);for(let i=0;i/gm;function Wh(s){return s.replace(x_,b_)}const v_=new Map;function b_(s,e){let t=et[e];if(t===void 0){const n=v_.get(e);if(n!==void 0)t=et[n],He('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',e,n);else throw new Error("Can not resolve #include <"+e+">")}return Wh(t)}const y_=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Ap(s){return s.replace(y_,__)}function __(s,e,t,n){let i="";for(let r=parseInt(e);r/gm;function Wh(s){return s.replace(g_,v_)}const x_=new Map;function v_(s,e){let t=et[e];if(t===void 0){const n=x_.get(e);if(n!==void 0)t=et[n],He('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',e,n);else throw new Error("Can not resolve #include <"+e+">")}return Wh(t)}const b_=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Tp(s){return s.replace(b_,y_)}function y_(s,e,t,n){let i="";for(let r=parseInt(e);r0&&(x+=` `),m=["#define SHADER_TYPE "+t.shaderType,"#define SHADER_NAME "+t.shaderName,p].filter(So).join(` `),m.length>0&&(m+=` -`)):(x=[Cp(t),"#define SHADER_TYPE "+t.shaderType,"#define SHADER_NAME "+t.shaderName,p,t.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",t.batching?"#define USE_BATCHING":"",t.batchingColor?"#define USE_BATCHING_COLOR":"",t.instancing?"#define USE_INSTANCING":"",t.instancingColor?"#define USE_INSTANCING_COLOR":"",t.instancingMorph?"#define USE_INSTANCING_MORPH":"",t.useFog&&t.fog?"#define USE_FOG":"",t.useFog&&t.fogExp2?"#define FOG_EXP2":"",t.map?"#define USE_MAP":"",t.envMap?"#define USE_ENVMAP":"",t.envMap?"#define "+h:"",t.lightMap?"#define USE_LIGHTMAP":"",t.aoMap?"#define USE_AOMAP":"",t.bumpMap?"#define USE_BUMPMAP":"",t.normalMap?"#define USE_NORMALMAP":"",t.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",t.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",t.displacementMap?"#define USE_DISPLACEMENTMAP":"",t.emissiveMap?"#define USE_EMISSIVEMAP":"",t.anisotropy?"#define USE_ANISOTROPY":"",t.anisotropyMap?"#define USE_ANISOTROPYMAP":"",t.clearcoatMap?"#define USE_CLEARCOATMAP":"",t.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",t.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",t.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",t.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",t.specularMap?"#define USE_SPECULARMAP":"",t.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",t.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",t.roughnessMap?"#define USE_ROUGHNESSMAP":"",t.metalnessMap?"#define USE_METALNESSMAP":"",t.alphaMap?"#define USE_ALPHAMAP":"",t.alphaHash?"#define USE_ALPHAHASH":"",t.transmission?"#define USE_TRANSMISSION":"",t.transmissionMap?"#define USE_TRANSMISSIONMAP":"",t.thicknessMap?"#define USE_THICKNESSMAP":"",t.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",t.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",t.mapUv?"#define MAP_UV "+t.mapUv:"",t.alphaMapUv?"#define ALPHAMAP_UV "+t.alphaMapUv:"",t.lightMapUv?"#define LIGHTMAP_UV "+t.lightMapUv:"",t.aoMapUv?"#define AOMAP_UV "+t.aoMapUv:"",t.emissiveMapUv?"#define EMISSIVEMAP_UV "+t.emissiveMapUv:"",t.bumpMapUv?"#define BUMPMAP_UV "+t.bumpMapUv:"",t.normalMapUv?"#define NORMALMAP_UV "+t.normalMapUv:"",t.displacementMapUv?"#define DISPLACEMENTMAP_UV "+t.displacementMapUv:"",t.metalnessMapUv?"#define METALNESSMAP_UV "+t.metalnessMapUv:"",t.roughnessMapUv?"#define ROUGHNESSMAP_UV "+t.roughnessMapUv:"",t.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+t.anisotropyMapUv:"",t.clearcoatMapUv?"#define CLEARCOATMAP_UV "+t.clearcoatMapUv:"",t.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+t.clearcoatNormalMapUv:"",t.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+t.clearcoatRoughnessMapUv:"",t.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+t.iridescenceMapUv:"",t.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+t.iridescenceThicknessMapUv:"",t.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+t.sheenColorMapUv:"",t.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+t.sheenRoughnessMapUv:"",t.specularMapUv?"#define SPECULARMAP_UV "+t.specularMapUv:"",t.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+t.specularColorMapUv:"",t.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+t.specularIntensityMapUv:"",t.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+t.transmissionMapUv:"",t.thicknessMapUv?"#define THICKNESSMAP_UV "+t.thicknessMapUv:"",t.vertexTangents&&t.flatShading===!1?"#define USE_TANGENT":"",t.vertexColors?"#define USE_COLOR":"",t.vertexAlphas?"#define USE_COLOR_ALPHA":"",t.vertexUv1s?"#define USE_UV1":"",t.vertexUv2s?"#define USE_UV2":"",t.vertexUv3s?"#define USE_UV3":"",t.pointsUvs?"#define USE_POINTS_UV":"",t.flatShading?"#define FLAT_SHADED":"",t.skinning?"#define USE_SKINNING":"",t.morphTargets?"#define USE_MORPHTARGETS":"",t.morphNormals&&t.flatShading===!1?"#define USE_MORPHNORMALS":"",t.morphColors?"#define USE_MORPHCOLORS":"",t.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+t.morphTextureStride:"",t.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+t.morphTargetsCount:"",t.doubleSided?"#define DOUBLE_SIDED":"",t.flipSided?"#define FLIP_SIDED":"",t.shadowMapEnabled?"#define USE_SHADOWMAP":"",t.shadowMapEnabled?"#define "+l:"",t.sizeAttenuation?"#define USE_SIZEATTENUATION":"",t.numLightProbes>0?"#define USE_LIGHT_PROBES":"",t.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",t.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING"," attribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR"," attribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH"," uniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1"," attribute vec2 uv1;","#endif","#ifdef USE_UV2"," attribute vec2 uv2;","#endif","#ifdef USE_UV3"," attribute vec2 uv3;","#endif","#ifdef USE_TANGENT"," attribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )"," attribute vec4 color;","#elif defined( USE_COLOR )"," attribute vec3 color;","#endif","#ifdef USE_SKINNING"," attribute vec4 skinIndex;"," attribute vec4 skinWeight;","#endif",` +`)):(x=[Ap(t),"#define SHADER_TYPE "+t.shaderType,"#define SHADER_NAME "+t.shaderName,p,t.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",t.batching?"#define USE_BATCHING":"",t.batchingColor?"#define USE_BATCHING_COLOR":"",t.instancing?"#define USE_INSTANCING":"",t.instancingColor?"#define USE_INSTANCING_COLOR":"",t.instancingMorph?"#define USE_INSTANCING_MORPH":"",t.useFog&&t.fog?"#define USE_FOG":"",t.useFog&&t.fogExp2?"#define FOG_EXP2":"",t.map?"#define USE_MAP":"",t.envMap?"#define USE_ENVMAP":"",t.envMap?"#define "+h:"",t.lightMap?"#define USE_LIGHTMAP":"",t.aoMap?"#define USE_AOMAP":"",t.bumpMap?"#define USE_BUMPMAP":"",t.normalMap?"#define USE_NORMALMAP":"",t.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",t.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",t.displacementMap?"#define USE_DISPLACEMENTMAP":"",t.emissiveMap?"#define USE_EMISSIVEMAP":"",t.anisotropy?"#define USE_ANISOTROPY":"",t.anisotropyMap?"#define USE_ANISOTROPYMAP":"",t.clearcoatMap?"#define USE_CLEARCOATMAP":"",t.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",t.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",t.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",t.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",t.specularMap?"#define USE_SPECULARMAP":"",t.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",t.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",t.roughnessMap?"#define USE_ROUGHNESSMAP":"",t.metalnessMap?"#define USE_METALNESSMAP":"",t.alphaMap?"#define USE_ALPHAMAP":"",t.alphaHash?"#define USE_ALPHAHASH":"",t.transmission?"#define USE_TRANSMISSION":"",t.transmissionMap?"#define USE_TRANSMISSIONMAP":"",t.thicknessMap?"#define USE_THICKNESSMAP":"",t.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",t.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",t.mapUv?"#define MAP_UV "+t.mapUv:"",t.alphaMapUv?"#define ALPHAMAP_UV "+t.alphaMapUv:"",t.lightMapUv?"#define LIGHTMAP_UV "+t.lightMapUv:"",t.aoMapUv?"#define AOMAP_UV "+t.aoMapUv:"",t.emissiveMapUv?"#define EMISSIVEMAP_UV "+t.emissiveMapUv:"",t.bumpMapUv?"#define BUMPMAP_UV "+t.bumpMapUv:"",t.normalMapUv?"#define NORMALMAP_UV "+t.normalMapUv:"",t.displacementMapUv?"#define DISPLACEMENTMAP_UV "+t.displacementMapUv:"",t.metalnessMapUv?"#define METALNESSMAP_UV "+t.metalnessMapUv:"",t.roughnessMapUv?"#define ROUGHNESSMAP_UV "+t.roughnessMapUv:"",t.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+t.anisotropyMapUv:"",t.clearcoatMapUv?"#define CLEARCOATMAP_UV "+t.clearcoatMapUv:"",t.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+t.clearcoatNormalMapUv:"",t.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+t.clearcoatRoughnessMapUv:"",t.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+t.iridescenceMapUv:"",t.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+t.iridescenceThicknessMapUv:"",t.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+t.sheenColorMapUv:"",t.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+t.sheenRoughnessMapUv:"",t.specularMapUv?"#define SPECULARMAP_UV "+t.specularMapUv:"",t.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+t.specularColorMapUv:"",t.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+t.specularIntensityMapUv:"",t.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+t.transmissionMapUv:"",t.thicknessMapUv?"#define THICKNESSMAP_UV "+t.thicknessMapUv:"",t.vertexTangents&&t.flatShading===!1?"#define USE_TANGENT":"",t.vertexColors?"#define USE_COLOR":"",t.vertexAlphas?"#define USE_COLOR_ALPHA":"",t.vertexUv1s?"#define USE_UV1":"",t.vertexUv2s?"#define USE_UV2":"",t.vertexUv3s?"#define USE_UV3":"",t.pointsUvs?"#define USE_POINTS_UV":"",t.flatShading?"#define FLAT_SHADED":"",t.skinning?"#define USE_SKINNING":"",t.morphTargets?"#define USE_MORPHTARGETS":"",t.morphNormals&&t.flatShading===!1?"#define USE_MORPHNORMALS":"",t.morphColors?"#define USE_MORPHCOLORS":"",t.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+t.morphTextureStride:"",t.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+t.morphTargetsCount:"",t.doubleSided?"#define DOUBLE_SIDED":"",t.flipSided?"#define FLIP_SIDED":"",t.shadowMapEnabled?"#define USE_SHADOWMAP":"",t.shadowMapEnabled?"#define "+l:"",t.sizeAttenuation?"#define USE_SIZEATTENUATION":"",t.numLightProbes>0?"#define USE_LIGHT_PROBES":"",t.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",t.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING"," attribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR"," attribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH"," uniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1"," attribute vec2 uv1;","#endif","#ifdef USE_UV2"," attribute vec2 uv2;","#endif","#ifdef USE_UV3"," attribute vec2 uv3;","#endif","#ifdef USE_TANGENT"," attribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )"," attribute vec4 color;","#elif defined( USE_COLOR )"," attribute vec3 color;","#endif","#ifdef USE_SKINNING"," attribute vec4 skinIndex;"," attribute vec4 skinWeight;","#endif",` `].filter(So).join(` -`),m=[Cp(t),"#define SHADER_TYPE "+t.shaderType,"#define SHADER_NAME "+t.shaderName,p,t.useFog&&t.fog?"#define USE_FOG":"",t.useFog&&t.fogExp2?"#define FOG_EXP2":"",t.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",t.map?"#define USE_MAP":"",t.matcap?"#define USE_MATCAP":"",t.envMap?"#define USE_ENVMAP":"",t.envMap?"#define "+c:"",t.envMap?"#define "+h:"",t.envMap?"#define "+u:"",d?"#define CUBEUV_TEXEL_WIDTH "+d.texelWidth:"",d?"#define CUBEUV_TEXEL_HEIGHT "+d.texelHeight:"",d?"#define CUBEUV_MAX_MIP "+d.maxMip+".0":"",t.lightMap?"#define USE_LIGHTMAP":"",t.aoMap?"#define USE_AOMAP":"",t.bumpMap?"#define USE_BUMPMAP":"",t.normalMap?"#define USE_NORMALMAP":"",t.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",t.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",t.emissiveMap?"#define USE_EMISSIVEMAP":"",t.anisotropy?"#define USE_ANISOTROPY":"",t.anisotropyMap?"#define USE_ANISOTROPYMAP":"",t.clearcoat?"#define USE_CLEARCOAT":"",t.clearcoatMap?"#define USE_CLEARCOATMAP":"",t.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",t.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",t.dispersion?"#define USE_DISPERSION":"",t.iridescence?"#define USE_IRIDESCENCE":"",t.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",t.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",t.specularMap?"#define USE_SPECULARMAP":"",t.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",t.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",t.roughnessMap?"#define USE_ROUGHNESSMAP":"",t.metalnessMap?"#define USE_METALNESSMAP":"",t.alphaMap?"#define USE_ALPHAMAP":"",t.alphaTest?"#define USE_ALPHATEST":"",t.alphaHash?"#define USE_ALPHAHASH":"",t.sheen?"#define USE_SHEEN":"",t.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",t.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",t.transmission?"#define USE_TRANSMISSION":"",t.transmissionMap?"#define USE_TRANSMISSIONMAP":"",t.thicknessMap?"#define USE_THICKNESSMAP":"",t.vertexTangents&&t.flatShading===!1?"#define USE_TANGENT":"",t.vertexColors||t.instancingColor||t.batchingColor?"#define USE_COLOR":"",t.vertexAlphas?"#define USE_COLOR_ALPHA":"",t.vertexUv1s?"#define USE_UV1":"",t.vertexUv2s?"#define USE_UV2":"",t.vertexUv3s?"#define USE_UV3":"",t.pointsUvs?"#define USE_POINTS_UV":"",t.gradientMap?"#define USE_GRADIENTMAP":"",t.flatShading?"#define FLAT_SHADED":"",t.doubleSided?"#define DOUBLE_SIDED":"",t.flipSided?"#define FLIP_SIDED":"",t.shadowMapEnabled?"#define USE_SHADOWMAP":"",t.shadowMapEnabled?"#define "+l:"",t.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",t.numLightProbes>0?"#define USE_LIGHT_PROBES":"",t.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",t.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",t.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",t.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",t.toneMapping!==Ni?"#define TONE_MAPPING":"",t.toneMapping!==Ni?et.tonemapping_pars_fragment:"",t.toneMapping!==Ni?d_("toneMapping",t.toneMapping):"",t.dithering?"#define DITHERING":"",t.opaque?"#define OPAQUE":"",et.colorspace_pars_fragment,u_("linearToOutputTexel",t.outputColorSpace),f_(),t.useDepthPacking?"#define DEPTH_PACKING "+t.depthPacking:"",` +`),m=[Ap(t),"#define SHADER_TYPE "+t.shaderType,"#define SHADER_NAME "+t.shaderName,p,t.useFog&&t.fog?"#define USE_FOG":"",t.useFog&&t.fogExp2?"#define FOG_EXP2":"",t.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",t.map?"#define USE_MAP":"",t.matcap?"#define USE_MATCAP":"",t.envMap?"#define USE_ENVMAP":"",t.envMap?"#define "+c:"",t.envMap?"#define "+h:"",t.envMap?"#define "+u:"",d?"#define CUBEUV_TEXEL_WIDTH "+d.texelWidth:"",d?"#define CUBEUV_TEXEL_HEIGHT "+d.texelHeight:"",d?"#define CUBEUV_MAX_MIP "+d.maxMip+".0":"",t.lightMap?"#define USE_LIGHTMAP":"",t.aoMap?"#define USE_AOMAP":"",t.bumpMap?"#define USE_BUMPMAP":"",t.normalMap?"#define USE_NORMALMAP":"",t.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",t.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",t.emissiveMap?"#define USE_EMISSIVEMAP":"",t.anisotropy?"#define USE_ANISOTROPY":"",t.anisotropyMap?"#define USE_ANISOTROPYMAP":"",t.clearcoat?"#define USE_CLEARCOAT":"",t.clearcoatMap?"#define USE_CLEARCOATMAP":"",t.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",t.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",t.dispersion?"#define USE_DISPERSION":"",t.iridescence?"#define USE_IRIDESCENCE":"",t.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",t.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",t.specularMap?"#define USE_SPECULARMAP":"",t.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",t.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",t.roughnessMap?"#define USE_ROUGHNESSMAP":"",t.metalnessMap?"#define USE_METALNESSMAP":"",t.alphaMap?"#define USE_ALPHAMAP":"",t.alphaTest?"#define USE_ALPHATEST":"",t.alphaHash?"#define USE_ALPHAHASH":"",t.sheen?"#define USE_SHEEN":"",t.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",t.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",t.transmission?"#define USE_TRANSMISSION":"",t.transmissionMap?"#define USE_TRANSMISSIONMAP":"",t.thicknessMap?"#define USE_THICKNESSMAP":"",t.vertexTangents&&t.flatShading===!1?"#define USE_TANGENT":"",t.vertexColors||t.instancingColor||t.batchingColor?"#define USE_COLOR":"",t.vertexAlphas?"#define USE_COLOR_ALPHA":"",t.vertexUv1s?"#define USE_UV1":"",t.vertexUv2s?"#define USE_UV2":"",t.vertexUv3s?"#define USE_UV3":"",t.pointsUvs?"#define USE_POINTS_UV":"",t.gradientMap?"#define USE_GRADIENTMAP":"",t.flatShading?"#define FLAT_SHADED":"",t.doubleSided?"#define DOUBLE_SIDED":"",t.flipSided?"#define FLIP_SIDED":"",t.shadowMapEnabled?"#define USE_SHADOWMAP":"",t.shadowMapEnabled?"#define "+l:"",t.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",t.numLightProbes>0?"#define USE_LIGHT_PROBES":"",t.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",t.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",t.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",t.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",t.toneMapping!==Ni?"#define TONE_MAPPING":"",t.toneMapping!==Ni?et.tonemapping_pars_fragment:"",t.toneMapping!==Ni?u_("toneMapping",t.toneMapping):"",t.dithering?"#define DITHERING":"",t.opaque?"#define OPAQUE":"",et.colorspace_pars_fragment,h_("linearToOutputTexel",t.outputColorSpace),d_(),t.useDepthPacking?"#define DEPTH_PACKING "+t.depthPacking:"",` `].filter(So).join(` -`)),o=Wh(o),o=Ep(o,t),o=Tp(o,t),a=Wh(a),a=Ep(a,t),a=Tp(a,t),o=Ap(o),a=Ap(a),t.isRawShaderMaterial!==!0&&(b=`#version 300 es +`)),o=Wh(o),o=Sp(o,t),o=Ep(o,t),a=Wh(a),a=Sp(a,t),a=Ep(a,t),o=Tp(o),a=Tp(a),t.isRawShaderMaterial!==!0&&(b=`#version 300 es `,x=[f,"#define attribute in","#define varying out","#define texture2D texture"].join(` `)+` -`+x,m=["#define varying in",t.glslVersion===Bd?"":"layout(location = 0) out highp vec4 pc_fragColor;",t.glslVersion===Bd?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join(` +`+x,m=["#define varying in",t.glslVersion===Id?"":"layout(location = 0) out highp vec4 pc_fragColor;",t.glslVersion===Id?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join(` `)+` -`+m);const v=b+x+o,y=b+m+a,M=Mp(i,i.VERTEX_SHADER,v),E=Mp(i,i.FRAGMENT_SHADER,y);i.attachShader(g,M),i.attachShader(g,E),t.index0AttributeName!==void 0?i.bindAttribLocation(g,0,t.index0AttributeName):t.morphTargets===!0&&i.bindAttribLocation(g,0,"position"),i.linkProgram(g);function A(D){if(s.debug.checkShaderErrors){const C=i.getProgramInfoLog(g)||"",B=i.getShaderInfoLog(M)||"",w=i.getShaderInfoLog(E)||"",F=C.trim(),W=B.trim(),j=w.trim();let $=!0,Z=!0;if(i.getProgramParameter(g,i.LINK_STATUS)===!1)if($=!1,typeof s.debug.onShaderError=="function")s.debug.onShaderError(i,g,M,E);else{const re=Sp(i,M,"vertex"),X=Sp(i,E,"fragment");Qe("THREE.WebGLProgram: Shader Error "+i.getError()+" - VALIDATE_STATUS "+i.getProgramParameter(g,i.VALIDATE_STATUS)+` +`+m);const v=b+x+o,y=b+m+a,M=_p(i,i.VERTEX_SHADER,v),E=_p(i,i.FRAGMENT_SHADER,y);i.attachShader(g,M),i.attachShader(g,E),t.index0AttributeName!==void 0?i.bindAttribLocation(g,0,t.index0AttributeName):t.morphTargets===!0&&i.bindAttribLocation(g,0,"position"),i.linkProgram(g);function A(D){if(s.debug.checkShaderErrors){const C=i.getProgramInfoLog(g)||"",B=i.getShaderInfoLog(M)||"",w=i.getShaderInfoLog(E)||"",F=C.trim(),W=B.trim(),j=w.trim();let $=!0,Z=!0;if(i.getProgramParameter(g,i.LINK_STATUS)===!1)if($=!1,typeof s.debug.onShaderError=="function")s.debug.onShaderError(i,g,M,E);else{const re=wp(i,M,"vertex"),X=wp(i,E,"fragment");Qe("THREE.WebGLProgram: Shader Error "+i.getError()+" - VALIDATE_STATUS "+i.getProgramParameter(g,i.VALIDATE_STATUS)+` Material Name: `+D.name+` Material Type: `+D.type+` Program Info Log: `+F+` `+re+` -`+X)}else F!==""?He("WebGLProgram: Program Info Log:",F):(W===""||j==="")&&(Z=!1);Z&&(D.diagnostics={runnable:$,programLog:F,vertexShader:{log:W,prefix:x},fragmentShader:{log:j,prefix:m}})}i.deleteShader(M),i.deleteShader(E),R=new za(i,g),_=g_(i,g)}let R;this.getUniforms=function(){return R===void 0&&A(this),R};let _;this.getAttributes=function(){return _===void 0&&A(this),_};let S=t.rendererExtensionParallelShaderCompile===!1;return this.isReady=function(){return S===!1&&(S=i.getProgramParameter(g,a_)),S},this.destroy=function(){n.releaseStatesOfProgram(this),i.deleteProgram(g),this.program=void 0},this.type=t.shaderType,this.name=t.shaderName,this.id=l_++,this.cacheKey=e,this.usedTimes=1,this.program=g,this.vertexShader=M,this.fragmentShader=E,this}let C_=0;class P_{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(e){const t=e.vertexShader,n=e.fragmentShader,i=this._getShaderStage(t),r=this._getShaderStage(n),o=this._getShaderCacheForMaterial(e);return o.has(i)===!1&&(o.add(i),i.usedTimes++),o.has(r)===!1&&(o.add(r),r.usedTimes++),this}remove(e){const t=this.materialCache.get(e);for(const n of t)n.usedTimes--,n.usedTimes===0&&this.shaderCache.delete(n.code);return this.materialCache.delete(e),this}getVertexShaderID(e){return this._getShaderStage(e.vertexShader).id}getFragmentShaderID(e){return this._getShaderStage(e.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(e){const t=this.materialCache;let n=t.get(e);return n===void 0&&(n=new Set,t.set(e,n)),n}_getShaderStage(e){const t=this.shaderCache;let n=t.get(e);return n===void 0&&(n=new R_(e),t.set(e,n)),n}}class R_{constructor(e){this.id=C_++,this.code=e,this.usedTimes=0}}function L_(s,e,t,n,i,r,o){const a=new Jc,l=new P_,c=new Set,h=[],u=i.logarithmicDepthBuffer,d=i.vertexTextures;let f=i.precision;const p={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function g(_){return c.add(_),_===0?"uv":`uv${_}`}function x(_,S,D,C,B){const w=C.fog,F=B.geometry,W=_.isMeshStandardMaterial?C.environment:null,j=(_.isMeshStandardMaterial?t:e).get(_.envMap||W),$=j&&j.mapping===Xo?j.image.height:null,Z=p[_.type];_.precision!==null&&(f=i.getMaxPrecision(_.precision),f!==_.precision&&He("WebGLProgram.getParameters:",_.precision,"not supported, using",f,"instead."));const re=F.morphAttributes.position||F.morphAttributes.normal||F.morphAttributes.color,X=re!==void 0?re.length:0;let Y=0;F.morphAttributes.position!==void 0&&(Y=1),F.morphAttributes.normal!==void 0&&(Y=2),F.morphAttributes.color!==void 0&&(Y=3);let ge,pe,de,ie;if(Z){const pt=li[Z];ge=pt.vertexShader,pe=pt.fragmentShader}else ge=_.vertexShader,pe=_.fragmentShader,l.update(_),de=l.getVertexShaderID(_),ie=l.getFragmentShaderID(_);const he=s.getRenderTarget(),fe=s.state.buffers.depth.getReversed(),ve=B.isInstancedMesh===!0,we=B.isBatchedMesh===!0,Be=!!_.map,Je=!!_.matcap,Ne=!!j,T=!!_.aoMap,I=!!_.lightMap,V=!!_.bumpMap,U=!!_.normalMap,k=!!_.displacementMap,z=!!_.emissiveMap,ee=!!_.metalnessMap,J=!!_.roughnessMap,G=_.anisotropy>0,N=_.clearcoat>0,L=_.dispersion>0,H=_.iridescence>0,K=_.sheen>0,le=_.transmission>0,te=G&&!!_.anisotropyMap,Te=N&&!!_.clearcoatMap,be=N&&!!_.clearcoatNormalMap,Re=N&&!!_.clearcoatRoughnessMap,De=H&&!!_.iridescenceMap,ue=H&&!!_.iridescenceThicknessMap,ye=K&&!!_.sheenColorMap,Ve=K&&!!_.sheenRoughnessMap,ke=!!_.specularMap,Ae=!!_.specularColorMap,Ge=!!_.specularIntensityMap,q=le&&!!_.transmissionMap,Ee=le&&!!_.thicknessMap,_e=!!_.gradientMap,Me=!!_.alphaMap,xe=_.alphaTest>0,me=!!_.alphaHash,Oe=!!_.extensions;let Ye=Ni;_.toneMapped&&(he===null||he.isXRRenderTarget===!0)&&(Ye=s.toneMapping);const wt={shaderID:Z,shaderType:_.type,shaderName:_.name,vertexShader:ge,fragmentShader:pe,defines:_.defines,customVertexShaderID:de,customFragmentShaderID:ie,isRawShaderMaterial:_.isRawShaderMaterial===!0,glslVersion:_.glslVersion,precision:f,batching:we,batchingColor:we&&B._colorsTexture!==null,instancing:ve,instancingColor:ve&&B.instanceColor!==null,instancingMorph:ve&&B.morphTexture!==null,supportsVertexTextures:d,outputColorSpace:he===null?s.outputColorSpace:he.isXRRenderTarget===!0?he.texture.colorSpace:Rt,alphaToCoverage:!!_.alphaToCoverage,map:Be,matcap:Je,envMap:Ne,envMapMode:Ne&&j.mapping,envMapCubeUVHeight:$,aoMap:T,lightMap:I,bumpMap:V,normalMap:U,displacementMap:d&&k,emissiveMap:z,normalMapObjectSpace:U&&_.normalMapType===Pg,normalMapTangentSpace:U&&_.normalMapType===Zr,metalnessMap:ee,roughnessMap:J,anisotropy:G,anisotropyMap:te,clearcoat:N,clearcoatMap:Te,clearcoatNormalMap:be,clearcoatRoughnessMap:Re,dispersion:L,iridescence:H,iridescenceMap:De,iridescenceThicknessMap:ue,sheen:K,sheenColorMap:ye,sheenRoughnessMap:Ve,specularMap:ke,specularColorMap:Ae,specularIntensityMap:Ge,transmission:le,transmissionMap:q,thicknessMap:Ee,gradientMap:_e,opaque:_.transparent===!1&&_.blending===ks&&_.alphaToCoverage===!1,alphaMap:Me,alphaTest:xe,alphaHash:me,combine:_.combine,mapUv:Be&&g(_.map.channel),aoMapUv:T&&g(_.aoMap.channel),lightMapUv:I&&g(_.lightMap.channel),bumpMapUv:V&&g(_.bumpMap.channel),normalMapUv:U&&g(_.normalMap.channel),displacementMapUv:k&&g(_.displacementMap.channel),emissiveMapUv:z&&g(_.emissiveMap.channel),metalnessMapUv:ee&&g(_.metalnessMap.channel),roughnessMapUv:J&&g(_.roughnessMap.channel),anisotropyMapUv:te&&g(_.anisotropyMap.channel),clearcoatMapUv:Te&&g(_.clearcoatMap.channel),clearcoatNormalMapUv:be&&g(_.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:Re&&g(_.clearcoatRoughnessMap.channel),iridescenceMapUv:De&&g(_.iridescenceMap.channel),iridescenceThicknessMapUv:ue&&g(_.iridescenceThicknessMap.channel),sheenColorMapUv:ye&&g(_.sheenColorMap.channel),sheenRoughnessMapUv:Ve&&g(_.sheenRoughnessMap.channel),specularMapUv:ke&&g(_.specularMap.channel),specularColorMapUv:Ae&&g(_.specularColorMap.channel),specularIntensityMapUv:Ge&&g(_.specularIntensityMap.channel),transmissionMapUv:q&&g(_.transmissionMap.channel),thicknessMapUv:Ee&&g(_.thicknessMap.channel),alphaMapUv:Me&&g(_.alphaMap.channel),vertexTangents:!!F.attributes.tangent&&(U||G),vertexColors:_.vertexColors,vertexAlphas:_.vertexColors===!0&&!!F.attributes.color&&F.attributes.color.itemSize===4,pointsUvs:B.isPoints===!0&&!!F.attributes.uv&&(Be||Me),fog:!!w,useFog:_.fog===!0,fogExp2:!!w&&w.isFogExp2,flatShading:_.flatShading===!0&&_.wireframe===!1,sizeAttenuation:_.sizeAttenuation===!0,logarithmicDepthBuffer:u,reversedDepthBuffer:fe,skinning:B.isSkinnedMesh===!0,morphTargets:F.morphAttributes.position!==void 0,morphNormals:F.morphAttributes.normal!==void 0,morphColors:F.morphAttributes.color!==void 0,morphTargetsCount:X,morphTextureStride:Y,numDirLights:S.directional.length,numPointLights:S.point.length,numSpotLights:S.spot.length,numSpotLightMaps:S.spotLightMap.length,numRectAreaLights:S.rectArea.length,numHemiLights:S.hemi.length,numDirLightShadows:S.directionalShadowMap.length,numPointLightShadows:S.pointShadowMap.length,numSpotLightShadows:S.spotShadowMap.length,numSpotLightShadowsWithMaps:S.numSpotLightShadowsWithMaps,numLightProbes:S.numLightProbes,numClippingPlanes:o.numPlanes,numClipIntersection:o.numIntersection,dithering:_.dithering,shadowMapEnabled:s.shadowMap.enabled&&D.length>0,shadowMapType:s.shadowMap.type,toneMapping:Ye,decodeVideoTexture:Be&&_.map.isVideoTexture===!0&&it.getTransfer(_.map.colorSpace)===lt,decodeVideoTextureEmissive:z&&_.emissiveMap.isVideoTexture===!0&&it.getTransfer(_.emissiveMap.colorSpace)===lt,premultipliedAlpha:_.premultipliedAlpha,doubleSided:_.side===Et,flipSided:_.side===on,useDepthPacking:_.depthPacking>=0,depthPacking:_.depthPacking||0,index0AttributeName:_.index0AttributeName,extensionClipCullDistance:Oe&&_.extensions.clipCullDistance===!0&&n.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Oe&&_.extensions.multiDraw===!0||we)&&n.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:n.has("KHR_parallel_shader_compile"),customProgramCacheKey:_.customProgramCacheKey()};return wt.vertexUv1s=c.has(1),wt.vertexUv2s=c.has(2),wt.vertexUv3s=c.has(3),c.clear(),wt}function m(_){const S=[];if(_.shaderID?S.push(_.shaderID):(S.push(_.customVertexShaderID),S.push(_.customFragmentShaderID)),_.defines!==void 0)for(const D in _.defines)S.push(D),S.push(_.defines[D]);return _.isRawShaderMaterial===!1&&(b(S,_),v(S,_),S.push(s.outputColorSpace)),S.push(_.customProgramCacheKey),S.join()}function b(_,S){_.push(S.precision),_.push(S.outputColorSpace),_.push(S.envMapMode),_.push(S.envMapCubeUVHeight),_.push(S.mapUv),_.push(S.alphaMapUv),_.push(S.lightMapUv),_.push(S.aoMapUv),_.push(S.bumpMapUv),_.push(S.normalMapUv),_.push(S.displacementMapUv),_.push(S.emissiveMapUv),_.push(S.metalnessMapUv),_.push(S.roughnessMapUv),_.push(S.anisotropyMapUv),_.push(S.clearcoatMapUv),_.push(S.clearcoatNormalMapUv),_.push(S.clearcoatRoughnessMapUv),_.push(S.iridescenceMapUv),_.push(S.iridescenceThicknessMapUv),_.push(S.sheenColorMapUv),_.push(S.sheenRoughnessMapUv),_.push(S.specularMapUv),_.push(S.specularColorMapUv),_.push(S.specularIntensityMapUv),_.push(S.transmissionMapUv),_.push(S.thicknessMapUv),_.push(S.combine),_.push(S.fogExp2),_.push(S.sizeAttenuation),_.push(S.morphTargetsCount),_.push(S.morphAttributeCount),_.push(S.numDirLights),_.push(S.numPointLights),_.push(S.numSpotLights),_.push(S.numSpotLightMaps),_.push(S.numHemiLights),_.push(S.numRectAreaLights),_.push(S.numDirLightShadows),_.push(S.numPointLightShadows),_.push(S.numSpotLightShadows),_.push(S.numSpotLightShadowsWithMaps),_.push(S.numLightProbes),_.push(S.shadowMapType),_.push(S.toneMapping),_.push(S.numClippingPlanes),_.push(S.numClipIntersection),_.push(S.depthPacking)}function v(_,S){a.disableAll(),S.supportsVertexTextures&&a.enable(0),S.instancing&&a.enable(1),S.instancingColor&&a.enable(2),S.instancingMorph&&a.enable(3),S.matcap&&a.enable(4),S.envMap&&a.enable(5),S.normalMapObjectSpace&&a.enable(6),S.normalMapTangentSpace&&a.enable(7),S.clearcoat&&a.enable(8),S.iridescence&&a.enable(9),S.alphaTest&&a.enable(10),S.vertexColors&&a.enable(11),S.vertexAlphas&&a.enable(12),S.vertexUv1s&&a.enable(13),S.vertexUv2s&&a.enable(14),S.vertexUv3s&&a.enable(15),S.vertexTangents&&a.enable(16),S.anisotropy&&a.enable(17),S.alphaHash&&a.enable(18),S.batching&&a.enable(19),S.dispersion&&a.enable(20),S.batchingColor&&a.enable(21),S.gradientMap&&a.enable(22),_.push(a.mask),a.disableAll(),S.fog&&a.enable(0),S.useFog&&a.enable(1),S.flatShading&&a.enable(2),S.logarithmicDepthBuffer&&a.enable(3),S.reversedDepthBuffer&&a.enable(4),S.skinning&&a.enable(5),S.morphTargets&&a.enable(6),S.morphNormals&&a.enable(7),S.morphColors&&a.enable(8),S.premultipliedAlpha&&a.enable(9),S.shadowMapEnabled&&a.enable(10),S.doubleSided&&a.enable(11),S.flipSided&&a.enable(12),S.useDepthPacking&&a.enable(13),S.dithering&&a.enable(14),S.transmission&&a.enable(15),S.sheen&&a.enable(16),S.opaque&&a.enable(17),S.pointsUvs&&a.enable(18),S.decodeVideoTexture&&a.enable(19),S.decodeVideoTextureEmissive&&a.enable(20),S.alphaToCoverage&&a.enable(21),_.push(a.mask)}function y(_){const S=p[_.type];let D;if(S){const C=li[S];D=oi.clone(C.uniforms)}else D=_.uniforms;return D}function M(_,S){let D;for(let C=0,B=h.length;C0?n.push(m):f.transparent===!0?i.push(m):t.push(m)}function l(u,d,f,p,g,x){const m=o(u,d,f,p,g,x);f.transmission>0?n.unshift(m):f.transparent===!0?i.unshift(m):t.unshift(m)}function c(u,d){t.length>1&&t.sort(u||I_),n.length>1&&n.sort(d||Pp),i.length>1&&i.sort(d||Pp)}function h(){for(let u=e,d=s.length;u=r.length?(o=new Rp,r.push(o)):o=r[i],o}function t(){s=new WeakMap}return{get:e,dispose:t}}function N_(){const s={};return{get:function(e){if(s[e.id]!==void 0)return s[e.id];let t;switch(e.type){case"DirectionalLight":t={direction:new P,color:new Ue};break;case"SpotLight":t={position:new P,direction:new P,color:new Ue,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":t={position:new P,color:new Ue,distance:0,decay:0};break;case"HemisphereLight":t={direction:new P,skyColor:new Ue,groundColor:new Ue};break;case"RectAreaLight":t={color:new Ue,position:new P,halfWidth:new P,halfHeight:new P};break}return s[e.id]=t,t}}}function k_(){const s={};return{get:function(e){if(s[e.id]!==void 0)return s[e.id];let t;switch(e.type){case"DirectionalLight":t={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new ce};break;case"SpotLight":t={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new ce};break;case"PointLight":t={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new ce,shadowCameraNear:1,shadowCameraFar:1e3};break}return s[e.id]=t,t}}}let U_=0;function O_(s,e){return(e.castShadow?2:0)-(s.castShadow?2:0)+(e.map?1:0)-(s.map?1:0)}function F_(s){const e=new N_,t=k_(),n={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let c=0;c<9;c++)n.probe.push(new P);const i=new P,r=new ze,o=new ze;function a(c){let h=0,u=0,d=0;for(let _=0;_<9;_++)n.probe[_].set(0,0,0);let f=0,p=0,g=0,x=0,m=0,b=0,v=0,y=0,M=0,E=0,A=0;c.sort(O_);for(let _=0,S=c.length;_0&&(s.has("OES_texture_float_linear")===!0?(n.rectAreaLTC1=Pe.LTC_FLOAT_1,n.rectAreaLTC2=Pe.LTC_FLOAT_2):(n.rectAreaLTC1=Pe.LTC_HALF_1,n.rectAreaLTC2=Pe.LTC_HALF_2)),n.ambient[0]=h,n.ambient[1]=u,n.ambient[2]=d;const R=n.hash;(R.directionalLength!==f||R.pointLength!==p||R.spotLength!==g||R.rectAreaLength!==x||R.hemiLength!==m||R.numDirectionalShadows!==b||R.numPointShadows!==v||R.numSpotShadows!==y||R.numSpotMaps!==M||R.numLightProbes!==A)&&(n.directional.length=f,n.spot.length=g,n.rectArea.length=x,n.point.length=p,n.hemi.length=m,n.directionalShadow.length=b,n.directionalShadowMap.length=b,n.pointShadow.length=v,n.pointShadowMap.length=v,n.spotShadow.length=y,n.spotShadowMap.length=y,n.directionalShadowMatrix.length=b,n.pointShadowMatrix.length=v,n.spotLightMatrix.length=y+M-E,n.spotLightMap.length=M,n.numSpotLightShadowsWithMaps=E,n.numLightProbes=A,R.directionalLength=f,R.pointLength=p,R.spotLength=g,R.rectAreaLength=x,R.hemiLength=m,R.numDirectionalShadows=b,R.numPointShadows=v,R.numSpotShadows=y,R.numSpotMaps=M,R.numLightProbes=A,n.version=U_++)}function l(c,h){let u=0,d=0,f=0,p=0,g=0;const x=h.matrixWorldInverse;for(let m=0,b=c.length;m=o.length?(a=new Lp(s),o.push(a)):a=o[r],a}function n(){e=new WeakMap}return{get:t,dispose:n}}const H_=`void main() { +`+X)}else F!==""?He("WebGLProgram: Program Info Log:",F):(W===""||j==="")&&(Z=!1);Z&&(D.diagnostics={runnable:$,programLog:F,vertexShader:{log:W,prefix:x},fragmentShader:{log:j,prefix:m}})}i.deleteShader(M),i.deleteShader(E),R=new za(i,g),_=m_(i,g)}let R;this.getUniforms=function(){return R===void 0&&A(this),R};let _;this.getAttributes=function(){return _===void 0&&A(this),_};let S=t.rendererExtensionParallelShaderCompile===!1;return this.isReady=function(){return S===!1&&(S=i.getProgramParameter(g,o_)),S},this.destroy=function(){n.releaseStatesOfProgram(this),i.deleteProgram(g),this.program=void 0},this.type=t.shaderType,this.name=t.shaderName,this.id=a_++,this.cacheKey=e,this.usedTimes=1,this.program=g,this.vertexShader=M,this.fragmentShader=E,this}let A_=0;class C_{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(e){const t=e.vertexShader,n=e.fragmentShader,i=this._getShaderStage(t),r=this._getShaderStage(n),o=this._getShaderCacheForMaterial(e);return o.has(i)===!1&&(o.add(i),i.usedTimes++),o.has(r)===!1&&(o.add(r),r.usedTimes++),this}remove(e){const t=this.materialCache.get(e);for(const n of t)n.usedTimes--,n.usedTimes===0&&this.shaderCache.delete(n.code);return this.materialCache.delete(e),this}getVertexShaderID(e){return this._getShaderStage(e.vertexShader).id}getFragmentShaderID(e){return this._getShaderStage(e.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(e){const t=this.materialCache;let n=t.get(e);return n===void 0&&(n=new Set,t.set(e,n)),n}_getShaderStage(e){const t=this.shaderCache;let n=t.get(e);return n===void 0&&(n=new P_(e),t.set(e,n)),n}}class P_{constructor(e){this.id=A_++,this.code=e,this.usedTimes=0}}function R_(s,e,t,n,i,r,o){const a=new Jc,l=new C_,c=new Set,h=[],u=i.logarithmicDepthBuffer,d=i.vertexTextures;let f=i.precision;const p={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function g(_){return c.add(_),_===0?"uv":`uv${_}`}function x(_,S,D,C,B){const w=C.fog,F=B.geometry,W=_.isMeshStandardMaterial?C.environment:null,j=(_.isMeshStandardMaterial?t:e).get(_.envMap||W),$=j&&j.mapping===Xo?j.image.height:null,Z=p[_.type];_.precision!==null&&(f=i.getMaxPrecision(_.precision),f!==_.precision&&He("WebGLProgram.getParameters:",_.precision,"not supported, using",f,"instead."));const re=F.morphAttributes.position||F.morphAttributes.normal||F.morphAttributes.color,X=re!==void 0?re.length:0;let Y=0;F.morphAttributes.position!==void 0&&(Y=1),F.morphAttributes.normal!==void 0&&(Y=2),F.morphAttributes.color!==void 0&&(Y=3);let ge,pe,de,ie;if(Z){const pt=li[Z];ge=pt.vertexShader,pe=pt.fragmentShader}else ge=_.vertexShader,pe=_.fragmentShader,l.update(_),de=l.getVertexShaderID(_),ie=l.getFragmentShaderID(_);const he=s.getRenderTarget(),fe=s.state.buffers.depth.getReversed(),ve=B.isInstancedMesh===!0,we=B.isBatchedMesh===!0,Be=!!_.map,Je=!!_.matcap,Ne=!!j,T=!!_.aoMap,I=!!_.lightMap,V=!!_.bumpMap,U=!!_.normalMap,k=!!_.displacementMap,z=!!_.emissiveMap,ee=!!_.metalnessMap,J=!!_.roughnessMap,G=_.anisotropy>0,N=_.clearcoat>0,L=_.dispersion>0,H=_.iridescence>0,K=_.sheen>0,le=_.transmission>0,te=G&&!!_.anisotropyMap,Ae=N&&!!_.clearcoatMap,be=N&&!!_.clearcoatNormalMap,Re=N&&!!_.clearcoatRoughnessMap,De=H&&!!_.iridescenceMap,ue=H&&!!_.iridescenceThicknessMap,ye=K&&!!_.sheenColorMap,Ve=K&&!!_.sheenRoughnessMap,ke=!!_.specularMap,Ce=!!_.specularColorMap,Ge=!!_.specularIntensityMap,q=le&&!!_.transmissionMap,Ee=le&&!!_.thicknessMap,_e=!!_.gradientMap,Me=!!_.alphaMap,xe=_.alphaTest>0,me=!!_.alphaHash,Oe=!!_.extensions;let Ye=Ni;_.toneMapped&&(he===null||he.isXRRenderTarget===!0)&&(Ye=s.toneMapping);const Mt={shaderID:Z,shaderType:_.type,shaderName:_.name,vertexShader:ge,fragmentShader:pe,defines:_.defines,customVertexShaderID:de,customFragmentShaderID:ie,isRawShaderMaterial:_.isRawShaderMaterial===!0,glslVersion:_.glslVersion,precision:f,batching:we,batchingColor:we&&B._colorsTexture!==null,instancing:ve,instancingColor:ve&&B.instanceColor!==null,instancingMorph:ve&&B.morphTexture!==null,supportsVertexTextures:d,outputColorSpace:he===null?s.outputColorSpace:he.isXRRenderTarget===!0?he.texture.colorSpace:Rt,alphaToCoverage:!!_.alphaToCoverage,map:Be,matcap:Je,envMap:Ne,envMapMode:Ne&&j.mapping,envMapCubeUVHeight:$,aoMap:T,lightMap:I,bumpMap:V,normalMap:U,displacementMap:d&&k,emissiveMap:z,normalMapObjectSpace:U&&_.normalMapType===Cg,normalMapTangentSpace:U&&_.normalMapType===Zr,metalnessMap:ee,roughnessMap:J,anisotropy:G,anisotropyMap:te,clearcoat:N,clearcoatMap:Ae,clearcoatNormalMap:be,clearcoatRoughnessMap:Re,dispersion:L,iridescence:H,iridescenceMap:De,iridescenceThicknessMap:ue,sheen:K,sheenColorMap:ye,sheenRoughnessMap:Ve,specularMap:ke,specularColorMap:Ce,specularIntensityMap:Ge,transmission:le,transmissionMap:q,thicknessMap:Ee,gradientMap:_e,opaque:_.transparent===!1&&_.blending===ks&&_.alphaToCoverage===!1,alphaMap:Me,alphaTest:xe,alphaHash:me,combine:_.combine,mapUv:Be&&g(_.map.channel),aoMapUv:T&&g(_.aoMap.channel),lightMapUv:I&&g(_.lightMap.channel),bumpMapUv:V&&g(_.bumpMap.channel),normalMapUv:U&&g(_.normalMap.channel),displacementMapUv:k&&g(_.displacementMap.channel),emissiveMapUv:z&&g(_.emissiveMap.channel),metalnessMapUv:ee&&g(_.metalnessMap.channel),roughnessMapUv:J&&g(_.roughnessMap.channel),anisotropyMapUv:te&&g(_.anisotropyMap.channel),clearcoatMapUv:Ae&&g(_.clearcoatMap.channel),clearcoatNormalMapUv:be&&g(_.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:Re&&g(_.clearcoatRoughnessMap.channel),iridescenceMapUv:De&&g(_.iridescenceMap.channel),iridescenceThicknessMapUv:ue&&g(_.iridescenceThicknessMap.channel),sheenColorMapUv:ye&&g(_.sheenColorMap.channel),sheenRoughnessMapUv:Ve&&g(_.sheenRoughnessMap.channel),specularMapUv:ke&&g(_.specularMap.channel),specularColorMapUv:Ce&&g(_.specularColorMap.channel),specularIntensityMapUv:Ge&&g(_.specularIntensityMap.channel),transmissionMapUv:q&&g(_.transmissionMap.channel),thicknessMapUv:Ee&&g(_.thicknessMap.channel),alphaMapUv:Me&&g(_.alphaMap.channel),vertexTangents:!!F.attributes.tangent&&(U||G),vertexColors:_.vertexColors,vertexAlphas:_.vertexColors===!0&&!!F.attributes.color&&F.attributes.color.itemSize===4,pointsUvs:B.isPoints===!0&&!!F.attributes.uv&&(Be||Me),fog:!!w,useFog:_.fog===!0,fogExp2:!!w&&w.isFogExp2,flatShading:_.flatShading===!0&&_.wireframe===!1,sizeAttenuation:_.sizeAttenuation===!0,logarithmicDepthBuffer:u,reversedDepthBuffer:fe,skinning:B.isSkinnedMesh===!0,morphTargets:F.morphAttributes.position!==void 0,morphNormals:F.morphAttributes.normal!==void 0,morphColors:F.morphAttributes.color!==void 0,morphTargetsCount:X,morphTextureStride:Y,numDirLights:S.directional.length,numPointLights:S.point.length,numSpotLights:S.spot.length,numSpotLightMaps:S.spotLightMap.length,numRectAreaLights:S.rectArea.length,numHemiLights:S.hemi.length,numDirLightShadows:S.directionalShadowMap.length,numPointLightShadows:S.pointShadowMap.length,numSpotLightShadows:S.spotShadowMap.length,numSpotLightShadowsWithMaps:S.numSpotLightShadowsWithMaps,numLightProbes:S.numLightProbes,numClippingPlanes:o.numPlanes,numClipIntersection:o.numIntersection,dithering:_.dithering,shadowMapEnabled:s.shadowMap.enabled&&D.length>0,shadowMapType:s.shadowMap.type,toneMapping:Ye,decodeVideoTexture:Be&&_.map.isVideoTexture===!0&&it.getTransfer(_.map.colorSpace)===lt,decodeVideoTextureEmissive:z&&_.emissiveMap.isVideoTexture===!0&&it.getTransfer(_.emissiveMap.colorSpace)===lt,premultipliedAlpha:_.premultipliedAlpha,doubleSided:_.side===Et,flipSided:_.side===on,useDepthPacking:_.depthPacking>=0,depthPacking:_.depthPacking||0,index0AttributeName:_.index0AttributeName,extensionClipCullDistance:Oe&&_.extensions.clipCullDistance===!0&&n.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Oe&&_.extensions.multiDraw===!0||we)&&n.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:n.has("KHR_parallel_shader_compile"),customProgramCacheKey:_.customProgramCacheKey()};return Mt.vertexUv1s=c.has(1),Mt.vertexUv2s=c.has(2),Mt.vertexUv3s=c.has(3),c.clear(),Mt}function m(_){const S=[];if(_.shaderID?S.push(_.shaderID):(S.push(_.customVertexShaderID),S.push(_.customFragmentShaderID)),_.defines!==void 0)for(const D in _.defines)S.push(D),S.push(_.defines[D]);return _.isRawShaderMaterial===!1&&(b(S,_),v(S,_),S.push(s.outputColorSpace)),S.push(_.customProgramCacheKey),S.join()}function b(_,S){_.push(S.precision),_.push(S.outputColorSpace),_.push(S.envMapMode),_.push(S.envMapCubeUVHeight),_.push(S.mapUv),_.push(S.alphaMapUv),_.push(S.lightMapUv),_.push(S.aoMapUv),_.push(S.bumpMapUv),_.push(S.normalMapUv),_.push(S.displacementMapUv),_.push(S.emissiveMapUv),_.push(S.metalnessMapUv),_.push(S.roughnessMapUv),_.push(S.anisotropyMapUv),_.push(S.clearcoatMapUv),_.push(S.clearcoatNormalMapUv),_.push(S.clearcoatRoughnessMapUv),_.push(S.iridescenceMapUv),_.push(S.iridescenceThicknessMapUv),_.push(S.sheenColorMapUv),_.push(S.sheenRoughnessMapUv),_.push(S.specularMapUv),_.push(S.specularColorMapUv),_.push(S.specularIntensityMapUv),_.push(S.transmissionMapUv),_.push(S.thicknessMapUv),_.push(S.combine),_.push(S.fogExp2),_.push(S.sizeAttenuation),_.push(S.morphTargetsCount),_.push(S.morphAttributeCount),_.push(S.numDirLights),_.push(S.numPointLights),_.push(S.numSpotLights),_.push(S.numSpotLightMaps),_.push(S.numHemiLights),_.push(S.numRectAreaLights),_.push(S.numDirLightShadows),_.push(S.numPointLightShadows),_.push(S.numSpotLightShadows),_.push(S.numSpotLightShadowsWithMaps),_.push(S.numLightProbes),_.push(S.shadowMapType),_.push(S.toneMapping),_.push(S.numClippingPlanes),_.push(S.numClipIntersection),_.push(S.depthPacking)}function v(_,S){a.disableAll(),S.supportsVertexTextures&&a.enable(0),S.instancing&&a.enable(1),S.instancingColor&&a.enable(2),S.instancingMorph&&a.enable(3),S.matcap&&a.enable(4),S.envMap&&a.enable(5),S.normalMapObjectSpace&&a.enable(6),S.normalMapTangentSpace&&a.enable(7),S.clearcoat&&a.enable(8),S.iridescence&&a.enable(9),S.alphaTest&&a.enable(10),S.vertexColors&&a.enable(11),S.vertexAlphas&&a.enable(12),S.vertexUv1s&&a.enable(13),S.vertexUv2s&&a.enable(14),S.vertexUv3s&&a.enable(15),S.vertexTangents&&a.enable(16),S.anisotropy&&a.enable(17),S.alphaHash&&a.enable(18),S.batching&&a.enable(19),S.dispersion&&a.enable(20),S.batchingColor&&a.enable(21),S.gradientMap&&a.enable(22),_.push(a.mask),a.disableAll(),S.fog&&a.enable(0),S.useFog&&a.enable(1),S.flatShading&&a.enable(2),S.logarithmicDepthBuffer&&a.enable(3),S.reversedDepthBuffer&&a.enable(4),S.skinning&&a.enable(5),S.morphTargets&&a.enable(6),S.morphNormals&&a.enable(7),S.morphColors&&a.enable(8),S.premultipliedAlpha&&a.enable(9),S.shadowMapEnabled&&a.enable(10),S.doubleSided&&a.enable(11),S.flipSided&&a.enable(12),S.useDepthPacking&&a.enable(13),S.dithering&&a.enable(14),S.transmission&&a.enable(15),S.sheen&&a.enable(16),S.opaque&&a.enable(17),S.pointsUvs&&a.enable(18),S.decodeVideoTexture&&a.enable(19),S.decodeVideoTextureEmissive&&a.enable(20),S.alphaToCoverage&&a.enable(21),_.push(a.mask)}function y(_){const S=p[_.type];let D;if(S){const C=li[S];D=oi.clone(C.uniforms)}else D=_.uniforms;return D}function M(_,S){let D;for(let C=0,B=h.length;C0?n.push(m):f.transparent===!0?i.push(m):t.push(m)}function l(u,d,f,p,g,x){const m=o(u,d,f,p,g,x);f.transmission>0?n.unshift(m):f.transparent===!0?i.unshift(m):t.unshift(m)}function c(u,d){t.length>1&&t.sort(u||D_),n.length>1&&n.sort(d||Cp),i.length>1&&i.sort(d||Cp)}function h(){for(let u=e,d=s.length;u=r.length?(o=new Pp,r.push(o)):o=r[i],o}function t(){s=new WeakMap}return{get:e,dispose:t}}function B_(){const s={};return{get:function(e){if(s[e.id]!==void 0)return s[e.id];let t;switch(e.type){case"DirectionalLight":t={direction:new P,color:new Ue};break;case"SpotLight":t={position:new P,direction:new P,color:new Ue,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":t={position:new P,color:new Ue,distance:0,decay:0};break;case"HemisphereLight":t={direction:new P,skyColor:new Ue,groundColor:new Ue};break;case"RectAreaLight":t={color:new Ue,position:new P,halfWidth:new P,halfHeight:new P};break}return s[e.id]=t,t}}}function N_(){const s={};return{get:function(e){if(s[e.id]!==void 0)return s[e.id];let t;switch(e.type){case"DirectionalLight":t={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new ce};break;case"SpotLight":t={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new ce};break;case"PointLight":t={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new ce,shadowCameraNear:1,shadowCameraFar:1e3};break}return s[e.id]=t,t}}}let k_=0;function U_(s,e){return(e.castShadow?2:0)-(s.castShadow?2:0)+(e.map?1:0)-(s.map?1:0)}function O_(s){const e=new B_,t=N_(),n={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let c=0;c<9;c++)n.probe.push(new P);const i=new P,r=new ze,o=new ze;function a(c){let h=0,u=0,d=0;for(let _=0;_<9;_++)n.probe[_].set(0,0,0);let f=0,p=0,g=0,x=0,m=0,b=0,v=0,y=0,M=0,E=0,A=0;c.sort(U_);for(let _=0,S=c.length;_0&&(s.has("OES_texture_float_linear")===!0?(n.rectAreaLTC1=Pe.LTC_FLOAT_1,n.rectAreaLTC2=Pe.LTC_FLOAT_2):(n.rectAreaLTC1=Pe.LTC_HALF_1,n.rectAreaLTC2=Pe.LTC_HALF_2)),n.ambient[0]=h,n.ambient[1]=u,n.ambient[2]=d;const R=n.hash;(R.directionalLength!==f||R.pointLength!==p||R.spotLength!==g||R.rectAreaLength!==x||R.hemiLength!==m||R.numDirectionalShadows!==b||R.numPointShadows!==v||R.numSpotShadows!==y||R.numSpotMaps!==M||R.numLightProbes!==A)&&(n.directional.length=f,n.spot.length=g,n.rectArea.length=x,n.point.length=p,n.hemi.length=m,n.directionalShadow.length=b,n.directionalShadowMap.length=b,n.pointShadow.length=v,n.pointShadowMap.length=v,n.spotShadow.length=y,n.spotShadowMap.length=y,n.directionalShadowMatrix.length=b,n.pointShadowMatrix.length=v,n.spotLightMatrix.length=y+M-E,n.spotLightMap.length=M,n.numSpotLightShadowsWithMaps=E,n.numLightProbes=A,R.directionalLength=f,R.pointLength=p,R.spotLength=g,R.rectAreaLength=x,R.hemiLength=m,R.numDirectionalShadows=b,R.numPointShadows=v,R.numSpotShadows=y,R.numSpotMaps=M,R.numLightProbes=A,n.version=k_++)}function l(c,h){let u=0,d=0,f=0,p=0,g=0;const x=h.matrixWorldInverse;for(let m=0,b=c.length;m=o.length?(a=new Rp(s),o.push(a)):a=o[r],a}function n(){e=new WeakMap}return{get:t,dispose:n}}const z_=`void main() { gl_Position = vec4( position, 1.0 ); -}`,V_=`uniform sampler2D shadow_pass; +}`,H_=`uniform sampler2D shadow_pass; uniform vec2 resolution; uniform float radius; #include @@ -3926,12 +3926,12 @@ void main() { squared_mean = squared_mean / samples; float std_dev = sqrt( squared_mean - mean * mean ); gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) ); -}`;function G_(s,e,t){let n=new vh;const i=new ce,r=new ce,o=new tt,a=new gv({depthPacking:Cg}),l=new xv,c={},h=t.maxTextureSize,u={[Pn]:on,[on]:Pn,[Et]:Et},d=new kt({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new ce},radius:{value:4}},vertexShader:H_,fragmentShader:V_}),f=d.clone();f.defines.HORIZONTAL_PASS=1;const p=new ht;p.setAttribute("position",new at(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const g=new ut(p,d),x=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=ld;let m=this.type;this.render=function(E,A,R){if(x.enabled===!1||x.autoUpdate===!1&&x.needsUpdate===!1||E.length===0)return;const _=s.getRenderTarget(),S=s.getActiveCubeFace(),D=s.getActiveMipmapLevel(),C=s.state;C.setBlending(Wt),C.buffers.depth.getReversed()===!0?C.buffers.color.setClear(0,0,0,0):C.buffers.color.setClear(1,1,1,1),C.buffers.depth.setTest(!0),C.setScissorTest(!1);const B=m!==mi&&this.type===mi,w=m===mi&&this.type!==mi;for(let F=0,W=E.length;Fh||i.y>h)&&(i.x>h&&(r.x=Math.floor(h/Z.x),i.x=r.x*Z.x,$.mapSize.x=r.x),i.y>h&&(r.y=Math.floor(h/Z.y),i.y=r.y*Z.y,$.mapSize.y=r.y)),$.map===null||B===!0||w===!0){const X=this.type!==mi?{minFilter:Kt,magFilter:Kt}:{};$.map!==null&&$.map.dispose(),$.map=new pn(i.x,i.y,X),$.map.texture.name=j.name+".shadowMap",$.camera.updateProjectionMatrix()}s.setRenderTarget($.map),s.clear();const re=$.getViewportCount();for(let X=0;X0||A.map&&A.alphaTest>0||A.alphaToCoverage===!0){const C=S.uuid,B=A.uuid;let w=c[C];w===void 0&&(w={},c[C]=w);let F=w[B];F===void 0&&(F=S.clone(),w[B]=F,A.addEventListener("dispose",M)),S=F}if(S.visible=A.visible,S.wireframe=A.wireframe,_===mi?S.side=A.shadowSide!==null?A.shadowSide:A.side:S.side=A.shadowSide!==null?A.shadowSide:u[A.side],S.alphaMap=A.alphaMap,S.alphaTest=A.alphaToCoverage===!0?.5:A.alphaTest,S.map=A.map,S.clipShadows=A.clipShadows,S.clippingPlanes=A.clippingPlanes,S.clipIntersection=A.clipIntersection,S.displacementMap=A.displacementMap,S.displacementScale=A.displacementScale,S.displacementBias=A.displacementBias,S.wireframeLinewidth=A.wireframeLinewidth,S.linewidth=A.linewidth,R.isPointLight===!0&&S.isMeshDistanceMaterial===!0){const C=s.properties.get(S);C.light=R}return S}function y(E,A,R,_,S){if(E.visible===!1)return;if(E.layers.test(A.layers)&&(E.isMesh||E.isLine||E.isPoints)&&(E.castShadow||E.receiveShadow&&S===mi)&&(!E.frustumCulled||n.intersectsObject(E))){E.modelViewMatrix.multiplyMatrices(R.matrixWorldInverse,E.matrixWorld);const B=e.update(E),w=E.material;if(Array.isArray(w)){const F=B.groups;for(let W=0,j=F.length;W=1):$.indexOf("OpenGL ES")!==-1&&(j=parseFloat(/^OpenGL ES (\d)/.exec($)[1]),W=j>=2);let Z=null,re={};const X=s.getParameter(s.SCISSOR_BOX),Y=s.getParameter(s.VIEWPORT),ge=new tt().fromArray(X),pe=new tt().fromArray(Y);function de(q,Ee,_e,Me){const xe=new Uint8Array(4),me=s.createTexture();s.bindTexture(q,me),s.texParameteri(q,s.TEXTURE_MIN_FILTER,s.NEAREST),s.texParameteri(q,s.TEXTURE_MAG_FILTER,s.NEAREST);for(let Oe=0;Oe<_e;Oe++)q===s.TEXTURE_3D||q===s.TEXTURE_2D_ARRAY?s.texImage3D(Ee,0,s.RGBA,1,1,Me,0,s.RGBA,s.UNSIGNED_BYTE,xe):s.texImage2D(Ee+Oe,0,s.RGBA,1,1,0,s.RGBA,s.UNSIGNED_BYTE,xe);return me}const ie={};ie[s.TEXTURE_2D]=de(s.TEXTURE_2D,s.TEXTURE_2D,1),ie[s.TEXTURE_CUBE_MAP]=de(s.TEXTURE_CUBE_MAP,s.TEXTURE_CUBE_MAP_POSITIVE_X,6),ie[s.TEXTURE_2D_ARRAY]=de(s.TEXTURE_2D_ARRAY,s.TEXTURE_2D_ARRAY,1,1),ie[s.TEXTURE_3D]=de(s.TEXTURE_3D,s.TEXTURE_3D,1,1),r.setClear(0,0,0,1),o.setClear(1),a.setClear(0),he(s.DEPTH_TEST),o.setFunc(Us),V(!1),U(ad),he(s.CULL_FACE),T(Wt);function he(q){h[q]!==!0&&(s.enable(q),h[q]=!0)}function fe(q){h[q]!==!1&&(s.disable(q),h[q]=!1)}function ve(q,Ee){return u[q]!==Ee?(s.bindFramebuffer(q,Ee),u[q]=Ee,q===s.DRAW_FRAMEBUFFER&&(u[s.FRAMEBUFFER]=Ee),q===s.FRAMEBUFFER&&(u[s.DRAW_FRAMEBUFFER]=Ee),!0):!1}function we(q,Ee){let _e=f,Me=!1;if(q){_e=d.get(Ee),_e===void 0&&(_e=[],d.set(Ee,_e));const xe=q.textures;if(_e.length!==xe.length||_e[0]!==s.COLOR_ATTACHMENT0){for(let me=0,Oe=xe.length;me"u"?!1:/OculusBrowser/g.test(navigator.userAgent),c=new ce,h=new WeakMap;let u;const d=new WeakMap;let f=!1;try{f=typeof OffscreenCanvas<"u"&&new OffscreenCanvas(1,1).getContext("2d")!==null}catch{}function p(N,L){return f?new OffscreenCanvas(N,L):Yr("canvas")}function g(N,L,H){let K=1;const le=G(N);if((le.width>H||le.height>H)&&(K=H/Math.max(le.width,le.height)),K<1)if(typeof HTMLImageElement<"u"&&N instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&N instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&N instanceof ImageBitmap||typeof VideoFrame<"u"&&N instanceof VideoFrame){const te=Math.floor(K*le.width),Te=Math.floor(K*le.height);u===void 0&&(u=p(te,Te));const be=L?p(te,Te):u;return be.width=te,be.height=Te,be.getContext("2d").drawImage(N,0,0,te,Te),He("WebGLRenderer: Texture has been resized from ("+le.width+"x"+le.height+") to ("+te+"x"+Te+")."),be}else return"data"in N&&He("WebGLRenderer: Image in DataTexture is too big ("+le.width+"x"+le.height+")."),N;return N}function x(N){return N.generateMipmaps}function m(N){s.generateMipmap(N)}function b(N){return N.isWebGLCubeRenderTarget?s.TEXTURE_CUBE_MAP:N.isWebGL3DRenderTarget?s.TEXTURE_3D:N.isWebGLArrayRenderTarget||N.isCompressedArrayTexture?s.TEXTURE_2D_ARRAY:s.TEXTURE_2D}function v(N,L,H,K,le=!1){if(N!==null){if(s[N]!==void 0)return s[N];He("WebGLRenderer: Attempt to use non-existing WebGL internal format '"+N+"'")}let te=L;if(L===s.RED&&(H===s.FLOAT&&(te=s.R32F),H===s.HALF_FLOAT&&(te=s.R16F),H===s.UNSIGNED_BYTE&&(te=s.R8)),L===s.RED_INTEGER&&(H===s.UNSIGNED_BYTE&&(te=s.R8UI),H===s.UNSIGNED_SHORT&&(te=s.R16UI),H===s.UNSIGNED_INT&&(te=s.R32UI),H===s.BYTE&&(te=s.R8I),H===s.SHORT&&(te=s.R16I),H===s.INT&&(te=s.R32I)),L===s.RG&&(H===s.FLOAT&&(te=s.RG32F),H===s.HALF_FLOAT&&(te=s.RG16F),H===s.UNSIGNED_BYTE&&(te=s.RG8)),L===s.RG_INTEGER&&(H===s.UNSIGNED_BYTE&&(te=s.RG8UI),H===s.UNSIGNED_SHORT&&(te=s.RG16UI),H===s.UNSIGNED_INT&&(te=s.RG32UI),H===s.BYTE&&(te=s.RG8I),H===s.SHORT&&(te=s.RG16I),H===s.INT&&(te=s.RG32I)),L===s.RGB_INTEGER&&(H===s.UNSIGNED_BYTE&&(te=s.RGB8UI),H===s.UNSIGNED_SHORT&&(te=s.RGB16UI),H===s.UNSIGNED_INT&&(te=s.RGB32UI),H===s.BYTE&&(te=s.RGB8I),H===s.SHORT&&(te=s.RGB16I),H===s.INT&&(te=s.RGB32I)),L===s.RGBA_INTEGER&&(H===s.UNSIGNED_BYTE&&(te=s.RGBA8UI),H===s.UNSIGNED_SHORT&&(te=s.RGBA16UI),H===s.UNSIGNED_INT&&(te=s.RGBA32UI),H===s.BYTE&&(te=s.RGBA8I),H===s.SHORT&&(te=s.RGBA16I),H===s.INT&&(te=s.RGBA32I)),L===s.RGB&&(H===s.UNSIGNED_INT_5_9_9_9_REV&&(te=s.RGB9_E5),H===s.UNSIGNED_INT_10F_11F_11F_REV&&(te=s.R11F_G11F_B10F)),L===s.RGBA){const Te=le?Jo:it.getTransfer(K);H===s.FLOAT&&(te=s.RGBA32F),H===s.HALF_FLOAT&&(te=s.RGBA16F),H===s.UNSIGNED_BYTE&&(te=Te===lt?s.SRGB8_ALPHA8:s.RGBA8),H===s.UNSIGNED_SHORT_4_4_4_4&&(te=s.RGBA4),H===s.UNSIGNED_SHORT_5_5_5_1&&(te=s.RGB5_A1)}return(te===s.R16F||te===s.R32F||te===s.RG16F||te===s.RG32F||te===s.RGBA16F||te===s.RGBA32F)&&e.get("EXT_color_buffer_float"),te}function y(N,L){let H;return N?L===null||L===ts||L===zs?H=s.DEPTH24_STENCIL8:L===Xn?H=s.DEPTH32F_STENCIL8:L===Wr&&(H=s.DEPTH24_STENCIL8,He("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):L===null||L===ts||L===zs?H=s.DEPTH_COMPONENT24:L===Xn?H=s.DEPTH_COMPONENT32F:L===Wr&&(H=s.DEPTH_COMPONENT16),H}function M(N,L){return x(N)===!0||N.isFramebufferTexture&&N.minFilter!==Kt&&N.minFilter!==$t?Math.log2(Math.max(L.width,L.height))+1:N.mipmaps!==void 0&&N.mipmaps.length>0?N.mipmaps.length:N.isCompressedTexture&&Array.isArray(N.image)?L.mipmaps.length:1}function E(N){const L=N.target;L.removeEventListener("dispose",E),R(L),L.isVideoTexture&&h.delete(L)}function A(N){const L=N.target;L.removeEventListener("dispose",A),S(L)}function R(N){const L=n.get(N);if(L.__webglInit===void 0)return;const H=N.source,K=d.get(H);if(K){const le=K[L.__cacheKey];le.usedTimes--,le.usedTimes===0&&_(N),Object.keys(K).length===0&&d.delete(H)}n.remove(N)}function _(N){const L=n.get(N);s.deleteTexture(L.__webglTexture);const H=N.source,K=d.get(H);delete K[L.__cacheKey],o.memory.textures--}function S(N){const L=n.get(N);if(N.depthTexture&&(N.depthTexture.dispose(),n.remove(N.depthTexture)),N.isWebGLCubeRenderTarget)for(let K=0;K<6;K++){if(Array.isArray(L.__webglFramebuffer[K]))for(let le=0;le=i.maxTextures&&He("WebGLTextures: Trying to use "+N+" texture units while this GPU supports only "+i.maxTextures),D+=1,N}function w(N){const L=[];return L.push(N.wrapS),L.push(N.wrapT),L.push(N.wrapR||0),L.push(N.magFilter),L.push(N.minFilter),L.push(N.anisotropy),L.push(N.internalFormat),L.push(N.format),L.push(N.type),L.push(N.generateMipmaps),L.push(N.premultiplyAlpha),L.push(N.flipY),L.push(N.unpackAlignment),L.push(N.colorSpace),L.join()}function F(N,L){const H=n.get(N);if(N.isVideoTexture&&ee(N),N.isRenderTargetTexture===!1&&N.isExternalTexture!==!0&&N.version>0&&H.__version!==N.version){const K=N.image;if(K===null)He("WebGLRenderer: Texture marked for update but no image data found.");else if(K.complete===!1)He("WebGLRenderer: Texture marked for update but image is incomplete");else{ie(H,N,L);return}}else N.isExternalTexture&&(H.__webglTexture=N.sourceTexture?N.sourceTexture:null);t.bindTexture(s.TEXTURE_2D,H.__webglTexture,s.TEXTURE0+L)}function W(N,L){const H=n.get(N);if(N.isRenderTargetTexture===!1&&N.version>0&&H.__version!==N.version){ie(H,N,L);return}else N.isExternalTexture&&(H.__webglTexture=N.sourceTexture?N.sourceTexture:null);t.bindTexture(s.TEXTURE_2D_ARRAY,H.__webglTexture,s.TEXTURE0+L)}function j(N,L){const H=n.get(N);if(N.isRenderTargetTexture===!1&&N.version>0&&H.__version!==N.version){ie(H,N,L);return}t.bindTexture(s.TEXTURE_3D,H.__webglTexture,s.TEXTURE0+L)}function $(N,L){const H=n.get(N);if(N.version>0&&H.__version!==N.version){he(H,N,L);return}t.bindTexture(s.TEXTURE_CUBE_MAP,H.__webglTexture,s.TEXTURE0+L)}const Z={[ni]:s.REPEAT,[ii]:s.CLAMP_TO_EDGE,[jo]:s.MIRRORED_REPEAT},re={[Kt]:s.NEAREST,[_d]:s.NEAREST_MIPMAP_NEAREST,[Gr]:s.NEAREST_MIPMAP_LINEAR,[$t]:s.LINEAR,[qo]:s.LINEAR_MIPMAP_NEAREST,[gi]:s.LINEAR_MIPMAP_LINEAR},X={[Rg]:s.NEVER,[kg]:s.ALWAYS,[Lg]:s.LESS,[Id]:s.LEQUAL,[Dg]:s.EQUAL,[Ng]:s.GEQUAL,[Ig]:s.GREATER,[Bg]:s.NOTEQUAL};function Y(N,L){if(L.type===Xn&&e.has("OES_texture_float_linear")===!1&&(L.magFilter===$t||L.magFilter===qo||L.magFilter===Gr||L.magFilter===gi||L.minFilter===$t||L.minFilter===qo||L.minFilter===Gr||L.minFilter===gi)&&He("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),s.texParameteri(N,s.TEXTURE_WRAP_S,Z[L.wrapS]),s.texParameteri(N,s.TEXTURE_WRAP_T,Z[L.wrapT]),(N===s.TEXTURE_3D||N===s.TEXTURE_2D_ARRAY)&&s.texParameteri(N,s.TEXTURE_WRAP_R,Z[L.wrapR]),s.texParameteri(N,s.TEXTURE_MAG_FILTER,re[L.magFilter]),s.texParameteri(N,s.TEXTURE_MIN_FILTER,re[L.minFilter]),L.compareFunction&&(s.texParameteri(N,s.TEXTURE_COMPARE_MODE,s.COMPARE_REF_TO_TEXTURE),s.texParameteri(N,s.TEXTURE_COMPARE_FUNC,X[L.compareFunction])),e.has("EXT_texture_filter_anisotropic")===!0){if(L.magFilter===Kt||L.minFilter!==Gr&&L.minFilter!==gi||L.type===Xn&&e.has("OES_texture_float_linear")===!1)return;if(L.anisotropy>1||n.get(L).__currentAnisotropy){const H=e.get("EXT_texture_filter_anisotropic");s.texParameterf(N,H.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(L.anisotropy,i.getMaxAnisotropy())),n.get(L).__currentAnisotropy=L.anisotropy}}}function ge(N,L){let H=!1;N.__webglInit===void 0&&(N.__webglInit=!0,L.addEventListener("dispose",E));const K=L.source;let le=d.get(K);le===void 0&&(le={},d.set(K,le));const te=w(L);if(te!==N.__cacheKey){le[te]===void 0&&(le[te]={texture:s.createTexture(),usedTimes:0},o.memory.textures++,H=!0),le[te].usedTimes++;const Te=le[N.__cacheKey];Te!==void 0&&(le[N.__cacheKey].usedTimes--,Te.usedTimes===0&&_(L)),N.__cacheKey=te,N.__webglTexture=le[te].texture}return H}function pe(N,L,H){return Math.floor(Math.floor(N/H)/L)}function de(N,L,H,K){const te=N.updateRanges;if(te.length===0)t.texSubImage2D(s.TEXTURE_2D,0,0,0,L.width,L.height,H,K,L.data);else{te.sort((ue,ye)=>ue.start-ye.start);let Te=0;for(let ue=1;ue0){q&&Ee&&t.texStorage2D(s.TEXTURE_2D,Me,ke,Ge[0].width,Ge[0].height);for(let xe=0,me=Ge.length;xe0){const Oe=ip(Ae.width,Ae.height,L.format,L.type);for(const Ye of L.layerUpdates){const wt=Ae.data.subarray(Ye*Oe/Ae.data.BYTES_PER_ELEMENT,(Ye+1)*Oe/Ae.data.BYTES_PER_ELEMENT);t.compressedTexSubImage3D(s.TEXTURE_2D_ARRAY,xe,0,0,Ye,Ae.width,Ae.height,1,ye,wt)}L.clearLayerUpdates()}else t.compressedTexSubImage3D(s.TEXTURE_2D_ARRAY,xe,0,0,0,Ae.width,Ae.height,ue.depth,ye,Ae.data)}else t.compressedTexImage3D(s.TEXTURE_2D_ARRAY,xe,ke,Ae.width,Ae.height,ue.depth,0,Ae.data,0,0);else He("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else q?_e&&t.texSubImage3D(s.TEXTURE_2D_ARRAY,xe,0,0,0,Ae.width,Ae.height,ue.depth,ye,Ve,Ae.data):t.texImage3D(s.TEXTURE_2D_ARRAY,xe,ke,Ae.width,Ae.height,ue.depth,0,ye,Ve,Ae.data)}else{q&&Ee&&t.texStorage2D(s.TEXTURE_2D,Me,ke,Ge[0].width,Ge[0].height);for(let xe=0,me=Ge.length;xe0){const xe=ip(ue.width,ue.height,L.format,L.type);for(const me of L.layerUpdates){const Oe=ue.data.subarray(me*xe/ue.data.BYTES_PER_ELEMENT,(me+1)*xe/ue.data.BYTES_PER_ELEMENT);t.texSubImage3D(s.TEXTURE_2D_ARRAY,0,0,0,me,ue.width,ue.height,1,ye,Ve,Oe)}L.clearLayerUpdates()}else t.texSubImage3D(s.TEXTURE_2D_ARRAY,0,0,0,0,ue.width,ue.height,ue.depth,ye,Ve,ue.data)}else t.texImage3D(s.TEXTURE_2D_ARRAY,0,ke,ue.width,ue.height,ue.depth,0,ye,Ve,ue.data);else if(L.isData3DTexture)q?(Ee&&t.texStorage3D(s.TEXTURE_3D,Me,ke,ue.width,ue.height,ue.depth),_e&&t.texSubImage3D(s.TEXTURE_3D,0,0,0,0,ue.width,ue.height,ue.depth,ye,Ve,ue.data)):t.texImage3D(s.TEXTURE_3D,0,ke,ue.width,ue.height,ue.depth,0,ye,Ve,ue.data);else if(L.isFramebufferTexture){if(Ee)if(q)t.texStorage2D(s.TEXTURE_2D,Me,ke,ue.width,ue.height);else{let xe=ue.width,me=ue.height;for(let Oe=0;Oe>=1,me>>=1}}else if(Ge.length>0){if(q&&Ee){const xe=G(Ge[0]);t.texStorage2D(s.TEXTURE_2D,Me,ke,xe.width,xe.height)}for(let xe=0,me=Ge.length;xe0&&Me++;const me=G(ye[0]);t.texStorage2D(s.TEXTURE_CUBE_MAP,Me,Ge,me.width,me.height)}for(let me=0;me<6;me++)if(ue){q?_e&&t.texSubImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X+me,0,0,0,ye[me].width,ye[me].height,ke,Ae,ye[me].data):t.texImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X+me,0,Ge,ye[me].width,ye[me].height,0,ke,Ae,ye[me].data);for(let Oe=0;Oe>te),Ve=Math.max(1,L.height>>te);le===s.TEXTURE_3D||le===s.TEXTURE_2D_ARRAY?t.texImage3D(le,te,Re,ye,Ve,L.depth,0,Te,be,null):t.texImage2D(le,te,Re,ye,Ve,0,Te,be,null)}t.bindFramebuffer(s.FRAMEBUFFER,N),z(L)?a.framebufferTexture2DMultisampleEXT(s.FRAMEBUFFER,K,le,ue.__webglTexture,0,k(L)):(le===s.TEXTURE_2D||le>=s.TEXTURE_CUBE_MAP_POSITIVE_X&&le<=s.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&s.framebufferTexture2D(s.FRAMEBUFFER,K,le,ue.__webglTexture,te),t.bindFramebuffer(s.FRAMEBUFFER,null)}function ve(N,L,H){if(s.bindRenderbuffer(s.RENDERBUFFER,N),L.depthBuffer){const K=L.depthTexture,le=K&&K.isDepthTexture?K.type:null,te=y(L.stencilBuffer,le),Te=L.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,be=k(L);z(L)?a.renderbufferStorageMultisampleEXT(s.RENDERBUFFER,be,te,L.width,L.height):H?s.renderbufferStorageMultisample(s.RENDERBUFFER,be,te,L.width,L.height):s.renderbufferStorage(s.RENDERBUFFER,te,L.width,L.height),s.framebufferRenderbuffer(s.FRAMEBUFFER,Te,s.RENDERBUFFER,N)}else{const K=L.textures;for(let le=0;le{delete L.__boundDepthTexture,delete L.__depthDisposeCallback,K.removeEventListener("dispose",le)};K.addEventListener("dispose",le),L.__depthDisposeCallback=le}L.__boundDepthTexture=K}if(N.depthTexture&&!L.__autoAllocateDepthBuffer){if(H)throw new Error("target.depthTexture not supported in Cube render targets");const K=N.texture.mipmaps;K&&K.length>0?we(L.__webglFramebuffer[0],N):we(L.__webglFramebuffer,N)}else if(H){L.__webglDepthbuffer=[];for(let K=0;K<6;K++)if(t.bindFramebuffer(s.FRAMEBUFFER,L.__webglFramebuffer[K]),L.__webglDepthbuffer[K]===void 0)L.__webglDepthbuffer[K]=s.createRenderbuffer(),ve(L.__webglDepthbuffer[K],N,!1);else{const le=N.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,te=L.__webglDepthbuffer[K];s.bindRenderbuffer(s.RENDERBUFFER,te),s.framebufferRenderbuffer(s.FRAMEBUFFER,le,s.RENDERBUFFER,te)}}else{const K=N.texture.mipmaps;if(K&&K.length>0?t.bindFramebuffer(s.FRAMEBUFFER,L.__webglFramebuffer[0]):t.bindFramebuffer(s.FRAMEBUFFER,L.__webglFramebuffer),L.__webglDepthbuffer===void 0)L.__webglDepthbuffer=s.createRenderbuffer(),ve(L.__webglDepthbuffer,N,!1);else{const le=N.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,te=L.__webglDepthbuffer;s.bindRenderbuffer(s.RENDERBUFFER,te),s.framebufferRenderbuffer(s.FRAMEBUFFER,le,s.RENDERBUFFER,te)}}t.bindFramebuffer(s.FRAMEBUFFER,null)}function Je(N,L,H){const K=n.get(N);L!==void 0&&fe(K.__webglFramebuffer,N,N.texture,s.COLOR_ATTACHMENT0,s.TEXTURE_2D,0),H!==void 0&&Be(N)}function Ne(N){const L=N.texture,H=n.get(N),K=n.get(L);N.addEventListener("dispose",A);const le=N.textures,te=N.isWebGLCubeRenderTarget===!0,Te=le.length>1;if(Te||(K.__webglTexture===void 0&&(K.__webglTexture=s.createTexture()),K.__version=L.version,o.memory.textures++),te){H.__webglFramebuffer=[];for(let be=0;be<6;be++)if(L.mipmaps&&L.mipmaps.length>0){H.__webglFramebuffer[be]=[];for(let Re=0;Re0){H.__webglFramebuffer=[];for(let be=0;be0&&z(N)===!1){H.__webglMultisampledFramebuffer=s.createFramebuffer(),H.__webglColorRenderbuffer=[],t.bindFramebuffer(s.FRAMEBUFFER,H.__webglMultisampledFramebuffer);for(let be=0;be0)for(let Re=0;Re0)for(let Re=0;Re0){if(z(N)===!1){const L=N.textures,H=N.width,K=N.height;let le=s.COLOR_BUFFER_BIT;const te=N.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,Te=n.get(N),be=L.length>1;if(be)for(let De=0;De0?t.bindFramebuffer(s.DRAW_FRAMEBUFFER,Te.__webglFramebuffer[0]):t.bindFramebuffer(s.DRAW_FRAMEBUFFER,Te.__webglFramebuffer);for(let De=0;De0&&e.has("WEBGL_multisampled_render_to_texture")===!0&&L.__useRenderToTexture!==!1}function ee(N){const L=o.render.frame;h.get(N)!==L&&(h.set(N,L),N.update())}function J(N,L){const H=N.colorSpace,K=N.format,le=N.type;return N.isCompressedTexture===!0||N.isVideoTexture===!0||H!==Rt&&H!==ki&&(it.getTransfer(H)===lt?(K!==fn||le!==Wn)&&He("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):Qe("WebGLTextures: Unsupported texture color space:",H)),L}function G(N){return typeof HTMLImageElement<"u"&&N instanceof HTMLImageElement?(c.width=N.naturalWidth||N.width,c.height=N.naturalHeight||N.height):typeof VideoFrame<"u"&&N instanceof VideoFrame?(c.width=N.displayWidth,c.height=N.displayHeight):(c.width=N.width,c.height=N.height),c}this.allocateTextureUnit=B,this.resetTextureUnits=C,this.setTexture2D=F,this.setTexture2DArray=W,this.setTexture3D=j,this.setTextureCube=$,this.rebindTextures=Je,this.setupRenderTarget=Ne,this.updateRenderTargetMipmap=T,this.updateMultisampleRenderTarget=U,this.setupDepthRenderbuffer=Be,this.setupFrameBufferTexture=fe,this.useMultisampledRTT=z}function q_(s,e){function t(n,i=ki){let r;const o=it.getTransfer(i);if(n===Wn)return s.UNSIGNED_BYTE;if(n===ic)return s.UNSIGNED_SHORT_4_4_4_4;if(n===sc)return s.UNSIGNED_SHORT_5_5_5_1;if(n===Sd)return s.UNSIGNED_INT_5_9_9_9_REV;if(n===Ed)return s.UNSIGNED_INT_10F_11F_11F_REV;if(n===Md)return s.BYTE;if(n===wd)return s.SHORT;if(n===Wr)return s.UNSIGNED_SHORT;if(n===nc)return s.INT;if(n===ts)return s.UNSIGNED_INT;if(n===Xn)return s.FLOAT;if(n===Rn)return s.HALF_FLOAT;if(n===Td)return s.ALPHA;if(n===Ad)return s.RGB;if(n===fn)return s.RGBA;if(n===Xr)return s.DEPTH_COMPONENT;if(n===Hs)return s.DEPTH_STENCIL;if(n===rc)return s.RED;if(n===oc)return s.RED_INTEGER;if(n===ac)return s.RG;if(n===lc)return s.RG_INTEGER;if(n===cc)return s.RGBA_INTEGER;if(n===Zo||n===Yo||n===Ko||n===$o)if(o===lt)if(r=e.get("WEBGL_compressed_texture_s3tc_srgb"),r!==null){if(n===Zo)return r.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===Yo)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===Ko)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===$o)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(r=e.get("WEBGL_compressed_texture_s3tc"),r!==null){if(n===Zo)return r.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===Yo)return r.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===Ko)return r.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===$o)return r.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(n===hc||n===uc||n===dc||n===fc)if(r=e.get("WEBGL_compressed_texture_pvrtc"),r!==null){if(n===hc)return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(n===uc)return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(n===dc)return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(n===fc)return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(n===pc||n===mc||n===gc)if(r=e.get("WEBGL_compressed_texture_etc"),r!==null){if(n===pc||n===mc)return o===lt?r.COMPRESSED_SRGB8_ETC2:r.COMPRESSED_RGB8_ETC2;if(n===gc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:r.COMPRESSED_RGBA8_ETC2_EAC}else return null;if(n===xc||n===vc||n===bc||n===yc||n===_c||n===Mc||n===wc||n===Sc||n===Ec||n===Tc||n===Ac||n===Cc||n===Pc||n===Rc)if(r=e.get("WEBGL_compressed_texture_astc"),r!==null){if(n===xc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:r.COMPRESSED_RGBA_ASTC_4x4_KHR;if(n===vc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:r.COMPRESSED_RGBA_ASTC_5x4_KHR;if(n===bc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:r.COMPRESSED_RGBA_ASTC_5x5_KHR;if(n===yc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:r.COMPRESSED_RGBA_ASTC_6x5_KHR;if(n===_c)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:r.COMPRESSED_RGBA_ASTC_6x6_KHR;if(n===Mc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:r.COMPRESSED_RGBA_ASTC_8x5_KHR;if(n===wc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:r.COMPRESSED_RGBA_ASTC_8x6_KHR;if(n===Sc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:r.COMPRESSED_RGBA_ASTC_8x8_KHR;if(n===Ec)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:r.COMPRESSED_RGBA_ASTC_10x5_KHR;if(n===Tc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:r.COMPRESSED_RGBA_ASTC_10x6_KHR;if(n===Ac)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:r.COMPRESSED_RGBA_ASTC_10x8_KHR;if(n===Cc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:r.COMPRESSED_RGBA_ASTC_10x10_KHR;if(n===Pc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:r.COMPRESSED_RGBA_ASTC_12x10_KHR;if(n===Rc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:r.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(n===Lc||n===Dc||n===Ic)if(r=e.get("EXT_texture_compression_bptc"),r!==null){if(n===Lc)return o===lt?r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:r.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(n===Dc)return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(n===Ic)return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}else return null;if(n===Bc||n===Nc||n===kc||n===Uc)if(r=e.get("EXT_texture_compression_rgtc"),r!==null){if(n===Bc)return r.COMPRESSED_RED_RGTC1_EXT;if(n===Nc)return r.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(n===kc)return r.COMPRESSED_RED_GREEN_RGTC2_EXT;if(n===Uc)return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}else return null;return n===zs?s.UNSIGNED_INT_24_8:s[n]!==void 0?s[n]:null}return{convert:t}}const Z_=` +}`;function V_(s,e,t){let n=new vh;const i=new ce,r=new ce,o=new tt,a=new mv({depthPacking:Ag}),l=new gv,c={},h=t.maxTextureSize,u={[Pn]:on,[on]:Pn,[Et]:Et},d=new kt({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new ce},radius:{value:4}},vertexShader:z_,fragmentShader:H_}),f=d.clone();f.defines.HORIZONTAL_PASS=1;const p=new ht;p.setAttribute("position",new at(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const g=new ut(p,d),x=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=ad;let m=this.type;this.render=function(E,A,R){if(x.enabled===!1||x.autoUpdate===!1&&x.needsUpdate===!1||E.length===0)return;const _=s.getRenderTarget(),S=s.getActiveCubeFace(),D=s.getActiveMipmapLevel(),C=s.state;C.setBlending(Wt),C.buffers.depth.getReversed()===!0?C.buffers.color.setClear(0,0,0,0):C.buffers.color.setClear(1,1,1,1),C.buffers.depth.setTest(!0),C.setScissorTest(!1);const B=m!==mi&&this.type===mi,w=m===mi&&this.type!==mi;for(let F=0,W=E.length;Fh||i.y>h)&&(i.x>h&&(r.x=Math.floor(h/Z.x),i.x=r.x*Z.x,$.mapSize.x=r.x),i.y>h&&(r.y=Math.floor(h/Z.y),i.y=r.y*Z.y,$.mapSize.y=r.y)),$.map===null||B===!0||w===!0){const X=this.type!==mi?{minFilter:Kt,magFilter:Kt}:{};$.map!==null&&$.map.dispose(),$.map=new pn(i.x,i.y,X),$.map.texture.name=j.name+".shadowMap",$.camera.updateProjectionMatrix()}s.setRenderTarget($.map),s.clear();const re=$.getViewportCount();for(let X=0;X0||A.map&&A.alphaTest>0||A.alphaToCoverage===!0){const C=S.uuid,B=A.uuid;let w=c[C];w===void 0&&(w={},c[C]=w);let F=w[B];F===void 0&&(F=S.clone(),w[B]=F,A.addEventListener("dispose",M)),S=F}if(S.visible=A.visible,S.wireframe=A.wireframe,_===mi?S.side=A.shadowSide!==null?A.shadowSide:A.side:S.side=A.shadowSide!==null?A.shadowSide:u[A.side],S.alphaMap=A.alphaMap,S.alphaTest=A.alphaToCoverage===!0?.5:A.alphaTest,S.map=A.map,S.clipShadows=A.clipShadows,S.clippingPlanes=A.clippingPlanes,S.clipIntersection=A.clipIntersection,S.displacementMap=A.displacementMap,S.displacementScale=A.displacementScale,S.displacementBias=A.displacementBias,S.wireframeLinewidth=A.wireframeLinewidth,S.linewidth=A.linewidth,R.isPointLight===!0&&S.isMeshDistanceMaterial===!0){const C=s.properties.get(S);C.light=R}return S}function y(E,A,R,_,S){if(E.visible===!1)return;if(E.layers.test(A.layers)&&(E.isMesh||E.isLine||E.isPoints)&&(E.castShadow||E.receiveShadow&&S===mi)&&(!E.frustumCulled||n.intersectsObject(E))){E.modelViewMatrix.multiplyMatrices(R.matrixWorldInverse,E.matrixWorld);const B=e.update(E),w=E.material;if(Array.isArray(w)){const F=B.groups;for(let W=0,j=F.length;W=1):$.indexOf("OpenGL ES")!==-1&&(j=parseFloat(/^OpenGL ES (\d)/.exec($)[1]),W=j>=2);let Z=null,re={};const X=s.getParameter(s.SCISSOR_BOX),Y=s.getParameter(s.VIEWPORT),ge=new tt().fromArray(X),pe=new tt().fromArray(Y);function de(q,Ee,_e,Me){const xe=new Uint8Array(4),me=s.createTexture();s.bindTexture(q,me),s.texParameteri(q,s.TEXTURE_MIN_FILTER,s.NEAREST),s.texParameteri(q,s.TEXTURE_MAG_FILTER,s.NEAREST);for(let Oe=0;Oe<_e;Oe++)q===s.TEXTURE_3D||q===s.TEXTURE_2D_ARRAY?s.texImage3D(Ee,0,s.RGBA,1,1,Me,0,s.RGBA,s.UNSIGNED_BYTE,xe):s.texImage2D(Ee+Oe,0,s.RGBA,1,1,0,s.RGBA,s.UNSIGNED_BYTE,xe);return me}const ie={};ie[s.TEXTURE_2D]=de(s.TEXTURE_2D,s.TEXTURE_2D,1),ie[s.TEXTURE_CUBE_MAP]=de(s.TEXTURE_CUBE_MAP,s.TEXTURE_CUBE_MAP_POSITIVE_X,6),ie[s.TEXTURE_2D_ARRAY]=de(s.TEXTURE_2D_ARRAY,s.TEXTURE_2D_ARRAY,1,1),ie[s.TEXTURE_3D]=de(s.TEXTURE_3D,s.TEXTURE_3D,1,1),r.setClear(0,0,0,1),o.setClear(1),a.setClear(0),he(s.DEPTH_TEST),o.setFunc(Us),V(!1),U(od),he(s.CULL_FACE),T(Wt);function he(q){h[q]!==!0&&(s.enable(q),h[q]=!0)}function fe(q){h[q]!==!1&&(s.disable(q),h[q]=!1)}function ve(q,Ee){return u[q]!==Ee?(s.bindFramebuffer(q,Ee),u[q]=Ee,q===s.DRAW_FRAMEBUFFER&&(u[s.FRAMEBUFFER]=Ee),q===s.FRAMEBUFFER&&(u[s.DRAW_FRAMEBUFFER]=Ee),!0):!1}function we(q,Ee){let _e=f,Me=!1;if(q){_e=d.get(Ee),_e===void 0&&(_e=[],d.set(Ee,_e));const xe=q.textures;if(_e.length!==xe.length||_e[0]!==s.COLOR_ATTACHMENT0){for(let me=0,Oe=xe.length;me"u"?!1:/OculusBrowser/g.test(navigator.userAgent),c=new ce,h=new WeakMap;let u;const d=new WeakMap;let f=!1;try{f=typeof OffscreenCanvas<"u"&&new OffscreenCanvas(1,1).getContext("2d")!==null}catch{}function p(N,L){return f?new OffscreenCanvas(N,L):Yr("canvas")}function g(N,L,H){let K=1;const le=G(N);if((le.width>H||le.height>H)&&(K=H/Math.max(le.width,le.height)),K<1)if(typeof HTMLImageElement<"u"&&N instanceof HTMLImageElement||typeof HTMLCanvasElement<"u"&&N instanceof HTMLCanvasElement||typeof ImageBitmap<"u"&&N instanceof ImageBitmap||typeof VideoFrame<"u"&&N instanceof VideoFrame){const te=Math.floor(K*le.width),Ae=Math.floor(K*le.height);u===void 0&&(u=p(te,Ae));const be=L?p(te,Ae):u;return be.width=te,be.height=Ae,be.getContext("2d").drawImage(N,0,0,te,Ae),He("WebGLRenderer: Texture has been resized from ("+le.width+"x"+le.height+") to ("+te+"x"+Ae+")."),be}else return"data"in N&&He("WebGLRenderer: Image in DataTexture is too big ("+le.width+"x"+le.height+")."),N;return N}function x(N){return N.generateMipmaps}function m(N){s.generateMipmap(N)}function b(N){return N.isWebGLCubeRenderTarget?s.TEXTURE_CUBE_MAP:N.isWebGL3DRenderTarget?s.TEXTURE_3D:N.isWebGLArrayRenderTarget||N.isCompressedArrayTexture?s.TEXTURE_2D_ARRAY:s.TEXTURE_2D}function v(N,L,H,K,le=!1){if(N!==null){if(s[N]!==void 0)return s[N];He("WebGLRenderer: Attempt to use non-existing WebGL internal format '"+N+"'")}let te=L;if(L===s.RED&&(H===s.FLOAT&&(te=s.R32F),H===s.HALF_FLOAT&&(te=s.R16F),H===s.UNSIGNED_BYTE&&(te=s.R8)),L===s.RED_INTEGER&&(H===s.UNSIGNED_BYTE&&(te=s.R8UI),H===s.UNSIGNED_SHORT&&(te=s.R16UI),H===s.UNSIGNED_INT&&(te=s.R32UI),H===s.BYTE&&(te=s.R8I),H===s.SHORT&&(te=s.R16I),H===s.INT&&(te=s.R32I)),L===s.RG&&(H===s.FLOAT&&(te=s.RG32F),H===s.HALF_FLOAT&&(te=s.RG16F),H===s.UNSIGNED_BYTE&&(te=s.RG8)),L===s.RG_INTEGER&&(H===s.UNSIGNED_BYTE&&(te=s.RG8UI),H===s.UNSIGNED_SHORT&&(te=s.RG16UI),H===s.UNSIGNED_INT&&(te=s.RG32UI),H===s.BYTE&&(te=s.RG8I),H===s.SHORT&&(te=s.RG16I),H===s.INT&&(te=s.RG32I)),L===s.RGB_INTEGER&&(H===s.UNSIGNED_BYTE&&(te=s.RGB8UI),H===s.UNSIGNED_SHORT&&(te=s.RGB16UI),H===s.UNSIGNED_INT&&(te=s.RGB32UI),H===s.BYTE&&(te=s.RGB8I),H===s.SHORT&&(te=s.RGB16I),H===s.INT&&(te=s.RGB32I)),L===s.RGBA_INTEGER&&(H===s.UNSIGNED_BYTE&&(te=s.RGBA8UI),H===s.UNSIGNED_SHORT&&(te=s.RGBA16UI),H===s.UNSIGNED_INT&&(te=s.RGBA32UI),H===s.BYTE&&(te=s.RGBA8I),H===s.SHORT&&(te=s.RGBA16I),H===s.INT&&(te=s.RGBA32I)),L===s.RGB&&(H===s.UNSIGNED_INT_5_9_9_9_REV&&(te=s.RGB9_E5),H===s.UNSIGNED_INT_10F_11F_11F_REV&&(te=s.R11F_G11F_B10F)),L===s.RGBA){const Ae=le?Jo:it.getTransfer(K);H===s.FLOAT&&(te=s.RGBA32F),H===s.HALF_FLOAT&&(te=s.RGBA16F),H===s.UNSIGNED_BYTE&&(te=Ae===lt?s.SRGB8_ALPHA8:s.RGBA8),H===s.UNSIGNED_SHORT_4_4_4_4&&(te=s.RGBA4),H===s.UNSIGNED_SHORT_5_5_5_1&&(te=s.RGB5_A1)}return(te===s.R16F||te===s.R32F||te===s.RG16F||te===s.RG32F||te===s.RGBA16F||te===s.RGBA32F)&&e.get("EXT_color_buffer_float"),te}function y(N,L){let H;return N?L===null||L===ts||L===zs?H=s.DEPTH24_STENCIL8:L===Xn?H=s.DEPTH32F_STENCIL8:L===Wr&&(H=s.DEPTH24_STENCIL8,He("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):L===null||L===ts||L===zs?H=s.DEPTH_COMPONENT24:L===Xn?H=s.DEPTH_COMPONENT32F:L===Wr&&(H=s.DEPTH_COMPONENT16),H}function M(N,L){return x(N)===!0||N.isFramebufferTexture&&N.minFilter!==Kt&&N.minFilter!==$t?Math.log2(Math.max(L.width,L.height))+1:N.mipmaps!==void 0&&N.mipmaps.length>0?N.mipmaps.length:N.isCompressedTexture&&Array.isArray(N.image)?L.mipmaps.length:1}function E(N){const L=N.target;L.removeEventListener("dispose",E),R(L),L.isVideoTexture&&h.delete(L)}function A(N){const L=N.target;L.removeEventListener("dispose",A),S(L)}function R(N){const L=n.get(N);if(L.__webglInit===void 0)return;const H=N.source,K=d.get(H);if(K){const le=K[L.__cacheKey];le.usedTimes--,le.usedTimes===0&&_(N),Object.keys(K).length===0&&d.delete(H)}n.remove(N)}function _(N){const L=n.get(N);s.deleteTexture(L.__webglTexture);const H=N.source,K=d.get(H);delete K[L.__cacheKey],o.memory.textures--}function S(N){const L=n.get(N);if(N.depthTexture&&(N.depthTexture.dispose(),n.remove(N.depthTexture)),N.isWebGLCubeRenderTarget)for(let K=0;K<6;K++){if(Array.isArray(L.__webglFramebuffer[K]))for(let le=0;le=i.maxTextures&&He("WebGLTextures: Trying to use "+N+" texture units while this GPU supports only "+i.maxTextures),D+=1,N}function w(N){const L=[];return L.push(N.wrapS),L.push(N.wrapT),L.push(N.wrapR||0),L.push(N.magFilter),L.push(N.minFilter),L.push(N.anisotropy),L.push(N.internalFormat),L.push(N.format),L.push(N.type),L.push(N.generateMipmaps),L.push(N.premultiplyAlpha),L.push(N.flipY),L.push(N.unpackAlignment),L.push(N.colorSpace),L.join()}function F(N,L){const H=n.get(N);if(N.isVideoTexture&&ee(N),N.isRenderTargetTexture===!1&&N.isExternalTexture!==!0&&N.version>0&&H.__version!==N.version){const K=N.image;if(K===null)He("WebGLRenderer: Texture marked for update but no image data found.");else if(K.complete===!1)He("WebGLRenderer: Texture marked for update but image is incomplete");else{ie(H,N,L);return}}else N.isExternalTexture&&(H.__webglTexture=N.sourceTexture?N.sourceTexture:null);t.bindTexture(s.TEXTURE_2D,H.__webglTexture,s.TEXTURE0+L)}function W(N,L){const H=n.get(N);if(N.isRenderTargetTexture===!1&&N.version>0&&H.__version!==N.version){ie(H,N,L);return}else N.isExternalTexture&&(H.__webglTexture=N.sourceTexture?N.sourceTexture:null);t.bindTexture(s.TEXTURE_2D_ARRAY,H.__webglTexture,s.TEXTURE0+L)}function j(N,L){const H=n.get(N);if(N.isRenderTargetTexture===!1&&N.version>0&&H.__version!==N.version){ie(H,N,L);return}t.bindTexture(s.TEXTURE_3D,H.__webglTexture,s.TEXTURE0+L)}function $(N,L){const H=n.get(N);if(N.version>0&&H.__version!==N.version){he(H,N,L);return}t.bindTexture(s.TEXTURE_CUBE_MAP,H.__webglTexture,s.TEXTURE0+L)}const Z={[ni]:s.REPEAT,[ii]:s.CLAMP_TO_EDGE,[jo]:s.MIRRORED_REPEAT},re={[Kt]:s.NEAREST,[yd]:s.NEAREST_MIPMAP_NEAREST,[Gr]:s.NEAREST_MIPMAP_LINEAR,[$t]:s.LINEAR,[qo]:s.LINEAR_MIPMAP_NEAREST,[gi]:s.LINEAR_MIPMAP_LINEAR},X={[Pg]:s.NEVER,[Ng]:s.ALWAYS,[Rg]:s.LESS,[Dd]:s.LEQUAL,[Lg]:s.EQUAL,[Bg]:s.GEQUAL,[Dg]:s.GREATER,[Ig]:s.NOTEQUAL};function Y(N,L){if(L.type===Xn&&e.has("OES_texture_float_linear")===!1&&(L.magFilter===$t||L.magFilter===qo||L.magFilter===Gr||L.magFilter===gi||L.minFilter===$t||L.minFilter===qo||L.minFilter===Gr||L.minFilter===gi)&&He("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),s.texParameteri(N,s.TEXTURE_WRAP_S,Z[L.wrapS]),s.texParameteri(N,s.TEXTURE_WRAP_T,Z[L.wrapT]),(N===s.TEXTURE_3D||N===s.TEXTURE_2D_ARRAY)&&s.texParameteri(N,s.TEXTURE_WRAP_R,Z[L.wrapR]),s.texParameteri(N,s.TEXTURE_MAG_FILTER,re[L.magFilter]),s.texParameteri(N,s.TEXTURE_MIN_FILTER,re[L.minFilter]),L.compareFunction&&(s.texParameteri(N,s.TEXTURE_COMPARE_MODE,s.COMPARE_REF_TO_TEXTURE),s.texParameteri(N,s.TEXTURE_COMPARE_FUNC,X[L.compareFunction])),e.has("EXT_texture_filter_anisotropic")===!0){if(L.magFilter===Kt||L.minFilter!==Gr&&L.minFilter!==gi||L.type===Xn&&e.has("OES_texture_float_linear")===!1)return;if(L.anisotropy>1||n.get(L).__currentAnisotropy){const H=e.get("EXT_texture_filter_anisotropic");s.texParameterf(N,H.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(L.anisotropy,i.getMaxAnisotropy())),n.get(L).__currentAnisotropy=L.anisotropy}}}function ge(N,L){let H=!1;N.__webglInit===void 0&&(N.__webglInit=!0,L.addEventListener("dispose",E));const K=L.source;let le=d.get(K);le===void 0&&(le={},d.set(K,le));const te=w(L);if(te!==N.__cacheKey){le[te]===void 0&&(le[te]={texture:s.createTexture(),usedTimes:0},o.memory.textures++,H=!0),le[te].usedTimes++;const Ae=le[N.__cacheKey];Ae!==void 0&&(le[N.__cacheKey].usedTimes--,Ae.usedTimes===0&&_(L)),N.__cacheKey=te,N.__webglTexture=le[te].texture}return H}function pe(N,L,H){return Math.floor(Math.floor(N/H)/L)}function de(N,L,H,K){const te=N.updateRanges;if(te.length===0)t.texSubImage2D(s.TEXTURE_2D,0,0,0,L.width,L.height,H,K,L.data);else{te.sort((ue,ye)=>ue.start-ye.start);let Ae=0;for(let ue=1;ue0){q&&Ee&&t.texStorage2D(s.TEXTURE_2D,Me,ke,Ge[0].width,Ge[0].height);for(let xe=0,me=Ge.length;xe0){const Oe=np(Ce.width,Ce.height,L.format,L.type);for(const Ye of L.layerUpdates){const Mt=Ce.data.subarray(Ye*Oe/Ce.data.BYTES_PER_ELEMENT,(Ye+1)*Oe/Ce.data.BYTES_PER_ELEMENT);t.compressedTexSubImage3D(s.TEXTURE_2D_ARRAY,xe,0,0,Ye,Ce.width,Ce.height,1,ye,Mt)}L.clearLayerUpdates()}else t.compressedTexSubImage3D(s.TEXTURE_2D_ARRAY,xe,0,0,0,Ce.width,Ce.height,ue.depth,ye,Ce.data)}else t.compressedTexImage3D(s.TEXTURE_2D_ARRAY,xe,ke,Ce.width,Ce.height,ue.depth,0,Ce.data,0,0);else He("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else q?_e&&t.texSubImage3D(s.TEXTURE_2D_ARRAY,xe,0,0,0,Ce.width,Ce.height,ue.depth,ye,Ve,Ce.data):t.texImage3D(s.TEXTURE_2D_ARRAY,xe,ke,Ce.width,Ce.height,ue.depth,0,ye,Ve,Ce.data)}else{q&&Ee&&t.texStorage2D(s.TEXTURE_2D,Me,ke,Ge[0].width,Ge[0].height);for(let xe=0,me=Ge.length;xe0){const xe=np(ue.width,ue.height,L.format,L.type);for(const me of L.layerUpdates){const Oe=ue.data.subarray(me*xe/ue.data.BYTES_PER_ELEMENT,(me+1)*xe/ue.data.BYTES_PER_ELEMENT);t.texSubImage3D(s.TEXTURE_2D_ARRAY,0,0,0,me,ue.width,ue.height,1,ye,Ve,Oe)}L.clearLayerUpdates()}else t.texSubImage3D(s.TEXTURE_2D_ARRAY,0,0,0,0,ue.width,ue.height,ue.depth,ye,Ve,ue.data)}else t.texImage3D(s.TEXTURE_2D_ARRAY,0,ke,ue.width,ue.height,ue.depth,0,ye,Ve,ue.data);else if(L.isData3DTexture)q?(Ee&&t.texStorage3D(s.TEXTURE_3D,Me,ke,ue.width,ue.height,ue.depth),_e&&t.texSubImage3D(s.TEXTURE_3D,0,0,0,0,ue.width,ue.height,ue.depth,ye,Ve,ue.data)):t.texImage3D(s.TEXTURE_3D,0,ke,ue.width,ue.height,ue.depth,0,ye,Ve,ue.data);else if(L.isFramebufferTexture){if(Ee)if(q)t.texStorage2D(s.TEXTURE_2D,Me,ke,ue.width,ue.height);else{let xe=ue.width,me=ue.height;for(let Oe=0;Oe>=1,me>>=1}}else if(Ge.length>0){if(q&&Ee){const xe=G(Ge[0]);t.texStorage2D(s.TEXTURE_2D,Me,ke,xe.width,xe.height)}for(let xe=0,me=Ge.length;xe0&&Me++;const me=G(ye[0]);t.texStorage2D(s.TEXTURE_CUBE_MAP,Me,Ge,me.width,me.height)}for(let me=0;me<6;me++)if(ue){q?_e&&t.texSubImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X+me,0,0,0,ye[me].width,ye[me].height,ke,Ce,ye[me].data):t.texImage2D(s.TEXTURE_CUBE_MAP_POSITIVE_X+me,0,Ge,ye[me].width,ye[me].height,0,ke,Ce,ye[me].data);for(let Oe=0;Oe>te),Ve=Math.max(1,L.height>>te);le===s.TEXTURE_3D||le===s.TEXTURE_2D_ARRAY?t.texImage3D(le,te,Re,ye,Ve,L.depth,0,Ae,be,null):t.texImage2D(le,te,Re,ye,Ve,0,Ae,be,null)}t.bindFramebuffer(s.FRAMEBUFFER,N),z(L)?a.framebufferTexture2DMultisampleEXT(s.FRAMEBUFFER,K,le,ue.__webglTexture,0,k(L)):(le===s.TEXTURE_2D||le>=s.TEXTURE_CUBE_MAP_POSITIVE_X&&le<=s.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&s.framebufferTexture2D(s.FRAMEBUFFER,K,le,ue.__webglTexture,te),t.bindFramebuffer(s.FRAMEBUFFER,null)}function ve(N,L,H){if(s.bindRenderbuffer(s.RENDERBUFFER,N),L.depthBuffer){const K=L.depthTexture,le=K&&K.isDepthTexture?K.type:null,te=y(L.stencilBuffer,le),Ae=L.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,be=k(L);z(L)?a.renderbufferStorageMultisampleEXT(s.RENDERBUFFER,be,te,L.width,L.height):H?s.renderbufferStorageMultisample(s.RENDERBUFFER,be,te,L.width,L.height):s.renderbufferStorage(s.RENDERBUFFER,te,L.width,L.height),s.framebufferRenderbuffer(s.FRAMEBUFFER,Ae,s.RENDERBUFFER,N)}else{const K=L.textures;for(let le=0;le{delete L.__boundDepthTexture,delete L.__depthDisposeCallback,K.removeEventListener("dispose",le)};K.addEventListener("dispose",le),L.__depthDisposeCallback=le}L.__boundDepthTexture=K}if(N.depthTexture&&!L.__autoAllocateDepthBuffer){if(H)throw new Error("target.depthTexture not supported in Cube render targets");const K=N.texture.mipmaps;K&&K.length>0?we(L.__webglFramebuffer[0],N):we(L.__webglFramebuffer,N)}else if(H){L.__webglDepthbuffer=[];for(let K=0;K<6;K++)if(t.bindFramebuffer(s.FRAMEBUFFER,L.__webglFramebuffer[K]),L.__webglDepthbuffer[K]===void 0)L.__webglDepthbuffer[K]=s.createRenderbuffer(),ve(L.__webglDepthbuffer[K],N,!1);else{const le=N.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,te=L.__webglDepthbuffer[K];s.bindRenderbuffer(s.RENDERBUFFER,te),s.framebufferRenderbuffer(s.FRAMEBUFFER,le,s.RENDERBUFFER,te)}}else{const K=N.texture.mipmaps;if(K&&K.length>0?t.bindFramebuffer(s.FRAMEBUFFER,L.__webglFramebuffer[0]):t.bindFramebuffer(s.FRAMEBUFFER,L.__webglFramebuffer),L.__webglDepthbuffer===void 0)L.__webglDepthbuffer=s.createRenderbuffer(),ve(L.__webglDepthbuffer,N,!1);else{const le=N.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,te=L.__webglDepthbuffer;s.bindRenderbuffer(s.RENDERBUFFER,te),s.framebufferRenderbuffer(s.FRAMEBUFFER,le,s.RENDERBUFFER,te)}}t.bindFramebuffer(s.FRAMEBUFFER,null)}function Je(N,L,H){const K=n.get(N);L!==void 0&&fe(K.__webglFramebuffer,N,N.texture,s.COLOR_ATTACHMENT0,s.TEXTURE_2D,0),H!==void 0&&Be(N)}function Ne(N){const L=N.texture,H=n.get(N),K=n.get(L);N.addEventListener("dispose",A);const le=N.textures,te=N.isWebGLCubeRenderTarget===!0,Ae=le.length>1;if(Ae||(K.__webglTexture===void 0&&(K.__webglTexture=s.createTexture()),K.__version=L.version,o.memory.textures++),te){H.__webglFramebuffer=[];for(let be=0;be<6;be++)if(L.mipmaps&&L.mipmaps.length>0){H.__webglFramebuffer[be]=[];for(let Re=0;Re0){H.__webglFramebuffer=[];for(let be=0;be0&&z(N)===!1){H.__webglMultisampledFramebuffer=s.createFramebuffer(),H.__webglColorRenderbuffer=[],t.bindFramebuffer(s.FRAMEBUFFER,H.__webglMultisampledFramebuffer);for(let be=0;be0)for(let Re=0;Re0)for(let Re=0;Re0){if(z(N)===!1){const L=N.textures,H=N.width,K=N.height;let le=s.COLOR_BUFFER_BIT;const te=N.stencilBuffer?s.DEPTH_STENCIL_ATTACHMENT:s.DEPTH_ATTACHMENT,Ae=n.get(N),be=L.length>1;if(be)for(let De=0;De0?t.bindFramebuffer(s.DRAW_FRAMEBUFFER,Ae.__webglFramebuffer[0]):t.bindFramebuffer(s.DRAW_FRAMEBUFFER,Ae.__webglFramebuffer);for(let De=0;De0&&e.has("WEBGL_multisampled_render_to_texture")===!0&&L.__useRenderToTexture!==!1}function ee(N){const L=o.render.frame;h.get(N)!==L&&(h.set(N,L),N.update())}function J(N,L){const H=N.colorSpace,K=N.format,le=N.type;return N.isCompressedTexture===!0||N.isVideoTexture===!0||H!==Rt&&H!==ki&&(it.getTransfer(H)===lt?(K!==fn||le!==Wn)&&He("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):Qe("WebGLTextures: Unsupported texture color space:",H)),L}function G(N){return typeof HTMLImageElement<"u"&&N instanceof HTMLImageElement?(c.width=N.naturalWidth||N.width,c.height=N.naturalHeight||N.height):typeof VideoFrame<"u"&&N instanceof VideoFrame?(c.width=N.displayWidth,c.height=N.displayHeight):(c.width=N.width,c.height=N.height),c}this.allocateTextureUnit=B,this.resetTextureUnits=C,this.setTexture2D=F,this.setTexture2DArray=W,this.setTexture3D=j,this.setTextureCube=$,this.rebindTextures=Je,this.setupRenderTarget=Ne,this.updateRenderTargetMipmap=T,this.updateMultisampleRenderTarget=U,this.setupDepthRenderbuffer=Be,this.setupFrameBufferTexture=fe,this.useMultisampledRTT=z}function j_(s,e){function t(n,i=ki){let r;const o=it.getTransfer(i);if(n===Wn)return s.UNSIGNED_BYTE;if(n===ic)return s.UNSIGNED_SHORT_4_4_4_4;if(n===sc)return s.UNSIGNED_SHORT_5_5_5_1;if(n===wd)return s.UNSIGNED_INT_5_9_9_9_REV;if(n===Sd)return s.UNSIGNED_INT_10F_11F_11F_REV;if(n===_d)return s.BYTE;if(n===Md)return s.SHORT;if(n===Wr)return s.UNSIGNED_SHORT;if(n===nc)return s.INT;if(n===ts)return s.UNSIGNED_INT;if(n===Xn)return s.FLOAT;if(n===Rn)return s.HALF_FLOAT;if(n===Ed)return s.ALPHA;if(n===Td)return s.RGB;if(n===fn)return s.RGBA;if(n===Xr)return s.DEPTH_COMPONENT;if(n===Hs)return s.DEPTH_STENCIL;if(n===rc)return s.RED;if(n===oc)return s.RED_INTEGER;if(n===ac)return s.RG;if(n===lc)return s.RG_INTEGER;if(n===cc)return s.RGBA_INTEGER;if(n===Zo||n===Yo||n===Ko||n===$o)if(o===lt)if(r=e.get("WEBGL_compressed_texture_s3tc_srgb"),r!==null){if(n===Zo)return r.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(n===Yo)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(n===Ko)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(n===$o)return r.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else return null;else if(r=e.get("WEBGL_compressed_texture_s3tc"),r!==null){if(n===Zo)return r.COMPRESSED_RGB_S3TC_DXT1_EXT;if(n===Yo)return r.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(n===Ko)return r.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(n===$o)return r.COMPRESSED_RGBA_S3TC_DXT5_EXT}else return null;if(n===hc||n===uc||n===dc||n===fc)if(r=e.get("WEBGL_compressed_texture_pvrtc"),r!==null){if(n===hc)return r.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(n===uc)return r.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(n===dc)return r.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(n===fc)return r.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}else return null;if(n===pc||n===mc||n===gc)if(r=e.get("WEBGL_compressed_texture_etc"),r!==null){if(n===pc||n===mc)return o===lt?r.COMPRESSED_SRGB8_ETC2:r.COMPRESSED_RGB8_ETC2;if(n===gc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:r.COMPRESSED_RGBA8_ETC2_EAC}else return null;if(n===xc||n===vc||n===bc||n===yc||n===_c||n===Mc||n===wc||n===Sc||n===Ec||n===Tc||n===Ac||n===Cc||n===Pc||n===Rc)if(r=e.get("WEBGL_compressed_texture_astc"),r!==null){if(n===xc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:r.COMPRESSED_RGBA_ASTC_4x4_KHR;if(n===vc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:r.COMPRESSED_RGBA_ASTC_5x4_KHR;if(n===bc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:r.COMPRESSED_RGBA_ASTC_5x5_KHR;if(n===yc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:r.COMPRESSED_RGBA_ASTC_6x5_KHR;if(n===_c)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:r.COMPRESSED_RGBA_ASTC_6x6_KHR;if(n===Mc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:r.COMPRESSED_RGBA_ASTC_8x5_KHR;if(n===wc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:r.COMPRESSED_RGBA_ASTC_8x6_KHR;if(n===Sc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:r.COMPRESSED_RGBA_ASTC_8x8_KHR;if(n===Ec)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:r.COMPRESSED_RGBA_ASTC_10x5_KHR;if(n===Tc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:r.COMPRESSED_RGBA_ASTC_10x6_KHR;if(n===Ac)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:r.COMPRESSED_RGBA_ASTC_10x8_KHR;if(n===Cc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:r.COMPRESSED_RGBA_ASTC_10x10_KHR;if(n===Pc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:r.COMPRESSED_RGBA_ASTC_12x10_KHR;if(n===Rc)return o===lt?r.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:r.COMPRESSED_RGBA_ASTC_12x12_KHR}else return null;if(n===Lc||n===Dc||n===Ic)if(r=e.get("EXT_texture_compression_bptc"),r!==null){if(n===Lc)return o===lt?r.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:r.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(n===Dc)return r.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(n===Ic)return r.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}else return null;if(n===Bc||n===Nc||n===kc||n===Uc)if(r=e.get("EXT_texture_compression_rgtc"),r!==null){if(n===Bc)return r.COMPRESSED_RED_RGTC1_EXT;if(n===Nc)return r.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(n===kc)return r.COMPRESSED_RED_GREEN_RGTC2_EXT;if(n===Uc)return r.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}else return null;return n===zs?s.UNSIGNED_INT_24_8:s[n]!==void 0?s[n]:null}return{convert:t}}const q_=` void main() { gl_Position = vec4( position, 1.0 ); -}`,Y_=` +}`,Z_=` uniform sampler2DArray depthColor; uniform float depthWidth; uniform float depthHeight; @@ -3950,7 +3950,7 @@ void main() { } -}`;class K_{constructor(){this.texture=null,this.mesh=null,this.depthNear=0,this.depthFar=0}init(e,t){if(this.texture===null){const n=new Rf(e.texture);(e.depthNear!==t.depthNear||e.depthFar!==t.depthFar)&&(this.depthNear=e.depthNear,this.depthFar=e.depthFar),this.texture=n}}getMesh(e){if(this.texture!==null&&this.mesh===null){const t=e.cameras[0].viewport,n=new kt({vertexShader:Z_,fragmentShader:Y_,uniforms:{depthColor:{value:this.texture},depthWidth:{value:t.z},depthHeight:{value:t.w}}});this.mesh=new ut(new bo(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class $_ extends ns{constructor(e,t){super();const n=this;let i=null,r=1,o=null,a="local-floor",l=1,c=null,h=null,u=null,d=null,f=null,p=null;const g=typeof XRWebGLBinding<"u",x=new K_,m={},b=t.getContextAttributes();let v=null,y=null;const M=[],E=[],A=new ce;let R=null;const _=new sn;_.viewport=new tt;const S=new sn;S.viewport=new tt;const D=[_,S],C=new Uv;let B=null,w=null;this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(ie){let he=M[ie];return he===void 0&&(he=new hh,M[ie]=he),he.getTargetRaySpace()},this.getControllerGrip=function(ie){let he=M[ie];return he===void 0&&(he=new hh,M[ie]=he),he.getGripSpace()},this.getHand=function(ie){let he=M[ie];return he===void 0&&(he=new hh,M[ie]=he),he.getHandSpace()};function F(ie){const he=E.indexOf(ie.inputSource);if(he===-1)return;const fe=M[he];fe!==void 0&&(fe.update(ie.inputSource,ie.frame,c||o),fe.dispatchEvent({type:ie.type,data:ie.inputSource}))}function W(){i.removeEventListener("select",F),i.removeEventListener("selectstart",F),i.removeEventListener("selectend",F),i.removeEventListener("squeeze",F),i.removeEventListener("squeezestart",F),i.removeEventListener("squeezeend",F),i.removeEventListener("end",W),i.removeEventListener("inputsourceschange",j);for(let ie=0;ie=0&&(E[ve]=null,M[ve].disconnect(fe))}for(let he=0;he=E.length){E.push(fe),ve=Be;break}else if(E[Be]===null){E[Be]=fe,ve=Be;break}if(ve===-1)break}const we=M[ve];we&&we.connect(fe)}}const $=new P,Z=new P;function re(ie,he,fe){$.setFromMatrixPosition(he.matrixWorld),Z.setFromMatrixPosition(fe.matrixWorld);const ve=$.distanceTo(Z),we=he.projectionMatrix.elements,Be=fe.projectionMatrix.elements,Je=we[14]/(we[10]-1),Ne=we[14]/(we[10]+1),T=(we[9]+1)/we[5],I=(we[9]-1)/we[5],V=(we[8]-1)/we[0],U=(Be[8]+1)/Be[0],k=Je*V,z=Je*U,ee=ve/(-V+U),J=ee*-V;if(he.matrixWorld.decompose(ie.position,ie.quaternion,ie.scale),ie.translateX(J),ie.translateZ(ee),ie.matrixWorld.compose(ie.position,ie.quaternion,ie.scale),ie.matrixWorldInverse.copy(ie.matrixWorld).invert(),we[10]===-1)ie.projectionMatrix.copy(he.projectionMatrix),ie.projectionMatrixInverse.copy(he.projectionMatrixInverse);else{const G=Je+ee,N=Ne+ee,L=k-J,H=z+(ve-J),K=T*Ne/N*G,le=I*Ne/N*G;ie.projectionMatrix.makePerspective(L,H,K,le,G,N),ie.projectionMatrixInverse.copy(ie.projectionMatrix).invert()}}function X(ie,he){he===null?ie.matrixWorld.copy(ie.matrix):ie.matrixWorld.multiplyMatrices(he.matrixWorld,ie.matrix),ie.matrixWorldInverse.copy(ie.matrixWorld).invert()}this.updateCamera=function(ie){if(i===null)return;let he=ie.near,fe=ie.far;x.texture!==null&&(x.depthNear>0&&(he=x.depthNear),x.depthFar>0&&(fe=x.depthFar)),C.near=S.near=_.near=he,C.far=S.far=_.far=fe,(B!==C.near||w!==C.far)&&(i.updateRenderState({depthNear:C.near,depthFar:C.far}),B=C.near,w=C.far),C.layers.mask=ie.layers.mask|6,_.layers.mask=C.layers.mask&3,S.layers.mask=C.layers.mask&5;const ve=ie.parent,we=C.cameras;X(C,ve);for(let Be=0;Be0&&(x.alphaTest.value=m.alphaTest);const b=e.get(m),v=b.envMap,y=b.envMapRotation;v&&(x.envMap.value=v,ms.copy(y),ms.x*=-1,ms.y*=-1,ms.z*=-1,v.isCubeTexture&&v.isRenderTargetTexture===!1&&(ms.y*=-1,ms.z*=-1),x.envMapRotation.value.setFromMatrix4(J_.makeRotationFromEuler(ms)),x.flipEnvMap.value=v.isCubeTexture&&v.isRenderTargetTexture===!1?-1:1,x.reflectivity.value=m.reflectivity,x.ior.value=m.ior,x.refractionRatio.value=m.refractionRatio),m.lightMap&&(x.lightMap.value=m.lightMap,x.lightMapIntensity.value=m.lightMapIntensity,t(m.lightMap,x.lightMapTransform)),m.aoMap&&(x.aoMap.value=m.aoMap,x.aoMapIntensity.value=m.aoMapIntensity,t(m.aoMap,x.aoMapTransform))}function o(x,m){x.diffuse.value.copy(m.color),x.opacity.value=m.opacity,m.map&&(x.map.value=m.map,t(m.map,x.mapTransform))}function a(x,m){x.dashSize.value=m.dashSize,x.totalSize.value=m.dashSize+m.gapSize,x.scale.value=m.scale}function l(x,m,b,v){x.diffuse.value.copy(m.color),x.opacity.value=m.opacity,x.size.value=m.size*b,x.scale.value=v*.5,m.map&&(x.map.value=m.map,t(m.map,x.uvTransform)),m.alphaMap&&(x.alphaMap.value=m.alphaMap,t(m.alphaMap,x.alphaMapTransform)),m.alphaTest>0&&(x.alphaTest.value=m.alphaTest)}function c(x,m){x.diffuse.value.copy(m.color),x.opacity.value=m.opacity,x.rotation.value=m.rotation,m.map&&(x.map.value=m.map,t(m.map,x.mapTransform)),m.alphaMap&&(x.alphaMap.value=m.alphaMap,t(m.alphaMap,x.alphaMapTransform)),m.alphaTest>0&&(x.alphaTest.value=m.alphaTest)}function h(x,m){x.specular.value.copy(m.specular),x.shininess.value=Math.max(m.shininess,1e-4)}function u(x,m){m.gradientMap&&(x.gradientMap.value=m.gradientMap)}function d(x,m){x.metalness.value=m.metalness,m.metalnessMap&&(x.metalnessMap.value=m.metalnessMap,t(m.metalnessMap,x.metalnessMapTransform)),x.roughness.value=m.roughness,m.roughnessMap&&(x.roughnessMap.value=m.roughnessMap,t(m.roughnessMap,x.roughnessMapTransform)),m.envMap&&(x.envMapIntensity.value=m.envMapIntensity)}function f(x,m,b){x.ior.value=m.ior,m.sheen>0&&(x.sheenColor.value.copy(m.sheenColor).multiplyScalar(m.sheen),x.sheenRoughness.value=m.sheenRoughness,m.sheenColorMap&&(x.sheenColorMap.value=m.sheenColorMap,t(m.sheenColorMap,x.sheenColorMapTransform)),m.sheenRoughnessMap&&(x.sheenRoughnessMap.value=m.sheenRoughnessMap,t(m.sheenRoughnessMap,x.sheenRoughnessMapTransform))),m.clearcoat>0&&(x.clearcoat.value=m.clearcoat,x.clearcoatRoughness.value=m.clearcoatRoughness,m.clearcoatMap&&(x.clearcoatMap.value=m.clearcoatMap,t(m.clearcoatMap,x.clearcoatMapTransform)),m.clearcoatRoughnessMap&&(x.clearcoatRoughnessMap.value=m.clearcoatRoughnessMap,t(m.clearcoatRoughnessMap,x.clearcoatRoughnessMapTransform)),m.clearcoatNormalMap&&(x.clearcoatNormalMap.value=m.clearcoatNormalMap,t(m.clearcoatNormalMap,x.clearcoatNormalMapTransform),x.clearcoatNormalScale.value.copy(m.clearcoatNormalScale),m.side===on&&x.clearcoatNormalScale.value.negate())),m.dispersion>0&&(x.dispersion.value=m.dispersion),m.iridescence>0&&(x.iridescence.value=m.iridescence,x.iridescenceIOR.value=m.iridescenceIOR,x.iridescenceThicknessMinimum.value=m.iridescenceThicknessRange[0],x.iridescenceThicknessMaximum.value=m.iridescenceThicknessRange[1],m.iridescenceMap&&(x.iridescenceMap.value=m.iridescenceMap,t(m.iridescenceMap,x.iridescenceMapTransform)),m.iridescenceThicknessMap&&(x.iridescenceThicknessMap.value=m.iridescenceThicknessMap,t(m.iridescenceThicknessMap,x.iridescenceThicknessMapTransform))),m.transmission>0&&(x.transmission.value=m.transmission,x.transmissionSamplerMap.value=b.texture,x.transmissionSamplerSize.value.set(b.width,b.height),m.transmissionMap&&(x.transmissionMap.value=m.transmissionMap,t(m.transmissionMap,x.transmissionMapTransform)),x.thickness.value=m.thickness,m.thicknessMap&&(x.thicknessMap.value=m.thicknessMap,t(m.thicknessMap,x.thicknessMapTransform)),x.attenuationDistance.value=m.attenuationDistance,x.attenuationColor.value.copy(m.attenuationColor)),m.anisotropy>0&&(x.anisotropyVector.value.set(m.anisotropy*Math.cos(m.anisotropyRotation),m.anisotropy*Math.sin(m.anisotropyRotation)),m.anisotropyMap&&(x.anisotropyMap.value=m.anisotropyMap,t(m.anisotropyMap,x.anisotropyMapTransform))),x.specularIntensity.value=m.specularIntensity,x.specularColor.value.copy(m.specularColor),m.specularColorMap&&(x.specularColorMap.value=m.specularColorMap,t(m.specularColorMap,x.specularColorMapTransform)),m.specularIntensityMap&&(x.specularIntensityMap.value=m.specularIntensityMap,t(m.specularIntensityMap,x.specularIntensityMapTransform))}function p(x,m){m.matcap&&(x.matcap.value=m.matcap)}function g(x,m){const b=e.get(m).light;x.referencePosition.value.setFromMatrixPosition(b.matrixWorld),x.nearDistance.value=b.shadow.camera.near,x.farDistance.value=b.shadow.camera.far}return{refreshFogUniforms:n,refreshMaterialUniforms:i}}function e2(s,e,t,n){let i={},r={},o=[];const a=s.getParameter(s.MAX_UNIFORM_BUFFER_BINDINGS);function l(b,v){const y=v.program;n.uniformBlockBinding(b,y)}function c(b,v){let y=i[b.id];y===void 0&&(p(b),y=h(b),i[b.id]=y,b.addEventListener("dispose",x));const M=v.program;n.updateUBOMapping(b,M);const E=e.render.frame;r[b.id]!==E&&(d(b),r[b.id]=E)}function h(b){const v=u();b.__bindingPointIndex=v;const y=s.createBuffer(),M=b.__size,E=b.usage;return s.bindBuffer(s.UNIFORM_BUFFER,y),s.bufferData(s.UNIFORM_BUFFER,M,E),s.bindBuffer(s.UNIFORM_BUFFER,null),s.bindBufferBase(s.UNIFORM_BUFFER,v,y),y}function u(){for(let b=0;b0&&(y+=M-E),b.__size=y,b.__cache={},this}function g(b){const v={boundary:0,storage:0};return typeof b=="number"||typeof b=="boolean"?(v.boundary=4,v.storage=4):b.isVector2?(v.boundary=8,v.storage=8):b.isVector3||b.isColor?(v.boundary=16,v.storage=12):b.isVector4?(v.boundary=16,v.storage=16):b.isMatrix3?(v.boundary=48,v.storage=48):b.isMatrix4?(v.boundary=64,v.storage=64):b.isTexture?He("WebGLRenderer: Texture samplers can not be part of an uniforms group."):He("WebGLRenderer: Unsupported uniform value type.",b),v}function x(b){const v=b.target;v.removeEventListener("dispose",x);const y=o.indexOf(v.__bindingPointIndex);o.splice(y,1),s.deleteBuffer(i[v.id]),delete i[v.id],delete r[v.id]}function m(){for(const b in i)s.deleteBuffer(i[b]);o=[],i={},r={}}return{bind:l,update:c,dispose:m}}const t2=new Uint16Array([11481,15204,11534,15171,11808,15015,12385,14843,12894,14716,13396,14600,13693,14483,13976,14366,14237,14171,14405,13961,14511,13770,14605,13598,14687,13444,14760,13305,14822,13066,14876,12857,14923,12675,14963,12517,14997,12379,15025,12230,15049,12023,15070,11843,15086,11687,15100,11551,15111,11433,15120,11330,15127,11217,15132,11060,15135,10922,15138,10801,15139,10695,15139,10600,13012,14923,13020,14917,13064,14886,13176,14800,13349,14666,13513,14526,13724,14398,13960,14230,14200,14020,14383,13827,14488,13651,14583,13491,14667,13348,14740,13132,14803,12908,14856,12713,14901,12542,14938,12394,14968,12241,14992,12017,15010,11822,15024,11654,15034,11507,15041,11380,15044,11269,15044,11081,15042,10913,15037,10764,15031,10635,15023,10520,15014,10419,15003,10330,13657,14676,13658,14673,13670,14660,13698,14622,13750,14547,13834,14442,13956,14317,14112,14093,14291,13889,14407,13704,14499,13538,14586,13389,14664,13201,14733,12966,14792,12758,14842,12577,14882,12418,14915,12272,14940,12033,14959,11826,14972,11646,14980,11490,14983,11355,14983,11212,14979,11008,14971,10830,14961,10675,14950,10540,14936,10420,14923,10315,14909,10204,14894,10041,14089,14460,14090,14459,14096,14452,14112,14431,14141,14388,14186,14305,14252,14130,14341,13941,14399,13756,14467,13585,14539,13430,14610,13272,14677,13026,14737,12808,14790,12617,14833,12449,14869,12303,14896,12065,14916,11845,14929,11655,14937,11490,14939,11347,14936,11184,14930,10970,14921,10783,14912,10621,14900,10480,14885,10356,14867,10247,14848,10062,14827,9894,14805,9745,14400,14208,14400,14206,14402,14198,14406,14174,14415,14122,14427,14035,14444,13913,14469,13767,14504,13613,14548,13463,14598,13324,14651,13082,14704,12858,14752,12658,14795,12483,14831,12330,14860,12106,14881,11875,14895,11675,14903,11501,14905,11351,14903,11178,14900,10953,14892,10757,14880,10589,14865,10442,14847,10313,14827,10162,14805,9965,14782,9792,14757,9642,14731,9507,14562,13883,14562,13883,14563,13877,14566,13862,14570,13830,14576,13773,14584,13689,14595,13582,14613,13461,14637,13336,14668,13120,14704,12897,14741,12695,14776,12516,14808,12358,14835,12150,14856,11910,14870,11701,14878,11519,14882,11361,14884,11187,14880,10951,14871,10748,14858,10572,14842,10418,14823,10286,14801,10099,14777,9897,14751,9722,14725,9567,14696,9430,14666,9309,14702,13604,14702,13604,14702,13600,14703,13591,14705,13570,14707,13533,14709,13477,14712,13400,14718,13305,14727,13106,14743,12907,14762,12716,14784,12539,14807,12380,14827,12190,14844,11943,14855,11727,14863,11539,14870,11376,14871,11204,14868,10960,14858,10748,14845,10565,14829,10406,14809,10269,14786,10058,14761,9852,14734,9671,14705,9512,14674,9374,14641,9253,14608,9076,14821,13366,14821,13365,14821,13364,14821,13358,14821,13344,14821,13320,14819,13252,14817,13145,14815,13011,14814,12858,14817,12698,14823,12539,14832,12389,14841,12214,14850,11968,14856,11750,14861,11558,14866,11390,14867,11226,14862,10972,14853,10754,14840,10565,14823,10401,14803,10259,14780,10032,14754,9820,14725,9635,14694,9473,14661,9333,14627,9203,14593,8988,14557,8798,14923,13014,14922,13014,14922,13012,14922,13004,14920,12987,14919,12957,14915,12907,14909,12834,14902,12738,14894,12623,14888,12498,14883,12370,14880,12203,14878,11970,14875,11759,14873,11569,14874,11401,14872,11243,14865,10986,14855,10762,14842,10568,14825,10401,14804,10255,14781,10017,14754,9799,14725,9611,14692,9445,14658,9301,14623,9139,14587,8920,14548,8729,14509,8562,15008,12672,15008,12672,15008,12671,15007,12667,15005,12656,15001,12637,14997,12605,14989,12556,14978,12490,14966,12407,14953,12313,14940,12136,14927,11934,14914,11742,14903,11563,14896,11401,14889,11247,14879,10992,14866,10767,14851,10570,14833,10400,14812,10252,14789,10007,14761,9784,14731,9592,14698,9424,14663,9279,14627,9088,14588,8868,14548,8676,14508,8508,14467,8360,15080,12386,15080,12386,15079,12385,15078,12383,15076,12378,15072,12367,15066,12347,15057,12315,15045,12253,15030,12138,15012,11998,14993,11845,14972,11685,14951,11530,14935,11383,14920,11228,14904,10981,14887,10762,14870,10567,14850,10397,14827,10248,14803,9997,14774,9771,14743,9578,14710,9407,14674,9259,14637,9048,14596,8826,14555,8632,14514,8464,14471,8317,14427,8182,15139,12008,15139,12008,15138,12008,15137,12007,15135,12003,15130,11990,15124,11969,15115,11929,15102,11872,15086,11794,15064,11693,15041,11581,15013,11459,14987,11336,14966,11170,14944,10944,14921,10738,14898,10552,14875,10387,14850,10239,14824,9983,14794,9758,14762,9563,14728,9392,14692,9244,14653,9014,14611,8791,14569,8597,14526,8427,14481,8281,14436,8110,14391,7885,15188,11617,15188,11617,15187,11617,15186,11618,15183,11617,15179,11612,15173,11601,15163,11581,15150,11546,15133,11495,15110,11427,15083,11346,15051,11246,15024,11057,14996,10868,14967,10687,14938,10517,14911,10362,14882,10206,14853,9956,14821,9737,14787,9543,14752,9375,14715,9228,14675,8980,14632,8760,14589,8565,14544,8395,14498,8248,14451,8049,14404,7824,14357,7630,15228,11298,15228,11298,15227,11299,15226,11301,15223,11303,15219,11302,15213,11299,15204,11290,15191,11271,15174,11217,15150,11129,15119,11015,15087,10886,15057,10744,15024,10599,14990,10455,14957,10318,14924,10143,14891,9911,14856,9701,14820,9516,14782,9352,14744,9200,14703,8946,14659,8725,14615,8533,14568,8366,14521,8220,14472,7992,14423,7770,14374,7578,14315,7408,15260,10819,15260,10819,15259,10822,15258,10826,15256,10832,15251,10836,15246,10841,15237,10838,15225,10821,15207,10788,15183,10734,15151,10660,15120,10571,15087,10469,15049,10359,15012,10249,14974,10041,14937,9837,14900,9647,14860,9475,14820,9320,14779,9147,14736,8902,14691,8688,14646,8499,14598,8335,14549,8189,14499,7940,14448,7720,14397,7529,14347,7363,14256,7218,15285,10410,15285,10411,15285,10413,15284,10418,15282,10425,15278,10434,15272,10442,15264,10449,15252,10445,15235,10433,15210,10403,15179,10358,15149,10301,15113,10218,15073,10059,15033,9894,14991,9726,14951,9565,14909,9413,14865,9273,14822,9073,14777,8845,14730,8641,14682,8459,14633,8300,14583,8129,14531,7883,14479,7670,14426,7482,14373,7321,14305,7176,14201,6939,15305,9939,15305,9940,15305,9945,15304,9955,15302,9967,15298,9989,15293,10010,15286,10033,15274,10044,15258,10045,15233,10022,15205,9975,15174,9903,15136,9808,15095,9697,15053,9578,15009,9451,14965,9327,14918,9198,14871,8973,14825,8766,14775,8579,14725,8408,14675,8259,14622,8058,14569,7821,14515,7615,14460,7435,14405,7276,14350,7108,14256,6866,14149,6653,15321,9444,15321,9445,15321,9448,15320,9458,15317,9470,15314,9490,15310,9515,15302,9540,15292,9562,15276,9579,15251,9577,15226,9559,15195,9519,15156,9463,15116,9389,15071,9304,15025,9208,14978,9023,14927,8838,14878,8661,14827,8496,14774,8344,14722,8206,14667,7973,14612,7749,14556,7555,14499,7382,14443,7229,14385,7025,14322,6791,14210,6588,14100,6409,15333,8920,15333,8921,15332,8927,15332,8943,15329,8965,15326,9002,15322,9048,15316,9106,15307,9162,15291,9204,15267,9221,15244,9221,15212,9196,15175,9134,15133,9043,15088,8930,15040,8801,14990,8665,14938,8526,14886,8391,14830,8261,14775,8087,14719,7866,14661,7664,14603,7482,14544,7322,14485,7178,14426,6936,14367,6713,14281,6517,14166,6348,14054,6198,15341,8360,15341,8361,15341,8366,15341,8379,15339,8399,15336,8431,15332,8473,15326,8527,15318,8585,15302,8632,15281,8670,15258,8690,15227,8690,15191,8664,15149,8612,15104,8543,15055,8456,15001,8360,14948,8259,14892,8122,14834,7923,14776,7734,14716,7558,14656,7397,14595,7250,14534,7070,14472,6835,14410,6628,14350,6443,14243,6283,14125,6135,14010,5889,15348,7715,15348,7717,15348,7725,15347,7745,15345,7780,15343,7836,15339,7905,15334,8e3,15326,8103,15310,8193,15293,8239,15270,8270,15240,8287,15204,8283,15163,8260,15118,8223,15067,8143,15014,8014,14958,7873,14899,7723,14839,7573,14778,7430,14715,7293,14652,7164,14588,6931,14524,6720,14460,6531,14396,6362,14330,6210,14207,6015,14086,5781,13969,5576,15352,7114,15352,7116,15352,7128,15352,7159,15350,7195,15348,7237,15345,7299,15340,7374,15332,7457,15317,7544,15301,7633,15280,7703,15251,7754,15216,7775,15176,7767,15131,7733,15079,7670,15026,7588,14967,7492,14906,7387,14844,7278,14779,7171,14714,6965,14648,6770,14581,6587,14515,6420,14448,6269,14382,6123,14299,5881,14172,5665,14049,5477,13929,5310,15355,6329,15355,6330,15355,6339,15355,6362,15353,6410,15351,6472,15349,6572,15344,6688,15337,6835,15323,6985,15309,7142,15287,7220,15260,7277,15226,7310,15188,7326,15142,7318,15090,7285,15036,7239,14976,7177,14914,7045,14849,6892,14782,6736,14714,6581,14645,6433,14576,6293,14506,6164,14438,5946,14369,5733,14270,5540,14140,5369,14014,5216,13892,5043,15357,5483,15357,5484,15357,5496,15357,5528,15356,5597,15354,5692,15351,5835,15347,6011,15339,6195,15328,6317,15314,6446,15293,6566,15268,6668,15235,6746,15197,6796,15152,6811,15101,6790,15046,6748,14985,6673,14921,6583,14854,6479,14785,6371,14714,6259,14643,6149,14571,5946,14499,5750,14428,5567,14358,5401,14242,5250,14109,5111,13980,4870,13856,4657,15359,4555,15359,4557,15358,4573,15358,4633,15357,4715,15355,4841,15353,5061,15349,5216,15342,5391,15331,5577,15318,5770,15299,5967,15274,6150,15243,6223,15206,6280,15161,6310,15111,6317,15055,6300,14994,6262,14928,6208,14860,6141,14788,5994,14715,5838,14641,5684,14566,5529,14492,5384,14418,5247,14346,5121,14216,4892,14079,4682,13948,4496,13822,4330,15359,3498,15359,3501,15359,3520,15359,3598,15358,3719,15356,3860,15355,4137,15351,4305,15344,4563,15334,4809,15321,5116,15303,5273,15280,5418,15250,5547,15214,5653,15170,5722,15120,5761,15064,5763,15002,5733,14935,5673,14865,5597,14792,5504,14716,5400,14640,5294,14563,5185,14486,5041,14410,4841,14335,4655,14191,4482,14051,4325,13918,4183,13790,4012,15360,2282,15360,2285,15360,2306,15360,2401,15359,2547,15357,2748,15355,3103,15352,3349,15345,3675,15336,4020,15324,4272,15307,4496,15285,4716,15255,4908,15220,5086,15178,5170,15128,5214,15072,5234,15010,5231,14943,5206,14871,5166,14796,5102,14718,4971,14639,4833,14559,4687,14480,4541,14402,4401,14315,4268,14167,4142,14025,3958,13888,3747,13759,3556,15360,923,15360,925,15360,946,15360,1052,15359,1214,15357,1494,15356,1892,15352,2274,15346,2663,15338,3099,15326,3393,15309,3679,15288,3980,15260,4183,15226,4325,15185,4437,15136,4517,15080,4570,15018,4591,14950,4581,14877,4545,14800,4485,14720,4411,14638,4325,14556,4231,14475,4136,14395,3988,14297,3803,14145,3628,13999,3465,13861,3314,13729,3177,15360,263,15360,264,15360,272,15360,325,15359,407,15358,548,15356,780,15352,1144,15347,1580,15339,2099,15328,2425,15312,2795,15292,3133,15264,3329,15232,3517,15191,3689,15143,3819,15088,3923,15025,3978,14956,3999,14882,3979,14804,3931,14722,3855,14639,3756,14554,3645,14470,3529,14388,3409,14279,3289,14124,3173,13975,3055,13834,2848,13701,2658,15360,49,15360,49,15360,52,15360,75,15359,111,15358,201,15356,283,15353,519,15348,726,15340,1045,15329,1415,15314,1795,15295,2173,15269,2410,15237,2649,15197,2866,15150,3054,15095,3140,15032,3196,14963,3228,14888,3236,14808,3224,14725,3191,14639,3146,14553,3088,14466,2976,14382,2836,14262,2692,14103,2549,13952,2409,13808,2278,13674,2154,15360,4,15360,4,15360,4,15360,13,15359,33,15358,59,15357,112,15353,199,15348,302,15341,456,15331,628,15316,827,15297,1082,15272,1332,15241,1601,15202,1851,15156,2069,15101,2172,15039,2256,14970,2314,14894,2348,14813,2358,14728,2344,14640,2311,14551,2263,14463,2203,14376,2133,14247,2059,14084,1915,13930,1761,13784,1609,13648,1464,15360,0,15360,0,15360,0,15360,3,15359,18,15358,26,15357,53,15354,80,15348,97,15341,165,15332,238,15318,326,15299,427,15275,529,15245,654,15207,771,15161,885,15108,994,15046,1089,14976,1170,14900,1229,14817,1266,14731,1284,14641,1282,14550,1260,14460,1223,14370,1174,14232,1116,14066,1050,13909,981,13761,910,13623,839]);let Ei=null;function n2(){return Ei===null&&(Ei=new ao(t2,32,32,ac,Rn),Ei.minFilter=$t,Ei.magFilter=$t,Ei.wrapS=ii,Ei.wrapT=ii,Ei.generateMipmaps=!1,Ei.needsUpdate=!0),Ei}class Dp{constructor(e={}){const{canvas:t=Ug(),context:n=null,depth:i=!0,stencil:r=!1,alpha:o=!1,antialias:a=!1,premultipliedAlpha:l=!0,preserveDrawingBuffer:c=!1,powerPreference:h="default",failIfMajorPerformanceCaveat:u=!1,reversedDepthBuffer:d=!1}=e;this.isWebGLRenderer=!0;let f;if(n!==null){if(typeof WebGLRenderingContext<"u"&&n instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");f=n.getContextAttributes().alpha}else f=o;const p=new Set([cc,lc,oc]),g=new Set([Wn,ts,Wr,zs,ic,sc]),x=new Uint32Array(4),m=new Int32Array(4);let b=null,v=null;const y=[],M=[];this.domElement=t,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.toneMapping=Ni,this.toneMappingExposure=1,this.transmissionResolutionScale=1;const E=this;let A=!1;this._outputColorSpace=gt;let R=0,_=0,S=null,D=-1,C=null;const B=new tt,w=new tt;let F=null;const W=new Ue(0);let j=0,$=t.width,Z=t.height,re=1,X=null,Y=null;const ge=new tt(0,0,$,Z),pe=new tt(0,0,$,Z);let de=!1;const ie=new vh;let he=!1,fe=!1;const ve=new ze,we=new P,Be=new tt,Je={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};let Ne=!1;function T(){return S===null?re:1}let I=n;function V(O,Q){return t.getContext(O,Q)}try{const O={alpha:!0,depth:i,stencil:r,antialias:a,premultipliedAlpha:l,preserveDrawingBuffer:c,powerPreference:h,failIfMajorPerformanceCaveat:u};if("setAttribute"in t&&t.setAttribute("data-engine",`three.js r${Hr}`),t.addEventListener("webglcontextlost",xe,!1),t.addEventListener("webglcontextrestored",me,!1),t.addEventListener("webglcontextcreationerror",Oe,!1),I===null){const Q="webgl2";if(I=V(Q,O),I===null)throw V(Q)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}}catch(O){throw O("WebGLRenderer: "+O.message),O}let U,k,z,ee,J,G,N,L,H,K,le,te,Te,be,Re,De,ue,ye,Ve,ke,Ae,Ge,q,Ee;function _e(){U=new uy(I),U.init(),Ge=new q_(I,U),k=new ny(I,U,e,Ge),z=new X_(I,U),k.reversedDepthBuffer&&d&&z.buffers.depth.setReversed(!0),ee=new py(I),J=new D_,G=new j_(I,U,z,J,k,Ge,ee),N=new sy(E),L=new hy(E),H=new Jv(I),q=new ey(I,H),K=new dy(I,H,ee,q),le=new gy(I,K,H,ee),Ve=new my(I,k,G),De=new iy(J),te=new L_(E,N,L,U,k,q,De),Te=new Q_(E,J),be=new B_,Re=new z_(U),ye=new Qb(E,N,L,z,le,f,l),ue=new G_(E,le,k),Ee=new e2(I,ee,k,z),ke=new ty(I,U,ee),Ae=new fy(I,U,ee),ee.programs=te.programs,E.capabilities=k,E.extensions=U,E.properties=J,E.renderLists=be,E.shadowMap=ue,E.state=z,E.info=ee}_e();const Me=new $_(E,I);this.xr=Me,this.getContext=function(){return I},this.getContextAttributes=function(){return I.getContextAttributes()},this.forceContextLoss=function(){const O=U.get("WEBGL_lose_context");O&&O.loseContext()},this.forceContextRestore=function(){const O=U.get("WEBGL_lose_context");O&&O.restoreContext()},this.getPixelRatio=function(){return re},this.setPixelRatio=function(O){O!==void 0&&(re=O,this.setSize($,Z,!1))},this.getSize=function(O){return O.set($,Z)},this.setSize=function(O,Q,oe=!0){if(Me.isPresenting){He("WebGLRenderer: Can't change size while VR device is presenting.");return}$=O,Z=Q,t.width=Math.floor(O*re),t.height=Math.floor(Q*re),oe===!0&&(t.style.width=O+"px",t.style.height=Q+"px"),this.setViewport(0,0,O,Q)},this.getDrawingBufferSize=function(O){return O.set($*re,Z*re).floor()},this.setDrawingBufferSize=function(O,Q,oe){$=O,Z=Q,re=oe,t.width=Math.floor(O*oe),t.height=Math.floor(Q*oe),this.setViewport(0,0,O,Q)},this.getCurrentViewport=function(O){return O.copy(B)},this.getViewport=function(O){return O.copy(ge)},this.setViewport=function(O,Q,oe,ae){O.isVector4?ge.set(O.x,O.y,O.z,O.w):ge.set(O,Q,oe,ae),z.viewport(B.copy(ge).multiplyScalar(re).round())},this.getScissor=function(O){return O.copy(pe)},this.setScissor=function(O,Q,oe,ae){O.isVector4?pe.set(O.x,O.y,O.z,O.w):pe.set(O,Q,oe,ae),z.scissor(w.copy(pe).multiplyScalar(re).round())},this.getScissorTest=function(){return de},this.setScissorTest=function(O){z.setScissorTest(de=O)},this.setOpaqueSort=function(O){X=O},this.setTransparentSort=function(O){Y=O},this.getClearColor=function(O){return O.copy(ye.getClearColor())},this.setClearColor=function(){ye.setClearColor(...arguments)},this.getClearAlpha=function(){return ye.getClearAlpha()},this.setClearAlpha=function(){ye.setClearAlpha(...arguments)},this.clear=function(O=!0,Q=!0,oe=!0){let ae=0;if(O){let ne=!1;if(S!==null){const Se=S.texture.format;ne=p.has(Se)}if(ne){const Se=S.texture.type,Le=g.has(Se),Fe=ye.getClearColor(),Ie=ye.getClearAlpha(),je=Fe.r,Ze=Fe.g,We=Fe.b;Le?(x[0]=je,x[1]=Ze,x[2]=We,x[3]=Ie,I.clearBufferuiv(I.COLOR,0,x)):(m[0]=je,m[1]=Ze,m[2]=We,m[3]=Ie,I.clearBufferiv(I.COLOR,0,m))}else ae|=I.COLOR_BUFFER_BIT}Q&&(ae|=I.DEPTH_BUFFER_BIT),oe&&(ae|=I.STENCIL_BUFFER_BIT,this.state.buffers.stencil.setMask(4294967295)),I.clear(ae)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){t.removeEventListener("webglcontextlost",xe,!1),t.removeEventListener("webglcontextrestored",me,!1),t.removeEventListener("webglcontextcreationerror",Oe,!1),ye.dispose(),be.dispose(),Re.dispose(),J.dispose(),N.dispose(),L.dispose(),le.dispose(),q.dispose(),Ee.dispose(),te.dispose(),Me.dispose(),Me.removeEventListener("sessionstart",V0),Me.removeEventListener("sessionend",G0),Ls.stop()};function xe(O){O.preventDefault(),ea("WebGLRenderer: Context Lost."),A=!0}function me(){ea("WebGLRenderer: Context Restored."),A=!1;const O=ee.autoReset,Q=ue.enabled,oe=ue.autoUpdate,ae=ue.needsUpdate,ne=ue.type;_e(),ee.autoReset=O,ue.enabled=Q,ue.autoUpdate=oe,ue.needsUpdate=ae,ue.type=ne}function Oe(O){Qe("WebGLRenderer: A WebGL context could not be created. Reason: ",O.statusMessage)}function Ye(O){const Q=O.target;Q.removeEventListener("dispose",Ye),wt(Q)}function wt(O){pt(O),J.remove(O)}function pt(O){const Q=J.get(O).programs;Q!==void 0&&(Q.forEach(function(oe){te.releaseProgram(oe)}),O.isShaderMaterial&&te.releaseShaderCache(O))}this.renderBufferDirect=function(O,Q,oe,ae,ne,Se){Q===null&&(Q=Je);const Le=ne.isMesh&&ne.matrixWorld.determinant()<0,Fe=AT(O,Q,oe,ae,ne);z.setMaterial(ae,Le);let Ie=oe.index,je=1;if(ae.wireframe===!0){if(Ie=K.getWireframeAttribute(oe),Ie===void 0)return;je=2}const Ze=oe.drawRange,We=oe.attributes.position;let st=Ze.start*je,mt=(Ze.start+Ze.count)*je;Se!==null&&(st=Math.max(st,Se.start*je),mt=Math.min(mt,(Se.start+Se.count)*je)),Ie!==null?(st=Math.max(st,0),mt=Math.min(mt,Ie.count)):We!=null&&(st=Math.max(st,0),mt=Math.min(mt,We.count));const Bt=mt-st;if(Bt<0||Bt===1/0)return;q.setup(ne,ae,Fe,oe,Ie);let Nt,vt=ke;if(Ie!==null&&(Nt=H.get(Ie),vt=Ae,vt.setIndex(Nt)),ne.isMesh)ae.wireframe===!0?(z.setLineWidth(ae.wireframeLinewidth*T()),vt.setMode(I.LINES)):vt.setMode(I.TRIANGLES);else if(ne.isLine){let Xe=ae.linewidth;Xe===void 0&&(Xe=1),z.setLineWidth(Xe*T()),ne.isLineSegments?vt.setMode(I.LINES):ne.isLineLoop?vt.setMode(I.LINE_LOOP):vt.setMode(I.LINE_STRIP)}else ne.isPoints?vt.setMode(I.POINTS):ne.isSprite&&vt.setMode(I.TRIANGLES);if(ne.isBatchedMesh)if(ne._multiDrawInstances!==null)Kr("WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),vt.renderMultiDrawInstances(ne._multiDrawStarts,ne._multiDrawCounts,ne._multiDrawCount,ne._multiDrawInstances);else if(U.get("WEBGL_multi_draw"))vt.renderMultiDraw(ne._multiDrawStarts,ne._multiDrawCounts,ne._multiDrawCount);else{const Xe=ne._multiDrawStarts,Ct=ne._multiDrawCounts,ot=ne._multiDrawCount,An=Ie?H.get(Ie).bytesPerElement:1,Fr=J.get(ae).currentProgram.getUniforms();for(let Cn=0;Cn{function Se(){if(ae.forEach(function(Le){J.get(Le).currentProgram.isReady()&&ae.delete(Le)}),ae.size===0){ne(O);return}setTimeout(Se,10)}U.get("KHR_parallel_shader_compile")!==null?Se():setTimeout(Se,10)})};let ti=null;function TT(O){ti&&ti(O)}function V0(){Ls.stop()}function G0(){Ls.start()}const Ls=new sp;Ls.setAnimationLoop(TT),typeof self<"u"&&Ls.setContext(self),this.setAnimationLoop=function(O){ti=O,Me.setAnimationLoop(O),O===null?Ls.stop():Ls.start()},Me.addEventListener("sessionstart",V0),Me.addEventListener("sessionend",G0),this.render=function(O,Q){if(Q!==void 0&&Q.isCamera!==!0){Qe("WebGLRenderer.render: camera is not an instance of THREE.Camera.");return}if(A===!0)return;if(O.matrixWorldAutoUpdate===!0&&O.updateMatrixWorld(),Q.parent===null&&Q.matrixWorldAutoUpdate===!0&&Q.updateMatrixWorld(),Me.enabled===!0&&Me.isPresenting===!0&&(Me.cameraAutoUpdate===!0&&Me.updateCamera(Q),Q=Me.getCamera()),O.isScene===!0&&O.onBeforeRender(E,O,Q,S),v=Re.get(O,M.length),v.init(Q),M.push(v),ve.multiplyMatrices(Q.projectionMatrix,Q.matrixWorldInverse),ie.setFromProjectionMatrix(ve,si,Q.reversedDepth),fe=this.localClippingEnabled,he=De.init(this.clippingPlanes,fe),b=be.get(O,y.length),b.init(),y.push(b),Me.enabled===!0&&Me.isPresenting===!0){const Se=E.xr.getDepthSensingMesh();Se!==null&&id(Se,Q,-1/0,E.sortObjects)}id(O,Q,0,E.sortObjects),b.finish(),E.sortObjects===!0&&b.sort(X,Y),Ne=Me.enabled===!1||Me.isPresenting===!1||Me.hasDepthSensing()===!1,Ne&&ye.addToRenderList(b,O),this.info.render.frame++,he===!0&&De.beginShadows();const oe=v.state.shadowsArray;ue.render(oe,O,Q),he===!0&&De.endShadows(),this.info.autoReset===!0&&this.info.reset();const ae=b.opaque,ne=b.transmissive;if(v.setupLights(),Q.isArrayCamera){const Se=Q.cameras;if(ne.length>0)for(let Le=0,Fe=Se.length;Le0&&X0(ae,ne,O,Q),Ne&&ye.render(O),W0(b,O,Q);S!==null&&_===0&&(G.updateMultisampleRenderTarget(S),G.updateRenderTargetMipmap(S)),O.isScene===!0&&O.onAfterRender(E,O,Q),q.resetDefaultState(),D=-1,C=null,M.pop(),M.length>0?(v=M[M.length-1],he===!0&&De.setGlobalState(E.clippingPlanes,v.state.camera)):v=null,y.pop(),y.length>0?b=y[y.length-1]:b=null};function id(O,Q,oe,ae){if(O.visible===!1)return;if(O.layers.test(Q.layers)){if(O.isGroup)oe=O.renderOrder;else if(O.isLOD)O.autoUpdate===!0&&O.update(Q);else if(O.isLight)v.pushLight(O),O.castShadow&&v.pushShadow(O);else if(O.isSprite){if(!O.frustumCulled||ie.intersectsSprite(O)){ae&&Be.setFromMatrixPosition(O.matrixWorld).applyMatrix4(ve);const Le=le.update(O),Fe=O.material;Fe.visible&&b.push(O,Le,Fe,oe,Be.z,null)}}else if((O.isMesh||O.isLine||O.isPoints)&&(!O.frustumCulled||ie.intersectsObject(O))){const Le=le.update(O),Fe=O.material;if(ae&&(O.boundingSphere!==void 0?(O.boundingSphere===null&&O.computeBoundingSphere(),Be.copy(O.boundingSphere.center)):(Le.boundingSphere===null&&Le.computeBoundingSphere(),Be.copy(Le.boundingSphere.center)),Be.applyMatrix4(O.matrixWorld).applyMatrix4(ve)),Array.isArray(Fe)){const Ie=Le.groups;for(let je=0,Ze=Ie.length;je0&&Ol(ne,Q,oe),Se.length>0&&Ol(Se,Q,oe),Le.length>0&&Ol(Le,Q,oe),z.buffers.depth.setTest(!0),z.buffers.depth.setMask(!0),z.buffers.color.setMask(!0),z.setPolygonOffset(!1)}function X0(O,Q,oe,ae){if((oe.isScene===!0?oe.overrideMaterial:null)!==null)return;v.state.transmissionRenderTarget[ae.id]===void 0&&(v.state.transmissionRenderTarget[ae.id]=new pn(1,1,{generateMipmaps:!0,type:U.has("EXT_color_buffer_half_float")||U.has("EXT_color_buffer_float")?Rn:Wn,minFilter:gi,samples:4,stencilBuffer:r,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:it.workingColorSpace}));const Se=v.state.transmissionRenderTarget[ae.id],Le=ae.viewport||B;Se.setSize(Le.z*E.transmissionResolutionScale,Le.w*E.transmissionResolutionScale);const Fe=E.getRenderTarget(),Ie=E.getActiveCubeFace(),je=E.getActiveMipmapLevel();E.setRenderTarget(Se),E.getClearColor(W),j=E.getClearAlpha(),j<1&&E.setClearColor(16777215,.5),E.clear(),Ne&&ye.render(oe);const Ze=E.toneMapping;E.toneMapping=Ni;const We=ae.viewport;if(ae.viewport!==void 0&&(ae.viewport=void 0),v.setupLightsView(ae),he===!0&&De.setGlobalState(E.clippingPlanes,ae),Ol(O,oe,ae),G.updateMultisampleRenderTarget(Se),G.updateRenderTargetMipmap(Se),U.has("WEBGL_multisampled_render_to_texture")===!1){let st=!1;for(let mt=0,Bt=Q.length;mt0),We=!!oe.morphAttributes.position,st=!!oe.morphAttributes.normal,mt=!!oe.morphAttributes.color;let Bt=Ni;ae.toneMapped&&(S===null||S.isXRRenderTarget===!0)&&(Bt=E.toneMapping);const Nt=oe.morphAttributes.position||oe.morphAttributes.normal||oe.morphAttributes.color,vt=Nt!==void 0?Nt.length:0,Xe=J.get(ae),Ct=v.state.lights;if(he===!0&&(fe===!0||O!==C)){const dn=O===C&&ae.id===D;De.setState(ae,O,dn)}let ot=!1;ae.version===Xe.__version?(Xe.needsLights&&Xe.lightsStateVersion!==Ct.state.version||Xe.outputColorSpace!==Fe||ne.isBatchedMesh&&Xe.batching===!1||!ne.isBatchedMesh&&Xe.batching===!0||ne.isBatchedMesh&&Xe.batchingColor===!0&&ne.colorTexture===null||ne.isBatchedMesh&&Xe.batchingColor===!1&&ne.colorTexture!==null||ne.isInstancedMesh&&Xe.instancing===!1||!ne.isInstancedMesh&&Xe.instancing===!0||ne.isSkinnedMesh&&Xe.skinning===!1||!ne.isSkinnedMesh&&Xe.skinning===!0||ne.isInstancedMesh&&Xe.instancingColor===!0&&ne.instanceColor===null||ne.isInstancedMesh&&Xe.instancingColor===!1&&ne.instanceColor!==null||ne.isInstancedMesh&&Xe.instancingMorph===!0&&ne.morphTexture===null||ne.isInstancedMesh&&Xe.instancingMorph===!1&&ne.morphTexture!==null||Xe.envMap!==Ie||ae.fog===!0&&Xe.fog!==Se||Xe.numClippingPlanes!==void 0&&(Xe.numClippingPlanes!==De.numPlanes||Xe.numIntersection!==De.numIntersection)||Xe.vertexAlphas!==je||Xe.vertexTangents!==Ze||Xe.morphTargets!==We||Xe.morphNormals!==st||Xe.morphColors!==mt||Xe.toneMapping!==Bt||Xe.morphTargetsCount!==vt)&&(ot=!0):(ot=!0,Xe.__version=ae.version);let An=Xe.currentProgram;ot===!0&&(An=Fl(ae,Q,ne));let Fr=!1,Cn=!1,Go=!1;const Pt=An.getUniforms(),Mn=Xe.uniforms;if(z.useProgram(An.program)&&(Fr=!0,Cn=!0,Go=!0),ae.id!==D&&(D=ae.id,Cn=!0),Fr||C!==O){z.buffers.depth.getReversed()&&O.reversedDepth!==!0&&(O._reversedDepth=!0,O.updateProjectionMatrix()),Pt.setValue(I,"projectionMatrix",O.projectionMatrix),Pt.setValue(I,"viewMatrix",O.matrixWorldInverse);const wn=Pt.map.cameraPosition;wn!==void 0&&wn.setValue(I,we.setFromMatrixPosition(O.matrixWorld)),k.logarithmicDepthBuffer&&Pt.setValue(I,"logDepthBufFC",2/(Math.log(O.far+1)/Math.LN2)),(ae.isMeshPhongMaterial||ae.isMeshToonMaterial||ae.isMeshLambertMaterial||ae.isMeshBasicMaterial||ae.isMeshStandardMaterial||ae.isShaderMaterial)&&Pt.setValue(I,"isOrthographic",O.isOrthographicCamera===!0),C!==O&&(C=O,Cn=!0,Go=!0)}if(ne.isSkinnedMesh){Pt.setOptional(I,ne,"bindMatrix"),Pt.setOptional(I,ne,"bindMatrixInverse");const dn=ne.skeleton;dn&&(dn.boneTexture===null&&dn.computeBoneTexture(),Pt.setValue(I,"boneTexture",dn.boneTexture,G))}ne.isBatchedMesh&&(Pt.setOptional(I,ne,"batchingTexture"),Pt.setValue(I,"batchingTexture",ne._matricesTexture,G),Pt.setOptional(I,ne,"batchingIdTexture"),Pt.setValue(I,"batchingIdTexture",ne._indirectTexture,G),Pt.setOptional(I,ne,"batchingColorTexture"),ne._colorsTexture!==null&&Pt.setValue(I,"batchingColorTexture",ne._colorsTexture,G));const Vn=oe.morphAttributes;if((Vn.position!==void 0||Vn.normal!==void 0||Vn.color!==void 0)&&Ve.update(ne,oe,An),(Cn||Xe.receiveShadow!==ne.receiveShadow)&&(Xe.receiveShadow=ne.receiveShadow,Pt.setValue(I,"receiveShadow",ne.receiveShadow)),ae.isMeshGouraudMaterial&&ae.envMap!==null&&(Mn.envMap.value=Ie,Mn.flipEnvMap.value=Ie.isCubeTexture&&Ie.isRenderTargetTexture===!1?-1:1),ae.isMeshStandardMaterial&&ae.envMap===null&&Q.environment!==null&&(Mn.envMapIntensity.value=Q.environmentIntensity),Mn.dfgLUT!==void 0&&(Mn.dfgLUT.value=n2()),Cn&&(Pt.setValue(I,"toneMappingExposure",E.toneMappingExposure),Xe.needsLights&&CT(Mn,Go),Se&&ae.fog===!0&&Te.refreshFogUniforms(Mn,Se),Te.refreshMaterialUniforms(Mn,ae,re,Z,v.state.transmissionRenderTarget[O.id]),za.upload(I,q0(Xe),Mn,G)),ae.isShaderMaterial&&ae.uniformsNeedUpdate===!0&&(za.upload(I,q0(Xe),Mn,G),ae.uniformsNeedUpdate=!1),ae.isSpriteMaterial&&Pt.setValue(I,"center",ne.center),Pt.setValue(I,"modelViewMatrix",ne.modelViewMatrix),Pt.setValue(I,"normalMatrix",ne.normalMatrix),Pt.setValue(I,"modelMatrix",ne.matrixWorld),ae.isShaderMaterial||ae.isRawShaderMaterial){const dn=ae.uniformsGroups;for(let wn=0,sd=dn.length;wn0&&G.useMultisampledRTT(O)===!1?ne=J.get(O).__webglMultisampledFramebuffer:Array.isArray(Ze)?ne=Ze[oe]:ne=Ze,B.copy(O.viewport),w.copy(O.scissor),F=O.scissorTest}else B.copy(ge).multiplyScalar(re).floor(),w.copy(pe).multiplyScalar(re).floor(),F=de;if(oe!==0&&(ne=RT),z.bindFramebuffer(I.FRAMEBUFFER,ne)&&ae&&z.drawBuffers(O,ne),z.viewport(B),z.scissor(w),z.setScissorTest(F),Se){const Ie=J.get(O.texture);I.framebufferTexture2D(I.FRAMEBUFFER,I.COLOR_ATTACHMENT0,I.TEXTURE_CUBE_MAP_POSITIVE_X+Q,Ie.__webglTexture,oe)}else if(Le){const Ie=Q;for(let je=0;je=0&&Q<=O.width-ae&&oe>=0&&oe<=O.height-ne&&(O.textures.length>1&&I.readBuffer(I.COLOR_ATTACHMENT0+Fe),I.readPixels(Q,oe,ae,ne,Ge.convert(Ze),Ge.convert(We),Se))}finally{const je=S!==null?J.get(S).__webglFramebuffer:null;z.bindFramebuffer(I.FRAMEBUFFER,je)}}},this.readRenderTargetPixelsAsync=async function(O,Q,oe,ae,ne,Se,Le,Fe=0){if(!(O&&O.isWebGLRenderTarget))throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let Ie=J.get(O).__webglFramebuffer;if(O.isWebGLCubeRenderTarget&&Le!==void 0&&(Ie=Ie[Le]),Ie)if(Q>=0&&Q<=O.width-ae&&oe>=0&&oe<=O.height-ne){z.bindFramebuffer(I.FRAMEBUFFER,Ie);const je=O.textures[Fe],Ze=je.format,We=je.type;if(!k.textureFormatReadable(Ze))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!k.textureTypeReadable(We))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const st=I.createBuffer();I.bindBuffer(I.PIXEL_PACK_BUFFER,st),I.bufferData(I.PIXEL_PACK_BUFFER,Se.byteLength,I.STREAM_READ),O.textures.length>1&&I.readBuffer(I.COLOR_ATTACHMENT0+Fe),I.readPixels(Q,oe,ae,ne,Ge.convert(Ze),Ge.convert(We),0);const mt=S!==null?J.get(S).__webglFramebuffer:null;z.bindFramebuffer(I.FRAMEBUFFER,mt);const Bt=I.fenceSync(I.SYNC_GPU_COMMANDS_COMPLETE,0);return I.flush(),await Og(I,Bt,4),I.bindBuffer(I.PIXEL_PACK_BUFFER,st),I.getBufferSubData(I.PIXEL_PACK_BUFFER,0,Se),I.deleteBuffer(st),I.deleteSync(Bt),Se}else throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")},this.copyFramebufferToTexture=function(O,Q=null,oe=0){const ae=Math.pow(2,-oe),ne=Math.floor(O.image.width*ae),Se=Math.floor(O.image.height*ae),Le=Q!==null?Q.x:0,Fe=Q!==null?Q.y:0;G.setTexture2D(O,0),I.copyTexSubImage2D(I.TEXTURE_2D,oe,0,0,Le,Fe,ne,Se),z.unbindTexture()};const LT=I.createFramebuffer(),DT=I.createFramebuffer();this.copyTextureToTexture=function(O,Q,oe=null,ae=null,ne=0,Se=null){Se===null&&(ne!==0?(Kr("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),Se=ne,ne=0):Se=0);let Le,Fe,Ie,je,Ze,We,st,mt,Bt;const Nt=O.isCompressedTexture?O.mipmaps[Se]:O.image;if(oe!==null)Le=oe.max.x-oe.min.x,Fe=oe.max.y-oe.min.y,Ie=oe.isBox3?oe.max.z-oe.min.z:1,je=oe.min.x,Ze=oe.min.y,We=oe.isBox3?oe.min.z:0;else{const Vn=Math.pow(2,-ne);Le=Math.floor(Nt.width*Vn),Fe=Math.floor(Nt.height*Vn),O.isDataArrayTexture?Ie=Nt.depth:O.isData3DTexture?Ie=Math.floor(Nt.depth*Vn):Ie=1,je=0,Ze=0,We=0}ae!==null?(st=ae.x,mt=ae.y,Bt=ae.z):(st=0,mt=0,Bt=0);const vt=Ge.convert(Q.format),Xe=Ge.convert(Q.type);let Ct;Q.isData3DTexture?(G.setTexture3D(Q,0),Ct=I.TEXTURE_3D):Q.isDataArrayTexture||Q.isCompressedArrayTexture?(G.setTexture2DArray(Q,0),Ct=I.TEXTURE_2D_ARRAY):(G.setTexture2D(Q,0),Ct=I.TEXTURE_2D),I.pixelStorei(I.UNPACK_FLIP_Y_WEBGL,Q.flipY),I.pixelStorei(I.UNPACK_PREMULTIPLY_ALPHA_WEBGL,Q.premultiplyAlpha),I.pixelStorei(I.UNPACK_ALIGNMENT,Q.unpackAlignment);const ot=I.getParameter(I.UNPACK_ROW_LENGTH),An=I.getParameter(I.UNPACK_IMAGE_HEIGHT),Fr=I.getParameter(I.UNPACK_SKIP_PIXELS),Cn=I.getParameter(I.UNPACK_SKIP_ROWS),Go=I.getParameter(I.UNPACK_SKIP_IMAGES);I.pixelStorei(I.UNPACK_ROW_LENGTH,Nt.width),I.pixelStorei(I.UNPACK_IMAGE_HEIGHT,Nt.height),I.pixelStorei(I.UNPACK_SKIP_PIXELS,je),I.pixelStorei(I.UNPACK_SKIP_ROWS,Ze),I.pixelStorei(I.UNPACK_SKIP_IMAGES,We);const Pt=O.isDataArrayTexture||O.isData3DTexture,Mn=Q.isDataArrayTexture||Q.isData3DTexture;if(O.isDepthTexture){const Vn=J.get(O),dn=J.get(Q),wn=J.get(Vn.__renderTarget),sd=J.get(dn.__renderTarget);z.bindFramebuffer(I.READ_FRAMEBUFFER,wn.__webglFramebuffer),z.bindFramebuffer(I.DRAW_FRAMEBUFFER,sd.__webglFramebuffer);for(let Ds=0;DsMath.PI&&(n-=vn),i<-Math.PI?i+=vn:i>Math.PI&&(i-=vn),n<=i?this._spherical.theta=Math.max(n,Math.min(i,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(n+i)/2?Math.max(n,this._spherical.theta):Math.min(i,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let r=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const o=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),r=o!=this._spherical.radius}if(Ft.setFromSpherical(this._spherical),Ft.applyQuaternion(this._quatInverse),this.engine&&this.engine.DeviceType==="PC"){const o=new P;if(o.copy(this.origin).sub(this.target),o.lengthSq()>1e-4&&(this._sphericalDelta.theta!==0||this._sphericalDelta.phi!==0)){const a=this.enableDamping?this.dampingFactor*3:1,l=new P(0,1,0),c=new P;this.object.getWorldDirection(c);const h=c.clone().cross(l).normalize(),u=new P().copy(this.object.position).sub(this.origin);u.applyAxisAngle(l,Math.PI*this._sphericalDelta.theta*a),u.applyAxisAngle(h,Math.PI*this._sphericalDelta.phi*a),t.copy(this.origin).add(u);const d=new P().copy(this.target).sub(this.origin);d.applyAxisAngle(l,Math.PI*this._sphericalDelta.theta*a),d.applyAxisAngle(h,Math.PI*this._sphericalDelta.phi*a),this.target.copy(this.origin).add(d)}else if(this._panOffset.lengthSq()===0&&this._sphericalDelta.phi===0&&this._sphericalDelta.theta===0){if(this._scale!==1){const a=new P;this.object.getWorldDirection(a);const l=this._spherical.radius*.05*(this._scale-1);t.add(a.multiplyScalar(l))}}else t.copy(this.target).add(Ft);this.object.lookAt(this.target)}else t.copy(this.target).add(Ft),this.object.lookAt(this.target);if(this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let o=null;if(this.object.isPerspectiveCamera){const a=Ft.length();o=this._clampDistance(a*this._scale);const l=a-o;this.object.position.addScaledVector(this._dollyDirection,l),this.object.updateMatrixWorld(),r=!!l}else if(this.object.isOrthographicCamera){const a=new P(this._mouse.x,this._mouse.y,0);a.unproject(this.object);const l=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),r=l!==this.object.zoom;const c=new P(this._mouse.x,this._mouse.y,0);c.unproject(this.object),this.object.position.sub(c).add(a),this.object.updateMatrixWorld(),o=Ft.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;o!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(o).add(this.object.position):(Va.origin.copy(this.object.position),Va.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(Va.direction))jh||8*(1-this._lastQuaternion.dot(this.object.quaternion))>jh||this._lastTargetPosition.distanceToSquared(this.target)>jh?(this.dispatchEvent(Ip),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(e){return e!==null?vn/60*this.autoRotateSpeed*e:vn/60/60*this.autoRotateSpeed}_getZoomScale(e){const t=Math.abs(e*.01);return Math.pow(.95,this.zoomSpeed*t)}_rotateLeft(e){this._sphericalDelta.theta-=e}_rotateUp(e){this._sphericalDelta.phi-=e}_panLeft(e,t){Ft.setFromMatrixColumn(t,0),Ft.multiplyScalar(-e),this._panOffset.add(Ft)}_panUp(e,t){this.screenSpacePanning===!0?Ft.setFromMatrixColumn(t,1):(Ft.setFromMatrixColumn(t,0),Ft.crossVectors(this.object.up,Ft)),Ft.multiplyScalar(e),this._panOffset.add(Ft)}_pan(e,t){const n=this.domElement;if(this.object.isPerspectiveCamera){const i=this.object.position;Ft.copy(i).sub(this.target);let r=Ft.length();r*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*e*r/n.clientHeight,this.object.matrix),this._panUp(2*t*r/n.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(e*(this.object.right-this.object.left)/this.object.zoom/n.clientWidth,this.object.matrix),this._panUp(t*(this.object.top-this.object.bottom)/this.object.zoom/n.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(e,t){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const n=this.domElement.getBoundingClientRect(),i=e-n.left,r=t-n.top,o=n.width,a=n.height;this._mouse.x=i/o*2-1,this._mouse.y=-(r/a)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(e){return Math.max(this.minDistance,Math.min(this.maxDistance,e))}_handleMouseDownRotate(e){this._rotateStart.set(e.clientX,e.clientY)}_handleMouseDownDolly(e){this._updateZoomParameters(e.clientX,e.clientX),this._dollyStart.set(e.clientX,e.clientY)}_handleMouseDownPan(e){this._panStart.set(e.clientX,e.clientY)}_handleMouseMoveRotate(e){this._rotateEnd.set(e.clientX,e.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const t=this.domElement;this._rotateLeft(vn*this._rotateDelta.x/t.clientHeight),this._rotateUp(vn*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(e){this._dollyEnd.set(e.clientX,e.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(e){this._panEnd.set(e.clientX,e.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(e){this._updateZoomParameters(e.clientX,e.clientY),e.deltaY<0?this._dollyIn(this._getZoomScale(e.deltaY)):e.deltaY>0&&this._dollyOut(this._getZoomScale(e.deltaY)),this.update()}_handleKeyDown(e){let t=!1;switch(e.code){case this.keys.UP:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(vn*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),t=!0;break;case this.keys.BOTTOM:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(-vn*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),t=!0;break;case this.keys.LEFT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(vn*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),t=!0;break;case this.keys.RIGHT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(-vn*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),t=!0;break}t&&(e.preventDefault(),this.update())}_handleTouchStartRotate(e){if(this._pointers.length===1)this._rotateStart.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),n=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._rotateStart.set(n,i)}}_handleTouchStartPan(e){if(this._pointers.length===1)this._panStart.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),n=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._panStart.set(n,i)}}_handleTouchStartDolly(e){const t=this._getSecondPointerPosition(e),n=e.pageX-t.x,i=e.pageY-t.y,r=Math.sqrt(n*n+i*i);this._dollyStart.set(0,r)}_handleTouchStartDollyPan(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enablePan&&this._handleTouchStartPan(e)}_handleTouchStartDollyRotate(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enableRotate&&this._handleTouchStartRotate(e)}_handleTouchMoveRotate(e){if(this._pointers.length==1)this._rotateEnd.set(e.pageX,e.pageY);else{const n=this._getSecondPointerPosition(e),i=.5*(e.pageX+n.x),r=.5*(e.pageY+n.y);this._rotateEnd.set(i,r)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const t=this.domElement;this._rotateLeft(vn*this._rotateDelta.x/t.clientHeight),this._rotateUp(vn*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(e){if(this._pointers.length===1)this._panEnd.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),n=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._panEnd.set(n,i)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(e){const t=this._getSecondPointerPosition(e),n=e.pageX-t.x,i=e.pageY-t.y,r=Math.sqrt(n*n+i*i);this._dollyEnd.set(0,r),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const o=(e.pageX+t.x)*.5,a=(e.pageY+t.y)*.5;this._updateZoomParameters(o,a)}_handleTouchMoveDollyPan(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enablePan&&this._handleTouchMovePan(e)}_handleTouchMoveDollyRotate(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enableRotate&&this._handleTouchMoveRotate(e)}_addPointer(e){this._pointers.push(e.pointerId)}_removePointer(e){delete this._pointerPositions[e.pointerId];for(let t=0;te}set colliders(e){this._rayCastObjects=e}set enabled(e){this._isEnabled!==e&&(this._isEnabled=e,this._euler.setFromQuaternion(this.camera.quaternion),e?this.addEvents():this.removeEvents())}get enabled(){return this._isEnabled}addEvents(){const e=this._Engine?.DeviceType,t=e==="PC"||!e;console.log("[FirstPersonCameraControl] addEvents - DeviceType:",e,"isPC:",t),t?(console.log("[FirstPersonCameraControl] 添加鼠标事件监听器 - mousedown, mouseup"),this.domElement.addEventListener("mousedown",this.bindmousedown,!1),this.domElement.addEventListener("mouseup",this.bindmouseup,!1)):(console.log("[FirstPersonCameraControl] 添加触摸事件监听器"),this.domElement.addEventListener("touchstart",this.bindmousedown,!1),this.domElement.addEventListener("touchend",this.bindmouseup,!1)),window.addEventListener("keydown",this.bindonKeyDown,!1),window.addEventListener("keyup",this.bindonKeyUp,!1),this.needMousewheel&&(document.addEventListener&&document.addEventListener("DOMMouseScroll",this.bindMousewheel,!1),window.addEventListener("mousewheel",this.bindMousewheel,!1))}removeEvents(){this._Engine&&this._Engine.DeviceType!=="PC"?(this.domElement.removeEventListener("touchstart",this.bindmousedown),this.domElement.removeEventListener("touchend",this.bindmouseup),this.domElement.removeEventListener("touchmove",this.bindmousemove)):(this.domElement.removeEventListener("mousedown",this.bindmousedown),this.domElement.removeEventListener("mouseup",this.bindmouseup),this.domElement.removeEventListener("mousemove",this.bindmousemove)),window.removeEventListener("keydown",this.bindonKeyDown),window.removeEventListener("keyup",this.bindonKeyUp),this.needMousewheel&&(document.addEventListener&&document.removeEventListener("DOMMouseScroll",this.bindMousewheel),window.removeEventListener("mousewheel",this.bindMousewheel))}onMousewheel(e){debugger;let t;switch(e.wheelDelta?(e.wheelDelta>0&&(t="up"),e.wheelDelta<0&&(t="down")):e.detail&&(e.detail<0&&(t="up"),e.detail>0&&(t="down")),t){case"up":this._camerLocalDirection.z=1;break;case"down":this._camerLocalDirection.z=-1;break}this.moveWheelRun==!0?(this.moveWheelRun=!1,this.moveWheelStop=!0,this.wheelClock=setTimeout(()=>{this.moveWheelStop==!0&&(this.moveWheelStop=!1,this.moveWheelRun=!0,this._camerLocalDirection.z=0)},200)):(clearTimeout(this.wheelClock),this.wheelClock=setTimeout(()=>{this.moveWheelStop==!0&&(this.moveWheelStop=!1,this.moveWheelRun=!0,this._camerLocalDirection.z=0)},150))}onMouseDown(e){console.log("[FirstPersonCameraControl] onMouseDown 被调用",e),this.domElement.addEventListener("mousemove",this.bindmousemove,!1),this._prevMouseX=e.screenX,this._prevMouseY=e.screenY}onMouseMove(e){if(this._isEnabled==!1)return;let t=this._prevMouseX?e.screenX-this._prevMouseX:0,n=this._prevMouseY?e.screenY-this._prevMouseY:0,i=this._euler.x-n*this.lookflag*this.lookSpeed;i>=0?i-this.maxRotateX?this._euler.x=i:this._euler.x=-this.maxRotateX,this._euler.y-=t*this.lookSpeed,this.camera.quaternion.setFromEuler(this._euler),this._prevMouseX=e.screenX,this._prevMouseY=e.screenY;let r=this.GetEngine();r.movefirst=!0;var o=new CustomEvent("bimengine:camerachange",{detail:""});window.dispatchEvent(o)}onMouseUp(e){let t=this.GetEngine();t.movefirst=!1,this.domElement.removeEventListener("mousemove",this.bindmousemove)}onTouchStart(e){this.domElement.addEventListener("touchmove",this.bindmousemove,!1),this._prevMouseX=e.targetTouches[0].clientX,this._prevMouseY=e.targetTouches[0].clientY}onTouchMove(e){if(this._isEnabled==!1)return;let t=this._prevMouseX?e.targetTouches[0].clientX-this._prevMouseX:0,n=this._prevMouseY?e.targetTouches[0].clientY-this._prevMouseY:0,i=this._euler.x-n*this.lookflag*this.lookSpeed;i>=0?i-this.maxRotateX?this._euler.x=i:this._euler.x=-this.maxRotateX,this._euler.y-=t*this.lookSpeed,this.camera.quaternion.setFromEuler(this._euler),this._prevMouseX=e.targetTouches[0].clientX,this._prevMouseY=e.targetTouches[0].clientY;let r=this.GetEngine();r.movefirst=!0;var o=new CustomEvent("bimengine:camerachange",{detail:""});window.dispatchEvent(o)}onTouchEnd(e){let t=this.GetEngine();t.movefirst=!1,this.domElement.removeEventListener("touchmove",this.bindmousemove)}onKeyDown(e){var t=new CustomEvent("bimengine:camerachange",{detail:""});let n=this.GetEngine();switch(n.movefirst=!0,window.dispatchEvent(t),e.keyCode){case 38:this.rotateY(-1);break;case 81:this.keydown=!0,this._camerLocalDirection.y=1;break;case 69:this._camerLocalDirection.y=-1;break;case 87:this._camerLocalDirection.z=1;break;case 37:this.rotateX(-1);break;case 65:this._camerLocalDirection.x=-1;break;case 40:this.rotateY(1);break;case 83:this._camerLocalDirection.z=-1;break;case 39:this.rotateX(1);break;case 68:this._camerLocalDirection.x=1;break}}onKeyUp(e){let t=this.GetEngine();switch(t.movefirst=!1,e.keyCode){case 38:case 87:this._camerLocalDirection.z=0;break;case 37:case 65:this._camerLocalDirection.x=0;break;case 40:case 83:this._camerLocalDirection.z=0;break;case 39:case 68:this._camerLocalDirection.x=0;break;case 81:case 69:this.keydown=!1,this._camerLocalDirection.y=0;break}}rotateX(e){this._euler.y-=e*this.lookSpeed,this.camera.quaternion.setFromEuler(this._euler)}rotateY(e){let t=this._euler.x-e*this.lookflag*.5*this.lookSpeed;t>=0?t-this.maxRotateX?this._euler.x=t:this._euler.x=-this.maxRotateX,this.camera.quaternion.setFromEuler(this._euler)}update(){this.keydown||this.gravityTest(),this.collisionTest()}gravityTest(){if(this.applyGravity){let e=!0;this._fallingTime+=.01,this._tmpVector.set(0,-1,0);const t=this.hitTest();if(t){const n=t.point.add(new P(0,this.playerHeight,0));if(this.positionEasing){if(n.y>=this.camera.position.y||n.y-this.camera.position.y<.2){this.setCameraHeight(this.camera.position.y+(n.y-this.camera.position.y)*.08),this._fallingTime=0,e=!1;return}}else t.distanceR[0]).forEach(R=>{let _=new P(R.X,R.Z,-R.Y),S=s.worldToScreen.worldToScreen(_),D=Math.sqrt(Math.pow(S.x-d.offsetX,2)+Math.pow(S.y-d.offsetY,2));D0?(b.sort((R,_)=>R.distance-_.distance),m="point"):(x[2].forEach(R=>{let _=new P(R[0].X,R[0].Z,-R[0].Y),S=new P(R[1].X,R[1].Z,-R[1].Y),D=s.worldToScreen.worldToScreen(_),C=s.worldToScreen.worldToScreen(S),B=M(new ce(d.offsetX,d.offsetY),D,C);if(B0&&(v.sort((R,_)=>R.distance-_.distance),m="line")),m=="point"&&e.options.showCatch){const R=s.worldToScreen.worldToScreen(b[0].point);console.log("捕捉点屏幕坐标:",R.x,R.y),console.log("Canvas尺寸:",s.renderer.domElement.width,s.renderer.domElement.height),console.log("SVG尺寸:",s.catchSvg.clientWidth,s.catchSvg.clientHeight),s.catchSvg.innerHTML="";const _=document.createElementNS("http://www.w3.org/2000/svg","circle");_.setAttribute("class","catchPoint"),_.setAttribute("cx",(R.x+s.reactBoundingClientRect.left).toString()),_.setAttribute("cy",(R.y+s.reactBoundingClientRect.top).toString()),_.setAttribute("r","5"),_.setAttribute("fill","rgb(0, 255, 247)"),s.catchSvg.appendChild(_)}else if(m=="line"&&e.options.showCatch){const R=s.worldToScreen.worldToScreen(v[0].point),_=v[0].start,S=v[0].end;console.log("捕捉点屏幕坐标:",R.x,R.y),console.log("Canvas尺寸:",s.renderer.domElement.width,s.renderer.domElement.height),console.log("SVG尺寸:",s.catchSvg.clientWidth,s.catchSvg.clientHeight),s.catchSvg.innerHTML="";const D=document.createElementNS("http://www.w3.org/2000/svg","line");D.setAttribute("class","catchLine"),D.setAttribute("x1",(_.x+s.reactBoundingClientRect.left).toString()),D.setAttribute("y1",(_.y+s.reactBoundingClientRect.top).toString()),D.setAttribute("x2",(S.x+s.reactBoundingClientRect.left).toString()),D.setAttribute("y2",(S.y+s.reactBoundingClientRect.top).toString()),D.setAttribute("stroke","rgb(0, 255, 247)"),D.setAttribute("stroke-width","2"),s.catchSvg.appendChild(D)}else if(m=="face"&&e.options.showCatch){let R=f[0].point.clone(),_=f[0].normal||(f[0].face?f[0].face.normal:null);const S=(_?_.clone():new P(0,0,1)).normalize(),D=Math.abs(S.y)<.9?new P(0,1,0):new P(1,0,0),C=new P().crossVectors(S,D).normalize(),B=new P().crossVectors(S,C).normalize(),w=.05,F=[new P().copy(C).add(B).multiplyScalar(w),new P().copy(C).sub(B).multiplyScalar(w),new P().copy(C).multiplyScalar(-1).sub(B).multiplyScalar(w),new P().copy(C).multiplyScalar(-1).add(B).multiplyScalar(w)].map(j=>new P().copy(R).add(j)).map(j=>s.worldToScreen.worldToScreen(j));s.catchSvg.innerHTML="";const W=document.createElementNS("http://www.w3.org/2000/svg","polygon");W.setAttribute("class","catchFace"),W.setAttribute("points",F.map(j=>`${j.x+s.reactBoundingClientRect.left},${j.y+s.reactBoundingClientRect.top}`).join(" ")),W.setAttribute("fill","rgba(1, 238, 255, 0.2)"),W.setAttribute("stroke","rgb(0, 255, 247)"),W.setAttribute("stroke-width","1"),s.catchSvg.appendChild(W)}return f[0];function M(R,_,S){const D=new ce().subVectors(S,_),C=D.lengthSq();if(C<1e-10)return R.distanceTo(_);const B=new ce().subVectors(R,_),w=Qr.clamp(B.dot(D)/C,0,1),F=new ce().copy(D).multiplyScalar(w).add(_);return R.distanceTo(F)}function E(R,_,S){const D=new ce().subVectors(S,_),C=D.lengthSq();if(C<1e-10)return 0;const B=new ce().subVectors(R,_);return Qr.clamp(B.dot(D)/C,0,1)}function A(R,_,S){const D=Qr.clamp(R,0,1);return new P().lerpVectors(_,S,D)}}return e}class _2{engine;orbitControls;firstPersonControls;isActive=!0;originDiv=null;handelBehaved;isDragging=!1;isDown=!1;containerOffset={left:0,top:0};constructor(e){this.engine=e,this.init(),this.handelBehaved=qh(this.engine),this.handelBehaved.init(this,null),this.handelBehaved.active()}init(){this.orbitControls=new l2(this.engine,this.engine.camera,this.engine.renderer.domElement),this.orbitControls.showOriginIcon=!0,this.firstPersonControls=new kp(this.engine,this.engine.camera,this.engine.renderer.domElement);const e=document.createElement("div");this.originDiv=e,e.className="originDiv",e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.style.width="30px",e.style.height="30px",e.style.borderRadius="50%",e.style.pointerEvents="none",e.style.backgroundImage="url(./assets/svg/rotate-orbit.svg)",this.engine.container.appendChild(this.originDiv)}active(){this.isActive=!0,this.orbitControls.enabled=!0}disActive(){this.isActive=!1,this.orbitControls.enabled=!1}switchFirstPersonMode(){this.firstPersonControls=new kp(this.engine,this.engine.camera,this.engine.renderer.domElement,[]),this.orbitControls.enabled=!1,this.firstPersonControls.enabled=!0,this.firstPersonControls.isActive=!0}switchDefaultMode(){this.firstPersonControls&&(this.firstPersonControls.enabled=!1),this.orbitControls.enabled=!0}handleMouseUp(e){this.isDragging=!1,this.isDown=!1}handleMouseMove(e){this.isDown?this.isDragging=!0:this.isDragging=!1}handleMouseDown(e){this.isDown=!0}handleMouseClick(e){this.isDragging=!1,this.isDown=!1}update(){if(this.firstPersonControls.enabled&&this.firstPersonControls.update(),this.orbitControls.enabled){const e=this.engine.controlModule.orbitControls.origin,t=this.engine.worldToScreen.worldToScreen(e);this.originDiv&&this.isDragging?(this.originDiv.style.left=t.x-15+this.engine.reactBoundingClientRect.left+"px",this.originDiv.style.top=t.y-15+this.engine.reactBoundingClientRect.top+"px",this.originDiv.style.display="block"):this.originDiv&&(this.originDiv.style.display="none")}}}const gs={name:"CopyShader",uniforms:{tDiffuse:{value:null},opacity:{value:1}},vertexShader:` +}`;class Y_{constructor(){this.texture=null,this.mesh=null,this.depthNear=0,this.depthFar=0}init(e,t){if(this.texture===null){const n=new Pf(e.texture);(e.depthNear!==t.depthNear||e.depthFar!==t.depthFar)&&(this.depthNear=e.depthNear,this.depthFar=e.depthFar),this.texture=n}}getMesh(e){if(this.texture!==null&&this.mesh===null){const t=e.cameras[0].viewport,n=new kt({vertexShader:q_,fragmentShader:Z_,uniforms:{depthColor:{value:this.texture},depthWidth:{value:t.z},depthHeight:{value:t.w}}});this.mesh=new ut(new bo(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class K_ extends ns{constructor(e,t){super();const n=this;let i=null,r=1,o=null,a="local-floor",l=1,c=null,h=null,u=null,d=null,f=null,p=null;const g=typeof XRWebGLBinding<"u",x=new Y_,m={},b=t.getContextAttributes();let v=null,y=null;const M=[],E=[],A=new ce;let R=null;const _=new sn;_.viewport=new tt;const S=new sn;S.viewport=new tt;const D=[_,S],C=new kv;let B=null,w=null;this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(ie){let he=M[ie];return he===void 0&&(he=new hh,M[ie]=he),he.getTargetRaySpace()},this.getControllerGrip=function(ie){let he=M[ie];return he===void 0&&(he=new hh,M[ie]=he),he.getGripSpace()},this.getHand=function(ie){let he=M[ie];return he===void 0&&(he=new hh,M[ie]=he),he.getHandSpace()};function F(ie){const he=E.indexOf(ie.inputSource);if(he===-1)return;const fe=M[he];fe!==void 0&&(fe.update(ie.inputSource,ie.frame,c||o),fe.dispatchEvent({type:ie.type,data:ie.inputSource}))}function W(){i.removeEventListener("select",F),i.removeEventListener("selectstart",F),i.removeEventListener("selectend",F),i.removeEventListener("squeeze",F),i.removeEventListener("squeezestart",F),i.removeEventListener("squeezeend",F),i.removeEventListener("end",W),i.removeEventListener("inputsourceschange",j);for(let ie=0;ie=0&&(E[ve]=null,M[ve].disconnect(fe))}for(let he=0;he=E.length){E.push(fe),ve=Be;break}else if(E[Be]===null){E[Be]=fe,ve=Be;break}if(ve===-1)break}const we=M[ve];we&&we.connect(fe)}}const $=new P,Z=new P;function re(ie,he,fe){$.setFromMatrixPosition(he.matrixWorld),Z.setFromMatrixPosition(fe.matrixWorld);const ve=$.distanceTo(Z),we=he.projectionMatrix.elements,Be=fe.projectionMatrix.elements,Je=we[14]/(we[10]-1),Ne=we[14]/(we[10]+1),T=(we[9]+1)/we[5],I=(we[9]-1)/we[5],V=(we[8]-1)/we[0],U=(Be[8]+1)/Be[0],k=Je*V,z=Je*U,ee=ve/(-V+U),J=ee*-V;if(he.matrixWorld.decompose(ie.position,ie.quaternion,ie.scale),ie.translateX(J),ie.translateZ(ee),ie.matrixWorld.compose(ie.position,ie.quaternion,ie.scale),ie.matrixWorldInverse.copy(ie.matrixWorld).invert(),we[10]===-1)ie.projectionMatrix.copy(he.projectionMatrix),ie.projectionMatrixInverse.copy(he.projectionMatrixInverse);else{const G=Je+ee,N=Ne+ee,L=k-J,H=z+(ve-J),K=T*Ne/N*G,le=I*Ne/N*G;ie.projectionMatrix.makePerspective(L,H,K,le,G,N),ie.projectionMatrixInverse.copy(ie.projectionMatrix).invert()}}function X(ie,he){he===null?ie.matrixWorld.copy(ie.matrix):ie.matrixWorld.multiplyMatrices(he.matrixWorld,ie.matrix),ie.matrixWorldInverse.copy(ie.matrixWorld).invert()}this.updateCamera=function(ie){if(i===null)return;let he=ie.near,fe=ie.far;x.texture!==null&&(x.depthNear>0&&(he=x.depthNear),x.depthFar>0&&(fe=x.depthFar)),C.near=S.near=_.near=he,C.far=S.far=_.far=fe,(B!==C.near||w!==C.far)&&(i.updateRenderState({depthNear:C.near,depthFar:C.far}),B=C.near,w=C.far),C.layers.mask=ie.layers.mask|6,_.layers.mask=C.layers.mask&3,S.layers.mask=C.layers.mask&5;const ve=ie.parent,we=C.cameras;X(C,ve);for(let Be=0;Be0&&(x.alphaTest.value=m.alphaTest);const b=e.get(m),v=b.envMap,y=b.envMapRotation;v&&(x.envMap.value=v,ms.copy(y),ms.x*=-1,ms.y*=-1,ms.z*=-1,v.isCubeTexture&&v.isRenderTargetTexture===!1&&(ms.y*=-1,ms.z*=-1),x.envMapRotation.value.setFromMatrix4($_.makeRotationFromEuler(ms)),x.flipEnvMap.value=v.isCubeTexture&&v.isRenderTargetTexture===!1?-1:1,x.reflectivity.value=m.reflectivity,x.ior.value=m.ior,x.refractionRatio.value=m.refractionRatio),m.lightMap&&(x.lightMap.value=m.lightMap,x.lightMapIntensity.value=m.lightMapIntensity,t(m.lightMap,x.lightMapTransform)),m.aoMap&&(x.aoMap.value=m.aoMap,x.aoMapIntensity.value=m.aoMapIntensity,t(m.aoMap,x.aoMapTransform))}function o(x,m){x.diffuse.value.copy(m.color),x.opacity.value=m.opacity,m.map&&(x.map.value=m.map,t(m.map,x.mapTransform))}function a(x,m){x.dashSize.value=m.dashSize,x.totalSize.value=m.dashSize+m.gapSize,x.scale.value=m.scale}function l(x,m,b,v){x.diffuse.value.copy(m.color),x.opacity.value=m.opacity,x.size.value=m.size*b,x.scale.value=v*.5,m.map&&(x.map.value=m.map,t(m.map,x.uvTransform)),m.alphaMap&&(x.alphaMap.value=m.alphaMap,t(m.alphaMap,x.alphaMapTransform)),m.alphaTest>0&&(x.alphaTest.value=m.alphaTest)}function c(x,m){x.diffuse.value.copy(m.color),x.opacity.value=m.opacity,x.rotation.value=m.rotation,m.map&&(x.map.value=m.map,t(m.map,x.mapTransform)),m.alphaMap&&(x.alphaMap.value=m.alphaMap,t(m.alphaMap,x.alphaMapTransform)),m.alphaTest>0&&(x.alphaTest.value=m.alphaTest)}function h(x,m){x.specular.value.copy(m.specular),x.shininess.value=Math.max(m.shininess,1e-4)}function u(x,m){m.gradientMap&&(x.gradientMap.value=m.gradientMap)}function d(x,m){x.metalness.value=m.metalness,m.metalnessMap&&(x.metalnessMap.value=m.metalnessMap,t(m.metalnessMap,x.metalnessMapTransform)),x.roughness.value=m.roughness,m.roughnessMap&&(x.roughnessMap.value=m.roughnessMap,t(m.roughnessMap,x.roughnessMapTransform)),m.envMap&&(x.envMapIntensity.value=m.envMapIntensity)}function f(x,m,b){x.ior.value=m.ior,m.sheen>0&&(x.sheenColor.value.copy(m.sheenColor).multiplyScalar(m.sheen),x.sheenRoughness.value=m.sheenRoughness,m.sheenColorMap&&(x.sheenColorMap.value=m.sheenColorMap,t(m.sheenColorMap,x.sheenColorMapTransform)),m.sheenRoughnessMap&&(x.sheenRoughnessMap.value=m.sheenRoughnessMap,t(m.sheenRoughnessMap,x.sheenRoughnessMapTransform))),m.clearcoat>0&&(x.clearcoat.value=m.clearcoat,x.clearcoatRoughness.value=m.clearcoatRoughness,m.clearcoatMap&&(x.clearcoatMap.value=m.clearcoatMap,t(m.clearcoatMap,x.clearcoatMapTransform)),m.clearcoatRoughnessMap&&(x.clearcoatRoughnessMap.value=m.clearcoatRoughnessMap,t(m.clearcoatRoughnessMap,x.clearcoatRoughnessMapTransform)),m.clearcoatNormalMap&&(x.clearcoatNormalMap.value=m.clearcoatNormalMap,t(m.clearcoatNormalMap,x.clearcoatNormalMapTransform),x.clearcoatNormalScale.value.copy(m.clearcoatNormalScale),m.side===on&&x.clearcoatNormalScale.value.negate())),m.dispersion>0&&(x.dispersion.value=m.dispersion),m.iridescence>0&&(x.iridescence.value=m.iridescence,x.iridescenceIOR.value=m.iridescenceIOR,x.iridescenceThicknessMinimum.value=m.iridescenceThicknessRange[0],x.iridescenceThicknessMaximum.value=m.iridescenceThicknessRange[1],m.iridescenceMap&&(x.iridescenceMap.value=m.iridescenceMap,t(m.iridescenceMap,x.iridescenceMapTransform)),m.iridescenceThicknessMap&&(x.iridescenceThicknessMap.value=m.iridescenceThicknessMap,t(m.iridescenceThicknessMap,x.iridescenceThicknessMapTransform))),m.transmission>0&&(x.transmission.value=m.transmission,x.transmissionSamplerMap.value=b.texture,x.transmissionSamplerSize.value.set(b.width,b.height),m.transmissionMap&&(x.transmissionMap.value=m.transmissionMap,t(m.transmissionMap,x.transmissionMapTransform)),x.thickness.value=m.thickness,m.thicknessMap&&(x.thicknessMap.value=m.thicknessMap,t(m.thicknessMap,x.thicknessMapTransform)),x.attenuationDistance.value=m.attenuationDistance,x.attenuationColor.value.copy(m.attenuationColor)),m.anisotropy>0&&(x.anisotropyVector.value.set(m.anisotropy*Math.cos(m.anisotropyRotation),m.anisotropy*Math.sin(m.anisotropyRotation)),m.anisotropyMap&&(x.anisotropyMap.value=m.anisotropyMap,t(m.anisotropyMap,x.anisotropyMapTransform))),x.specularIntensity.value=m.specularIntensity,x.specularColor.value.copy(m.specularColor),m.specularColorMap&&(x.specularColorMap.value=m.specularColorMap,t(m.specularColorMap,x.specularColorMapTransform)),m.specularIntensityMap&&(x.specularIntensityMap.value=m.specularIntensityMap,t(m.specularIntensityMap,x.specularIntensityMapTransform))}function p(x,m){m.matcap&&(x.matcap.value=m.matcap)}function g(x,m){const b=e.get(m).light;x.referencePosition.value.setFromMatrixPosition(b.matrixWorld),x.nearDistance.value=b.shadow.camera.near,x.farDistance.value=b.shadow.camera.far}return{refreshFogUniforms:n,refreshMaterialUniforms:i}}function Q_(s,e,t,n){let i={},r={},o=[];const a=s.getParameter(s.MAX_UNIFORM_BUFFER_BINDINGS);function l(b,v){const y=v.program;n.uniformBlockBinding(b,y)}function c(b,v){let y=i[b.id];y===void 0&&(p(b),y=h(b),i[b.id]=y,b.addEventListener("dispose",x));const M=v.program;n.updateUBOMapping(b,M);const E=e.render.frame;r[b.id]!==E&&(d(b),r[b.id]=E)}function h(b){const v=u();b.__bindingPointIndex=v;const y=s.createBuffer(),M=b.__size,E=b.usage;return s.bindBuffer(s.UNIFORM_BUFFER,y),s.bufferData(s.UNIFORM_BUFFER,M,E),s.bindBuffer(s.UNIFORM_BUFFER,null),s.bindBufferBase(s.UNIFORM_BUFFER,v,y),y}function u(){for(let b=0;b0&&(y+=M-E),b.__size=y,b.__cache={},this}function g(b){const v={boundary:0,storage:0};return typeof b=="number"||typeof b=="boolean"?(v.boundary=4,v.storage=4):b.isVector2?(v.boundary=8,v.storage=8):b.isVector3||b.isColor?(v.boundary=16,v.storage=12):b.isVector4?(v.boundary=16,v.storage=16):b.isMatrix3?(v.boundary=48,v.storage=48):b.isMatrix4?(v.boundary=64,v.storage=64):b.isTexture?He("WebGLRenderer: Texture samplers can not be part of an uniforms group."):He("WebGLRenderer: Unsupported uniform value type.",b),v}function x(b){const v=b.target;v.removeEventListener("dispose",x);const y=o.indexOf(v.__bindingPointIndex);o.splice(y,1),s.deleteBuffer(i[v.id]),delete i[v.id],delete r[v.id]}function m(){for(const b in i)s.deleteBuffer(i[b]);o=[],i={},r={}}return{bind:l,update:c,dispose:m}}const e2=new Uint16Array([11481,15204,11534,15171,11808,15015,12385,14843,12894,14716,13396,14600,13693,14483,13976,14366,14237,14171,14405,13961,14511,13770,14605,13598,14687,13444,14760,13305,14822,13066,14876,12857,14923,12675,14963,12517,14997,12379,15025,12230,15049,12023,15070,11843,15086,11687,15100,11551,15111,11433,15120,11330,15127,11217,15132,11060,15135,10922,15138,10801,15139,10695,15139,10600,13012,14923,13020,14917,13064,14886,13176,14800,13349,14666,13513,14526,13724,14398,13960,14230,14200,14020,14383,13827,14488,13651,14583,13491,14667,13348,14740,13132,14803,12908,14856,12713,14901,12542,14938,12394,14968,12241,14992,12017,15010,11822,15024,11654,15034,11507,15041,11380,15044,11269,15044,11081,15042,10913,15037,10764,15031,10635,15023,10520,15014,10419,15003,10330,13657,14676,13658,14673,13670,14660,13698,14622,13750,14547,13834,14442,13956,14317,14112,14093,14291,13889,14407,13704,14499,13538,14586,13389,14664,13201,14733,12966,14792,12758,14842,12577,14882,12418,14915,12272,14940,12033,14959,11826,14972,11646,14980,11490,14983,11355,14983,11212,14979,11008,14971,10830,14961,10675,14950,10540,14936,10420,14923,10315,14909,10204,14894,10041,14089,14460,14090,14459,14096,14452,14112,14431,14141,14388,14186,14305,14252,14130,14341,13941,14399,13756,14467,13585,14539,13430,14610,13272,14677,13026,14737,12808,14790,12617,14833,12449,14869,12303,14896,12065,14916,11845,14929,11655,14937,11490,14939,11347,14936,11184,14930,10970,14921,10783,14912,10621,14900,10480,14885,10356,14867,10247,14848,10062,14827,9894,14805,9745,14400,14208,14400,14206,14402,14198,14406,14174,14415,14122,14427,14035,14444,13913,14469,13767,14504,13613,14548,13463,14598,13324,14651,13082,14704,12858,14752,12658,14795,12483,14831,12330,14860,12106,14881,11875,14895,11675,14903,11501,14905,11351,14903,11178,14900,10953,14892,10757,14880,10589,14865,10442,14847,10313,14827,10162,14805,9965,14782,9792,14757,9642,14731,9507,14562,13883,14562,13883,14563,13877,14566,13862,14570,13830,14576,13773,14584,13689,14595,13582,14613,13461,14637,13336,14668,13120,14704,12897,14741,12695,14776,12516,14808,12358,14835,12150,14856,11910,14870,11701,14878,11519,14882,11361,14884,11187,14880,10951,14871,10748,14858,10572,14842,10418,14823,10286,14801,10099,14777,9897,14751,9722,14725,9567,14696,9430,14666,9309,14702,13604,14702,13604,14702,13600,14703,13591,14705,13570,14707,13533,14709,13477,14712,13400,14718,13305,14727,13106,14743,12907,14762,12716,14784,12539,14807,12380,14827,12190,14844,11943,14855,11727,14863,11539,14870,11376,14871,11204,14868,10960,14858,10748,14845,10565,14829,10406,14809,10269,14786,10058,14761,9852,14734,9671,14705,9512,14674,9374,14641,9253,14608,9076,14821,13366,14821,13365,14821,13364,14821,13358,14821,13344,14821,13320,14819,13252,14817,13145,14815,13011,14814,12858,14817,12698,14823,12539,14832,12389,14841,12214,14850,11968,14856,11750,14861,11558,14866,11390,14867,11226,14862,10972,14853,10754,14840,10565,14823,10401,14803,10259,14780,10032,14754,9820,14725,9635,14694,9473,14661,9333,14627,9203,14593,8988,14557,8798,14923,13014,14922,13014,14922,13012,14922,13004,14920,12987,14919,12957,14915,12907,14909,12834,14902,12738,14894,12623,14888,12498,14883,12370,14880,12203,14878,11970,14875,11759,14873,11569,14874,11401,14872,11243,14865,10986,14855,10762,14842,10568,14825,10401,14804,10255,14781,10017,14754,9799,14725,9611,14692,9445,14658,9301,14623,9139,14587,8920,14548,8729,14509,8562,15008,12672,15008,12672,15008,12671,15007,12667,15005,12656,15001,12637,14997,12605,14989,12556,14978,12490,14966,12407,14953,12313,14940,12136,14927,11934,14914,11742,14903,11563,14896,11401,14889,11247,14879,10992,14866,10767,14851,10570,14833,10400,14812,10252,14789,10007,14761,9784,14731,9592,14698,9424,14663,9279,14627,9088,14588,8868,14548,8676,14508,8508,14467,8360,15080,12386,15080,12386,15079,12385,15078,12383,15076,12378,15072,12367,15066,12347,15057,12315,15045,12253,15030,12138,15012,11998,14993,11845,14972,11685,14951,11530,14935,11383,14920,11228,14904,10981,14887,10762,14870,10567,14850,10397,14827,10248,14803,9997,14774,9771,14743,9578,14710,9407,14674,9259,14637,9048,14596,8826,14555,8632,14514,8464,14471,8317,14427,8182,15139,12008,15139,12008,15138,12008,15137,12007,15135,12003,15130,11990,15124,11969,15115,11929,15102,11872,15086,11794,15064,11693,15041,11581,15013,11459,14987,11336,14966,11170,14944,10944,14921,10738,14898,10552,14875,10387,14850,10239,14824,9983,14794,9758,14762,9563,14728,9392,14692,9244,14653,9014,14611,8791,14569,8597,14526,8427,14481,8281,14436,8110,14391,7885,15188,11617,15188,11617,15187,11617,15186,11618,15183,11617,15179,11612,15173,11601,15163,11581,15150,11546,15133,11495,15110,11427,15083,11346,15051,11246,15024,11057,14996,10868,14967,10687,14938,10517,14911,10362,14882,10206,14853,9956,14821,9737,14787,9543,14752,9375,14715,9228,14675,8980,14632,8760,14589,8565,14544,8395,14498,8248,14451,8049,14404,7824,14357,7630,15228,11298,15228,11298,15227,11299,15226,11301,15223,11303,15219,11302,15213,11299,15204,11290,15191,11271,15174,11217,15150,11129,15119,11015,15087,10886,15057,10744,15024,10599,14990,10455,14957,10318,14924,10143,14891,9911,14856,9701,14820,9516,14782,9352,14744,9200,14703,8946,14659,8725,14615,8533,14568,8366,14521,8220,14472,7992,14423,7770,14374,7578,14315,7408,15260,10819,15260,10819,15259,10822,15258,10826,15256,10832,15251,10836,15246,10841,15237,10838,15225,10821,15207,10788,15183,10734,15151,10660,15120,10571,15087,10469,15049,10359,15012,10249,14974,10041,14937,9837,14900,9647,14860,9475,14820,9320,14779,9147,14736,8902,14691,8688,14646,8499,14598,8335,14549,8189,14499,7940,14448,7720,14397,7529,14347,7363,14256,7218,15285,10410,15285,10411,15285,10413,15284,10418,15282,10425,15278,10434,15272,10442,15264,10449,15252,10445,15235,10433,15210,10403,15179,10358,15149,10301,15113,10218,15073,10059,15033,9894,14991,9726,14951,9565,14909,9413,14865,9273,14822,9073,14777,8845,14730,8641,14682,8459,14633,8300,14583,8129,14531,7883,14479,7670,14426,7482,14373,7321,14305,7176,14201,6939,15305,9939,15305,9940,15305,9945,15304,9955,15302,9967,15298,9989,15293,10010,15286,10033,15274,10044,15258,10045,15233,10022,15205,9975,15174,9903,15136,9808,15095,9697,15053,9578,15009,9451,14965,9327,14918,9198,14871,8973,14825,8766,14775,8579,14725,8408,14675,8259,14622,8058,14569,7821,14515,7615,14460,7435,14405,7276,14350,7108,14256,6866,14149,6653,15321,9444,15321,9445,15321,9448,15320,9458,15317,9470,15314,9490,15310,9515,15302,9540,15292,9562,15276,9579,15251,9577,15226,9559,15195,9519,15156,9463,15116,9389,15071,9304,15025,9208,14978,9023,14927,8838,14878,8661,14827,8496,14774,8344,14722,8206,14667,7973,14612,7749,14556,7555,14499,7382,14443,7229,14385,7025,14322,6791,14210,6588,14100,6409,15333,8920,15333,8921,15332,8927,15332,8943,15329,8965,15326,9002,15322,9048,15316,9106,15307,9162,15291,9204,15267,9221,15244,9221,15212,9196,15175,9134,15133,9043,15088,8930,15040,8801,14990,8665,14938,8526,14886,8391,14830,8261,14775,8087,14719,7866,14661,7664,14603,7482,14544,7322,14485,7178,14426,6936,14367,6713,14281,6517,14166,6348,14054,6198,15341,8360,15341,8361,15341,8366,15341,8379,15339,8399,15336,8431,15332,8473,15326,8527,15318,8585,15302,8632,15281,8670,15258,8690,15227,8690,15191,8664,15149,8612,15104,8543,15055,8456,15001,8360,14948,8259,14892,8122,14834,7923,14776,7734,14716,7558,14656,7397,14595,7250,14534,7070,14472,6835,14410,6628,14350,6443,14243,6283,14125,6135,14010,5889,15348,7715,15348,7717,15348,7725,15347,7745,15345,7780,15343,7836,15339,7905,15334,8e3,15326,8103,15310,8193,15293,8239,15270,8270,15240,8287,15204,8283,15163,8260,15118,8223,15067,8143,15014,8014,14958,7873,14899,7723,14839,7573,14778,7430,14715,7293,14652,7164,14588,6931,14524,6720,14460,6531,14396,6362,14330,6210,14207,6015,14086,5781,13969,5576,15352,7114,15352,7116,15352,7128,15352,7159,15350,7195,15348,7237,15345,7299,15340,7374,15332,7457,15317,7544,15301,7633,15280,7703,15251,7754,15216,7775,15176,7767,15131,7733,15079,7670,15026,7588,14967,7492,14906,7387,14844,7278,14779,7171,14714,6965,14648,6770,14581,6587,14515,6420,14448,6269,14382,6123,14299,5881,14172,5665,14049,5477,13929,5310,15355,6329,15355,6330,15355,6339,15355,6362,15353,6410,15351,6472,15349,6572,15344,6688,15337,6835,15323,6985,15309,7142,15287,7220,15260,7277,15226,7310,15188,7326,15142,7318,15090,7285,15036,7239,14976,7177,14914,7045,14849,6892,14782,6736,14714,6581,14645,6433,14576,6293,14506,6164,14438,5946,14369,5733,14270,5540,14140,5369,14014,5216,13892,5043,15357,5483,15357,5484,15357,5496,15357,5528,15356,5597,15354,5692,15351,5835,15347,6011,15339,6195,15328,6317,15314,6446,15293,6566,15268,6668,15235,6746,15197,6796,15152,6811,15101,6790,15046,6748,14985,6673,14921,6583,14854,6479,14785,6371,14714,6259,14643,6149,14571,5946,14499,5750,14428,5567,14358,5401,14242,5250,14109,5111,13980,4870,13856,4657,15359,4555,15359,4557,15358,4573,15358,4633,15357,4715,15355,4841,15353,5061,15349,5216,15342,5391,15331,5577,15318,5770,15299,5967,15274,6150,15243,6223,15206,6280,15161,6310,15111,6317,15055,6300,14994,6262,14928,6208,14860,6141,14788,5994,14715,5838,14641,5684,14566,5529,14492,5384,14418,5247,14346,5121,14216,4892,14079,4682,13948,4496,13822,4330,15359,3498,15359,3501,15359,3520,15359,3598,15358,3719,15356,3860,15355,4137,15351,4305,15344,4563,15334,4809,15321,5116,15303,5273,15280,5418,15250,5547,15214,5653,15170,5722,15120,5761,15064,5763,15002,5733,14935,5673,14865,5597,14792,5504,14716,5400,14640,5294,14563,5185,14486,5041,14410,4841,14335,4655,14191,4482,14051,4325,13918,4183,13790,4012,15360,2282,15360,2285,15360,2306,15360,2401,15359,2547,15357,2748,15355,3103,15352,3349,15345,3675,15336,4020,15324,4272,15307,4496,15285,4716,15255,4908,15220,5086,15178,5170,15128,5214,15072,5234,15010,5231,14943,5206,14871,5166,14796,5102,14718,4971,14639,4833,14559,4687,14480,4541,14402,4401,14315,4268,14167,4142,14025,3958,13888,3747,13759,3556,15360,923,15360,925,15360,946,15360,1052,15359,1214,15357,1494,15356,1892,15352,2274,15346,2663,15338,3099,15326,3393,15309,3679,15288,3980,15260,4183,15226,4325,15185,4437,15136,4517,15080,4570,15018,4591,14950,4581,14877,4545,14800,4485,14720,4411,14638,4325,14556,4231,14475,4136,14395,3988,14297,3803,14145,3628,13999,3465,13861,3314,13729,3177,15360,263,15360,264,15360,272,15360,325,15359,407,15358,548,15356,780,15352,1144,15347,1580,15339,2099,15328,2425,15312,2795,15292,3133,15264,3329,15232,3517,15191,3689,15143,3819,15088,3923,15025,3978,14956,3999,14882,3979,14804,3931,14722,3855,14639,3756,14554,3645,14470,3529,14388,3409,14279,3289,14124,3173,13975,3055,13834,2848,13701,2658,15360,49,15360,49,15360,52,15360,75,15359,111,15358,201,15356,283,15353,519,15348,726,15340,1045,15329,1415,15314,1795,15295,2173,15269,2410,15237,2649,15197,2866,15150,3054,15095,3140,15032,3196,14963,3228,14888,3236,14808,3224,14725,3191,14639,3146,14553,3088,14466,2976,14382,2836,14262,2692,14103,2549,13952,2409,13808,2278,13674,2154,15360,4,15360,4,15360,4,15360,13,15359,33,15358,59,15357,112,15353,199,15348,302,15341,456,15331,628,15316,827,15297,1082,15272,1332,15241,1601,15202,1851,15156,2069,15101,2172,15039,2256,14970,2314,14894,2348,14813,2358,14728,2344,14640,2311,14551,2263,14463,2203,14376,2133,14247,2059,14084,1915,13930,1761,13784,1609,13648,1464,15360,0,15360,0,15360,0,15360,3,15359,18,15358,26,15357,53,15354,80,15348,97,15341,165,15332,238,15318,326,15299,427,15275,529,15245,654,15207,771,15161,885,15108,994,15046,1089,14976,1170,14900,1229,14817,1266,14731,1284,14641,1282,14550,1260,14460,1223,14370,1174,14232,1116,14066,1050,13909,981,13761,910,13623,839]);let Ei=null;function t2(){return Ei===null&&(Ei=new ao(e2,32,32,ac,Rn),Ei.minFilter=$t,Ei.magFilter=$t,Ei.wrapS=ii,Ei.wrapT=ii,Ei.generateMipmaps=!1,Ei.needsUpdate=!0),Ei}class Lp{constructor(e={}){const{canvas:t=kg(),context:n=null,depth:i=!0,stencil:r=!1,alpha:o=!1,antialias:a=!1,premultipliedAlpha:l=!0,preserveDrawingBuffer:c=!1,powerPreference:h="default",failIfMajorPerformanceCaveat:u=!1,reversedDepthBuffer:d=!1}=e;this.isWebGLRenderer=!0;let f;if(n!==null){if(typeof WebGLRenderingContext<"u"&&n instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");f=n.getContextAttributes().alpha}else f=o;const p=new Set([cc,lc,oc]),g=new Set([Wn,ts,Wr,zs,ic,sc]),x=new Uint32Array(4),m=new Int32Array(4);let b=null,v=null;const y=[],M=[];this.domElement=t,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.toneMapping=Ni,this.toneMappingExposure=1,this.transmissionResolutionScale=1;const E=this;let A=!1;this._outputColorSpace=gt;let R=0,_=0,S=null,D=-1,C=null;const B=new tt,w=new tt;let F=null;const W=new Ue(0);let j=0,$=t.width,Z=t.height,re=1,X=null,Y=null;const ge=new tt(0,0,$,Z),pe=new tt(0,0,$,Z);let de=!1;const ie=new vh;let he=!1,fe=!1;const ve=new ze,we=new P,Be=new tt,Je={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};let Ne=!1;function T(){return S===null?re:1}let I=n;function V(O,Q){return t.getContext(O,Q)}try{const O={alpha:!0,depth:i,stencil:r,antialias:a,premultipliedAlpha:l,preserveDrawingBuffer:c,powerPreference:h,failIfMajorPerformanceCaveat:u};if("setAttribute"in t&&t.setAttribute("data-engine",`three.js r${Hr}`),t.addEventListener("webglcontextlost",xe,!1),t.addEventListener("webglcontextrestored",me,!1),t.addEventListener("webglcontextcreationerror",Oe,!1),I===null){const Q="webgl2";if(I=V(Q,O),I===null)throw V(Q)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}}catch(O){throw O("WebGLRenderer: "+O.message),O}let U,k,z,ee,J,G,N,L,H,K,le,te,Ae,be,Re,De,ue,ye,Ve,ke,Ce,Ge,q,Ee;function _e(){U=new hy(I),U.init(),Ge=new j_(I,U),k=new ty(I,U,e,Ge),z=new W_(I,U),k.reversedDepthBuffer&&d&&z.buffers.depth.setReversed(!0),ee=new fy(I),J=new L_,G=new X_(I,U,z,J,k,Ge,ee),N=new iy(E),L=new cy(E),H=new $v(I),q=new Qb(I,H),K=new uy(I,H,ee,q),le=new my(I,K,H,ee),Ve=new py(I,k,G),De=new ny(J),te=new R_(E,N,L,U,k,q,De),Ae=new J_(E,J),be=new I_,Re=new F_(U),ye=new Jb(E,N,L,z,le,f,l),ue=new V_(E,le,k),Ee=new Q_(I,ee,k,z),ke=new ey(I,U,ee),Ce=new dy(I,U,ee),ee.programs=te.programs,E.capabilities=k,E.extensions=U,E.properties=J,E.renderLists=be,E.shadowMap=ue,E.state=z,E.info=ee}_e();const Me=new K_(E,I);this.xr=Me,this.getContext=function(){return I},this.getContextAttributes=function(){return I.getContextAttributes()},this.forceContextLoss=function(){const O=U.get("WEBGL_lose_context");O&&O.loseContext()},this.forceContextRestore=function(){const O=U.get("WEBGL_lose_context");O&&O.restoreContext()},this.getPixelRatio=function(){return re},this.setPixelRatio=function(O){O!==void 0&&(re=O,this.setSize($,Z,!1))},this.getSize=function(O){return O.set($,Z)},this.setSize=function(O,Q,oe=!0){if(Me.isPresenting){He("WebGLRenderer: Can't change size while VR device is presenting.");return}$=O,Z=Q,t.width=Math.floor(O*re),t.height=Math.floor(Q*re),oe===!0&&(t.style.width=O+"px",t.style.height=Q+"px"),this.setViewport(0,0,O,Q)},this.getDrawingBufferSize=function(O){return O.set($*re,Z*re).floor()},this.setDrawingBufferSize=function(O,Q,oe){$=O,Z=Q,re=oe,t.width=Math.floor(O*oe),t.height=Math.floor(Q*oe),this.setViewport(0,0,O,Q)},this.getCurrentViewport=function(O){return O.copy(B)},this.getViewport=function(O){return O.copy(ge)},this.setViewport=function(O,Q,oe,ae){O.isVector4?ge.set(O.x,O.y,O.z,O.w):ge.set(O,Q,oe,ae),z.viewport(B.copy(ge).multiplyScalar(re).round())},this.getScissor=function(O){return O.copy(pe)},this.setScissor=function(O,Q,oe,ae){O.isVector4?pe.set(O.x,O.y,O.z,O.w):pe.set(O,Q,oe,ae),z.scissor(w.copy(pe).multiplyScalar(re).round())},this.getScissorTest=function(){return de},this.setScissorTest=function(O){z.setScissorTest(de=O)},this.setOpaqueSort=function(O){X=O},this.setTransparentSort=function(O){Y=O},this.getClearColor=function(O){return O.copy(ye.getClearColor())},this.setClearColor=function(){ye.setClearColor(...arguments)},this.getClearAlpha=function(){return ye.getClearAlpha()},this.setClearAlpha=function(){ye.setClearAlpha(...arguments)},this.clear=function(O=!0,Q=!0,oe=!0){let ae=0;if(O){let ne=!1;if(S!==null){const Se=S.texture.format;ne=p.has(Se)}if(ne){const Se=S.texture.type,Le=g.has(Se),Fe=ye.getClearColor(),Ie=ye.getClearAlpha(),je=Fe.r,Ze=Fe.g,We=Fe.b;Le?(x[0]=je,x[1]=Ze,x[2]=We,x[3]=Ie,I.clearBufferuiv(I.COLOR,0,x)):(m[0]=je,m[1]=Ze,m[2]=We,m[3]=Ie,I.clearBufferiv(I.COLOR,0,m))}else ae|=I.COLOR_BUFFER_BIT}Q&&(ae|=I.DEPTH_BUFFER_BIT),oe&&(ae|=I.STENCIL_BUFFER_BIT,this.state.buffers.stencil.setMask(4294967295)),I.clear(ae)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){t.removeEventListener("webglcontextlost",xe,!1),t.removeEventListener("webglcontextrestored",me,!1),t.removeEventListener("webglcontextcreationerror",Oe,!1),ye.dispose(),be.dispose(),Re.dispose(),J.dispose(),N.dispose(),L.dispose(),le.dispose(),q.dispose(),Ee.dispose(),te.dispose(),Me.dispose(),Me.removeEventListener("sessionstart",H0),Me.removeEventListener("sessionend",V0),Ls.stop()};function xe(O){O.preventDefault(),ea("WebGLRenderer: Context Lost."),A=!0}function me(){ea("WebGLRenderer: Context Restored."),A=!1;const O=ee.autoReset,Q=ue.enabled,oe=ue.autoUpdate,ae=ue.needsUpdate,ne=ue.type;_e(),ee.autoReset=O,ue.enabled=Q,ue.autoUpdate=oe,ue.needsUpdate=ae,ue.type=ne}function Oe(O){Qe("WebGLRenderer: A WebGL context could not be created. Reason: ",O.statusMessage)}function Ye(O){const Q=O.target;Q.removeEventListener("dispose",Ye),Mt(Q)}function Mt(O){pt(O),J.remove(O)}function pt(O){const Q=J.get(O).programs;Q!==void 0&&(Q.forEach(function(oe){te.releaseProgram(oe)}),O.isShaderMaterial&&te.releaseShaderCache(O))}this.renderBufferDirect=function(O,Q,oe,ae,ne,Se){Q===null&&(Q=Je);const Le=ne.isMesh&&ne.matrixWorld.determinant()<0,Fe=MT(O,Q,oe,ae,ne);z.setMaterial(ae,Le);let Ie=oe.index,je=1;if(ae.wireframe===!0){if(Ie=K.getWireframeAttribute(oe),Ie===void 0)return;je=2}const Ze=oe.drawRange,We=oe.attributes.position;let st=Ze.start*je,mt=(Ze.start+Ze.count)*je;Se!==null&&(st=Math.max(st,Se.start*je),mt=Math.min(mt,(Se.start+Se.count)*je)),Ie!==null?(st=Math.max(st,0),mt=Math.min(mt,Ie.count)):We!=null&&(st=Math.max(st,0),mt=Math.min(mt,We.count));const Bt=mt-st;if(Bt<0||Bt===1/0)return;q.setup(ne,ae,Fe,oe,Ie);let Nt,vt=ke;if(Ie!==null&&(Nt=H.get(Ie),vt=Ce,vt.setIndex(Nt)),ne.isMesh)ae.wireframe===!0?(z.setLineWidth(ae.wireframeLinewidth*T()),vt.setMode(I.LINES)):vt.setMode(I.TRIANGLES);else if(ne.isLine){let Xe=ae.linewidth;Xe===void 0&&(Xe=1),z.setLineWidth(Xe*T()),ne.isLineSegments?vt.setMode(I.LINES):ne.isLineLoop?vt.setMode(I.LINE_LOOP):vt.setMode(I.LINE_STRIP)}else ne.isPoints?vt.setMode(I.POINTS):ne.isSprite&&vt.setMode(I.TRIANGLES);if(ne.isBatchedMesh)if(ne._multiDrawInstances!==null)Kr("WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),vt.renderMultiDrawInstances(ne._multiDrawStarts,ne._multiDrawCounts,ne._multiDrawCount,ne._multiDrawInstances);else if(U.get("WEBGL_multi_draw"))vt.renderMultiDraw(ne._multiDrawStarts,ne._multiDrawCounts,ne._multiDrawCount);else{const Xe=ne._multiDrawStarts,Ct=ne._multiDrawCounts,ot=ne._multiDrawCount,An=Ie?H.get(Ie).bytesPerElement:1,Fr=J.get(ae).currentProgram.getUniforms();for(let Cn=0;Cn{function Se(){if(ae.forEach(function(Le){J.get(Le).currentProgram.isReady()&&ae.delete(Le)}),ae.size===0){ne(O);return}setTimeout(Se,10)}U.get("KHR_parallel_shader_compile")!==null?Se():setTimeout(Se,10)})};let ti=null;function _T(O){ti&&ti(O)}function H0(){Ls.stop()}function V0(){Ls.start()}const Ls=new ip;Ls.setAnimationLoop(_T),typeof self<"u"&&Ls.setContext(self),this.setAnimationLoop=function(O){ti=O,Me.setAnimationLoop(O),O===null?Ls.stop():Ls.start()},Me.addEventListener("sessionstart",H0),Me.addEventListener("sessionend",V0),this.render=function(O,Q){if(Q!==void 0&&Q.isCamera!==!0){Qe("WebGLRenderer.render: camera is not an instance of THREE.Camera.");return}if(A===!0)return;if(O.matrixWorldAutoUpdate===!0&&O.updateMatrixWorld(),Q.parent===null&&Q.matrixWorldAutoUpdate===!0&&Q.updateMatrixWorld(),Me.enabled===!0&&Me.isPresenting===!0&&(Me.cameraAutoUpdate===!0&&Me.updateCamera(Q),Q=Me.getCamera()),O.isScene===!0&&O.onBeforeRender(E,O,Q,S),v=Re.get(O,M.length),v.init(Q),M.push(v),ve.multiplyMatrices(Q.projectionMatrix,Q.matrixWorldInverse),ie.setFromProjectionMatrix(ve,si,Q.reversedDepth),fe=this.localClippingEnabled,he=De.init(this.clippingPlanes,fe),b=be.get(O,y.length),b.init(),y.push(b),Me.enabled===!0&&Me.isPresenting===!0){const Se=E.xr.getDepthSensingMesh();Se!==null&&nd(Se,Q,-1/0,E.sortObjects)}nd(O,Q,0,E.sortObjects),b.finish(),E.sortObjects===!0&&b.sort(X,Y),Ne=Me.enabled===!1||Me.isPresenting===!1||Me.hasDepthSensing()===!1,Ne&&ye.addToRenderList(b,O),this.info.render.frame++,he===!0&&De.beginShadows();const oe=v.state.shadowsArray;ue.render(oe,O,Q),he===!0&&De.endShadows(),this.info.autoReset===!0&&this.info.reset();const ae=b.opaque,ne=b.transmissive;if(v.setupLights(),Q.isArrayCamera){const Se=Q.cameras;if(ne.length>0)for(let Le=0,Fe=Se.length;Le0&&W0(ae,ne,O,Q),Ne&&ye.render(O),G0(b,O,Q);S!==null&&_===0&&(G.updateMultisampleRenderTarget(S),G.updateRenderTargetMipmap(S)),O.isScene===!0&&O.onAfterRender(E,O,Q),q.resetDefaultState(),D=-1,C=null,M.pop(),M.length>0?(v=M[M.length-1],he===!0&&De.setGlobalState(E.clippingPlanes,v.state.camera)):v=null,y.pop(),y.length>0?b=y[y.length-1]:b=null};function nd(O,Q,oe,ae){if(O.visible===!1)return;if(O.layers.test(Q.layers)){if(O.isGroup)oe=O.renderOrder;else if(O.isLOD)O.autoUpdate===!0&&O.update(Q);else if(O.isLight)v.pushLight(O),O.castShadow&&v.pushShadow(O);else if(O.isSprite){if(!O.frustumCulled||ie.intersectsSprite(O)){ae&&Be.setFromMatrixPosition(O.matrixWorld).applyMatrix4(ve);const Le=le.update(O),Fe=O.material;Fe.visible&&b.push(O,Le,Fe,oe,Be.z,null)}}else if((O.isMesh||O.isLine||O.isPoints)&&(!O.frustumCulled||ie.intersectsObject(O))){const Le=le.update(O),Fe=O.material;if(ae&&(O.boundingSphere!==void 0?(O.boundingSphere===null&&O.computeBoundingSphere(),Be.copy(O.boundingSphere.center)):(Le.boundingSphere===null&&Le.computeBoundingSphere(),Be.copy(Le.boundingSphere.center)),Be.applyMatrix4(O.matrixWorld).applyMatrix4(ve)),Array.isArray(Fe)){const Ie=Le.groups;for(let je=0,Ze=Ie.length;je0&&Ol(ne,Q,oe),Se.length>0&&Ol(Se,Q,oe),Le.length>0&&Ol(Le,Q,oe),z.buffers.depth.setTest(!0),z.buffers.depth.setMask(!0),z.buffers.color.setMask(!0),z.setPolygonOffset(!1)}function W0(O,Q,oe,ae){if((oe.isScene===!0?oe.overrideMaterial:null)!==null)return;v.state.transmissionRenderTarget[ae.id]===void 0&&(v.state.transmissionRenderTarget[ae.id]=new pn(1,1,{generateMipmaps:!0,type:U.has("EXT_color_buffer_half_float")||U.has("EXT_color_buffer_float")?Rn:Wn,minFilter:gi,samples:4,stencilBuffer:r,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:it.workingColorSpace}));const Se=v.state.transmissionRenderTarget[ae.id],Le=ae.viewport||B;Se.setSize(Le.z*E.transmissionResolutionScale,Le.w*E.transmissionResolutionScale);const Fe=E.getRenderTarget(),Ie=E.getActiveCubeFace(),je=E.getActiveMipmapLevel();E.setRenderTarget(Se),E.getClearColor(W),j=E.getClearAlpha(),j<1&&E.setClearColor(16777215,.5),E.clear(),Ne&&ye.render(oe);const Ze=E.toneMapping;E.toneMapping=Ni;const We=ae.viewport;if(ae.viewport!==void 0&&(ae.viewport=void 0),v.setupLightsView(ae),he===!0&&De.setGlobalState(E.clippingPlanes,ae),Ol(O,oe,ae),G.updateMultisampleRenderTarget(Se),G.updateRenderTargetMipmap(Se),U.has("WEBGL_multisampled_render_to_texture")===!1){let st=!1;for(let mt=0,Bt=Q.length;mt0),We=!!oe.morphAttributes.position,st=!!oe.morphAttributes.normal,mt=!!oe.morphAttributes.color;let Bt=Ni;ae.toneMapped&&(S===null||S.isXRRenderTarget===!0)&&(Bt=E.toneMapping);const Nt=oe.morphAttributes.position||oe.morphAttributes.normal||oe.morphAttributes.color,vt=Nt!==void 0?Nt.length:0,Xe=J.get(ae),Ct=v.state.lights;if(he===!0&&(fe===!0||O!==C)){const dn=O===C&&ae.id===D;De.setState(ae,O,dn)}let ot=!1;ae.version===Xe.__version?(Xe.needsLights&&Xe.lightsStateVersion!==Ct.state.version||Xe.outputColorSpace!==Fe||ne.isBatchedMesh&&Xe.batching===!1||!ne.isBatchedMesh&&Xe.batching===!0||ne.isBatchedMesh&&Xe.batchingColor===!0&&ne.colorTexture===null||ne.isBatchedMesh&&Xe.batchingColor===!1&&ne.colorTexture!==null||ne.isInstancedMesh&&Xe.instancing===!1||!ne.isInstancedMesh&&Xe.instancing===!0||ne.isSkinnedMesh&&Xe.skinning===!1||!ne.isSkinnedMesh&&Xe.skinning===!0||ne.isInstancedMesh&&Xe.instancingColor===!0&&ne.instanceColor===null||ne.isInstancedMesh&&Xe.instancingColor===!1&&ne.instanceColor!==null||ne.isInstancedMesh&&Xe.instancingMorph===!0&&ne.morphTexture===null||ne.isInstancedMesh&&Xe.instancingMorph===!1&&ne.morphTexture!==null||Xe.envMap!==Ie||ae.fog===!0&&Xe.fog!==Se||Xe.numClippingPlanes!==void 0&&(Xe.numClippingPlanes!==De.numPlanes||Xe.numIntersection!==De.numIntersection)||Xe.vertexAlphas!==je||Xe.vertexTangents!==Ze||Xe.morphTargets!==We||Xe.morphNormals!==st||Xe.morphColors!==mt||Xe.toneMapping!==Bt||Xe.morphTargetsCount!==vt)&&(ot=!0):(ot=!0,Xe.__version=ae.version);let An=Xe.currentProgram;ot===!0&&(An=Fl(ae,Q,ne));let Fr=!1,Cn=!1,Go=!1;const Pt=An.getUniforms(),Mn=Xe.uniforms;if(z.useProgram(An.program)&&(Fr=!0,Cn=!0,Go=!0),ae.id!==D&&(D=ae.id,Cn=!0),Fr||C!==O){z.buffers.depth.getReversed()&&O.reversedDepth!==!0&&(O._reversedDepth=!0,O.updateProjectionMatrix()),Pt.setValue(I,"projectionMatrix",O.projectionMatrix),Pt.setValue(I,"viewMatrix",O.matrixWorldInverse);const wn=Pt.map.cameraPosition;wn!==void 0&&wn.setValue(I,we.setFromMatrixPosition(O.matrixWorld)),k.logarithmicDepthBuffer&&Pt.setValue(I,"logDepthBufFC",2/(Math.log(O.far+1)/Math.LN2)),(ae.isMeshPhongMaterial||ae.isMeshToonMaterial||ae.isMeshLambertMaterial||ae.isMeshBasicMaterial||ae.isMeshStandardMaterial||ae.isShaderMaterial)&&Pt.setValue(I,"isOrthographic",O.isOrthographicCamera===!0),C!==O&&(C=O,Cn=!0,Go=!0)}if(ne.isSkinnedMesh){Pt.setOptional(I,ne,"bindMatrix"),Pt.setOptional(I,ne,"bindMatrixInverse");const dn=ne.skeleton;dn&&(dn.boneTexture===null&&dn.computeBoneTexture(),Pt.setValue(I,"boneTexture",dn.boneTexture,G))}ne.isBatchedMesh&&(Pt.setOptional(I,ne,"batchingTexture"),Pt.setValue(I,"batchingTexture",ne._matricesTexture,G),Pt.setOptional(I,ne,"batchingIdTexture"),Pt.setValue(I,"batchingIdTexture",ne._indirectTexture,G),Pt.setOptional(I,ne,"batchingColorTexture"),ne._colorsTexture!==null&&Pt.setValue(I,"batchingColorTexture",ne._colorsTexture,G));const Vn=oe.morphAttributes;if((Vn.position!==void 0||Vn.normal!==void 0||Vn.color!==void 0)&&Ve.update(ne,oe,An),(Cn||Xe.receiveShadow!==ne.receiveShadow)&&(Xe.receiveShadow=ne.receiveShadow,Pt.setValue(I,"receiveShadow",ne.receiveShadow)),ae.isMeshGouraudMaterial&&ae.envMap!==null&&(Mn.envMap.value=Ie,Mn.flipEnvMap.value=Ie.isCubeTexture&&Ie.isRenderTargetTexture===!1?-1:1),ae.isMeshStandardMaterial&&ae.envMap===null&&Q.environment!==null&&(Mn.envMapIntensity.value=Q.environmentIntensity),Mn.dfgLUT!==void 0&&(Mn.dfgLUT.value=t2()),Cn&&(Pt.setValue(I,"toneMappingExposure",E.toneMappingExposure),Xe.needsLights&&wT(Mn,Go),Se&&ae.fog===!0&&Ae.refreshFogUniforms(Mn,Se),Ae.refreshMaterialUniforms(Mn,ae,re,Z,v.state.transmissionRenderTarget[O.id]),za.upload(I,j0(Xe),Mn,G)),ae.isShaderMaterial&&ae.uniformsNeedUpdate===!0&&(za.upload(I,j0(Xe),Mn,G),ae.uniformsNeedUpdate=!1),ae.isSpriteMaterial&&Pt.setValue(I,"center",ne.center),Pt.setValue(I,"modelViewMatrix",ne.modelViewMatrix),Pt.setValue(I,"normalMatrix",ne.normalMatrix),Pt.setValue(I,"modelMatrix",ne.matrixWorld),ae.isShaderMaterial||ae.isRawShaderMaterial){const dn=ae.uniformsGroups;for(let wn=0,id=dn.length;wn0&&G.useMultisampledRTT(O)===!1?ne=J.get(O).__webglMultisampledFramebuffer:Array.isArray(Ze)?ne=Ze[oe]:ne=Ze,B.copy(O.viewport),w.copy(O.scissor),F=O.scissorTest}else B.copy(ge).multiplyScalar(re).floor(),w.copy(pe).multiplyScalar(re).floor(),F=de;if(oe!==0&&(ne=ET),z.bindFramebuffer(I.FRAMEBUFFER,ne)&&ae&&z.drawBuffers(O,ne),z.viewport(B),z.scissor(w),z.setScissorTest(F),Se){const Ie=J.get(O.texture);I.framebufferTexture2D(I.FRAMEBUFFER,I.COLOR_ATTACHMENT0,I.TEXTURE_CUBE_MAP_POSITIVE_X+Q,Ie.__webglTexture,oe)}else if(Le){const Ie=Q;for(let je=0;je=0&&Q<=O.width-ae&&oe>=0&&oe<=O.height-ne&&(O.textures.length>1&&I.readBuffer(I.COLOR_ATTACHMENT0+Fe),I.readPixels(Q,oe,ae,ne,Ge.convert(Ze),Ge.convert(We),Se))}finally{const je=S!==null?J.get(S).__webglFramebuffer:null;z.bindFramebuffer(I.FRAMEBUFFER,je)}}},this.readRenderTargetPixelsAsync=async function(O,Q,oe,ae,ne,Se,Le,Fe=0){if(!(O&&O.isWebGLRenderTarget))throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let Ie=J.get(O).__webglFramebuffer;if(O.isWebGLCubeRenderTarget&&Le!==void 0&&(Ie=Ie[Le]),Ie)if(Q>=0&&Q<=O.width-ae&&oe>=0&&oe<=O.height-ne){z.bindFramebuffer(I.FRAMEBUFFER,Ie);const je=O.textures[Fe],Ze=je.format,We=je.type;if(!k.textureFormatReadable(Ze))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!k.textureTypeReadable(We))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const st=I.createBuffer();I.bindBuffer(I.PIXEL_PACK_BUFFER,st),I.bufferData(I.PIXEL_PACK_BUFFER,Se.byteLength,I.STREAM_READ),O.textures.length>1&&I.readBuffer(I.COLOR_ATTACHMENT0+Fe),I.readPixels(Q,oe,ae,ne,Ge.convert(Ze),Ge.convert(We),0);const mt=S!==null?J.get(S).__webglFramebuffer:null;z.bindFramebuffer(I.FRAMEBUFFER,mt);const Bt=I.fenceSync(I.SYNC_GPU_COMMANDS_COMPLETE,0);return I.flush(),await Ug(I,Bt,4),I.bindBuffer(I.PIXEL_PACK_BUFFER,st),I.getBufferSubData(I.PIXEL_PACK_BUFFER,0,Se),I.deleteBuffer(st),I.deleteSync(Bt),Se}else throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")},this.copyFramebufferToTexture=function(O,Q=null,oe=0){const ae=Math.pow(2,-oe),ne=Math.floor(O.image.width*ae),Se=Math.floor(O.image.height*ae),Le=Q!==null?Q.x:0,Fe=Q!==null?Q.y:0;G.setTexture2D(O,0),I.copyTexSubImage2D(I.TEXTURE_2D,oe,0,0,Le,Fe,ne,Se),z.unbindTexture()};const TT=I.createFramebuffer(),AT=I.createFramebuffer();this.copyTextureToTexture=function(O,Q,oe=null,ae=null,ne=0,Se=null){Se===null&&(ne!==0?(Kr("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),Se=ne,ne=0):Se=0);let Le,Fe,Ie,je,Ze,We,st,mt,Bt;const Nt=O.isCompressedTexture?O.mipmaps[Se]:O.image;if(oe!==null)Le=oe.max.x-oe.min.x,Fe=oe.max.y-oe.min.y,Ie=oe.isBox3?oe.max.z-oe.min.z:1,je=oe.min.x,Ze=oe.min.y,We=oe.isBox3?oe.min.z:0;else{const Vn=Math.pow(2,-ne);Le=Math.floor(Nt.width*Vn),Fe=Math.floor(Nt.height*Vn),O.isDataArrayTexture?Ie=Nt.depth:O.isData3DTexture?Ie=Math.floor(Nt.depth*Vn):Ie=1,je=0,Ze=0,We=0}ae!==null?(st=ae.x,mt=ae.y,Bt=ae.z):(st=0,mt=0,Bt=0);const vt=Ge.convert(Q.format),Xe=Ge.convert(Q.type);let Ct;Q.isData3DTexture?(G.setTexture3D(Q,0),Ct=I.TEXTURE_3D):Q.isDataArrayTexture||Q.isCompressedArrayTexture?(G.setTexture2DArray(Q,0),Ct=I.TEXTURE_2D_ARRAY):(G.setTexture2D(Q,0),Ct=I.TEXTURE_2D),I.pixelStorei(I.UNPACK_FLIP_Y_WEBGL,Q.flipY),I.pixelStorei(I.UNPACK_PREMULTIPLY_ALPHA_WEBGL,Q.premultiplyAlpha),I.pixelStorei(I.UNPACK_ALIGNMENT,Q.unpackAlignment);const ot=I.getParameter(I.UNPACK_ROW_LENGTH),An=I.getParameter(I.UNPACK_IMAGE_HEIGHT),Fr=I.getParameter(I.UNPACK_SKIP_PIXELS),Cn=I.getParameter(I.UNPACK_SKIP_ROWS),Go=I.getParameter(I.UNPACK_SKIP_IMAGES);I.pixelStorei(I.UNPACK_ROW_LENGTH,Nt.width),I.pixelStorei(I.UNPACK_IMAGE_HEIGHT,Nt.height),I.pixelStorei(I.UNPACK_SKIP_PIXELS,je),I.pixelStorei(I.UNPACK_SKIP_ROWS,Ze),I.pixelStorei(I.UNPACK_SKIP_IMAGES,We);const Pt=O.isDataArrayTexture||O.isData3DTexture,Mn=Q.isDataArrayTexture||Q.isData3DTexture;if(O.isDepthTexture){const Vn=J.get(O),dn=J.get(Q),wn=J.get(Vn.__renderTarget),id=J.get(dn.__renderTarget);z.bindFramebuffer(I.READ_FRAMEBUFFER,wn.__webglFramebuffer),z.bindFramebuffer(I.DRAW_FRAMEBUFFER,id.__webglFramebuffer);for(let Ds=0;DsMath.PI&&(n-=vn),i<-Math.PI?i+=vn:i>Math.PI&&(i-=vn),n<=i?this._spherical.theta=Math.max(n,Math.min(i,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(n+i)/2?Math.max(n,this._spherical.theta):Math.min(i,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let r=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const o=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),r=o!=this._spherical.radius}if(Ft.setFromSpherical(this._spherical),Ft.applyQuaternion(this._quatInverse),this.engine&&this.engine.DeviceType==="PC"){const o=new P;if(o.copy(this.origin).sub(this.target),o.lengthSq()>1e-4&&(this._sphericalDelta.theta!==0||this._sphericalDelta.phi!==0)){const a=this.enableDamping?this.dampingFactor*3:1,l=new P(0,1,0),c=new P;this.object.getWorldDirection(c);const h=c.clone().cross(l).normalize(),u=new P().copy(this.object.position).sub(this.origin);u.applyAxisAngle(l,Math.PI*this._sphericalDelta.theta*a),u.applyAxisAngle(h,Math.PI*this._sphericalDelta.phi*a),t.copy(this.origin).add(u);const d=new P().copy(this.target).sub(this.origin);d.applyAxisAngle(l,Math.PI*this._sphericalDelta.theta*a),d.applyAxisAngle(h,Math.PI*this._sphericalDelta.phi*a),this.target.copy(this.origin).add(d)}else if(this._panOffset.lengthSq()===0&&this._sphericalDelta.phi===0&&this._sphericalDelta.theta===0){if(this._scale!==1){const a=new P;this.object.getWorldDirection(a);const l=this._spherical.radius*.05*(this._scale-1);t.add(a.multiplyScalar(l))}}else t.copy(this.target).add(Ft);this.object.lookAt(this.target)}else t.copy(this.target).add(Ft),this.object.lookAt(this.target);if(this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let o=null;if(this.object.isPerspectiveCamera){const a=Ft.length();o=this._clampDistance(a*this._scale);const l=a-o;this.object.position.addScaledVector(this._dollyDirection,l),this.object.updateMatrixWorld(),r=!!l}else if(this.object.isOrthographicCamera){const a=new P(this._mouse.x,this._mouse.y,0);a.unproject(this.object);const l=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),r=l!==this.object.zoom;const c=new P(this._mouse.x,this._mouse.y,0);c.unproject(this.object),this.object.position.sub(c).add(a),this.object.updateMatrixWorld(),o=Ft.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;o!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(o).add(this.object.position):(Va.origin.copy(this.object.position),Va.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(Va.direction))jh||8*(1-this._lastQuaternion.dot(this.object.quaternion))>jh||this._lastTargetPosition.distanceToSquared(this.target)>jh?(this.dispatchEvent(Dp),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(e){return e!==null?vn/60*this.autoRotateSpeed*e:vn/60/60*this.autoRotateSpeed}_getZoomScale(e){const t=Math.abs(e*.01);return Math.pow(.95,this.zoomSpeed*t)}_rotateLeft(e){this._sphericalDelta.theta-=e}_rotateUp(e){this._sphericalDelta.phi-=e}_panLeft(e,t){Ft.setFromMatrixColumn(t,0),Ft.multiplyScalar(-e),this._panOffset.add(Ft)}_panUp(e,t){this.screenSpacePanning===!0?Ft.setFromMatrixColumn(t,1):(Ft.setFromMatrixColumn(t,0),Ft.crossVectors(this.object.up,Ft)),Ft.multiplyScalar(e),this._panOffset.add(Ft)}_pan(e,t){const n=this.domElement;if(this.object.isPerspectiveCamera){const i=this.object.position;Ft.copy(i).sub(this.target);let r=Ft.length();r*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*e*r/n.clientHeight,this.object.matrix),this._panUp(2*t*r/n.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(e*(this.object.right-this.object.left)/this.object.zoom/n.clientWidth,this.object.matrix),this._panUp(t*(this.object.top-this.object.bottom)/this.object.zoom/n.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(e,t){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const n=this.domElement.getBoundingClientRect(),i=e-n.left,r=t-n.top,o=n.width,a=n.height;this._mouse.x=i/o*2-1,this._mouse.y=-(r/a)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(e){return Math.max(this.minDistance,Math.min(this.maxDistance,e))}_handleMouseDownRotate(e){this._rotateStart.set(e.clientX,e.clientY)}_handleMouseDownDolly(e){this._updateZoomParameters(e.clientX,e.clientX),this._dollyStart.set(e.clientX,e.clientY)}_handleMouseDownPan(e){this._panStart.set(e.clientX,e.clientY)}_handleMouseMoveRotate(e){this._rotateEnd.set(e.clientX,e.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const t=this.domElement;this._rotateLeft(vn*this._rotateDelta.x/t.clientHeight),this._rotateUp(vn*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(e){this._dollyEnd.set(e.clientX,e.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(e){this._panEnd.set(e.clientX,e.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(e){this._updateZoomParameters(e.clientX,e.clientY),e.deltaY<0?this._dollyIn(this._getZoomScale(e.deltaY)):e.deltaY>0&&this._dollyOut(this._getZoomScale(e.deltaY)),this.update()}_handleKeyDown(e){let t=!1;switch(e.code){case this.keys.UP:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(vn*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),t=!0;break;case this.keys.BOTTOM:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(-vn*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),t=!0;break;case this.keys.LEFT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(vn*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),t=!0;break;case this.keys.RIGHT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(-vn*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),t=!0;break}t&&(e.preventDefault(),this.update())}_handleTouchStartRotate(e){if(this._pointers.length===1)this._rotateStart.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),n=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._rotateStart.set(n,i)}}_handleTouchStartPan(e){if(this._pointers.length===1)this._panStart.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),n=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._panStart.set(n,i)}}_handleTouchStartDolly(e){const t=this._getSecondPointerPosition(e),n=e.pageX-t.x,i=e.pageY-t.y,r=Math.sqrt(n*n+i*i);this._dollyStart.set(0,r)}_handleTouchStartDollyPan(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enablePan&&this._handleTouchStartPan(e)}_handleTouchStartDollyRotate(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enableRotate&&this._handleTouchStartRotate(e)}_handleTouchMoveRotate(e){if(this._pointers.length==1)this._rotateEnd.set(e.pageX,e.pageY);else{const n=this._getSecondPointerPosition(e),i=.5*(e.pageX+n.x),r=.5*(e.pageY+n.y);this._rotateEnd.set(i,r)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const t=this.domElement;this._rotateLeft(vn*this._rotateDelta.x/t.clientHeight),this._rotateUp(vn*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(e){if(this._pointers.length===1)this._panEnd.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),n=.5*(e.pageX+t.x),i=.5*(e.pageY+t.y);this._panEnd.set(n,i)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(e){const t=this._getSecondPointerPosition(e),n=e.pageX-t.x,i=e.pageY-t.y,r=Math.sqrt(n*n+i*i);this._dollyEnd.set(0,r),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const o=(e.pageX+t.x)*.5,a=(e.pageY+t.y)*.5;this._updateZoomParameters(o,a)}_handleTouchMoveDollyPan(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enablePan&&this._handleTouchMovePan(e)}_handleTouchMoveDollyRotate(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enableRotate&&this._handleTouchMoveRotate(e)}_addPointer(e){this._pointers.push(e.pointerId)}_removePointer(e){delete this._pointerPositions[e.pointerId];for(let t=0;te}set colliders(e){this._rayCastObjects=e}set enabled(e){this._isEnabled!==e&&(this._isEnabled=e,this._euler.setFromQuaternion(this.camera.quaternion),e?this.addEvents():this.removeEvents())}get enabled(){return this._isEnabled}addEvents(){const e=this._Engine?.DeviceType,t=e==="PC"||!e;console.log("[FirstPersonCameraControl] addEvents - DeviceType:",e,"isPC:",t),t?(console.log("[FirstPersonCameraControl] 添加鼠标事件监听器 - mousedown, mouseup"),this.domElement.addEventListener("mousedown",this.bindmousedown,!1),this.domElement.addEventListener("mouseup",this.bindmouseup,!1)):(console.log("[FirstPersonCameraControl] 添加触摸事件监听器"),this.domElement.addEventListener("touchstart",this.bindmousedown,!1),this.domElement.addEventListener("touchend",this.bindmouseup,!1)),window.addEventListener("keydown",this.bindonKeyDown,!1),window.addEventListener("keyup",this.bindonKeyUp,!1),this.needMousewheel&&(document.addEventListener&&document.addEventListener("DOMMouseScroll",this.bindMousewheel,!1),window.addEventListener("mousewheel",this.bindMousewheel,!1))}removeEvents(){this._Engine&&this._Engine.DeviceType!=="PC"?(this.domElement.removeEventListener("touchstart",this.bindmousedown),this.domElement.removeEventListener("touchend",this.bindmouseup),this.domElement.removeEventListener("touchmove",this.bindmousemove)):(this.domElement.removeEventListener("mousedown",this.bindmousedown),this.domElement.removeEventListener("mouseup",this.bindmouseup),this.domElement.removeEventListener("mousemove",this.bindmousemove)),window.removeEventListener("keydown",this.bindonKeyDown),window.removeEventListener("keyup",this.bindonKeyUp),this.needMousewheel&&(document.addEventListener&&document.removeEventListener("DOMMouseScroll",this.bindMousewheel),window.removeEventListener("mousewheel",this.bindMousewheel))}onMousewheel(e){debugger;let t;switch(e.wheelDelta?(e.wheelDelta>0&&(t="up"),e.wheelDelta<0&&(t="down")):e.detail&&(e.detail<0&&(t="up"),e.detail>0&&(t="down")),t){case"up":this._camerLocalDirection.z=1;break;case"down":this._camerLocalDirection.z=-1;break}this.moveWheelRun==!0?(this.moveWheelRun=!1,this.moveWheelStop=!0,this.wheelClock=setTimeout(()=>{this.moveWheelStop==!0&&(this.moveWheelStop=!1,this.moveWheelRun=!0,this._camerLocalDirection.z=0)},200)):(clearTimeout(this.wheelClock),this.wheelClock=setTimeout(()=>{this.moveWheelStop==!0&&(this.moveWheelStop=!1,this.moveWheelRun=!0,this._camerLocalDirection.z=0)},150))}onMouseDown(e){console.log("[FirstPersonCameraControl] onMouseDown 被调用",e),this.domElement.addEventListener("mousemove",this.bindmousemove,!1),this._prevMouseX=e.screenX,this._prevMouseY=e.screenY}onMouseMove(e){if(this._isEnabled==!1)return;let t=this._prevMouseX?e.screenX-this._prevMouseX:0,n=this._prevMouseY?e.screenY-this._prevMouseY:0,i=this._euler.x-n*this.lookflag*this.lookSpeed;i>=0?i-this.maxRotateX?this._euler.x=i:this._euler.x=-this.maxRotateX,this._euler.y-=t*this.lookSpeed,this.camera.quaternion.setFromEuler(this._euler),this._prevMouseX=e.screenX,this._prevMouseY=e.screenY;let r=this.GetEngine();r.movefirst=!0;var o=new CustomEvent("bimengine:camerachange",{detail:""});window.dispatchEvent(o)}onMouseUp(e){let t=this.GetEngine();t.movefirst=!1,this.domElement.removeEventListener("mousemove",this.bindmousemove)}onTouchStart(e){this.domElement.addEventListener("touchmove",this.bindmousemove,!1),this._prevMouseX=e.targetTouches[0].clientX,this._prevMouseY=e.targetTouches[0].clientY}onTouchMove(e){if(this._isEnabled==!1)return;let t=this._prevMouseX?e.targetTouches[0].clientX-this._prevMouseX:0,n=this._prevMouseY?e.targetTouches[0].clientY-this._prevMouseY:0,i=this._euler.x-n*this.lookflag*this.lookSpeed;i>=0?i-this.maxRotateX?this._euler.x=i:this._euler.x=-this.maxRotateX,this._euler.y-=t*this.lookSpeed,this.camera.quaternion.setFromEuler(this._euler),this._prevMouseX=e.targetTouches[0].clientX,this._prevMouseY=e.targetTouches[0].clientY;let r=this.GetEngine();r.movefirst=!0;var o=new CustomEvent("bimengine:camerachange",{detail:""});window.dispatchEvent(o)}onTouchEnd(e){let t=this.GetEngine();t.movefirst=!1,this.domElement.removeEventListener("touchmove",this.bindmousemove)}onKeyDown(e){var t=new CustomEvent("bimengine:camerachange",{detail:""});let n=this.GetEngine();switch(n.movefirst=!0,window.dispatchEvent(t),e.keyCode){case 38:this.rotateY(-1);break;case 81:this.keydown=!0,this._camerLocalDirection.y=1;break;case 69:this._camerLocalDirection.y=-1;break;case 87:this._camerLocalDirection.z=1;break;case 37:this.rotateX(-1);break;case 65:this._camerLocalDirection.x=-1;break;case 40:this.rotateY(1);break;case 83:this._camerLocalDirection.z=-1;break;case 39:this.rotateX(1);break;case 68:this._camerLocalDirection.x=1;break}}onKeyUp(e){let t=this.GetEngine();switch(t.movefirst=!1,e.keyCode){case 38:case 87:this._camerLocalDirection.z=0;break;case 37:case 65:this._camerLocalDirection.x=0;break;case 40:case 83:this._camerLocalDirection.z=0;break;case 39:case 68:this._camerLocalDirection.x=0;break;case 81:case 69:this.keydown=!1,this._camerLocalDirection.y=0;break}}rotateX(e){this._euler.y-=e*this.lookSpeed,this.camera.quaternion.setFromEuler(this._euler)}rotateY(e){let t=this._euler.x-e*this.lookflag*.5*this.lookSpeed;t>=0?t-this.maxRotateX?this._euler.x=t:this._euler.x=-this.maxRotateX,this.camera.quaternion.setFromEuler(this._euler)}update(){this.keydown||this.gravityTest(),this.collisionTest()}gravityTest(){if(this.applyGravity){let e=!0;this._fallingTime+=.01,this._tmpVector.set(0,-1,0);const t=this.hitTest();if(t){const n=t.point.add(new P(0,this.playerHeight,0));if(this.positionEasing){if(n.y>=this.camera.position.y||n.y-this.camera.position.y<.2){this.setCameraHeight(this.camera.position.y+(n.y-this.camera.position.y)*.08),this._fallingTime=0,e=!1;return}}else t.distanceR[0]).forEach(R=>{let _=new P(R.X,R.Z,-R.Y),S=s.worldToScreen.worldToScreen(_),D=Math.sqrt(Math.pow(S.x-d.offsetX,2)+Math.pow(S.y-d.offsetY,2));D0?(b.sort((R,_)=>R.distance-_.distance),m="point"):(x[2].forEach(R=>{let _=new P(R[0].X,R[0].Z,-R[0].Y),S=new P(R[1].X,R[1].Z,-R[1].Y),D=s.worldToScreen.worldToScreen(_),C=s.worldToScreen.worldToScreen(S),B=M(new ce(d.offsetX,d.offsetY),D,C);if(B0&&(v.sort((R,_)=>R.distance-_.distance),m="line")),m=="point"&&e.options.showCatch){const R=s.worldToScreen.worldToScreen(b[0].point);console.log("捕捉点屏幕坐标:",R.x,R.y),console.log("Canvas尺寸:",s.renderer.domElement.width,s.renderer.domElement.height),console.log("SVG尺寸:",s.catchSvg.clientWidth,s.catchSvg.clientHeight),s.catchSvg.innerHTML="";const _=document.createElementNS("http://www.w3.org/2000/svg","circle");_.setAttribute("class","catchPoint"),_.setAttribute("cx",(R.x+s.reactBoundingClientRect.left).toString()),_.setAttribute("cy",(R.y+s.reactBoundingClientRect.top).toString()),_.setAttribute("r","5"),_.setAttribute("fill","rgb(0, 255, 247)"),s.catchSvg.appendChild(_)}else if(m=="line"&&e.options.showCatch){const R=s.worldToScreen.worldToScreen(v[0].point),_=v[0].start,S=v[0].end;console.log("捕捉点屏幕坐标:",R.x,R.y),console.log("Canvas尺寸:",s.renderer.domElement.width,s.renderer.domElement.height),console.log("SVG尺寸:",s.catchSvg.clientWidth,s.catchSvg.clientHeight),s.catchSvg.innerHTML="";const D=document.createElementNS("http://www.w3.org/2000/svg","line");D.setAttribute("class","catchLine"),D.setAttribute("x1",(_.x+s.reactBoundingClientRect.left).toString()),D.setAttribute("y1",(_.y+s.reactBoundingClientRect.top).toString()),D.setAttribute("x2",(S.x+s.reactBoundingClientRect.left).toString()),D.setAttribute("y2",(S.y+s.reactBoundingClientRect.top).toString()),D.setAttribute("stroke","rgb(0, 255, 247)"),D.setAttribute("stroke-width","2"),s.catchSvg.appendChild(D)}else if(m=="face"&&e.options.showCatch){let R=f[0].point.clone(),_=f[0].normal||(f[0].face?f[0].face.normal:null);const S=(_?_.clone():new P(0,0,1)).normalize(),D=Math.abs(S.y)<.9?new P(0,1,0):new P(1,0,0),C=new P().crossVectors(S,D).normalize(),B=new P().crossVectors(S,C).normalize(),w=.05,F=[new P().copy(C).add(B).multiplyScalar(w),new P().copy(C).sub(B).multiplyScalar(w),new P().copy(C).multiplyScalar(-1).sub(B).multiplyScalar(w),new P().copy(C).multiplyScalar(-1).add(B).multiplyScalar(w)].map(j=>new P().copy(R).add(j)).map(j=>s.worldToScreen.worldToScreen(j));s.catchSvg.innerHTML="";const W=document.createElementNS("http://www.w3.org/2000/svg","polygon");W.setAttribute("class","catchFace"),W.setAttribute("points",F.map(j=>`${j.x+s.reactBoundingClientRect.left},${j.y+s.reactBoundingClientRect.top}`).join(" ")),W.setAttribute("fill","rgba(1, 238, 255, 0.2)"),W.setAttribute("stroke","rgb(0, 255, 247)"),W.setAttribute("stroke-width","1"),s.catchSvg.appendChild(W)}return f[0];function M(R,_,S){const D=new ce().subVectors(S,_),C=D.lengthSq();if(C<1e-10)return R.distanceTo(_);const B=new ce().subVectors(R,_),w=Qr.clamp(B.dot(D)/C,0,1),F=new ce().copy(D).multiplyScalar(w).add(_);return R.distanceTo(F)}function E(R,_,S){const D=new ce().subVectors(S,_),C=D.lengthSq();if(C<1e-10)return 0;const B=new ce().subVectors(R,_);return Qr.clamp(B.dot(D)/C,0,1)}function A(R,_,S){const D=Qr.clamp(R,0,1);return new P().lerpVectors(_,S,D)}}return e}class y2{engine;orbitControls;firstPersonControls;isActive=!0;originDiv=null;handelBehaved;isDragging=!1;isDown=!1;containerOffset={left:0,top:0};constructor(e){this.engine=e,this.init(),this.handelBehaved=qh(this.engine),this.handelBehaved.init(this,null),this.handelBehaved.active()}init(){this.orbitControls=new a2(this.engine,this.engine.camera,this.engine.renderer.domElement),this.orbitControls.showOriginIcon=!0,this.firstPersonControls=new Np(this.engine,this.engine.camera,this.engine.renderer.domElement);const e=document.createElement("div");this.originDiv=e,e.className="originDiv",e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.style.width="30px",e.style.height="30px",e.style.borderRadius="50%",e.style.pointerEvents="none",e.style.backgroundImage="url(./assets/svg/rotate-orbit.svg)",this.engine.container.appendChild(this.originDiv)}active(){this.isActive=!0,this.orbitControls.enabled=!0}disActive(){this.isActive=!1,this.orbitControls.enabled=!1}switchFirstPersonMode(){this.firstPersonControls=new Np(this.engine,this.engine.camera,this.engine.renderer.domElement,[]),this.orbitControls.enabled=!1,this.firstPersonControls.enabled=!0,this.firstPersonControls.isActive=!0}switchDefaultMode(){this.firstPersonControls&&(this.firstPersonControls.enabled=!1),this.orbitControls.enabled=!0}handleMouseUp(e){this.isDragging=!1,this.isDown=!1}handleMouseMove(e){this.isDown?this.isDragging=!0:this.isDragging=!1}handleMouseDown(e){this.isDown=!0}handleMouseClick(e){this.isDragging=!1,this.isDown=!1}update(){if(this.firstPersonControls.enabled&&this.firstPersonControls.update(),this.orbitControls.enabled){const e=this.engine.controlModule.orbitControls.origin,t=this.engine.worldToScreen.worldToScreen(e);this.originDiv&&this.isDragging?(this.originDiv.style.left=t.x-15+this.engine.reactBoundingClientRect.left+"px",this.originDiv.style.top=t.y-15+this.engine.reactBoundingClientRect.top+"px",this.originDiv.style.display="block"):this.originDiv&&(this.originDiv.style.display="none")}}}const gs={name:"CopyShader",uniforms:{tDiffuse:{value:null},opacity:{value:1}},vertexShader:` varying vec2 vUv; @@ -3973,7 +3973,7 @@ void main() { gl_FragColor = opacity * texel; - }`};class xs{constructor(){this.isPass=!0,this.enabled=!0,this.needsSwap=!0,this.clear=!1,this.renderToScreen=!1}setSize(){}render(){console.error("THREE.Pass: .render() must be implemented in derived pass.")}dispose(){}}const M2=new us(-1,1,1,-1,0,1);class w2 extends ht{constructor(){super(),this.setAttribute("position",new nn([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new nn([0,2,0,0,2,0],2))}}const S2=new w2;class Ga{constructor(e){this._mesh=new ut(S2,e)}dispose(){this._mesh.geometry.dispose()}render(e){e.render(this._mesh,M2)}get material(){return this._mesh.material}set material(e){this._mesh.material=e}}class Wa extends xs{constructor(e,t="tDiffuse"){super(),this.textureID=t,this.uniforms=null,this.material=null,e instanceof kt?(this.uniforms=e.uniforms,this.material=e):e&&(this.uniforms=oi.clone(e.uniforms),this.material=new kt({name:e.name!==void 0?e.name:"unspecified",defines:Object.assign({},e.defines),uniforms:this.uniforms,vertexShader:e.vertexShader,fragmentShader:e.fragmentShader})),this._fsQuad=new Ga(this.material)}render(e,t,n){this.uniforms[this.textureID]&&(this.uniforms[this.textureID].value=n.texture),this._fsQuad.material=this.material,this.renderToScreen?(e.setRenderTarget(null),this._fsQuad.render(e)):(e.setRenderTarget(t),this.clear&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),this._fsQuad.render(e))}dispose(){this.material.dispose(),this._fsQuad.dispose()}}class Up extends xs{constructor(e,t){super(),this.scene=e,this.camera=t,this.clear=!0,this.needsSwap=!1,this.inverse=!1}render(e,t,n){const i=e.getContext(),r=e.state;r.buffers.color.setMask(!1),r.buffers.depth.setMask(!1),r.buffers.color.setLocked(!0),r.buffers.depth.setLocked(!0);let o,a;this.inverse?(o=0,a=1):(o=1,a=0),r.buffers.stencil.setTest(!0),r.buffers.stencil.setOp(i.REPLACE,i.REPLACE,i.REPLACE),r.buffers.stencil.setFunc(i.ALWAYS,o,4294967295),r.buffers.stencil.setClear(a),r.buffers.stencil.setLocked(!0),e.setRenderTarget(n),this.clear&&e.clear(),e.render(this.scene,this.camera),e.setRenderTarget(t),this.clear&&e.clear(),e.render(this.scene,this.camera),r.buffers.color.setLocked(!1),r.buffers.depth.setLocked(!1),r.buffers.color.setMask(!0),r.buffers.depth.setMask(!0),r.buffers.stencil.setLocked(!1),r.buffers.stencil.setFunc(i.EQUAL,1,4294967295),r.buffers.stencil.setOp(i.KEEP,i.KEEP,i.KEEP),r.buffers.stencil.setLocked(!0)}}class E2 extends xs{constructor(){super(),this.needsSwap=!1}render(e){e.state.buffers.stencil.setLocked(!1),e.state.buffers.stencil.setTest(!1)}}class T2{constructor(e,t){if(this.renderer=e,this._pixelRatio=e.getPixelRatio(),t===void 0){const n=e.getSize(new ce);this._width=n.width,this._height=n.height,t=new pn(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:Rn}),t.texture.name="EffectComposer.rt1"}else this._width=t.width,this._height=t.height;this.renderTarget1=t,this.renderTarget2=t.clone(),this.renderTarget2.texture.name="EffectComposer.rt2",this.writeBuffer=this.renderTarget1,this.readBuffer=this.renderTarget2,this.renderToScreen=!0,this.passes=[],this.copyPass=new Wa(gs),this.copyPass.material.blending=Wt,this.clock=new Ov}swapBuffers(){const e=this.readBuffer;this.readBuffer=this.writeBuffer,this.writeBuffer=e}addPass(e){this.passes.push(e),e.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}insertPass(e,t){this.passes.splice(t,0,e),e.setSize(this._width*this._pixelRatio,this._height*this._pixelRatio)}removePass(e){const t=this.passes.indexOf(e);t!==-1&&this.passes.splice(t,1)}isLastEnabledPass(e){for(let t=e+1;tg?(x=1,m=0):(x=0,m=1);const b=p-x+h,v=g-m+h,y=p-1+2*h,M=g-1+2*h,E=l&255,A=c&255,R=this.perm[E+this.perm[A]]%12,_=this.perm[E+x+this.perm[A+m]]%12,S=this.perm[E+1+this.perm[A+1]]%12;let D=.5-p*p-g*g;D<0?n=0:(D*=D,n=D*D*this._dot(this.grad3[R],p,g));let C=.5-b*b-v*v;C<0?i=0:(C*=C,i=C*C*this._dot(this.grad3[_],b,v));let B=.5-y*y-M*M;return B<0?r=0:(B*=B,r=B*B*this._dot(this.grad3[S],y,M)),70*(n+i+r)}noise3d(e,t,n){let i,r,o,a;const l=(e+t+n)*.3333333333333333,c=Math.floor(e+l),h=Math.floor(t+l),u=Math.floor(n+l),d=1/6,f=(c+h+u)*d,p=c-f,g=h-f,x=u-f,m=e-p,b=t-g,v=n-x;let y,M,E,A,R,_;m>=b?b>=v?(y=1,M=0,E=0,A=1,R=1,_=0):m>=v?(y=1,M=0,E=0,A=1,R=0,_=1):(y=0,M=0,E=1,A=1,R=0,_=1):bS?32:0,w=_>D?16:0,F=S>D?8:0,W=_>C?4:0,j=S>C?2:0,$=D>C?1:0,Z=B+w+F+W+j+$,re=o[Z][0]>=3?1:0,X=o[Z][1]>=3?1:0,Y=o[Z][2]>=3?1:0,ge=o[Z][3]>=3?1:0,pe=o[Z][0]>=2?1:0,de=o[Z][1]>=2?1:0,ie=o[Z][2]>=2?1:0,he=o[Z][3]>=2?1:0,fe=o[Z][0]>=1?1:0,ve=o[Z][1]>=1?1:0,we=o[Z][2]>=1?1:0,Be=o[Z][3]>=1?1:0,Je=_-re+c,Ne=S-X+c,T=D-Y+c,I=C-ge+c,V=_-pe+2*c,U=S-de+2*c,k=D-ie+2*c,z=C-he+2*c,ee=_-fe+3*c,J=S-ve+3*c,G=D-we+3*c,N=C-Be+3*c,L=_-1+4*c,H=S-1+4*c,K=D-1+4*c,le=C-1+4*c,te=x&255,Te=m&255,be=b&255,Re=v&255,De=a[te+a[Te+a[be+a[Re]]]]%32,ue=a[te+re+a[Te+X+a[be+Y+a[Re+ge]]]]%32,ye=a[te+pe+a[Te+de+a[be+ie+a[Re+he]]]]%32,Ve=a[te+fe+a[Te+ve+a[be+we+a[Re+Be]]]]%32,ke=a[te+1+a[Te+1+a[be+1+a[Re+1]]]]%32;let Ae=.6-_*_-S*S-D*D-C*C;Ae<0?h=0:(Ae*=Ae,h=Ae*Ae*this._dot4(r[De],_,S,D,C));let Ge=.6-Je*Je-Ne*Ne-T*T-I*I;Ge<0?u=0:(Ge*=Ge,u=Ge*Ge*this._dot4(r[ue],Je,Ne,T,I));let q=.6-V*V-U*U-k*k-z*z;q<0?d=0:(q*=q,d=q*q*this._dot4(r[ye],V,U,k,z));let Ee=.6-ee*ee-J*J-G*G-N*N;Ee<0?f=0:(Ee*=Ee,f=Ee*Ee*this._dot4(r[Ve],ee,J,G,N));let _e=.6-L*L-H*H-K*K-le*le;return _e<0?p=0:(_e*=_e,p=_e*_e*this._dot4(r[ke],L,H,K,le)),27*(h+u+d+f+p)}_dot(e,t,n){return e[0]*t+e[1]*n}_dot3(e,t,n,i){return e[0]*t+e[1]*n+e[2]*i}_dot4(e,t,n,i,r){return e[0]*t+e[1]*n+e[2]*i+e[3]*r}}class bn extends xs{constructor(e,t,n=512,i=512,r,o,a){super(),this.width=n,this.height=i,this.clear=!0,this.camera=t,this.scene=e,this.output=0,this._renderGBuffer=!0,this._visibilityCache=[],this.blendIntensity=1,this.pdRings=2,this.pdRadiusExponent=2,this.pdSamples=16,this.gtaoNoiseTexture=C2(),this.pdNoiseTexture=this._generateNoise(),this.gtaoRenderTarget=new pn(this.width,this.height,{type:Rn}),this.pdRenderTarget=this.gtaoRenderTarget.clone(),this.gtaoMaterial=new kt({defines:Object.assign({},Xa.defines),uniforms:oi.clone(Xa.uniforms),vertexShader:Xa.vertexShader,fragmentShader:Xa.fragmentShader,blending:Wt,depthTest:!1,depthWrite:!1}),this.gtaoMaterial.defines.PERSPECTIVE_CAMERA=this.camera.isPerspectiveCamera?1:0,this.gtaoMaterial.uniforms.tNoise.value=this.gtaoNoiseTexture,this.gtaoMaterial.uniforms.resolution.value.set(this.width,this.height),this.gtaoMaterial.uniforms.cameraNear.value=this.camera.near,this.gtaoMaterial.uniforms.cameraFar.value=this.camera.far,this.normalMaterial=new mv,this.normalMaterial.blending=Wt,this.pdMaterial=new kt({defines:Object.assign({},qa.defines),uniforms:oi.clone(qa.uniforms),vertexShader:qa.vertexShader,fragmentShader:qa.fragmentShader,depthTest:!1,depthWrite:!1}),this.pdMaterial.uniforms.tDiffuse.value=this.gtaoRenderTarget.texture,this.pdMaterial.uniforms.tNoise.value=this.pdNoiseTexture,this.pdMaterial.uniforms.resolution.value.set(this.width,this.height),this.pdMaterial.uniforms.lumaPhi.value=10,this.pdMaterial.uniforms.depthPhi.value=2,this.pdMaterial.uniforms.normalPhi.value=3,this.pdMaterial.uniforms.radius.value=8,this.depthRenderMaterial=new kt({defines:Object.assign({},ja.defines),uniforms:oi.clone(ja.uniforms),vertexShader:ja.vertexShader,fragmentShader:ja.fragmentShader,blending:Wt}),this.depthRenderMaterial.uniforms.cameraNear.value=this.camera.near,this.depthRenderMaterial.uniforms.cameraFar.value=this.camera.far,this.copyMaterial=new kt({uniforms:oi.clone(gs.uniforms),vertexShader:gs.vertexShader,fragmentShader:gs.fragmentShader,transparent:!0,depthTest:!1,depthWrite:!1,blendSrc:Xl,blendDst:Vr,blendEquation:Gn,blendSrcAlpha:Wl,blendDstAlpha:Vr,blendEquationAlpha:Gn}),this.blendMaterial=new kt({uniforms:oi.clone(Zh.uniforms),vertexShader:Zh.vertexShader,fragmentShader:Zh.fragmentShader,transparent:!0,depthTest:!1,depthWrite:!1,blending:dd,blendSrc:Xl,blendDst:Vr,blendEquation:Gn,blendSrcAlpha:Wl,blendDstAlpha:Vr,blendEquationAlpha:Gn}),this._fsQuad=new Ga(null),this._originalClearColor=new Ue,this.setGBuffer(r?r.depthTexture:void 0,r?r.normalTexture:void 0),o!==void 0&&this.updateGtaoMaterial(o),a!==void 0&&this.updatePdMaterial(a)}setSize(e,t){this.width=e,this.height=t,this.gtaoRenderTarget.setSize(e,t),this.normalRenderTarget.setSize(e,t),this.pdRenderTarget.setSize(e,t),this.gtaoMaterial.uniforms.resolution.value.set(e,t),this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix),this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse),this.pdMaterial.uniforms.resolution.value.set(e,t),this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse)}dispose(){this.gtaoNoiseTexture.dispose(),this.pdNoiseTexture.dispose(),this.normalRenderTarget.dispose(),this.gtaoRenderTarget.dispose(),this.pdRenderTarget.dispose(),this.normalMaterial.dispose(),this.pdMaterial.dispose(),this.copyMaterial.dispose(),this.depthRenderMaterial.dispose(),this._fsQuad.dispose()}get gtaoMap(){return this.pdRenderTarget.texture}setGBuffer(e,t){e!==void 0?(this.depthTexture=e,this.normalTexture=t,this._renderGBuffer=!1):(this.depthTexture=new _h,this.depthTexture.format=Hs,this.depthTexture.type=zs,this.normalRenderTarget=new pn(this.width,this.height,{minFilter:Kt,magFilter:Kt,type:Rn,depthTexture:this.depthTexture}),this.normalTexture=this.normalRenderTarget.texture,this._renderGBuffer=!0);const n=this.normalTexture?1:0,i=this.depthTexture===this.normalTexture?"w":"x";this.gtaoMaterial.defines.NORMAL_VECTOR_TYPE=n,this.gtaoMaterial.defines.DEPTH_SWIZZLING=i,this.gtaoMaterial.uniforms.tNormal.value=this.normalTexture,this.gtaoMaterial.uniforms.tDepth.value=this.depthTexture,this.pdMaterial.defines.NORMAL_VECTOR_TYPE=n,this.pdMaterial.defines.DEPTH_SWIZZLING=i,this.pdMaterial.uniforms.tNormal.value=this.normalTexture,this.pdMaterial.uniforms.tDepth.value=this.depthTexture,this.depthRenderMaterial.uniforms.tDepth.value=this.normalRenderTarget.depthTexture}setSceneClipBox(e){e?(this.gtaoMaterial.needsUpdate=this.gtaoMaterial.defines.SCENE_CLIP_BOX!==1,this.gtaoMaterial.defines.SCENE_CLIP_BOX=1,this.gtaoMaterial.uniforms.sceneBoxMin.value.copy(e.min),this.gtaoMaterial.uniforms.sceneBoxMax.value.copy(e.max)):(this.gtaoMaterial.needsUpdate=this.gtaoMaterial.defines.SCENE_CLIP_BOX===0,this.gtaoMaterial.defines.SCENE_CLIP_BOX=0)}updateGtaoMaterial(e){e.radius!==void 0&&(this.gtaoMaterial.uniforms.radius.value=e.radius),e.distanceExponent!==void 0&&(this.gtaoMaterial.uniforms.distanceExponent.value=e.distanceExponent),e.thickness!==void 0&&(this.gtaoMaterial.uniforms.thickness.value=e.thickness),e.distanceFallOff!==void 0&&(this.gtaoMaterial.uniforms.distanceFallOff.value=e.distanceFallOff,this.gtaoMaterial.needsUpdate=!0),e.scale!==void 0&&(this.gtaoMaterial.uniforms.scale.value=e.scale),e.samples!==void 0&&e.samples!==this.gtaoMaterial.defines.SAMPLES&&(this.gtaoMaterial.defines.SAMPLES=e.samples,this.gtaoMaterial.needsUpdate=!0),e.screenSpaceRadius!==void 0&&(e.screenSpaceRadius?1:0)!==this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS&&(this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS=e.screenSpaceRadius?1:0,this.gtaoMaterial.needsUpdate=!0)}updatePdMaterial(e){let t=!1;e.lumaPhi!==void 0&&(this.pdMaterial.uniforms.lumaPhi.value=e.lumaPhi),e.depthPhi!==void 0&&(this.pdMaterial.uniforms.depthPhi.value=e.depthPhi),e.normalPhi!==void 0&&(this.pdMaterial.uniforms.normalPhi.value=e.normalPhi),e.radius!==void 0&&e.radius!==this.radius&&(this.pdMaterial.uniforms.radius.value=e.radius),e.radiusExponent!==void 0&&e.radiusExponent!==this.pdRadiusExponent&&(this.pdRadiusExponent=e.radiusExponent,t=!0),e.rings!==void 0&&e.rings!==this.pdRings&&(this.pdRings=e.rings,t=!0),e.samples!==void 0&&e.samples!==this.pdSamples&&(this.pdSamples=e.samples,t=!0),t&&(this.pdMaterial.defines.SAMPLES=this.pdSamples,this.pdMaterial.defines.SAMPLE_VECTORS=Op(this.pdSamples,this.pdRings,this.pdRadiusExponent),this.pdMaterial.needsUpdate=!0)}render(e,t,n){switch(this._renderGBuffer&&(this._overrideVisibility(),this._renderOverride(e,this.normalMaterial,this.normalRenderTarget,7829503,1),this._restoreVisibility()),this.gtaoMaterial.uniforms.cameraNear.value=this.camera.near,this.gtaoMaterial.uniforms.cameraFar.value=this.camera.far,this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix),this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse),this.gtaoMaterial.uniforms.cameraWorldMatrix.value.copy(this.camera.matrixWorld),this._renderPass(e,this.gtaoMaterial,this.gtaoRenderTarget,16777215,1),this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse),this._renderPass(e,this.pdMaterial,this.pdRenderTarget,16777215,1),this.output){case bn.OUTPUT.Off:break;case bn.OUTPUT.Diffuse:this.copyMaterial.uniforms.tDiffuse.value=n.texture,this.copyMaterial.blending=Wt,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t);break;case bn.OUTPUT.AO:this.copyMaterial.uniforms.tDiffuse.value=this.gtaoRenderTarget.texture,this.copyMaterial.blending=Wt,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t);break;case bn.OUTPUT.Denoise:this.copyMaterial.uniforms.tDiffuse.value=this.pdRenderTarget.texture,this.copyMaterial.blending=Wt,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t);break;case bn.OUTPUT.Depth:this.depthRenderMaterial.uniforms.cameraNear.value=this.camera.near,this.depthRenderMaterial.uniforms.cameraFar.value=this.camera.far,this._renderPass(e,this.depthRenderMaterial,this.renderToScreen?null:t);break;case bn.OUTPUT.Normal:this.copyMaterial.uniforms.tDiffuse.value=this.normalRenderTarget.texture,this.copyMaterial.blending=Wt,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t);break;case bn.OUTPUT.Default:this.copyMaterial.uniforms.tDiffuse.value=n.texture,this.copyMaterial.blending=Wt,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t),this.blendMaterial.uniforms.intensity.value=this.blendIntensity,this.blendMaterial.uniforms.tDiffuse.value=this.pdRenderTarget.texture,this._renderPass(e,this.blendMaterial,this.renderToScreen?null:t);break;default:console.warn("THREE.GTAOPass: Unknown output type.")}}_renderPass(e,t,n,i,r){e.getClearColor(this._originalClearColor);const o=e.getClearAlpha(),a=e.autoClear;e.setRenderTarget(n),e.autoClear=!1,i!=null&&(e.setClearColor(i),e.setClearAlpha(r||0),e.clear()),this._fsQuad.material=t,this._fsQuad.render(e),e.autoClear=a,e.setClearColor(this._originalClearColor),e.setClearAlpha(o)}_renderOverride(e,t,n,i,r){e.getClearColor(this._originalClearColor);const o=e.getClearAlpha(),a=e.autoClear;e.setRenderTarget(n),e.autoClear=!1,i=t.clearColor||i,r=t.clearAlpha||r,i!=null&&(e.setClearColor(i),e.setClearAlpha(r||0),e.clear()),this.scene.overrideMaterial=t,e.render(this.scene,this.camera),this.scene.overrideMaterial=null,e.autoClear=a,e.setClearColor(this._originalClearColor),e.setClearAlpha(o)}_overrideVisibility(){const e=this.scene,t=this._visibilityCache;e.traverse(function(n){(n.isPoints||n.isLine||n.isLine2)&&n.visible&&(n.visible=!1,t.push(n))})}_restoreVisibility(){const e=this._visibilityCache;for(let t=0;tg?(x=1,m=0):(x=0,m=1);const b=p-x+h,v=g-m+h,y=p-1+2*h,M=g-1+2*h,E=l&255,A=c&255,R=this.perm[E+this.perm[A]]%12,_=this.perm[E+x+this.perm[A+m]]%12,S=this.perm[E+1+this.perm[A+1]]%12;let D=.5-p*p-g*g;D<0?n=0:(D*=D,n=D*D*this._dot(this.grad3[R],p,g));let C=.5-b*b-v*v;C<0?i=0:(C*=C,i=C*C*this._dot(this.grad3[_],b,v));let B=.5-y*y-M*M;return B<0?r=0:(B*=B,r=B*B*this._dot(this.grad3[S],y,M)),70*(n+i+r)}noise3d(e,t,n){let i,r,o,a;const l=(e+t+n)*.3333333333333333,c=Math.floor(e+l),h=Math.floor(t+l),u=Math.floor(n+l),d=1/6,f=(c+h+u)*d,p=c-f,g=h-f,x=u-f,m=e-p,b=t-g,v=n-x;let y,M,E,A,R,_;m>=b?b>=v?(y=1,M=0,E=0,A=1,R=1,_=0):m>=v?(y=1,M=0,E=0,A=1,R=0,_=1):(y=0,M=0,E=1,A=1,R=0,_=1):bS?32:0,w=_>D?16:0,F=S>D?8:0,W=_>C?4:0,j=S>C?2:0,$=D>C?1:0,Z=B+w+F+W+j+$,re=o[Z][0]>=3?1:0,X=o[Z][1]>=3?1:0,Y=o[Z][2]>=3?1:0,ge=o[Z][3]>=3?1:0,pe=o[Z][0]>=2?1:0,de=o[Z][1]>=2?1:0,ie=o[Z][2]>=2?1:0,he=o[Z][3]>=2?1:0,fe=o[Z][0]>=1?1:0,ve=o[Z][1]>=1?1:0,we=o[Z][2]>=1?1:0,Be=o[Z][3]>=1?1:0,Je=_-re+c,Ne=S-X+c,T=D-Y+c,I=C-ge+c,V=_-pe+2*c,U=S-de+2*c,k=D-ie+2*c,z=C-he+2*c,ee=_-fe+3*c,J=S-ve+3*c,G=D-we+3*c,N=C-Be+3*c,L=_-1+4*c,H=S-1+4*c,K=D-1+4*c,le=C-1+4*c,te=x&255,Ae=m&255,be=b&255,Re=v&255,De=a[te+a[Ae+a[be+a[Re]]]]%32,ue=a[te+re+a[Ae+X+a[be+Y+a[Re+ge]]]]%32,ye=a[te+pe+a[Ae+de+a[be+ie+a[Re+he]]]]%32,Ve=a[te+fe+a[Ae+ve+a[be+we+a[Re+Be]]]]%32,ke=a[te+1+a[Ae+1+a[be+1+a[Re+1]]]]%32;let Ce=.6-_*_-S*S-D*D-C*C;Ce<0?h=0:(Ce*=Ce,h=Ce*Ce*this._dot4(r[De],_,S,D,C));let Ge=.6-Je*Je-Ne*Ne-T*T-I*I;Ge<0?u=0:(Ge*=Ge,u=Ge*Ge*this._dot4(r[ue],Je,Ne,T,I));let q=.6-V*V-U*U-k*k-z*z;q<0?d=0:(q*=q,d=q*q*this._dot4(r[ye],V,U,k,z));let Ee=.6-ee*ee-J*J-G*G-N*N;Ee<0?f=0:(Ee*=Ee,f=Ee*Ee*this._dot4(r[Ve],ee,J,G,N));let _e=.6-L*L-H*H-K*K-le*le;return _e<0?p=0:(_e*=_e,p=_e*_e*this._dot4(r[ke],L,H,K,le)),27*(h+u+d+f+p)}_dot(e,t,n){return e[0]*t+e[1]*n}_dot3(e,t,n,i){return e[0]*t+e[1]*n+e[2]*i}_dot4(e,t,n,i,r){return e[0]*t+e[1]*n+e[2]*i+e[3]*r}}class bn extends xs{constructor(e,t,n=512,i=512,r,o,a){super(),this.width=n,this.height=i,this.clear=!0,this.camera=t,this.scene=e,this.output=0,this._renderGBuffer=!0,this._visibilityCache=[],this.blendIntensity=1,this.pdRings=2,this.pdRadiusExponent=2,this.pdSamples=16,this.gtaoNoiseTexture=A2(),this.pdNoiseTexture=this._generateNoise(),this.gtaoRenderTarget=new pn(this.width,this.height,{type:Rn}),this.pdRenderTarget=this.gtaoRenderTarget.clone(),this.gtaoMaterial=new kt({defines:Object.assign({},Xa.defines),uniforms:oi.clone(Xa.uniforms),vertexShader:Xa.vertexShader,fragmentShader:Xa.fragmentShader,blending:Wt,depthTest:!1,depthWrite:!1}),this.gtaoMaterial.defines.PERSPECTIVE_CAMERA=this.camera.isPerspectiveCamera?1:0,this.gtaoMaterial.uniforms.tNoise.value=this.gtaoNoiseTexture,this.gtaoMaterial.uniforms.resolution.value.set(this.width,this.height),this.gtaoMaterial.uniforms.cameraNear.value=this.camera.near,this.gtaoMaterial.uniforms.cameraFar.value=this.camera.far,this.normalMaterial=new pv,this.normalMaterial.blending=Wt,this.pdMaterial=new kt({defines:Object.assign({},qa.defines),uniforms:oi.clone(qa.uniforms),vertexShader:qa.vertexShader,fragmentShader:qa.fragmentShader,depthTest:!1,depthWrite:!1}),this.pdMaterial.uniforms.tDiffuse.value=this.gtaoRenderTarget.texture,this.pdMaterial.uniforms.tNoise.value=this.pdNoiseTexture,this.pdMaterial.uniforms.resolution.value.set(this.width,this.height),this.pdMaterial.uniforms.lumaPhi.value=10,this.pdMaterial.uniforms.depthPhi.value=2,this.pdMaterial.uniforms.normalPhi.value=3,this.pdMaterial.uniforms.radius.value=8,this.depthRenderMaterial=new kt({defines:Object.assign({},ja.defines),uniforms:oi.clone(ja.uniforms),vertexShader:ja.vertexShader,fragmentShader:ja.fragmentShader,blending:Wt}),this.depthRenderMaterial.uniforms.cameraNear.value=this.camera.near,this.depthRenderMaterial.uniforms.cameraFar.value=this.camera.far,this.copyMaterial=new kt({uniforms:oi.clone(gs.uniforms),vertexShader:gs.vertexShader,fragmentShader:gs.fragmentShader,transparent:!0,depthTest:!1,depthWrite:!1,blendSrc:Xl,blendDst:Vr,blendEquation:Gn,blendSrcAlpha:Wl,blendDstAlpha:Vr,blendEquationAlpha:Gn}),this.blendMaterial=new kt({uniforms:oi.clone(Zh.uniforms),vertexShader:Zh.vertexShader,fragmentShader:Zh.fragmentShader,transparent:!0,depthTest:!1,depthWrite:!1,blending:ud,blendSrc:Xl,blendDst:Vr,blendEquation:Gn,blendSrcAlpha:Wl,blendDstAlpha:Vr,blendEquationAlpha:Gn}),this._fsQuad=new Ga(null),this._originalClearColor=new Ue,this.setGBuffer(r?r.depthTexture:void 0,r?r.normalTexture:void 0),o!==void 0&&this.updateGtaoMaterial(o),a!==void 0&&this.updatePdMaterial(a)}setSize(e,t){this.width=e,this.height=t,this.gtaoRenderTarget.setSize(e,t),this.normalRenderTarget.setSize(e,t),this.pdRenderTarget.setSize(e,t),this.gtaoMaterial.uniforms.resolution.value.set(e,t),this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix),this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse),this.pdMaterial.uniforms.resolution.value.set(e,t),this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse)}dispose(){this.gtaoNoiseTexture.dispose(),this.pdNoiseTexture.dispose(),this.normalRenderTarget.dispose(),this.gtaoRenderTarget.dispose(),this.pdRenderTarget.dispose(),this.normalMaterial.dispose(),this.pdMaterial.dispose(),this.copyMaterial.dispose(),this.depthRenderMaterial.dispose(),this._fsQuad.dispose()}get gtaoMap(){return this.pdRenderTarget.texture}setGBuffer(e,t){e!==void 0?(this.depthTexture=e,this.normalTexture=t,this._renderGBuffer=!1):(this.depthTexture=new _h,this.depthTexture.format=Hs,this.depthTexture.type=zs,this.normalRenderTarget=new pn(this.width,this.height,{minFilter:Kt,magFilter:Kt,type:Rn,depthTexture:this.depthTexture}),this.normalTexture=this.normalRenderTarget.texture,this._renderGBuffer=!0);const n=this.normalTexture?1:0,i=this.depthTexture===this.normalTexture?"w":"x";this.gtaoMaterial.defines.NORMAL_VECTOR_TYPE=n,this.gtaoMaterial.defines.DEPTH_SWIZZLING=i,this.gtaoMaterial.uniforms.tNormal.value=this.normalTexture,this.gtaoMaterial.uniforms.tDepth.value=this.depthTexture,this.pdMaterial.defines.NORMAL_VECTOR_TYPE=n,this.pdMaterial.defines.DEPTH_SWIZZLING=i,this.pdMaterial.uniforms.tNormal.value=this.normalTexture,this.pdMaterial.uniforms.tDepth.value=this.depthTexture,this.depthRenderMaterial.uniforms.tDepth.value=this.normalRenderTarget.depthTexture}setSceneClipBox(e){e?(this.gtaoMaterial.needsUpdate=this.gtaoMaterial.defines.SCENE_CLIP_BOX!==1,this.gtaoMaterial.defines.SCENE_CLIP_BOX=1,this.gtaoMaterial.uniforms.sceneBoxMin.value.copy(e.min),this.gtaoMaterial.uniforms.sceneBoxMax.value.copy(e.max)):(this.gtaoMaterial.needsUpdate=this.gtaoMaterial.defines.SCENE_CLIP_BOX===0,this.gtaoMaterial.defines.SCENE_CLIP_BOX=0)}updateGtaoMaterial(e){e.radius!==void 0&&(this.gtaoMaterial.uniforms.radius.value=e.radius),e.distanceExponent!==void 0&&(this.gtaoMaterial.uniforms.distanceExponent.value=e.distanceExponent),e.thickness!==void 0&&(this.gtaoMaterial.uniforms.thickness.value=e.thickness),e.distanceFallOff!==void 0&&(this.gtaoMaterial.uniforms.distanceFallOff.value=e.distanceFallOff,this.gtaoMaterial.needsUpdate=!0),e.scale!==void 0&&(this.gtaoMaterial.uniforms.scale.value=e.scale),e.samples!==void 0&&e.samples!==this.gtaoMaterial.defines.SAMPLES&&(this.gtaoMaterial.defines.SAMPLES=e.samples,this.gtaoMaterial.needsUpdate=!0),e.screenSpaceRadius!==void 0&&(e.screenSpaceRadius?1:0)!==this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS&&(this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS=e.screenSpaceRadius?1:0,this.gtaoMaterial.needsUpdate=!0)}updatePdMaterial(e){let t=!1;e.lumaPhi!==void 0&&(this.pdMaterial.uniforms.lumaPhi.value=e.lumaPhi),e.depthPhi!==void 0&&(this.pdMaterial.uniforms.depthPhi.value=e.depthPhi),e.normalPhi!==void 0&&(this.pdMaterial.uniforms.normalPhi.value=e.normalPhi),e.radius!==void 0&&e.radius!==this.radius&&(this.pdMaterial.uniforms.radius.value=e.radius),e.radiusExponent!==void 0&&e.radiusExponent!==this.pdRadiusExponent&&(this.pdRadiusExponent=e.radiusExponent,t=!0),e.rings!==void 0&&e.rings!==this.pdRings&&(this.pdRings=e.rings,t=!0),e.samples!==void 0&&e.samples!==this.pdSamples&&(this.pdSamples=e.samples,t=!0),t&&(this.pdMaterial.defines.SAMPLES=this.pdSamples,this.pdMaterial.defines.SAMPLE_VECTORS=Up(this.pdSamples,this.pdRings,this.pdRadiusExponent),this.pdMaterial.needsUpdate=!0)}render(e,t,n){switch(this._renderGBuffer&&(this._overrideVisibility(),this._renderOverride(e,this.normalMaterial,this.normalRenderTarget,7829503,1),this._restoreVisibility()),this.gtaoMaterial.uniforms.cameraNear.value=this.camera.near,this.gtaoMaterial.uniforms.cameraFar.value=this.camera.far,this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix),this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse),this.gtaoMaterial.uniforms.cameraWorldMatrix.value.copy(this.camera.matrixWorld),this._renderPass(e,this.gtaoMaterial,this.gtaoRenderTarget,16777215,1),this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse),this._renderPass(e,this.pdMaterial,this.pdRenderTarget,16777215,1),this.output){case bn.OUTPUT.Off:break;case bn.OUTPUT.Diffuse:this.copyMaterial.uniforms.tDiffuse.value=n.texture,this.copyMaterial.blending=Wt,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t);break;case bn.OUTPUT.AO:this.copyMaterial.uniforms.tDiffuse.value=this.gtaoRenderTarget.texture,this.copyMaterial.blending=Wt,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t);break;case bn.OUTPUT.Denoise:this.copyMaterial.uniforms.tDiffuse.value=this.pdRenderTarget.texture,this.copyMaterial.blending=Wt,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t);break;case bn.OUTPUT.Depth:this.depthRenderMaterial.uniforms.cameraNear.value=this.camera.near,this.depthRenderMaterial.uniforms.cameraFar.value=this.camera.far,this._renderPass(e,this.depthRenderMaterial,this.renderToScreen?null:t);break;case bn.OUTPUT.Normal:this.copyMaterial.uniforms.tDiffuse.value=this.normalRenderTarget.texture,this.copyMaterial.blending=Wt,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t);break;case bn.OUTPUT.Default:this.copyMaterial.uniforms.tDiffuse.value=n.texture,this.copyMaterial.blending=Wt,this._renderPass(e,this.copyMaterial,this.renderToScreen?null:t),this.blendMaterial.uniforms.intensity.value=this.blendIntensity,this.blendMaterial.uniforms.tDiffuse.value=this.pdRenderTarget.texture,this._renderPass(e,this.blendMaterial,this.renderToScreen?null:t);break;default:console.warn("THREE.GTAOPass: Unknown output type.")}}_renderPass(e,t,n,i,r){e.getClearColor(this._originalClearColor);const o=e.getClearAlpha(),a=e.autoClear;e.setRenderTarget(n),e.autoClear=!1,i!=null&&(e.setClearColor(i),e.setClearAlpha(r||0),e.clear()),this._fsQuad.material=t,this._fsQuad.render(e),e.autoClear=a,e.setClearColor(this._originalClearColor),e.setClearAlpha(o)}_renderOverride(e,t,n,i,r){e.getClearColor(this._originalClearColor);const o=e.getClearAlpha(),a=e.autoClear;e.setRenderTarget(n),e.autoClear=!1,i=t.clearColor||i,r=t.clearAlpha||r,i!=null&&(e.setClearColor(i),e.setClearAlpha(r||0),e.clear()),this.scene.overrideMaterial=t,e.render(this.scene,this.camera),this.scene.overrideMaterial=null,e.autoClear=a,e.setClearColor(this._originalClearColor),e.setClearAlpha(o)}_overrideVisibility(){const e=this.scene,t=this._visibilityCache;e.traverse(function(n){(n.isPoints||n.isLine||n.isLine2)&&n.visible&&(n.visible=!1,t.push(n))})}_restoreVisibility(){const e=this._visibilityCache;for(let t=0;tr instanceof Wa&&r.material.uniforms.resolution);i&&(i.material.uniforms.resolution.value.x=1/(e*n),i.material.uniforms.resolution.value.y=1/(t*n))}}init(){const{width:e,height:t}=this.engine.deviceModule.getContainerSize(),n=this.engine.scene,i=this.engine.camera,r=this.engine.renderer,o=e/t,a=new pn(e,t,{minFilter:$t,magFilter:$t,format:fn,samples:4});this.composer=new T2(r,a),this.composer.setPixelRatio(o),this.composer.setSize(e,t);const l=new A2(n,i);this.composer.addPass(l);const c=new bn(n,i,e,t);c.output=bn.OUTPUT.Default,c.blendIntensity=.5,c.updateGtaoMaterial&&c.updateGtaoMaterial({radius:1,distanceExponent:1,thickness:1,scale:1,distanceFallOff:1,screenSpaceRadius:!0}),new wr(new ce(e,t),.1,.1,.5),this.saturationPass=new Wa(N2),this.saturationPass.uniforms.saturation.value=1.3,this.saturationPass.uniforms.contrast.value=1.1,this.composer.addPass(this.saturationPass);const h=new I2;this.composer.addPass(h);const u=new Wa(B2);u.material.uniforms.resolution.value.x=1/(e*o),u.material.uniforms.resolution.value.y=1/(t*o),this.composer.addPass(u)}}var Ya=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Fp(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}function Ka(s){throw new Error('Could not dynamically require "'+s+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var zp={exports:{}},Hp;function U2(){return Hp||(Hp=1,(function(s,e){(function(t){s.exports=t()})(function(){return(function t(n,i,r){function o(c,h){if(!i[c]){if(!n[c]){var u=typeof Ka=="function"&&Ka;if(!h&&u)return u(c,!0);if(a)return a(c,!0);var d=new Error("Cannot find module '"+c+"'");throw d.code="MODULE_NOT_FOUND",d}var f=i[c]={exports:{}};n[c][0].call(f.exports,function(p){var g=n[c][1][p];return o(g||p)},f,f.exports,t,n,i,r)}return i[c].exports}for(var a=typeof Ka=="function"&&Ka,l=0;l>2,f=(3&c)<<4|h>>4,p=1>6:64,g=2>4,h=(15&d)<<4|(f=a.indexOf(l.charAt(g++)))>>2,u=(3&f)<<6|(p=a.indexOf(l.charAt(g++))),b[x++]=c,f!==64&&(b[x++]=h),p!==64&&(b[x++]=u);return b}},{"./support":30,"./utils":32}],2:[function(t,n,i){var r=t("./external"),o=t("./stream/DataWorker"),a=t("./stream/Crc32Probe"),l=t("./stream/DataLengthProbe");function c(h,u,d,f,p){this.compressedSize=h,this.uncompressedSize=u,this.crc32=d,this.compression=f,this.compressedContent=p}c.prototype={getContentWorker:function(){var h=new o(r.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new l("data_length")),u=this;return h.on("end",function(){if(this.streamInfo.data_length!==u.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),h},getCompressedWorker:function(){return new o(r.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},c.createWorkerFrom=function(h,u,d){return h.pipe(new a).pipe(new l("uncompressedSize")).pipe(u.compressWorker(d)).pipe(new l("compressedSize")).withStreamInfo("compression",u)},n.exports=c},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(t,n,i){var r=t("./stream/GenericWorker");i.STORE={magic:"\0\0",compressWorker:function(){return new r("STORE compression")},uncompressWorker:function(){return new r("STORE decompression")}},i.DEFLATE=t("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(t,n,i){var r=t("./utils"),o=(function(){for(var a,l=[],c=0;c<256;c++){a=c;for(var h=0;h<8;h++)a=1&a?3988292384^a>>>1:a>>>1;l[c]=a}return l})();n.exports=function(a,l){return a!==void 0&&a.length?r.getTypeOf(a)!=="string"?(function(c,h,u,d){var f=o,p=d+u;c^=-1;for(var g=d;g>>8^f[255&(c^h[g])];return-1^c})(0|l,a,a.length,0):(function(c,h,u,d){var f=o,p=d+u;c^=-1;for(var g=d;g>>8^f[255&(c^h.charCodeAt(g))];return-1^c})(0|l,a,a.length,0):0}},{"./utils":32}],5:[function(t,n,i){i.base64=!1,i.binary=!1,i.dir=!1,i.createFolders=!0,i.date=null,i.compression=null,i.compressionOptions=null,i.comment=null,i.unixPermissions=null,i.dosPermissions=null},{}],6:[function(t,n,i){var r=null;r=typeof Promise<"u"?Promise:t("lie"),n.exports={Promise:r}},{lie:37}],7:[function(t,n,i){var r=typeof Uint8Array<"u"&&typeof Uint16Array<"u"&&typeof Uint32Array<"u",o=t("pako"),a=t("./utils"),l=t("./stream/GenericWorker"),c=r?"uint8array":"array";function h(u,d){l.call(this,"FlateWorker/"+u),this._pako=null,this._pakoAction=u,this._pakoOptions=d,this.meta={}}i.magic="\b\0",a.inherits(h,l),h.prototype.processChunk=function(u){this.meta=u.meta,this._pako===null&&this._createPako(),this._pako.push(a.transformTo(c,u.data),!1)},h.prototype.flush=function(){l.prototype.flush.call(this),this._pako===null&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){l.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new o[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var u=this;this._pako.onData=function(d){u.push({data:d,meta:u.meta})}},i.compressWorker=function(u){return new h("Deflate",u)},i.uncompressWorker=function(){return new h("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(t,n,i){function r(f,p){var g,x="";for(g=0;g>>=8;return x}function o(f,p,g,x,m,b){var v,y,M=f.file,E=f.compression,A=b!==c.utf8encode,R=a.transformTo("string",b(M.name)),_=a.transformTo("string",c.utf8encode(M.name)),S=M.comment,D=a.transformTo("string",b(S)),C=a.transformTo("string",c.utf8encode(S)),B=_.length!==M.name.length,w=C.length!==S.length,F="",W="",j="",$=M.dir,Z=M.date,re={crc32:0,compressedSize:0,uncompressedSize:0};p&&!g||(re.crc32=f.crc32,re.compressedSize=f.compressedSize,re.uncompressedSize=f.uncompressedSize);var X=0;p&&(X|=8),A||!B&&!w||(X|=2048);var Y=0,ge=0;$&&(Y|=16),m==="UNIX"?(ge=798,Y|=(function(de,ie){var he=de;return de||(he=ie?16893:33204),(65535&he)<<16})(M.unixPermissions,$)):(ge=20,Y|=(function(de){return 63&(de||0)})(M.dosPermissions)),v=Z.getUTCHours(),v<<=6,v|=Z.getUTCMinutes(),v<<=5,v|=Z.getUTCSeconds()/2,y=Z.getUTCFullYear()-1980,y<<=4,y|=Z.getUTCMonth()+1,y<<=5,y|=Z.getUTCDate(),B&&(W=r(1,1)+r(h(R),4)+_,F+="up"+r(W.length,2)+W),w&&(j=r(1,1)+r(h(D),4)+C,F+="uc"+r(j.length,2)+j);var pe="";return pe+=` -\0`,pe+=r(X,2),pe+=E.magic,pe+=r(v,2),pe+=r(y,2),pe+=r(re.crc32,4),pe+=r(re.compressedSize,4),pe+=r(re.uncompressedSize,4),pe+=r(R.length,2),pe+=r(F.length,2),{fileRecord:u.LOCAL_FILE_HEADER+pe+R+F,dirRecord:u.CENTRAL_FILE_HEADER+r(ge,2)+pe+r(D.length,2)+"\0\0\0\0"+r(Y,4)+r(x,4)+R+F+D}}var a=t("../utils"),l=t("../stream/GenericWorker"),c=t("../utf8"),h=t("../crc32"),u=t("../signature");function d(f,p,g,x){l.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=p,this.zipPlatform=g,this.encodeFileName=x,this.streamFiles=f,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}a.inherits(d,l),d.prototype.push=function(f){var p=f.meta.percent||0,g=this.entriesCount,x=this._sources.length;this.accumulate?this.contentBuffer.push(f):(this.bytesWritten+=f.data.length,l.prototype.push.call(this,{data:f.data,meta:{currentFile:this.currentFile,percent:g?(p+100*(g-x-1))/g:100}}))},d.prototype.openedSource=function(f){this.currentSourceOffset=this.bytesWritten,this.currentFile=f.file.name;var p=this.streamFiles&&!f.file.dir;if(p){var g=o(f,p,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:g.fileRecord,meta:{percent:0}})}else this.accumulate=!0},d.prototype.closedSource=function(f){this.accumulate=!1;var p=this.streamFiles&&!f.file.dir,g=o(f,p,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(g.dirRecord),p)this.push({data:(function(x){return u.DATA_DESCRIPTOR+r(x.crc32,4)+r(x.compressedSize,4)+r(x.uncompressedSize,4)})(f),meta:{percent:100}});else for(this.push({data:g.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},d.prototype.flush=function(){for(var f=this.bytesWritten,p=0;p=this.index;l--)c=(c<<8)+this.byteAt(l);return this.index+=a,c},readString:function(a){return r.transformTo("string",this.readData(a))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var a=this.readInt(4);return new Date(Date.UTC(1980+(a>>25&127),(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,(31&a)<<1))}},n.exports=o},{"../utils":32}],19:[function(t,n,i){var r=t("./Uint8ArrayReader");function o(a){r.call(this,a)}t("../utils").inherits(o,r),o.prototype.readData=function(a){this.checkOffset(a);var l=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,l},n.exports=o},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(t,n,i){var r=t("./DataReader");function o(a){r.call(this,a)}t("../utils").inherits(o,r),o.prototype.byteAt=function(a){return this.data.charCodeAt(this.zero+a)},o.prototype.lastIndexOfSignature=function(a){return this.data.lastIndexOf(a)-this.zero},o.prototype.readAndCheckSignature=function(a){return a===this.readData(4)},o.prototype.readData=function(a){this.checkOffset(a);var l=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,l},n.exports=o},{"../utils":32,"./DataReader":18}],21:[function(t,n,i){var r=t("./ArrayReader");function o(a){r.call(this,a)}t("../utils").inherits(o,r),o.prototype.readData=function(a){if(this.checkOffset(a),a===0)return new Uint8Array(0);var l=this.data.subarray(this.zero+this.index,this.zero+this.index+a);return this.index+=a,l},n.exports=o},{"../utils":32,"./ArrayReader":17}],22:[function(t,n,i){var r=t("../utils"),o=t("../support"),a=t("./ArrayReader"),l=t("./StringReader"),c=t("./NodeBufferReader"),h=t("./Uint8ArrayReader");n.exports=function(u){var d=r.getTypeOf(u);return r.checkSupport(d),d!=="string"||o.uint8array?d==="nodebuffer"?new c(u):o.uint8array?new h(r.transformTo("uint8array",u)):new a(r.transformTo("array",u)):new l(u)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(t,n,i){i.LOCAL_FILE_HEADER="PK",i.CENTRAL_FILE_HEADER="PK",i.CENTRAL_DIRECTORY_END="PK",i.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK\x07",i.ZIP64_CENTRAL_DIRECTORY_END="PK",i.DATA_DESCRIPTOR="PK\x07\b"},{}],24:[function(t,n,i){var r=t("./GenericWorker"),o=t("../utils");function a(l){r.call(this,"ConvertWorker to "+l),this.destType=l}o.inherits(a,r),a.prototype.processChunk=function(l){this.push({data:o.transformTo(this.destType,l.data),meta:l.meta})},n.exports=a},{"../utils":32,"./GenericWorker":28}],25:[function(t,n,i){var r=t("./GenericWorker"),o=t("../crc32");function a(){r.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}t("../utils").inherits(a,r),a.prototype.processChunk=function(l){this.streamInfo.crc32=o(l.data,this.streamInfo.crc32||0),this.push(l)},n.exports=a},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(t,n,i){var r=t("../utils"),o=t("./GenericWorker");function a(l){o.call(this,"DataLengthProbe for "+l),this.propName=l,this.withStreamInfo(l,0)}r.inherits(a,o),a.prototype.processChunk=function(l){if(l){var c=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=c+l.data.length}o.prototype.processChunk.call(this,l)},n.exports=a},{"../utils":32,"./GenericWorker":28}],27:[function(t,n,i){var r=t("../utils"),o=t("./GenericWorker");function a(l){o.call(this,"DataWorker");var c=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,l.then(function(h){c.dataIsReady=!0,c.data=h,c.max=h&&h.length||0,c.type=r.getTypeOf(h),c.isPaused||c._tickAndRepeat()},function(h){c.error(h)})}r.inherits(a,o),a.prototype.cleanUp=function(){o.prototype.cleanUp.call(this),this.data=null},a.prototype.resume=function(){return!!o.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,r.delay(this._tickAndRepeat,[],this)),!0)},a.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(r.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},a.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var l=null,c=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":l=this.data.substring(this.index,c);break;case"uint8array":l=this.data.subarray(this.index,c);break;case"array":case"nodebuffer":l=this.data.slice(this.index,c)}return this.index=c,this.push({data:l,meta:{percent:this.max?this.index/this.max*100:0}})},n.exports=a},{"../utils":32,"./GenericWorker":28}],28:[function(t,n,i){function r(o){this.name=o||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}r.prototype={push:function(o){this.emit("data",o)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(o){this.emit("error",o)}return!0},error:function(o){return!this.isFinished&&(this.isPaused?this.generatedError=o:(this.isFinished=!0,this.emit("error",o),this.previous&&this.previous.error(o),this.cleanUp()),!0)},on:function(o,a){return this._listeners[o].push(a),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(o,a){if(this._listeners[o])for(var l=0;l "+o:o}},n.exports=r},{}],29:[function(t,n,i){var r=t("../utils"),o=t("./ConvertWorker"),a=t("./GenericWorker"),l=t("../base64"),c=t("../support"),h=t("../external"),u=null;if(c.nodestream)try{u=t("../nodejs/NodejsStreamOutputAdapter")}catch{}function d(p,g){return new h.Promise(function(x,m){var b=[],v=p._internalType,y=p._outputType,M=p._mimeType;p.on("data",function(E,A){b.push(E),g&&g(A)}).on("error",function(E){b=[],m(E)}).on("end",function(){try{var E=(function(A,R,_){switch(A){case"blob":return r.newBlob(r.transformTo("arraybuffer",R),_);case"base64":return l.encode(R);default:return r.transformTo(A,R)}})(y,(function(A,R){var _,S=0,D=null,C=0;for(_=0;_"u")i.blob=!1;else{var r=new ArrayBuffer(0);try{i.blob=new Blob([r],{type:"application/zip"}).size===0}catch{try{var o=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);o.append(r),i.blob=o.getBlob("application/zip").size===0}catch{i.blob=!1}}}try{i.nodestream=!!t("readable-stream").Readable}catch{i.nodestream=!1}},{"readable-stream":16}],31:[function(t,n,i){for(var r=t("./utils"),o=t("./support"),a=t("./nodejsUtils"),l=t("./stream/GenericWorker"),c=new Array(256),h=0;h<256;h++)c[h]=252<=h?6:248<=h?5:240<=h?4:224<=h?3:192<=h?2:1;c[254]=c[254]=1;function u(){l.call(this,"utf-8 decode"),this.leftOver=null}function d(){l.call(this,"utf-8 encode")}i.utf8encode=function(f){return o.nodebuffer?a.newBufferFrom(f,"utf-8"):(function(p){var g,x,m,b,v,y=p.length,M=0;for(b=0;b>>6:(x<65536?g[v++]=224|x>>>12:(g[v++]=240|x>>>18,g[v++]=128|x>>>12&63),g[v++]=128|x>>>6&63),g[v++]=128|63&x);return g})(f)},i.utf8decode=function(f){return o.nodebuffer?r.transformTo("nodebuffer",f).toString("utf-8"):(function(p){var g,x,m,b,v=p.length,y=new Array(2*v);for(g=x=0;g>10&1023,y[x++]=56320|1023&m)}return y.length!==x&&(y.subarray?y=y.subarray(0,x):y.length=x),r.applyFromCharCode(y)})(f=r.transformTo(o.uint8array?"uint8array":"array",f))},r.inherits(u,l),u.prototype.processChunk=function(f){var p=r.transformTo(o.uint8array?"uint8array":"array",f.data);if(this.leftOver&&this.leftOver.length){if(o.uint8array){var g=p;(p=new Uint8Array(g.length+this.leftOver.length)).set(this.leftOver,0),p.set(g,this.leftOver.length)}else p=this.leftOver.concat(p);this.leftOver=null}var x=(function(b,v){var y;for((v=v||b.length)>b.length&&(v=b.length),y=v-1;0<=y&&(192&b[y])==128;)y--;return y<0||y===0?v:y+c[b[y]]>v?y:v})(p),m=p;x!==p.length&&(o.uint8array?(m=p.subarray(0,x),this.leftOver=p.subarray(x,p.length)):(m=p.slice(0,x),this.leftOver=p.slice(x,p.length))),this.push({data:i.utf8decode(m),meta:f.meta})},u.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:i.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},i.Utf8DecodeWorker=u,r.inherits(d,l),d.prototype.processChunk=function(f){this.push({data:i.utf8encode(f.data),meta:f.meta})},i.Utf8EncodeWorker=d},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(t,n,i){var r=t("./support"),o=t("./base64"),a=t("./nodejsUtils"),l=t("./external");function c(g){return g}function h(g,x){for(var m=0;m>8;this.dir=!!(16&this.externalFileAttributes),f==0&&(this.dosPermissions=63&this.externalFileAttributes),f==3&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||this.fileNameStr.slice(-1)!=="/"||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var f=r(this.extraFields[1].value);this.uncompressedSize===o.MAX_VALUE_32BITS&&(this.uncompressedSize=f.readInt(8)),this.compressedSize===o.MAX_VALUE_32BITS&&(this.compressedSize=f.readInt(8)),this.localHeaderOffset===o.MAX_VALUE_32BITS&&(this.localHeaderOffset=f.readInt(8)),this.diskNumberStart===o.MAX_VALUE_32BITS&&(this.diskNumberStart=f.readInt(4))}},readExtraFields:function(f){var p,g,x,m=f.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});f.index+4>>6:(f<65536?d[x++]=224|f>>>12:(d[x++]=240|f>>>18,d[x++]=128|f>>>12&63),d[x++]=128|f>>>6&63),d[x++]=128|63&f);return d},i.buf2binstring=function(u){return h(u,u.length)},i.binstring2buf=function(u){for(var d=new r.Buf8(u.length),f=0,p=d.length;f>10&1023,b[p++]=56320|1023&g)}return h(b,p)},i.utf8border=function(u,d){var f;for((d=d||u.length)>u.length&&(d=u.length),f=d-1;0<=f&&(192&u[f])==128;)f--;return f<0||f===0?d:f+l[u[f]]>d?f:d}},{"./common":41}],43:[function(t,n,i){n.exports=function(r,o,a,l){for(var c=65535&r|0,h=r>>>16&65535|0,u=0;a!==0;){for(a-=u=2e3>>1:o>>>1;a[l]=o}return a})();n.exports=function(o,a,l,c){var h=r,u=c+l;o^=-1;for(var d=c;d>>8^h[255&(o^a[d])];return-1^o}},{}],46:[function(t,n,i){var r,o=t("../utils/common"),a=t("./trees"),l=t("./adler32"),c=t("./crc32"),h=t("./messages"),u=0,d=4,f=0,p=-2,g=-1,x=4,m=2,b=8,v=9,y=286,M=30,E=19,A=2*y+1,R=15,_=3,S=258,D=S+_+1,C=42,B=113,w=1,F=2,W=3,j=4;function $(T,I){return T.msg=h[I],I}function Z(T){return(T<<1)-(4T.avail_out&&(V=T.avail_out),V!==0&&(o.arraySet(T.output,I.pending_buf,I.pending_out,V,T.next_out),T.next_out+=V,I.pending_out+=V,T.total_out+=V,T.avail_out-=V,I.pending-=V,I.pending===0&&(I.pending_out=0))}function Y(T,I){a._tr_flush_block(T,0<=T.block_start?T.block_start:-1,T.strstart-T.block_start,I),T.block_start=T.strstart,X(T.strm)}function ge(T,I){T.pending_buf[T.pending++]=I}function pe(T,I){T.pending_buf[T.pending++]=I>>>8&255,T.pending_buf[T.pending++]=255&I}function de(T,I){var V,U,k=T.max_chain_length,z=T.strstart,ee=T.prev_length,J=T.nice_match,G=T.strstart>T.w_size-D?T.strstart-(T.w_size-D):0,N=T.window,L=T.w_mask,H=T.prev,K=T.strstart+S,le=N[z+ee-1],te=N[z+ee];T.prev_length>=T.good_match&&(k>>=2),J>T.lookahead&&(J=T.lookahead);do if(N[(V=I)+ee]===te&&N[V+ee-1]===le&&N[V]===N[z]&&N[++V]===N[z+1]){z+=2,V++;do;while(N[++z]===N[++V]&&N[++z]===N[++V]&&N[++z]===N[++V]&&N[++z]===N[++V]&&N[++z]===N[++V]&&N[++z]===N[++V]&&N[++z]===N[++V]&&N[++z]===N[++V]&&zG&&--k!=0);return ee<=T.lookahead?ee:T.lookahead}function ie(T){var I,V,U,k,z,ee,J,G,N,L,H=T.w_size;do{if(k=T.window_size-T.lookahead-T.strstart,T.strstart>=H+(H-D)){for(o.arraySet(T.window,T.window,H,H,0),T.match_start-=H,T.strstart-=H,T.block_start-=H,I=V=T.hash_size;U=T.head[--I],T.head[I]=H<=U?U-H:0,--V;);for(I=V=H;U=T.prev[--I],T.prev[I]=H<=U?U-H:0,--V;);k+=H}if(T.strm.avail_in===0)break;if(ee=T.strm,J=T.window,G=T.strstart+T.lookahead,N=k,L=void 0,L=ee.avail_in,N=_)for(z=T.strstart-T.insert,T.ins_h=T.window[z],T.ins_h=(T.ins_h<=_&&(T.ins_h=(T.ins_h<=_)if(U=a._tr_tally(T,T.strstart-T.match_start,T.match_length-_),T.lookahead-=T.match_length,T.match_length<=T.max_lazy_match&&T.lookahead>=_){for(T.match_length--;T.strstart++,T.ins_h=(T.ins_h<=_&&(T.ins_h=(T.ins_h<=_&&T.match_length<=T.prev_length){for(k=T.strstart+T.lookahead-_,U=a._tr_tally(T,T.strstart-1-T.prev_match,T.prev_length-_),T.lookahead-=T.prev_length-1,T.prev_length-=2;++T.strstart<=k&&(T.ins_h=(T.ins_h<T.pending_buf_size-5&&(V=T.pending_buf_size-5);;){if(T.lookahead<=1){if(ie(T),T.lookahead===0&&I===u)return w;if(T.lookahead===0)break}T.strstart+=T.lookahead,T.lookahead=0;var U=T.block_start+V;if((T.strstart===0||T.strstart>=U)&&(T.lookahead=T.strstart-U,T.strstart=U,Y(T,!1),T.strm.avail_out===0)||T.strstart-T.block_start>=T.w_size-D&&(Y(T,!1),T.strm.avail_out===0))return w}return T.insert=0,I===d?(Y(T,!0),T.strm.avail_out===0?W:j):(T.strstart>T.block_start&&(Y(T,!1),T.strm.avail_out),w)}),new ve(4,4,8,4,he),new ve(4,5,16,8,he),new ve(4,6,32,32,he),new ve(4,4,16,16,fe),new ve(8,16,32,32,fe),new ve(8,16,128,128,fe),new ve(8,32,128,256,fe),new ve(32,128,258,1024,fe),new ve(32,258,258,4096,fe)],i.deflateInit=function(T,I){return Ne(T,I,b,15,8,0)},i.deflateInit2=Ne,i.deflateReset=Je,i.deflateResetKeep=Be,i.deflateSetHeader=function(T,I){return T&&T.state?T.state.wrap!==2?p:(T.state.gzhead=I,f):p},i.deflate=function(T,I){var V,U,k,z;if(!T||!T.state||5>8&255),ge(U,U.gzhead.time>>16&255),ge(U,U.gzhead.time>>24&255),ge(U,U.level===9?2:2<=U.strategy||U.level<2?4:0),ge(U,255&U.gzhead.os),U.gzhead.extra&&U.gzhead.extra.length&&(ge(U,255&U.gzhead.extra.length),ge(U,U.gzhead.extra.length>>8&255)),U.gzhead.hcrc&&(T.adler=c(T.adler,U.pending_buf,U.pending,0)),U.gzindex=0,U.status=69):(ge(U,0),ge(U,0),ge(U,0),ge(U,0),ge(U,0),ge(U,U.level===9?2:2<=U.strategy||U.level<2?4:0),ge(U,3),U.status=B);else{var ee=b+(U.w_bits-8<<4)<<8;ee|=(2<=U.strategy||U.level<2?0:U.level<6?1:U.level===6?2:3)<<6,U.strstart!==0&&(ee|=32),ee+=31-ee%31,U.status=B,pe(U,ee),U.strstart!==0&&(pe(U,T.adler>>>16),pe(U,65535&T.adler)),T.adler=1}if(U.status===69)if(U.gzhead.extra){for(k=U.pending;U.gzindex<(65535&U.gzhead.extra.length)&&(U.pending!==U.pending_buf_size||(U.gzhead.hcrc&&U.pending>k&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),X(T),k=U.pending,U.pending!==U.pending_buf_size));)ge(U,255&U.gzhead.extra[U.gzindex]),U.gzindex++;U.gzhead.hcrc&&U.pending>k&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),U.gzindex===U.gzhead.extra.length&&(U.gzindex=0,U.status=73)}else U.status=73;if(U.status===73)if(U.gzhead.name){k=U.pending;do{if(U.pending===U.pending_buf_size&&(U.gzhead.hcrc&&U.pending>k&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),X(T),k=U.pending,U.pending===U.pending_buf_size)){z=1;break}z=U.gzindexk&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),z===0&&(U.gzindex=0,U.status=91)}else U.status=91;if(U.status===91)if(U.gzhead.comment){k=U.pending;do{if(U.pending===U.pending_buf_size&&(U.gzhead.hcrc&&U.pending>k&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),X(T),k=U.pending,U.pending===U.pending_buf_size)){z=1;break}z=U.gzindexk&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),z===0&&(U.status=103)}else U.status=103;if(U.status===103&&(U.gzhead.hcrc?(U.pending+2>U.pending_buf_size&&X(T),U.pending+2<=U.pending_buf_size&&(ge(U,255&T.adler),ge(U,T.adler>>8&255),T.adler=0,U.status=B)):U.status=B),U.pending!==0){if(X(T),T.avail_out===0)return U.last_flush=-1,f}else if(T.avail_in===0&&Z(I)<=Z(V)&&I!==d)return $(T,-5);if(U.status===666&&T.avail_in!==0)return $(T,-5);if(T.avail_in!==0||U.lookahead!==0||I!==u&&U.status!==666){var J=U.strategy===2?(function(G,N){for(var L;;){if(G.lookahead===0&&(ie(G),G.lookahead===0)){if(N===u)return w;break}if(G.match_length=0,L=a._tr_tally(G,0,G.window[G.strstart]),G.lookahead--,G.strstart++,L&&(Y(G,!1),G.strm.avail_out===0))return w}return G.insert=0,N===d?(Y(G,!0),G.strm.avail_out===0?W:j):G.last_lit&&(Y(G,!1),G.strm.avail_out===0)?w:F})(U,I):U.strategy===3?(function(G,N){for(var L,H,K,le,te=G.window;;){if(G.lookahead<=S){if(ie(G),G.lookahead<=S&&N===u)return w;if(G.lookahead===0)break}if(G.match_length=0,G.lookahead>=_&&0G.lookahead&&(G.match_length=G.lookahead)}if(G.match_length>=_?(L=a._tr_tally(G,1,G.match_length-_),G.lookahead-=G.match_length,G.strstart+=G.match_length,G.match_length=0):(L=a._tr_tally(G,0,G.window[G.strstart]),G.lookahead--,G.strstart++),L&&(Y(G,!1),G.strm.avail_out===0))return w}return G.insert=0,N===d?(Y(G,!0),G.strm.avail_out===0?W:j):G.last_lit&&(Y(G,!1),G.strm.avail_out===0)?w:F})(U,I):r[U.level].func(U,I);if(J!==W&&J!==j||(U.status=666),J===w||J===W)return T.avail_out===0&&(U.last_flush=-1),f;if(J===F&&(I===1?a._tr_align(U):I!==5&&(a._tr_stored_block(U,0,0,!1),I===3&&(re(U.head),U.lookahead===0&&(U.strstart=0,U.block_start=0,U.insert=0))),X(T),T.avail_out===0))return U.last_flush=-1,f}return I!==d?f:U.wrap<=0?1:(U.wrap===2?(ge(U,255&T.adler),ge(U,T.adler>>8&255),ge(U,T.adler>>16&255),ge(U,T.adler>>24&255),ge(U,255&T.total_in),ge(U,T.total_in>>8&255),ge(U,T.total_in>>16&255),ge(U,T.total_in>>24&255)):(pe(U,T.adler>>>16),pe(U,65535&T.adler)),X(T),0=V.w_size&&(z===0&&(re(V.head),V.strstart=0,V.block_start=0,V.insert=0),N=new o.Buf8(V.w_size),o.arraySet(N,I,L-V.w_size,V.w_size,0),I=N,L=V.w_size),ee=T.avail_in,J=T.next_in,G=T.input,T.avail_in=L,T.next_in=0,T.input=I,ie(V);V.lookahead>=_;){for(U=V.strstart,k=V.lookahead-(_-1);V.ins_h=(V.ins_h<>>=_=R>>>24,v-=_,(_=R>>>16&255)===0)F[h++]=65535&R;else{if(!(16&_)){if((64&_)==0){R=y[(65535&R)+(b&(1<<_)-1)];continue t}if(32&_){a.mode=12;break e}r.msg="invalid literal/length code",a.mode=30;break e}S=65535&R,(_&=15)&&(v<_&&(b+=w[l++]<>>=_,v-=_),v<15&&(b+=w[l++]<>>=_=R>>>24,v-=_,!(16&(_=R>>>16&255))){if((64&_)==0){R=M[(65535&R)+(b&(1<<_)-1)];continue n}r.msg="invalid distance code",a.mode=30;break e}if(D=65535&R,v<(_&=15)&&(b+=w[l++]<>>=_,v-=_,(_=h-u)>3,b&=(1<<(v-=S<<3))-1,r.next_in=l,r.next_out=h,r.avail_in=l>>24&255)+(C>>>8&65280)+((65280&C)<<8)+((255&C)<<24)}function b(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new r.Buf16(320),this.work=new r.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function v(C){var B;return C&&C.state?(B=C.state,C.total_in=C.total_out=B.total=0,C.msg="",B.wrap&&(C.adler=1&B.wrap),B.mode=p,B.last=0,B.havedict=0,B.dmax=32768,B.head=null,B.hold=0,B.bits=0,B.lencode=B.lendyn=new r.Buf32(g),B.distcode=B.distdyn=new r.Buf32(x),B.sane=1,B.back=-1,d):f}function y(C){var B;return C&&C.state?((B=C.state).wsize=0,B.whave=0,B.wnext=0,v(C)):f}function M(C,B){var w,F;return C&&C.state?(F=C.state,B<0?(w=0,B=-B):(w=1+(B>>4),B<48&&(B&=15)),B&&(B<8||15=j.wsize?(r.arraySet(j.window,B,w-j.wsize,j.wsize,0),j.wnext=0,j.whave=j.wsize):(F<(W=j.wsize-j.wnext)&&(W=F),r.arraySet(j.window,B,w-F,W,j.wnext),(F-=W)?(r.arraySet(j.window,B,w-F,F,0),j.wnext=F,j.whave=j.wsize):(j.wnext+=W,j.wnext===j.wsize&&(j.wnext=0),j.whave>>8&255,w.check=a(w.check,z,2,0),Y=X=0,w.mode=2;break}if(w.flags=0,w.head&&(w.head.done=!1),!(1&w.wrap)||(((255&X)<<8)+(X>>8))%31){C.msg="incorrect header check",w.mode=30;break}if((15&X)!=8){C.msg="unknown compression method",w.mode=30;break}if(Y-=4,T=8+(15&(X>>>=4)),w.wbits===0)w.wbits=T;else if(T>w.wbits){C.msg="invalid window size",w.mode=30;break}w.dmax=1<>8&1),512&w.flags&&(z[0]=255&X,z[1]=X>>>8&255,w.check=a(w.check,z,2,0)),Y=X=0,w.mode=3;case 3:for(;Y<32;){if(Z===0)break e;Z--,X+=F[j++]<>>8&255,z[2]=X>>>16&255,z[3]=X>>>24&255,w.check=a(w.check,z,4,0)),Y=X=0,w.mode=4;case 4:for(;Y<16;){if(Z===0)break e;Z--,X+=F[j++]<>8),512&w.flags&&(z[0]=255&X,z[1]=X>>>8&255,w.check=a(w.check,z,2,0)),Y=X=0,w.mode=5;case 5:if(1024&w.flags){for(;Y<16;){if(Z===0)break e;Z--,X+=F[j++]<>>8&255,w.check=a(w.check,z,2,0)),Y=X=0}else w.head&&(w.head.extra=null);w.mode=6;case 6:if(1024&w.flags&&(Z<(de=w.length)&&(de=Z),de&&(w.head&&(T=w.head.extra_len-w.length,w.head.extra||(w.head.extra=new Array(w.head.extra_len)),r.arraySet(w.head.extra,F,j,de,T)),512&w.flags&&(w.check=a(w.check,F,de,j)),Z-=de,j+=de,w.length-=de),w.length))break e;w.length=0,w.mode=7;case 7:if(2048&w.flags){if(Z===0)break e;for(de=0;T=F[j+de++],w.head&&T&&w.length<65536&&(w.head.name+=String.fromCharCode(T)),T&&de>9&1,w.head.done=!0),C.adler=w.check=0,w.mode=12;break;case 10:for(;Y<32;){if(Z===0)break e;Z--,X+=F[j++]<>>=7&Y,Y-=7&Y,w.mode=27;break}for(;Y<3;){if(Z===0)break e;Z--,X+=F[j++]<>>=1)){case 0:w.mode=14;break;case 1:if(S(w),w.mode=20,B!==6)break;X>>>=2,Y-=2;break e;case 2:w.mode=17;break;case 3:C.msg="invalid block type",w.mode=30}X>>>=2,Y-=2;break;case 14:for(X>>>=7&Y,Y-=7&Y;Y<32;){if(Z===0)break e;Z--,X+=F[j++]<>>16^65535)){C.msg="invalid stored block lengths",w.mode=30;break}if(w.length=65535&X,Y=X=0,w.mode=15,B===6)break e;case 15:w.mode=16;case 16:if(de=w.length){if(Z>>=5,Y-=5,w.ndist=1+(31&X),X>>>=5,Y-=5,w.ncode=4+(15&X),X>>>=4,Y-=4,286>>=3,Y-=3}for(;w.have<19;)w.lens[ee[w.have++]]=0;if(w.lencode=w.lendyn,w.lenbits=7,V={bits:w.lenbits},I=c(0,w.lens,0,19,w.lencode,0,w.work,V),w.lenbits=V.bits,I){C.msg="invalid code lengths set",w.mode=30;break}w.have=0,w.mode=19;case 19:for(;w.have>>16&255,we=65535&k,!((fe=k>>>24)<=Y);){if(Z===0)break e;Z--,X+=F[j++]<>>=fe,Y-=fe,w.lens[w.have++]=we;else{if(we===16){for(U=fe+2;Y>>=fe,Y-=fe,w.have===0){C.msg="invalid bit length repeat",w.mode=30;break}T=w.lens[w.have-1],de=3+(3&X),X>>>=2,Y-=2}else if(we===17){for(U=fe+3;Y>>=fe)),X>>>=3,Y-=3}else{for(U=fe+7;Y>>=fe)),X>>>=7,Y-=7}if(w.have+de>w.nlen+w.ndist){C.msg="invalid bit length repeat",w.mode=30;break}for(;de--;)w.lens[w.have++]=T}}if(w.mode===30)break;if(w.lens[256]===0){C.msg="invalid code -- missing end-of-block",w.mode=30;break}if(w.lenbits=9,V={bits:w.lenbits},I=c(h,w.lens,0,w.nlen,w.lencode,0,w.work,V),w.lenbits=V.bits,I){C.msg="invalid literal/lengths set",w.mode=30;break}if(w.distbits=6,w.distcode=w.distdyn,V={bits:w.distbits},I=c(u,w.lens,w.nlen,w.ndist,w.distcode,0,w.work,V),w.distbits=V.bits,I){C.msg="invalid distances set",w.mode=30;break}if(w.mode=20,B===6)break e;case 20:w.mode=21;case 21:if(6<=Z&&258<=re){C.next_out=$,C.avail_out=re,C.next_in=j,C.avail_in=Z,w.hold=X,w.bits=Y,l(C,pe),$=C.next_out,W=C.output,re=C.avail_out,j=C.next_in,F=C.input,Z=C.avail_in,X=w.hold,Y=w.bits,w.mode===12&&(w.back=-1);break}for(w.back=0;ve=(k=w.lencode[X&(1<>>16&255,we=65535&k,!((fe=k>>>24)<=Y);){if(Z===0)break e;Z--,X+=F[j++]<>Be)])>>>16&255,we=65535&k,!(Be+(fe=k>>>24)<=Y);){if(Z===0)break e;Z--,X+=F[j++]<>>=Be,Y-=Be,w.back+=Be}if(X>>>=fe,Y-=fe,w.back+=fe,w.length=we,ve===0){w.mode=26;break}if(32&ve){w.back=-1,w.mode=12;break}if(64&ve){C.msg="invalid literal/length code",w.mode=30;break}w.extra=15&ve,w.mode=22;case 22:if(w.extra){for(U=w.extra;Y>>=w.extra,Y-=w.extra,w.back+=w.extra}w.was=w.length,w.mode=23;case 23:for(;ve=(k=w.distcode[X&(1<>>16&255,we=65535&k,!((fe=k>>>24)<=Y);){if(Z===0)break e;Z--,X+=F[j++]<>Be)])>>>16&255,we=65535&k,!(Be+(fe=k>>>24)<=Y);){if(Z===0)break e;Z--,X+=F[j++]<>>=Be,Y-=Be,w.back+=Be}if(X>>>=fe,Y-=fe,w.back+=fe,64&ve){C.msg="invalid distance code",w.mode=30;break}w.offset=we,w.extra=15&ve,w.mode=24;case 24:if(w.extra){for(U=w.extra;Y>>=w.extra,Y-=w.extra,w.back+=w.extra}if(w.offset>w.dmax){C.msg="invalid distance too far back",w.mode=30;break}w.mode=25;case 25:if(re===0)break e;if(de=pe-re,w.offset>de){if((de=w.offset-de)>w.whave&&w.sane){C.msg="invalid distance too far back",w.mode=30;break}ie=de>w.wnext?(de-=w.wnext,w.wsize-de):w.wnext-de,de>w.length&&(de=w.length),he=w.window}else he=W,ie=$-w.offset,de=w.length;for(reA?(_=ie[he+x[B]],Y[ge+x[B]]):(_=96,0),b=1<>$)+(v-=b)]=R<<24|_<<16|S|0,v!==0;);for(b=1<>=1;if(b!==0?(X&=b-1,X+=b):X=0,B++,--pe[C]==0){if(C===F)break;C=u[d+x[B]]}if(W>>7)]}function ge(k,z){k.pending_buf[k.pending++]=255&z,k.pending_buf[k.pending++]=z>>>8&255}function pe(k,z,ee){k.bi_valid>m-ee?(k.bi_buf|=z<>m-k.bi_valid,k.bi_valid+=ee-m):(k.bi_buf|=z<>>=1,ee<<=1,0<--z;);return ee>>>1}function he(k,z,ee){var J,G,N=new Array(x+1),L=0;for(J=1;J<=x;J++)N[J]=L=L+ee[J-1]<<1;for(G=0;G<=z;G++){var H=k[2*G+1];H!==0&&(k[2*G]=ie(N[H]++,H))}}function fe(k){var z;for(z=0;z>1;1<=ee;ee--)Be(k,N,ee);for(G=K;ee=k.heap[1],k.heap[1]=k.heap[k.heap_len--],Be(k,N,1),J=k.heap[1],k.heap[--k.heap_max]=ee,k.heap[--k.heap_max]=J,N[2*G]=N[2*ee]+N[2*J],k.depth[G]=(k.depth[ee]>=k.depth[J]?k.depth[ee]:k.depth[J])+1,N[2*ee+1]=N[2*J+1]=G,k.heap[1]=G++,Be(k,N,1),2<=k.heap_len;);k.heap[--k.heap_max]=k.heap[1],(function(te,Te){var be,Re,De,ue,ye,Ve,ke=Te.dyn_tree,Ae=Te.max_code,Ge=Te.stat_desc.static_tree,q=Te.stat_desc.has_stree,Ee=Te.stat_desc.extra_bits,_e=Te.stat_desc.extra_base,Me=Te.stat_desc.max_length,xe=0;for(ue=0;ue<=x;ue++)te.bl_count[ue]=0;for(ke[2*te.heap[te.heap_max]+1]=0,be=te.heap_max+1;be>=7;G>>=1)if(1&le&&H.dyn_ltree[2*K]!==0)return o;if(H.dyn_ltree[18]!==0||H.dyn_ltree[20]!==0||H.dyn_ltree[26]!==0)return a;for(K=32;K>>3,(N=k.static_len+3+7>>>3)<=G&&(G=N)):G=N=ee+5,ee+4<=G&&z!==-1?U(k,z,ee,J):k.strategy===4||N===G?(pe(k,2+(J?1:0),3),Je(k,D,C)):(pe(k,4+(J?1:0),3),(function(H,K,le,te){var Te;for(pe(H,K-257,5),pe(H,le-1,5),pe(H,te-4,4),Te=0;Te>>8&255,k.pending_buf[k.d_buf+2*k.last_lit+1]=255&z,k.pending_buf[k.l_buf+k.last_lit]=255&ee,k.last_lit++,z===0?k.dyn_ltree[2*ee]++:(k.matches++,z--,k.dyn_ltree[2*(w[ee]+u+1)]++,k.dyn_dtree[2*Y(z)]++),k.last_lit===k.lit_bufsize-1},i._tr_align=function(k){pe(k,2,3),de(k,v,D),(function(z){z.bi_valid===16?(ge(z,z.bi_buf),z.bi_buf=0,z.bi_valid=0):8<=z.bi_valid&&(z.pending_buf[z.pending++]=255&z.bi_buf,z.bi_buf>>=8,z.bi_valid-=8)})(k)}},{"../utils/common":41}],53:[function(t,n,i){n.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(t,n,i){(function(r){(function(o,a){if(!o.setImmediate){var l,c,h,u,d=1,f={},p=!1,g=o.document,x=Object.getPrototypeOf&&Object.getPrototypeOf(o);x=x&&x.setTimeout?x:o,l={}.toString.call(o.process)==="[object process]"?function(y){process.nextTick(function(){b(y)})}:(function(){if(o.postMessage&&!o.importScripts){var y=!0,M=o.onmessage;return o.onmessage=function(){y=!1},o.postMessage("","*"),o.onmessage=M,y}})()?(u="setImmediate$"+Math.random()+"$",o.addEventListener?o.addEventListener("message",v,!1):o.attachEvent("onmessage",v),function(y){o.postMessage(u+y,"*")}):o.MessageChannel?((h=new MessageChannel).port1.onmessage=function(y){b(y.data)},function(y){h.port2.postMessage(y)}):g&&"onreadystatechange"in g.createElement("script")?(c=g.documentElement,function(y){var M=g.createElement("script");M.onreadystatechange=function(){b(y),M.onreadystatechange=null,c.removeChild(M),M=null},c.appendChild(M)}):function(y){setTimeout(b,0,y)},x.setImmediate=function(y){typeof y!="function"&&(y=new Function(""+y));for(var M=new Array(arguments.length-1),E=0;E"u"?r===void 0?this:r:self)}).call(this,typeof Ya<"u"?Ya:typeof self<"u"?self:typeof window<"u"?window:{})},{}]},{},[10])(10)})})(zp)),zp.exports}var O2=U2();const Vp=Fp(O2);function Gp(s,e){return function(){return s.apply(e,arguments)}}const{toString:F2}=Object.prototype,{getPrototypeOf:Yh}=Object,{iterator:$a,toStringTag:Wp}=Symbol,Ja=(s=>e=>{const t=F2.call(e);return s[t]||(s[t]=t.slice(8,-1).toLowerCase())})(Object.create(null)),Jn=s=>(s=s.toLowerCase(),e=>Ja(e)===s),Qa=s=>e=>typeof e===s,{isArray:Sr}=Array,Er=Qa("undefined");function Eo(s){return s!==null&&!Er(s)&&s.constructor!==null&&!Er(s.constructor)&&yn(s.constructor.isBuffer)&&s.constructor.isBuffer(s)}const Xp=Jn("ArrayBuffer");function z2(s){let e;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?e=ArrayBuffer.isView(s):e=s&&s.buffer&&Xp(s.buffer),e}const H2=Qa("string"),yn=Qa("function"),jp=Qa("number"),To=s=>s!==null&&typeof s=="object",V2=s=>s===!0||s===!1,el=s=>{if(Ja(s)!=="object")return!1;const e=Yh(s);return(e===null||e===Object.prototype||Object.getPrototypeOf(e)===null)&&!(Wp in s)&&!($a in s)},G2=s=>{if(!To(s)||Eo(s))return!1;try{return Object.keys(s).length===0&&Object.getPrototypeOf(s)===Object.prototype}catch{return!1}},W2=Jn("Date"),X2=Jn("File"),j2=Jn("Blob"),q2=Jn("FileList"),Z2=s=>To(s)&&yn(s.pipe),Y2=s=>{let e;return s&&(typeof FormData=="function"&&s instanceof FormData||yn(s.append)&&((e=Ja(s))==="formdata"||e==="object"&&yn(s.toString)&&s.toString()==="[object FormData]"))},K2=Jn("URLSearchParams"),[$2,J2,Q2,eM]=["ReadableStream","Request","Response","Headers"].map(Jn),tM=s=>s.trim?s.trim():s.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Ao(s,e,{allOwnKeys:t=!1}={}){if(s===null||typeof s>"u")return;let n,i;if(typeof s!="object"&&(s=[s]),Sr(s))for(n=0,i=s.length;n0;)if(i=t[n],e===i.toLowerCase())return i;return null}const vs=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Zp=s=>!Er(s)&&s!==vs;function Kh(){const{caseless:s,skipUndefined:e}=Zp(this)&&this||{},t={},n=(i,r)=>{const o=s&&qp(t,r)||r;el(t[o])&&el(i)?t[o]=Kh(t[o],i):el(i)?t[o]=Kh({},i):Sr(i)?t[o]=i.slice():(!e||!Er(i))&&(t[o]=i)};for(let i=0,r=arguments.length;i(Ao(e,(i,r)=>{t&&yn(i)?s[r]=Gp(i,t):s[r]=i},{allOwnKeys:n}),s),iM=s=>(s.charCodeAt(0)===65279&&(s=s.slice(1)),s),sM=(s,e,t,n)=>{s.prototype=Object.create(e.prototype,n),s.prototype.constructor=s,Object.defineProperty(s,"super",{value:e.prototype}),t&&Object.assign(s.prototype,t)},rM=(s,e,t,n)=>{let i,r,o;const a={};if(e=e||{},s==null)return e;do{for(i=Object.getOwnPropertyNames(s),r=i.length;r-- >0;)o=i[r],(!n||n(o,s,e))&&!a[o]&&(e[o]=s[o],a[o]=!0);s=t!==!1&&Yh(s)}while(s&&(!t||t(s,e))&&s!==Object.prototype);return e},oM=(s,e,t)=>{s=String(s),(t===void 0||t>s.length)&&(t=s.length),t-=e.length;const n=s.indexOf(e,t);return n!==-1&&n===t},aM=s=>{if(!s)return null;if(Sr(s))return s;let e=s.length;if(!jp(e))return null;const t=new Array(e);for(;e-- >0;)t[e]=s[e];return t},lM=(s=>e=>s&&e instanceof s)(typeof Uint8Array<"u"&&Yh(Uint8Array)),cM=(s,e)=>{const t=(s&&s[$a]).call(s);let n;for(;(n=t.next())&&!n.done;){const i=n.value;e.call(s,i[0],i[1])}},hM=(s,e)=>{let t;const n=[];for(;(t=s.exec(e))!==null;)n.push(t);return n},uM=Jn("HTMLFormElement"),dM=s=>s.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(e,t,n){return t.toUpperCase()+n}),Yp=(({hasOwnProperty:s})=>(e,t)=>s.call(e,t))(Object.prototype),fM=Jn("RegExp"),Kp=(s,e)=>{const t=Object.getOwnPropertyDescriptors(s),n={};Ao(t,(i,r)=>{let o;(o=e(i,r,s))!==!1&&(n[r]=o||i)}),Object.defineProperties(s,n)},pM=s=>{Kp(s,(e,t)=>{if(yn(s)&&["arguments","caller","callee"].indexOf(t)!==-1)return!1;const n=s[t];if(yn(n)){if(e.enumerable=!1,"writable"in e){e.writable=!1;return}e.set||(e.set=()=>{throw Error("Can not rewrite read-only method '"+t+"'")})}})},mM=(s,e)=>{const t={},n=i=>{i.forEach(r=>{t[r]=!0})};return Sr(s)?n(s):n(String(s).split(e)),t},gM=()=>{},xM=(s,e)=>s!=null&&Number.isFinite(s=+s)?s:e;function vM(s){return!!(s&&yn(s.append)&&s[Wp]==="FormData"&&s[$a])}const bM=s=>{const e=new Array(10),t=(n,i)=>{if(To(n)){if(e.indexOf(n)>=0)return;if(Eo(n))return n;if(!("toJSON"in n)){e[i]=n;const r=Sr(n)?[]:{};return Ao(n,(o,a)=>{const l=t(o,i+1);!Er(l)&&(r[a]=l)}),e[i]=void 0,r}}return n};return t(s,0)},yM=Jn("AsyncFunction"),_M=s=>s&&(To(s)||yn(s))&&yn(s.then)&&yn(s.catch),$p=((s,e)=>s?setImmediate:e?((t,n)=>(vs.addEventListener("message",({source:i,data:r})=>{i===vs&&r===t&&n.length&&n.shift()()},!1),i=>{n.push(i),vs.postMessage(t,"*")}))(`axios@${Math.random()}`,[]):t=>setTimeout(t))(typeof setImmediate=="function",yn(vs.postMessage)),MM=typeof queueMicrotask<"u"?queueMicrotask.bind(vs):typeof process<"u"&&process.nextTick||$p,wM=s=>s!=null&&yn(s[$a]),se={isArray:Sr,isArrayBuffer:Xp,isBuffer:Eo,isFormData:Y2,isArrayBufferView:z2,isString:H2,isNumber:jp,isBoolean:V2,isObject:To,isPlainObject:el,isEmptyObject:G2,isReadableStream:$2,isRequest:J2,isResponse:Q2,isHeaders:eM,isUndefined:Er,isDate:W2,isFile:X2,isBlob:j2,isRegExp:fM,isFunction:yn,isStream:Z2,isURLSearchParams:K2,isTypedArray:lM,isFileList:q2,forEach:Ao,merge:Kh,extend:nM,trim:tM,stripBOM:iM,inherits:sM,toFlatObject:rM,kindOf:Ja,kindOfTest:Jn,endsWith:oM,toArray:aM,forEachEntry:cM,matchAll:hM,isHTMLForm:uM,hasOwnProperty:Yp,hasOwnProp:Yp,reduceDescriptors:Kp,freezeMethods:pM,toObjectSet:mM,toCamelCase:dM,noop:gM,toFiniteNumber:xM,findKey:qp,global:vs,isContextDefined:Zp,isSpecCompliantForm:vM,toJSONObject:bM,isAsyncFn:yM,isThenable:_M,setImmediate:$p,asap:MM,isIterable:wM};function $e(s,e,t,n,i){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=s,this.name="AxiosError",e&&(this.code=e),t&&(this.config=t),n&&(this.request=n),i&&(this.response=i,this.status=i.status?i.status:null)}se.inherits($e,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:se.toJSONObject(this.config),code:this.code,status:this.status}}});const Jp=$e.prototype,Qp={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(s=>{Qp[s]={value:s}}),Object.defineProperties($e,Qp),Object.defineProperty(Jp,"isAxiosError",{value:!0}),$e.from=(s,e,t,n,i,r)=>{const o=Object.create(Jp);se.toFlatObject(s,o,function(c){return c!==Error.prototype},c=>c!=="isAxiosError");const a=s&&s.message?s.message:"Error",l=e==null&&s?s.code:e;return $e.call(o,a,l,t,n,i),s&&o.cause==null&&Object.defineProperty(o,"cause",{value:s,configurable:!0}),o.name=s&&s.name||"Error",r&&Object.assign(o,r),o};const SM=null;function $h(s){return se.isPlainObject(s)||se.isArray(s)}function em(s){return se.endsWith(s,"[]")?s.slice(0,-2):s}function tm(s,e,t){return s?s.concat(e).map(function(n,i){return n=em(n),!t&&i?"["+n+"]":n}).join(t?".":""):e}function EM(s){return se.isArray(s)&&!s.some($h)}const TM=se.toFlatObject(se,{},null,function(s){return/^is[A-Z]/.test(s)});function tl(s,e,t){if(!se.isObject(s))throw new TypeError("target must be an object");e=e||new FormData,t=se.toFlatObject(t,{metaTokens:!0,dots:!1,indexes:!1},!1,function(f,p){return!se.isUndefined(p[f])});const n=t.metaTokens,i=t.visitor||c,r=t.dots,o=t.indexes,a=(t.Blob||typeof Blob<"u"&&Blob)&&se.isSpecCompliantForm(e);if(!se.isFunction(i))throw new TypeError("visitor must be a function");function l(f){if(f===null)return"";if(se.isDate(f))return f.toISOString();if(se.isBoolean(f))return f.toString();if(!a&&se.isBlob(f))throw new $e("Blob is not supported. Use a Buffer instead.");return se.isArrayBuffer(f)||se.isTypedArray(f)?a&&typeof Blob=="function"?new Blob([f]):Buffer.from(f):f}function c(f,p,g){let x=f;if(f&&!g&&typeof f=="object"){if(se.endsWith(p,"{}"))p=n?p:p.slice(0,-2),f=JSON.stringify(f);else if(se.isArray(f)&&EM(f)||(se.isFileList(f)||se.endsWith(p,"[]"))&&(x=se.toArray(f)))return p=em(p),x.forEach(function(m,b){!(se.isUndefined(m)||m===null)&&e.append(o===!0?tm([p],b,r):o===null?p:p+"[]",l(m))}),!1}return $h(f)?!0:(e.append(tm(g,p,r),l(f)),!1)}const h=[],u=Object.assign(TM,{defaultVisitor:c,convertValue:l,isVisitable:$h});function d(f,p){if(!se.isUndefined(f)){if(h.indexOf(f)!==-1)throw Error("Circular reference detected in "+p.join("."));h.push(f),se.forEach(f,function(g,x){(!(se.isUndefined(g)||g===null)&&i.call(e,g,se.isString(x)?x.trim():x,p,u))===!0&&d(g,p?p.concat(x):[x])}),h.pop()}}if(!se.isObject(s))throw new TypeError("data must be an object");return d(s),e}function nm(s){const e={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(s).replace(/[!'()~]|%20|%00/g,function(t){return e[t]})}function Jh(s,e){this._pairs=[],s&&tl(s,this,e)}const im=Jh.prototype;im.append=function(s,e){this._pairs.push([s,e])},im.toString=function(s){const e=s?function(t){return s.call(this,t,nm)}:nm;return this._pairs.map(function(t){return e(t[0])+"="+e(t[1])},"").join("&")};function AM(s){return encodeURIComponent(s).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function sm(s,e,t){if(!e)return s;const n=t&&t.encode||AM;se.isFunction(t)&&(t={serialize:t});const i=t&&t.serialize;let r;if(i?r=i(e,t):r=se.isURLSearchParams(e)?e.toString():new Jh(e,t).toString(n),r){const o=s.indexOf("#");o!==-1&&(s=s.slice(0,o)),s+=(s.indexOf("?")===-1?"?":"&")+r}return s}class rm{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:n?n.synchronous:!1,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){se.forEach(this.handlers,function(t){t!==null&&e(t)})}}const om={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},CM=typeof URLSearchParams<"u"?URLSearchParams:Jh,PM=typeof FormData<"u"?FormData:null,RM=typeof Blob<"u"?Blob:null,LM={isBrowser:!0,classes:{URLSearchParams:CM,FormData:PM,Blob:RM},protocols:["http","https","file","blob","url","data"]},Qh=typeof window<"u"&&typeof document<"u",eu=typeof navigator=="object"&&navigator||void 0,DM=Qh&&(!eu||["ReactNative","NativeScript","NS"].indexOf(eu.product)<0),IM=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",BM=Qh&&window.location.href||"http://localhost",NM=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Qh,hasStandardBrowserEnv:DM,hasStandardBrowserWebWorkerEnv:IM,navigator:eu,origin:BM},Symbol.toStringTag,{value:"Module"})),rn={...NM,...LM};function kM(s,e){return tl(s,new rn.classes.URLSearchParams,{visitor:function(t,n,i,r){return rn.isNode&&se.isBuffer(t)?(this.append(n,t.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)},...e})}function UM(s){return se.matchAll(/\w+|\[(\w*)]/g,s).map(e=>e[0]==="[]"?"":e[1]||e[0])}function OM(s){const e={},t=Object.keys(s);let n;const i=t.length;let r;for(n=0;n=t.length;return o=!o&&se.isArray(i)?i.length:o,l?(se.hasOwnProp(i,o)?i[o]=[i[o],n]:i[o]=n,!a):((!i[o]||!se.isObject(i[o]))&&(i[o]=[]),e(t,n,i[o],r)&&se.isArray(i[o])&&(i[o]=OM(i[o])),!a)}if(se.isFormData(s)&&se.isFunction(s.entries)){const t={};return se.forEachEntry(s,(n,i)=>{e(UM(n),i,t,0)}),t}return null}function FM(s,e,t){if(se.isString(s))try{return(e||JSON.parse)(s),se.trim(s)}catch(n){if(n.name!=="SyntaxError")throw n}return(t||JSON.stringify)(s)}const Co={transitional:om,adapter:["xhr","http","fetch"],transformRequest:[function(s,e){const t=e.getContentType()||"",n=t.indexOf("application/json")>-1,i=se.isObject(s);if(i&&se.isHTMLForm(s)&&(s=new FormData(s)),se.isFormData(s))return n?JSON.stringify(am(s)):s;if(se.isArrayBuffer(s)||se.isBuffer(s)||se.isStream(s)||se.isFile(s)||se.isBlob(s)||se.isReadableStream(s))return s;if(se.isArrayBufferView(s))return s.buffer;if(se.isURLSearchParams(s))return e.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),s.toString();let r;if(i){if(t.indexOf("application/x-www-form-urlencoded")>-1)return kM(s,this.formSerializer).toString();if((r=se.isFileList(s))||t.indexOf("multipart/form-data")>-1){const o=this.env&&this.env.FormData;return tl(r?{"files[]":s}:s,o&&new o,this.formSerializer)}}return i||n?(e.setContentType("application/json",!1),FM(s)):s}],transformResponse:[function(s){const e=this.transitional||Co.transitional,t=e&&e.forcedJSONParsing,n=this.responseType==="json";if(se.isResponse(s)||se.isReadableStream(s))return s;if(s&&se.isString(s)&&(t&&!this.responseType||n)){const i=!(e&&e.silentJSONParsing)&&n;try{return JSON.parse(s,this.parseReviver)}catch(r){if(i)throw r.name==="SyntaxError"?$e.from(r,$e.ERR_BAD_RESPONSE,this,null,this.response):r}}return s}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:rn.classes.FormData,Blob:rn.classes.Blob},validateStatus:function(s){return s>=200&&s<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};se.forEach(["delete","get","head","post","put","patch"],s=>{Co.headers[s]={}});const zM=se.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),HM=s=>{const e={};let t,n,i;return s&&s.split(` -`).forEach(function(r){i=r.indexOf(":"),t=r.substring(0,i).trim().toLowerCase(),n=r.substring(i+1).trim(),!(!t||e[t]&&zM[t])&&(t==="set-cookie"?e[t]?e[t].push(n):e[t]=[n]:e[t]=e[t]?e[t]+", "+n:n)}),e},lm=Symbol("internals");function Po(s){return s&&String(s).trim().toLowerCase()}function nl(s){return s===!1||s==null?s:se.isArray(s)?s.map(nl):String(s)}function VM(s){const e=Object.create(null),t=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let n;for(;n=t.exec(s);)e[n[1]]=n[2];return e}const GM=s=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(s.trim());function tu(s,e,t,n,i){if(se.isFunction(n))return n.call(this,e,t);if(i&&(e=t),!!se.isString(e)){if(se.isString(n))return e.indexOf(n)!==-1;if(se.isRegExp(n))return n.test(e)}}function WM(s){return s.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(e,t,n)=>t.toUpperCase()+n)}function XM(s,e){const t=se.toCamelCase(" "+e);["get","set","has"].forEach(n=>{Object.defineProperty(s,n+t,{value:function(i,r,o){return this[n].call(this,e,i,r,o)},configurable:!0})})}let _n=class{constructor(s){s&&this.set(s)}set(s,e,t){const n=this;function i(o,a,l){const c=Po(a);if(!c)throw new Error("header name must be a non-empty string");const h=se.findKey(n,c);(!h||n[h]===void 0||l===!0||l===void 0&&n[h]!==!1)&&(n[h||a]=nl(o))}const r=(o,a)=>se.forEach(o,(l,c)=>i(l,c,a));if(se.isPlainObject(s)||s instanceof this.constructor)r(s,e);else if(se.isString(s)&&(s=s.trim())&&!GM(s))r(HM(s),e);else if(se.isObject(s)&&se.isIterable(s)){let o={},a,l;for(const c of s){if(!se.isArray(c))throw TypeError("Object iterator must return a key-value pair");o[l=c[0]]=(a=o[l])?se.isArray(a)?[...a,c[1]]:[a,c[1]]:c[1]}r(o,e)}else s!=null&&i(e,s,t);return this}get(s,e){if(s=Po(s),s){const t=se.findKey(this,s);if(t){const n=this[t];if(!e)return n;if(e===!0)return VM(n);if(se.isFunction(e))return e.call(this,n,t);if(se.isRegExp(e))return e.exec(n);throw new TypeError("parser must be boolean|regexp|function")}}}has(s,e){if(s=Po(s),s){const t=se.findKey(this,s);return!!(t&&this[t]!==void 0&&(!e||tu(this,this[t],t,e)))}return!1}delete(s,e){const t=this;let n=!1;function i(r){if(r=Po(r),r){const o=se.findKey(t,r);o&&(!e||tu(t,t[o],o,e))&&(delete t[o],n=!0)}}return se.isArray(s)?s.forEach(i):i(s),n}clear(s){const e=Object.keys(this);let t=e.length,n=!1;for(;t--;){const i=e[t];(!s||tu(this,this[i],i,s,!0))&&(delete this[i],n=!0)}return n}normalize(s){const e=this,t={};return se.forEach(this,(n,i)=>{const r=se.findKey(t,i);if(r){e[r]=nl(n),delete e[i];return}const o=s?WM(i):String(i).trim();o!==i&&delete e[i],e[o]=nl(n),t[o]=!0}),this}concat(...s){return this.constructor.concat(this,...s)}toJSON(s){const e=Object.create(null);return se.forEach(this,(t,n)=>{t!=null&&t!==!1&&(e[n]=s&&se.isArray(t)?t.join(", "):t)}),e}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([s,e])=>s+": "+e).join(` -`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(s){return s instanceof this?s:new this(s)}static concat(s,...e){const t=new this(s);return e.forEach(n=>t.set(n)),t}static accessor(s){const e=(this[lm]=this[lm]={accessors:{}}).accessors,t=this.prototype;function n(i){const r=Po(i);e[r]||(XM(t,i),e[r]=!0)}return se.isArray(s)?s.forEach(n):n(s),this}};_n.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),se.reduceDescriptors(_n.prototype,({value:s},e)=>{let t=e[0].toUpperCase()+e.slice(1);return{get:()=>s,set(n){this[t]=n}}}),se.freezeMethods(_n);function nu(s,e){const t=this||Co,n=e||t,i=_n.from(n.headers);let r=n.data;return se.forEach(s,function(o){r=o.call(t,r,i.normalize(),e?e.status:void 0)}),i.normalize(),r}function cm(s){return!!(s&&s.__CANCEL__)}function Tr(s,e,t){$e.call(this,s??"canceled",$e.ERR_CANCELED,e,t),this.name="CanceledError"}se.inherits(Tr,$e,{__CANCEL__:!0});function hm(s,e,t){const n=t.config.validateStatus;!t.status||!n||n(t.status)?s(t):e(new $e("Request failed with status code "+t.status,[$e.ERR_BAD_REQUEST,$e.ERR_BAD_RESPONSE][Math.floor(t.status/100)-4],t.config,t.request,t))}function jM(s){const e=/^([-+\w]{1,25})(:?\/\/|:)/.exec(s);return e&&e[1]||""}function qM(s,e){s=s||10;const t=new Array(s),n=new Array(s);let i=0,r=0,o;return e=e!==void 0?e:1e3,function(a){const l=Date.now(),c=n[r];o||(o=l),t[i]=a,n[i]=l;let h=r,u=0;for(;h!==i;)u+=t[h++],h=h%s;if(i=(i+1)%s,i===r&&(r=(r+1)%s),l-o{t=l,i=null,r&&(clearTimeout(r),r=null),s(...a)};return[(...a)=>{const l=Date.now(),c=l-t;c>=n?o(a,l):(i=a,r||(r=setTimeout(()=>{r=null,o(i)},n-c)))},()=>i&&o(i)]}const il=(s,e,t=3)=>{let n=0;const i=qM(50,250);return ZM(r=>{const o=r.loaded,a=r.lengthComputable?r.total:void 0,l=o-n,c=i(l),h=o<=a;n=o;const u={loaded:o,total:a,progress:a?o/a:void 0,bytes:l,rate:c||void 0,estimated:c&&a&&h?(a-o)/c:void 0,event:r,lengthComputable:a!=null,[e?"download":"upload"]:!0};s(u)},t)},um=(s,e)=>{const t=s!=null;return[n=>e[0]({lengthComputable:t,total:s,loaded:n}),e[1]]},dm=s=>(...e)=>se.asap(()=>s(...e)),YM=rn.hasStandardBrowserEnv?((s,e)=>t=>(t=new URL(t,rn.origin),s.protocol===t.protocol&&s.host===t.host&&(e||s.port===t.port)))(new URL(rn.origin),rn.navigator&&/(msie|trident)/i.test(rn.navigator.userAgent)):()=>!0,KM=rn.hasStandardBrowserEnv?{write(s,e,t,n,i,r,o){if(typeof document>"u")return;const a=[`${s}=${encodeURIComponent(e)}`];se.isNumber(t)&&a.push(`expires=${new Date(t).toUTCString()}`),se.isString(n)&&a.push(`path=${n}`),se.isString(i)&&a.push(`domain=${i}`),r===!0&&a.push("secure"),se.isString(o)&&a.push(`SameSite=${o}`),document.cookie=a.join("; ")},read(s){if(typeof document>"u")return null;const e=document.cookie.match(new RegExp("(?:^|; )"+s+"=([^;]*)"));return e?decodeURIComponent(e[1]):null},remove(s){this.write(s,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};function $M(s){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(s)}function JM(s,e){return e?s.replace(/\/?\/$/,"")+"/"+e.replace(/^\/+/,""):s}function fm(s,e,t){let n=!$M(e);return s&&(n||t==!1)?JM(s,e):e}const pm=s=>s instanceof _n?{...s}:s;function bs(s,e){e=e||{};const t={};function n(c,h,u,d){return se.isPlainObject(c)&&se.isPlainObject(h)?se.merge.call({caseless:d},c,h):se.isPlainObject(h)?se.merge({},h):se.isArray(h)?h.slice():h}function i(c,h,u,d){if(se.isUndefined(h)){if(!se.isUndefined(c))return n(void 0,c,u,d)}else return n(c,h,u,d)}function r(c,h){if(!se.isUndefined(h))return n(void 0,h)}function o(c,h){if(se.isUndefined(h)){if(!se.isUndefined(c))return n(void 0,c)}else return n(void 0,h)}function a(c,h,u){if(u in e)return n(c,h);if(u in s)return n(void 0,c)}const l={url:r,method:r,data:r,baseURL:o,transformRequest:o,transformResponse:o,paramsSerializer:o,timeout:o,timeoutMessage:o,withCredentials:o,withXSRFToken:o,adapter:o,responseType:o,xsrfCookieName:o,xsrfHeaderName:o,onUploadProgress:o,onDownloadProgress:o,decompress:o,maxContentLength:o,maxBodyLength:o,beforeRedirect:o,transport:o,httpAgent:o,httpsAgent:o,cancelToken:o,socketPath:o,responseEncoding:o,validateStatus:a,headers:(c,h,u)=>i(pm(c),pm(h),u,!0)};return se.forEach(Object.keys({...s,...e}),function(c){const h=l[c]||i,u=h(s[c],e[c],c);se.isUndefined(u)&&h!==a||(t[c]=u)}),t}const mm=s=>{const e=bs({},s);let{data:t,withXSRFToken:n,xsrfHeaderName:i,xsrfCookieName:r,headers:o,auth:a}=e;if(e.headers=o=_n.from(o),e.url=sm(fm(e.baseURL,e.url,e.allowAbsoluteUrls),s.params,s.paramsSerializer),a&&o.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):""))),se.isFormData(t)){if(rn.hasStandardBrowserEnv||rn.hasStandardBrowserWebWorkerEnv)o.setContentType(void 0);else if(se.isFunction(t.getHeaders)){const l=t.getHeaders(),c=["content-type","content-length"];Object.entries(l).forEach(([h,u])=>{c.includes(h.toLowerCase())&&o.set(h,u)})}}if(rn.hasStandardBrowserEnv&&(n&&se.isFunction(n)&&(n=n(e)),n||n!==!1&&YM(e.url))){const l=i&&r&&KM.read(r);l&&o.set(i,l)}return e},QM=typeof XMLHttpRequest<"u",e3=QM&&function(s){return new Promise(function(e,t){const n=mm(s);let i=n.data;const r=_n.from(n.headers).normalize();let{responseType:o,onUploadProgress:a,onDownloadProgress:l}=n,c,h,u,d,f;function p(){d&&d(),f&&f(),n.cancelToken&&n.cancelToken.unsubscribe(c),n.signal&&n.signal.removeEventListener("abort",c)}let g=new XMLHttpRequest;g.open(n.method.toUpperCase(),n.url,!0),g.timeout=n.timeout;function x(){if(!g)return;const b=_n.from("getAllResponseHeaders"in g&&g.getAllResponseHeaders()),v={data:!o||o==="text"||o==="json"?g.responseText:g.response,status:g.status,statusText:g.statusText,headers:b,config:s,request:g};hm(function(y){e(y),p()},function(y){t(y),p()},v),g=null}"onloadend"in g?g.onloadend=x:g.onreadystatechange=function(){!g||g.readyState!==4||g.status===0&&!(g.responseURL&&g.responseURL.indexOf("file:")===0)||setTimeout(x)},g.onabort=function(){g&&(t(new $e("Request aborted",$e.ECONNABORTED,s,g)),g=null)},g.onerror=function(b){const v=b&&b.message?b.message:"Network Error",y=new $e(v,$e.ERR_NETWORK,s,g);y.event=b||null,t(y),g=null},g.ontimeout=function(){let b=n.timeout?"timeout of "+n.timeout+"ms exceeded":"timeout exceeded";const v=n.transitional||om;n.timeoutErrorMessage&&(b=n.timeoutErrorMessage),t(new $e(b,v.clarifyTimeoutError?$e.ETIMEDOUT:$e.ECONNABORTED,s,g)),g=null},i===void 0&&r.setContentType(null),"setRequestHeader"in g&&se.forEach(r.toJSON(),function(b,v){g.setRequestHeader(v,b)}),se.isUndefined(n.withCredentials)||(g.withCredentials=!!n.withCredentials),o&&o!=="json"&&(g.responseType=n.responseType),l&&([u,f]=il(l,!0),g.addEventListener("progress",u)),a&&g.upload&&([h,d]=il(a),g.upload.addEventListener("progress",h),g.upload.addEventListener("loadend",d)),(n.cancelToken||n.signal)&&(c=b=>{g&&(t(!b||b.type?new Tr(null,s,g):b),g.abort(),g=null)},n.cancelToken&&n.cancelToken.subscribe(c),n.signal&&(n.signal.aborted?c():n.signal.addEventListener("abort",c)));const m=jM(n.url);if(m&&rn.protocols.indexOf(m)===-1){t(new $e("Unsupported protocol "+m+":",$e.ERR_BAD_REQUEST,s));return}g.send(i||null)})},t3=(s,e)=>{const{length:t}=s=s?s.filter(Boolean):[];if(e||t){let n=new AbortController,i;const r=function(c){if(!i){i=!0,a();const h=c instanceof Error?c:this.reason;n.abort(h instanceof $e?h:new Tr(h instanceof Error?h.message:h))}};let o=e&&setTimeout(()=>{o=null,r(new $e(`timeout ${e} of ms exceeded`,$e.ETIMEDOUT))},e);const a=()=>{s&&(o&&clearTimeout(o),o=null,s.forEach(c=>{c.unsubscribe?c.unsubscribe(r):c.removeEventListener("abort",r)}),s=null)};s.forEach(c=>c.addEventListener("abort",r));const{signal:l}=n;return l.unsubscribe=()=>se.asap(a),l}},n3=function*(s,e){let t=s.byteLength;if(t{const i=i3(s,e);let r=0,o,a=l=>{o||(o=!0,n&&n(l))};return new ReadableStream({async pull(l){try{const{done:c,value:h}=await i.next();if(c){a(),l.close();return}let u=h.byteLength;if(t){let d=r+=u;t(d)}l.enqueue(new Uint8Array(h))}catch(c){throw a(c),c}},cancel(l){return a(l),i.return()}},{highWaterMark:2})},xm=64*1024,{isFunction:sl}=se,r3=(({Request:s,Response:e})=>({Request:s,Response:e}))(se.global),{ReadableStream:vm,TextEncoder:bm}=se.global,ym=(s,...e)=>{try{return!!s(...e)}catch{return!1}},o3=s=>{s=se.merge.call({skipUndefined:!0},r3,s);const{fetch:e,Request:t,Response:n}=s,i=e?sl(e):typeof fetch=="function",r=sl(t),o=sl(n);if(!i)return!1;const a=i&&sl(vm),l=i&&(typeof bm=="function"?(p=>g=>p.encode(g))(new bm):async p=>new Uint8Array(await new t(p).arrayBuffer())),c=r&&a&&ym(()=>{let p=!1;const g=new t(rn.origin,{body:new vm,method:"POST",get duplex(){return p=!0,"half"}}).headers.has("Content-Type");return p&&!g}),h=o&&a&&ym(()=>se.isReadableStream(new n("").body)),u={stream:h&&(p=>p.body)};i&&["text","arrayBuffer","blob","formData","stream"].forEach(p=>{!u[p]&&(u[p]=(g,x)=>{let m=g&&g[p];if(m)return m.call(g);throw new $e(`Response type '${p}' is not supported`,$e.ERR_NOT_SUPPORT,x)})});const d=async p=>{if(p==null)return 0;if(se.isBlob(p))return p.size;if(se.isSpecCompliantForm(p))return(await new t(rn.origin,{method:"POST",body:p}).arrayBuffer()).byteLength;if(se.isArrayBufferView(p)||se.isArrayBuffer(p))return p.byteLength;if(se.isURLSearchParams(p)&&(p=p+""),se.isString(p))return(await l(p)).byteLength},f=async(p,g)=>se.toFiniteNumber(p.getContentLength())??d(g);return async p=>{let{url:g,method:x,data:m,signal:b,cancelToken:v,timeout:y,onDownloadProgress:M,onUploadProgress:E,responseType:A,headers:R,withCredentials:_="same-origin",fetchOptions:S}=mm(p),D=e||fetch;A=A?(A+"").toLowerCase():"text";let C=t3([b,v&&v.toAbortSignal()],y),B=null;const w=C&&C.unsubscribe&&(()=>{C.unsubscribe()});let F;try{if(E&&c&&x!=="get"&&x!=="head"&&(F=await f(R,m))!==0){let X=new t(g,{method:"POST",body:m,duplex:"half"}),Y;if(se.isFormData(m)&&(Y=X.headers.get("content-type"))&&R.setContentType(Y),X.body){const[ge,pe]=um(F,il(dm(E)));m=gm(X.body,xm,ge,pe)}}se.isString(_)||(_=_?"include":"omit");const W=r&&"credentials"in t.prototype,j={...S,signal:C,method:x.toUpperCase(),headers:R.normalize().toJSON(),body:m,duplex:"half",credentials:W?_:void 0};B=r&&new t(g,j);let $=await(r?D(B,S):D(g,j));const Z=h&&(A==="stream"||A==="response");if(h&&(M||Z&&w)){const X={};["status","statusText","headers"].forEach(de=>{X[de]=$[de]});const Y=se.toFiniteNumber($.headers.get("content-length")),[ge,pe]=M&&um(Y,il(dm(M),!0))||[];$=new n(gm($.body,xm,ge,()=>{pe&&pe(),w&&w()}),X)}A=A||"text";let re=await u[se.findKey(u,A)||"text"]($,p);return!Z&&w&&w(),await new Promise((X,Y)=>{hm(X,Y,{data:re,headers:_n.from($.headers),status:$.status,statusText:$.statusText,config:p,request:B})})}catch(W){throw w&&w(),W&&W.name==="TypeError"&&/Load failed|fetch/i.test(W.message)?Object.assign(new $e("Network Error",$e.ERR_NETWORK,p,B),{cause:W.cause||W}):$e.from(W,W&&W.code,p,B)}}},a3=new Map,_m=s=>{let e=s&&s.env||{};const{fetch:t,Request:n,Response:i}=e,r=[n,i,t];let o=r.length,a=o,l,c,h=a3;for(;a--;)l=r[a],c=h.get(l),c===void 0&&h.set(l,c=a?new Map:o3(e)),h=c;return c};_m();const iu={http:SM,xhr:e3,fetch:{get:_m}};se.forEach(iu,(s,e)=>{if(s){try{Object.defineProperty(s,"name",{value:e})}catch{}Object.defineProperty(s,"adapterName",{value:e})}});const Mm=s=>`- ${s}`,l3=s=>se.isFunction(s)||s===null||s===!1;function c3(s,e){s=se.isArray(s)?s:[s];const{length:t}=s;let n,i;const r={};for(let o=0;o`adapter ${l} `+(c===!1?"is not supported by the environment":"is not available in the build"));let a=t?o.length>1?`since : -`+o.map(Mm).join(` -`):" "+Mm(o[0]):"as no adapter specified";throw new $e("There is no suitable adapter to dispatch the request "+a,"ERR_NOT_SUPPORT")}return i}const wm={getAdapter:c3,adapters:iu};function su(s){if(s.cancelToken&&s.cancelToken.throwIfRequested(),s.signal&&s.signal.aborted)throw new Tr(null,s)}function Sm(s){return su(s),s.headers=_n.from(s.headers),s.data=nu.call(s,s.transformRequest),["post","put","patch"].indexOf(s.method)!==-1&&s.headers.setContentType("application/x-www-form-urlencoded",!1),wm.getAdapter(s.adapter||Co.adapter,s)(s).then(function(e){return su(s),e.data=nu.call(s,s.transformResponse,e),e.headers=_n.from(e.headers),e},function(e){return cm(e)||(su(s),e&&e.response&&(e.response.data=nu.call(s,s.transformResponse,e.response),e.response.headers=_n.from(e.response.headers))),Promise.reject(e)})}const Em="1.13.2",rl={};["object","boolean","number","function","string","symbol"].forEach((s,e)=>{rl[s]=function(t){return typeof t===s||"a"+(e<1?"n ":" ")+s}});const Tm={};rl.transitional=function(s,e,t){function n(i,r){return"[Axios v"+Em+"] Transitional option '"+i+"'"+r+(t?". "+t:"")}return(i,r,o)=>{if(s===!1)throw new $e(n(r," has been removed"+(e?" in "+e:"")),$e.ERR_DEPRECATED);return e&&!Tm[r]&&(Tm[r]=!0,console.warn(n(r," has been deprecated since v"+e+" and will be removed in the near future"))),s?s(i,r,o):!0}},rl.spelling=function(s){return(e,t)=>(console.warn(`${t} is likely a misspelling of ${s}`),!0)};function h3(s,e,t){if(typeof s!="object")throw new $e("options must be an object",$e.ERR_BAD_OPTION_VALUE);const n=Object.keys(s);let i=n.length;for(;i-- >0;){const r=n[i],o=e[r];if(o){const a=s[r],l=a===void 0||o(a,r,s);if(l!==!0)throw new $e("option "+r+" must be "+l,$e.ERR_BAD_OPTION_VALUE);continue}if(t!==!0)throw new $e("Unknown option "+r,$e.ERR_BAD_OPTION)}}const ol={assertOptions:h3,validators:rl},ci=ol.validators;let ys=class{constructor(s){this.defaults=s||{},this.interceptors={request:new rm,response:new rm}}async request(s,e){try{return await this._request(s,e)}catch(t){if(t instanceof Error){let n={};Error.captureStackTrace?Error.captureStackTrace(n):n=new Error;const i=n.stack?n.stack.replace(/^.+\n/,""):"";try{t.stack?i&&!String(t.stack).endsWith(i.replace(/^.+\n.+\n/,""))&&(t.stack+=` -`+i):t.stack=i}catch{}}throw t}}_request(s,e){typeof s=="string"?(e=e||{},e.url=s):e=s||{},e=bs(this.defaults,e);const{transitional:t,paramsSerializer:n,headers:i}=e;t!==void 0&&ol.assertOptions(t,{silentJSONParsing:ci.transitional(ci.boolean),forcedJSONParsing:ci.transitional(ci.boolean),clarifyTimeoutError:ci.transitional(ci.boolean)},!1),n!=null&&(se.isFunction(n)?e.paramsSerializer={serialize:n}:ol.assertOptions(n,{encode:ci.function,serialize:ci.function},!0)),e.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?e.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:e.allowAbsoluteUrls=!0),ol.assertOptions(e,{baseUrl:ci.spelling("baseURL"),withXsrfToken:ci.spelling("withXSRFToken")},!0),e.method=(e.method||this.defaults.method||"get").toLowerCase();let r=i&&se.merge(i.common,i[e.method]);i&&se.forEach(["delete","get","head","post","put","patch","common"],f=>{delete i[f]}),e.headers=_n.concat(r,i);const o=[];let a=!0;this.interceptors.request.forEach(function(f){typeof f.runWhen=="function"&&f.runWhen(e)===!1||(a=a&&f.synchronous,o.unshift(f.fulfilled,f.rejected))});const l=[];this.interceptors.response.forEach(function(f){l.push(f.fulfilled,f.rejected)});let c,h=0,u;if(!a){const f=[Sm.bind(this),void 0];for(f.unshift(...o),f.push(...l),u=f.length,c=Promise.resolve(e);h{if(!n._listeners)return;let r=n._listeners.length;for(;r-- >0;)n._listeners[r](i);n._listeners=null}),this.promise.then=i=>{let r;const o=new Promise(a=>{n.subscribe(a),r=a}).then(i);return o.cancel=function(){n.unsubscribe(r)},o},e(function(i,r,o){n.reason||(n.reason=new Tr(i,r,o),t(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}toAbortSignal(){const e=new AbortController,t=n=>{e.abort(n)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let e;return{token:new Y0(function(t){e=t}),cancel:e}}};function d3(s){return function(e){return s.apply(null,e)}}function f3(s){return se.isObject(s)&&s.isAxiosError===!0}const ru={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(ru).forEach(([s,e])=>{ru[e]=s});function Am(s){const e=new ys(s),t=Gp(ys.prototype.request,e);return se.extend(t,ys.prototype,e,{allOwnKeys:!0}),se.extend(t,e,null,{allOwnKeys:!0}),t.create=function(n){return Am(bs(s,n))},t}const Lt=Am(Co);Lt.Axios=ys,Lt.CanceledError=Tr,Lt.CancelToken=u3,Lt.isCancel=cm,Lt.VERSION=Em,Lt.toFormData=tl,Lt.AxiosError=$e,Lt.Cancel=Lt.CanceledError,Lt.all=function(s){return Promise.all(s)},Lt.spread=d3,Lt.isAxiosError=f3,Lt.mergeConfig=bs,Lt.AxiosHeaders=_n,Lt.formToJSON=s=>am(se.isHTMLForm(s)?new FormData(s):s),Lt.getAdapter=wm.getAdapter,Lt.HttpStatusCode=ru,Lt.default=Lt;const{Axios:fA,AxiosError:pA,CanceledError:mA,isCancel:gA,CancelToken:xA,VERSION:vA,all:bA,Cancel:yA,isAxiosError:_A,spread:MA,toFormData:wA,AxiosHeaders:SA,HttpStatusCode:EA,formToJSON:TA,getAdapter:AA,mergeConfig:CA}=Lt;function p3(s,e){var t;if(window.XMLHttpRequest?t=new XMLHttpRequest:window.ActiveXObject?t=new window.ActiveXObject:alert("请升级至最新版本的浏览器"),t!=null){let n=s;t.open("GET",n,!0),t.send(null),t.onreadystatechange=function(){t.readyState==4&&t.status==200&&(t.responseText.includes("",0)&&t.responseText.includes("",0)&&t.responseText.includes("",0)?e(null):e(t.responseText))},t.onloadend=function(){t.readyState==4&&t.status==404&&t.status==502&&e(null)}}}function m3(s,e){Lt({method:"get",responseType:"blob",url:s}).then(t=>{let n=new window.File([t.data],"zipFolder",{type:"zip"});Vp.loadAsync(n).then(i=>{const r=new Map,o=[];for(let a in i.files){if(i.files[a].dir)continue;const l=i.file(i.files[a].name);if(l){const c=l.async("blob").then(h=>{const u=URL.createObjectURL(h);r.set("/"+i.files[a].name.replace("\\","/"),u)});o.push(c)}}Promise.all(o).then(()=>{e(r)}).catch(a=>{console.error("解压zip文件失败:",a),e(new Map)})}).catch(i=>{console.error("加载zip文件失败:",i),e(new Map)})}).catch(t=>{console.error("下载zip文件失败:",t),e(new Map)})}function Cm(s,e){Lt({method:"get",responseType:"blob",url:s}).then(n=>{let i=new window.File([n.data],"semantics",{type:"zip"});Vp.loadAsync(i).then(r=>{for(let o in r.files)r.file(r.files[o].name).async("blob").then(a=>{t(a,"utf-8",function(l,c){e(c)})})})});function t(n,i,r){var o=new FileReader,a=new Blob([n]);o.onload=function(l){r(null,l.target.result)},o.onerror=function(l){r(l.error,null)},o.readAsText(a,i)}}const ou=new WeakMap;class g3 extends hs{constructor(e){super(e),this.decoderPath="",this.decoderConfig={},this.decoderBinary=null,this.decoderPending=null,this.workerLimit=4,this.workerPool=[],this.workerNextTaskID=1,this.workerSourceURL="",this.defaultAttributeIDs={position:"POSITION",normal:"NORMAL",color:"COLOR",uv:"TEX_COORD"},this.defaultAttributeTypes={position:"Float32Array",normal:"Float32Array",color:"Float32Array",uv:"Float32Array"}}setDecoderPath(e){return this.decoderPath=e,this}setDecoderConfig(e){return this.decoderConfig=e,this}setWorkerLimit(e){return this.workerLimit=e,this}load(e,t,n,i){const r=new Ia(this.manager);r.setPath(this.path),r.setResponseType("arraybuffer"),r.setRequestHeader(this.requestHeader),r.setWithCredentials(this.withCredentials),r.load(e,o=>{this.parse(o,t,i)},n,i)}parse(e,t,n=()=>{}){this.decodeDracoFile(e,t,null,null,gt,n).catch(n)}decodeDracoFile(e,t,n,i,r=Rt,o=()=>{}){const a={attributeIDs:n||this.defaultAttributeIDs,attributeTypes:i||this.defaultAttributeTypes,useUniqueIDs:!!n,vertexColorSpace:r};return this.decodeGeometry(e,a).then(t).catch(o)}decodeGeometry(e,t){const n=JSON.stringify(t);if(ou.has(e)){const l=ou.get(e);if(l.key===n)return l.promise;if(e.byteLength===0)throw new Error("THREE.DRACOLoader: Unable to re-decode a buffer with different settings. Buffer has already been transferred.")}let i;const r=this.workerNextTaskID++,o=e.byteLength,a=this._getWorker(r,o).then(l=>(i=l,new Promise((c,h)=>{i._callbacks[r]={resolve:c,reject:h},i.postMessage({type:"decode",id:r,taskConfig:t,buffer:e},[e])}))).then(l=>this._createGeometry(l.geometry));return a.catch(()=>!0).then(()=>{i&&r&&this._releaseTask(i,r)}),ou.set(e,{key:n,promise:a}),a}_createGeometry(e){const t=new ht;e.index&&t.setIndex(new at(e.index.array,1));for(let n=0;n{n.load(e,i,void 0,r)})}preload(){return this._initDecoder(),this}_initDecoder(){if(this.decoderPending)return this.decoderPending;const e=typeof WebAssembly!="object"||this.decoderConfig.type==="js",t=[];return e?t.push(this._loadLibrary("draco_decoder.js","text")):(t.push(this._loadLibrary("draco_wasm_wrapper.js","text")),t.push(this._loadLibrary("draco_decoder.wasm","arraybuffer"))),this.decoderPending=Promise.all(t).then(n=>{const i=n[0];e||(this.decoderConfig.wasmBinary=n[1]);const r=x3.toString(),o=["/* draco decoder */",i,"","/* worker */",r.substring(r.indexOf("{")+1,r.lastIndexOf("}"))].join(` -`);this.workerSourceURL=URL.createObjectURL(new Blob([o]))}),this.decoderPending}_getWorker(e,t){return this._initDecoder().then(()=>{if(this.workerPool.lengthr._taskLoad?-1:1});const n=this.workerPool[this.workerPool.length-1];return n._taskCosts[e]=t,n._taskLoad+=t,n})}_releaseTask(e,t){e._taskLoad-=e._taskCosts[t],delete e._callbacks[t],delete e._taskCosts[t]}debug(){console.log("Task load: ",this.workerPool.map(e=>e._taskLoad))}dispose(){for(let e=0;e{const u=h.draco,d=new u.Decoder;try{const f=t(u,d,new Int8Array(l),c),p=f.attributes.map(g=>g.array.buffer);f.index&&p.push(f.index.array.buffer),self.postMessage({type:"decode",id:a.id,geometry:f},p)}catch(f){console.error(f),self.postMessage({type:"error",id:a.id,error:f.message})}finally{u.destroy(d)}});break}};function t(o,a,l,c){const h=c.attributeIDs,u=c.attributeTypes;let d,f;const p=a.GetEncodedGeometryType(l);if(p===o.TRIANGULAR_MESH)d=new o.Mesh,f=a.DecodeArrayToMesh(l,l.byteLength,d);else if(p===o.POINT_CLOUD)d=new o.PointCloud,f=a.DecodeArrayToPointCloud(l,l.byteLength,d);else throw new Error("THREE.DRACOLoader: Unexpected geometry type.");if(!f.ok()||d.ptr===0)throw new Error("THREE.DRACOLoader: Decoding failed: "+f.error_msg());const g={index:null,attributes:[]};for(const x in h){const m=self[u[x]];let b,v;if(c.useUniqueIDs)v=h[x],b=a.GetAttributeByUniqueId(d,v);else{if(v=a.GetAttributeId(d,o[h[x]]),v===-1)continue;b=a.GetAttribute(d,v)}const y=i(o,a,d,x,m,b);x==="color"&&(y.vertexColorSpace=c.vertexColorSpace),g.attributes.push(y)}return p===o.TRIANGULAR_MESH&&(g.index=n(o,a,d)),o.destroy(d),g}function n(o,a,l){const c=l.num_faces()*3,h=c*4,u=o._malloc(h);a.GetTrianglesUInt32Array(l,h,u);const d=new Uint32Array(o.HEAPF32.buffer,u,c).slice();return o._free(u),{array:d,itemSize:1}}function i(o,a,l,c,h,u){const d=l.num_points(),f=u.num_components(),p=r(o,h),g=f*h.BYTES_PER_ELEMENT,x=Math.ceil(g/4)*4,m=x/h.BYTES_PER_ELEMENT,b=d*g,v=d*x,y=o._malloc(b);a.GetAttributeDataArrayForAllPoints(l,u,p,b,y);const M=new h(o.HEAPF32.buffer,y,b/h.BYTES_PER_ELEMENT);let E;if(g===x)E=M.slice();else{E=new h(v/h.BYTES_PER_ELEMENT);let A=0;for(let R=0,_=M.length;R<_;R++){for(let S=0;S(s.ModelLoadStart="model-load-start",s.ModelLoadProgress="model-load-progress",s.ModelLoaded="model-loaded",s.ModelError="model-error",s.SelectionChanged="selection-changed",s.HoverChanged="hover-changed",s.Click="click",s.MouseMove="mouse-move",s.CameraChanged="camera-changed",s.CameraIdle="camera-idle",s.ViewportResize="viewport-resize",s.EngineFree="engine-free",s.EngineBusy="engine-busy",s))(Ar||{});function v3(s,e,t,n){let i=0,r=0,o=0,a=s.models.find(f=>f.url==t),l=e.circularMeps,c=e.rectMeps.filter(f=>f.type==="风管"),h=e.rectMeps.filter(f=>f.type==="桥架"),u=e.ellipseMeps,d=s.scene;if(new Xt,new ht,al(d,"InstancedMesh"),l&&l.length){let f=[];for(let p of l)p.color=new Ue(`rgb(${p.color})`),p.position={x:p.startPoint.X*.3048+i,y:p.startPoint.Z*.3048+r,z:-p.startPoint.Y*.3048+o},p.rotation={x:0,y:0,z:0},a.nodesMap.set(p.id,[p]),f.push(p);ll("Circle",d,f,2)}if(al(d,"InstancedMesh"),c&&c.length){let f=[];for(let p of c)p.color=new Ue(`rgb(${p.color})`),p.position={x:p.startPoint.X*.3048+i,y:p.startPoint.Z*.3048+r,z:-p.startPoint.Y*.3048+o},p.rotation={x:0,y:0,z:0},a.nodesMap.set(p.id,[p]),f.push(p);ll("Rect",d,f,3)}if(al(d,"InstancedMesh"),u&&u.length){let f=[];for(let p of u)p.color=new Ue(`rgb(${p.color})`),p.position={x:p.startPoint.X*.3048+i,y:p.startPoint.Z*.3048+r,z:-p.startPoint.Y*.3048+o},p.rotation={x:0,y:0,z:0},a.nodesMap.set(p.id,[p]),f.push(p);ll("Ellipse",d,f,4)}if(al(d,"InstancedMesh"),h&&h.length){let f=[];for(let p of h)p.color=new Ue(`rgb(${p.color})`),p.position={x:p.startPoint.X*.3048+i,y:p.startPoint.Z*.3048+r,z:-p.startPoint.Y*.3048+o},p.rotation={x:0,y:0,z:0},a.nodesMap.set(p.id,[p]),f.push(p);ll("Bridge",d,f,5)}}function al(s,e){let t=new ho(e.geometry,e.material,1);t.index=e.index,t.dataType=e.type,t.url=e.url,t.relativeIndex=e.relativeIndex,t.name="机电",s.add(t)}function ll(s,e,t,n,i){let r,o,a={width:1,height:1,length:1,diameter:1,color:new Ue,position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0}};switch(s){case"Rect":o=cl("Rect",a);break;case"Bridge":o=cl("Bridge",a);break;case"Circle":o=cl("Circle",a);break;case"Ellipse":o=cl("Ellipse",a);break}o&&(r=new ho(o.geometry,o.material,t.length));let l=[];for(var c=0;cd.endPoint.Z?1:-1)*Math.PI*.5,d.base_x!=null){var h=new P(d.base_x.X,0,-d.base_x.Y);b=(h.clone().cross(new P(0,0,1)).y<=0?1:-1)*h.angleTo(new P(0,0,1))+Math.PI*.5}}else b=(p.clone().sub(f.clone()).cross(new P(0,0,1)).y>0?-1:1)*p.clone().sub(f.clone()).angleTo(new P(0,0,1)),m=(d.startPoint.Z>d.endPoint.Z?1:-1)*p.clone().sub(f.clone()).angleTo(x.clone().sub(g.clone()));let y=new ze;const M=new mn(m,b,v,"YXZ");let E=y.clone().makeRotationFromEuler(M),A,R;s==="Circle"?(A=d.diameter,R=d.diameter):(A=d.width,R=d.height);let _=y.clone().makeScale(A,R,d.length);y.multiplyMatrices(E,_),y.setPosition(d.position.x,d.position.y,d.position.z),r.setMatrixAt(c,y.clone()),r.setColorAt(c,d.color),r.geometry.computeBoundingBox();let S=r.geometry.boundingBox.min.clone().applyMatrix4(y.clone()),D=r.geometry.boundingBox.max.clone().applyMatrix4(y.clone()),C=new P(Math.min(S.x,D.x),Math.min(S.y,D.y),Math.min(S.z,D.z)),B=new P(Math.max(S.x,D.x),Math.max(S.y,D.y),Math.max(S.z,D.z)),w=C.clone().add(B.clone()).multiplyScalar(.5),F={name:d.name,min:C,max:B,center:w,dbid:c,materialName:o.material.name},W=null,j=null;s==="Circle"&&(W={x:d.startPoint.X*.3048,y:d.startPoint.Z*.3048,z:-d.startPoint.Y*.3048},j={x:d.endPoint.X*.3048,y:d.endPoint.Z*.3048,z:-d.endPoint.Y*.3048},F.minC=W,F.maxC=j),l.push(F)}r.castShadow=!0,r.ElementInfos=l,r.name="rootModel",r.TypeName="InstancedMesh-Pipe",r.PipeType=s,r.MeshId=null,r.realMaterial=r.material.clone(),r.originalMaterial=r.material.clone();let u=[];u={geometry:r.geometry,matrix:r.matrix,position:r.position,rotation:r.rotation},r.meshs=u,r.instanceMatrix&&r.instanceMatrix.array&&(r.cloneInstanceMatrix=Array.from(r.instanceMatrix.array)),r.index=n,r.Version="V1",e.children[n]=r}function cl(s,e,t){let n=new Uf;switch(e.width=e.width*.3048,e.height=e.height*.3048,e.diameter=e.diameter*.3048,s){case"Rect":n.moveTo(-e.width/2,-e.height/2),n.lineTo(-e.width/2,e.height/2),n.lineTo(e.width/2,e.height/2),n.lineTo(e.width/2,-e.height/2),n.lineTo(-e.width/2,-e.height/2);break;case"Ellipse":n.moveTo(-e.width/2,-e.height/2),n.lineTo(-e.width/2,e.height/2),n.lineTo(e.width/2,e.height/2),n.lineTo(e.width/2,-e.height/2),n.lineTo(-e.width/2,-e.height/2);break;case"Bridge":n.moveTo(-e.width/2,-e.height/2),n.lineTo(-e.width/2,e.height/2),n.lineTo(-e.width/2+.01,e.height/2),n.lineTo(-e.width/2+.01,-e.height/2+.01),n.lineTo(e.width/2-.01,-e.height/2+.01),n.lineTo(e.width/2-.01,e.height/2),n.lineTo(e.width/2,e.height/2),n.lineTo(e.width/2,-e.height/2),n.lineTo(-e.width/2,-e.height/2);break;case"Circle":n.moveTo(0,0),n.absarc(0,0,e.diameter*.5,0,Math.PI*2,!1);break}const i={depth:e.length*.3048,bevelEnabled:!1};return r(n,i,e.color,e.position,e.rotation);function r(o,a,l,c,h){let u=new Rh(o,a),d=new pv({color:l,side:Et}),f=new ut(u,d);return f.position.set(c.x,c.y,c.z),f.rotation._order="YXZ",f.rotation.set(h.x,h.y,h.z),f}}function b3(s,e=!1){const t=s[0].index!==null,n=new Set(Object.keys(s[0].attributes)),i=new Set(Object.keys(s[0].morphAttributes)),r={},o={},a=s[0].morphTargetsRelative,l=new ht;let c=0;for(let h=0;h=2.0 are supported."));return}const c=new Q3(r,{path:t||this.resourcePath||"",crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager,ktx2Loader:this.ktx2Loader,meshoptDecoder:this.meshoptDecoder});c.fileLoader.setRequestHeader(this.requestHeader);for(let h=0;h=0&&a[u]===void 0&&console.warn('THREE.GLTFLoader: Unknown extension "'+u+'".')}}c.setExtensions(o),c.setPlugins(a),c.parse(n,i)}parseAsync(e,t){const n=this;return new Promise(function(i,r){n.parse(e,t,i,r)})}}function _3(){let s={};return{get:function(e){return s[e]},add:function(e,t){s[e]=t},remove:function(e){delete s[e]},removeAll:function(){s={}}}}const nt={KHR_BINARY_GLTF:"KHR_binary_glTF",KHR_DRACO_MESH_COMPRESSION:"KHR_draco_mesh_compression",KHR_LIGHTS_PUNCTUAL:"KHR_lights_punctual",KHR_MATERIALS_CLEARCOAT:"KHR_materials_clearcoat",KHR_MATERIALS_DISPERSION:"KHR_materials_dispersion",KHR_MATERIALS_IOR:"KHR_materials_ior",KHR_MATERIALS_SHEEN:"KHR_materials_sheen",KHR_MATERIALS_SPECULAR:"KHR_materials_specular",KHR_MATERIALS_TRANSMISSION:"KHR_materials_transmission",KHR_MATERIALS_IRIDESCENCE:"KHR_materials_iridescence",KHR_MATERIALS_ANISOTROPY:"KHR_materials_anisotropy",KHR_MATERIALS_UNLIT:"KHR_materials_unlit",KHR_MATERIALS_VOLUME:"KHR_materials_volume",KHR_TEXTURE_BASISU:"KHR_texture_basisu",KHR_TEXTURE_TRANSFORM:"KHR_texture_transform",KHR_MESH_QUANTIZATION:"KHR_mesh_quantization",KHR_MATERIALS_EMISSIVE_STRENGTH:"KHR_materials_emissive_strength",EXT_MATERIALS_BUMP:"EXT_materials_bump",EXT_TEXTURE_WEBP:"EXT_texture_webp",EXT_TEXTURE_AVIF:"EXT_texture_avif",EXT_MESHOPT_COMPRESSION:"EXT_meshopt_compression",EXT_MESH_GPU_INSTANCING:"EXT_mesh_gpu_instancing"};class M3{constructor(e){this.parser=e,this.name=nt.KHR_LIGHTS_PUNCTUAL,this.cache={refs:{},uses:{}}}_markDefs(){const e=this.parser,t=this.parser.json.nodes||[];for(let n=0,i=t.length;n=0)throw new Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures");return null}return t.loadTextureImage(e,r.source,o)}}class k3{constructor(e){this.parser=e,this.name=nt.EXT_TEXTURE_WEBP}loadTexture(e){const t=this.name,n=this.parser,i=n.json,r=i.textures[e];if(!r.extensions||!r.extensions[t])return null;const o=r.extensions[t],a=i.images[o.source];let l=n.textureLoader;if(a.uri){const c=n.options.manager.getHandler(a.uri);c!==null&&(l=c)}return n.loadTextureImage(e,o.source,l)}}class U3{constructor(e){this.parser=e,this.name=nt.EXT_TEXTURE_AVIF}loadTexture(e){const t=this.name,n=this.parser,i=n.json,r=i.textures[e];if(!r.extensions||!r.extensions[t])return null;const o=r.extensions[t],a=i.images[o.source];let l=n.textureLoader;if(a.uri){const c=n.options.manager.getHandler(a.uri);c!==null&&(l=c)}return n.loadTextureImage(e,o.source,l)}}class O3{constructor(e){this.name=nt.EXT_MESHOPT_COMPRESSION,this.parser=e}loadBufferView(e){const t=this.parser.json,n=t.bufferViews[e];if(n.extensions&&n.extensions[this.name]){const i=n.extensions[this.name],r=this.parser.getDependency("buffer",i.buffer),o=this.parser.options.meshoptDecoder;if(!o||!o.supported){if(t.extensionsRequired&&t.extensionsRequired.indexOf(this.name)>=0)throw new Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files");return null}return r.then(function(a){const l=i.byteOffset||0,c=i.byteLength||0,h=i.count,u=i.byteStride,d=new Uint8Array(a,l,c);return o.decodeGltfBufferAsync?o.decodeGltfBufferAsync(h,u,d,i.mode,i.filter).then(function(f){return f.buffer}):o.ready.then(function(){const f=new ArrayBuffer(h*u);return o.decodeGltfBuffer(new Uint8Array(f),h,u,d,i.mode,i.filter),f})})}else return null}}class F3{constructor(e){this.name=nt.EXT_MESH_GPU_INSTANCING,this.parser=e}createNodeMesh(e){const t=this.parser.json,n=t.nodes[e];if(!n.extensions||!n.extensions[this.name]||n.mesh===void 0)return null;const i=t.meshes[n.mesh];for(const l of i.primitives)if(l.mode!==Nn.TRIANGLES&&l.mode!==Nn.TRIANGLE_STRIP&&l.mode!==Nn.TRIANGLE_FAN&&l.mode!==void 0)return null;const r=n.extensions[this.name].attributes,o=[],a={};for(const l in r)o.push(this.parser.getDependency("accessor",r[l]).then(c=>(a[l]=c,a[l])));return o.length<1?null:(o.push(this.parser.createNodeMesh(e)),Promise.all(o).then(l=>{const c=l.pop(),h=c.isGroup?c.children:[c],u=l[0].count,d=[];for(const f of h){const p=new ze,g=new P,x=new Dn,m=new P(1,1,1),b=new ho(f.geometry,f.material,u);for(let v=0;v0||s.search(/^data\:image\/jpeg/)===0?"image/jpeg":s.search(/\.webp($|\?)/i)>0||s.search(/^data\:image\/webp/)===0?"image/webp":s.search(/\.ktx2($|\?)/i)>0||s.search(/^data\:image\/ktx2/)===0?"image/ktx2":"image/png"}const J3=new ze;class Q3{constructor(e={},t={}){this.json=e,this.extensions={},this.plugins={},this.options=t,this.cache=new _3,this.associations=new Map,this.primitiveCache={},this.nodeCache={},this.meshCache={refs:{},uses:{}},this.cameraCache={refs:{},uses:{}},this.lightCache={refs:{},uses:{}},this.sourceCache={},this.textureCache={},this.nodeNamesUsed={};let n=!1,i=-1,r=!1,o=-1;if(typeof navigator<"u"){const a=navigator.userAgent;n=/^((?!chrome|android).)*safari/i.test(a)===!0;const l=a.match(/Version\/(\d+)/);i=n&&l?parseInt(l[1],10):-1,r=a.indexOf("Firefox")>-1,o=r?a.match(/Firefox\/([0-9]+)\./)[1]:-1}typeof createImageBitmap>"u"||n&&i<17||r&&o<98?this.textureLoader=new Yf(this.options.manager):this.textureLoader=new kv(this.options.manager),this.textureLoader.setCrossOrigin(this.options.crossOrigin),this.textureLoader.setRequestHeader(this.options.requestHeader),this.fileLoader=new Ia(this.options.manager),this.fileLoader.setResponseType("arraybuffer"),this.options.crossOrigin==="use-credentials"&&this.fileLoader.setWithCredentials(!0)}setExtensions(e){this.extensions=e}setPlugins(e){this.plugins=e}parse(e,t){const n=this,i=this.json,r=this.extensions;this.cache.removeAll(),this.nodeCache={},this._invokeAll(function(o){return o._markDefs&&o._markDefs()}),Promise.all(this._invokeAll(function(o){return o.beforeRoot&&o.beforeRoot()})).then(function(){return Promise.all([n.getDependencies("scene"),n.getDependencies("animation"),n.getDependencies("camera")])}).then(function(o){const a={scene:o[0][i.scene||0],scenes:o[0],animations:o[1],cameras:o[2],asset:i.asset,parser:n,userData:{}};return _s(r,a,i),hi(a,i),Promise.all(n._invokeAll(function(l){return l.afterRoot&&l.afterRoot(a)})).then(function(){for(const l of a.scenes)l.updateMatrixWorld();e(a)})}).catch(t)}_markDefs(){const e=this.json.nodes||[],t=this.json.skins||[],n=this.json.meshes||[];for(let i=0,r=t.length;i{const l=this.associations.get(o);l!=null&&this.associations.set(a,l);for(const[c,h]of o.children.entries())r(h,a.children[c])};return r(n,i),i.name+="_instance_"+e.uses[t]++,i}_invokeOne(e){const t=Object.values(this.plugins);t.push(this);for(let n=0;n=2&&x.setY(_,E[A*l+1]),l>=3&&x.setZ(_,E[A*l+2]),l>=4&&x.setW(_,E[A*l+3]),l>=5)throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.")}x.normalized=p}return x})}loadTexture(e){const t=this.json,n=this.options,i=t.textures[e].source,r=t.images[i];let o=this.textureLoader;if(r.uri){const a=n.manager.getHandler(r.uri);a!==null&&(o=a)}return this.loadTextureImage(e,i,o)}loadTextureImage(e,t,n){const i=this,r=this.json,o=r.textures[e],a=r.images[t],l=(a.uri||a.bufferView)+":"+o.sampler;if(this.textureCache[l])return this.textureCache[l];const c=this.loadImageSource(t,n).then(function(h){h.flipY=!1,h.name=o.name||a.name||"",h.name===""&&typeof a.uri=="string"&&a.uri.startsWith("data:image/")===!1&&(h.name=a.uri);const u=(r.samplers||{})[o.sampler]||{};return h.magFilter=Bm[u.magFilter]||$t,h.minFilter=Bm[u.minFilter]||gi,h.wrapS=Nm[u.wrapS]||ni,h.wrapT=Nm[u.wrapT]||ni,h.generateMipmaps=!h.isCompressedTexture&&h.minFilter!==Kt&&h.minFilter!==$t,i.associations.set(h,{textures:e}),h}).catch(function(){return null});return this.textureCache[l]=c,c}loadImageSource(e,t){const n=this,i=this.json,r=this.options;if(this.sourceCache[e]!==void 0)return this.sourceCache[e].then(u=>u.clone());const o=i.images[e],a=self.URL||self.webkitURL;let l=o.uri||"",c=!1;if(o.bufferView!==void 0)l=n.getDependency("bufferView",o.bufferView).then(function(u){c=!0;const d=new Blob([u],{type:o.mimeType});return l=a.createObjectURL(d),l});else if(o.uri===void 0)throw new Error("THREE.GLTFLoader: Image "+e+" is missing URI and bufferView");const h=Promise.resolve(l).then(function(u){return new Promise(function(d,f){let p=d;t.isImageBitmapLoader===!0&&(p=function(g){const x=new Ht(g);x.needsUpdate=!0,d(x)}),t.load(Mo.resolveURL(u,r.path),p,void 0,f)})}).then(function(u){return c===!0&&a.revokeObjectURL(l),hi(u,o),u.userData.mimeType=o.mimeType||$3(o.uri),u}).catch(function(u){throw console.error("THREE.GLTFLoader: Couldn't load texture",l),u});return this.sourceCache[e]=h,h}assignTexture(e,t,n,i){const r=this;return this.getDependency("texture",n.index).then(function(o){if(!o)return null;if(n.texCoord!==void 0&&n.texCoord>0&&(o=o.clone(),o.channel=n.texCoord),r.extensions[nt.KHR_TEXTURE_TRANSFORM]){const a=n.extensions!==void 0?n.extensions[nt.KHR_TEXTURE_TRANSFORM]:void 0;if(a){const l=r.associations.get(o);o=r.extensions[nt.KHR_TEXTURE_TRANSFORM].extendTexture(o,a),r.associations.set(o,l)}}return i!==void 0&&(o.colorSpace=i),e[t]=o,o})}assignFinalMaterial(e){const t=e.geometry;let n=e.material;const i=t.attributes.tangent===void 0,r=t.attributes.color!==void 0,o=t.attributes.normal===void 0;if(e.isPoints){const a="PointsMaterial:"+n.uuid;let l=this.cache.get(a);l||(l=new Tf,gn.prototype.copy.call(l,n),l.color.copy(n.color),l.map=n.map,l.sizeAttenuation=!1,this.cache.add(a,l)),n=l}else if(e.isLine){const a="LineBasicMaterial:"+n.uuid;let l=this.cache.get(a);l||(l=new as,gn.prototype.copy.call(l,n),l.color.copy(n.color),l.map=n.map,this.cache.add(a,l)),n=l}if(i||r||o){let a="ClonedMaterial:"+n.uuid+":";i&&(a+="derivative-tangents:"),r&&(a+="vertex-colors:"),o&&(a+="flat-shading:");let l=this.cache.get(a);l||(l=n.clone(),r&&(l.vertexColors=!0),o&&(l.flatShading=!0),i&&(l.normalScale&&(l.normalScale.y*=-1),l.clearcoatNormalScale&&(l.clearcoatNormalScale.y*=-1)),this.cache.add(a,l),this.associations.set(l,this.associations.get(n))),n=l}e.material=n}getMaterialType(){return cs}loadMaterial(e){const t=this,n=this.json,i=this.extensions,r=n.materials[e];let o;const a={},l=r.extensions||{},c=[];if(l[nt.KHR_MATERIALS_UNLIT]){const u=i[nt.KHR_MATERIALS_UNLIT];o=u.getMaterialType(),c.push(u.extendParams(a,r,t))}else{const u=r.pbrMetallicRoughness||{};if(a.color=new Ue(1,1,1),a.opacity=1,Array.isArray(u.baseColorFactor)){const d=u.baseColorFactor;a.color.setRGB(d[0],d[1],d[2],Rt),a.opacity=d[3]}u.baseColorTexture!==void 0&&c.push(t.assignTexture(a,"map",u.baseColorTexture,gt)),a.metalness=u.metallicFactor!==void 0?u.metallicFactor:1,a.roughness=u.roughnessFactor!==void 0?u.roughnessFactor:1,u.metallicRoughnessTexture!==void 0&&(c.push(t.assignTexture(a,"metalnessMap",u.metallicRoughnessTexture)),c.push(t.assignTexture(a,"roughnessMap",u.metallicRoughnessTexture))),o=this._invokeOne(function(d){return d.getMaterialType&&d.getMaterialType(e)}),c.push(Promise.all(this._invokeAll(function(d){return d.extendMaterialParams&&d.extendMaterialParams(e,a)})))}r.doubleSided===!0&&(a.side=Et);const h=r.alphaMode||cu.OPAQUE;if(h===cu.BLEND?(a.transparent=!0,a.depthWrite=!1):(a.transparent=!1,h===cu.MASK&&(a.alphaTest=r.alphaCutoff!==void 0?r.alphaCutoff:.5)),r.normalTexture!==void 0&&o!==Xt&&(c.push(t.assignTexture(a,"normalMap",r.normalTexture)),a.normalScale=new ce(1,1),r.normalTexture.scale!==void 0)){const u=r.normalTexture.scale;a.normalScale.set(u,u)}if(r.occlusionTexture!==void 0&&o!==Xt&&(c.push(t.assignTexture(a,"aoMap",r.occlusionTexture)),r.occlusionTexture.strength!==void 0&&(a.aoMapIntensity=r.occlusionTexture.strength)),r.emissiveFactor!==void 0&&o!==Xt){const u=r.emissiveFactor;a.emissive=new Ue().setRGB(u[0],u[1],u[2],Rt)}return r.emissiveTexture!==void 0&&o!==Xt&&c.push(t.assignTexture(a,"emissiveMap",r.emissiveTexture,gt)),Promise.all(c).then(function(){const u=new o(a);return r.name&&(u.name=r.name),hi(u,r),t.associations.set(u,{materials:e}),r.extensions&&_s(i,u,r),u})}createUniqueName(e){const t=dt.sanitizeNodeName(e||"");return t in this.nodeNamesUsed?t+"_"+ ++this.nodeNamesUsed[t]:(this.nodeNamesUsed[t]=0,t)}loadGeometries(e){const t=this,n=this.extensions,i=this.primitiveCache;function r(a){return n[nt.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(a,t).then(function(l){return km(l,a,t)})}const o=[];for(let a=0,l=e.length;a0&&Y3(m,r),m.name=t.createUniqueName(r.name||"mesh_"+e),hi(m,r),x.extensions&&_s(i,m,x),t.assignFinalMaterial(m),u.push(m)}for(let f=0,p=u.length;f1?h=new xn:c.length===1?h=c[0]:h=new St,h!==c[0])for(let u=0,d=c.length;u1){const u=i.associations.get(h);i.associations.set(h,{...u})}return i.associations.get(h).nodes=e,h}),this.nodeCache[e]}loadScene(e){const t=this.extensions,n=this.json.scenes[e],i=this,r=new xn;n.name&&(r.name=i.createUniqueName(n.name)),hi(r,n),n.extensions&&_s(t,r,n);const o=n.nodes||[],a=[];for(let l=0,c=o.length;l{const u=new Map;for(const[d,f]of i.associations)(d instanceof gn||d instanceof Ht)&&u.set(d,f);return h.traverse(d=>{const f=i.associations.get(d);f!=null&&u.set(d,f)}),u};return i.associations=c(r),r})}_createAnimationTracks(e,t,n,i,r){const o=[],a=e.name?e.name:e.uuid,l=[];qi[r.path]===qi.weights?e.traverse(function(d){d.morphTargetInfluences&&l.push(d.name?d.name:d.uuid)}):l.push(a);let c;switch(qi[r.path]){case qi.weights:c=fr;break;case qi.rotation:c=pr;break;case qi.translation:case qi.scale:c=gr;break;default:switch(n.itemSize){case 1:c=fr;break;case 2:case 3:default:c=gr;break}break}const h=i.interpolation!==void 0?j3[i.interpolation]:qr,u=this._getArrayFromAccessor(n);for(let d=0,f=l.length;d{let r=JSON.parse(i);s.engineStatus.models.push({type:"light",info:r,name:r.baseInfo.name,status:"loading",url:e,elements:new Map}),s.models==null&&(s.models=[]),s.models.push({url:e,nodesMap:new Map,boundingBox:{min:new P(r.baseInfo.min.X*.3048,r.baseInfo.min.Z*.3048,-r.baseInfo.min.Y*.3048),max:new P(r.baseInfo.max.X*.3048,r.baseInfo.max.Z*.3048,-r.baseInfo.max.Y*.3048)}}),s.events.trigger(Ar.EngineFree,null)})}function nw(s){s.engineStatus.models.forEach(e=>{e.loadStatus==null&&(e.loadStatus={mep:!1,instance:!1,normal:!1}),e.status==="loading"&&e.type==="light"&&(e.loadStatus.modelMep!=!0&&(e.loadStatus.modelMep=!0,v3(s,e.info.modelMep,e.url)),e.loadStatus.normal!=!0&&iw(s,e))})}function iw(s,e){if(s.camera.position,e.size,e.info==null||e.info.lods==null)return;e.info.lods.forEach(n=>{if(n.status!=!0)if(n.glbs==null)console.log("加载GLB............."),n.glbs={},m3(e.url+n.path,i=>{p3(i.get("/nodes.json"),r=>{let o=JSON.parse(r),a=new Map;s.models.find(c=>c.url==e.url).nodesMap=a;let l=0;for(let c in o){o[c].forEach(d=>{d.glb=c,a.has(d.id)==!1?a.set(d.id,{infos:[d]}):a.get(d.id).infos.push(d)});let h=new y3;const u=new g3;u.setDecoderPath("/static/js/draco/"),u.preload(),h.setDRACOLoader(u),h.load(i.get(c+".glb"),d=>{n.glbs[c]=d.scene.children,l++,l==Object.keys(o).length&&s.engineStatus.isFree&&(s.events.trigger(Ar.EngineFree,null),s.viewCube.CameraGoHome())})}})});else{console.log("加载模型.............");let i=t(e,n,n.octreeBox),r=[],o=s.models.find(a=>a.url==e.url);i.forEach(a=>{o.nodesMap.has(a)&&o.nodesMap.get(a).infos.forEach(l=>{let c=n.glbs[l.glb][l.mesh];if(c!=null&&c.geometry!=null&&c.material!=null){let h=new ze;h.elements=l.matrix;let u=new ut(c.geometry.clone().applyMatrix4(h),c.material),d=new xt().setFromObject(u);l.box=d,l.mesh=u,u.name=a,u.glb=l.glb,u.url=e.url,r.push(u)}})}),console.log("加载模型数量",r.length),sw(e.url,s,r)}});function t(n,i,r){let o=[];if(r.status!=!0){if(!s.engineStatus.isFree)return o;let a=new P(r.min.X,r.min.Z,-r.min.Y),l=new P(r.max.X,r.max.Z,-r.max.Y);l.distanceTo(a);let c=s.camera.position,h=new P(a.x+l.x/2,a.y+l.y/2,a.z+l.z/2);c.distanceTo(h),r.elements.forEach(u=>{o.push(u)}),r.children.forEach(u=>{o.push(...t(n,i,u))}),r.children.findIndex(u=>u.status!=!0)==-1&&(r.status=!0),r.children.length==0&&(r.status=!0)}return o}}function sw(s,e,t){let n=[];t.forEach(i=>{n.findIndex(o=>o.glb==i.glb)==-1?n.push({glb:i.glb,meshes:[i],currentIndex:i.geometry.index.count,indexes:new Map}):(n.find(o=>o.glb==i.glb).meshes.push(i),n.find(o=>o.glb==i.glb).currentIndex+=i.geometry.index.count);let r=n.find(o=>o.glb==i.glb);r.indexes.set(Number(i.name),[r.currentIndex-i.geometry.index.count,r.currentIndex])}),n.forEach(i=>{let r=e.scene.children.find(o=>o instanceof ut&&o.url==s&&o.glb==i.glb);if(r!=null)r.castShadow=!0,r.receiveShadow=!0;else{let o=new ht;i.meshes.map(c=>c.material),o=b3(i.meshes.map(c=>c.geometry),!0);let a=new ut(o,i.meshes.map(c=>c.material));a.castShadow=!0,a.receiveShadow=!0,e.scene.add(a),a.index=e.scene.children.length-1,a.url=s,a.glb=i.glb,a.indexes=i.indexes,a.materialClone=i.meshes[0].material;let l=e.models.find(c=>c.url==s);if(l!=null){let c=0;i.indexes.forEach(h=>{l.nodesMap.get(Number(i.meshes[c].name)).indexes==null&&(l.nodesMap.get(Number(i.meshes[c].name)).indexes=[]),l.nodesMap.get(Number(i.meshes[c].name)).indexes.push([a.index,c++,h[0],h[1]])})}a.material instanceof Array?a.material.forEach(c=>{Um(c)}):Um(a.material)}})}function Um(s){s.shadowSide=Pn,s.roughness=.6,s.metalness=0,s.side=Et,s.map!=null&&(s.map.colorSpace=gt,s.map.needsUpdate=!0,console.log("优化贴图")),s instanceof cs&&(s.map&&(s.map.colorSpace=gt,s.map.needsUpdate=!0),s.emissiveMap&&(s.emissiveMap.colorSpace=gt,s.emissiveMap.needsUpdate=!0),s.roughnessMap&&(s.roughnessMap.colorSpace=Rt,s.roughnessMap.needsUpdate=!0),s.metalnessMap&&(s.metalnessMap.colorSpace=Rt,s.metalnessMap.needsUpdate=!0),s.normalMap&&(s.normalMap.colorSpace=Rt,s.normalMap.needsUpdate=!0),s.aoMap&&(s.aoMap.colorSpace=Rt,s.aoMap.needsUpdate=!0),s.roughness=Math.max(.1,Math.min(1,s.roughness)),s.metalness=Math.max(0,Math.min(1,s.metalness)),s.envMapIntensity=s.envMapIntensity||1,s.needsUpdate=!0),s instanceof Kn&&(this.optimizeMaterial(s),s.transmissionMap&&(s.transmissionMap.colorSpace=Rt,s.transmissionMap.needsUpdate=!0),s.thicknessMap&&(s.thicknessMap.colorSpace=Rt,s.thicknessMap.needsUpdate=!0),s.transmission=Math.max(0,Math.min(1,s.transmission)),s.thickness=Math.max(0,Math.min(10,s.thickness))),s instanceof Xt&&s.map&&(s.map.colorSpace=gt,s.map.needsUpdate=!0),s instanceof Xf&&(s.map&&(s.map.colorSpace=gt,s.map.needsUpdate=!0),s.emissiveMap&&(s.emissiveMap.colorSpace=gt,s.emissiveMap.needsUpdate=!0))}class rw{engine;constructor(e){this.engine=e}async loadModels(e,t){for(const i of e)n(i)==="light"&&tw(this.engine,i);function n(i){const r=i.split(".").pop();return r==="glb"||r==="gltf"?"gltf":"light"}}}class ow{engine;isFree;highlightModels;hideModels;models;constructor(e){this.engine=e,this.isFree=!0,this.highlightModels=[],this.hideModels=[],this.models=[]}init(){this.engine.events.on(Ar.EngineFree,()=>{this.updateFree(!0),console.log("引擎空闲"),nw(this.engine)}),this.engine.events.on(Ar.EngineBusy,()=>{this.updateFree(!1),console.log("引擎繁忙")})}updateFree(e){this.isFree=e}closeAllFunction=()=>{}}class aw{listeners=new Map;on(e,t){this.listeners.has(e)||this.listeners.set(e,[]),this.listeners.get(e).push(t)}off(e,t){if(!this.listeners.has(e))return;const n=this.listeners.get(e),i=n.indexOf(t);i!==-1&&n.splice(i,1)}trigger(e,t){this.listeners.has(e)&&this.listeners.get(e).forEach(n=>{try{n(t)}catch(i){console.error(`Error in event listener for ${e}:`,i)}})}}class lw{engine;constructor(e){this.engine=e}init(){const e=new vr(16777215,2);e.position.set(10,20,10),e.castShadow=!0,e.shadow.mapSize.width=4096,e.shadow.mapSize.height=4096,e.shadow.camera.near=.1,e.shadow.camera.far=500,e.shadow.bias=-5e-5,e.shadow.normalBias=.02;const t=50;e.shadow.camera.left=-t,e.shadow.camera.right=t,e.shadow.camera.top=t,e.shadow.camera.bottom=-t,e.shadow.radius=2,this.engine.scene.add(e);const n=new Na(16777215,1);this.engine.scene.add(n)}}var Ti=(s=>(s.ModelLoadStart="model-load-start",s.ModelLoadProgress="model-load-progress",s.ModelLoaded="model-loaded",s.ModelError="model-error",s.SelectionChanged="selection-changed",s.HoverChanged="hover-changed",s.Click="click",s.MouseMove="mouse-move",s.CameraChanged="camera-changed",s.CameraIdle="camera-idle",s.EngineFree="engine-free",s.EngineBusy="engine-busy",s.MeasureChanged="measure-changed",s))(Ti||{});class cw{engine;behavior;isCtrlDown=!1;constructor(e){this.engine=e}init(){this.behavior=this.engine.handelBehaved,this.behavior.init(this)}active(){this.behavior.active()}disActive(){this.behavior.disActive()}handelKeyCtrlUp(){this.isCtrlDown=!1}handelKeyCtrlDown(){this.isCtrlDown=!0}handleMouseClick(e){if(this.handleMouseClickInstance(e.raycaster),e.catch){const t=e.catch;t.object,this.engine.events.trigger(Ti.Click,t);let n=t.object;this.isCtrlDown||this.engine.modelToolModule.unhighlightAllModels(),console.log([{url:n.url,ids:[n.name]}]),this.engine.controlModule.orbitControls.origin.set(t.point.x,t.point.y,t.point.z),this.engine.modelToolModule.highlightModel([{url:n.url,ids:[n.name]}])}else this.engine.modelToolModule.unhighlightAllModels()}handleMouseDoubleClick(e){if(e.catch){const n=e.catch;n.object,this.engine.events.trigger(Ti.Click,n);let i=n.object,r=this.engine.models.find(a=>a.url===i.url).nodesMap.get(i.name).infos.map(a=>a.box),o=t(r);this.engine.viewCube.zoomToModel(o)}function t(n){let i=new P(1e8,1e9,1e10),r=new P(-1e8,-1e9,-1e10);return n.forEach(o=>{o.min.xr.x&&(r.x=o.max.x),o.max.y>r.y&&(r.y=o.max.y),o.max.z>r.z&&(r.z=o.max.z)}),new xt(i,r)}}handleMouseClickInstance(e){return e.intersectObjects(this.engine.scene.children.filter(t=>t instanceof ho),!0)}}class hw{engine;highlightMaterial;hideMaterial;constructor(e){this.engine=e,this.highlightMaterial=new Xt({color:43775,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.5,side:Et}),this.hideMaterial=new Xt({color:0,depthTest:!1,depthWrite:!1,transparent:!0,opacity:0,side:Et})}highlightModel(e){e.forEach(t=>{t.ids.forEach(n=>{this.engine.models.find(i=>i.url==t.url).nodesMap.get(n).indexes.forEach(i=>{Om(this.engine.scene.children[i[0]]),this.engine.scene.children[i[0]].material[i[1]]=this.highlightMaterial})}),this.engine.engineStatus.highlightModels.push(t)})}unhighlightModel(e){e.forEach(t=>{t.ids.forEach(n=>{this.engine.models.find(i=>i.url==t.url).nodesMap.get(n).indexes.forEach(i=>{this.engine.scene.children[i[0]].material[i[1]]=this.engine.scene.children[i[0]].materialClone})})})}unhighlightAllModels(){this.engine.engineStatus.highlightModels.forEach(e=>{this.unhighlightModel([e])}),this.engine.engineStatus.highlightModels=[]}hideModel(e){e.forEach(t=>{t.ids.forEach(i=>{let r=this.engine.models.find(o=>o.url==t.url).nodesMap.get(i);this.engine.modelEdge.hideModelEdge(t.url,i),r.indexes.forEach(o=>{Om(this.engine.scene.children[o[0]]),this.engine.scene.children[o[0]].material[o[1]]=this.hideMaterial})});let n=this.engine.engineStatus.hideModels.find(i=>i.url==t.url);n!=null?n.ids.push(...t.ids):this.engine.engineStatus.hideModels.push({url:t.url,ids:t.ids}),this.engine.engineStatus.highlightModels=[]})}showModel(e){e.forEach(t=>{t.ids.forEach(n=>{let i=this.engine.models.find(r=>r.url==t.url).nodesMap.get(n);this.engine.modelEdge.showModelEdge(t.url,n),i.indexes.forEach(r=>{this.engine.scene.children[r[0]].material[r[1]]=this.engine.scene.children[r[0]].materialClone})}),this.engine.engineStatus.hideModels.push(t)})}isolateModel(e){const t=[];this.engine.models.forEach(i=>{const r=Array.from(i.nodesMap.keys());t.push({url:i.url,ids:r})});const n=[];t.forEach(i=>{const r=e.find(o=>o.url===i.url);if(r){const o=i.ids.filter(a=>!r.ids.includes(a));o.length>0&&n.push({url:i.url,ids:o})}else n.push(i)}),n.length>0&&this.hideModel(n)}showAllModels(){}setModelColor(e,t){e.material.color.set(t)}setAllModelsColor(e){this.engine.scene.children.forEach(t=>{t.isMesh})}restoreAllModelsColor(){this.engine.scene.children.forEach(e=>{e.isMesh})}getModelsBox(e){new xt;let t=[];return e.forEach(i=>{let r=this.engine.models.find(o=>o.url==i.url);i.ids.forEach(o=>{r.nodesMap.get(o).infos.forEach(a=>{t.push(a.box)})})}),n(t);function n(i){let r=new P(1e8,1e9,1e10),o=new P(-1e8,-1e9,-1e10);return i.forEach(a=>{a.min.xo.x&&(o.x=a.max.x),a.max.y>o.y&&(o.y=a.max.y),a.max.z>o.z&&(o.z=a.max.z)}),new xt(r,o)}}getModelDescription(e){}}function Om(s){(s.isSplit==null||s.isSplit==null||s.isSplit==!1)&&(s.isSplit=!0)}class kn{constructor(e,t,n){this.camera=e,this.renderer=t,this.scene=n,this.raycaster=new ds}raycaster;worldToScreenNormalized(e){const t=e.clone();return t.project(this.camera),new ce(t.x,t.y)}worldToScreen(e){const t=this.worldToScreenNormalized(e),n=this.renderer.domElement.width,i=this.renderer.domElement.height,r=(t.x+1)*n/2,o=(1-t.y)*i/2;return new ce(r,o)}screenToNormalized(e,t){const n=this.renderer.domElement.clientWidth,i=this.renderer.domElement.clientHeight,r=e/n*2-1,o=-(t/i*2-1);return new ce(r,o)}screenToWorld(e,t,n){if(!this.scene&&!n)return console.warn("WorldToScreen: 需要提供 scene 或 objects 参数才能进行屏幕坐标转世界坐标"),null;const i=this.screenToNormalized(e,t);this.raycaster.setFromCamera(i,this.camera);const r=n||this.scene.children,o=this.raycaster.intersectObjects(r,!0);return o.length>0?o[0].point:null}screenToWorldWithDepth(e,t,n=0){const i=this.screenToNormalized(e,t);this.raycaster.setFromCamera(i,this.camera);const r=new P;return this.raycaster.ray.at(n,r),r}updateCamera(e){this.camera=e}updateRenderer(e){this.renderer=e}updateScene(e){this.scene=e}}var du={exports:{}},uw=du.exports,Fm;function dw(){return Fm||(Fm=1,(function(s,e){(function(t,n){s.exports=n()})(uw,function(){var t=function(){function n(f){return o.appendChild(f.dom),f}function i(f){for(var p=0;pl+1e3&&(h.update(1e3*c/(f-l),100),l=f,c=0,d)){var p=performance.memory;d.update(p.usedJSHeapSize/1048576,p.jsHeapSizeLimit/1048576)}return f},update:function(){a=this.end()},domElement:o,setMode:i}};return t.Panel=function(n,i,r){var o=1/0,a=0,l=Math.round,c=l(window.devicePixelRatio||1),h=80*c,u=48*c,d=3*c,f=2*c,p=3*c,g=15*c,x=74*c,m=30*c,b=document.createElement("canvas");b.width=h,b.height=u,b.style.cssText="width:80px;height:48px";var v=b.getContext("2d");return v.font="bold "+9*c+"px Helvetica,Arial,sans-serif",v.textBaseline="top",v.fillStyle=r,v.fillRect(0,0,h,u),v.fillStyle=i,v.fillText(n,d,f),v.fillRect(p,g,x,m),v.fillStyle=r,v.globalAlpha=.9,v.fillRect(p,g,x,m),{dom:b,update:function(y,M){o=Math.min(o,y),a=Math.max(a,y),v.fillStyle=r,v.globalAlpha=1,v.fillRect(0,0,h,g),v.fillStyle=i,v.fillText(l(y)+" "+n+" ("+l(o)+"-"+l(a)+")",d,f),v.drawImage(b,p+c,g,x-c,m,p,g,x-c,m),v.fillRect(p+x-c,g,c,m),v.fillStyle=r,v.globalAlpha=.9,v.fillRect(p+x-c,g,c,l((1-y/M)*m))}}},t})})(du)),du.exports}var fw=dw();const pw=Fp(fw);var Pr=Object.freeze({Linear:Object.freeze({None:function(s){return s},In:function(s){return s},Out:function(s){return s},InOut:function(s){return s}}),Quadratic:Object.freeze({In:function(s){return s*s},Out:function(s){return s*(2-s)},InOut:function(s){return(s*=2)<1?.5*s*s:-.5*(--s*(s-2)-1)}}),Cubic:Object.freeze({In:function(s){return s*s*s},Out:function(s){return--s*s*s+1},InOut:function(s){return(s*=2)<1?.5*s*s*s:.5*((s-=2)*s*s+2)}}),Quartic:Object.freeze({In:function(s){return s*s*s*s},Out:function(s){return 1- --s*s*s*s},InOut:function(s){return(s*=2)<1?.5*s*s*s*s:-.5*((s-=2)*s*s*s-2)}}),Quintic:Object.freeze({In:function(s){return s*s*s*s*s},Out:function(s){return--s*s*s*s*s+1},InOut:function(s){return(s*=2)<1?.5*s*s*s*s*s:.5*((s-=2)*s*s*s*s+2)}}),Sinusoidal:Object.freeze({In:function(s){return 1-Math.sin((1-s)*Math.PI/2)},Out:function(s){return Math.sin(s*Math.PI/2)},InOut:function(s){return .5*(1-Math.sin(Math.PI*(.5-s)))}}),Exponential:Object.freeze({In:function(s){return s===0?0:Math.pow(1024,s-1)},Out:function(s){return s===1?1:1-Math.pow(2,-10*s)},InOut:function(s){return s===0?0:s===1?1:(s*=2)<1?.5*Math.pow(1024,s-1):.5*(-Math.pow(2,-10*(s-1))+2)}}),Circular:Object.freeze({In:function(s){return 1-Math.sqrt(1-s*s)},Out:function(s){return Math.sqrt(1- --s*s)},InOut:function(s){return(s*=2)<1?-.5*(Math.sqrt(1-s*s)-1):.5*(Math.sqrt(1-(s-=2)*s)+1)}}),Elastic:Object.freeze({In:function(s){return s===0?0:s===1?1:-Math.pow(2,10*(s-1))*Math.sin((s-1.1)*5*Math.PI)},Out:function(s){return s===0?0:s===1?1:Math.pow(2,-10*s)*Math.sin((s-.1)*5*Math.PI)+1},InOut:function(s){return s===0?0:s===1?1:(s*=2,s<1?-.5*Math.pow(2,10*(s-1))*Math.sin((s-1.1)*5*Math.PI):.5*Math.pow(2,-10*(s-1))*Math.sin((s-1.1)*5*Math.PI)+1)}}),Back:Object.freeze({In:function(s){var e=1.70158;return s===1?1:s*s*((e+1)*s-e)},Out:function(s){var e=1.70158;return s===0?0:--s*s*((e+1)*s+e)+1},InOut:function(s){var e=2.5949095;return(s*=2)<1?.5*(s*s*((e+1)*s-e)):.5*((s-=2)*s*((e+1)*s+e)+2)}}),Bounce:Object.freeze({In:function(s){return 1-Pr.Bounce.Out(1-s)},Out:function(s){return s<1/2.75?7.5625*s*s:s<2/2.75?7.5625*(s-=1.5/2.75)*s+.75:s<2.5/2.75?7.5625*(s-=2.25/2.75)*s+.9375:7.5625*(s-=2.625/2.75)*s+.984375},InOut:function(s){return s<.5?Pr.Bounce.In(s*2)*.5:Pr.Bounce.Out(s*2-1)*.5+.5}}),generatePow:function(s){return s===void 0&&(s=4),s=s1e4?1e4:s,{In:function(e){return Math.pow(e,s)},Out:function(e){return 1-Math.pow(1-e,s)},InOut:function(e){return e<.5?Math.pow(e*2,s)/2:(1-Math.pow(2-e*2,s))/2+.5}}}}),Lo=function(){return performance.now()},mw=(function(){function s(){this._tweens={},this._tweensAddedDuringUpdate={}}return s.prototype.getAll=function(){var e=this;return Object.keys(this._tweens).map(function(t){return e._tweens[t]})},s.prototype.removeAll=function(){this._tweens={}},s.prototype.add=function(e){this._tweens[e.getId()]=e,this._tweensAddedDuringUpdate[e.getId()]=e},s.prototype.remove=function(e){delete this._tweens[e.getId()],delete this._tweensAddedDuringUpdate[e.getId()]},s.prototype.update=function(e,t){e===void 0&&(e=Lo()),t===void 0&&(t=!1);var n=Object.keys(this._tweens);if(n.length===0)return!1;for(;n.length>0;){this._tweensAddedDuringUpdate={};for(var i=0;i1?r(s[t],s[t-1],t-n):r(s[i],s[i+1>t?t:i+1],n-i)},Utils:{Linear:function(s,e,t){return(e-s)*t+s}}},zm=(function(){function s(){}return s.nextId=function(){return s._nextId++},s._nextId=0,s})(),pu=new mw,gw=(function(){function s(e,t){t===void 0&&(t=pu),this._object=e,this._group=t,this._isPaused=!1,this._pauseStart=0,this._valuesStart={},this._valuesEnd={},this._valuesStartRepeat={},this._duration=1e3,this._isDynamic=!1,this._initialRepeat=0,this._repeat=0,this._yoyo=!1,this._isPlaying=!1,this._reversed=!1,this._delayTime=0,this._startTime=0,this._easingFunction=Pr.Linear.None,this._interpolationFunction=fu.Linear,this._chainedTweens=[],this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._id=zm.nextId(),this._isChainStopped=!1,this._propertiesAreSetUp=!1,this._goToEnd=!1}return s.prototype.getId=function(){return this._id},s.prototype.isPlaying=function(){return this._isPlaying},s.prototype.isPaused=function(){return this._isPaused},s.prototype.getDuration=function(){return this._duration},s.prototype.to=function(e,t){if(t===void 0&&(t=1e3),this._isPlaying)throw new Error("Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.");return this._valuesEnd=e,this._propertiesAreSetUp=!1,this._duration=t<0?0:t,this},s.prototype.duration=function(e){return e===void 0&&(e=1e3),this._duration=e<0?0:e,this},s.prototype.dynamic=function(e){return e===void 0&&(e=!1),this._isDynamic=e,this},s.prototype.start=function(e,t){if(e===void 0&&(e=Lo()),t===void 0&&(t=!1),this._isPlaying)return this;if(this._group&&this._group.add(this),this._repeat=this._initialRepeat,this._reversed){this._reversed=!1;for(var n in this._valuesStartRepeat)this._swapEndStartRepeatValues(n),this._valuesStart[n]=this._valuesStartRepeat[n]}if(this._isPlaying=!0,this._isPaused=!1,this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._isChainStopped=!1,this._startTime=e,this._startTime+=this._delayTime,!this._propertiesAreSetUp||t){if(this._propertiesAreSetUp=!0,!this._isDynamic){var i={};for(var r in this._valuesEnd)i[r]=this._valuesEnd[r];this._valuesEnd=i}this._setupProperties(this._object,this._valuesStart,this._valuesEnd,this._valuesStartRepeat,t)}return this},s.prototype.startFromCurrentValues=function(e){return this.start(e,!0)},s.prototype._setupProperties=function(e,t,n,i,r){for(var o in n){var a=e[o],l=Array.isArray(a),c=l?"array":typeof a,h=!l&&Array.isArray(n[o]);if(!(c==="undefined"||c==="function")){if(h){var u=n[o];if(u.length===0)continue;for(var d=[a],f=0,p=u.length;f"u"||r)&&(t[o]=a),l||(t[o]*=1),h?i[o]=n[o].slice().reverse():i[o]=t[o]||0}}},s.prototype.stop=function(){return this._isChainStopped||(this._isChainStopped=!0,this.stopChainedTweens()),this._isPlaying?(this._group&&this._group.remove(this),this._isPlaying=!1,this._isPaused=!1,this._onStopCallback&&this._onStopCallback(this._object),this):this},s.prototype.end=function(){return this._goToEnd=!0,this.update(1/0),this},s.prototype.pause=function(e){return e===void 0&&(e=Lo()),this._isPaused||!this._isPlaying?this:(this._isPaused=!0,this._pauseStart=e,this._group&&this._group.remove(this),this)},s.prototype.resume=function(e){return e===void 0&&(e=Lo()),!this._isPaused||!this._isPlaying?this:(this._isPaused=!1,this._startTime+=e-this._pauseStart,this._pauseStart=0,this._group&&this._group.add(this),this)},s.prototype.stopChainedTweens=function(){for(var e=0,t=this._chainedTweens.length;eo)return!1;t&&this.start(e,!0)}if(this._goToEnd=!1,ec)return 1;var x=Math.trunc(a/l),m=a-x*l,b=Math.min(m/n._duration,1);return b===0&&a===n._duration?1:b},u=h(),d=this._easingFunction(u);if(this._updateProperties(this._object,this._valuesStart,this._valuesEnd,d),this._onUpdateCallback&&this._onUpdateCallback(this._object,u),this._duration===0||a>=this._duration)if(this._repeat>0){var f=Math.min(Math.trunc((a-this._duration)/l)+1,this._repeat);isFinite(this._repeat)&&(this._repeat-=f);for(r in this._valuesStartRepeat)!this._yoyo&&typeof this._valuesEnd[r]=="string"&&(this._valuesStartRepeat[r]=this._valuesStartRepeat[r]+parseFloat(this._valuesEnd[r])),this._yoyo&&this._swapEndStartRepeatValues(r),this._valuesStart[r]=this._valuesStartRepeat[r];return this._yoyo&&(this._reversed=!this._reversed),this._startTime+=l*f,this._onRepeatCallback&&this._onRepeatCallback(this._object),this._onEveryStartCallbackFired=!1,!0}else{this._onCompleteCallback&&this._onCompleteCallback(this._object);for(var p=0,g=this._chainedTweens.length;p{x&&(y||(x(M),y=!0))}),x&&setTimeout(()=>{y||(x(!0),y=!0)},g+10)},n.CameraGoHome=function(){var p=s.octreeBox.getBoundingBox(),g=p.min.clone().add(p.max.clone()).multiplyScalar(.5);let x=new P(1,1,1);var m=p.max.distanceTo(p.min),b=g.clone().add(x.multiplyScalar(m));if(e.camera.isOrthographicCamera){var v=s.container.clientWidth/s.container.clientHeight,y=m*.6;e.camera.left=-y*v,e.camera.right=y*v,e.camera.top=y,e.camera.bottom=-y,e.camera.zoom=1,e.camera.updateProjectionMatrix()}l(e.camera.position,b,s.controls.target.clone(),g)},n.zoomToBox=function(p){var g=p.min.clone().add(p.max.clone()).multiplyScalar(.5);let x=e.camera.position.clone().sub(s.controls.target.clone()).normalize();var m=g.clone().add(x.multiplyScalar(1*p.max.distanceTo(p.min)));l(e.camera.position,m,s.controls.target.clone(),g)};function l(p,g,x,m,b,v,y=1e3,M){var E;b&&v?(E=new mu.Tween({x1:p.x,y1:p.y,z1:p.z,x2:x.x,y2:x.y,z2:x.z,_x:b._x,_y:b._y,_z:b._z,_w:b._w}),E.to({x1:g.x,y1:g.y,z1:g.z,x2:m.x,y2:m.y,z2:m.z,_x:v._x,_y:v._y,_z:v._z,_w:v._w},y)):(E=new mu.Tween({x1:p.x,y1:p.y,z1:p.z,x2:x.x,y2:x.y,z2:x.z}),E.to({x1:g.x,y1:g.y,z1:g.z,x2:m.x,y2:m.y,z2:m.z},y)),E.onUpdate(function(R){b&&v?(e.camera.quaternion._x=R._x,e.camera.quaternion._y=R._y,e.camera.quaternion._z=R._z,e.camera.quaternion._w=R._w):s.controls.auto=!0,e.camera.position.x=R.x1,e.camera.position.y=R.y1,e.camera.position.z=R.z1,s.controls.target.x=R.x2,s.controls.target.y=R.y2,s.controls.target.z=R.z2,s.controls.update(),n.RenderScene()}),E.onComplete(function(R){s.controls.auto=!1,n.RenderScene(),M&&M(!0),cancelAnimationFrame(i),i=null}),E.easing(mu.Easing.Cubic.InOut);function A(R){i=requestAnimationFrame(A),E.update()}E.start(),A()}function c(){r=document.createElement("div"),r.className="ViewCube",t.appendChild(r),o=document.createElement("div"),o.className="viewSettingWrapper",o.innerHTML="...",r.appendChild(o);var p=document.createElement("div");p.className="homeViewWrapper",p.addEventListener("mousedown",function(){console.log("归位"),n.CameraGoHome()}),r.appendChild(p);const g=document.createElement("div");g.className="cameraToggleWrapper",g.title="切换正交/透视视图",g.innerHTML="⊞",g.addEventListener("mousedown",function(y){y.stopPropagation(),console.log("切换视图"),n.ToggleCameraType(),b()}),r.appendChild(g);const x=document.createElement("div");x.className="screenshotWrapper",x.title="截图",x.innerHTML="📷",x.addEventListener("mousedown",function(y){y.stopPropagation(),console.log("截图"),n.TakeScreenshot(),b()}),r.appendChild(x);const m=document.createElement("div");m.className="fullscreenWrapper",m.title="全屏",m.innerHTML="⛶",m.addEventListener("mousedown",function(y){y.stopPropagation(),console.log("全屏"),n.ToggleFullscreen(),b()}),r.appendChild(m),o.addEventListener("mousedown",function(y){y.stopPropagation(),g.classList.contains("show")?(b(),console.log("隐藏功能按钮")):(v(),console.log("显示功能按钮"))});function b(){g.classList.remove("show"),x.classList.remove("show"),m.classList.remove("show")}function v(){g.classList.add("show"),x.classList.add("show"),m.classList.add("show")}}function h(){n.sceneOrtho=xw();var x=t.clientWidth,m=t.clientWidth,p=x>m?x/m:m/x,g=300;n.camera=new us(g*p/-2,g*p/2,g/2,g/-2,.01,1e4);var x=r.clientWidth,m=r.clientHeight,b=new Dp({alpha:!0});b.setSize(x,m),b.setClearAlpha(0),n.sceneOrtho.renderer=b;let v=new Na(16777215,.8);n.sceneOrtho.add(v),vw(r,b)}function u(){const p="/assets/viewcube/";let g=[{label:"右",icon:p+"cn_right.png"},{label:"左",icon:p+"cn_left.png"},{label:"顶",icon:p+"cn_top.png"},{label:"底",icon:p+"cn_bottom.png"},{label:"前",icon:p+"cn_front.png"},{label:"后",icon:p+"cn_back.png"}];var x=[];for(const b of g)x.push(new Xt({color:16777215,map:new Yf().load(b.icon)}));new Xf({color:255});var m=new ut(new Gi(110,110,110),x);n.sceneOrtho.add(m),d(122),r.addEventListener("mousedown",b=>{var v={};v.x=b.offsetX/r.clientWidth*2-1,v.y=-(b.offsetY/r.clientHeight)*2+1;var y=new ds;y.setFromCamera(v,n.camera);const M=y.intersectObjects(a,!1);M.length>0&&n.ToggleDirectionView(M[0].object.name)}),r.addEventListener("mousemove",b=>{var v={};v.x=b.offsetX/r.clientWidth*2-1,v.y=-(b.offsetY/r.clientHeight)*2+1;var y=new ds;y.setFromCamera(v,n.camera);const M=y.intersectObjects(a,!1);for(var E of a)E.material.opacity=.01;M.length>0&&(M[0].object.material.opacity=.2)})}function d(p){for(var g=p*.5-20,x=[{name:"right",a:30,b:75,c:75,point:new P(g,0,0)},{name:"back",a:75,b:75,c:30,point:new P(0,0,-g)},{name:"left",a:30,b:75,c:75,point:new P(-g,0,0)},{name:"front",a:75,b:75,c:30,point:new P(0,0,g)},{name:"top",a:75,b:30,c:75,point:new P(0,g,0)},{name:"button",a:75,b:30,c:75,point:new P(0,-g,0)}],m=[{name:"top_right_back",a:30,b:30,c:30,point:new P(-g,g,g)},{name:"button_front_right",a:30,b:30,c:30,point:new P(-g,-g,g)},{name:"top_front_right",a:30,b:30,c:30,point:new P(g,g,g)},{name:"button_right_back",a:30,b:30,c:30,point:new P(g,-g,g)},{name:"top_back_left",a:30,b:30,c:30,point:new P(-g,g,-g)},{name:"button_back_left",a:30,b:30,c:30,point:new P(-g,-g,-g)},{name:"top_left_front",a:30,b:30,c:30,point:new P(g,g,-g)},{name:"button_left_front",a:30,b:30,c:30,point:new P(g,-g,-g)}],b=[{name:"top_front",a:30,b:30,c:75,point:new P(g,g,0)},{name:"top_right",a:75,b:30,c:30,point:new P(0,g,g)},{name:"top_back",a:30,b:30,c:75,point:new P(-g,g,0)},{name:"top_left",a:75,b:30,c:30,point:new P(0,g,-g)},{name:"button_front",a:30,b:30,c:75,point:new P(g,-g,0)},{name:"button_right",a:75,b:30,c:30,point:new P(0,-g,g)},{name:"button_back",a:30,b:30,c:75,point:new P(-g,-g,0)},{name:"button_left",a:75,b:30,c:30,point:new P(0,-g,-g)},{name:"front_right",a:30,b:75,c:30,point:new P(g,0,g)},{name:"right_back",a:30,b:75,c:30,point:new P(-g,0,g)},{name:"back_left",a:30,b:75,c:30,point:new P(-g,0,-g)},{name:"left_front",a:30,b:75,c:30,point:new P(g,0,-g)}],v=0;v{let d=u.boundingBox.min,f=u.boundingBox.max;d.xi.x&&(i.x=f.x),f.y>i.y&&(i.y=f.y),f.z>i.z&&(i.z=f.z)});let r=Math.min(n.x,i.x),o=Math.min(n.y,i.y),a=Math.min(n.z,i.z),l=Math.max(n.x,i.x),c=Math.max(n.y,i.y),h=Math.max(n.z,i.z);return{min:new P(r,o,a),max:new P(l,c,h)}},e.rayInterationModel=function(t){let n=[];return s.engineStatus.models.forEach(r=>{r.info.lods.forEach(o=>{let a=o.octreeBox;i(t,a,r)})}),t.intersectObjects(n,!1);function i(r,o,a){if(o==null)return;let l=new P(o.min.X*.3048,o.min.Z*.3048,-o.min.Y*.3048),c=new P(o.max.X*.3048,o.max.Z*.3048,-o.max.Y*.3048),h=new P(Math.min(l.x,c.X),Math.min(l.y,c.y),Math.min(l.z,c.z)),u=new P(Math.max(c.x,l.x),Math.max(c.y,l.y),Math.max(c.z,l.z)),d=new xt(h,u),f=r.ray.intersectsBox(d);if(!(f==null||f==!1))if(o.children==null||o.children.length==0){if(o.elements!=null)for(var p of o.elements){let g=s.engineStatus.hideModels.find(m=>m.url==a.url)?.ids;if(g!=null&&g.includes(p))continue;s.models.find(m=>m.url==a.url).nodesMap.get(p)?.infos.map(m=>m.mesh).forEach(m=>{n.push(m)})}}else{if(o.elements!=null)for(var p of o.elements){let x=s.engineStatus.hideModels.find(b=>b.url==a.url)?.ids;if(x!=null&&x.includes(p))continue;s.models.find(b=>b.url==a.url).nodesMap.get(p)?.infos.map(b=>b.mesh).forEach(b=>{n.push(b)})}for(let g of o.children)i(r,g,a)}}},e}class Mw{engine;isDrawing=!1;startPoint=new ce;endPoint=new ce;selectionBox=null;worldToScreen=null;boundMouseDown;boundMouseMove;boundMouseUp;boundKeyDown;constructor(e){this.engine=e,this.boundMouseDown=this.onMouseDown.bind(this),this.boundMouseMove=this.onMouseMove.bind(this),this.boundMouseUp=this.onMouseUp.bind(this),this.boundKeyDown=this.onKeyDown.bind(this)}init(){this.createSelectionBoxElement(),this.engine.scene&&this.engine.camera&&this.engine.renderer&&(this.worldToScreen=new kn(this.engine.camera,this.engine.renderer,this.engine.scene))}active(){this.engine.controlModule.disActive();const e=this.engine.renderer?.domElement;e&&(e.addEventListener("mousedown",this.boundMouseDown),e.addEventListener("mousemove",this.boundMouseMove),e.addEventListener("mouseup",this.boundMouseUp),e.style.cursor="crosshair"),window.addEventListener("keydown",this.boundKeyDown)}disActive(){this.engine.controlModule.active();const e=this.engine.renderer?.domElement;e&&(e.removeEventListener("mousedown",this.boundMouseDown),e.removeEventListener("mousemove",this.boundMouseMove),e.removeEventListener("mouseup",this.boundMouseUp),e.style.cursor="default"),window.removeEventListener("keydown",this.boundKeyDown),this.isDrawing&&this.endDrawing()}createSelectionBoxElement(){this.selectionBox=document.createElement("div"),this.selectionBox.style.position="absolute",this.selectionBox.style.border="2px dashed #00aaff",this.selectionBox.style.backgroundColor="rgba(0, 170, 255, 0.1)",this.selectionBox.style.pointerEvents="none",this.selectionBox.style.display="none",this.selectionBox.style.zIndex="1000",this.selectionBox.style.boxSizing="border-box";const e=this.engine.renderer?.domElement;e&&e.parentElement&&e.parentElement.appendChild(this.selectionBox)}onMouseDown(e){e.button!==0||!this.engine.renderer?.domElement||(this.startPoint.set(e.offsetX,e.offsetY),this.endPoint.copy(this.startPoint),this.isDrawing=!0,this.selectionBox&&(this.selectionBox.style.display="block",this.updateSelectionBoxUI()),e.preventDefault(),e.stopPropagation())}onMouseMove(e){!this.isDrawing||!this.engine.renderer?.domElement||(this.endPoint.set(e.offsetX,e.offsetY),this.updateSelectionBoxUI(),e.preventDefault(),e.stopPropagation())}onMouseUp(e){this.isDrawing&&(this.endDrawing(),this.performZoom(),e.preventDefault(),e.stopPropagation(),this.disActive())}onKeyDown(e){e.key==="Escape"&&(this.disActive(),e.preventDefault(),e.stopPropagation())}endDrawing(){this.isDrawing&&(this.isDrawing=!1,this.selectionBox&&(this.selectionBox.style.display="none"))}updateSelectionBoxUI(){if(!this.selectionBox||!this.engine.renderer?.domElement)return;const e=Math.min(this.startPoint.x,this.endPoint.x),t=Math.min(this.startPoint.y,this.endPoint.y),n=Math.abs(this.endPoint.x-this.startPoint.x),i=Math.abs(this.endPoint.y-this.startPoint.y);this.selectionBox.style.left=`${e}px`,this.selectionBox.style.top=`${t}px`,this.selectionBox.style.width=`${n}px`,this.selectionBox.style.height=`${i}px`}performZoom(){const e=Math.abs(this.endPoint.x-this.startPoint.x),t=Math.abs(this.endPoint.y-this.startPoint.y);if(e<5||t<5)return;if(!this.worldToScreen){console.warn("RangeScale: 坐标转换工具未初始化");return}const n=Math.min(this.startPoint.x,this.endPoint.x),i=Math.max(this.startPoint.x,this.endPoint.x),r=Math.min(this.startPoint.y,this.endPoint.y),o=Math.max(this.startPoint.y,this.endPoint.y),a=[],l=[{x:n,y:r},{x:i,y:r},{x:i,y:o},{x:n,y:o}];for(const h of l){const u=this.worldToScreen.screenToWorld(h.x,h.y);u&&a.push(u)}if(a.length<3){console.warn("RangeScale: 框选区域未命中模型,无法执行缩放操作");return}if(a.length<3){console.warn("RangeScale: 无法将屏幕区域转换为世界坐标");return}const c=new xt;for(const h of a)c.expandByPoint(h);if(c.isEmpty()){console.warn("RangeScale: 计算得到的包围盒无效");return}this.fitCameraToBoundingBox(c)}fitCameraToBoundingBox(e){const t=this.engine.camera,n=this.engine.controls;if(!t||!n){console.warn("RangeScale: 相机或控制器未初始化");return}const i=new P;e.getCenter(i);const r=new P;e.getSize(r);const o=Math.max(r.x,r.y,r.z);if(t instanceof sn){const a=t.fov*(Math.PI/180),l=o/(2*Math.tan(a/2))*1.2,c=new P;t.getWorldDirection(c);const h=i.clone().sub(t.position);c.dot(h.normalize())<0&&c.negate();const u=i.clone().sub(c.multiplyScalar(l));t.position.copy(u),n.target&&n.target.copy(i),t.lookAt(i),n.update()}else if(t instanceof us){const a=o*1.2,l=this.engine.renderer?.domElement,c=l?l.width/l.height:1;t.left=-a*c/2,t.right=a*c/2,t.top=a/2,t.bottom=-a/2,t.updateProjectionMatrix();const h=new P;t.getWorldDirection(h);const u=o*1.5,d=i.clone().sub(h.multiplyScalar(u));t.position.copy(d),n.target&&n.target.copy(i),t.lookAt(i),n.update()}}}class ww{engine;ground=null;constructor(e){this.engine=e}init(){}setStatsVisible(e){this.engine.stats?.dom&&(this.engine.stats.dom.style.display=e?"block":"none")}setAmbientLightIntensity(e){const t=this.engine.scene.children.find(n=>n instanceof Na);t&&(t.intensity=e)}setAmbientLightColor(e){const t=this.engine.scene.children.find(n=>n instanceof Na);t&&t.color.set(e)}setDirectionalLightIntensity(e){const t=this.engine.scene.children.find(n=>n instanceof vr);t&&(t.intensity=e)}setDirectionalLightColor(e){const t=this.engine.scene.children.find(n=>n instanceof vr);t&&t.color.set(e)}setShadowQuality(e){const t=this.engine.scene.children.find(n=>n instanceof vr);if(t?.shadow){const n={low:1024,medium:2048,high:4096,ultra:8192}[e];t.shadow.mapSize.width=n,t.shadow.mapSize.height=n,t.shadow.map?.dispose(),t.shadow.map=null}}setDirectionalLightShadow(e){const t=this.engine.scene.children.find(n=>n instanceof vr);t&&(t.castShadow=e),this.engine.renderer&&(this.engine.renderer.shadowMap.enabled=e)}setGTAOEnabled(e){if(!this.engine.composerModule?.composer){console.warn("Composer not initialized");return}const t=this.engine.composerModule.composer,n=t.passes.find(i=>i instanceof bn);if(e)if(n)n.enabled=!0;else{const{width:i,height:r}=this.engine.deviceModule.getContainerSize(),o=new bn(this.engine.scene,this.engine.camera,i,r);o.output=bn.OUTPUT.Default,o.blendIntensity=.5,o.updateGtaoMaterial&&o.updateGtaoMaterial({radius:1,distanceExponent:1,thickness:1,scale:1,distanceFallOff:1,screenSpaceRadius:!0});const a=t.passes.findIndex(l=>l.constructor.name==="RenderPass");t.passes.splice(a+1,0,o)}else n&&(n.enabled=!1)}setSceneSaturation(e){if(!this.engine.composerModule?.saturationPass){console.warn("Saturation pass not initialized");return}this.engine.composerModule.saturationPass.uniforms.saturation.value=e}setSceneContrast(e){if(!this.engine.composerModule?.saturationPass){console.warn("Saturation pass not initialized");return}this.engine.composerModule.saturationPass.uniforms.contrast.value=e}setGroundEnabled(e,t){if(e)if(this.ground)this.ground.visible=!0;else{const n=t?.size??100,i=t?.color??8421504,r=t?.opacity??.3,o=new bo(n,n),a=new cs({color:i,transparent:!0,opacity:r,side:Et});this.ground=new ut(o,a),this.ground.rotation.x=-Math.PI/2,this.ground.position.y=0,this.ground.receiveShadow=!0,this.ground.name="ground",this.engine.scene.add(this.ground)}else this.ground&&(this.ground.visible=!1)}setHDRBackground(e){e?(this.engine.scene.background=e,this.engine.scene.environment=e):(this.engine.scene.background=null,this.engine.scene.environment=null)}}function Ai(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(s){var e=Math.random()*16|0,t=s=="x"?e:e&3|8;return t.toString(16)})}class Ci{engine;handelBehaved;constructor(e){this.engine=e,this.handelBehaved=qh(e),this.handelBehaved.init(this,null)}active(){this.handelBehaved.active()}disActive(){this.handelBehaved.disActive()}cancelCurrentSelectedAnnotation(){let e=this.engine.measure.annotationData;for(let t in e)e[t].forEach(n=>{n.highlight==!0&&(n.highlight=!1,n.container.classList.remove("Hight"),n.container.getElementsByTagName("svg")[0].classList.remove("Hight"))})}handelKeyEscDown(){this.cancelCurrentSelectedAnnotation();let e=this.engine.measure.annotationData;for(let t in e)for(let n=e[t].length-1;n>=0;n--){let i=e[t][n];i.isSelect==!0&&(i.container.remove(),e[t].splice(n,1))}this.engine.measure.clearAllPoints()}handelKeyDeleteDown(){let e=this.engine.measure.annotationData;for(let t in e)for(let n=e[t].length-1;n>=0;n--){let i=e[t][n];i.highlight==!0&&(i.container.remove(),e[t].splice(n,1))}}clearHighlight(){let e=this.engine.measure.annotationData;for(let t in e)e[t].forEach(n=>{n.highlight=!1,n.container.classList.remove("Hight"),n.container.getElementsByTagName("svg")[0].classList.remove("Hight")})}drawNormalAnnotation(){let e=this;this.engine.measure.annotationData.normalAnnotation.forEach(l=>{a(l)}),this.engine.measure.annotationData.elevationAnnotation.forEach(l=>{o(l)}),this.engine.measure.annotationData.coordinateAnnotation.forEach(l=>{r(l)}),this.engine.measure.annotationData.angleAnnotation.forEach(l=>{t(l)}),this.engine.measure.annotationData.areaAnnotation.forEach(l=>{n(l)}),this.engine.measure.annotationData.slopeAnnotation.forEach(l=>{i(l)});function t(l){if(l.container==null){let m=['','','','','','','',''+l.text+"",""].join("");l.container=document.createElement("div"),l.container.className="angle-annotation",l.container.id=l.id,l.container.style.pointerEvents="none",l.container.innerHTML=m,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0})}let c=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point1),h=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point2),u=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point3),d=e.engine.reactBoundingClientRect.left,f=e.engine.reactBoundingClientRect.top;c.x+=d,c.y+=f,h.x+=d,h.y+=f,u.x+=d,u.y+=f;let p=l.container;p.getElementsByTagName("circle")[0].setAttribute("cx",c.x),p.getElementsByTagName("circle")[0].setAttribute("cy",c.y),p.getElementsByTagName("circle")[1].setAttribute("cx",h.x),p.getElementsByTagName("circle")[1].setAttribute("cy",h.y),p.getElementsByTagName("circle")[2].setAttribute("cx",u.x),p.getElementsByTagName("circle")[2].setAttribute("cy",u.y),p.getElementsByTagName("polyline")[0].setAttribute("points",c.x+","+c.y+" "+h.x+","+h.y),p.getElementsByTagName("polyline")[1].setAttribute("points",h.x+","+h.y+" "+u.x+","+u.y);let g=h.x,x=h.y-30;p.getElementsByTagName("rect")[0].setAttribute("x",g-40),p.getElementsByTagName("rect")[0].setAttribute("y",x-12.5),p.getElementsByTagName("text")[0].setAttribute("x",g),p.getElementsByTagName("text")[0].setAttribute("y",x+4),p.getElementsByTagName("text")[0].innerHTML=l.text,p.style.top="0px",p.style.left="0px"}function n(l){if(l.container==null){let b=['','','','',''+l.text+"",""].join("");l.container=document.createElement("div"),l.container.className="area-annotation",l.container.id=l.id,l.container.innerHTML=b,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0})}if(!l.points||l.points.length<3)return;let c=e.engine.reactBoundingClientRect.left,h=e.engine.reactBoundingClientRect.top,u=[],d=0,f=0;for(let b=0;bb.x+","+b.y).join(" "),g=l.container;g.getElementsByTagName("polygon")[0].setAttribute("points",p),g.getElementsByTagName("polyline")[0].setAttribute("points",p);let x=d,m=f;g.getElementsByTagName("rect")[0].setAttribute("x",x-40),g.getElementsByTagName("rect")[0].setAttribute("y",m-12.5),g.getElementsByTagName("text")[0].setAttribute("x",x),g.getElementsByTagName("text")[0].setAttribute("y",m+4),g.getElementsByTagName("text")[0].innerHTML=l.text,g.style.top="0px",g.style.left="0px"}function i(l){if(l.container==null){let x=['',"",'','',"","",'','',''+l.text+"",""].join("");l.container=document.createElement("div"),l.container.className="slope-annotation",l.container.id=l.id,l.container.innerHTML=x,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0})}let c=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point1),h=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point2),u=e.engine.reactBoundingClientRect.left,d=e.engine.reactBoundingClientRect.top;c.x+=u,c.y+=d,h.x+=u,h.y+=d;let f=l.container;f.getElementsByTagName("polyline")[0].setAttribute("points",c.x+","+c.y+" "+h.x+","+h.y);let p=(c.x+h.x)/2,g=(c.y+h.y)/2-30;f.getElementsByTagName("rect")[0].setAttribute("x",p-50),f.getElementsByTagName("rect")[0].setAttribute("y",g-12.5),f.getElementsByTagName("text")[0].setAttribute("x",p),f.getElementsByTagName("text")[0].setAttribute("y",g+4),f.getElementsByTagName("text")[0].innerHTML=l.text,f.style.top="0px",f.style.left="0px"}function r(l){if(l.container==null){let m=['','','',''+l.textX+"",'',''+l.textY+"",'',''+l.textZ+"",""].join("");l.container=document.createElement("div"),l.container.className="coordinate-annotation",l.container.id=l.id,l.container.style.position="absolute",l.container.style.pointerEvents="none",l.container.innerHTML=m,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0})}let c=l.container,h=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point),u=e.engine.reactBoundingClientRect.left,d=e.engine.reactBoundingClientRect.top;h.x+=u,h.y+=d,c.style.top="0px",c.style.left="0px";let f=c.getElementsByTagName("circle")[0];f&&(f.setAttribute("cx",h.x),f.setAttribute("cy",h.y));let p=c.getElementsByTagName("rect"),g=c.getElementsByTagName("text"),x=-55;p[0]&&(p[0].setAttribute("x",h.x+10),p[0].setAttribute("y",h.y+10+x)),g[0]&&(g[0].setAttribute("x",h.x+10+40),g[0].setAttribute("y",h.y+10+16+x)),p[1]&&(p[1].setAttribute("x",h.x+10),p[1].setAttribute("y",h.y+10+30+x)),g[1]&&(g[1].setAttribute("x",h.x+10+40),g[1].setAttribute("y",h.y+10+46+x)),p[2]&&(p[2].setAttribute("x",h.x+10),p[2].setAttribute("y",h.y+10+60+x)),g[2]&&(g[2].setAttribute("x",h.x+10+40),g[2].setAttribute("y",h.y+10+76+x)),g[0]&&(g[0].innerHTML=l.textX),g[1]&&(g[1].innerHTML=l.textY),g[2]&&(g[2].innerHTML=l.textZ)}function o(l){if(l.container==null){let f=['','',''+l.text+"",'',""].join("");l.container=document.createElement("div"),l.container.className="elevation-annotation",l.container.id=l.id,l.container.style.position="absolute",l.container.style.pointerEvents="none",l.container.innerHTML=f,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0})}let c=l.container,h=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point),u=e.engine.reactBoundingClientRect.left,d=e.engine.reactBoundingClientRect.top;c.style.top=h.y+d-48+"px",c.style.left=h.x+u-16+"px",c.getElementsByTagName("text")[0].innerHTML=l.text}function a(l){if(l.container==null){let p=['','','','','',''+l.text+"",""].join("");l.container=document.createElement("div"),l.container.className="normal-annotation",l.container.id=l.id,l.container.innerHTML=p,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0})}let c=l.container;if(l.point1==null||l.point2==null){c.style.display="none";return}else c.style.display="block";let h=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point1),u=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point2),d=e.engine.reactBoundingClientRect.left,f=e.engine.reactBoundingClientRect.top;h.x+=d,h.y+=f,u.x+=d,u.y+=f,c.getElementsByTagName("polyline")[0].setAttribute("points",h.x+","+h.y+" "+u.x+","+u.y),c.getElementsByTagName("circle")[0].setAttribute("cx",h.x),c.getElementsByTagName("circle")[0].setAttribute("cy",h.y),c.getElementsByTagName("circle")[1].setAttribute("cx",u.x),c.getElementsByTagName("circle")[1].setAttribute("cy",u.y),c.getElementsByTagName("rect")[0].setAttribute("x",h.x*.5+u.x*.5-40),c.getElementsByTagName("rect")[0].setAttribute("y",h.y*.5+u.y*.5-12.5),c.getElementsByTagName("text")[0].setAttribute("x",h.x*.5+u.x*.5+40-40),c.getElementsByTagName("text")[0].setAttribute("y",h.y*.5+u.y*.5+16-12.5),c.getElementsByTagName("text")[0].innerHTML=l.text,c.style.top="0px",c.style.left="0px"}}}class Sw{engine;isActive=!1;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ci(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.isActive=!0,this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active()}disActive(){this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}handleMouseClick(e){if(e.catch==null)return;if(this.points.length==0){this.points.push(e.catch.point);return}let t=this.engine.measure.annotationData.normalAnnotation.find(n=>n.isSelect==!0);t!=null&&(t.isSelect=!1)}handleMouseMove(e){if(e.catch==null||this.points.length==0)return;let t=this.engine.measure.annotationData.normalAnnotation.find(o=>o.isSelect==!0);t==null&&(t={text:null,id:Ai(),isSelect:!0},this.engine.measure.annotationData.normalAnnotation.push(t));let n=new ds(e.catch.point.clone().add(new P(0,.01,0)),new P(0,1,0));const i=this.engine.octreeBox.rayInterationModel(n);if(i.length===0){t.point2=null;return}let r=e.catch;t.point1=r.point,t.point2=i[0].point,t.text=t.point1.clone().distanceTo(t.point2.clone()).toFixed(2)+" m"}}class Ew{engine;tools;isActive=!1;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ci(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.isActive=!0,this.points=[],this.behavior=this.engine.handelBehaved,this.behavior.init(this,{showCatch:!0}),this.behavior.active()}disActive(){this.points=[],this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}handleMouseClick(e){if(e.catch==null)return;let t=e.catch;if(this.points.length==0)this.points.push(t.point);else if(this.points.length==1){let n=this.engine.measure.annotationData.normalAnnotation.find(i=>i.isSelect==!0);if(n==null)return;n.point2=t.point,n.isSelect=!1,this.points=[],this.engine.events.trigger(Ti.MeasureChanged,n)}}handleMouseMove(e){if(e.catch==null)return;let t=e.catch;if(t!=null&&this.points.length==1){let n=this.engine.measure.annotationData.normalAnnotation.find(i=>i.isSelect==!0);n==null&&(n={id:Ai(),point1:this.points[0].clone(),point2:t.point.clone(),text:this.points[0].clone().distanceTo(t.point.clone()).toFixed(2)+" m",isSelect:!0},this.engine.measure.annotationData.normalAnnotation.push(n)),n.point2=t.point,n.text=n.point1.clone().distanceTo(n.point2.clone()).toFixed(2)+" m",console.log("距离",n.text)}}}class Tw{engine;isActive=!1;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ci(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.isActive=!0,this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active()}disActive(){this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}handleMouseClick(e){if(e.catch==null)return;if(this.points.length==0){this.points.push(e.catch.point);return}let t=this.engine.measure.annotationData.normalAnnotation.find(n=>n.isSelect==!0);t!=null&&(t.isSelect=!1)}handleMouseMove(e){if(e.catch==null||this.points.length==0)return;let t=this.engine.measure.annotationData.normalAnnotation.find(o=>o.isSelect==!0);t==null&&(t={text:null,id:Ai(),isSelect:!0},this.engine.measure.annotationData.normalAnnotation.push(t));let n=new ds(e.catch.point.clone().add(e.catch.normal.clone().setLength(.01)),e.catch.normal);const i=this.engine.octreeBox.rayInterationModel(n);if(i.length==0){t.point2=null;return}let r=e.catch;t.point1=r.point,t.point2=i[0].point,t.text=t.point1.clone().distanceTo(t.point2.clone()).toFixed(2)+" m"}}class Aw{engine;isActive=!1;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ci(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active(),this.isActive=!0}disActive(){this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}handleMouseMove(e){if(e.catch==null)return;let t=this.engine.measure.annotationData.elevationAnnotation.find(n=>n.isSelect==!0);t==null&&(t={id:Ai(),point:e.catch.point.clone(),text:Math.round(e.catch.point.y)+" m",isSelect:!0},this.engine.measure.annotationData.elevationAnnotation.push(t)),t.point=e.catch.point.clone(),t.text=Math.round(e.catch.point.y)+" m"}handleMouseClick(e){if(e.catch==null)return;let t=this.engine.measure.annotationData.elevationAnnotation.find(n=>n.isSelect==!0);t!=null&&(t.isSelect=!1,t.point=e.catch.point.clone(),t.text=Math.round(e.catch.point.y)+" m",this.engine.events.trigger(Ti.MeasureChanged,t))}}class Cw{engine;isActive=!1;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ci(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active(),this.isActive=!0}disActive(){this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}handleMouseMove(e){if(e.catch==null)return;let t=this.engine.measure.annotationData.coordinateAnnotation.find(n=>n.isSelect==!0);t==null&&(t={id:Ai(),point:e.catch.point.clone(),text:Math.round(e.catch.point.y)+" m",isSelect:!0},this.engine.measure.annotationData.coordinateAnnotation.push(t)),t.point=e.catch.point.clone(),t.textX=Math.round(e.catch.point.x)+" m",t.textY=Math.round(e.catch.point.y)+" m",t.textZ=Math.round(e.catch.point.z)+" m"}handleMouseClick(e){if(e.catch==null)return;let t=this.engine.measure.annotationData.coordinateAnnotation.find(n=>n.isSelect==!0);t!=null&&(t.isSelect=!1,t.point=e.catch.point.clone(),t.textX=Math.round(e.catch.point.x)+" m",t.textY=Math.round(e.catch.point.y)+" m",t.textZ=Math.round(e.catch.point.z)+" m",this.engine.events.trigger(Ti.MeasureChanged,t))}}class Pw{engine;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ci(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.points=[],this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active()}disActive(){this.points=[],this.behavior?.disActive()}clearAllPoints(){this.points=[]}calculateAngle(e,t,n){const i=new P().subVectors(e,t),r=new P().subVectors(n,t),o=i.length(),a=r.length();if(o===0||a===0)return 0;const l=i.dot(r)/(o*a),c=Math.max(-1,Math.min(1,l));return Math.acos(c)*(180/Math.PI)}handleMouseClick(e){if(e.catch==null)return;let t=e.catch;if(this.points.length==0)this.points.push(t.point);else if(this.points.length==1)this.points.push(t.point);else if(this.points.length==2){let n=this.engine.measure.annotationData.angleAnnotation.find(i=>i.isSelect==!0);if(n==null)return;n.point3=t.point.clone(),n.angle=this.calculateAngle(n.point1,n.point2,n.point3),n.text=n.angle.toFixed(2)+"°",n.isSelect=!1,this.points=[],this.engine.events.trigger(Ti.MeasureChanged,n)}}handleMouseMove(e){if(e.catch==null)return;let t=this.tools.renderCatchElement(e.catch);if(t!=null&&this.points.length!=1&&this.points.length==2){let n=this.engine.measure.annotationData.angleAnnotation.find(i=>i.isSelect==!0);n==null&&(n={id:Ai(),point1:this.points[0].clone(),point2:this.points[1].clone(),point3:t.point.clone(),angle:0,text:"0.00°",isSelect:!0},this.engine.measure.annotationData.angleAnnotation.push(n)),n.point3=t.point.clone(),n.angle=this.calculateAngle(n.point1,n.point2,n.point3),n.text=n.angle.toFixed(2)+"°",console.log("角度",n.text)}}}class Rw{engine;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ci(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.points=[],this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active()}disActive(){this.points=[],this.behavior?.disActive()}clearAllPoints(){this.points=[]}calculateArea(e){if(e.length<3)return 0;let t=0;const n=e.length;for(let i=0;i=3){let n=this.engine.measure.annotationData.areaAnnotation.find(i=>i.isSelect==!0);n==null?(n={id:Ai(),points:this.points.map(i=>i.clone()),area:0,text:"0.00 m²",isSelect:!0},this.engine.measure.annotationData.areaAnnotation.push(n)):n.points=this.points.map(i=>i.clone()),n.area=this.calculateArea(n.points),n.text=n.area.toFixed(2)+" m²",console.log("面积",n.text)}}handleMouseMove(e){if(e.catch==null)return;let t=this.tools.renderCatchElement(e.catch);if(t!=null&&this.points.length>=2){let n=this.engine.measure.annotationData.areaAnnotation.find(i=>i.isSelect==!0);if(n==null){if(this.points.length>=2){let i=this.points.map(r=>r.clone());i.push(t.point.clone()),i.length>=3&&(n={id:Ai(),points:i,area:0,text:"0.00 m²",isSelect:!0},this.engine.measure.annotationData.areaAnnotation.push(n))}}else if(n.points.length>0){const i=n.points.length-1;n.points[i]=t.point.clone()}else n.points=this.points.map(i=>i.clone()),n.points.push(t.point.clone());n&&n.points.length>=3&&(n.area=this.calculateArea(n.points),n.text=n.area.toFixed(2)+" m²")}}finishMeasure(){let e=this.engine.measure.annotationData.areaAnnotation.find(t=>t.isSelect==!0);e!=null&&e.points.length>=3&&(e.points.length>this.points.length&&(e.points=this.points.map(t=>t.clone())),e.area=this.calculateArea(e.points),e.text=e.area.toFixed(2)+" m²",e.isSelect=!1,this.points=[],this.engine.events.trigger(Ti.MeasureChanged,e))}}class Lw{engine;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ci(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.points=[],this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active()}disActive(){this.points=[],this.behavior?.disActive()}clearAllPoints(){this.points=[]}calculateSlope(e,t){const n=t.y-e.y,i=t.x-e.x,r=t.z-e.z,o=Math.sqrt(i*i+r*r);if(o===0)return{percentage:0,angle:0,heightDiff:n,horizontalDist:0};const a=n/o*100,l=Math.atan(n/o)*(180/Math.PI);return{percentage:a,angle:l,heightDiff:n,horizontalDist:o}}handleMouseClick(e){if(e.catch==null)return;let t=this.tools.renderCatchElement(e.catch);if(this.points.length==0)this.points.push(t.point);else if(this.points.length==1){let n=this.engine.measure.annotationData.slopeAnnotation.find(r=>r.isSelect==!0);if(n==null)return;n.point2=t.point.clone();const i=this.calculateSlope(n.point1,n.point2);n.slopePercentage=i.percentage,n.slopeAngle=i.angle,n.heightDiff=i.heightDiff,n.horizontalDist=i.horizontalDist,n.text=i.percentage.toFixed(2)+"% ("+i.angle.toFixed(2)+"°)",n.isSelect=!1,this.points=[],this.engine.events.trigger(Ti.MeasureChanged,n)}}handleMouseMove(e){if(e.catch==null)return;let t=this.tools.renderCatchElement(e.catch);if(t!=null&&this.points.length==1){let n=this.engine.measure.annotationData.slopeAnnotation.find(r=>r.isSelect==!0);n==null&&(n={id:Ai(),point1:this.points[0].clone(),point2:t.point.clone(),slopePercentage:0,slopeAngle:0,heightDiff:0,horizontalDist:0,text:"0.00% (0.00°)",isSelect:!0},this.engine.measure.annotationData.slopeAnnotation.push(n)),n.point2=t.point.clone();const i=this.calculateSlope(n.point1,n.point2);n.slopePercentage=i.percentage,n.slopeAngle=i.angle,n.heightDiff=i.heightDiff,n.horizontalDist=i.horizontalDist,n.text=i.percentage.toFixed(2)+"% ("+i.angle.toFixed(2)+"°)",console.log("坡度",n.text)}}}class Dw{isActive=!1;engine;clearHeightMeasure;distanceMeasure;clearDistanceMeasure;elevationMeasure;pointMeasure;angleMeasure;areaMeasure;slopeMeasure;tools;annotationContainer;annotationData={normalAnnotation:[],textAnnotation:[],coordinateAnnotation:[],angleAnnotation:[],distanceAnnotation:[],areaAnnotation:[],slopeAnnotation:[],elevationAnnotation:[],volumeAnnotation:[]};constructor(e){this.engine=e,this.clearHeightMeasure=new Sw(e),this.distanceMeasure=new Ew(e),this.clearDistanceMeasure=new Tw(e),this.elevationMeasure=new Aw(e),this.pointMeasure=new Cw(e),this.angleMeasure=new Pw(e),this.areaMeasure=new Rw(e),this.slopeMeasure=new Lw(e),this.tools=new Ci(e),this.annotationContainer=document.createElement("div"),this.annotationContainer.className="annotation-container",e.container.parentElement.appendChild(this.annotationContainer)}active(){this.isActive=!0,this.tools.active()}disActive(){this.tools.disActive(),this.clearAll(),this.isActive=!1,this.clearHeightMeasure.disActive(),this.distanceMeasure.disActive(),this.clearDistanceMeasure.disActive(),this.elevationMeasure.disActive(),this.pointMeasure.disActive(),this.angleMeasure.disActive(),this.areaMeasure.disActive(),this.slopeMeasure.disActive(),this.engine.interactionModule.active()}clearAllPoints(){this.clearHeightMeasure.clearAllPoints(),this.distanceMeasure.clearAllPoints(),this.clearDistanceMeasure.clearAllPoints(),this.elevationMeasure.clearAllPoints(),this.pointMeasure.clearAllPoints(),this.angleMeasure.clearAllPoints(),this.areaMeasure.clearAllPoints(),this.slopeMeasure.clearAllPoints()}clearAll(){e(this.annotationData.normalAnnotation),e(this.annotationData.textAnnotation),e(this.annotationData.coordinateAnnotation),e(this.annotationData.angleAnnotation),e(this.annotationData.distanceAnnotation),e(this.annotationData.areaAnnotation),e(this.annotationData.slopeAnnotation),e(this.annotationData.elevationAnnotation),e(this.annotationData.volumeAnnotation);function e(t){for(let n=0;n{t.visible=!0}),this.engine.handelBehaved.init(this),this.engine.handelBehaved.active();let e=this;e.engine.scene.children.filter(t=>t.type=="Mesh"&&t.url).forEach(t=>{t.material&&Array.isArray(t.material)?t.material.forEach(n=>{n.clippingPlanes=e.engine.sectionPlane}):t.material.clippingPlanes=e.engine.sectionPlane,e.engine.clipping.clippingStencil?.addMesh(e.engine.sectionPlane.find(n=>n.name=="前"),t)})}disActive(){this.isActive=!1,this.engine.handelBehaved.disActive();const e=this.engine.sectionPlane.find(t=>t.name=="前");e&&(e.constant=1e5),this.meshs.forEach(t=>{t.visible=!1})}init(){let e=this.engine.octreeBox.getBoundingBox();this.box=e,this.updata_face(e)}updata_face(e){let t=this,n=t.engine.scene.children.find(o=>o.type=="Group"&&o.name=="ClippingBox");n==null&&(n=new xn,n.name="ClippingBox",t.engine.scene.add(n));let i=[new P(e.min.x,e.min.y,e.min.z),new P(e.max.x,e.min.y,e.min.z),new P(e.max.x,e.max.y,e.min.z),new P(e.min.x,e.max.y,e.min.z)];r(i,new P(0,0,-1),"前");function r(o,a,l){const c=new ht,h=new Float32Array([o[0].x,o[0].y,o[0].z,o[1].x,o[1].y,o[1].z,o[2].x,o[2].y,o[2].z,o[3].x,o[3].y,o[3].z]),u=[0,1,2,0,2,3];c.setAttribute("position",new at(h,3)),c.setIndex(u);let d=t.meshs.find(m=>m.name==l);if(d==null){const m=new Xt({color:65280,transparent:!0,opacity:.02,side:Et}),b=new ut(c,m);b.normal=a,b.name=l,n.add(b),t.meshs.push(b)}else d.geometry=c;const f=new Float32Array([o[0].x,o[0].y,o[0].z,o[1].x,o[1].y,o[1].z,o[2].x,o[2].y,o[2].z,o[3].x,o[3].y,o[3].z,o[0].x,o[0].y,o[0].z]);let p=new as({color:255}),g=new ht;g.setAttribute("position",new at(f,3));let x=t.meshs.find(m=>m.name==l+"Line");x==null&&(x=new Xi(g,p),x.name=l+"Line",n.add(x),t.meshs.push(x)),x.geometry=g,x.material=p,t.engine.sectionPlane.find(m=>m.name==l).setFromNormalAndCoplanarPoint(a.clone().setLength(-1),e.min)}}handleMouseDown(e){this.isDrag=!0;const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0)if(this.pickPoint=t[0].point,this.pickNormal=t[0].face.normal,this.engine.controls.enabled=!1,this.pickMesh=t[0].object,this.box_={min:this.box.min.clone(),max:this.box.max.clone()},this.pickNormal.y==0){const n=new _t;n.setFromNormalAndCoplanarPoint(new P(0,1,0),this.pickPoint),this.plane=n}else{let n=new P(this.engine.camera.position.x,this.pickPoint.y,this.engine.camera.position.z);const i=new _t;i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1),this.pickPoint),this.plane=i}}handleMouseUp(e){this.isDrag=!1,this.pickPoint=null,this.pickNormal=null,this.pickMesh=null,this.engine.controls.enabled=!0}handleMouseMove(e){this.meshs.forEach(n=>{n.material.opacity=0});const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0&&(t[0].object.material.opacity=.05),this.pickPoint!=null){const n=new P;if(e.raycaster.ray.intersectPlane(this.plane,n)){let i=n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());this.pickMesh.name=="前"||this.pickMesh.name=="左"||this.pickMesh.name=="底"?this.box.min=this.box_.min.clone().add(this.pickNormal.clone().setLength(i)):this.box.max=this.box_.max.clone().add(this.pickNormal.clone().setLength(i)),this.updata_face(this.box)}}}}const Hm=0,Bw=1,Nw=2,Vm=2,gu=1.25,Gm=1,cn=32,qt=cn/4,Wm=65535,kw=Math.pow(2,-24),xu=Symbol("SKIP_GENERATION");function Uw(s){return s.index?s.index.count:s.attributes.position.count}function Ms(s){return Uw(s)/3}function Ow(s,e=ArrayBuffer){return s>65535?new Uint32Array(new e(4*s)):new Uint16Array(new e(2*s))}function Fw(s,e){if(!s.index){const t=s.attributes.position.count,n=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,i=Ow(t,n);s.setIndex(new at(i,1));for(let r=0;ri&&(a.push({pos:Math.max(i,f),isStart:!0}),a.push({pos:Math.min(r,g),isStart:!1}))}a.sort((h,u)=>h.pos!==u.pos?h.pos-u.pos:h.type==="end"?-1:1);let l=0,c=null;for(const h of a){const u=h.pos;l!==0&&u!==c&&t.push({offset:c,count:u-c}),l+=h.isStart?1:-1,c=u}return t}function vu(s,e,t,n,i){let r=1/0,o=1/0,a=1/0,l=-1/0,c=-1/0,h=-1/0,u=1/0,d=1/0,f=1/0,p=-1/0,g=-1/0,x=-1/0;const m=s.offset||0;for(let b=(e-m)*6,v=(e+t-m)*6;bl&&(l=A),yp&&(p=y);const R=s[b+2],_=s[b+3],S=R-_,D=R+_;Sc&&(c=D),Rg&&(g=R);const C=s[b+4],B=s[b+5],w=C-B,F=C+B;wh&&(h=F),Cx&&(x=C)}n[0]=r,n[1]=o,n[2]=a,n[3]=l,n[4]=c,n[5]=h,i[0]=u,i[1]=d,i[2]=f,i[3]=p,i[4]=g,i[5]=x}function qm(s,e,t=null,n=null,i=null){const r=s.attributes.position,o=s.index?s.index.array:null,a=r.normalized;if(i===null)i=new Float32Array(t*6),i.offset=e;else if(e<0||t+e>i.length/6)throw new Error("MeshBVH: compute triangle bounds range is invalid.");const l=r.array,c=r.offset||0;let h=3;r.isInterleavedBufferAttribute&&(h=r.data.stride);const u=["getX","getY","getZ"],d=i.offset;for(let f=e,p=e+t;f_&&(_=E),A>_&&(_=A);const S=(_-R)/2,D=y*2;i[x+D+0]=R+S,i[x+D+1]=S+(Math.abs(R)+S)*kw}}return i}function Dt(s,e,t){return t.min.x=e[s],t.min.y=e[s+1],t.min.z=e[s+2],t.max.x=e[s+3],t.max.y=e[s+4],t.max.z=e[s+5],t}function Zm(s){let e=-1,t=-1/0;for(let n=0;n<3;n++){const i=s[n+3]-s[n];i>t&&(t=i,e=n)}return e}function Ym(s,e){e.set(s)}function Km(s,e,t){let n,i;for(let r=0;r<3;r++){const o=r+3;n=s[r],i=e[r],t[r]=ni?n:i}}function hl(s,e,t){for(let n=0;n<3;n++){const i=e[s+2*n],r=e[s+2*n+1],o=i-r,a=i+r;ot[n+3]&&(t[n+3]=a)}}function Do(s){const e=s[3]-s[0],t=s[4]-s[1],n=s[5]-s[2];return 2*(e*t+t*n+n*e)}const Pi=32,zw=(s,e)=>s.candidate-e.candidate,Zi=new Array(Pi).fill().map(()=>({count:0,bounds:new Float32Array(6),rightCacheBounds:new Float32Array(6),leftCacheBounds:new Float32Array(6),candidate:0})),ul=new Float32Array(6);function Hw(s,e,t,n,i,r){let o=-1,a=0;if(r===Hm)o=Zm(e),o!==-1&&(a=(e[o]+e[o+3])/2);else if(r===Bw)o=Zm(s),o!==-1&&(a=Vw(t,n,i,o));else if(r===Nw){const l=Do(s);let c=gu*i;const h=t.offset||0,u=(n-h)*6,d=(n+i-h)*6;for(let f=0;f<3;f++){const p=e[f],g=(e[f+3]-p)/Pi;if(i=E.candidate?hl(v,t,E.rightCacheBounds):(hl(v,t,E.leftCacheBounds),E.count++)}}for(let v=0;v=Pi&&(v=Pi-1);const y=Zi[v];y.count++,hl(b,t,y.bounds)}const x=Zi[Pi-1];Ym(x.bounds,x.rightCacheBounds);for(let b=Pi-2;b>=0;b--){const v=Zi[b],y=Zi[b+1];Km(v.bounds,y.rightCacheBounds,v.rightCacheBounds)}let m=0;for(let b=0;b=l;)a--;if(o=l;)a--;if(oXw)throw new Error("MeshBVH: Cannot store relative child node offset greater than 32 bits.");return dl[t+6]=d,dl[t+7]=l,Mu(h,a)}}function qw(s,e,t){const n=(s.index?s.index.count:s.attributes.position.count)/3>65536,i=t.reduce((c,h)=>c+h.count,0),r=n?4:2,o=e?new SharedArrayBuffer(i*r):new ArrayBuffer(i*r),a=n?new Uint32Array(o):new Uint16Array(o);let l=0;for(let c=0;c=r&&(m=!0,o&&(console.warn(`MeshBVH: Max depth of ${r} reached when generating BVH. Consider increasing maxDepth.`),console.warn(d))),A<=a||_>=r)return v(E+A),M.offset=E,M.count=A,M;const S=Hw(M.boundingData,R,e,E,A,l);if(S.axis===-1)return v(E+A),M.offset=E,M.count=A,M;const D=p(u,f,e,E,A,S);if(D===E||D===E+A)v(E+A),M.offset=E,M.count=A;else{M.splitAxis=S.axis;const C=new bu,B=E,w=D-E;M.left=C,vu(e,B,w,C.boundingData,x),y(C,B,w,x,_+1);const F=new bu,W=D,j=A-w;M.right=F,vu(e,W,j,F.boundingData,x),y(F,W,j,x,_+1)}return M}}function Yw(s,e){const t=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,n=s.geometry;let i,r;if(e.indirect){const o=jm(n,e.range),a=qw(n,e.useSharedArrayBuffer,o);s._indirectBuffer=a,i=qm(n,0,a.length,a),r=[{offset:0,count:a.length}]}else{Fw(n,e);const o=Xm(n,e.range)[0];i=qm(n,o.offset,o.count),r=jm(n,e.range)}s._roots=r.map(o=>{const a=Zw(s,i,o.offset,o.count,e),l=_u(a),c=new t(cn*l);return jw(0,a,c),c})}class Ri{constructor(){this.min=1/0,this.max=-1/0}setFromPointsField(e,t){let n=1/0,i=-1/0;for(let r=0,o=e.length;ri?a:i}this.min=n,this.max=i}setFromPoints(e,t){let n=1/0,i=-1/0;for(let r=0,o=t.length;ri?l:i}this.min=n,this.max=i}isSeparated(e){return this.min>e.max||e.min>this.max}}Ri.prototype.setFromBox=(function(){const s=new P;return function(e,t){const n=t.min,i=t.max;let r=1/0,o=-1/0;for(let a=0;a<=1;a++)for(let l=0;l<=1;l++)for(let c=0;c<=1;c++){s.x=n.x*a+i.x*(1-a),s.y=n.y*l+i.y*(1-l),s.z=n.z*c+i.z*(1-c);const h=e.dot(s);r=Math.min(h,r),o=Math.max(h,o)}this.min=r,this.max=o}})();const Kw=(function(){const s=new P,e=new P,t=new P;return function(n,i,r){const o=n.start,a=s,l=i.start,c=e;t.subVectors(o,l),s.subVectors(n.end,n.start),e.subVectors(i.end,i.start);const h=t.dot(c),u=c.dot(a),d=c.dot(c),f=t.dot(a),p=a.dot(a)*d-u*u;let g,x;p!==0?g=(h*u-f*d)/p:g=0,x=(h+g*u)/d,r.x=g,r.y=x}})(),wu=(function(){const s=new ce,e=new P,t=new P;return function(n,i,r,o){Kw(n,i,s);let a=s.x,l=s.y;if(a>=0&&a<=1&&l>=0&&l<=1){n.at(a,r),i.at(l,o);return}else if(a>=0&&a<=1){l<0?i.at(0,o):i.at(1,o),n.closestPointToPoint(o,!0,r);return}else if(l>=0&&l<=1){a<0?n.at(0,r):n.at(1,r),i.closestPointToPoint(r,!0,o);return}else{let c;a<0?c=n.start:c=n.end;let h;l<0?h=i.start:h=i.end;const u=e,d=t;if(n.closestPointToPoint(h,!0,e),i.closestPointToPoint(c,!0,t),u.distanceToSquared(h)<=d.distanceToSquared(c)){r.copy(u),o.copy(h);return}else{r.copy(c),o.copy(d);return}}}})(),$w=(function(){const s=new P,e=new P,t=new _t,n=new Bn;return function(i,r){const{radius:o,center:a}=i,{a:l,b:c,c:h}=r;if(n.start=l,n.end=c,n.closestPointToPoint(a,!0,s).distanceTo(a)<=o||(n.start=l,n.end=h,n.closestPointToPoint(a,!0,s).distanceTo(a)<=o)||(n.start=c,n.end=h,n.closestPointToPoint(a,!0,s).distanceTo(a)<=o))return!0;const u=r.getPlane(t);if(Math.abs(u.distanceToPoint(a))<=o){const d=u.projectPoint(a,e);if(r.containsPoint(d))return!0}return!1}})(),Jw=["x","y","z"],Li=1e-15,Qm=Li*Li;function Un(s){return Math.abs(s)new P),this.satBounds=new Array(4).fill().map(()=>new Ri),this.points=[this.a,this.b,this.c],this.plane=new _t,this.isDegenerateIntoSegment=!1,this.isDegenerateIntoPoint=!1,this.degenerateSegment=new Bn,this.needsUpdate=!0}intersectsSphere(e){return $w(e,this)}update(){const e=this.a,t=this.b,n=this.c,i=this.points,r=this.satAxes,o=this.satBounds,a=r[0],l=o[0];this.getNormal(a),l.setFromPoints(a,i);const c=r[1],h=o[1];c.subVectors(e,t),h.setFromPoints(c,i);const u=r[2],d=o[2];u.subVectors(t,n),d.setFromPoints(u,i);const f=r[3],p=o[3];f.subVectors(n,e),p.setFromPoints(f,i);const g=c.length(),x=u.length(),m=f.length();this.isDegenerateIntoPoint=!1,this.isDegenerateIntoSegment=!1,g0)f(v.c,v.a,v.b,E,y,M,D,_,S,C,B);else if(R>0)f(v.b,v.a,v.c,M,y,E,S,_,D,C,B);else if(S*D>0||_!=0)f(v.a,v.b,v.c,y,M,E,_,S,D,C,B);else if(S!=0)f(v.b,v.a,v.c,M,y,E,S,_,D,C,B);else if(D!=0)f(v.c,v.a,v.b,E,y,M,D,_,S,C,B);else return!0;return!1}function g(v,y,M,E){const A=y.degenerateSegment,R=v.plane.distanceToPoint(A.start),_=v.plane.distanceToPoint(A.end);return Un(R)?Un(_)?d(v,y,M,E):(M&&(M.start.copy(A.start),M.end.copy(A.start)),v.containsPoint(A.start)):Un(_)?(M&&(M.start.copy(A.end),M.end.copy(A.end)),v.containsPoint(A.end)):v.plane.intersectLine(A,n)!=null?(M&&(M.start.copy(n),M.end.copy(n)),v.containsPoint(n)):!1}function x(v,y,M){const E=y.a;return Un(v.plane.distanceToPoint(E))&&v.containsPoint(E)?(M&&(M.start.copy(E),M.end.copy(E)),!0):!1}function m(v,y,M){const E=v.degenerateSegment,A=y.a;return E.closestPointToPoint(A,!0,n),A.distanceToSquared(n)1||w<0||w>1)return!1;const F=A.start.z+_.z*B,W=R.start.z+S.z*w;return Un(F-W)?(M&&(M.start.copy(A.start).addScaledVector(_,B),M.end.copy(A.start).addScaledVector(_,B)),!0):!1}else return y.isDegenerateIntoPoint?m(v,y,M):g(y,v,M,E);else{if(v.isDegenerateIntoPoint)return y.isDegenerateIntoPoint?y.a.distanceToSquared(v.a)0&&B>0)return!1;let w=A.distanceToPoint(v.a),F=A.distanceToPoint(v.b),W=A.distanceToPoint(v.c);Un(w)&&(w=0),Un(F)&&(F=0),Un(W)&&(W=0);const j=w*F,$=w*W;if(j>0&&$>0)return!1;i.copy(A.normal),r.copy(R.normal);const Z=i.cross(r);let re=0,X=Math.abs(Z.x);const Y=Math.abs(Z.y);Y>X&&(X=Y,re=1),Math.abs(Z.z)>X&&(re=2);const ge=Jw[re],pe=this.a[ge],de=this.b[ge],ie=this.c[ge],he=v.a[ge],fe=v.b[ge],ve=v.c[ge];if(p(this,pe,de,ie,C,B,_,S,D,h,a))return d(this,v,y,M);if(p(v,he,fe,ve,j,$,w,F,W,u,l))return d(this,v,y,M);if(h.yh.x?y.start.copy(l.start):y.start.copy(a.start),u.ynew P),this.satAxes=new Array(3).fill().map(()=>new P),this.satBounds=new Array(3).fill().map(()=>new Ri),this.alignedSatBounds=new Array(3).fill().map(()=>new Ri),this.needsUpdate=!1,e&&this.min.copy(e),t&&this.max.copy(t),n&&this.matrix.copy(n)}set(e,t,n){this.min.copy(e),this.max.copy(t),this.matrix.copy(n),this.needsUpdate=!0}copy(e){this.min.copy(e.min),this.max.copy(e.max),this.matrix.copy(e.matrix),this.needsUpdate=!0}}hn.prototype.update=(function(){return function(){const s=this.matrix,e=this.min,t=this.max,n=this.points;for(let l=0;l<=1;l++)for(let c=0;c<=1;c++)for(let h=0;h<=1;h++){const u=1*l|2*c|4*h,d=n[u];d.x=l?t.x:e.x,d.y=c?t.y:e.y,d.z=h?t.z:e.z,d.applyMatrix4(s)}const i=this.satBounds,r=this.satAxes,o=n[0];for(let l=0;l<3;l++){const c=r[l],h=i[l],u=1<new Bn),t=new Array(12).fill().map(()=>new Bn),n=new P,i=new P;return function(r,o=0,a=null,l=null){if(this.needsUpdate&&this.update(),this.intersectsBox(r))return(a||l)&&(r.getCenter(i),this.closestPointToPoint(i,n),r.closestPointToPoint(n,i),a&&a.copy(n),l&&l.copy(i)),0;const c=o*o,h=r.min,u=r.max,d=this.points;let f=1/0;for(let g=0;g<8;g++){const x=d[g];i.copy(x).clamp(h,u);const m=x.distanceToSquared(i);if(mnew On)}}const Fn=new Qw;function Zt(s,e){return e[s+15]===Wm}function Tn(s,e){return e[s+6]}function zn(s,e){return e[s+14]}function Jt(s){return s+qt}function Qt(s,e){const t=e[s+6];return s+t*qt}function Eu(s,e){return e[s+7]}class eS{constructor(){this.float32Array=null,this.uint16Array=null,this.uint32Array=null;const e=[];let t=null;this.setBuffer=n=>{t&&e.push(t),t=n,this.float32Array=new Float32Array(n),this.uint16Array=new Uint16Array(n),this.uint32Array=new Uint32Array(n)},this.clearBuffer=()=>{t=null,this.float32Array=null,this.uint16Array=null,this.uint32Array=null,e.length!==0&&this.setBuffer(e.pop())}}}const Mt=new eS;let Yi,Rr;const Lr=[],fl=new Su(()=>new xt);function tS(s,e,t,n,i,r){Yi=fl.getPrimitive(),Rr=fl.getPrimitive(),Lr.push(Yi,Rr),Mt.setBuffer(s._roots[e]);const o=Tu(0,s.geometry,t,n,i,r);Mt.clearBuffer(),fl.releasePrimitive(Yi),fl.releasePrimitive(Rr),Lr.pop(),Lr.pop();const a=Lr.length;return a>0&&(Rr=Lr[a-1],Yi=Lr[a-2]),o}function Tu(s,e,t,n,i=null,r=0,o=0){const{float32Array:a,uint16Array:l,uint32Array:c}=Mt;let h=s*2;if(Zt(h,l)){const u=Tn(s,c),d=zn(h,l);return Dt(s,a,Yi),n(u,d,!1,o,r+s/qt,Yi)}else{let u=function(D){const{uint16Array:C,uint32Array:B}=Mt;let w=D*2;for(;!Zt(w,C);)D=Jt(D),w=D*2;return Tn(D,B)},d=function(D){const{uint16Array:C,uint32Array:B}=Mt;let w=D*2;for(;!Zt(w,C);)D=Qt(D,B),w=D*2;return Tn(D,B)+zn(w,C)};const f=Jt(s),p=Qt(s,c);let g=f,x=p,m,b,v,y;if(i&&(v=Yi,y=Rr,Dt(g,a,v),Dt(x,a,y),m=i(v),b=i(y),b(Io.copy(e).clamp(h.min,h.max),Io.distanceToSquared(e)),intersectsBounds:(h,u,d)=>d{h.closestPointToPoint(e,Io);const d=e.distanceToSquared(Io);return d=169,iS=parseInt(Hr)<=161,ws=new P,Ss=new P,Es=new P,ml=new ce,gl=new ce,xl=new ce,e0=new P,t0=new P,n0=new P,Bo=new P;function sS(s,e,t,n,i,r,o,a){let l;if(r===on?l=s.intersectTriangle(n,t,e,!0,i):l=s.intersectTriangle(e,t,n,r!==Et,i),l===null)return null;const c=s.origin.distanceTo(i);return ca?null:{distance:c,point:i.clone()}}function i0(s,e,t,n,i,r,o,a,l,c,h){ws.fromBufferAttribute(e,r),Ss.fromBufferAttribute(e,o),Es.fromBufferAttribute(e,a);const u=sS(s,ws,Ss,Es,Bo,l,c,h);if(u){if(n){ml.fromBufferAttribute(n,r),gl.fromBufferAttribute(n,o),xl.fromBufferAttribute(n,a),u.uv=new ce;const f=yt.getInterpolation(Bo,ws,Ss,Es,ml,gl,xl,u.uv);pl||(u.uv=f)}if(i){ml.fromBufferAttribute(i,r),gl.fromBufferAttribute(i,o),xl.fromBufferAttribute(i,a),u.uv1=new ce;const f=yt.getInterpolation(Bo,ws,Ss,Es,ml,gl,xl,u.uv1);pl||(u.uv1=f),iS&&(u.uv2=u.uv1)}if(t){e0.fromBufferAttribute(t,r),t0.fromBufferAttribute(t,o),n0.fromBufferAttribute(t,a),u.normal=new P;const f=yt.getInterpolation(Bo,ws,Ss,Es,e0,t0,n0,u.normal);u.normal.dot(s.direction)>0&&u.normal.multiplyScalar(-1),pl||(u.normal=f)}const d={a:r,b:o,c:a,normal:new P,materialIndex:0};if(yt.getNormal(ws,Ss,Es,d.normal),u.face=d,u.faceIndex=r,pl){const f=new P;yt.getBarycoord(Bo,ws,Ss,Es,f),u.barycoord=f}}return u}function s0(s){return s&&s.isMaterial?s.side:s}function vl(s,e,t,n,i,r,o){const a=n*3;let l=a+0,c=a+1,h=a+2;const{index:u,groups:d}=s;s.index&&(l=u.getX(l),c=u.getX(c),h=u.getX(h));const{position:f,normal:p,uv:g,uv1:x}=s.attributes;if(Array.isArray(e)){const m=n*3;for(let b=0,v=d.length;b=y&&mM&&(M=D),CE&&(E=C),BA&&(A=B)}return l[d+0]!==b||l[d+1]!==v||l[d+2]!==y||l[d+3]!==M||l[d+4]!==E||l[d+5]!==A?(l[d+0]=b,l[d+1]=v,l[d+2]=y,l[d+3]=M,l[d+4]=E,l[d+5]=A,!0):!1}else{const x=Jt(d),m=Qt(d,o);let b=p,v=!1,y=!1;if(e){if(!b){const S=x/qt+f/cn,D=m/qt+f/cn;v=e.has(S),y=e.has(D),b=!v&&!y}}else v=!0,y=!0;const M=b||v,E=b||y;let A=!1;M&&(A=u(x,f,b));let R=!1;E&&(R=u(m,f,b));const _=A||R;if(_)for(let S=0;S<3;S++){const D=x+S,C=m+S,B=l[D],w=l[D+3],F=l[C],W=l[C+3];l[d+S]=BW?w:W}return _}}}function Ki(s,e,t,n,i){let r,o,a,l,c,h;const u=1/t.direction.x,d=1/t.direction.y,f=1/t.direction.z,p=t.origin.x,g=t.origin.y,x=t.origin.z;let m=e[s],b=e[s+3],v=e[s+1],y=e[s+3+1],M=e[s+2],E=e[s+3+2];return u>=0?(r=(m-p)*u,o=(b-p)*u):(r=(b-p)*u,o=(m-p)*u),d>=0?(a=(v-g)*d,l=(y-g)*d):(a=(y-g)*d,l=(v-g)*d),r>l||a>o||((a>r||isNaN(r))&&(r=a),(l=0?(c=(M-x)*f,h=(E-x)*f):(c=(E-x)*f,h=(M-x)*f),r>h||c>o)?!1:((c>r||r!==r)&&(r=c),(h=n)}function cS(s,e,t,n,i,r,o,a){const{geometry:l,_indirectBuffer:c}=s;for(let h=n,u=n+i;h=0;let f,p;d?(f=Jt(s),p=Qt(s,l)):(f=Qt(s,l),p=Jt(s));const g=Ki(f,o,n,i,r)?Pu(f,e,t,n,i,r):null;if(g){const m=g.point[u];if(d?m<=o[p+h]:m>=o[p+h+3])return g}const x=Ki(p,o,n,i,r)?Pu(p,e,t,n,i,r):null;return g&&x?g.distance<=x.distance?g:x:g||x||null}}const bl=new xt,Dr=new On,Ir=new On,No=new ze,r0=new hn,yl=new hn;function mS(s,e,t,n){Mt.setBuffer(s._roots[e]);const i=Ru(0,s,t,n);return Mt.clearBuffer(),i}function Ru(s,e,t,n,i=null){const{float32Array:r,uint16Array:o,uint32Array:a}=Mt;let l=s*2;if(i===null&&(t.boundingBox||t.computeBoundingBox(),r0.set(t.boundingBox.min,t.boundingBox.max,n),i=r0),Zt(l,o)){const c=e.geometry,h=c.index,u=c.attributes.position,d=t.index,f=t.attributes.position,p=Tn(s,a),g=zn(l,o);if(No.copy(n).invert(),t.boundsTree)return Dt(s,r,yl),yl.matrix.copy(No),yl.needsUpdate=!0,t.boundsTree.shapecast({intersectsBounds:x=>yl.intersectsBox(x),intersectsTriangle:x=>{x.a.applyMatrix4(n),x.b.applyMatrix4(n),x.c.applyMatrix4(n),x.needsUpdate=!0;for(let m=p*3,b=(g+p)*3;mLu.distanceToBox(M),intersectsBounds:(M,E,A)=>A{if(e.boundsTree)return e.boundsTree.shapecast({boundsTraverseOrder:A=>ko.distanceToBox(A),intersectsBounds:(A,R,_)=>_{for(let _=A,S=A+R;_M&&(M=B),wE&&(E=w),FA&&(A=F)}}return l[d+0]!==b||l[d+1]!==v||l[d+2]!==y||l[d+3]!==M||l[d+4]!==E||l[d+5]!==A?(l[d+0]=b,l[d+1]=v,l[d+2]=y,l[d+3]=M,l[d+4]=E,l[d+5]=A,!0):!1}else{const x=Jt(d),m=Qt(d,o);let b=p,v=!1,y=!1;if(e){if(!b){const S=x/qt+f/cn,D=m/qt+f/cn;v=e.has(S),y=e.has(D),b=!v&&!y}}else v=!0,y=!0;const M=b||v,E=b||y;let A=!1;M&&(A=u(x,f,b));let R=!1;E&&(R=u(m,f,b));const _=A||R;if(_)for(let S=0;S<3;S++){const D=x+S,C=m+S,B=l[D],w=l[D+3],F=l[C],W=l[C+3];l[d+S]=BW?w:W}return _}}}function MS(s,e,t,n,i,r,o){Mt.setBuffer(s._roots[e]),Du(0,s,t,n,i,r,o),Mt.clearBuffer()}function Du(s,e,t,n,i,r,o){const{float32Array:a,uint16Array:l,uint32Array:c}=Mt,h=s*2;if(Zt(h,l)){const u=Tn(s,c),d=zn(h,l);cS(e,t,n,u,d,i,r,o)}else{const u=Jt(s);Ki(u,a,n,r,o)&&Du(u,e,t,n,i,r,o);const d=Qt(s,c);Ki(d,a,n,r,o)&&Du(d,e,t,n,i,r,o)}}const wS=["x","y","z"];function SS(s,e,t,n,i,r){Mt.setBuffer(s._roots[e]);const o=Iu(0,s,t,n,i,r);return Mt.clearBuffer(),o}function Iu(s,e,t,n,i,r){const{float32Array:o,uint16Array:a,uint32Array:l}=Mt;let c=s*2;if(Zt(c,a)){const h=Tn(s,l),u=zn(c,a);return hS(e,t,n,h,u,i,r)}else{const h=Eu(s,l),u=wS[h],d=n.direction[u]>=0;let f,p;d?(f=Jt(s),p=Qt(s,l)):(f=Qt(s,l),p=Jt(s));const g=Ki(f,o,n,i,r)?Iu(f,e,t,n,i,r):null;if(g){const m=g.point[u];if(d?m<=o[p+h]:m>=o[p+h+3])return g}const x=Ki(p,o,n,i,r)?Iu(p,e,t,n,i,r):null;return g&&x?g.distance<=x.distance?g:x:g||x||null}}const Ml=new xt,Br=new On,Nr=new On,Uo=new ze,o0=new hn,wl=new hn;function ES(s,e,t,n){Mt.setBuffer(s._roots[e]);const i=Bu(0,s,t,n);return Mt.clearBuffer(),i}function Bu(s,e,t,n,i=null){const{float32Array:r,uint16Array:o,uint32Array:a}=Mt;let l=s*2;if(i===null&&(t.boundingBox||t.computeBoundingBox(),o0.set(t.boundingBox.min,t.boundingBox.max,n),i=o0),Zt(l,o)){const c=e.geometry,h=c.index,u=c.attributes.position,d=t.index,f=t.attributes.position,p=Tn(s,a),g=zn(l,o);if(Uo.copy(n).invert(),t.boundsTree)return Dt(s,r,wl),wl.matrix.copy(Uo),wl.needsUpdate=!0,t.boundsTree.shapecast({intersectsBounds:x=>wl.intersectsBox(x),intersectsTriangle:x=>{x.a.applyMatrix4(n),x.b.applyMatrix4(n),x.c.applyMatrix4(n),x.needsUpdate=!0;for(let m=p,b=g+p;mNu.distanceToBox(M),intersectsBounds:(M,E,A)=>A{if(e.boundsTree){const A=e.boundsTree;return A.shapecast({boundsTraverseOrder:R=>Oo.distanceToBox(R),intersectsBounds:(R,_,S)=>S{for(let S=R,D=R+_;Snew xt),kr=new xt,Ur=new xt,ku=new xt,Uu=new xt;let Ou=!1;function DS(s,e,t,n){if(Ou)throw new Error("MeshBVH: Recursive calls to bvhcast not supported.");Ou=!0;const i=s._roots,r=e._roots;let o,a=0,l=0;const c=new ze().copy(t).invert();for(let h=0,u=i.length;hl.slice()),a.index=o?o.array.slice():null,a.indirectBuffer=r?r.slice():null):(a.roots=i,a.index=o?o.array:null,a.indirectBuffer=r),a}static deserialize(e,t,n={}){n={setIndex:!0,indirect:!!e.indirectBuffer,...n};const{index:i,roots:r,indirectBuffer:o}=e;e.version||(console.warn("MeshBVH.deserialize: Serialization format has been changed and will be fixed up. It is recommended to regenerate any stored serialized data."),l(r));const a=new Fu(t,{...n,[xu]:!0});if(a._roots=r,a._indirectBuffer=o||null,n.setIndex){const c=t.getIndex();if(c===null){const h=new at(e.index,1,!1);t.setIndex(h)}else c.array!==i&&(c.array.set(i),c.needsUpdate=!0)}return a;function l(c){for(let h=0;hthis._indirectBuffer[n]:n=>n}shiftTriangleOffsets(e){const t=this._indirectBuffer;if(t)for(let n=0,i=t.length;nu(d,f,p,g,x)?!0:n(d,f,this,a,p,g,t)}else o||(a?o=(u,d,f,p)=>n(u,d,this,a,f,p,t):o=(u,d,f)=>f);let l=!1,c=0;const h=this._roots;for(let u=0,d=h.length;u{const g=this.resolveTriangleIndex(p);zt(o,g*3,a,l)}:p=>{zt(o,p*3,a,l)},h=Fn.getPrimitive(),u=e.geometry.index,d=e.geometry.attributes.position,f=e.indirect?p=>{const g=e.resolveTriangleIndex(p);zt(h,g*3,u,d)}:p=>{zt(h,p*3,u,d)};if(r){const p=(g,x,m,b,v,y,M,E)=>{for(let A=m,R=m+b;ATl.intersectsBox(n),intersectsTriangle:n=>Tl.intersectsTriangle(n)})}intersectsSphere(e){return this.shapecast({intersectsBounds:t=>e.intersectsBox(t),intersectsTriangle:t=>t.intersectsSphere(e)})}closestPointToGeometry(e,t,n={},i={},r=0,o=1/0){return(this.indirect?RS:yS)(this,e,t,n,i,r,o)}closestPointToPoint(e,t={},n=0,i=1/0){return nS(this,e,t,n,i)}getBoundingBox(e){return e.makeEmpty(),this._roots.forEach(t=>{Dt(0,new Float32Array(t),a0),e.union(a0)}),e}}const l0=1e-6,BS=l0*.5,c0=Math.pow(10,-Math.log10(l0)),NS=BS*c0;function di(s){return~~(s*c0+NS)}function kS(s){return`${di(s.x)},${di(s.y)}`}function h0(s){return`${di(s.x)},${di(s.y)},${di(s.z)}`}function US(s){return`${di(s.x)},${di(s.y)},${di(s.z)},${di(s.w)}`}function OS(s,e,t){t.direction.subVectors(e,s).normalize();const n=s.dot(t.direction);return t.origin.copy(s).addScaledVector(t.direction,-n),t}function u0(){return typeof SharedArrayBuffer<"u"}function FS(s){if(s.buffer instanceof SharedArrayBuffer)return s;const e=s.constructor,t=s.buffer,n=new SharedArrayBuffer(t.byteLength),i=new Uint8Array(t);return new Uint8Array(n).set(i,0),new e(n)}function zS(s,e=ArrayBuffer){return s>65535?new Uint32Array(new e(4*s)):new Uint16Array(new e(2*s))}function HS(s,e){if(!s.index){const t=s.attributes.position.count,n=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,i=zS(t,n);s.setIndex(new at(i,1));for(let r=0;rl.end)){if(l.end=h.end)r(h.end,l.end)||s.splice(a+1,0,{start:h.end,end:l.end,index:l.index}),l.end=h.start,h.start=0,h.end=0;else if(l.start>=h.start&&l.end<=h.end)r(l.end,h.end)||e.splice(c+1,0,{start:l.end,end:h.end,index:h.index}),h.end=l.start,l.start=0,l.end=0;else if(l.start<=h.start&&l.end<=h.end){const u=l.end;l.end=h.start,h.start=u}else if(l.start>=h.start&&l.end>=h.end){const u=h.end;h.end=l.start,l.start=u}else throw new Error}if(t.has(l.index)||t.set(l.index,[]),t.has(h.index)||t.set(h.index,[]),t.get(l.index).push(h.index),t.get(h.index).push(l.index),o(h)&&(e.splice(c,1),c--),o(l)){s.splice(a,1),a--;break}}}i(s),i(e);function i(a){for(let l=0;lp0;return l.direction.angleTo(c.direction)>m0||h}function a(l,c){const h=l.origin.distanceTo(c.origin),u=l.direction.angleTo(c.direction);return h/p0+u/m0}}}const Hu=new P,Vu=new P,Al=new zi;function YS(s,e,t){const n=s.attributes,i=s.index,r=n.position,o=new Map,a=new Map,l=Array.from(e),c=new ZS;for(let h=0,u=l.length;hy&&([v,y]=[y,v]),Al.direction.dot(b.direction)<0?m.reverse.push({start:v,end:y,index:d}):m.forward.push({start:v,end:y,index:d})}return a.forEach(({forward:h,reverse:u},d)=>{qS(h,u,o,t),h.length===0&&u.length===0&&a.delete(d)}),{disjointConnectivityMap:o,fragmentMap:a}}const KS=new ce,Gu=new P,$S=new tt,Wu=["","",""];class JS{constructor(e=null){this.data=null,this.disjointConnections=null,this.unmatchedDisjointEdges=null,this.unmatchedEdges=-1,this.matchedEdges=-1,this.useDrawRange=!0,this.useAllAttributes=!1,this.matchDisjointEdges=!1,this.degenerateEpsilon=1e-8,e&&this.updateFrom(e)}getSiblingTriangleIndex(e,t){const n=this.data[e*3+t];return n===-1?-1:~~(n/3)}getSiblingEdgeIndex(e,t){const n=this.data[e*3+t];return n===-1?-1:n%3}getDisjointSiblingTriangleIndices(e,t){const n=e*3+t,i=this.disjointConnections.get(n);return i?i.map(r=>~~(r/3)):[]}getDisjointSiblingEdgeIndices(e,t){const n=e*3+t,i=this.disjointConnections.get(n);return i?i.map(r=>r%3):[]}isFullyConnected(){return this.unmatchedEdges===0}updateFrom(e){const{useAllAttributes:t,useDrawRange:n,matchDisjointEdges:i,degenerateEpsilon:r}=this,o=t?v:b,a=new Map,{attributes:l}=e,c=t?Object.keys(l):null,h=e.index,u=l.position;let d=zu(e);const f=d;let p=0;n&&(p=e.drawRange.start,e.drawRange.count!==1/0&&(d=~~(e.drawRange.count/3)));let g=this.data;(!g||g.length<3*f)&&(g=new Int32Array(3*f)),g.fill(-1);let x=0,m=new Set;for(let y=p,M=d*3+p;y{E.forEach(({index:R})=>m.add(R)),A.forEach(({index:R})=>m.add(R))}),this.unmatchedDisjointEdges=y,this.disjointConnections=M,x=d*3-m.size}this.matchedEdges=x,this.unmatchedEdges=m.size,this.data=g;function b(y){return Gu.fromBufferAttribute(u,y),h0(Gu)}function v(y){let M="";for(let E=0,A=c.length;E=this._pool.length&&this._pool.push(new yt),this._pool[this._index++]}clear(){this._index=0}reset(){this._pool.length=0,this._index=0}}class nE{constructor(){this.trianglePool=new tE,this.triangles=[],this.normal=new P,this.coplanarTriangleUsed=!1}initialize(e){this.reset();const{triangles:t,trianglePool:n,normal:i}=this;if(Array.isArray(e))for(let r=0,o=e.length;rju)throw new Error("Triangle Splitter: Cannot initialize with triangles that have different normals.");const l=n.getTriangle();l.copy(a),t.push(l)}else{e.getNormal(i);const r=n.getTriangle();r.copy(e),t.push(r)}}splitByTriangle(e){const{normal:t,triangles:n}=this;if(e.getNormal(qu).normalize(),Math.abs(1-Math.abs(qu.dot(t)))0?p.push(m):g.push(m),Math.abs(v)zo)if(d!==-1){d=(d+1)%3;let m=0;m===d&&(m=(m+1)%3);let b=m+1;b===d&&(b=(b+1)%3);const v=i.getTriangle();v.a.copy(x[b]),v.b.copy(Ut.end),v.c.copy(Ut.start),Ji(v)||n.push(v),a.a.copy(x[m]),a.b.copy(Ut.start),a.c.copy(Ut.end),Ji(a)&&(n.splice(r,1),r--,o--)}else{const m=p.length>=2?g[0]:p[0];if(m===0){let E=Ut.start;Ut.start=Ut.end,Ut.end=E}const b=(m+1)%3,v=(m+2)%3,y=i.getTriangle(),M=i.getTriangle();x[b].distanceToSquared(Ut.start)t.length&&(this.expand(),t=this.array);for(let i=0,r=e.length;i=t.length;){const i={};t.push(i);for(const r in n){const o=n[r],a=new b0(o.type);a.itemSize=o.itemSize,a.normalized=o.normalized,i[r]=a}}return t[e]}getGroupAttrArray(e,t=0){const{groupAttributes:n}=this;if(!n[0][e])throw new Error(`TypedAttributeData: Attribute with "${e}" has not been initialized`);return this.getGroupAttrSet(t)[e]}initializeArray(e,t,n,i){const{groupAttributes:r}=this,o=r[0][e];if(o){if(o.type!==t)for(let a=0,l=r.length;a{for(const n in t)t[n].clear()})}delete(e){this.groupAttributes.forEach(t=>{delete t[e]})}reset(){this.groupAttributes=[],this.groupCount=0}}class y0{constructor(){this.intersectionSet={},this.ids=[]}add(e,t){const{intersectionSet:n,ids:i}=this;n[e]||(n[e]=[],i.push(e)),n[e].push(t)}}const rE=0,oE=1,aE=2,_0=3,lE=4,M0=5,w0=6,Hn=new zi,S0=new ze,un=new yt,Bi=new P,E0=new tt,T0=new tt,A0=new tt,Yu=new tt,Rl=new tt,Ll=new tt,C0=new Bn,Ku=new P,$u=1e-8,cE=1e-15,Ts=-1,As=1,Dl=-2,Il=2,Ho=0,Cs=1,Ju=2,hE=1e-14;let Bl=null;function P0(s){Bl=s}function R0(s,e){s.getMidpoint(Hn.origin),s.getNormal(Hn.direction);const t=e.raycastFirst(Hn,Et);return t&&Hn.direction.dot(t.face.normal)>0?Ts:As}function uE(s,e){function t(){return Math.random()-.5}s.getNormal(Ku),Hn.direction.copy(Ku),s.getMidpoint(Hn.origin);const n=3;let i=0,r=1/0;for(let o=0;o0&&i++,a!==null&&(r=Math.min(r,a.distance)),r<=cE)return a.face.normal.dot(Ku)>0?Il:Dl;if(i/n>.5||(o-i+1)/n>.5)break}return i/n>.5?Ts:As}function dE(s,e){const t=new y0,n=new y0;return S0.copy(s.matrixWorld).invert().multiply(e.matrixWorld),s.geometry.boundsTree.bvhcast(e.geometry.boundsTree,S0,{intersectsTriangles(i,r,o,a){if(!Ji(i)&&!Ji(r)){let l=i.intersectsTriangle(r,C0,!0);if(!l){const c=i.plane,h=r.plane,u=c.normal,d=h.normal;u.dot(d)===1&&Math.abs(c.constant-h.constant){r.push(c.x),i>1&&r.push(c.y),i>2&&r.push(c.z),i>3&&r.push(c.w)};Yu.set(0,0,0,0).addScaledVector(s,n.a.x).addScaledVector(e,n.a.y).addScaledVector(t,n.a.z),Rl.set(0,0,0,0).addScaledVector(s,n.b.x).addScaledVector(e,n.b.y).addScaledVector(t,n.b.z),Ll.set(0,0,0,0).addScaledVector(s,n.c.x).addScaledVector(e,n.c.y).addScaledVector(t,n.c.z),a&&(Yu.normalize(),Rl.normalize(),Ll.normalize()),l(Yu),o?(l(Ll),l(Rl)):(l(Rl),l(Ll))}function ed(s,e,t,n,i,r=!1){for(const o in i){const a=e[o],l=i[o];if(!(o in e))throw new Error(`CSG Operations: Attribute ${o} no available on geometry.`);const c=a.itemSize;o==="position"?(Bi.fromBufferAttribute(a,s).applyMatrix4(t),l.push(Bi.x,Bi.y,Bi.z)):o==="normal"?(Bi.fromBufferAttribute(a,s).applyNormalMatrix(n),r&&Bi.multiplyScalar(-1),l.push(Bi.x,Bi.y,Bi.z)):(l.push(a.getX(s)),c>1&&l.push(a.getY(s)),c>2&&l.push(a.getZ(s)),c>3&&l.push(a.getW(s)))}}class mE{constructor(e){this.triangle=new yt().copy(e),this.intersects={}}addTriangle(e,t){this.intersects[e]=new yt().copy(t)}getIntersectArray(){const e=[],{intersects:t}=this;for(const n in t)e.push(t[n]);return e}}class D0{constructor(){this.data={}}addTriangleIntersection(e,t,n,i){const{data:r}=this;r[e]||(r[e]=new mE(t)),r[e].addTriangle(n,i)}getTrianglesAsArray(e=null){const{data:t}=this,n=[];if(e!==null)e in t&&n.push(t[e].triangle);else for(const i in t)n.push(t[i].triangle);return n}getTriangleIndices(){return Object.keys(this.data).map(e=>parseInt(e))}getIntersectionIndices(e){const{data:t}=this;return t[e]?Object.keys(t[e].intersects).map(n=>parseInt(n)):[]}getIntersectionsAsArray(e=null,t=null){const{data:n}=this,i=new Set,r=[],o=a=>{if(n[a])if(t!==null)n[a].intersects[t]&&r.push(n[a].intersects[t]);else{const l=n[a].intersects;for(const c in l)i.has(c)||(i.add(c),r.push(l[c]))}};if(e!==null)o(e);else for(const a in n)o(a);return r}reset(){this.data={}}}class gE{constructor(){this.enabled=!1,this.triangleIntersectsA=new D0,this.triangleIntersectsB=new D0,this.intersectionEdges=[]}addIntersectingTriangles(e,t,n,i){const{triangleIntersectsA:r,triangleIntersectsB:o}=this;r.addTriangleIntersection(e,t,n,i),o.addTriangleIntersection(n,i,e,t)}addEdge(e){this.intersectionEdges.push(e.clone())}reset(){this.triangleIntersectsA.reset(),this.triangleIntersectsB.reset(),this.intersectionEdges=[]}init(){this.enabled&&(this.reset(),P0(this))}complete(){this.enabled&&P0(null)}}const Qi=new ze,Nl=new Ke,Ps=new yt,kl=new yt,es=new yt,Ul=new yt,ei=[],Rs=[];function xE(s){for(const e of s)return e}function vE(s,e,t,n,i,r={}){const{useGroups:o=!0}=r,{aIntersections:a,bIntersections:l}=dE(s,e),c=[];let h=null,u;return u=o?0:-1,I0(s,e,a,t,!1,n,i,u),B0(s,e,a,t,!1,i,u),t.findIndex(d=>d!==w0&&d!==M0)!==-1&&(u=o?s.geometry.groups.length||1:-1,I0(e,s,l,t,!0,n,i,u),B0(e,s,l,t,!0,i,u)),ei.length=0,Rs.length=0,{groups:c,materials:h}}function I0(s,e,t,n,i,r,o,a=0){const l=s.matrixWorld.determinant()<0;Qi.copy(e.matrixWorld).invert().multiply(s.matrixWorld),Nl.getNormalMatrix(s.matrixWorld).multiplyScalar(l?-1:1);const c=s.geometry.groupIndices,h=s.geometry.index,u=s.geometry.attributes.position,d=e.geometry.boundsTree,f=e.geometry.index,p=e.geometry.attributes.position,g=t.ids,x=t.intersectionSet;for(let m=0,b=g.length;m0;){const m=xE(g);g.delete(m),f.push(m);const b=3*m,v=h.getX(b+0),y=h.getX(b+1),M=h.getX(b+2);es.a.fromBufferAttribute(d,v).applyMatrix4(Qi),es.b.fromBufferAttribute(d,y).applyMatrix4(Qi),es.c.fromBufferAttribute(d,M).applyMatrix4(Qi);const E=R0(es,l);Rs.length=0,ei.length=0;for(let A=0,R=n.length;A0;){const A=f.pop();for(let R=0;R<3;R++){const _=p.getSiblingTriangleIndex(A,R);_!==-1&&g.has(_)&&(f.push(_),g.delete(_))}if(ei.length!==0){const R=3*A,_=h.getX(R+0),S=h.getX(R+1),D=h.getX(R+2),C=o===-1?0:c[A]+o;if(es.a.fromBufferAttribute(d,_),es.b.fromBufferAttribute(d,S),es.c.fromBufferAttribute(d,D),!Ji(es))for(let B=0,w=ei.length;B{t[n.materialIndex]=e})),t}class ME{constructor(){this.triangleSplitter=new nE,this.attributeData=[],this.attributes=["position","uv","normal"],this.useGroups=!0,this.consolidateGroups=!0,this.debug=new gE}getGroupRanges(e){return!this.useGroups||e.groups.length===0?[{start:0,count:1/0,materialIndex:0}]:e.groups.map(t=>({...t}))}evaluate(e,t,n,i=new Cl){let r=!0;if(Array.isArray(n)||(n=[n]),Array.isArray(i)||(i=[i],r=!1),i.length!==n.length)throw new Error("Evaluator: operations and target array passed as different sizes.");e.prepareGeometry(),t.prepareGeometry();const{triangleSplitter:o,attributeData:a,attributes:l,useGroups:c,consolidateGroups:h,debug:u}=this;for(;a.length{yE(e.geometry,m.geometry,a[b],l)}),u.init(),vE(e,t,n,o,a,{useGroups:c}),u.complete();const d=this.getGroupRanges(e.geometry),f=N0(d,e.material),p=this.getGroupRanges(t.geometry),g=N0(p,t.material);p.forEach(m=>m.materialIndex+=f.length);let x=[...d,...p].map((m,b)=>({...m,index:b}));if(c){const m=[...f,...g];h&&(x=x.map(v=>{const y=m[v.materialIndex];return v.materialIndex=m.indexOf(y),v}).sort((v,y)=>v.materialIndex-y.materialIndex));const b=[];for(let v=0,y=m.length;v{v.material=b})}else x=[{start:0,count:1/0,index:0,materialIndex:0}],i.forEach(m=>{m.material=f[0]});return i.forEach((m,b)=>{const v=m.geometry;_E(v,a[b],x),h&&bE(v.groups)}),r?i:i[0]}evaluateHierarchy(e,t=new Cl){e.updateMatrixWorld(!0);const n=(r,o)=>{const a=r.children;for(let l=0,c=a.length;l{const o=r.children;let a=!1;for(let c=0,h=o.length;c{c?c=this.evaluate(c,h,h.operation):c=this.evaluate(r,h,h.operation)}),r._cachedGeometry=c.geometry,r._cachedMaterials=c.material,!0}else return a||l};return i(e),t.geometry=e._cachedGeometry,t.material=e._cachedMaterials,t}reset(){this.triangleSplitter.reset()}}class k0{engine;planeObjects=[];planes=[];isActive=!1;evaluator;geometryCache=new Map;sectionMeshes=new Map;planeGroup;planeSize=1e3;sourceMeshes=new Map;planeThickness=.01;updateThrottleTime=100;lastUpdateTime=0;pendingUpdate=!1;updateTimer=null;cacheExpireTime=3e4;planeStates=new Map;constructor(e,t={}){this.engine=e,this.evaluator=new ME,this.planeGroup=new xn,this.planeGroup.name="CSG_ClippingPlanes_Optimized",t.updateThrottleTime!==void 0&&(this.updateThrottleTime=t.updateThrottleTime),t.cacheExpireTime!==void 0&&(this.cacheExpireTime=t.cacheExpireTime),t.planeThickness!==void 0&&(this.planeThickness=t.planeThickness),this.evaluator.attributes=["position","normal"],this.evaluator.useGroups=!1}init(){this.calculateSceneSize(),this.engine.scene.add(this.planeGroup),this.planes.forEach((e,t)=>{const n=this.createEmptySectionMesh(e,t);this.planeGroup.add(n),this.sectionMeshes.set(`plane_${t}`,n),this.planeObjects.push(n),this.planeStates.set(t,{constant:e.constant,normal:e.normal.clone()})})}createEmptySectionMesh(e,t){const n=new ht,i=new cs({color:new Ue(33023),metalness:.1,roughness:.75,side:Et,depthWrite:!0,depthTest:!0,clippingPlanes:this.planes.filter((o,a)=>a!==t)}),r=new ut(n,i);return r.name=`CSG_Section_Optimized_${t}`,r.visible=!1,r.renderOrder=t+1,r}active(){this.isActive=!0,this.requestUpdate(),this.planeObjects.forEach(e=>{e.visible=!0})}disActive(){this.isActive=!1,this.planeObjects.forEach(e=>{e.visible=!1}),this.updateTimer&&(clearTimeout(this.updateTimer),this.updateTimer=null)}setSourceMeshes(e){this.sourceMeshes.clear(),e.forEach(t=>{const n=t.uuid;this.sourceMeshes.set(n,t)}),this.isActive&&this.requestUpdate()}addSourceMesh(e){const t=e.uuid;this.sourceMeshes.has(t)||(this.sourceMeshes.set(t,e),this.isActive&&this.requestUpdate())}removeSourceMesh(e){const t=e.uuid;this.sourceMeshes.delete(t)&&(this.clearMeshCache(t),this.isActive&&this.requestUpdate())}requestUpdate(){if(!this.isActive)return;const e=Date.now(),t=e-this.lastUpdateTime;t>=this.updateThrottleTime?(this.lastUpdateTime=e,this.pendingUpdate=!1):(this.pendingUpdate=!0,this.updateTimer&&clearTimeout(this.updateTimer),this.updateTimer=setTimeout(()=>{this.pendingUpdate&&this.isActive&&(this.lastUpdateTime=Date.now(),this.pendingUpdate=!1),this.updateTimer=null},this.updateThrottleTime-t))}updateAllSections(){this.isActive&&(this.planes.forEach((e,t)=>{if(Math.abs(e.constant)<99999)this.hasPlaneChanged(t,e)&&(this.updateSection(e,t),this.updatePlaneState(t,e));else{const n=this.sectionMeshes.get(`plane_${t}`);n&&(n.visible=!1)}}),this.cleanExpiredCache())}hasPlaneChanged(e,t){const n=this.planeStates.get(e);if(!n)return!0;const i=Math.abs(n.constant-t.constant)>1e-4,r=!n.normal.equals(t.normal);return i||r}updatePlaneState(e,t){this.planeStates.set(e,{constant:t.constant,normal:t.normal.clone()})}getPlaneHash(e){const t=e.normal,n=e.constant;return`${t.x.toFixed(4)}_${t.y.toFixed(4)}_${t.z.toFixed(4)}_${n.toFixed(4)}`}getCacheKey(e,t){return`${e}_plane_${t}`}updateSection(e,t){const n=this.sectionMeshes.get(`plane_${t}`);if(!n)return;const i=this.getPlaneHash(e),r=[];if(this.sourceMeshes.forEach((o,a)=>{const l=this.getCacheKey(a,t),c=this.geometryCache.get(l);if(c&&c.planeHash===i)r.push(c.geometry.clone()),c.timestamp=Date.now();else try{const h=this.createPlaneBrush(e),u=new Cl(o.geometry);o.updateMatrixWorld(!0),u.matrix.copy(o.matrixWorld),u.updateMatrixWorld();const d=this.evaluator.evaluate(h,u,_0);d&&d.geometry.attributes.position.count>0?(r.push(d.geometry),this.geometryCache.set(l,{geometry:d.geometry.clone(),planeHash:i,timestamp:Date.now()})):this.geometryCache.delete(l)}catch(h){console.warn(`CSG intersection failed for mesh ${a}:`,h)}}),r.length>0){const o=this.mergeGeometries(r);n.geometry&&n.geometry.dispose(),n.geometry=o,n.visible=!0,n.position.set(0,0,0),n.rotation.set(0,0,0),n.scale.set(1,1,1),n.updateMatrixWorld()}else n.visible=!1;r.forEach(o=>o.dispose())}clearMeshCache(e){const t=[];this.geometryCache.forEach((n,i)=>{i.startsWith(e)&&(n.geometry.dispose(),t.push(i))}),t.forEach(n=>this.geometryCache.delete(n))}cleanExpiredCache(){const e=Date.now(),t=[];this.geometryCache.forEach((n,i)=>{e-n.timestamp>this.cacheExpireTime&&(n.geometry.dispose(),t.push(i))}),t.forEach(n=>this.geometryCache.delete(n))}clearAllCache(){this.geometryCache.forEach(e=>{e.geometry.dispose()}),this.geometryCache.clear()}createPlaneBrush(e){const t=new Gi(this.planeSize,this.planeThickness,this.planeSize);t.translate(0,e.constant,0),t.applyQuaternion(new Dn().setFromUnitVectors(new P(0,-1,0),e.normal));const n=new ut(t),i=new Cl(t);return i.matrix.copy(n.matrixWorld),i.updateMatrixWorld(),i}mergeGeometries(e){if(e.length===1)return e[0].clone();const t=new ht,n=[],i=[],r=[];let o=0;return e.forEach(a=>{const l=a.attributes.position,c=a.attributes.normal;for(let h=0;h0?t.setAttribute("normal",new nn(i,3)):t.computeVertexNormals(),r.length>0&&t.setIndex(r),t}calculateSceneSize(){const e=new xt;if(this.engine.scene.traverse(t=>{if(t.isMesh&&t.geometry){const n=new xt().setFromObject(t);e.union(n)}}),e.isEmpty())this.planeSize=1e3;else{const t=e.getSize(new P),n=Math.max(t.x,t.y,t.z);this.planeSize=n*3}}update(){this.isActive&&this.pendingUpdate&&!this.updateTimer&&this.requestUpdate()}dispose(){this.updateTimer&&(clearTimeout(this.updateTimer),this.updateTimer=null),this.clearAllCache(),this.planeObjects.forEach(e=>{e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(t=>t.dispose()):e.material.dispose())}),this.sectionMeshes.clear(),this.planeObjects=[],this.sourceMeshes.clear(),this.planeGroup.parent&&this.planeGroup.parent.remove(this.planeGroup)}setSectionColor(e){this.planeObjects.forEach(t=>{t.material instanceof cs&&t.material.color.set(e)})}getCacheStats(){return{cacheSize:this.geometryCache.size,sourceMeshCount:this.sourceMeshes.size,sectionMeshCount:this.sectionMeshes.size}}setPlaneThickness(e){if(e<=0){console.warn("Plane thickness must be positive");return}this.planeThickness=e,this.clearAllCache(),this.isActive&&this.requestUpdate()}getPlaneThickness(){return this.planeThickness}showSections(){this.sectionMeshes.forEach(e=>{e.geometry?.attributes.position?.count&&e.geometry.attributes.position.count>0&&(e.visible=!0)})}hideSections(){this.sectionMeshes.forEach(e=>{e.visible=!1})}showSection(){this.planeGroup.visible=!0}hideSection(){this.planeGroup.visible=!1}toggleSectionsVisibility(){let e=!1;return this.sectionMeshes.forEach(t=>{t.visible&&(e=!0)}),e?(this.hideSections(),!1):(this.showSections(),!0)}toggleSectionVisibility(e){const t=this.sectionMeshes.get(`plane_${e}`);return t?(t.visible=!t.visible,t.visible):!1}}class wE{engine;isActive=!1;isDrag=!1;meshs=[];box;pickPoint;pickNormal;pickMesh;box_;plane;csgClipping=null;useCsgClipping=!0;constructor(e,t){this.engine=e,this.meshs=[],this.box=null,t?.useCsgClipping!==void 0&&(this.useCsgClipping=t.useCsgClipping),this.useCsgClipping&&this.initCsgClipping()}initCsgClipping(){this.csgClipping=new k0(this.engine,{updateThrottleTime:150,cacheExpireTime:45e3}),this.csgClipping.planes=this.engine.sectionPlane,this.csgClipping.init()}active(){this.isActive||(this.isActive=!0,this.init(),this.meshs.forEach(e=>{e.visible=!0}),this.engine.handelBehaved.init(this),this.engine.handelBehaved.active(),this.csgClipping&&this.csgClipping.active(),this.engine.models.forEach(e=>{e.nodesMap.forEach(t=>{t.infos.forEach(n=>{this.csgClipping?.addSourceMesh(n.mesh)})})}))}disActive(){this.isActive=!1,this.engine.handelBehaved.disActive(),this.csgClipping&&this.csgClipping.disActive();const e=this.engine.sectionPlane.find(t=>t.name=="顶");e&&(e.constant=1e5),this.meshs.forEach(t=>{t.visible=!1})}init(){let e=this.engine.octreeBox.getBoundingBox();this.box=e,this.updata_face(e)}updata_face(e){let t=this,n=t.engine.scene.children.find(o=>o.type=="Group"&&o.name=="ClippingBox");n==null&&(n=new xn,n.name="ClippingBox",t.engine.scene.add(n));let i=[new P(e.min.x,e.max.y,e.min.z),new P(e.max.x,e.max.y,e.min.z),new P(e.max.x,e.max.y,e.max.z),new P(e.min.x,e.max.y,e.max.z)];r(i,new P(0,1,0),"顶");function r(o,a,l){const c=new ht,h=new Float32Array([o[0].x,o[0].y,o[0].z,o[1].x,o[1].y,o[1].z,o[2].x,o[2].y,o[2].z,o[3].x,o[3].y,o[3].z]),u=[0,1,2,0,2,3];c.setAttribute("position",new at(h,3)),c.setIndex(u);let d=t.meshs.find(m=>m.name==l);if(d==null){const m=new Xt({color:65280,transparent:!0,opacity:.02,side:Et}),b=new ut(c,m);b.normal=a,b.name=l,n.add(b),t.meshs.push(b)}else d.geometry=c;const f=new Float32Array([o[0].x,o[0].y,o[0].z,o[1].x,o[1].y,o[1].z,o[2].x,o[2].y,o[2].z,o[3].x,o[3].y,o[3].z,o[0].x,o[0].y,o[0].z]);let p=new as({color:255}),g=new ht;g.setAttribute("position",new at(f,3));let x=t.meshs.find(m=>m.name==l+"Line");x==null&&(x=new Xi(g,p),x.name=l+"Line",n.add(x),t.meshs.push(x)),x.geometry=g,x.material=p,t.engine.sectionPlane.find(m=>m.name==l).setFromNormalAndCoplanarPoint(a.clone().setLength(-1),e.max),t.engine.scene.children.filter(m=>m.type=="Mesh"&&m.url).forEach(m=>{m.material&&Array.isArray(m.material)?m.material.forEach(b=>{b.clippingPlanes=t.engine.sectionPlane}):m.material.clippingPlanes=t.engine.sectionPlane})}}handleMouseDown(e){this.csgClipping?.hideSection(),this.isDrag=!0;const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0)if(this.pickPoint=t[0].point,this.pickNormal=t[0].face.normal,this.engine.controls.enabled=!1,this.pickMesh=t[0].object,this.box_={min:this.box.min.clone(),max:this.box.max.clone()},this.pickNormal.y==0){const n=new _t;n.setFromNormalAndCoplanarPoint(new P(0,1,0),this.pickPoint),this.plane=n}else{let n=new P(this.engine.camera.position.x,this.pickPoint.y,this.engine.camera.position.z);const i=new _t;i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1),this.pickPoint),this.plane=i}}handleMouseUp(e){this.isDrag=!1,this.pickPoint=null,this.pickNormal=null,this.pickMesh=null,this.engine.controls.enabled=!0,this.csgClipping&&this.isActive&&(this.csgClipping.updateAllSections(),this.csgClipping?.showSection())}handleMouseMove(e){this.meshs.forEach(n=>{n.material.opacity=0});const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0&&(t[0].object.material.opacity=.05),this.pickPoint!=null){const n=new P;if(e.raycaster.ray.intersectPlane(this.plane,n)){let i=n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());this.pickMesh.name=="前"||this.pickMesh.name=="左"||this.pickMesh.name=="底"?this.box.min=this.box_.min.clone().add(this.pickNormal.clone().setLength(i)):this.box.max=this.box_.max.clone().add(this.pickNormal.clone().setLength(i)),this.updata_face(this.box)}}}update(){this.csgClipping&&this.csgClipping.update()}enableCsgClipping(){this.csgClipping||this.initCsgClipping(),this.useCsgClipping=!0,this.isActive&&this.csgClipping&&(this.engine.clipping?.clippingStencil&&this.engine.clipping.clippingStencil.disActive(),this.csgClipping.active())}enableStencilClipping(){this.useCsgClipping=!1,this.isActive&&(this.csgClipping&&this.csgClipping.disActive(),this.engine.clipping?.clippingStencil&&this.engine.clipping.clippingStencil.active())}setCsgColor(e){this.csgClipping&&this.csgClipping.setSectionColor(e)}getCsgStats(){return this.csgClipping?.getCacheStats()}clearCsgCache(){this.csgClipping?.clearAllCache()}dispose(){this.disActive(),this.csgClipping&&(this.csgClipping.dispose(),this.csgClipping=null)}}class SE{engine;isActive=!1;isDrag=!1;meshs=[];box;pickPoint;pickNormal;pickMesh;box_;plane;constructor(e){this.engine=e,this.meshs=[],this.box=null}active(){this.isActive!=!0&&(this.isActive=!0,this.init(),this.meshs.forEach(e=>{e.visible=!0}),this.engine.handelBehaved.init(this),this.engine.handelBehaved.active())}disActive(){this.isActive=!1,this.engine.handelBehaved.disActive();const e=this.engine.sectionPlane.find(t=>t.name=="左");e&&(e.constant=1e5),this.meshs.forEach(t=>{t.visible=!1})}init(){let e=this.engine.octreeBox.getBoundingBox();this.box=e,this.updata_face(e)}updata_face(e){let t=this,n=t.engine.scene.children.find(o=>o.type=="Group"&&o.name=="ClippingBox");n==null&&(n=new xn,n.name="ClippingBox",t.engine.scene.add(n));let i=[new P(e.min.x,e.min.y,e.max.z),new P(e.min.x,e.min.y,e.min.z),new P(e.min.x,e.max.y,e.min.z),new P(e.min.x,e.max.y,e.max.z)];r(i,new P(-1,0,0),"左");function r(o,a,l){const c=new ht,h=new Float32Array([o[0].x,o[0].y,o[0].z,o[1].x,o[1].y,o[1].z,o[2].x,o[2].y,o[2].z,o[3].x,o[3].y,o[3].z]),u=[0,1,2,0,2,3];c.setAttribute("position",new at(h,3)),c.setIndex(u);let d=t.meshs.find(m=>m.name==l);if(d==null){const m=new Xt({color:65280,transparent:!0,opacity:.02,side:Et}),b=new ut(c,m);b.normal=a,b.name=l,n.add(b),t.meshs.push(b)}else d.geometry=c;const f=new Float32Array([o[0].x,o[0].y,o[0].z,o[1].x,o[1].y,o[1].z,o[2].x,o[2].y,o[2].z,o[3].x,o[3].y,o[3].z,o[0].x,o[0].y,o[0].z]);let p=new as({color:255}),g=new ht;g.setAttribute("position",new at(f,3));let x=t.meshs.find(m=>m.name==l+"Line");x==null&&(x=new Xi(g,p),x.name=l+"Line",n.add(x),t.meshs.push(x)),x.geometry=g,x.material=p,t.engine.sectionPlane.find(m=>m.name==l).setFromNormalAndCoplanarPoint(a.clone().setLength(-1),e.min),t.engine.scene.children.filter(m=>m.type=="Mesh"&&m.url).forEach(m=>{m.material&&Array.isArray(m.material)?m.material.forEach(b=>{b.clippingPlanes=t.engine.sectionPlane}):m.material.clippingPlanes=t.engine.sectionPlane})}}handleMouseDown(e){this.isDrag=!0;const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0)if(this.pickPoint=t[0].point,this.pickNormal=t[0].face.normal,this.engine.controls.enabled=!1,this.pickMesh=t[0].object,this.box_={min:this.box.min.clone(),max:this.box.max.clone()},this.pickNormal.y==0){const n=new _t;n.setFromNormalAndCoplanarPoint(new P(0,1,0),this.pickPoint),this.plane=n}else{let n=new P(this.engine.camera.position.x,this.pickPoint.y,this.engine.camera.position.z);const i=new _t;i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1),this.pickPoint),this.plane=i}}handleMouseUp(e){this.isDrag=!1,this.pickPoint=null,this.pickNormal=null,this.pickMesh=null,this.engine.controls.enabled=!0}handleMouseMove(e){this.meshs.forEach(n=>{n.material.opacity=0});const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0&&(t[0].object.material.opacity=.05),this.pickPoint!=null){const n=new P;if(e.raycaster.ray.intersectPlane(this.plane,n)){let i=n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());this.pickMesh.name=="前"||this.pickMesh.name=="左"||this.pickMesh.name=="底"?this.box.min=this.box_.min.clone().add(this.pickNormal.clone().setLength(i)):this.box.max=this.box_.max.clone().add(this.pickNormal.clone().setLength(i)),this.updata_face(this.box)}}}}class EE{engine;isActive=!1;box;pickPoint;pickNormal;pickMesh;box_;plane;meshs;isDrag=!1;csgClipping=null;useCsgClipping=!0;constructor(e,t){this.engine=e,this.meshs=[],t?.useCsgClipping!==void 0&&(this.useCsgClipping=t.useCsgClipping),this.useCsgClipping&&this.initCsgClipping()}initCsgClipping(){this.csgClipping=new k0(this.engine,{updateThrottleTime:150,cacheExpireTime:45e3}),this.csgClipping.planes=this.engine.sectionPlane,this.csgClipping.init()}active(){console.log("调用这里了"),!this.isActive&&(this.isActive=!0,this.init(),this.meshs.forEach(e=>{e.visible=!0}),this.engine.handelBehaved.init(this),this.engine.handelBehaved.active(),this.csgClipping&&this.csgClipping.active(),this.engine.models.forEach(e=>{e.nodesMap.forEach(t=>{t.infos.forEach(n=>{this.csgClipping?.addSourceMesh(n.mesh)})})}))}disActive(){this.isActive=!1,this.engine.handelBehaved.disActive(),this.csgClipping&&this.csgClipping.disActive(),this.engine.sectionPlane.forEach(e=>{e.constant=1e5}),this.meshs.forEach(e=>{e.visible=!1})}init(){let e=this.engine.octreeBox.getBoundingBox();this.box=e,this.updata_face(e)}getboxXyz(){return{minX:this.box.min.x,minY:this.box.min.y,minZ:this.box.min.z,maxX:this.box.max.x,maxY:this.box.max.y,maxZ:this.box.max.z}}setboxXyz(e){this.box.min.x=e.minX,this.box.min.y=e.minY,this.box.min.z=e.minZ,this.box.max.x=e.maxX,this.box.max.y=e.maxY,this.box.max.z=e.maxZ,this.updata_face(this.box)}setBox(e){this.box=e,this.updata_face(e)}reverseBox(){}setboxPercent(e){console.log("[SectionBox] setboxPercent called with:",e)}handleMouseDown(e){this.isDrag=!0;const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0)if(this.pickPoint=t[0].point,this.pickNormal=t[0].face.normal,this.engine.controls.enabled=!1,this.pickMesh=t[0].object,this.box_={min:this.box.min.clone(),max:this.box.max.clone()},this.pickNormal.y==0){const n=new _t;n.setFromNormalAndCoplanarPoint(new P(0,1,0),this.pickPoint),this.plane=n}else{let n=new P(this.engine.camera.position.x,this.pickPoint.y,this.engine.camera.position.z);const i=new _t;i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1),this.pickPoint),this.plane=i}}handleMouseUp(e){this.isDrag=!1,this.pickPoint=null,this.pickNormal=null,this.pickMesh=null,this.engine.controls.enabled=!0,this.csgClipping&&this.isActive&&(this.csgClipping.updateAllSections(),this.csgClipping?.showSection())}handleMouseMove(e){this.meshs.forEach(n=>{n.material.opacity=0});const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0&&(t[0].object.material.opacity=.05),this.pickPoint!=null){const n=new P;if(e.raycaster.ray.intersectPlane(this.plane,n)){let i=n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());this.pickMesh.name=="前"||this.pickMesh.name=="左"||this.pickMesh.name=="底"?this.box.min=this.box_.min.clone().add(this.pickNormal.clone().setLength(i)):this.box.max=this.box_.max.clone().add(this.pickNormal.clone().setLength(i)),this.updata_face(this.box)}}}updata_face(e){let t=this,n=[new P(e.min.x,e.min.y,e.min.z),new P(e.max.x,e.min.y,e.min.z),new P(e.max.x,e.max.y,e.min.z),new P(e.min.x,e.max.y,e.min.z)],i=[new P(e.min.x,e.min.y,e.max.z),new P(e.max.x,e.min.y,e.max.z),new P(e.max.x,e.max.y,e.max.z),new P(e.min.x,e.max.y,e.max.z)],r=[new P(e.max.x,e.min.y,e.max.z),new P(e.max.x,e.min.y,e.min.z),new P(e.max.x,e.max.y,e.min.z),new P(e.max.x,e.max.y,e.max.z)],o=[new P(e.min.x,e.min.y,e.min.z),new P(e.min.x,e.min.y,e.max.z),new P(e.min.x,e.max.y,e.max.z),new P(e.min.x,e.max.y,e.min.z)],a=[new P(e.min.x,e.max.y,e.min.z),new P(e.max.x,e.max.y,e.min.z),new P(e.max.x,e.max.y,e.max.z),new P(e.min.x,e.max.y,e.max.z)],l=[new P(e.min.x,e.min.y,e.min.z),new P(e.max.x,e.min.y,e.min.z),new P(e.max.x,e.min.y,e.max.z),new P(e.min.x,e.min.y,e.max.z)];c(n,new P(0,0,-1),"前"),c(i,new P(0,0,1),"后"),c(r,new P(1,0,0),"右"),c(o,new P(-1,0,0),"左"),c(a,new P(0,1,0),"顶"),c(l,new P(0,-1,0),"底");function c(h,u,d){const f=new ht,p=new Float32Array([h[0].x,h[0].y,h[0].z,h[1].x,h[1].y,h[1].z,h[2].x,h[2].y,h[2].z,h[3].x,h[3].y,h[3].z]),g=[0,1,2,0,2,3];f.setAttribute("position",new at(p,3)),f.setIndex(g);let x=t.engine.scene.children.find(E=>E.type=="Group"&&E.name=="ClippingBox");x==null&&(x=new xn,x.name="ClippingBox",t.engine.scene.add(x));let m=t.meshs.find(E=>E.name==d);if(m==null){const E=new Xt({color:65280,transparent:!0,opacity:0,side:Et}),A=new ut(f,E);A.normal=u,A.name=d,x.add(A),t.meshs.push(A)}else m.geometry=f;const b=new Float32Array([h[0].x,h[0].y,h[0].z,h[1].x,h[1].y,h[1].z,h[2].x,h[2].y,h[2].z,h[3].x,h[3].y,h[3].z,h[0].x,h[0].y,h[0].z]);let v=new as({color:255}),y=new ht;y.setAttribute("position",new at(b,3));let M=t.meshs.find(E=>E.name==d+"Line");M==null&&(M=new Xi(y,v),M.name=d+"Line",x.add(M),t.meshs.push(M)),M.geometry=y,M.material=v,d=="前"||d=="左"||d=="底"?t.engine.sectionPlane.find(E=>E.name==d).setFromNormalAndCoplanarPoint(u.clone().setLength(-1),e.min):t.engine.sectionPlane.find(E=>E.name==d).setFromNormalAndCoplanarPoint(u.clone().setLength(-1),e.max),t.engine.scene.children.filter(E=>E.type=="Mesh"&&E.url).forEach(E=>{E.material&&Array.isArray(E.material)?E.material.forEach(A=>{A.clippingPlanes=t.engine.sectionPlane}):E.material.clippingPlanes=t.engine.sectionPlane})}}}class TE{engine;sectionPlaneX;sectionPlaneY;sectionPlaneZ;sectionBox;clippingStencil;constructor(e){this.engine=e;let t=new _t(new P(0,0,1),1e5);t.name="前";let n=new _t(new P(0,0,1),1e5);n.name="左";let i=new _t(new P(0,0,1),1e5);i.name="后";let r=new _t(new P(0,0,1),1e5);r.name="右";let o=new _t(new P(0,0,1),1e5);o.name="顶";let a=new _t(new P(0,0,1),1e5);a.name="底",this.engine.sectionPlane=[t,n,i,r,o,a]}init(){this.sectionPlaneX=new Iw(this.engine),this.sectionPlaneY=new wE(this.engine),this.sectionPlaneZ=new SE(this.engine),this.sectionBox=new EE(this.engine)}disActive(){this.sectionPlaneX.disActive(),this.sectionPlaneY.disActive(),this.sectionPlaneZ.disActive(),this.sectionBox.disActive()}}class AE{engine;constructor(e){this.engine=e}getLevelTreeData(){let e=[];return this.engine.engineStatus.models.forEach(t=>{e.push({children:t.info.modelTree.modelTreeLevel,name:t.info.baseInfo.name})}),e}getTypeTreeData(){let e=[];return this.engine.engineStatus.models.forEach(t=>{e.push({children:t.info.modelTree.modelTreeType,name:t.info.baseInfo.name})}),e}getMajorTreeData(){let e=[];return this.engine.engineStatus.models.forEach(t=>{e.push({children:t.info.modelTree.modelTreeMajor,name:t.info.baseInfo.name})}),e}}class CE{engine;constructor(e){this.engine=e}getEngineInfo(){let e=0,t=0,n=0;return!this.engine||!this.engine.scene?{totalVertices:0,totalTriangles:0,meshCount:0}:(this.engine.scene.traverse(i=>{if(i instanceof ut){const r=i.geometry;if(r&&r.attributes){const o=r.attributes.position;if(o){const a=o.count;e+=a;let l=0;r.index?l=r.index.count/3:l=a/3,t+=l,n++}}}}),{totalVertices:Math.floor(e),totalTriangles:Math.floor(t),meshCount:n})}}class PE{engine;constructor(e){this.engine=e}init(){}getModelProperties(e,t,n){let i=this.engine.engineStatus.models.find(o=>o.url===e);i.properties==null&&Cm(e+"/property",o=>{let a=JSON.parse(o);i.properties=a,setTimeout(()=>{r(a,t,n)},100)}),r(i.properties,t,n);function r(o,a,l){let c=[],h=o.models[a.toString()||""],u=h.map(d=>d[0]);u=u.filter((d,f)=>u.indexOf(d)===f),u.forEach(d=>{let f={name:o.categorys[d],children:[]};c.push(f),h.filter(p=>p[0]===d).forEach(p=>{f.children.push({name:o.names[p[1]],value:o.values[p[2]]})})}),l?.({properties:c,materials:[]})}}}class RE{engine;constructor(e){this.engine=e}getModelTypes(){let e=[];return this.engine.engineStatus.models.forEach(t=>{t.info.modelMapper.forEach(n=>{e.push(n.typeName)})}),e=e.filter((t,n,i)=>i.indexOf(t)===n),e}getModelMajors(){let e=[];return this.engine.engineStatus.models.forEach(t=>{t.info.modelMapper.forEach(n=>{e.push(n.majorName)})}),e=e.filter((t,n,i)=>i.indexOf(t)===n),e}getModelLevels(){let e=[];return this.engine.engineStatus.models.forEach(t=>{t.info.modelMapper.forEach(n=>{e.push(n.levelName)})}),e=e.filter((t,n,i)=>i.indexOf(t)===n),e}getModelMappers(e){}getModelMapper(e,t){let n=this.engine.engineStatus.models.find(i=>i.url==e);return n?n.info.modelMapper.find(i=>i.id==t):null}getModelSWithType(e,t=null){let n=[];return this.engine.engineStatus.models.forEach(i=>{let r={url:i.url,ids:[]};n.push(r),i.info.modelMapper.filter(o=>o.typeName===e).forEach(o=>{r.ids.push(Number(o.id))})}),t&&t(n),n}getModelSWithLevel(e,t){let n=[];return this.engine.engineStatus.models.forEach(i=>{let r={url:i.url,ids:[]};n.push(r),i.info.modelMapper.filter(o=>o.levelName===e).forEach(o=>{r.ids.push(Number(o.id))})}),t&&t(n),n}getModelsWithMajor(e,t){let n=[];return this.engine.engineStatus.models.forEach(i=>{let r={url:i.url,ids:[]};n.push(r),i.info.modelMapper.filter(o=>o.majorName===e).forEach(o=>{r.ids.push(Number(o.id))})}),t&&t(n),n}}class LE{engine;isActive=!1;groupEdge;material;indexes=new Map;constructor(e){this.engine=e,this.groupEdge=this.engine.scene.getObjectByName("groupEdge"),this.material=new as({color:"#000000",depthTest:!0})}active(){this.isActive=!0,this.groupEdge.visible=!0,this.show()}disActive(){this.isActive=!1,this.groupEdge.visible=!1}show(){this.engine.engineStatus.models.forEach(e=>{if(!this.groupEdge.children.find(t=>t.url==e.url)){let t=e.info,n=[],i=new Map;t.modelEdge.forEach(a=>{let l=n.length;for(let c=0;cc.url==e);if(l){let c=l.geometry.attributes.position.array;for(let h=r;hc.url==e);if(l){let c=l.geometry.attributes.position.array,h=0;for(let u=r;u=3;if(a[d]&&a[d].length===2){const p=f?a[d][1]:a[d][0];c[u]=p.X,c[u+1]=p.Z,c[u+2]=-p.Y}h+=3}l.geometry.attributes.position.needsUpdate=!0}}}}}class DE{config;constructor(e){this.config={temperature:.7,maxTokens:2e3,timeout:3e4,...e}}async chat(e){const t=new AbortController,n=setTimeout(()=>t.abort(),this.config.timeout);try{const i=await fetch(`${this.config.baseURL}/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:JSON.stringify({model:this.config.model,messages:e,temperature:this.config.temperature,max_tokens:this.config.maxTokens,stream:!1}),signal:t.signal});if(clearTimeout(n),!i.ok){const r=await i.json().catch(()=>({}));throw new Error(`API请求失败 (${i.status}): ${r.error?.message||r.message||i.statusText}`)}return(await i.json()).choices?.[0]?.message?.content||""}catch(i){throw clearTimeout(n),i.name==="AbortError"?new Error("请求超时,请重试"):i.message.includes("Failed to fetch")?new Error(`网络请求失败,请检查: + `};class N2{engine;composer;saturationPass;constructor(e){this.engine=e}resize(){const{width:e,height:t}=this.engine.deviceModule.getContainerSize(),n=e/t;if(this.composer){this.composer.setPixelRatio(n),this.composer.setSize(e,t);const i=this.composer.passes.find(r=>r instanceof Wa&&r.material.uniforms.resolution);i&&(i.material.uniforms.resolution.value.x=1/(e*n),i.material.uniforms.resolution.value.y=1/(t*n))}}init(){const{width:e,height:t}=this.engine.deviceModule.getContainerSize(),n=this.engine.scene,i=this.engine.camera,r=this.engine.renderer,o=e/t,a=new pn(e,t,{minFilter:$t,magFilter:$t,format:fn,samples:4});this.composer=new E2(r,a),this.composer.setPixelRatio(o),this.composer.setSize(e,t);const l=new T2(n,i);this.composer.addPass(l);const c=new bn(n,i,e,t);c.output=bn.OUTPUT.Default,c.blendIntensity=.5,c.updateGtaoMaterial&&c.updateGtaoMaterial({radius:1,distanceExponent:1,thickness:1,scale:1,distanceFallOff:1,screenSpaceRadius:!0}),new wr(new ce(e,t),.1,.1,.5),this.saturationPass=new Wa(B2),this.saturationPass.uniforms.saturation.value=1.3,this.saturationPass.uniforms.contrast.value=1.1,this.composer.addPass(this.saturationPass);const h=new D2;this.composer.addPass(h);const u=new Wa(I2);u.material.uniforms.resolution.value.x=1/(e*o),u.material.uniforms.resolution.value.y=1/(t*o),this.composer.addPass(u)}}var Ya=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Op(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}function Ka(s){throw new Error('Could not dynamically require "'+s+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Fp={exports:{}},zp;function k2(){return zp||(zp=1,(function(s,e){(function(t){s.exports=t()})(function(){return(function t(n,i,r){function o(c,h){if(!i[c]){if(!n[c]){var u=typeof Ka=="function"&&Ka;if(!h&&u)return u(c,!0);if(a)return a(c,!0);var d=new Error("Cannot find module '"+c+"'");throw d.code="MODULE_NOT_FOUND",d}var f=i[c]={exports:{}};n[c][0].call(f.exports,function(p){var g=n[c][1][p];return o(g||p)},f,f.exports,t,n,i,r)}return i[c].exports}for(var a=typeof Ka=="function"&&Ka,l=0;l>2,f=(3&c)<<4|h>>4,p=1>6:64,g=2>4,h=(15&d)<<4|(f=a.indexOf(l.charAt(g++)))>>2,u=(3&f)<<6|(p=a.indexOf(l.charAt(g++))),b[x++]=c,f!==64&&(b[x++]=h),p!==64&&(b[x++]=u);return b}},{"./support":30,"./utils":32}],2:[function(t,n,i){var r=t("./external"),o=t("./stream/DataWorker"),a=t("./stream/Crc32Probe"),l=t("./stream/DataLengthProbe");function c(h,u,d,f,p){this.compressedSize=h,this.uncompressedSize=u,this.crc32=d,this.compression=f,this.compressedContent=p}c.prototype={getContentWorker:function(){var h=new o(r.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new l("data_length")),u=this;return h.on("end",function(){if(this.streamInfo.data_length!==u.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),h},getCompressedWorker:function(){return new o(r.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},c.createWorkerFrom=function(h,u,d){return h.pipe(new a).pipe(new l("uncompressedSize")).pipe(u.compressWorker(d)).pipe(new l("compressedSize")).withStreamInfo("compression",u)},n.exports=c},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(t,n,i){var r=t("./stream/GenericWorker");i.STORE={magic:"\0\0",compressWorker:function(){return new r("STORE compression")},uncompressWorker:function(){return new r("STORE decompression")}},i.DEFLATE=t("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(t,n,i){var r=t("./utils"),o=(function(){for(var a,l=[],c=0;c<256;c++){a=c;for(var h=0;h<8;h++)a=1&a?3988292384^a>>>1:a>>>1;l[c]=a}return l})();n.exports=function(a,l){return a!==void 0&&a.length?r.getTypeOf(a)!=="string"?(function(c,h,u,d){var f=o,p=d+u;c^=-1;for(var g=d;g>>8^f[255&(c^h[g])];return-1^c})(0|l,a,a.length,0):(function(c,h,u,d){var f=o,p=d+u;c^=-1;for(var g=d;g>>8^f[255&(c^h.charCodeAt(g))];return-1^c})(0|l,a,a.length,0):0}},{"./utils":32}],5:[function(t,n,i){i.base64=!1,i.binary=!1,i.dir=!1,i.createFolders=!0,i.date=null,i.compression=null,i.compressionOptions=null,i.comment=null,i.unixPermissions=null,i.dosPermissions=null},{}],6:[function(t,n,i){var r=null;r=typeof Promise<"u"?Promise:t("lie"),n.exports={Promise:r}},{lie:37}],7:[function(t,n,i){var r=typeof Uint8Array<"u"&&typeof Uint16Array<"u"&&typeof Uint32Array<"u",o=t("pako"),a=t("./utils"),l=t("./stream/GenericWorker"),c=r?"uint8array":"array";function h(u,d){l.call(this,"FlateWorker/"+u),this._pako=null,this._pakoAction=u,this._pakoOptions=d,this.meta={}}i.magic="\b\0",a.inherits(h,l),h.prototype.processChunk=function(u){this.meta=u.meta,this._pako===null&&this._createPako(),this._pako.push(a.transformTo(c,u.data),!1)},h.prototype.flush=function(){l.prototype.flush.call(this),this._pako===null&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){l.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new o[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var u=this;this._pako.onData=function(d){u.push({data:d,meta:u.meta})}},i.compressWorker=function(u){return new h("Deflate",u)},i.uncompressWorker=function(){return new h("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(t,n,i){function r(f,p){var g,x="";for(g=0;g>>=8;return x}function o(f,p,g,x,m,b){var v,y,M=f.file,E=f.compression,A=b!==c.utf8encode,R=a.transformTo("string",b(M.name)),_=a.transformTo("string",c.utf8encode(M.name)),S=M.comment,D=a.transformTo("string",b(S)),C=a.transformTo("string",c.utf8encode(S)),B=_.length!==M.name.length,w=C.length!==S.length,F="",W="",j="",$=M.dir,Z=M.date,re={crc32:0,compressedSize:0,uncompressedSize:0};p&&!g||(re.crc32=f.crc32,re.compressedSize=f.compressedSize,re.uncompressedSize=f.uncompressedSize);var X=0;p&&(X|=8),A||!B&&!w||(X|=2048);var Y=0,ge=0;$&&(Y|=16),m==="UNIX"?(ge=798,Y|=(function(de,ie){var he=de;return de||(he=ie?16893:33204),(65535&he)<<16})(M.unixPermissions,$)):(ge=20,Y|=(function(de){return 63&(de||0)})(M.dosPermissions)),v=Z.getUTCHours(),v<<=6,v|=Z.getUTCMinutes(),v<<=5,v|=Z.getUTCSeconds()/2,y=Z.getUTCFullYear()-1980,y<<=4,y|=Z.getUTCMonth()+1,y<<=5,y|=Z.getUTCDate(),B&&(W=r(1,1)+r(h(R),4)+_,F+="up"+r(W.length,2)+W),w&&(j=r(1,1)+r(h(D),4)+C,F+="uc"+r(j.length,2)+j);var pe="";return pe+=` +\0`,pe+=r(X,2),pe+=E.magic,pe+=r(v,2),pe+=r(y,2),pe+=r(re.crc32,4),pe+=r(re.compressedSize,4),pe+=r(re.uncompressedSize,4),pe+=r(R.length,2),pe+=r(F.length,2),{fileRecord:u.LOCAL_FILE_HEADER+pe+R+F,dirRecord:u.CENTRAL_FILE_HEADER+r(ge,2)+pe+r(D.length,2)+"\0\0\0\0"+r(Y,4)+r(x,4)+R+F+D}}var a=t("../utils"),l=t("../stream/GenericWorker"),c=t("../utf8"),h=t("../crc32"),u=t("../signature");function d(f,p,g,x){l.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=p,this.zipPlatform=g,this.encodeFileName=x,this.streamFiles=f,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}a.inherits(d,l),d.prototype.push=function(f){var p=f.meta.percent||0,g=this.entriesCount,x=this._sources.length;this.accumulate?this.contentBuffer.push(f):(this.bytesWritten+=f.data.length,l.prototype.push.call(this,{data:f.data,meta:{currentFile:this.currentFile,percent:g?(p+100*(g-x-1))/g:100}}))},d.prototype.openedSource=function(f){this.currentSourceOffset=this.bytesWritten,this.currentFile=f.file.name;var p=this.streamFiles&&!f.file.dir;if(p){var g=o(f,p,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:g.fileRecord,meta:{percent:0}})}else this.accumulate=!0},d.prototype.closedSource=function(f){this.accumulate=!1;var p=this.streamFiles&&!f.file.dir,g=o(f,p,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(g.dirRecord),p)this.push({data:(function(x){return u.DATA_DESCRIPTOR+r(x.crc32,4)+r(x.compressedSize,4)+r(x.uncompressedSize,4)})(f),meta:{percent:100}});else for(this.push({data:g.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},d.prototype.flush=function(){for(var f=this.bytesWritten,p=0;p=this.index;l--)c=(c<<8)+this.byteAt(l);return this.index+=a,c},readString:function(a){return r.transformTo("string",this.readData(a))},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var a=this.readInt(4);return new Date(Date.UTC(1980+(a>>25&127),(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,(31&a)<<1))}},n.exports=o},{"../utils":32}],19:[function(t,n,i){var r=t("./Uint8ArrayReader");function o(a){r.call(this,a)}t("../utils").inherits(o,r),o.prototype.readData=function(a){this.checkOffset(a);var l=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,l},n.exports=o},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(t,n,i){var r=t("./DataReader");function o(a){r.call(this,a)}t("../utils").inherits(o,r),o.prototype.byteAt=function(a){return this.data.charCodeAt(this.zero+a)},o.prototype.lastIndexOfSignature=function(a){return this.data.lastIndexOf(a)-this.zero},o.prototype.readAndCheckSignature=function(a){return a===this.readData(4)},o.prototype.readData=function(a){this.checkOffset(a);var l=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,l},n.exports=o},{"../utils":32,"./DataReader":18}],21:[function(t,n,i){var r=t("./ArrayReader");function o(a){r.call(this,a)}t("../utils").inherits(o,r),o.prototype.readData=function(a){if(this.checkOffset(a),a===0)return new Uint8Array(0);var l=this.data.subarray(this.zero+this.index,this.zero+this.index+a);return this.index+=a,l},n.exports=o},{"../utils":32,"./ArrayReader":17}],22:[function(t,n,i){var r=t("../utils"),o=t("../support"),a=t("./ArrayReader"),l=t("./StringReader"),c=t("./NodeBufferReader"),h=t("./Uint8ArrayReader");n.exports=function(u){var d=r.getTypeOf(u);return r.checkSupport(d),d!=="string"||o.uint8array?d==="nodebuffer"?new c(u):o.uint8array?new h(r.transformTo("uint8array",u)):new a(r.transformTo("array",u)):new l(u)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(t,n,i){i.LOCAL_FILE_HEADER="PK",i.CENTRAL_FILE_HEADER="PK",i.CENTRAL_DIRECTORY_END="PK",i.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK\x07",i.ZIP64_CENTRAL_DIRECTORY_END="PK",i.DATA_DESCRIPTOR="PK\x07\b"},{}],24:[function(t,n,i){var r=t("./GenericWorker"),o=t("../utils");function a(l){r.call(this,"ConvertWorker to "+l),this.destType=l}o.inherits(a,r),a.prototype.processChunk=function(l){this.push({data:o.transformTo(this.destType,l.data),meta:l.meta})},n.exports=a},{"../utils":32,"./GenericWorker":28}],25:[function(t,n,i){var r=t("./GenericWorker"),o=t("../crc32");function a(){r.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}t("../utils").inherits(a,r),a.prototype.processChunk=function(l){this.streamInfo.crc32=o(l.data,this.streamInfo.crc32||0),this.push(l)},n.exports=a},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(t,n,i){var r=t("../utils"),o=t("./GenericWorker");function a(l){o.call(this,"DataLengthProbe for "+l),this.propName=l,this.withStreamInfo(l,0)}r.inherits(a,o),a.prototype.processChunk=function(l){if(l){var c=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=c+l.data.length}o.prototype.processChunk.call(this,l)},n.exports=a},{"../utils":32,"./GenericWorker":28}],27:[function(t,n,i){var r=t("../utils"),o=t("./GenericWorker");function a(l){o.call(this,"DataWorker");var c=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,l.then(function(h){c.dataIsReady=!0,c.data=h,c.max=h&&h.length||0,c.type=r.getTypeOf(h),c.isPaused||c._tickAndRepeat()},function(h){c.error(h)})}r.inherits(a,o),a.prototype.cleanUp=function(){o.prototype.cleanUp.call(this),this.data=null},a.prototype.resume=function(){return!!o.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,r.delay(this._tickAndRepeat,[],this)),!0)},a.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(r.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},a.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var l=null,c=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":l=this.data.substring(this.index,c);break;case"uint8array":l=this.data.subarray(this.index,c);break;case"array":case"nodebuffer":l=this.data.slice(this.index,c)}return this.index=c,this.push({data:l,meta:{percent:this.max?this.index/this.max*100:0}})},n.exports=a},{"../utils":32,"./GenericWorker":28}],28:[function(t,n,i){function r(o){this.name=o||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}r.prototype={push:function(o){this.emit("data",o)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(o){this.emit("error",o)}return!0},error:function(o){return!this.isFinished&&(this.isPaused?this.generatedError=o:(this.isFinished=!0,this.emit("error",o),this.previous&&this.previous.error(o),this.cleanUp()),!0)},on:function(o,a){return this._listeners[o].push(a),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(o,a){if(this._listeners[o])for(var l=0;l "+o:o}},n.exports=r},{}],29:[function(t,n,i){var r=t("../utils"),o=t("./ConvertWorker"),a=t("./GenericWorker"),l=t("../base64"),c=t("../support"),h=t("../external"),u=null;if(c.nodestream)try{u=t("../nodejs/NodejsStreamOutputAdapter")}catch{}function d(p,g){return new h.Promise(function(x,m){var b=[],v=p._internalType,y=p._outputType,M=p._mimeType;p.on("data",function(E,A){b.push(E),g&&g(A)}).on("error",function(E){b=[],m(E)}).on("end",function(){try{var E=(function(A,R,_){switch(A){case"blob":return r.newBlob(r.transformTo("arraybuffer",R),_);case"base64":return l.encode(R);default:return r.transformTo(A,R)}})(y,(function(A,R){var _,S=0,D=null,C=0;for(_=0;_"u")i.blob=!1;else{var r=new ArrayBuffer(0);try{i.blob=new Blob([r],{type:"application/zip"}).size===0}catch{try{var o=new(self.BlobBuilder||self.WebKitBlobBuilder||self.MozBlobBuilder||self.MSBlobBuilder);o.append(r),i.blob=o.getBlob("application/zip").size===0}catch{i.blob=!1}}}try{i.nodestream=!!t("readable-stream").Readable}catch{i.nodestream=!1}},{"readable-stream":16}],31:[function(t,n,i){for(var r=t("./utils"),o=t("./support"),a=t("./nodejsUtils"),l=t("./stream/GenericWorker"),c=new Array(256),h=0;h<256;h++)c[h]=252<=h?6:248<=h?5:240<=h?4:224<=h?3:192<=h?2:1;c[254]=c[254]=1;function u(){l.call(this,"utf-8 decode"),this.leftOver=null}function d(){l.call(this,"utf-8 encode")}i.utf8encode=function(f){return o.nodebuffer?a.newBufferFrom(f,"utf-8"):(function(p){var g,x,m,b,v,y=p.length,M=0;for(b=0;b>>6:(x<65536?g[v++]=224|x>>>12:(g[v++]=240|x>>>18,g[v++]=128|x>>>12&63),g[v++]=128|x>>>6&63),g[v++]=128|63&x);return g})(f)},i.utf8decode=function(f){return o.nodebuffer?r.transformTo("nodebuffer",f).toString("utf-8"):(function(p){var g,x,m,b,v=p.length,y=new Array(2*v);for(g=x=0;g>10&1023,y[x++]=56320|1023&m)}return y.length!==x&&(y.subarray?y=y.subarray(0,x):y.length=x),r.applyFromCharCode(y)})(f=r.transformTo(o.uint8array?"uint8array":"array",f))},r.inherits(u,l),u.prototype.processChunk=function(f){var p=r.transformTo(o.uint8array?"uint8array":"array",f.data);if(this.leftOver&&this.leftOver.length){if(o.uint8array){var g=p;(p=new Uint8Array(g.length+this.leftOver.length)).set(this.leftOver,0),p.set(g,this.leftOver.length)}else p=this.leftOver.concat(p);this.leftOver=null}var x=(function(b,v){var y;for((v=v||b.length)>b.length&&(v=b.length),y=v-1;0<=y&&(192&b[y])==128;)y--;return y<0||y===0?v:y+c[b[y]]>v?y:v})(p),m=p;x!==p.length&&(o.uint8array?(m=p.subarray(0,x),this.leftOver=p.subarray(x,p.length)):(m=p.slice(0,x),this.leftOver=p.slice(x,p.length))),this.push({data:i.utf8decode(m),meta:f.meta})},u.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:i.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},i.Utf8DecodeWorker=u,r.inherits(d,l),d.prototype.processChunk=function(f){this.push({data:i.utf8encode(f.data),meta:f.meta})},i.Utf8EncodeWorker=d},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(t,n,i){var r=t("./support"),o=t("./base64"),a=t("./nodejsUtils"),l=t("./external");function c(g){return g}function h(g,x){for(var m=0;m>8;this.dir=!!(16&this.externalFileAttributes),f==0&&(this.dosPermissions=63&this.externalFileAttributes),f==3&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||this.fileNameStr.slice(-1)!=="/"||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var f=r(this.extraFields[1].value);this.uncompressedSize===o.MAX_VALUE_32BITS&&(this.uncompressedSize=f.readInt(8)),this.compressedSize===o.MAX_VALUE_32BITS&&(this.compressedSize=f.readInt(8)),this.localHeaderOffset===o.MAX_VALUE_32BITS&&(this.localHeaderOffset=f.readInt(8)),this.diskNumberStart===o.MAX_VALUE_32BITS&&(this.diskNumberStart=f.readInt(4))}},readExtraFields:function(f){var p,g,x,m=f.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});f.index+4>>6:(f<65536?d[x++]=224|f>>>12:(d[x++]=240|f>>>18,d[x++]=128|f>>>12&63),d[x++]=128|f>>>6&63),d[x++]=128|63&f);return d},i.buf2binstring=function(u){return h(u,u.length)},i.binstring2buf=function(u){for(var d=new r.Buf8(u.length),f=0,p=d.length;f>10&1023,b[p++]=56320|1023&g)}return h(b,p)},i.utf8border=function(u,d){var f;for((d=d||u.length)>u.length&&(d=u.length),f=d-1;0<=f&&(192&u[f])==128;)f--;return f<0||f===0?d:f+l[u[f]]>d?f:d}},{"./common":41}],43:[function(t,n,i){n.exports=function(r,o,a,l){for(var c=65535&r|0,h=r>>>16&65535|0,u=0;a!==0;){for(a-=u=2e3>>1:o>>>1;a[l]=o}return a})();n.exports=function(o,a,l,c){var h=r,u=c+l;o^=-1;for(var d=c;d>>8^h[255&(o^a[d])];return-1^o}},{}],46:[function(t,n,i){var r,o=t("../utils/common"),a=t("./trees"),l=t("./adler32"),c=t("./crc32"),h=t("./messages"),u=0,d=4,f=0,p=-2,g=-1,x=4,m=2,b=8,v=9,y=286,M=30,E=19,A=2*y+1,R=15,_=3,S=258,D=S+_+1,C=42,B=113,w=1,F=2,W=3,j=4;function $(T,I){return T.msg=h[I],I}function Z(T){return(T<<1)-(4T.avail_out&&(V=T.avail_out),V!==0&&(o.arraySet(T.output,I.pending_buf,I.pending_out,V,T.next_out),T.next_out+=V,I.pending_out+=V,T.total_out+=V,T.avail_out-=V,I.pending-=V,I.pending===0&&(I.pending_out=0))}function Y(T,I){a._tr_flush_block(T,0<=T.block_start?T.block_start:-1,T.strstart-T.block_start,I),T.block_start=T.strstart,X(T.strm)}function ge(T,I){T.pending_buf[T.pending++]=I}function pe(T,I){T.pending_buf[T.pending++]=I>>>8&255,T.pending_buf[T.pending++]=255&I}function de(T,I){var V,U,k=T.max_chain_length,z=T.strstart,ee=T.prev_length,J=T.nice_match,G=T.strstart>T.w_size-D?T.strstart-(T.w_size-D):0,N=T.window,L=T.w_mask,H=T.prev,K=T.strstart+S,le=N[z+ee-1],te=N[z+ee];T.prev_length>=T.good_match&&(k>>=2),J>T.lookahead&&(J=T.lookahead);do if(N[(V=I)+ee]===te&&N[V+ee-1]===le&&N[V]===N[z]&&N[++V]===N[z+1]){z+=2,V++;do;while(N[++z]===N[++V]&&N[++z]===N[++V]&&N[++z]===N[++V]&&N[++z]===N[++V]&&N[++z]===N[++V]&&N[++z]===N[++V]&&N[++z]===N[++V]&&N[++z]===N[++V]&&zG&&--k!=0);return ee<=T.lookahead?ee:T.lookahead}function ie(T){var I,V,U,k,z,ee,J,G,N,L,H=T.w_size;do{if(k=T.window_size-T.lookahead-T.strstart,T.strstart>=H+(H-D)){for(o.arraySet(T.window,T.window,H,H,0),T.match_start-=H,T.strstart-=H,T.block_start-=H,I=V=T.hash_size;U=T.head[--I],T.head[I]=H<=U?U-H:0,--V;);for(I=V=H;U=T.prev[--I],T.prev[I]=H<=U?U-H:0,--V;);k+=H}if(T.strm.avail_in===0)break;if(ee=T.strm,J=T.window,G=T.strstart+T.lookahead,N=k,L=void 0,L=ee.avail_in,N=_)for(z=T.strstart-T.insert,T.ins_h=T.window[z],T.ins_h=(T.ins_h<=_&&(T.ins_h=(T.ins_h<=_)if(U=a._tr_tally(T,T.strstart-T.match_start,T.match_length-_),T.lookahead-=T.match_length,T.match_length<=T.max_lazy_match&&T.lookahead>=_){for(T.match_length--;T.strstart++,T.ins_h=(T.ins_h<=_&&(T.ins_h=(T.ins_h<=_&&T.match_length<=T.prev_length){for(k=T.strstart+T.lookahead-_,U=a._tr_tally(T,T.strstart-1-T.prev_match,T.prev_length-_),T.lookahead-=T.prev_length-1,T.prev_length-=2;++T.strstart<=k&&(T.ins_h=(T.ins_h<T.pending_buf_size-5&&(V=T.pending_buf_size-5);;){if(T.lookahead<=1){if(ie(T),T.lookahead===0&&I===u)return w;if(T.lookahead===0)break}T.strstart+=T.lookahead,T.lookahead=0;var U=T.block_start+V;if((T.strstart===0||T.strstart>=U)&&(T.lookahead=T.strstart-U,T.strstart=U,Y(T,!1),T.strm.avail_out===0)||T.strstart-T.block_start>=T.w_size-D&&(Y(T,!1),T.strm.avail_out===0))return w}return T.insert=0,I===d?(Y(T,!0),T.strm.avail_out===0?W:j):(T.strstart>T.block_start&&(Y(T,!1),T.strm.avail_out),w)}),new ve(4,4,8,4,he),new ve(4,5,16,8,he),new ve(4,6,32,32,he),new ve(4,4,16,16,fe),new ve(8,16,32,32,fe),new ve(8,16,128,128,fe),new ve(8,32,128,256,fe),new ve(32,128,258,1024,fe),new ve(32,258,258,4096,fe)],i.deflateInit=function(T,I){return Ne(T,I,b,15,8,0)},i.deflateInit2=Ne,i.deflateReset=Je,i.deflateResetKeep=Be,i.deflateSetHeader=function(T,I){return T&&T.state?T.state.wrap!==2?p:(T.state.gzhead=I,f):p},i.deflate=function(T,I){var V,U,k,z;if(!T||!T.state||5>8&255),ge(U,U.gzhead.time>>16&255),ge(U,U.gzhead.time>>24&255),ge(U,U.level===9?2:2<=U.strategy||U.level<2?4:0),ge(U,255&U.gzhead.os),U.gzhead.extra&&U.gzhead.extra.length&&(ge(U,255&U.gzhead.extra.length),ge(U,U.gzhead.extra.length>>8&255)),U.gzhead.hcrc&&(T.adler=c(T.adler,U.pending_buf,U.pending,0)),U.gzindex=0,U.status=69):(ge(U,0),ge(U,0),ge(U,0),ge(U,0),ge(U,0),ge(U,U.level===9?2:2<=U.strategy||U.level<2?4:0),ge(U,3),U.status=B);else{var ee=b+(U.w_bits-8<<4)<<8;ee|=(2<=U.strategy||U.level<2?0:U.level<6?1:U.level===6?2:3)<<6,U.strstart!==0&&(ee|=32),ee+=31-ee%31,U.status=B,pe(U,ee),U.strstart!==0&&(pe(U,T.adler>>>16),pe(U,65535&T.adler)),T.adler=1}if(U.status===69)if(U.gzhead.extra){for(k=U.pending;U.gzindex<(65535&U.gzhead.extra.length)&&(U.pending!==U.pending_buf_size||(U.gzhead.hcrc&&U.pending>k&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),X(T),k=U.pending,U.pending!==U.pending_buf_size));)ge(U,255&U.gzhead.extra[U.gzindex]),U.gzindex++;U.gzhead.hcrc&&U.pending>k&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),U.gzindex===U.gzhead.extra.length&&(U.gzindex=0,U.status=73)}else U.status=73;if(U.status===73)if(U.gzhead.name){k=U.pending;do{if(U.pending===U.pending_buf_size&&(U.gzhead.hcrc&&U.pending>k&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),X(T),k=U.pending,U.pending===U.pending_buf_size)){z=1;break}z=U.gzindexk&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),z===0&&(U.gzindex=0,U.status=91)}else U.status=91;if(U.status===91)if(U.gzhead.comment){k=U.pending;do{if(U.pending===U.pending_buf_size&&(U.gzhead.hcrc&&U.pending>k&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),X(T),k=U.pending,U.pending===U.pending_buf_size)){z=1;break}z=U.gzindexk&&(T.adler=c(T.adler,U.pending_buf,U.pending-k,k)),z===0&&(U.status=103)}else U.status=103;if(U.status===103&&(U.gzhead.hcrc?(U.pending+2>U.pending_buf_size&&X(T),U.pending+2<=U.pending_buf_size&&(ge(U,255&T.adler),ge(U,T.adler>>8&255),T.adler=0,U.status=B)):U.status=B),U.pending!==0){if(X(T),T.avail_out===0)return U.last_flush=-1,f}else if(T.avail_in===0&&Z(I)<=Z(V)&&I!==d)return $(T,-5);if(U.status===666&&T.avail_in!==0)return $(T,-5);if(T.avail_in!==0||U.lookahead!==0||I!==u&&U.status!==666){var J=U.strategy===2?(function(G,N){for(var L;;){if(G.lookahead===0&&(ie(G),G.lookahead===0)){if(N===u)return w;break}if(G.match_length=0,L=a._tr_tally(G,0,G.window[G.strstart]),G.lookahead--,G.strstart++,L&&(Y(G,!1),G.strm.avail_out===0))return w}return G.insert=0,N===d?(Y(G,!0),G.strm.avail_out===0?W:j):G.last_lit&&(Y(G,!1),G.strm.avail_out===0)?w:F})(U,I):U.strategy===3?(function(G,N){for(var L,H,K,le,te=G.window;;){if(G.lookahead<=S){if(ie(G),G.lookahead<=S&&N===u)return w;if(G.lookahead===0)break}if(G.match_length=0,G.lookahead>=_&&0G.lookahead&&(G.match_length=G.lookahead)}if(G.match_length>=_?(L=a._tr_tally(G,1,G.match_length-_),G.lookahead-=G.match_length,G.strstart+=G.match_length,G.match_length=0):(L=a._tr_tally(G,0,G.window[G.strstart]),G.lookahead--,G.strstart++),L&&(Y(G,!1),G.strm.avail_out===0))return w}return G.insert=0,N===d?(Y(G,!0),G.strm.avail_out===0?W:j):G.last_lit&&(Y(G,!1),G.strm.avail_out===0)?w:F})(U,I):r[U.level].func(U,I);if(J!==W&&J!==j||(U.status=666),J===w||J===W)return T.avail_out===0&&(U.last_flush=-1),f;if(J===F&&(I===1?a._tr_align(U):I!==5&&(a._tr_stored_block(U,0,0,!1),I===3&&(re(U.head),U.lookahead===0&&(U.strstart=0,U.block_start=0,U.insert=0))),X(T),T.avail_out===0))return U.last_flush=-1,f}return I!==d?f:U.wrap<=0?1:(U.wrap===2?(ge(U,255&T.adler),ge(U,T.adler>>8&255),ge(U,T.adler>>16&255),ge(U,T.adler>>24&255),ge(U,255&T.total_in),ge(U,T.total_in>>8&255),ge(U,T.total_in>>16&255),ge(U,T.total_in>>24&255)):(pe(U,T.adler>>>16),pe(U,65535&T.adler)),X(T),0=V.w_size&&(z===0&&(re(V.head),V.strstart=0,V.block_start=0,V.insert=0),N=new o.Buf8(V.w_size),o.arraySet(N,I,L-V.w_size,V.w_size,0),I=N,L=V.w_size),ee=T.avail_in,J=T.next_in,G=T.input,T.avail_in=L,T.next_in=0,T.input=I,ie(V);V.lookahead>=_;){for(U=V.strstart,k=V.lookahead-(_-1);V.ins_h=(V.ins_h<>>=_=R>>>24,v-=_,(_=R>>>16&255)===0)F[h++]=65535&R;else{if(!(16&_)){if((64&_)==0){R=y[(65535&R)+(b&(1<<_)-1)];continue t}if(32&_){a.mode=12;break e}r.msg="invalid literal/length code",a.mode=30;break e}S=65535&R,(_&=15)&&(v<_&&(b+=w[l++]<>>=_,v-=_),v<15&&(b+=w[l++]<>>=_=R>>>24,v-=_,!(16&(_=R>>>16&255))){if((64&_)==0){R=M[(65535&R)+(b&(1<<_)-1)];continue n}r.msg="invalid distance code",a.mode=30;break e}if(D=65535&R,v<(_&=15)&&(b+=w[l++]<>>=_,v-=_,(_=h-u)>3,b&=(1<<(v-=S<<3))-1,r.next_in=l,r.next_out=h,r.avail_in=l>>24&255)+(C>>>8&65280)+((65280&C)<<8)+((255&C)<<24)}function b(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new r.Buf16(320),this.work=new r.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function v(C){var B;return C&&C.state?(B=C.state,C.total_in=C.total_out=B.total=0,C.msg="",B.wrap&&(C.adler=1&B.wrap),B.mode=p,B.last=0,B.havedict=0,B.dmax=32768,B.head=null,B.hold=0,B.bits=0,B.lencode=B.lendyn=new r.Buf32(g),B.distcode=B.distdyn=new r.Buf32(x),B.sane=1,B.back=-1,d):f}function y(C){var B;return C&&C.state?((B=C.state).wsize=0,B.whave=0,B.wnext=0,v(C)):f}function M(C,B){var w,F;return C&&C.state?(F=C.state,B<0?(w=0,B=-B):(w=1+(B>>4),B<48&&(B&=15)),B&&(B<8||15=j.wsize?(r.arraySet(j.window,B,w-j.wsize,j.wsize,0),j.wnext=0,j.whave=j.wsize):(F<(W=j.wsize-j.wnext)&&(W=F),r.arraySet(j.window,B,w-F,W,j.wnext),(F-=W)?(r.arraySet(j.window,B,w-F,F,0),j.wnext=F,j.whave=j.wsize):(j.wnext+=W,j.wnext===j.wsize&&(j.wnext=0),j.whave>>8&255,w.check=a(w.check,z,2,0),Y=X=0,w.mode=2;break}if(w.flags=0,w.head&&(w.head.done=!1),!(1&w.wrap)||(((255&X)<<8)+(X>>8))%31){C.msg="incorrect header check",w.mode=30;break}if((15&X)!=8){C.msg="unknown compression method",w.mode=30;break}if(Y-=4,T=8+(15&(X>>>=4)),w.wbits===0)w.wbits=T;else if(T>w.wbits){C.msg="invalid window size",w.mode=30;break}w.dmax=1<>8&1),512&w.flags&&(z[0]=255&X,z[1]=X>>>8&255,w.check=a(w.check,z,2,0)),Y=X=0,w.mode=3;case 3:for(;Y<32;){if(Z===0)break e;Z--,X+=F[j++]<>>8&255,z[2]=X>>>16&255,z[3]=X>>>24&255,w.check=a(w.check,z,4,0)),Y=X=0,w.mode=4;case 4:for(;Y<16;){if(Z===0)break e;Z--,X+=F[j++]<>8),512&w.flags&&(z[0]=255&X,z[1]=X>>>8&255,w.check=a(w.check,z,2,0)),Y=X=0,w.mode=5;case 5:if(1024&w.flags){for(;Y<16;){if(Z===0)break e;Z--,X+=F[j++]<>>8&255,w.check=a(w.check,z,2,0)),Y=X=0}else w.head&&(w.head.extra=null);w.mode=6;case 6:if(1024&w.flags&&(Z<(de=w.length)&&(de=Z),de&&(w.head&&(T=w.head.extra_len-w.length,w.head.extra||(w.head.extra=new Array(w.head.extra_len)),r.arraySet(w.head.extra,F,j,de,T)),512&w.flags&&(w.check=a(w.check,F,de,j)),Z-=de,j+=de,w.length-=de),w.length))break e;w.length=0,w.mode=7;case 7:if(2048&w.flags){if(Z===0)break e;for(de=0;T=F[j+de++],w.head&&T&&w.length<65536&&(w.head.name+=String.fromCharCode(T)),T&&de>9&1,w.head.done=!0),C.adler=w.check=0,w.mode=12;break;case 10:for(;Y<32;){if(Z===0)break e;Z--,X+=F[j++]<>>=7&Y,Y-=7&Y,w.mode=27;break}for(;Y<3;){if(Z===0)break e;Z--,X+=F[j++]<>>=1)){case 0:w.mode=14;break;case 1:if(S(w),w.mode=20,B!==6)break;X>>>=2,Y-=2;break e;case 2:w.mode=17;break;case 3:C.msg="invalid block type",w.mode=30}X>>>=2,Y-=2;break;case 14:for(X>>>=7&Y,Y-=7&Y;Y<32;){if(Z===0)break e;Z--,X+=F[j++]<>>16^65535)){C.msg="invalid stored block lengths",w.mode=30;break}if(w.length=65535&X,Y=X=0,w.mode=15,B===6)break e;case 15:w.mode=16;case 16:if(de=w.length){if(Z>>=5,Y-=5,w.ndist=1+(31&X),X>>>=5,Y-=5,w.ncode=4+(15&X),X>>>=4,Y-=4,286>>=3,Y-=3}for(;w.have<19;)w.lens[ee[w.have++]]=0;if(w.lencode=w.lendyn,w.lenbits=7,V={bits:w.lenbits},I=c(0,w.lens,0,19,w.lencode,0,w.work,V),w.lenbits=V.bits,I){C.msg="invalid code lengths set",w.mode=30;break}w.have=0,w.mode=19;case 19:for(;w.have>>16&255,we=65535&k,!((fe=k>>>24)<=Y);){if(Z===0)break e;Z--,X+=F[j++]<>>=fe,Y-=fe,w.lens[w.have++]=we;else{if(we===16){for(U=fe+2;Y>>=fe,Y-=fe,w.have===0){C.msg="invalid bit length repeat",w.mode=30;break}T=w.lens[w.have-1],de=3+(3&X),X>>>=2,Y-=2}else if(we===17){for(U=fe+3;Y>>=fe)),X>>>=3,Y-=3}else{for(U=fe+7;Y>>=fe)),X>>>=7,Y-=7}if(w.have+de>w.nlen+w.ndist){C.msg="invalid bit length repeat",w.mode=30;break}for(;de--;)w.lens[w.have++]=T}}if(w.mode===30)break;if(w.lens[256]===0){C.msg="invalid code -- missing end-of-block",w.mode=30;break}if(w.lenbits=9,V={bits:w.lenbits},I=c(h,w.lens,0,w.nlen,w.lencode,0,w.work,V),w.lenbits=V.bits,I){C.msg="invalid literal/lengths set",w.mode=30;break}if(w.distbits=6,w.distcode=w.distdyn,V={bits:w.distbits},I=c(u,w.lens,w.nlen,w.ndist,w.distcode,0,w.work,V),w.distbits=V.bits,I){C.msg="invalid distances set",w.mode=30;break}if(w.mode=20,B===6)break e;case 20:w.mode=21;case 21:if(6<=Z&&258<=re){C.next_out=$,C.avail_out=re,C.next_in=j,C.avail_in=Z,w.hold=X,w.bits=Y,l(C,pe),$=C.next_out,W=C.output,re=C.avail_out,j=C.next_in,F=C.input,Z=C.avail_in,X=w.hold,Y=w.bits,w.mode===12&&(w.back=-1);break}for(w.back=0;ve=(k=w.lencode[X&(1<>>16&255,we=65535&k,!((fe=k>>>24)<=Y);){if(Z===0)break e;Z--,X+=F[j++]<>Be)])>>>16&255,we=65535&k,!(Be+(fe=k>>>24)<=Y);){if(Z===0)break e;Z--,X+=F[j++]<>>=Be,Y-=Be,w.back+=Be}if(X>>>=fe,Y-=fe,w.back+=fe,w.length=we,ve===0){w.mode=26;break}if(32&ve){w.back=-1,w.mode=12;break}if(64&ve){C.msg="invalid literal/length code",w.mode=30;break}w.extra=15&ve,w.mode=22;case 22:if(w.extra){for(U=w.extra;Y>>=w.extra,Y-=w.extra,w.back+=w.extra}w.was=w.length,w.mode=23;case 23:for(;ve=(k=w.distcode[X&(1<>>16&255,we=65535&k,!((fe=k>>>24)<=Y);){if(Z===0)break e;Z--,X+=F[j++]<>Be)])>>>16&255,we=65535&k,!(Be+(fe=k>>>24)<=Y);){if(Z===0)break e;Z--,X+=F[j++]<>>=Be,Y-=Be,w.back+=Be}if(X>>>=fe,Y-=fe,w.back+=fe,64&ve){C.msg="invalid distance code",w.mode=30;break}w.offset=we,w.extra=15&ve,w.mode=24;case 24:if(w.extra){for(U=w.extra;Y>>=w.extra,Y-=w.extra,w.back+=w.extra}if(w.offset>w.dmax){C.msg="invalid distance too far back",w.mode=30;break}w.mode=25;case 25:if(re===0)break e;if(de=pe-re,w.offset>de){if((de=w.offset-de)>w.whave&&w.sane){C.msg="invalid distance too far back",w.mode=30;break}ie=de>w.wnext?(de-=w.wnext,w.wsize-de):w.wnext-de,de>w.length&&(de=w.length),he=w.window}else he=W,ie=$-w.offset,de=w.length;for(reA?(_=ie[he+x[B]],Y[ge+x[B]]):(_=96,0),b=1<>$)+(v-=b)]=R<<24|_<<16|S|0,v!==0;);for(b=1<>=1;if(b!==0?(X&=b-1,X+=b):X=0,B++,--pe[C]==0){if(C===F)break;C=u[d+x[B]]}if(W>>7)]}function ge(k,z){k.pending_buf[k.pending++]=255&z,k.pending_buf[k.pending++]=z>>>8&255}function pe(k,z,ee){k.bi_valid>m-ee?(k.bi_buf|=z<>m-k.bi_valid,k.bi_valid+=ee-m):(k.bi_buf|=z<>>=1,ee<<=1,0<--z;);return ee>>>1}function he(k,z,ee){var J,G,N=new Array(x+1),L=0;for(J=1;J<=x;J++)N[J]=L=L+ee[J-1]<<1;for(G=0;G<=z;G++){var H=k[2*G+1];H!==0&&(k[2*G]=ie(N[H]++,H))}}function fe(k){var z;for(z=0;z>1;1<=ee;ee--)Be(k,N,ee);for(G=K;ee=k.heap[1],k.heap[1]=k.heap[k.heap_len--],Be(k,N,1),J=k.heap[1],k.heap[--k.heap_max]=ee,k.heap[--k.heap_max]=J,N[2*G]=N[2*ee]+N[2*J],k.depth[G]=(k.depth[ee]>=k.depth[J]?k.depth[ee]:k.depth[J])+1,N[2*ee+1]=N[2*J+1]=G,k.heap[1]=G++,Be(k,N,1),2<=k.heap_len;);k.heap[--k.heap_max]=k.heap[1],(function(te,Ae){var be,Re,De,ue,ye,Ve,ke=Ae.dyn_tree,Ce=Ae.max_code,Ge=Ae.stat_desc.static_tree,q=Ae.stat_desc.has_stree,Ee=Ae.stat_desc.extra_bits,_e=Ae.stat_desc.extra_base,Me=Ae.stat_desc.max_length,xe=0;for(ue=0;ue<=x;ue++)te.bl_count[ue]=0;for(ke[2*te.heap[te.heap_max]+1]=0,be=te.heap_max+1;be>=7;G>>=1)if(1&le&&H.dyn_ltree[2*K]!==0)return o;if(H.dyn_ltree[18]!==0||H.dyn_ltree[20]!==0||H.dyn_ltree[26]!==0)return a;for(K=32;K>>3,(N=k.static_len+3+7>>>3)<=G&&(G=N)):G=N=ee+5,ee+4<=G&&z!==-1?U(k,z,ee,J):k.strategy===4||N===G?(pe(k,2+(J?1:0),3),Je(k,D,C)):(pe(k,4+(J?1:0),3),(function(H,K,le,te){var Ae;for(pe(H,K-257,5),pe(H,le-1,5),pe(H,te-4,4),Ae=0;Ae>>8&255,k.pending_buf[k.d_buf+2*k.last_lit+1]=255&z,k.pending_buf[k.l_buf+k.last_lit]=255&ee,k.last_lit++,z===0?k.dyn_ltree[2*ee]++:(k.matches++,z--,k.dyn_ltree[2*(w[ee]+u+1)]++,k.dyn_dtree[2*Y(z)]++),k.last_lit===k.lit_bufsize-1},i._tr_align=function(k){pe(k,2,3),de(k,v,D),(function(z){z.bi_valid===16?(ge(z,z.bi_buf),z.bi_buf=0,z.bi_valid=0):8<=z.bi_valid&&(z.pending_buf[z.pending++]=255&z.bi_buf,z.bi_buf>>=8,z.bi_valid-=8)})(k)}},{"../utils/common":41}],53:[function(t,n,i){n.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(t,n,i){(function(r){(function(o,a){if(!o.setImmediate){var l,c,h,u,d=1,f={},p=!1,g=o.document,x=Object.getPrototypeOf&&Object.getPrototypeOf(o);x=x&&x.setTimeout?x:o,l={}.toString.call(o.process)==="[object process]"?function(y){process.nextTick(function(){b(y)})}:(function(){if(o.postMessage&&!o.importScripts){var y=!0,M=o.onmessage;return o.onmessage=function(){y=!1},o.postMessage("","*"),o.onmessage=M,y}})()?(u="setImmediate$"+Math.random()+"$",o.addEventListener?o.addEventListener("message",v,!1):o.attachEvent("onmessage",v),function(y){o.postMessage(u+y,"*")}):o.MessageChannel?((h=new MessageChannel).port1.onmessage=function(y){b(y.data)},function(y){h.port2.postMessage(y)}):g&&"onreadystatechange"in g.createElement("script")?(c=g.documentElement,function(y){var M=g.createElement("script");M.onreadystatechange=function(){b(y),M.onreadystatechange=null,c.removeChild(M),M=null},c.appendChild(M)}):function(y){setTimeout(b,0,y)},x.setImmediate=function(y){typeof y!="function"&&(y=new Function(""+y));for(var M=new Array(arguments.length-1),E=0;E"u"?r===void 0?this:r:self)}).call(this,typeof Ya<"u"?Ya:typeof self<"u"?self:typeof window<"u"?window:{})},{}]},{},[10])(10)})})(Fp)),Fp.exports}var U2=k2();const Hp=Op(U2);function Vp(s,e){return function(){return s.apply(e,arguments)}}const{toString:O2}=Object.prototype,{getPrototypeOf:Yh}=Object,{iterator:$a,toStringTag:Gp}=Symbol,Ja=(s=>e=>{const t=O2.call(e);return s[t]||(s[t]=t.slice(8,-1).toLowerCase())})(Object.create(null)),Jn=s=>(s=s.toLowerCase(),e=>Ja(e)===s),Qa=s=>e=>typeof e===s,{isArray:Sr}=Array,Er=Qa("undefined");function Eo(s){return s!==null&&!Er(s)&&s.constructor!==null&&!Er(s.constructor)&&yn(s.constructor.isBuffer)&&s.constructor.isBuffer(s)}const Wp=Jn("ArrayBuffer");function F2(s){let e;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?e=ArrayBuffer.isView(s):e=s&&s.buffer&&Wp(s.buffer),e}const z2=Qa("string"),yn=Qa("function"),Xp=Qa("number"),To=s=>s!==null&&typeof s=="object",H2=s=>s===!0||s===!1,el=s=>{if(Ja(s)!=="object")return!1;const e=Yh(s);return(e===null||e===Object.prototype||Object.getPrototypeOf(e)===null)&&!(Gp in s)&&!($a in s)},V2=s=>{if(!To(s)||Eo(s))return!1;try{return Object.keys(s).length===0&&Object.getPrototypeOf(s)===Object.prototype}catch{return!1}},G2=Jn("Date"),W2=Jn("File"),X2=Jn("Blob"),j2=Jn("FileList"),q2=s=>To(s)&&yn(s.pipe),Z2=s=>{let e;return s&&(typeof FormData=="function"&&s instanceof FormData||yn(s.append)&&((e=Ja(s))==="formdata"||e==="object"&&yn(s.toString)&&s.toString()==="[object FormData]"))},Y2=Jn("URLSearchParams"),[K2,$2,J2,Q2]=["ReadableStream","Request","Response","Headers"].map(Jn),eM=s=>s.trim?s.trim():s.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Ao(s,e,{allOwnKeys:t=!1}={}){if(s===null||typeof s>"u")return;let n,i;if(typeof s!="object"&&(s=[s]),Sr(s))for(n=0,i=s.length;n0;)if(i=t[n],e===i.toLowerCase())return i;return null}const vs=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,qp=s=>!Er(s)&&s!==vs;function Kh(){const{caseless:s,skipUndefined:e}=qp(this)&&this||{},t={},n=(i,r)=>{const o=s&&jp(t,r)||r;el(t[o])&&el(i)?t[o]=Kh(t[o],i):el(i)?t[o]=Kh({},i):Sr(i)?t[o]=i.slice():(!e||!Er(i))&&(t[o]=i)};for(let i=0,r=arguments.length;i(Ao(e,(i,r)=>{t&&yn(i)?s[r]=Vp(i,t):s[r]=i},{allOwnKeys:n}),s),nM=s=>(s.charCodeAt(0)===65279&&(s=s.slice(1)),s),iM=(s,e,t,n)=>{s.prototype=Object.create(e.prototype,n),s.prototype.constructor=s,Object.defineProperty(s,"super",{value:e.prototype}),t&&Object.assign(s.prototype,t)},sM=(s,e,t,n)=>{let i,r,o;const a={};if(e=e||{},s==null)return e;do{for(i=Object.getOwnPropertyNames(s),r=i.length;r-- >0;)o=i[r],(!n||n(o,s,e))&&!a[o]&&(e[o]=s[o],a[o]=!0);s=t!==!1&&Yh(s)}while(s&&(!t||t(s,e))&&s!==Object.prototype);return e},rM=(s,e,t)=>{s=String(s),(t===void 0||t>s.length)&&(t=s.length),t-=e.length;const n=s.indexOf(e,t);return n!==-1&&n===t},oM=s=>{if(!s)return null;if(Sr(s))return s;let e=s.length;if(!Xp(e))return null;const t=new Array(e);for(;e-- >0;)t[e]=s[e];return t},aM=(s=>e=>s&&e instanceof s)(typeof Uint8Array<"u"&&Yh(Uint8Array)),lM=(s,e)=>{const t=(s&&s[$a]).call(s);let n;for(;(n=t.next())&&!n.done;){const i=n.value;e.call(s,i[0],i[1])}},cM=(s,e)=>{let t;const n=[];for(;(t=s.exec(e))!==null;)n.push(t);return n},hM=Jn("HTMLFormElement"),uM=s=>s.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(e,t,n){return t.toUpperCase()+n}),Zp=(({hasOwnProperty:s})=>(e,t)=>s.call(e,t))(Object.prototype),dM=Jn("RegExp"),Yp=(s,e)=>{const t=Object.getOwnPropertyDescriptors(s),n={};Ao(t,(i,r)=>{let o;(o=e(i,r,s))!==!1&&(n[r]=o||i)}),Object.defineProperties(s,n)},fM=s=>{Yp(s,(e,t)=>{if(yn(s)&&["arguments","caller","callee"].indexOf(t)!==-1)return!1;const n=s[t];if(yn(n)){if(e.enumerable=!1,"writable"in e){e.writable=!1;return}e.set||(e.set=()=>{throw Error("Can not rewrite read-only method '"+t+"'")})}})},pM=(s,e)=>{const t={},n=i=>{i.forEach(r=>{t[r]=!0})};return Sr(s)?n(s):n(String(s).split(e)),t},mM=()=>{},gM=(s,e)=>s!=null&&Number.isFinite(s=+s)?s:e;function xM(s){return!!(s&&yn(s.append)&&s[Gp]==="FormData"&&s[$a])}const vM=s=>{const e=new Array(10),t=(n,i)=>{if(To(n)){if(e.indexOf(n)>=0)return;if(Eo(n))return n;if(!("toJSON"in n)){e[i]=n;const r=Sr(n)?[]:{};return Ao(n,(o,a)=>{const l=t(o,i+1);!Er(l)&&(r[a]=l)}),e[i]=void 0,r}}return n};return t(s,0)},bM=Jn("AsyncFunction"),yM=s=>s&&(To(s)||yn(s))&&yn(s.then)&&yn(s.catch),Kp=((s,e)=>s?setImmediate:e?((t,n)=>(vs.addEventListener("message",({source:i,data:r})=>{i===vs&&r===t&&n.length&&n.shift()()},!1),i=>{n.push(i),vs.postMessage(t,"*")}))(`axios@${Math.random()}`,[]):t=>setTimeout(t))(typeof setImmediate=="function",yn(vs.postMessage)),_M=typeof queueMicrotask<"u"?queueMicrotask.bind(vs):typeof process<"u"&&process.nextTick||Kp,MM=s=>s!=null&&yn(s[$a]),se={isArray:Sr,isArrayBuffer:Wp,isBuffer:Eo,isFormData:Z2,isArrayBufferView:F2,isString:z2,isNumber:Xp,isBoolean:H2,isObject:To,isPlainObject:el,isEmptyObject:V2,isReadableStream:K2,isRequest:$2,isResponse:J2,isHeaders:Q2,isUndefined:Er,isDate:G2,isFile:W2,isBlob:X2,isRegExp:dM,isFunction:yn,isStream:q2,isURLSearchParams:Y2,isTypedArray:aM,isFileList:j2,forEach:Ao,merge:Kh,extend:tM,trim:eM,stripBOM:nM,inherits:iM,toFlatObject:sM,kindOf:Ja,kindOfTest:Jn,endsWith:rM,toArray:oM,forEachEntry:lM,matchAll:cM,isHTMLForm:hM,hasOwnProperty:Zp,hasOwnProp:Zp,reduceDescriptors:Yp,freezeMethods:fM,toObjectSet:pM,toCamelCase:uM,noop:mM,toFiniteNumber:gM,findKey:jp,global:vs,isContextDefined:qp,isSpecCompliantForm:xM,toJSONObject:vM,isAsyncFn:bM,isThenable:yM,setImmediate:Kp,asap:_M,isIterable:MM};function $e(s,e,t,n,i){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=s,this.name="AxiosError",e&&(this.code=e),t&&(this.config=t),n&&(this.request=n),i&&(this.response=i,this.status=i.status?i.status:null)}se.inherits($e,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:se.toJSONObject(this.config),code:this.code,status:this.status}}});const $p=$e.prototype,Jp={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(s=>{Jp[s]={value:s}}),Object.defineProperties($e,Jp),Object.defineProperty($p,"isAxiosError",{value:!0}),$e.from=(s,e,t,n,i,r)=>{const o=Object.create($p);se.toFlatObject(s,o,function(c){return c!==Error.prototype},c=>c!=="isAxiosError");const a=s&&s.message?s.message:"Error",l=e==null&&s?s.code:e;return $e.call(o,a,l,t,n,i),s&&o.cause==null&&Object.defineProperty(o,"cause",{value:s,configurable:!0}),o.name=s&&s.name||"Error",r&&Object.assign(o,r),o};const wM=null;function $h(s){return se.isPlainObject(s)||se.isArray(s)}function Qp(s){return se.endsWith(s,"[]")?s.slice(0,-2):s}function em(s,e,t){return s?s.concat(e).map(function(n,i){return n=Qp(n),!t&&i?"["+n+"]":n}).join(t?".":""):e}function SM(s){return se.isArray(s)&&!s.some($h)}const EM=se.toFlatObject(se,{},null,function(s){return/^is[A-Z]/.test(s)});function tl(s,e,t){if(!se.isObject(s))throw new TypeError("target must be an object");e=e||new FormData,t=se.toFlatObject(t,{metaTokens:!0,dots:!1,indexes:!1},!1,function(f,p){return!se.isUndefined(p[f])});const n=t.metaTokens,i=t.visitor||c,r=t.dots,o=t.indexes,a=(t.Blob||typeof Blob<"u"&&Blob)&&se.isSpecCompliantForm(e);if(!se.isFunction(i))throw new TypeError("visitor must be a function");function l(f){if(f===null)return"";if(se.isDate(f))return f.toISOString();if(se.isBoolean(f))return f.toString();if(!a&&se.isBlob(f))throw new $e("Blob is not supported. Use a Buffer instead.");return se.isArrayBuffer(f)||se.isTypedArray(f)?a&&typeof Blob=="function"?new Blob([f]):Buffer.from(f):f}function c(f,p,g){let x=f;if(f&&!g&&typeof f=="object"){if(se.endsWith(p,"{}"))p=n?p:p.slice(0,-2),f=JSON.stringify(f);else if(se.isArray(f)&&SM(f)||(se.isFileList(f)||se.endsWith(p,"[]"))&&(x=se.toArray(f)))return p=Qp(p),x.forEach(function(m,b){!(se.isUndefined(m)||m===null)&&e.append(o===!0?em([p],b,r):o===null?p:p+"[]",l(m))}),!1}return $h(f)?!0:(e.append(em(g,p,r),l(f)),!1)}const h=[],u=Object.assign(EM,{defaultVisitor:c,convertValue:l,isVisitable:$h});function d(f,p){if(!se.isUndefined(f)){if(h.indexOf(f)!==-1)throw Error("Circular reference detected in "+p.join("."));h.push(f),se.forEach(f,function(g,x){(!(se.isUndefined(g)||g===null)&&i.call(e,g,se.isString(x)?x.trim():x,p,u))===!0&&d(g,p?p.concat(x):[x])}),h.pop()}}if(!se.isObject(s))throw new TypeError("data must be an object");return d(s),e}function tm(s){const e={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(s).replace(/[!'()~]|%20|%00/g,function(t){return e[t]})}function Jh(s,e){this._pairs=[],s&&tl(s,this,e)}const nm=Jh.prototype;nm.append=function(s,e){this._pairs.push([s,e])},nm.toString=function(s){const e=s?function(t){return s.call(this,t,tm)}:tm;return this._pairs.map(function(t){return e(t[0])+"="+e(t[1])},"").join("&")};function TM(s){return encodeURIComponent(s).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function im(s,e,t){if(!e)return s;const n=t&&t.encode||TM;se.isFunction(t)&&(t={serialize:t});const i=t&&t.serialize;let r;if(i?r=i(e,t):r=se.isURLSearchParams(e)?e.toString():new Jh(e,t).toString(n),r){const o=s.indexOf("#");o!==-1&&(s=s.slice(0,o)),s+=(s.indexOf("?")===-1?"?":"&")+r}return s}class sm{constructor(){this.handlers=[]}use(e,t,n){return this.handlers.push({fulfilled:e,rejected:t,synchronous:n?n.synchronous:!1,runWhen:n?n.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){se.forEach(this.handlers,function(t){t!==null&&e(t)})}}const rm={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},AM=typeof URLSearchParams<"u"?URLSearchParams:Jh,CM=typeof FormData<"u"?FormData:null,PM=typeof Blob<"u"?Blob:null,RM={isBrowser:!0,classes:{URLSearchParams:AM,FormData:CM,Blob:PM},protocols:["http","https","file","blob","url","data"]},Qh=typeof window<"u"&&typeof document<"u",eu=typeof navigator=="object"&&navigator||void 0,LM=Qh&&(!eu||["ReactNative","NativeScript","NS"].indexOf(eu.product)<0),DM=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",IM=Qh&&window.location.href||"http://localhost",BM=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Qh,hasStandardBrowserEnv:LM,hasStandardBrowserWebWorkerEnv:DM,navigator:eu,origin:IM},Symbol.toStringTag,{value:"Module"})),rn={...BM,...RM};function NM(s,e){return tl(s,new rn.classes.URLSearchParams,{visitor:function(t,n,i,r){return rn.isNode&&se.isBuffer(t)?(this.append(n,t.toString("base64")),!1):r.defaultVisitor.apply(this,arguments)},...e})}function kM(s){return se.matchAll(/\w+|\[(\w*)]/g,s).map(e=>e[0]==="[]"?"":e[1]||e[0])}function UM(s){const e={},t=Object.keys(s);let n;const i=t.length;let r;for(n=0;n=t.length;return o=!o&&se.isArray(i)?i.length:o,l?(se.hasOwnProp(i,o)?i[o]=[i[o],n]:i[o]=n,!a):((!i[o]||!se.isObject(i[o]))&&(i[o]=[]),e(t,n,i[o],r)&&se.isArray(i[o])&&(i[o]=UM(i[o])),!a)}if(se.isFormData(s)&&se.isFunction(s.entries)){const t={};return se.forEachEntry(s,(n,i)=>{e(kM(n),i,t,0)}),t}return null}function OM(s,e,t){if(se.isString(s))try{return(e||JSON.parse)(s),se.trim(s)}catch(n){if(n.name!=="SyntaxError")throw n}return(t||JSON.stringify)(s)}const Co={transitional:rm,adapter:["xhr","http","fetch"],transformRequest:[function(s,e){const t=e.getContentType()||"",n=t.indexOf("application/json")>-1,i=se.isObject(s);if(i&&se.isHTMLForm(s)&&(s=new FormData(s)),se.isFormData(s))return n?JSON.stringify(om(s)):s;if(se.isArrayBuffer(s)||se.isBuffer(s)||se.isStream(s)||se.isFile(s)||se.isBlob(s)||se.isReadableStream(s))return s;if(se.isArrayBufferView(s))return s.buffer;if(se.isURLSearchParams(s))return e.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),s.toString();let r;if(i){if(t.indexOf("application/x-www-form-urlencoded")>-1)return NM(s,this.formSerializer).toString();if((r=se.isFileList(s))||t.indexOf("multipart/form-data")>-1){const o=this.env&&this.env.FormData;return tl(r?{"files[]":s}:s,o&&new o,this.formSerializer)}}return i||n?(e.setContentType("application/json",!1),OM(s)):s}],transformResponse:[function(s){const e=this.transitional||Co.transitional,t=e&&e.forcedJSONParsing,n=this.responseType==="json";if(se.isResponse(s)||se.isReadableStream(s))return s;if(s&&se.isString(s)&&(t&&!this.responseType||n)){const i=!(e&&e.silentJSONParsing)&&n;try{return JSON.parse(s,this.parseReviver)}catch(r){if(i)throw r.name==="SyntaxError"?$e.from(r,$e.ERR_BAD_RESPONSE,this,null,this.response):r}}return s}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:rn.classes.FormData,Blob:rn.classes.Blob},validateStatus:function(s){return s>=200&&s<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};se.forEach(["delete","get","head","post","put","patch"],s=>{Co.headers[s]={}});const FM=se.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),zM=s=>{const e={};let t,n,i;return s&&s.split(` +`).forEach(function(r){i=r.indexOf(":"),t=r.substring(0,i).trim().toLowerCase(),n=r.substring(i+1).trim(),!(!t||e[t]&&FM[t])&&(t==="set-cookie"?e[t]?e[t].push(n):e[t]=[n]:e[t]=e[t]?e[t]+", "+n:n)}),e},am=Symbol("internals");function Po(s){return s&&String(s).trim().toLowerCase()}function nl(s){return s===!1||s==null?s:se.isArray(s)?s.map(nl):String(s)}function HM(s){const e=Object.create(null),t=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let n;for(;n=t.exec(s);)e[n[1]]=n[2];return e}const VM=s=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(s.trim());function tu(s,e,t,n,i){if(se.isFunction(n))return n.call(this,e,t);if(i&&(e=t),!!se.isString(e)){if(se.isString(n))return e.indexOf(n)!==-1;if(se.isRegExp(n))return n.test(e)}}function GM(s){return s.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(e,t,n)=>t.toUpperCase()+n)}function WM(s,e){const t=se.toCamelCase(" "+e);["get","set","has"].forEach(n=>{Object.defineProperty(s,n+t,{value:function(i,r,o){return this[n].call(this,e,i,r,o)},configurable:!0})})}let _n=class{constructor(s){s&&this.set(s)}set(s,e,t){const n=this;function i(o,a,l){const c=Po(a);if(!c)throw new Error("header name must be a non-empty string");const h=se.findKey(n,c);(!h||n[h]===void 0||l===!0||l===void 0&&n[h]!==!1)&&(n[h||a]=nl(o))}const r=(o,a)=>se.forEach(o,(l,c)=>i(l,c,a));if(se.isPlainObject(s)||s instanceof this.constructor)r(s,e);else if(se.isString(s)&&(s=s.trim())&&!VM(s))r(zM(s),e);else if(se.isObject(s)&&se.isIterable(s)){let o={},a,l;for(const c of s){if(!se.isArray(c))throw TypeError("Object iterator must return a key-value pair");o[l=c[0]]=(a=o[l])?se.isArray(a)?[...a,c[1]]:[a,c[1]]:c[1]}r(o,e)}else s!=null&&i(e,s,t);return this}get(s,e){if(s=Po(s),s){const t=se.findKey(this,s);if(t){const n=this[t];if(!e)return n;if(e===!0)return HM(n);if(se.isFunction(e))return e.call(this,n,t);if(se.isRegExp(e))return e.exec(n);throw new TypeError("parser must be boolean|regexp|function")}}}has(s,e){if(s=Po(s),s){const t=se.findKey(this,s);return!!(t&&this[t]!==void 0&&(!e||tu(this,this[t],t,e)))}return!1}delete(s,e){const t=this;let n=!1;function i(r){if(r=Po(r),r){const o=se.findKey(t,r);o&&(!e||tu(t,t[o],o,e))&&(delete t[o],n=!0)}}return se.isArray(s)?s.forEach(i):i(s),n}clear(s){const e=Object.keys(this);let t=e.length,n=!1;for(;t--;){const i=e[t];(!s||tu(this,this[i],i,s,!0))&&(delete this[i],n=!0)}return n}normalize(s){const e=this,t={};return se.forEach(this,(n,i)=>{const r=se.findKey(t,i);if(r){e[r]=nl(n),delete e[i];return}const o=s?GM(i):String(i).trim();o!==i&&delete e[i],e[o]=nl(n),t[o]=!0}),this}concat(...s){return this.constructor.concat(this,...s)}toJSON(s){const e=Object.create(null);return se.forEach(this,(t,n)=>{t!=null&&t!==!1&&(e[n]=s&&se.isArray(t)?t.join(", "):t)}),e}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([s,e])=>s+": "+e).join(` +`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(s){return s instanceof this?s:new this(s)}static concat(s,...e){const t=new this(s);return e.forEach(n=>t.set(n)),t}static accessor(s){const e=(this[am]=this[am]={accessors:{}}).accessors,t=this.prototype;function n(i){const r=Po(i);e[r]||(WM(t,i),e[r]=!0)}return se.isArray(s)?s.forEach(n):n(s),this}};_n.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]),se.reduceDescriptors(_n.prototype,({value:s},e)=>{let t=e[0].toUpperCase()+e.slice(1);return{get:()=>s,set(n){this[t]=n}}}),se.freezeMethods(_n);function nu(s,e){const t=this||Co,n=e||t,i=_n.from(n.headers);let r=n.data;return se.forEach(s,function(o){r=o.call(t,r,i.normalize(),e?e.status:void 0)}),i.normalize(),r}function lm(s){return!!(s&&s.__CANCEL__)}function Tr(s,e,t){$e.call(this,s??"canceled",$e.ERR_CANCELED,e,t),this.name="CanceledError"}se.inherits(Tr,$e,{__CANCEL__:!0});function cm(s,e,t){const n=t.config.validateStatus;!t.status||!n||n(t.status)?s(t):e(new $e("Request failed with status code "+t.status,[$e.ERR_BAD_REQUEST,$e.ERR_BAD_RESPONSE][Math.floor(t.status/100)-4],t.config,t.request,t))}function XM(s){const e=/^([-+\w]{1,25})(:?\/\/|:)/.exec(s);return e&&e[1]||""}function jM(s,e){s=s||10;const t=new Array(s),n=new Array(s);let i=0,r=0,o;return e=e!==void 0?e:1e3,function(a){const l=Date.now(),c=n[r];o||(o=l),t[i]=a,n[i]=l;let h=r,u=0;for(;h!==i;)u+=t[h++],h=h%s;if(i=(i+1)%s,i===r&&(r=(r+1)%s),l-o{t=l,i=null,r&&(clearTimeout(r),r=null),s(...a)};return[(...a)=>{const l=Date.now(),c=l-t;c>=n?o(a,l):(i=a,r||(r=setTimeout(()=>{r=null,o(i)},n-c)))},()=>i&&o(i)]}const il=(s,e,t=3)=>{let n=0;const i=jM(50,250);return qM(r=>{const o=r.loaded,a=r.lengthComputable?r.total:void 0,l=o-n,c=i(l),h=o<=a;n=o;const u={loaded:o,total:a,progress:a?o/a:void 0,bytes:l,rate:c||void 0,estimated:c&&a&&h?(a-o)/c:void 0,event:r,lengthComputable:a!=null,[e?"download":"upload"]:!0};s(u)},t)},hm=(s,e)=>{const t=s!=null;return[n=>e[0]({lengthComputable:t,total:s,loaded:n}),e[1]]},um=s=>(...e)=>se.asap(()=>s(...e)),ZM=rn.hasStandardBrowserEnv?((s,e)=>t=>(t=new URL(t,rn.origin),s.protocol===t.protocol&&s.host===t.host&&(e||s.port===t.port)))(new URL(rn.origin),rn.navigator&&/(msie|trident)/i.test(rn.navigator.userAgent)):()=>!0,YM=rn.hasStandardBrowserEnv?{write(s,e,t,n,i,r,o){if(typeof document>"u")return;const a=[`${s}=${encodeURIComponent(e)}`];se.isNumber(t)&&a.push(`expires=${new Date(t).toUTCString()}`),se.isString(n)&&a.push(`path=${n}`),se.isString(i)&&a.push(`domain=${i}`),r===!0&&a.push("secure"),se.isString(o)&&a.push(`SameSite=${o}`),document.cookie=a.join("; ")},read(s){if(typeof document>"u")return null;const e=document.cookie.match(new RegExp("(?:^|; )"+s+"=([^;]*)"));return e?decodeURIComponent(e[1]):null},remove(s){this.write(s,"",Date.now()-864e5,"/")}}:{write(){},read(){return null},remove(){}};function KM(s){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(s)}function $M(s,e){return e?s.replace(/\/?\/$/,"")+"/"+e.replace(/^\/+/,""):s}function dm(s,e,t){let n=!KM(e);return s&&(n||t==!1)?$M(s,e):e}const fm=s=>s instanceof _n?{...s}:s;function bs(s,e){e=e||{};const t={};function n(c,h,u,d){return se.isPlainObject(c)&&se.isPlainObject(h)?se.merge.call({caseless:d},c,h):se.isPlainObject(h)?se.merge({},h):se.isArray(h)?h.slice():h}function i(c,h,u,d){if(se.isUndefined(h)){if(!se.isUndefined(c))return n(void 0,c,u,d)}else return n(c,h,u,d)}function r(c,h){if(!se.isUndefined(h))return n(void 0,h)}function o(c,h){if(se.isUndefined(h)){if(!se.isUndefined(c))return n(void 0,c)}else return n(void 0,h)}function a(c,h,u){if(u in e)return n(c,h);if(u in s)return n(void 0,c)}const l={url:r,method:r,data:r,baseURL:o,transformRequest:o,transformResponse:o,paramsSerializer:o,timeout:o,timeoutMessage:o,withCredentials:o,withXSRFToken:o,adapter:o,responseType:o,xsrfCookieName:o,xsrfHeaderName:o,onUploadProgress:o,onDownloadProgress:o,decompress:o,maxContentLength:o,maxBodyLength:o,beforeRedirect:o,transport:o,httpAgent:o,httpsAgent:o,cancelToken:o,socketPath:o,responseEncoding:o,validateStatus:a,headers:(c,h,u)=>i(fm(c),fm(h),u,!0)};return se.forEach(Object.keys({...s,...e}),function(c){const h=l[c]||i,u=h(s[c],e[c],c);se.isUndefined(u)&&h!==a||(t[c]=u)}),t}const pm=s=>{const e=bs({},s);let{data:t,withXSRFToken:n,xsrfHeaderName:i,xsrfCookieName:r,headers:o,auth:a}=e;if(e.headers=o=_n.from(o),e.url=im(dm(e.baseURL,e.url,e.allowAbsoluteUrls),s.params,s.paramsSerializer),a&&o.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):""))),se.isFormData(t)){if(rn.hasStandardBrowserEnv||rn.hasStandardBrowserWebWorkerEnv)o.setContentType(void 0);else if(se.isFunction(t.getHeaders)){const l=t.getHeaders(),c=["content-type","content-length"];Object.entries(l).forEach(([h,u])=>{c.includes(h.toLowerCase())&&o.set(h,u)})}}if(rn.hasStandardBrowserEnv&&(n&&se.isFunction(n)&&(n=n(e)),n||n!==!1&&ZM(e.url))){const l=i&&r&&YM.read(r);l&&o.set(i,l)}return e},JM=typeof XMLHttpRequest<"u",QM=JM&&function(s){return new Promise(function(e,t){const n=pm(s);let i=n.data;const r=_n.from(n.headers).normalize();let{responseType:o,onUploadProgress:a,onDownloadProgress:l}=n,c,h,u,d,f;function p(){d&&d(),f&&f(),n.cancelToken&&n.cancelToken.unsubscribe(c),n.signal&&n.signal.removeEventListener("abort",c)}let g=new XMLHttpRequest;g.open(n.method.toUpperCase(),n.url,!0),g.timeout=n.timeout;function x(){if(!g)return;const b=_n.from("getAllResponseHeaders"in g&&g.getAllResponseHeaders()),v={data:!o||o==="text"||o==="json"?g.responseText:g.response,status:g.status,statusText:g.statusText,headers:b,config:s,request:g};cm(function(y){e(y),p()},function(y){t(y),p()},v),g=null}"onloadend"in g?g.onloadend=x:g.onreadystatechange=function(){!g||g.readyState!==4||g.status===0&&!(g.responseURL&&g.responseURL.indexOf("file:")===0)||setTimeout(x)},g.onabort=function(){g&&(t(new $e("Request aborted",$e.ECONNABORTED,s,g)),g=null)},g.onerror=function(b){const v=b&&b.message?b.message:"Network Error",y=new $e(v,$e.ERR_NETWORK,s,g);y.event=b||null,t(y),g=null},g.ontimeout=function(){let b=n.timeout?"timeout of "+n.timeout+"ms exceeded":"timeout exceeded";const v=n.transitional||rm;n.timeoutErrorMessage&&(b=n.timeoutErrorMessage),t(new $e(b,v.clarifyTimeoutError?$e.ETIMEDOUT:$e.ECONNABORTED,s,g)),g=null},i===void 0&&r.setContentType(null),"setRequestHeader"in g&&se.forEach(r.toJSON(),function(b,v){g.setRequestHeader(v,b)}),se.isUndefined(n.withCredentials)||(g.withCredentials=!!n.withCredentials),o&&o!=="json"&&(g.responseType=n.responseType),l&&([u,f]=il(l,!0),g.addEventListener("progress",u)),a&&g.upload&&([h,d]=il(a),g.upload.addEventListener("progress",h),g.upload.addEventListener("loadend",d)),(n.cancelToken||n.signal)&&(c=b=>{g&&(t(!b||b.type?new Tr(null,s,g):b),g.abort(),g=null)},n.cancelToken&&n.cancelToken.subscribe(c),n.signal&&(n.signal.aborted?c():n.signal.addEventListener("abort",c)));const m=XM(n.url);if(m&&rn.protocols.indexOf(m)===-1){t(new $e("Unsupported protocol "+m+":",$e.ERR_BAD_REQUEST,s));return}g.send(i||null)})},e3=(s,e)=>{const{length:t}=s=s?s.filter(Boolean):[];if(e||t){let n=new AbortController,i;const r=function(c){if(!i){i=!0,a();const h=c instanceof Error?c:this.reason;n.abort(h instanceof $e?h:new Tr(h instanceof Error?h.message:h))}};let o=e&&setTimeout(()=>{o=null,r(new $e(`timeout ${e} of ms exceeded`,$e.ETIMEDOUT))},e);const a=()=>{s&&(o&&clearTimeout(o),o=null,s.forEach(c=>{c.unsubscribe?c.unsubscribe(r):c.removeEventListener("abort",r)}),s=null)};s.forEach(c=>c.addEventListener("abort",r));const{signal:l}=n;return l.unsubscribe=()=>se.asap(a),l}},t3=function*(s,e){let t=s.byteLength;if(t{const i=n3(s,e);let r=0,o,a=l=>{o||(o=!0,n&&n(l))};return new ReadableStream({async pull(l){try{const{done:c,value:h}=await i.next();if(c){a(),l.close();return}let u=h.byteLength;if(t){let d=r+=u;t(d)}l.enqueue(new Uint8Array(h))}catch(c){throw a(c),c}},cancel(l){return a(l),i.return()}},{highWaterMark:2})},gm=64*1024,{isFunction:sl}=se,s3=(({Request:s,Response:e})=>({Request:s,Response:e}))(se.global),{ReadableStream:xm,TextEncoder:vm}=se.global,bm=(s,...e)=>{try{return!!s(...e)}catch{return!1}},r3=s=>{s=se.merge.call({skipUndefined:!0},s3,s);const{fetch:e,Request:t,Response:n}=s,i=e?sl(e):typeof fetch=="function",r=sl(t),o=sl(n);if(!i)return!1;const a=i&&sl(xm),l=i&&(typeof vm=="function"?(p=>g=>p.encode(g))(new vm):async p=>new Uint8Array(await new t(p).arrayBuffer())),c=r&&a&&bm(()=>{let p=!1;const g=new t(rn.origin,{body:new xm,method:"POST",get duplex(){return p=!0,"half"}}).headers.has("Content-Type");return p&&!g}),h=o&&a&&bm(()=>se.isReadableStream(new n("").body)),u={stream:h&&(p=>p.body)};i&&["text","arrayBuffer","blob","formData","stream"].forEach(p=>{!u[p]&&(u[p]=(g,x)=>{let m=g&&g[p];if(m)return m.call(g);throw new $e(`Response type '${p}' is not supported`,$e.ERR_NOT_SUPPORT,x)})});const d=async p=>{if(p==null)return 0;if(se.isBlob(p))return p.size;if(se.isSpecCompliantForm(p))return(await new t(rn.origin,{method:"POST",body:p}).arrayBuffer()).byteLength;if(se.isArrayBufferView(p)||se.isArrayBuffer(p))return p.byteLength;if(se.isURLSearchParams(p)&&(p=p+""),se.isString(p))return(await l(p)).byteLength},f=async(p,g)=>se.toFiniteNumber(p.getContentLength())??d(g);return async p=>{let{url:g,method:x,data:m,signal:b,cancelToken:v,timeout:y,onDownloadProgress:M,onUploadProgress:E,responseType:A,headers:R,withCredentials:_="same-origin",fetchOptions:S}=pm(p),D=e||fetch;A=A?(A+"").toLowerCase():"text";let C=e3([b,v&&v.toAbortSignal()],y),B=null;const w=C&&C.unsubscribe&&(()=>{C.unsubscribe()});let F;try{if(E&&c&&x!=="get"&&x!=="head"&&(F=await f(R,m))!==0){let X=new t(g,{method:"POST",body:m,duplex:"half"}),Y;if(se.isFormData(m)&&(Y=X.headers.get("content-type"))&&R.setContentType(Y),X.body){const[ge,pe]=hm(F,il(um(E)));m=mm(X.body,gm,ge,pe)}}se.isString(_)||(_=_?"include":"omit");const W=r&&"credentials"in t.prototype,j={...S,signal:C,method:x.toUpperCase(),headers:R.normalize().toJSON(),body:m,duplex:"half",credentials:W?_:void 0};B=r&&new t(g,j);let $=await(r?D(B,S):D(g,j));const Z=h&&(A==="stream"||A==="response");if(h&&(M||Z&&w)){const X={};["status","statusText","headers"].forEach(de=>{X[de]=$[de]});const Y=se.toFiniteNumber($.headers.get("content-length")),[ge,pe]=M&&hm(Y,il(um(M),!0))||[];$=new n(mm($.body,gm,ge,()=>{pe&&pe(),w&&w()}),X)}A=A||"text";let re=await u[se.findKey(u,A)||"text"]($,p);return!Z&&w&&w(),await new Promise((X,Y)=>{cm(X,Y,{data:re,headers:_n.from($.headers),status:$.status,statusText:$.statusText,config:p,request:B})})}catch(W){throw w&&w(),W&&W.name==="TypeError"&&/Load failed|fetch/i.test(W.message)?Object.assign(new $e("Network Error",$e.ERR_NETWORK,p,B),{cause:W.cause||W}):$e.from(W,W&&W.code,p,B)}}},o3=new Map,ym=s=>{let e=s&&s.env||{};const{fetch:t,Request:n,Response:i}=e,r=[n,i,t];let o=r.length,a=o,l,c,h=o3;for(;a--;)l=r[a],c=h.get(l),c===void 0&&h.set(l,c=a?new Map:r3(e)),h=c;return c};ym();const iu={http:wM,xhr:QM,fetch:{get:ym}};se.forEach(iu,(s,e)=>{if(s){try{Object.defineProperty(s,"name",{value:e})}catch{}Object.defineProperty(s,"adapterName",{value:e})}});const _m=s=>`- ${s}`,a3=s=>se.isFunction(s)||s===null||s===!1;function l3(s,e){s=se.isArray(s)?s:[s];const{length:t}=s;let n,i;const r={};for(let o=0;o`adapter ${l} `+(c===!1?"is not supported by the environment":"is not available in the build"));let a=t?o.length>1?`since : +`+o.map(_m).join(` +`):" "+_m(o[0]):"as no adapter specified";throw new $e("There is no suitable adapter to dispatch the request "+a,"ERR_NOT_SUPPORT")}return i}const Mm={getAdapter:l3,adapters:iu};function su(s){if(s.cancelToken&&s.cancelToken.throwIfRequested(),s.signal&&s.signal.aborted)throw new Tr(null,s)}function wm(s){return su(s),s.headers=_n.from(s.headers),s.data=nu.call(s,s.transformRequest),["post","put","patch"].indexOf(s.method)!==-1&&s.headers.setContentType("application/x-www-form-urlencoded",!1),Mm.getAdapter(s.adapter||Co.adapter,s)(s).then(function(e){return su(s),e.data=nu.call(s,s.transformResponse,e),e.headers=_n.from(e.headers),e},function(e){return lm(e)||(su(s),e&&e.response&&(e.response.data=nu.call(s,s.transformResponse,e.response),e.response.headers=_n.from(e.response.headers))),Promise.reject(e)})}const Sm="1.13.2",rl={};["object","boolean","number","function","string","symbol"].forEach((s,e)=>{rl[s]=function(t){return typeof t===s||"a"+(e<1?"n ":" ")+s}});const Em={};rl.transitional=function(s,e,t){function n(i,r){return"[Axios v"+Sm+"] Transitional option '"+i+"'"+r+(t?". "+t:"")}return(i,r,o)=>{if(s===!1)throw new $e(n(r," has been removed"+(e?" in "+e:"")),$e.ERR_DEPRECATED);return e&&!Em[r]&&(Em[r]=!0,console.warn(n(r," has been deprecated since v"+e+" and will be removed in the near future"))),s?s(i,r,o):!0}},rl.spelling=function(s){return(e,t)=>(console.warn(`${t} is likely a misspelling of ${s}`),!0)};function c3(s,e,t){if(typeof s!="object")throw new $e("options must be an object",$e.ERR_BAD_OPTION_VALUE);const n=Object.keys(s);let i=n.length;for(;i-- >0;){const r=n[i],o=e[r];if(o){const a=s[r],l=a===void 0||o(a,r,s);if(l!==!0)throw new $e("option "+r+" must be "+l,$e.ERR_BAD_OPTION_VALUE);continue}if(t!==!0)throw new $e("Unknown option "+r,$e.ERR_BAD_OPTION)}}const ol={assertOptions:c3,validators:rl},ci=ol.validators;let ys=class{constructor(s){this.defaults=s||{},this.interceptors={request:new sm,response:new sm}}async request(s,e){try{return await this._request(s,e)}catch(t){if(t instanceof Error){let n={};Error.captureStackTrace?Error.captureStackTrace(n):n=new Error;const i=n.stack?n.stack.replace(/^.+\n/,""):"";try{t.stack?i&&!String(t.stack).endsWith(i.replace(/^.+\n.+\n/,""))&&(t.stack+=` +`+i):t.stack=i}catch{}}throw t}}_request(s,e){typeof s=="string"?(e=e||{},e.url=s):e=s||{},e=bs(this.defaults,e);const{transitional:t,paramsSerializer:n,headers:i}=e;t!==void 0&&ol.assertOptions(t,{silentJSONParsing:ci.transitional(ci.boolean),forcedJSONParsing:ci.transitional(ci.boolean),clarifyTimeoutError:ci.transitional(ci.boolean)},!1),n!=null&&(se.isFunction(n)?e.paramsSerializer={serialize:n}:ol.assertOptions(n,{encode:ci.function,serialize:ci.function},!0)),e.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?e.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:e.allowAbsoluteUrls=!0),ol.assertOptions(e,{baseUrl:ci.spelling("baseURL"),withXsrfToken:ci.spelling("withXSRFToken")},!0),e.method=(e.method||this.defaults.method||"get").toLowerCase();let r=i&&se.merge(i.common,i[e.method]);i&&se.forEach(["delete","get","head","post","put","patch","common"],f=>{delete i[f]}),e.headers=_n.concat(r,i);const o=[];let a=!0;this.interceptors.request.forEach(function(f){typeof f.runWhen=="function"&&f.runWhen(e)===!1||(a=a&&f.synchronous,o.unshift(f.fulfilled,f.rejected))});const l=[];this.interceptors.response.forEach(function(f){l.push(f.fulfilled,f.rejected)});let c,h=0,u;if(!a){const f=[wm.bind(this),void 0];for(f.unshift(...o),f.push(...l),u=f.length,c=Promise.resolve(e);h{if(!n._listeners)return;let r=n._listeners.length;for(;r-- >0;)n._listeners[r](i);n._listeners=null}),this.promise.then=i=>{let r;const o=new Promise(a=>{n.subscribe(a),r=a}).then(i);return o.cancel=function(){n.unsubscribe(r)},o},e(function(i,r,o){n.reason||(n.reason=new Tr(i,r,o),t(n.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;const t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}toAbortSignal(){const e=new AbortController,t=n=>{e.abort(n)};return this.subscribe(t),e.signal.unsubscribe=()=>this.unsubscribe(t),e.signal}static source(){let e;return{token:new Z0(function(t){e=t}),cancel:e}}};function u3(s){return function(e){return s.apply(null,e)}}function d3(s){return se.isObject(s)&&s.isAxiosError===!0}const ru={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(ru).forEach(([s,e])=>{ru[e]=s});function Tm(s){const e=new ys(s),t=Vp(ys.prototype.request,e);return se.extend(t,ys.prototype,e,{allOwnKeys:!0}),se.extend(t,e,null,{allOwnKeys:!0}),t.create=function(n){return Tm(bs(s,n))},t}const Lt=Tm(Co);Lt.Axios=ys,Lt.CanceledError=Tr,Lt.CancelToken=h3,Lt.isCancel=lm,Lt.VERSION=Sm,Lt.toFormData=tl,Lt.AxiosError=$e,Lt.Cancel=Lt.CanceledError,Lt.all=function(s){return Promise.all(s)},Lt.spread=u3,Lt.isAxiosError=d3,Lt.mergeConfig=bs,Lt.AxiosHeaders=_n,Lt.formToJSON=s=>om(se.isHTMLForm(s)?new FormData(s):s),Lt.getAdapter=Mm.getAdapter,Lt.HttpStatusCode=ru,Lt.default=Lt;const{Axios:lA,AxiosError:cA,CanceledError:hA,isCancel:uA,CancelToken:dA,VERSION:fA,all:pA,Cancel:mA,isAxiosError:gA,spread:xA,toFormData:vA,AxiosHeaders:bA,HttpStatusCode:yA,formToJSON:_A,getAdapter:MA,mergeConfig:wA}=Lt;function f3(s,e){var t;if(window.XMLHttpRequest?t=new XMLHttpRequest:window.ActiveXObject?t=new window.ActiveXObject:alert("请升级至最新版本的浏览器"),t!=null){let n=s;t.open("GET",n,!0),t.send(null),t.onreadystatechange=function(){t.readyState==4&&t.status==200&&(t.responseText.includes("",0)&&t.responseText.includes("",0)&&t.responseText.includes("",0)?e(null):e(t.responseText))},t.onloadend=function(){t.readyState==4&&t.status==404&&t.status==502&&e(null)}}}function p3(s,e){Lt({method:"get",responseType:"blob",url:s}).then(t=>{let n=new window.File([t.data],"zipFolder",{type:"zip"});Hp.loadAsync(n).then(i=>{const r=new Map,o=[];for(let a in i.files){if(i.files[a].dir)continue;const l=i.file(i.files[a].name);if(l){const c=l.async("blob").then(h=>{const u=URL.createObjectURL(h);r.set("/"+i.files[a].name.replace("\\","/"),u)});o.push(c)}}Promise.all(o).then(()=>{e(r)}).catch(a=>{console.error("解压zip文件失败:",a),e(new Map)})}).catch(i=>{console.error("加载zip文件失败:",i),e(new Map)})}).catch(t=>{console.error("下载zip文件失败:",t),e(new Map)})}function Am(s,e){Lt({method:"get",responseType:"blob",url:s}).then(n=>{let i=new window.File([n.data],"semantics",{type:"zip"});Hp.loadAsync(i).then(r=>{for(let o in r.files)r.file(r.files[o].name).async("blob").then(a=>{t(a,"utf-8",function(l,c){e(c)})})})});function t(n,i,r){var o=new FileReader,a=new Blob([n]);o.onload=function(l){r(null,l.target.result)},o.onerror=function(l){r(l.error,null)},o.readAsText(a,i)}}const ou=new WeakMap;class m3 extends hs{constructor(e){super(e),this.decoderPath="",this.decoderConfig={},this.decoderBinary=null,this.decoderPending=null,this.workerLimit=4,this.workerPool=[],this.workerNextTaskID=1,this.workerSourceURL="",this.defaultAttributeIDs={position:"POSITION",normal:"NORMAL",color:"COLOR",uv:"TEX_COORD"},this.defaultAttributeTypes={position:"Float32Array",normal:"Float32Array",color:"Float32Array",uv:"Float32Array"}}setDecoderPath(e){return this.decoderPath=e,this}setDecoderConfig(e){return this.decoderConfig=e,this}setWorkerLimit(e){return this.workerLimit=e,this}load(e,t,n,i){const r=new Ia(this.manager);r.setPath(this.path),r.setResponseType("arraybuffer"),r.setRequestHeader(this.requestHeader),r.setWithCredentials(this.withCredentials),r.load(e,o=>{this.parse(o,t,i)},n,i)}parse(e,t,n=()=>{}){this.decodeDracoFile(e,t,null,null,gt,n).catch(n)}decodeDracoFile(e,t,n,i,r=Rt,o=()=>{}){const a={attributeIDs:n||this.defaultAttributeIDs,attributeTypes:i||this.defaultAttributeTypes,useUniqueIDs:!!n,vertexColorSpace:r};return this.decodeGeometry(e,a).then(t).catch(o)}decodeGeometry(e,t){const n=JSON.stringify(t);if(ou.has(e)){const l=ou.get(e);if(l.key===n)return l.promise;if(e.byteLength===0)throw new Error("THREE.DRACOLoader: Unable to re-decode a buffer with different settings. Buffer has already been transferred.")}let i;const r=this.workerNextTaskID++,o=e.byteLength,a=this._getWorker(r,o).then(l=>(i=l,new Promise((c,h)=>{i._callbacks[r]={resolve:c,reject:h},i.postMessage({type:"decode",id:r,taskConfig:t,buffer:e},[e])}))).then(l=>this._createGeometry(l.geometry));return a.catch(()=>!0).then(()=>{i&&r&&this._releaseTask(i,r)}),ou.set(e,{key:n,promise:a}),a}_createGeometry(e){const t=new ht;e.index&&t.setIndex(new at(e.index.array,1));for(let n=0;n{n.load(e,i,void 0,r)})}preload(){return this._initDecoder(),this}_initDecoder(){if(this.decoderPending)return this.decoderPending;const e=typeof WebAssembly!="object"||this.decoderConfig.type==="js",t=[];return e?t.push(this._loadLibrary("draco_decoder.js","text")):(t.push(this._loadLibrary("draco_wasm_wrapper.js","text")),t.push(this._loadLibrary("draco_decoder.wasm","arraybuffer"))),this.decoderPending=Promise.all(t).then(n=>{const i=n[0];e||(this.decoderConfig.wasmBinary=n[1]);const r=g3.toString(),o=["/* draco decoder */",i,"","/* worker */",r.substring(r.indexOf("{")+1,r.lastIndexOf("}"))].join(` +`);this.workerSourceURL=URL.createObjectURL(new Blob([o]))}),this.decoderPending}_getWorker(e,t){return this._initDecoder().then(()=>{if(this.workerPool.lengthr._taskLoad?-1:1});const n=this.workerPool[this.workerPool.length-1];return n._taskCosts[e]=t,n._taskLoad+=t,n})}_releaseTask(e,t){e._taskLoad-=e._taskCosts[t],delete e._callbacks[t],delete e._taskCosts[t]}debug(){console.log("Task load: ",this.workerPool.map(e=>e._taskLoad))}dispose(){for(let e=0;e{const u=h.draco,d=new u.Decoder;try{const f=t(u,d,new Int8Array(l),c),p=f.attributes.map(g=>g.array.buffer);f.index&&p.push(f.index.array.buffer),self.postMessage({type:"decode",id:a.id,geometry:f},p)}catch(f){console.error(f),self.postMessage({type:"error",id:a.id,error:f.message})}finally{u.destroy(d)}});break}};function t(o,a,l,c){const h=c.attributeIDs,u=c.attributeTypes;let d,f;const p=a.GetEncodedGeometryType(l);if(p===o.TRIANGULAR_MESH)d=new o.Mesh,f=a.DecodeArrayToMesh(l,l.byteLength,d);else if(p===o.POINT_CLOUD)d=new o.PointCloud,f=a.DecodeArrayToPointCloud(l,l.byteLength,d);else throw new Error("THREE.DRACOLoader: Unexpected geometry type.");if(!f.ok()||d.ptr===0)throw new Error("THREE.DRACOLoader: Decoding failed: "+f.error_msg());const g={index:null,attributes:[]};for(const x in h){const m=self[u[x]];let b,v;if(c.useUniqueIDs)v=h[x],b=a.GetAttributeByUniqueId(d,v);else{if(v=a.GetAttributeId(d,o[h[x]]),v===-1)continue;b=a.GetAttribute(d,v)}const y=i(o,a,d,x,m,b);x==="color"&&(y.vertexColorSpace=c.vertexColorSpace),g.attributes.push(y)}return p===o.TRIANGULAR_MESH&&(g.index=n(o,a,d)),o.destroy(d),g}function n(o,a,l){const c=l.num_faces()*3,h=c*4,u=o._malloc(h);a.GetTrianglesUInt32Array(l,h,u);const d=new Uint32Array(o.HEAPF32.buffer,u,c).slice();return o._free(u),{array:d,itemSize:1}}function i(o,a,l,c,h,u){const d=l.num_points(),f=u.num_components(),p=r(o,h),g=f*h.BYTES_PER_ELEMENT,x=Math.ceil(g/4)*4,m=x/h.BYTES_PER_ELEMENT,b=d*g,v=d*x,y=o._malloc(b);a.GetAttributeDataArrayForAllPoints(l,u,p,b,y);const M=new h(o.HEAPF32.buffer,y,b/h.BYTES_PER_ELEMENT);let E;if(g===x)E=M.slice();else{E=new h(v/h.BYTES_PER_ELEMENT);let A=0;for(let R=0,_=M.length;R<_;R++){for(let S=0;S(s.ModelLoadStart="model-load-start",s.ModelLoadProgress="model-load-progress",s.ModelLoaded="model-loaded",s.ModelError="model-error",s.SelectionChanged="selection-changed",s.HoverChanged="hover-changed",s.Click="click",s.MouseMove="mouse-move",s.CameraChanged="camera-changed",s.CameraIdle="camera-idle",s.ViewportResize="viewport-resize",s.EngineFree="engine-free",s.EngineBusy="engine-busy",s))(Ar||{});function x3(s,e,t,n){let i=0,r=0,o=0,a=s.models.find(f=>f.url==t),l=e.circularMeps,c=e.rectMeps.filter(f=>f.type==="风管"),h=e.rectMeps.filter(f=>f.type==="桥架"),u=e.ellipseMeps,d=s.scene;if(new Xt,new ht,al(d,"InstancedMesh"),l&&l.length){let f=[];for(let p of l)p.color=new Ue(`rgb(${p.color})`),p.position={x:p.startPoint.X*.3048+i,y:p.startPoint.Z*.3048+r,z:-p.startPoint.Y*.3048+o},p.rotation={x:0,y:0,z:0},a.nodesMap.set(p.id,[p]),f.push(p);ll("Circle",d,f,2)}if(al(d,"InstancedMesh"),c&&c.length){let f=[];for(let p of c)p.color=new Ue(`rgb(${p.color})`),p.position={x:p.startPoint.X*.3048+i,y:p.startPoint.Z*.3048+r,z:-p.startPoint.Y*.3048+o},p.rotation={x:0,y:0,z:0},a.nodesMap.set(p.id,[p]),f.push(p);ll("Rect",d,f,3)}if(al(d,"InstancedMesh"),u&&u.length){let f=[];for(let p of u)p.color=new Ue(`rgb(${p.color})`),p.position={x:p.startPoint.X*.3048+i,y:p.startPoint.Z*.3048+r,z:-p.startPoint.Y*.3048+o},p.rotation={x:0,y:0,z:0},a.nodesMap.set(p.id,[p]),f.push(p);ll("Ellipse",d,f,4)}if(al(d,"InstancedMesh"),h&&h.length){let f=[];for(let p of h)p.color=new Ue(`rgb(${p.color})`),p.position={x:p.startPoint.X*.3048+i,y:p.startPoint.Z*.3048+r,z:-p.startPoint.Y*.3048+o},p.rotation={x:0,y:0,z:0},a.nodesMap.set(p.id,[p]),f.push(p);ll("Bridge",d,f,5)}}function al(s,e){let t=new ho(e.geometry,e.material,1);t.index=e.index,t.dataType=e.type,t.url=e.url,t.relativeIndex=e.relativeIndex,t.name="机电",s.add(t)}function ll(s,e,t,n,i){let r,o,a={width:1,height:1,length:1,diameter:1,color:new Ue,position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0}};switch(s){case"Rect":o=cl("Rect",a);break;case"Bridge":o=cl("Bridge",a);break;case"Circle":o=cl("Circle",a);break;case"Ellipse":o=cl("Ellipse",a);break}o&&(r=new ho(o.geometry,o.material,t.length));let l=[];for(var c=0;cd.endPoint.Z?1:-1)*Math.PI*.5,d.base_x!=null){var h=new P(d.base_x.X,0,-d.base_x.Y);b=(h.clone().cross(new P(0,0,1)).y<=0?1:-1)*h.angleTo(new P(0,0,1))+Math.PI*.5}}else b=(p.clone().sub(f.clone()).cross(new P(0,0,1)).y>0?-1:1)*p.clone().sub(f.clone()).angleTo(new P(0,0,1)),m=(d.startPoint.Z>d.endPoint.Z?1:-1)*p.clone().sub(f.clone()).angleTo(x.clone().sub(g.clone()));let y=new ze;const M=new mn(m,b,v,"YXZ");let E=y.clone().makeRotationFromEuler(M),A,R;s==="Circle"?(A=d.diameter,R=d.diameter):(A=d.width,R=d.height);let _=y.clone().makeScale(A,R,d.length);y.multiplyMatrices(E,_),y.setPosition(d.position.x,d.position.y,d.position.z),r.setMatrixAt(c,y.clone()),r.setColorAt(c,d.color),r.geometry.computeBoundingBox();let S=r.geometry.boundingBox.min.clone().applyMatrix4(y.clone()),D=r.geometry.boundingBox.max.clone().applyMatrix4(y.clone()),C=new P(Math.min(S.x,D.x),Math.min(S.y,D.y),Math.min(S.z,D.z)),B=new P(Math.max(S.x,D.x),Math.max(S.y,D.y),Math.max(S.z,D.z)),w=C.clone().add(B.clone()).multiplyScalar(.5),F={name:d.name,min:C,max:B,center:w,dbid:c,materialName:o.material.name},W=null,j=null;s==="Circle"&&(W={x:d.startPoint.X*.3048,y:d.startPoint.Z*.3048,z:-d.startPoint.Y*.3048},j={x:d.endPoint.X*.3048,y:d.endPoint.Z*.3048,z:-d.endPoint.Y*.3048},F.minC=W,F.maxC=j),l.push(F)}r.castShadow=!0,r.ElementInfos=l,r.name="rootModel",r.TypeName="InstancedMesh-Pipe",r.PipeType=s,r.MeshId=null,r.realMaterial=r.material.clone(),r.originalMaterial=r.material.clone();let u=[];u={geometry:r.geometry,matrix:r.matrix,position:r.position,rotation:r.rotation},r.meshs=u,r.instanceMatrix&&r.instanceMatrix.array&&(r.cloneInstanceMatrix=Array.from(r.instanceMatrix.array)),r.index=n,r.Version="V1",e.children[n]=r}function cl(s,e,t){let n=new kf;switch(e.width=e.width*.3048,e.height=e.height*.3048,e.diameter=e.diameter*.3048,s){case"Rect":n.moveTo(-e.width/2,-e.height/2),n.lineTo(-e.width/2,e.height/2),n.lineTo(e.width/2,e.height/2),n.lineTo(e.width/2,-e.height/2),n.lineTo(-e.width/2,-e.height/2);break;case"Ellipse":n.moveTo(-e.width/2,-e.height/2),n.lineTo(-e.width/2,e.height/2),n.lineTo(e.width/2,e.height/2),n.lineTo(e.width/2,-e.height/2),n.lineTo(-e.width/2,-e.height/2);break;case"Bridge":n.moveTo(-e.width/2,-e.height/2),n.lineTo(-e.width/2,e.height/2),n.lineTo(-e.width/2+.01,e.height/2),n.lineTo(-e.width/2+.01,-e.height/2+.01),n.lineTo(e.width/2-.01,-e.height/2+.01),n.lineTo(e.width/2-.01,e.height/2),n.lineTo(e.width/2,e.height/2),n.lineTo(e.width/2,-e.height/2),n.lineTo(-e.width/2,-e.height/2);break;case"Circle":n.moveTo(0,0),n.absarc(0,0,e.diameter*.5,0,Math.PI*2,!1);break}const i={depth:e.length*.3048,bevelEnabled:!1};return r(n,i,e.color,e.position,e.rotation);function r(o,a,l,c,h){let u=new Rh(o,a),d=new fv({color:l,side:Et}),f=new ut(u,d);return f.position.set(c.x,c.y,c.z),f.rotation._order="YXZ",f.rotation.set(h.x,h.y,h.z),f}}function v3(s,e=!1){const t=s[0].index!==null,n=new Set(Object.keys(s[0].attributes)),i=new Set(Object.keys(s[0].morphAttributes)),r={},o={},a=s[0].morphTargetsRelative,l=new ht;let c=0;for(let h=0;h=2.0 are supported."));return}const c=new J3(r,{path:t||this.resourcePath||"",crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager,ktx2Loader:this.ktx2Loader,meshoptDecoder:this.meshoptDecoder});c.fileLoader.setRequestHeader(this.requestHeader);for(let h=0;h=0&&a[u]===void 0&&console.warn('THREE.GLTFLoader: Unknown extension "'+u+'".')}}c.setExtensions(o),c.setPlugins(a),c.parse(n,i)}parseAsync(e,t){const n=this;return new Promise(function(i,r){n.parse(e,t,i,r)})}}function y3(){let s={};return{get:function(e){return s[e]},add:function(e,t){s[e]=t},remove:function(e){delete s[e]},removeAll:function(){s={}}}}const nt={KHR_BINARY_GLTF:"KHR_binary_glTF",KHR_DRACO_MESH_COMPRESSION:"KHR_draco_mesh_compression",KHR_LIGHTS_PUNCTUAL:"KHR_lights_punctual",KHR_MATERIALS_CLEARCOAT:"KHR_materials_clearcoat",KHR_MATERIALS_DISPERSION:"KHR_materials_dispersion",KHR_MATERIALS_IOR:"KHR_materials_ior",KHR_MATERIALS_SHEEN:"KHR_materials_sheen",KHR_MATERIALS_SPECULAR:"KHR_materials_specular",KHR_MATERIALS_TRANSMISSION:"KHR_materials_transmission",KHR_MATERIALS_IRIDESCENCE:"KHR_materials_iridescence",KHR_MATERIALS_ANISOTROPY:"KHR_materials_anisotropy",KHR_MATERIALS_UNLIT:"KHR_materials_unlit",KHR_MATERIALS_VOLUME:"KHR_materials_volume",KHR_TEXTURE_BASISU:"KHR_texture_basisu",KHR_TEXTURE_TRANSFORM:"KHR_texture_transform",KHR_MESH_QUANTIZATION:"KHR_mesh_quantization",KHR_MATERIALS_EMISSIVE_STRENGTH:"KHR_materials_emissive_strength",EXT_MATERIALS_BUMP:"EXT_materials_bump",EXT_TEXTURE_WEBP:"EXT_texture_webp",EXT_TEXTURE_AVIF:"EXT_texture_avif",EXT_MESHOPT_COMPRESSION:"EXT_meshopt_compression",EXT_MESH_GPU_INSTANCING:"EXT_mesh_gpu_instancing"};class _3{constructor(e){this.parser=e,this.name=nt.KHR_LIGHTS_PUNCTUAL,this.cache={refs:{},uses:{}}}_markDefs(){const e=this.parser,t=this.parser.json.nodes||[];for(let n=0,i=t.length;n=0)throw new Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures");return null}return t.loadTextureImage(e,r.source,o)}}class N3{constructor(e){this.parser=e,this.name=nt.EXT_TEXTURE_WEBP}loadTexture(e){const t=this.name,n=this.parser,i=n.json,r=i.textures[e];if(!r.extensions||!r.extensions[t])return null;const o=r.extensions[t],a=i.images[o.source];let l=n.textureLoader;if(a.uri){const c=n.options.manager.getHandler(a.uri);c!==null&&(l=c)}return n.loadTextureImage(e,o.source,l)}}class k3{constructor(e){this.parser=e,this.name=nt.EXT_TEXTURE_AVIF}loadTexture(e){const t=this.name,n=this.parser,i=n.json,r=i.textures[e];if(!r.extensions||!r.extensions[t])return null;const o=r.extensions[t],a=i.images[o.source];let l=n.textureLoader;if(a.uri){const c=n.options.manager.getHandler(a.uri);c!==null&&(l=c)}return n.loadTextureImage(e,o.source,l)}}class U3{constructor(e){this.name=nt.EXT_MESHOPT_COMPRESSION,this.parser=e}loadBufferView(e){const t=this.parser.json,n=t.bufferViews[e];if(n.extensions&&n.extensions[this.name]){const i=n.extensions[this.name],r=this.parser.getDependency("buffer",i.buffer),o=this.parser.options.meshoptDecoder;if(!o||!o.supported){if(t.extensionsRequired&&t.extensionsRequired.indexOf(this.name)>=0)throw new Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files");return null}return r.then(function(a){const l=i.byteOffset||0,c=i.byteLength||0,h=i.count,u=i.byteStride,d=new Uint8Array(a,l,c);return o.decodeGltfBufferAsync?o.decodeGltfBufferAsync(h,u,d,i.mode,i.filter).then(function(f){return f.buffer}):o.ready.then(function(){const f=new ArrayBuffer(h*u);return o.decodeGltfBuffer(new Uint8Array(f),h,u,d,i.mode,i.filter),f})})}else return null}}class O3{constructor(e){this.name=nt.EXT_MESH_GPU_INSTANCING,this.parser=e}createNodeMesh(e){const t=this.parser.json,n=t.nodes[e];if(!n.extensions||!n.extensions[this.name]||n.mesh===void 0)return null;const i=t.meshes[n.mesh];for(const l of i.primitives)if(l.mode!==Nn.TRIANGLES&&l.mode!==Nn.TRIANGLE_STRIP&&l.mode!==Nn.TRIANGLE_FAN&&l.mode!==void 0)return null;const r=n.extensions[this.name].attributes,o=[],a={};for(const l in r)o.push(this.parser.getDependency("accessor",r[l]).then(c=>(a[l]=c,a[l])));return o.length<1?null:(o.push(this.parser.createNodeMesh(e)),Promise.all(o).then(l=>{const c=l.pop(),h=c.isGroup?c.children:[c],u=l[0].count,d=[];for(const f of h){const p=new ze,g=new P,x=new Dn,m=new P(1,1,1),b=new ho(f.geometry,f.material,u);for(let v=0;v0||s.search(/^data\:image\/jpeg/)===0?"image/jpeg":s.search(/\.webp($|\?)/i)>0||s.search(/^data\:image\/webp/)===0?"image/webp":s.search(/\.ktx2($|\?)/i)>0||s.search(/^data\:image\/ktx2/)===0?"image/ktx2":"image/png"}const $3=new ze;class J3{constructor(e={},t={}){this.json=e,this.extensions={},this.plugins={},this.options=t,this.cache=new y3,this.associations=new Map,this.primitiveCache={},this.nodeCache={},this.meshCache={refs:{},uses:{}},this.cameraCache={refs:{},uses:{}},this.lightCache={refs:{},uses:{}},this.sourceCache={},this.textureCache={},this.nodeNamesUsed={};let n=!1,i=-1,r=!1,o=-1;if(typeof navigator<"u"){const a=navigator.userAgent;n=/^((?!chrome|android).)*safari/i.test(a)===!0;const l=a.match(/Version\/(\d+)/);i=n&&l?parseInt(l[1],10):-1,r=a.indexOf("Firefox")>-1,o=r?a.match(/Firefox\/([0-9]+)\./)[1]:-1}typeof createImageBitmap>"u"||n&&i<17||r&&o<98?this.textureLoader=new Zf(this.options.manager):this.textureLoader=new Nv(this.options.manager),this.textureLoader.setCrossOrigin(this.options.crossOrigin),this.textureLoader.setRequestHeader(this.options.requestHeader),this.fileLoader=new Ia(this.options.manager),this.fileLoader.setResponseType("arraybuffer"),this.options.crossOrigin==="use-credentials"&&this.fileLoader.setWithCredentials(!0)}setExtensions(e){this.extensions=e}setPlugins(e){this.plugins=e}parse(e,t){const n=this,i=this.json,r=this.extensions;this.cache.removeAll(),this.nodeCache={},this._invokeAll(function(o){return o._markDefs&&o._markDefs()}),Promise.all(this._invokeAll(function(o){return o.beforeRoot&&o.beforeRoot()})).then(function(){return Promise.all([n.getDependencies("scene"),n.getDependencies("animation"),n.getDependencies("camera")])}).then(function(o){const a={scene:o[0][i.scene||0],scenes:o[0],animations:o[1],cameras:o[2],asset:i.asset,parser:n,userData:{}};return _s(r,a,i),hi(a,i),Promise.all(n._invokeAll(function(l){return l.afterRoot&&l.afterRoot(a)})).then(function(){for(const l of a.scenes)l.updateMatrixWorld();e(a)})}).catch(t)}_markDefs(){const e=this.json.nodes||[],t=this.json.skins||[],n=this.json.meshes||[];for(let i=0,r=t.length;i{const l=this.associations.get(o);l!=null&&this.associations.set(a,l);for(const[c,h]of o.children.entries())r(h,a.children[c])};return r(n,i),i.name+="_instance_"+e.uses[t]++,i}_invokeOne(e){const t=Object.values(this.plugins);t.push(this);for(let n=0;n=2&&x.setY(_,E[A*l+1]),l>=3&&x.setZ(_,E[A*l+2]),l>=4&&x.setW(_,E[A*l+3]),l>=5)throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.")}x.normalized=p}return x})}loadTexture(e){const t=this.json,n=this.options,i=t.textures[e].source,r=t.images[i];let o=this.textureLoader;if(r.uri){const a=n.manager.getHandler(r.uri);a!==null&&(o=a)}return this.loadTextureImage(e,i,o)}loadTextureImage(e,t,n){const i=this,r=this.json,o=r.textures[e],a=r.images[t],l=(a.uri||a.bufferView)+":"+o.sampler;if(this.textureCache[l])return this.textureCache[l];const c=this.loadImageSource(t,n).then(function(h){h.flipY=!1,h.name=o.name||a.name||"",h.name===""&&typeof a.uri=="string"&&a.uri.startsWith("data:image/")===!1&&(h.name=a.uri);const u=(r.samplers||{})[o.sampler]||{};return h.magFilter=Im[u.magFilter]||$t,h.minFilter=Im[u.minFilter]||gi,h.wrapS=Bm[u.wrapS]||ni,h.wrapT=Bm[u.wrapT]||ni,h.generateMipmaps=!h.isCompressedTexture&&h.minFilter!==Kt&&h.minFilter!==$t,i.associations.set(h,{textures:e}),h}).catch(function(){return null});return this.textureCache[l]=c,c}loadImageSource(e,t){const n=this,i=this.json,r=this.options;if(this.sourceCache[e]!==void 0)return this.sourceCache[e].then(u=>u.clone());const o=i.images[e],a=self.URL||self.webkitURL;let l=o.uri||"",c=!1;if(o.bufferView!==void 0)l=n.getDependency("bufferView",o.bufferView).then(function(u){c=!0;const d=new Blob([u],{type:o.mimeType});return l=a.createObjectURL(d),l});else if(o.uri===void 0)throw new Error("THREE.GLTFLoader: Image "+e+" is missing URI and bufferView");const h=Promise.resolve(l).then(function(u){return new Promise(function(d,f){let p=d;t.isImageBitmapLoader===!0&&(p=function(g){const x=new Ht(g);x.needsUpdate=!0,d(x)}),t.load(Mo.resolveURL(u,r.path),p,void 0,f)})}).then(function(u){return c===!0&&a.revokeObjectURL(l),hi(u,o),u.userData.mimeType=o.mimeType||K3(o.uri),u}).catch(function(u){throw console.error("THREE.GLTFLoader: Couldn't load texture",l),u});return this.sourceCache[e]=h,h}assignTexture(e,t,n,i){const r=this;return this.getDependency("texture",n.index).then(function(o){if(!o)return null;if(n.texCoord!==void 0&&n.texCoord>0&&(o=o.clone(),o.channel=n.texCoord),r.extensions[nt.KHR_TEXTURE_TRANSFORM]){const a=n.extensions!==void 0?n.extensions[nt.KHR_TEXTURE_TRANSFORM]:void 0;if(a){const l=r.associations.get(o);o=r.extensions[nt.KHR_TEXTURE_TRANSFORM].extendTexture(o,a),r.associations.set(o,l)}}return i!==void 0&&(o.colorSpace=i),e[t]=o,o})}assignFinalMaterial(e){const t=e.geometry;let n=e.material;const i=t.attributes.tangent===void 0,r=t.attributes.color!==void 0,o=t.attributes.normal===void 0;if(e.isPoints){const a="PointsMaterial:"+n.uuid;let l=this.cache.get(a);l||(l=new Ef,gn.prototype.copy.call(l,n),l.color.copy(n.color),l.map=n.map,l.sizeAttenuation=!1,this.cache.add(a,l)),n=l}else if(e.isLine){const a="LineBasicMaterial:"+n.uuid;let l=this.cache.get(a);l||(l=new as,gn.prototype.copy.call(l,n),l.color.copy(n.color),l.map=n.map,this.cache.add(a,l)),n=l}if(i||r||o){let a="ClonedMaterial:"+n.uuid+":";i&&(a+="derivative-tangents:"),r&&(a+="vertex-colors:"),o&&(a+="flat-shading:");let l=this.cache.get(a);l||(l=n.clone(),r&&(l.vertexColors=!0),o&&(l.flatShading=!0),i&&(l.normalScale&&(l.normalScale.y*=-1),l.clearcoatNormalScale&&(l.clearcoatNormalScale.y*=-1)),this.cache.add(a,l),this.associations.set(l,this.associations.get(n))),n=l}e.material=n}getMaterialType(){return cs}loadMaterial(e){const t=this,n=this.json,i=this.extensions,r=n.materials[e];let o;const a={},l=r.extensions||{},c=[];if(l[nt.KHR_MATERIALS_UNLIT]){const u=i[nt.KHR_MATERIALS_UNLIT];o=u.getMaterialType(),c.push(u.extendParams(a,r,t))}else{const u=r.pbrMetallicRoughness||{};if(a.color=new Ue(1,1,1),a.opacity=1,Array.isArray(u.baseColorFactor)){const d=u.baseColorFactor;a.color.setRGB(d[0],d[1],d[2],Rt),a.opacity=d[3]}u.baseColorTexture!==void 0&&c.push(t.assignTexture(a,"map",u.baseColorTexture,gt)),a.metalness=u.metallicFactor!==void 0?u.metallicFactor:1,a.roughness=u.roughnessFactor!==void 0?u.roughnessFactor:1,u.metallicRoughnessTexture!==void 0&&(c.push(t.assignTexture(a,"metalnessMap",u.metallicRoughnessTexture)),c.push(t.assignTexture(a,"roughnessMap",u.metallicRoughnessTexture))),o=this._invokeOne(function(d){return d.getMaterialType&&d.getMaterialType(e)}),c.push(Promise.all(this._invokeAll(function(d){return d.extendMaterialParams&&d.extendMaterialParams(e,a)})))}r.doubleSided===!0&&(a.side=Et);const h=r.alphaMode||cu.OPAQUE;if(h===cu.BLEND?(a.transparent=!0,a.depthWrite=!1):(a.transparent=!1,h===cu.MASK&&(a.alphaTest=r.alphaCutoff!==void 0?r.alphaCutoff:.5)),r.normalTexture!==void 0&&o!==Xt&&(c.push(t.assignTexture(a,"normalMap",r.normalTexture)),a.normalScale=new ce(1,1),r.normalTexture.scale!==void 0)){const u=r.normalTexture.scale;a.normalScale.set(u,u)}if(r.occlusionTexture!==void 0&&o!==Xt&&(c.push(t.assignTexture(a,"aoMap",r.occlusionTexture)),r.occlusionTexture.strength!==void 0&&(a.aoMapIntensity=r.occlusionTexture.strength)),r.emissiveFactor!==void 0&&o!==Xt){const u=r.emissiveFactor;a.emissive=new Ue().setRGB(u[0],u[1],u[2],Rt)}return r.emissiveTexture!==void 0&&o!==Xt&&c.push(t.assignTexture(a,"emissiveMap",r.emissiveTexture,gt)),Promise.all(c).then(function(){const u=new o(a);return r.name&&(u.name=r.name),hi(u,r),t.associations.set(u,{materials:e}),r.extensions&&_s(i,u,r),u})}createUniqueName(e){const t=dt.sanitizeNodeName(e||"");return t in this.nodeNamesUsed?t+"_"+ ++this.nodeNamesUsed[t]:(this.nodeNamesUsed[t]=0,t)}loadGeometries(e){const t=this,n=this.extensions,i=this.primitiveCache;function r(a){return n[nt.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(a,t).then(function(l){return Nm(l,a,t)})}const o=[];for(let a=0,l=e.length;a0&&Z3(m,r),m.name=t.createUniqueName(r.name||"mesh_"+e),hi(m,r),x.extensions&&_s(i,m,x),t.assignFinalMaterial(m),u.push(m)}for(let f=0,p=u.length;f1?h=new xn:c.length===1?h=c[0]:h=new St,h!==c[0])for(let u=0,d=c.length;u1){const u=i.associations.get(h);i.associations.set(h,{...u})}return i.associations.get(h).nodes=e,h}),this.nodeCache[e]}loadScene(e){const t=this.extensions,n=this.json.scenes[e],i=this,r=new xn;n.name&&(r.name=i.createUniqueName(n.name)),hi(r,n),n.extensions&&_s(t,r,n);const o=n.nodes||[],a=[];for(let l=0,c=o.length;l{const u=new Map;for(const[d,f]of i.associations)(d instanceof gn||d instanceof Ht)&&u.set(d,f);return h.traverse(d=>{const f=i.associations.get(d);f!=null&&u.set(d,f)}),u};return i.associations=c(r),r})}_createAnimationTracks(e,t,n,i,r){const o=[],a=e.name?e.name:e.uuid,l=[];qi[r.path]===qi.weights?e.traverse(function(d){d.morphTargetInfluences&&l.push(d.name?d.name:d.uuid)}):l.push(a);let c;switch(qi[r.path]){case qi.weights:c=fr;break;case qi.rotation:c=pr;break;case qi.translation:case qi.scale:c=gr;break;default:switch(n.itemSize){case 1:c=fr;break;case 2:case 3:default:c=gr;break}break}const h=i.interpolation!==void 0?X3[i.interpolation]:qr,u=this._getArrayFromAccessor(n);for(let d=0,f=l.length;d{let r=JSON.parse(i);s.engineStatus.models.push({type:"light",info:r,name:r.baseInfo.name,status:"loading",url:e,elements:new Map}),s.models==null&&(s.models=[]),s.models.push({url:e,nodesMap:new Map,boundingBox:{min:new P(r.baseInfo.min.X*.3048,r.baseInfo.min.Z*.3048,-r.baseInfo.min.Y*.3048),max:new P(r.baseInfo.max.X*.3048,r.baseInfo.max.Z*.3048,-r.baseInfo.max.Y*.3048)}}),s.events.trigger(Ar.EngineFree,null)})}function tw(s){s.engineStatus.models.forEach(e=>{e.loadStatus==null&&(e.loadStatus={mep:!1,instance:!1,normal:!1}),e.status==="loading"&&e.type==="light"&&(e.loadStatus.modelMep!=!0&&(e.loadStatus.modelMep=!0,x3(s,e.info.modelMep,e.url)),e.loadStatus.normal!=!0&&nw(s,e))})}function nw(s,e){if(s.camera.position,e.size,e.info==null||e.info.lods==null)return;e.info.lods.forEach(n=>{if(n.status!=!0)if(n.glbs==null)console.log("加载GLB............."),n.glbs={},p3(e.url+n.path,i=>{f3(i.get("/nodes.json"),r=>{let o=JSON.parse(r),a=new Map;s.models.find(c=>c.url==e.url).nodesMap=a;let l=0;for(let c in o){o[c].forEach(d=>{d.glb=c,a.has(d.id)==!1?a.set(d.id,{infos:[d]}):a.get(d.id).infos.push(d)});let h=new b3;const u=new m3;u.setDecoderPath("/static/js/draco/"),u.preload(),h.setDRACOLoader(u),h.load(i.get(c+".glb"),d=>{n.glbs[c]=d.scene.children,l++,l==Object.keys(o).length&&s.engineStatus.isFree&&(s.events.trigger(Ar.EngineFree,null),s.viewCube.CameraGoHome())})}})});else{console.log("加载模型.............");let i=t(e,n,n.octreeBox),r=[],o=s.models.find(a=>a.url==e.url);i.forEach(a=>{o.nodesMap.has(a)&&o.nodesMap.get(a).infos.forEach(l=>{let c=n.glbs[l.glb][l.mesh];if(c!=null&&c.geometry!=null&&c.material!=null){let h=new ze;h.elements=l.matrix;let u=new ut(c.geometry.clone().applyMatrix4(h),c.material),d=new xt().setFromObject(u);l.box=d,l.mesh=u,u.name=a,u.glb=l.glb,u.url=e.url,r.push(u)}})}),console.log("加载模型数量",r.length),iw(e.url,s,r)}});function t(n,i,r){let o=[];if(r.status!=!0){if(!s.engineStatus.isFree)return o;let a=new P(r.min.X,r.min.Z,-r.min.Y),l=new P(r.max.X,r.max.Z,-r.max.Y);l.distanceTo(a);let c=s.camera.position,h=new P(a.x+l.x/2,a.y+l.y/2,a.z+l.z/2);c.distanceTo(h),r.elements.forEach(u=>{o.push(u)}),r.children.forEach(u=>{o.push(...t(n,i,u))}),r.children.findIndex(u=>u.status!=!0)==-1&&(r.status=!0),r.children.length==0&&(r.status=!0)}return o}}function iw(s,e,t){let n=[];t.forEach(i=>{n.findIndex(o=>o.glb==i.glb)==-1?n.push({glb:i.glb,meshes:[i],currentIndex:i.geometry.index.count,indexes:new Map}):(n.find(o=>o.glb==i.glb).meshes.push(i),n.find(o=>o.glb==i.glb).currentIndex+=i.geometry.index.count);let r=n.find(o=>o.glb==i.glb);r.indexes.set(Number(i.name),[r.currentIndex-i.geometry.index.count,r.currentIndex])}),n.forEach(i=>{let r=e.scene.children.find(o=>o instanceof ut&&o.url==s&&o.glb==i.glb);if(r!=null)r.castShadow=!0,r.receiveShadow=!0;else{let o=new ht;i.meshes.map(c=>c.material),o=v3(i.meshes.map(c=>c.geometry),!0);let a=new ut(o,i.meshes.map(c=>c.material));a.castShadow=!0,a.receiveShadow=!0,e.scene.add(a),a.index=e.scene.children.length-1,a.url=s,a.glb=i.glb,a.indexes=i.indexes,a.materialClone=i.meshes[0].material;let l=e.models.find(c=>c.url==s);if(l!=null){let c=0;i.indexes.forEach(h=>{l.nodesMap.get(Number(i.meshes[c].name)).indexes==null&&(l.nodesMap.get(Number(i.meshes[c].name)).indexes=[]),l.nodesMap.get(Number(i.meshes[c].name)).indexes.push([a.index,c++,h[0],h[1]])})}a.material instanceof Array?a.material.forEach(c=>{km(c)}):km(a.material)}})}function km(s){s.shadowSide=Pn,s.roughness=.6,s.metalness=0,s.side=Et,s.map!=null&&(s.map.colorSpace=gt,s.map.needsUpdate=!0,console.log("优化贴图")),s instanceof cs&&(s.map&&(s.map.colorSpace=gt,s.map.needsUpdate=!0),s.emissiveMap&&(s.emissiveMap.colorSpace=gt,s.emissiveMap.needsUpdate=!0),s.roughnessMap&&(s.roughnessMap.colorSpace=Rt,s.roughnessMap.needsUpdate=!0),s.metalnessMap&&(s.metalnessMap.colorSpace=Rt,s.metalnessMap.needsUpdate=!0),s.normalMap&&(s.normalMap.colorSpace=Rt,s.normalMap.needsUpdate=!0),s.aoMap&&(s.aoMap.colorSpace=Rt,s.aoMap.needsUpdate=!0),s.roughness=Math.max(.1,Math.min(1,s.roughness)),s.metalness=Math.max(0,Math.min(1,s.metalness)),s.envMapIntensity=s.envMapIntensity||1,s.needsUpdate=!0),s instanceof Kn&&(this.optimizeMaterial(s),s.transmissionMap&&(s.transmissionMap.colorSpace=Rt,s.transmissionMap.needsUpdate=!0),s.thicknessMap&&(s.thicknessMap.colorSpace=Rt,s.thicknessMap.needsUpdate=!0),s.transmission=Math.max(0,Math.min(1,s.transmission)),s.thickness=Math.max(0,Math.min(10,s.thickness))),s instanceof Xt&&s.map&&(s.map.colorSpace=gt,s.map.needsUpdate=!0),s instanceof Wf&&(s.map&&(s.map.colorSpace=gt,s.map.needsUpdate=!0),s.emissiveMap&&(s.emissiveMap.colorSpace=gt,s.emissiveMap.needsUpdate=!0))}class sw{engine;constructor(e){this.engine=e}async loadModels(e,t){for(const i of e)n(i)==="light"&&ew(this.engine,i);function n(i){const r=i.split(".").pop();return r==="glb"||r==="gltf"?"gltf":"light"}}}class rw{engine;isFree;highlightModels;hideModels;models;constructor(e){this.engine=e,this.isFree=!0,this.highlightModels=[],this.hideModels=[],this.models=[]}init(){this.engine.events.on(Ar.EngineFree,()=>{this.updateFree(!0),console.log("引擎空闲"),tw(this.engine)}),this.engine.events.on(Ar.EngineBusy,()=>{this.updateFree(!1),console.log("引擎繁忙")})}updateFree(e){this.isFree=e}closeAllFunction=()=>{}}class ow{listeners=new Map;on(e,t){this.listeners.has(e)||this.listeners.set(e,[]),this.listeners.get(e).push(t)}off(e,t){if(!this.listeners.has(e))return;const n=this.listeners.get(e),i=n.indexOf(t);i!==-1&&n.splice(i,1)}trigger(e,t){this.listeners.has(e)&&this.listeners.get(e).forEach(n=>{try{n(t)}catch(i){console.error(`Error in event listener for ${e}:`,i)}})}}class aw{engine;constructor(e){this.engine=e}init(){const e=new vr(16777215,2);e.position.set(10,20,10),e.castShadow=!0,e.shadow.mapSize.width=4096,e.shadow.mapSize.height=4096,e.shadow.camera.near=.1,e.shadow.camera.far=500,e.shadow.bias=-5e-5,e.shadow.normalBias=.02;const t=50;e.shadow.camera.left=-t,e.shadow.camera.right=t,e.shadow.camera.top=t,e.shadow.camera.bottom=-t,e.shadow.radius=2,this.engine.scene.add(e);const n=new Na(16777215,1);this.engine.scene.add(n)}}var Ti=(s=>(s.ModelLoadStart="model-load-start",s.ModelLoadProgress="model-load-progress",s.ModelLoaded="model-loaded",s.ModelError="model-error",s.SelectionChanged="selection-changed",s.HoverChanged="hover-changed",s.Click="click",s.MouseMove="mouse-move",s.CameraChanged="camera-changed",s.CameraIdle="camera-idle",s.EngineFree="engine-free",s.EngineBusy="engine-busy",s.MeasureChanged="measure-changed",s))(Ti||{});class lw{engine;behavior;isCtrlDown=!1;constructor(e){this.engine=e}init(){this.behavior=this.engine.handelBehaved,this.behavior.init(this)}active(){this.behavior.active()}disActive(){this.behavior.disActive()}handelKeyCtrlUp(){this.isCtrlDown=!1}handelKeyCtrlDown(){this.isCtrlDown=!0}handleMouseClick(e){if(this.handleMouseClickInstance(e.raycaster),e.catch){const t=e.catch;t.object,this.engine.events.trigger(Ti.Click,t);let n=t.object;this.isCtrlDown||this.engine.modelToolModule.unhighlightAllModels(),console.log([{url:n.url,ids:[n.name]}]),this.engine.controlModule.orbitControls.origin.set(t.point.x,t.point.y,t.point.z),this.engine.modelToolModule.highlightModel([{url:n.url,ids:[n.name]}])}else this.engine.modelToolModule.unhighlightAllModels()}handleMouseDoubleClick(e){if(e.catch){const n=e.catch;n.object,this.engine.events.trigger(Ti.Click,n);let i=n.object,r=this.engine.models.find(a=>a.url===i.url).nodesMap.get(i.name).infos.map(a=>a.box),o=t(r);this.engine.viewCube.zoomToModel(o)}function t(n){let i=new P(1e8,1e9,1e10),r=new P(-1e8,-1e9,-1e10);return n.forEach(o=>{o.min.xr.x&&(r.x=o.max.x),o.max.y>r.y&&(r.y=o.max.y),o.max.z>r.z&&(r.z=o.max.z)}),new xt(i,r)}}handleMouseClickInstance(e){return e.intersectObjects(this.engine.scene.children.filter(t=>t instanceof ho),!0)}}class cw{engine;highlightMaterial;hideMaterial;constructor(e){this.engine=e,this.highlightMaterial=new Xt({color:43775,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.5,side:Et}),this.hideMaterial=new Xt({color:0,depthTest:!1,depthWrite:!1,transparent:!0,opacity:0,side:Et})}highlightModel(e){e.forEach(t=>{t.ids.forEach(n=>{this.engine.models.find(i=>i.url==t.url).nodesMap.get(n).indexes.forEach(i=>{Um(this.engine.scene.children[i[0]]),this.engine.scene.children[i[0]].material[i[1]]=this.highlightMaterial})}),this.engine.engineStatus.highlightModels.push(t)})}unhighlightModel(e){e.forEach(t=>{t.ids.forEach(n=>{this.engine.models.find(i=>i.url==t.url).nodesMap.get(n).indexes.forEach(i=>{this.engine.scene.children[i[0]].material[i[1]]=this.engine.scene.children[i[0]].materialClone})})})}unhighlightAllModels(){this.engine.engineStatus.highlightModels.forEach(e=>{this.unhighlightModel([e])}),this.engine.engineStatus.highlightModels=[]}hideModel(e){e.forEach(t=>{t.ids.forEach(i=>{let r=this.engine.models.find(o=>o.url==t.url).nodesMap.get(i);this.engine.modelEdge.hideModelEdge(t.url,i),r.indexes.forEach(o=>{Um(this.engine.scene.children[o[0]]),this.engine.scene.children[o[0]].material[o[1]]=this.hideMaterial})});let n=this.engine.engineStatus.hideModels.find(i=>i.url==t.url);n!=null?n.ids.push(...t.ids):this.engine.engineStatus.hideModels.push({url:t.url,ids:t.ids}),this.engine.engineStatus.highlightModels=[]})}showModel(e){e.forEach(t=>{t.ids.forEach(n=>{let i=this.engine.models.find(r=>r.url==t.url).nodesMap.get(n);this.engine.modelEdge.showModelEdge(t.url,n),i.indexes.forEach(r=>{this.engine.scene.children[r[0]].material[r[1]]=this.engine.scene.children[r[0]].materialClone})}),this.engine.engineStatus.hideModels.push(t)})}isolateModel(e){const t=[];this.engine.models.forEach(i=>{const r=Array.from(i.nodesMap.keys());t.push({url:i.url,ids:r})});const n=[];t.forEach(i=>{const r=e.find(o=>o.url===i.url);if(r){const o=i.ids.filter(a=>!r.ids.includes(a));o.length>0&&n.push({url:i.url,ids:o})}else n.push(i)}),n.length>0&&this.hideModel(n)}showAllModels(){}setModelColor(e,t){e.material.color.set(t)}setAllModelsColor(e){this.engine.scene.children.forEach(t=>{t.isMesh})}restoreAllModelsColor(){this.engine.scene.children.forEach(e=>{e.isMesh})}getModelsBox(e){new xt;let t=[];return e.forEach(i=>{let r=this.engine.models.find(o=>o.url==i.url);i.ids.forEach(o=>{r.nodesMap.get(o).infos.forEach(a=>{t.push(a.box)})})}),n(t);function n(i){let r=new P(1e8,1e9,1e10),o=new P(-1e8,-1e9,-1e10);return i.forEach(a=>{a.min.xo.x&&(o.x=a.max.x),a.max.y>o.y&&(o.y=a.max.y),a.max.z>o.z&&(o.z=a.max.z)}),new xt(r,o)}}getModelDescription(e){}}function Um(s){(s.isSplit==null||s.isSplit==null||s.isSplit==!1)&&(s.isSplit=!0)}class kn{constructor(e,t,n){this.camera=e,this.renderer=t,this.scene=n,this.raycaster=new ds}raycaster;worldToScreenNormalized(e){const t=e.clone();return t.project(this.camera),new ce(t.x,t.y)}worldToScreen(e){const t=this.worldToScreenNormalized(e),n=this.renderer.domElement.width,i=this.renderer.domElement.height,r=(t.x+1)*n/2,o=(1-t.y)*i/2;return new ce(r,o)}screenToNormalized(e,t){const n=this.renderer.domElement.clientWidth,i=this.renderer.domElement.clientHeight,r=e/n*2-1,o=-(t/i*2-1);return new ce(r,o)}screenToWorld(e,t,n){if(!this.scene&&!n)return console.warn("WorldToScreen: 需要提供 scene 或 objects 参数才能进行屏幕坐标转世界坐标"),null;const i=this.screenToNormalized(e,t);this.raycaster.setFromCamera(i,this.camera);const r=n||this.scene.children,o=this.raycaster.intersectObjects(r,!0);return o.length>0?o[0].point:null}screenToWorldWithDepth(e,t,n=0){const i=this.screenToNormalized(e,t);this.raycaster.setFromCamera(i,this.camera);const r=new P;return this.raycaster.ray.at(n,r),r}updateCamera(e){this.camera=e}updateRenderer(e){this.renderer=e}updateScene(e){this.scene=e}}var du={exports:{}},hw=du.exports,Om;function uw(){return Om||(Om=1,(function(s,e){(function(t,n){s.exports=n()})(hw,function(){var t=function(){function n(f){return o.appendChild(f.dom),f}function i(f){for(var p=0;pl+1e3&&(h.update(1e3*c/(f-l),100),l=f,c=0,d)){var p=performance.memory;d.update(p.usedJSHeapSize/1048576,p.jsHeapSizeLimit/1048576)}return f},update:function(){a=this.end()},domElement:o,setMode:i}};return t.Panel=function(n,i,r){var o=1/0,a=0,l=Math.round,c=l(window.devicePixelRatio||1),h=80*c,u=48*c,d=3*c,f=2*c,p=3*c,g=15*c,x=74*c,m=30*c,b=document.createElement("canvas");b.width=h,b.height=u,b.style.cssText="width:80px;height:48px";var v=b.getContext("2d");return v.font="bold "+9*c+"px Helvetica,Arial,sans-serif",v.textBaseline="top",v.fillStyle=r,v.fillRect(0,0,h,u),v.fillStyle=i,v.fillText(n,d,f),v.fillRect(p,g,x,m),v.fillStyle=r,v.globalAlpha=.9,v.fillRect(p,g,x,m),{dom:b,update:function(y,M){o=Math.min(o,y),a=Math.max(a,y),v.fillStyle=r,v.globalAlpha=1,v.fillRect(0,0,h,g),v.fillStyle=i,v.fillText(l(y)+" "+n+" ("+l(o)+"-"+l(a)+")",d,f),v.drawImage(b,p+c,g,x-c,m,p,g,x-c,m),v.fillRect(p+x-c,g,c,m),v.fillStyle=r,v.globalAlpha=.9,v.fillRect(p+x-c,g,c,l((1-y/M)*m))}}},t})})(du)),du.exports}var dw=uw();const fw=Op(dw);var Pr=Object.freeze({Linear:Object.freeze({None:function(s){return s},In:function(s){return s},Out:function(s){return s},InOut:function(s){return s}}),Quadratic:Object.freeze({In:function(s){return s*s},Out:function(s){return s*(2-s)},InOut:function(s){return(s*=2)<1?.5*s*s:-.5*(--s*(s-2)-1)}}),Cubic:Object.freeze({In:function(s){return s*s*s},Out:function(s){return--s*s*s+1},InOut:function(s){return(s*=2)<1?.5*s*s*s:.5*((s-=2)*s*s+2)}}),Quartic:Object.freeze({In:function(s){return s*s*s*s},Out:function(s){return 1- --s*s*s*s},InOut:function(s){return(s*=2)<1?.5*s*s*s*s:-.5*((s-=2)*s*s*s-2)}}),Quintic:Object.freeze({In:function(s){return s*s*s*s*s},Out:function(s){return--s*s*s*s*s+1},InOut:function(s){return(s*=2)<1?.5*s*s*s*s*s:.5*((s-=2)*s*s*s*s+2)}}),Sinusoidal:Object.freeze({In:function(s){return 1-Math.sin((1-s)*Math.PI/2)},Out:function(s){return Math.sin(s*Math.PI/2)},InOut:function(s){return .5*(1-Math.sin(Math.PI*(.5-s)))}}),Exponential:Object.freeze({In:function(s){return s===0?0:Math.pow(1024,s-1)},Out:function(s){return s===1?1:1-Math.pow(2,-10*s)},InOut:function(s){return s===0?0:s===1?1:(s*=2)<1?.5*Math.pow(1024,s-1):.5*(-Math.pow(2,-10*(s-1))+2)}}),Circular:Object.freeze({In:function(s){return 1-Math.sqrt(1-s*s)},Out:function(s){return Math.sqrt(1- --s*s)},InOut:function(s){return(s*=2)<1?-.5*(Math.sqrt(1-s*s)-1):.5*(Math.sqrt(1-(s-=2)*s)+1)}}),Elastic:Object.freeze({In:function(s){return s===0?0:s===1?1:-Math.pow(2,10*(s-1))*Math.sin((s-1.1)*5*Math.PI)},Out:function(s){return s===0?0:s===1?1:Math.pow(2,-10*s)*Math.sin((s-.1)*5*Math.PI)+1},InOut:function(s){return s===0?0:s===1?1:(s*=2,s<1?-.5*Math.pow(2,10*(s-1))*Math.sin((s-1.1)*5*Math.PI):.5*Math.pow(2,-10*(s-1))*Math.sin((s-1.1)*5*Math.PI)+1)}}),Back:Object.freeze({In:function(s){var e=1.70158;return s===1?1:s*s*((e+1)*s-e)},Out:function(s){var e=1.70158;return s===0?0:--s*s*((e+1)*s+e)+1},InOut:function(s){var e=2.5949095;return(s*=2)<1?.5*(s*s*((e+1)*s-e)):.5*((s-=2)*s*((e+1)*s+e)+2)}}),Bounce:Object.freeze({In:function(s){return 1-Pr.Bounce.Out(1-s)},Out:function(s){return s<1/2.75?7.5625*s*s:s<2/2.75?7.5625*(s-=1.5/2.75)*s+.75:s<2.5/2.75?7.5625*(s-=2.25/2.75)*s+.9375:7.5625*(s-=2.625/2.75)*s+.984375},InOut:function(s){return s<.5?Pr.Bounce.In(s*2)*.5:Pr.Bounce.Out(s*2-1)*.5+.5}}),generatePow:function(s){return s===void 0&&(s=4),s=s1e4?1e4:s,{In:function(e){return Math.pow(e,s)},Out:function(e){return 1-Math.pow(1-e,s)},InOut:function(e){return e<.5?Math.pow(e*2,s)/2:(1-Math.pow(2-e*2,s))/2+.5}}}}),Lo=function(){return performance.now()},pw=(function(){function s(){this._tweens={},this._tweensAddedDuringUpdate={}}return s.prototype.getAll=function(){var e=this;return Object.keys(this._tweens).map(function(t){return e._tweens[t]})},s.prototype.removeAll=function(){this._tweens={}},s.prototype.add=function(e){this._tweens[e.getId()]=e,this._tweensAddedDuringUpdate[e.getId()]=e},s.prototype.remove=function(e){delete this._tweens[e.getId()],delete this._tweensAddedDuringUpdate[e.getId()]},s.prototype.update=function(e,t){e===void 0&&(e=Lo()),t===void 0&&(t=!1);var n=Object.keys(this._tweens);if(n.length===0)return!1;for(;n.length>0;){this._tweensAddedDuringUpdate={};for(var i=0;i1?r(s[t],s[t-1],t-n):r(s[i],s[i+1>t?t:i+1],n-i)},Utils:{Linear:function(s,e,t){return(e-s)*t+s}}},Fm=(function(){function s(){}return s.nextId=function(){return s._nextId++},s._nextId=0,s})(),pu=new pw,mw=(function(){function s(e,t){t===void 0&&(t=pu),this._object=e,this._group=t,this._isPaused=!1,this._pauseStart=0,this._valuesStart={},this._valuesEnd={},this._valuesStartRepeat={},this._duration=1e3,this._isDynamic=!1,this._initialRepeat=0,this._repeat=0,this._yoyo=!1,this._isPlaying=!1,this._reversed=!1,this._delayTime=0,this._startTime=0,this._easingFunction=Pr.Linear.None,this._interpolationFunction=fu.Linear,this._chainedTweens=[],this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._id=Fm.nextId(),this._isChainStopped=!1,this._propertiesAreSetUp=!1,this._goToEnd=!1}return s.prototype.getId=function(){return this._id},s.prototype.isPlaying=function(){return this._isPlaying},s.prototype.isPaused=function(){return this._isPaused},s.prototype.getDuration=function(){return this._duration},s.prototype.to=function(e,t){if(t===void 0&&(t=1e3),this._isPlaying)throw new Error("Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.");return this._valuesEnd=e,this._propertiesAreSetUp=!1,this._duration=t<0?0:t,this},s.prototype.duration=function(e){return e===void 0&&(e=1e3),this._duration=e<0?0:e,this},s.prototype.dynamic=function(e){return e===void 0&&(e=!1),this._isDynamic=e,this},s.prototype.start=function(e,t){if(e===void 0&&(e=Lo()),t===void 0&&(t=!1),this._isPlaying)return this;if(this._group&&this._group.add(this),this._repeat=this._initialRepeat,this._reversed){this._reversed=!1;for(var n in this._valuesStartRepeat)this._swapEndStartRepeatValues(n),this._valuesStart[n]=this._valuesStartRepeat[n]}if(this._isPlaying=!0,this._isPaused=!1,this._onStartCallbackFired=!1,this._onEveryStartCallbackFired=!1,this._isChainStopped=!1,this._startTime=e,this._startTime+=this._delayTime,!this._propertiesAreSetUp||t){if(this._propertiesAreSetUp=!0,!this._isDynamic){var i={};for(var r in this._valuesEnd)i[r]=this._valuesEnd[r];this._valuesEnd=i}this._setupProperties(this._object,this._valuesStart,this._valuesEnd,this._valuesStartRepeat,t)}return this},s.prototype.startFromCurrentValues=function(e){return this.start(e,!0)},s.prototype._setupProperties=function(e,t,n,i,r){for(var o in n){var a=e[o],l=Array.isArray(a),c=l?"array":typeof a,h=!l&&Array.isArray(n[o]);if(!(c==="undefined"||c==="function")){if(h){var u=n[o];if(u.length===0)continue;for(var d=[a],f=0,p=u.length;f"u"||r)&&(t[o]=a),l||(t[o]*=1),h?i[o]=n[o].slice().reverse():i[o]=t[o]||0}}},s.prototype.stop=function(){return this._isChainStopped||(this._isChainStopped=!0,this.stopChainedTweens()),this._isPlaying?(this._group&&this._group.remove(this),this._isPlaying=!1,this._isPaused=!1,this._onStopCallback&&this._onStopCallback(this._object),this):this},s.prototype.end=function(){return this._goToEnd=!0,this.update(1/0),this},s.prototype.pause=function(e){return e===void 0&&(e=Lo()),this._isPaused||!this._isPlaying?this:(this._isPaused=!0,this._pauseStart=e,this._group&&this._group.remove(this),this)},s.prototype.resume=function(e){return e===void 0&&(e=Lo()),!this._isPaused||!this._isPlaying?this:(this._isPaused=!1,this._startTime+=e-this._pauseStart,this._pauseStart=0,this._group&&this._group.add(this),this)},s.prototype.stopChainedTweens=function(){for(var e=0,t=this._chainedTweens.length;eo)return!1;t&&this.start(e,!0)}if(this._goToEnd=!1,ec)return 1;var x=Math.trunc(a/l),m=a-x*l,b=Math.min(m/n._duration,1);return b===0&&a===n._duration?1:b},u=h(),d=this._easingFunction(u);if(this._updateProperties(this._object,this._valuesStart,this._valuesEnd,d),this._onUpdateCallback&&this._onUpdateCallback(this._object,u),this._duration===0||a>=this._duration)if(this._repeat>0){var f=Math.min(Math.trunc((a-this._duration)/l)+1,this._repeat);isFinite(this._repeat)&&(this._repeat-=f);for(r in this._valuesStartRepeat)!this._yoyo&&typeof this._valuesEnd[r]=="string"&&(this._valuesStartRepeat[r]=this._valuesStartRepeat[r]+parseFloat(this._valuesEnd[r])),this._yoyo&&this._swapEndStartRepeatValues(r),this._valuesStart[r]=this._valuesStartRepeat[r];return this._yoyo&&(this._reversed=!this._reversed),this._startTime+=l*f,this._onRepeatCallback&&this._onRepeatCallback(this._object),this._onEveryStartCallbackFired=!1,!0}else{this._onCompleteCallback&&this._onCompleteCallback(this._object);for(var p=0,g=this._chainedTweens.length;p{x&&(y||(x(M),y=!0))}),x&&setTimeout(()=>{y||(x(!0),y=!0)},g+10)},n.CameraGoHome=function(){var p=s.octreeBox.getBoundingBox(),g=p.min.clone().add(p.max.clone()).multiplyScalar(.5);let x=new P(1,1,1);var m=p.max.distanceTo(p.min),b=g.clone().add(x.multiplyScalar(m));if(e.camera.isOrthographicCamera){var v=s.container.clientWidth/s.container.clientHeight,y=m*.6;e.camera.left=-y*v,e.camera.right=y*v,e.camera.top=y,e.camera.bottom=-y,e.camera.zoom=1,e.camera.updateProjectionMatrix()}l(e.camera.position,b,s.controls.target.clone(),g)},n.zoomToBox=function(p){var g=p.min.clone().add(p.max.clone()).multiplyScalar(.5);let x=e.camera.position.clone().sub(s.controls.target.clone()).normalize();var m=g.clone().add(x.multiplyScalar(1*p.max.distanceTo(p.min)));l(e.camera.position,m,s.controls.target.clone(),g)};function l(p,g,x,m,b,v,y=1e3,M){var E;b&&v?(E=new mu.Tween({x1:p.x,y1:p.y,z1:p.z,x2:x.x,y2:x.y,z2:x.z,_x:b._x,_y:b._y,_z:b._z,_w:b._w}),E.to({x1:g.x,y1:g.y,z1:g.z,x2:m.x,y2:m.y,z2:m.z,_x:v._x,_y:v._y,_z:v._z,_w:v._w},y)):(E=new mu.Tween({x1:p.x,y1:p.y,z1:p.z,x2:x.x,y2:x.y,z2:x.z}),E.to({x1:g.x,y1:g.y,z1:g.z,x2:m.x,y2:m.y,z2:m.z},y)),E.onUpdate(function(R){b&&v?(e.camera.quaternion._x=R._x,e.camera.quaternion._y=R._y,e.camera.quaternion._z=R._z,e.camera.quaternion._w=R._w):s.controls.auto=!0,e.camera.position.x=R.x1,e.camera.position.y=R.y1,e.camera.position.z=R.z1,s.controls.target.x=R.x2,s.controls.target.y=R.y2,s.controls.target.z=R.z2,s.controls.update(),n.RenderScene()}),E.onComplete(function(R){s.controls.auto=!1,n.RenderScene(),M&&M(!0),cancelAnimationFrame(i),i=null}),E.easing(mu.Easing.Cubic.InOut);function A(R){i=requestAnimationFrame(A),E.update()}E.start(),A()}function c(){r=document.createElement("div"),r.className="ViewCube",t.appendChild(r),o=document.createElement("div"),o.className="viewSettingWrapper",o.innerHTML="...",r.appendChild(o);var p=document.createElement("div");p.className="homeViewWrapper",p.addEventListener("mousedown",function(){console.log("归位"),n.CameraGoHome()}),r.appendChild(p);const g=document.createElement("div");g.className="cameraToggleWrapper",g.title="切换正交/透视视图",g.innerHTML="⊞",g.addEventListener("mousedown",function(y){y.stopPropagation(),console.log("切换视图"),n.ToggleCameraType(),b()}),r.appendChild(g);const x=document.createElement("div");x.className="screenshotWrapper",x.title="截图",x.innerHTML="📷",x.addEventListener("mousedown",function(y){y.stopPropagation(),console.log("截图"),n.TakeScreenshot(),b()}),r.appendChild(x);const m=document.createElement("div");m.className="fullscreenWrapper",m.title="全屏",m.innerHTML="⛶",m.addEventListener("mousedown",function(y){y.stopPropagation(),console.log("全屏"),n.ToggleFullscreen(),b()}),r.appendChild(m),o.addEventListener("mousedown",function(y){y.stopPropagation(),g.classList.contains("show")?(b(),console.log("隐藏功能按钮")):(v(),console.log("显示功能按钮"))});function b(){g.classList.remove("show"),x.classList.remove("show"),m.classList.remove("show")}function v(){g.classList.add("show"),x.classList.add("show"),m.classList.add("show")}}function h(){n.sceneOrtho=gw();var x=t.clientWidth,m=t.clientWidth,p=x>m?x/m:m/x,g=300;n.camera=new us(g*p/-2,g*p/2,g/2,g/-2,.01,1e4);var x=r.clientWidth,m=r.clientHeight,b=new Lp({alpha:!0});b.setSize(x,m),b.setClearAlpha(0),n.sceneOrtho.renderer=b;let v=new Na(16777215,.8);n.sceneOrtho.add(v),xw(r,b)}function u(){const p="/assets/viewcube/";let g=[{label:"右",icon:p+"cn_right.png"},{label:"左",icon:p+"cn_left.png"},{label:"顶",icon:p+"cn_top.png"},{label:"底",icon:p+"cn_bottom.png"},{label:"前",icon:p+"cn_front.png"},{label:"后",icon:p+"cn_back.png"}];var x=[];for(const b of g)x.push(new Xt({color:16777215,map:new Zf().load(b.icon)}));new Wf({color:255});var m=new ut(new Gi(110,110,110),x);n.sceneOrtho.add(m),d(122),r.addEventListener("mousedown",b=>{var v={};v.x=b.offsetX/r.clientWidth*2-1,v.y=-(b.offsetY/r.clientHeight)*2+1;var y=new ds;y.setFromCamera(v,n.camera);const M=y.intersectObjects(a,!1);M.length>0&&n.ToggleDirectionView(M[0].object.name)}),r.addEventListener("mousemove",b=>{var v={};v.x=b.offsetX/r.clientWidth*2-1,v.y=-(b.offsetY/r.clientHeight)*2+1;var y=new ds;y.setFromCamera(v,n.camera);const M=y.intersectObjects(a,!1);for(var E of a)E.material.opacity=.01;M.length>0&&(M[0].object.material.opacity=.2)})}function d(p){for(var g=p*.5-20,x=[{name:"right",a:30,b:75,c:75,point:new P(g,0,0)},{name:"back",a:75,b:75,c:30,point:new P(0,0,-g)},{name:"left",a:30,b:75,c:75,point:new P(-g,0,0)},{name:"front",a:75,b:75,c:30,point:new P(0,0,g)},{name:"top",a:75,b:30,c:75,point:new P(0,g,0)},{name:"button",a:75,b:30,c:75,point:new P(0,-g,0)}],m=[{name:"top_right_back",a:30,b:30,c:30,point:new P(-g,g,g)},{name:"button_front_right",a:30,b:30,c:30,point:new P(-g,-g,g)},{name:"top_front_right",a:30,b:30,c:30,point:new P(g,g,g)},{name:"button_right_back",a:30,b:30,c:30,point:new P(g,-g,g)},{name:"top_back_left",a:30,b:30,c:30,point:new P(-g,g,-g)},{name:"button_back_left",a:30,b:30,c:30,point:new P(-g,-g,-g)},{name:"top_left_front",a:30,b:30,c:30,point:new P(g,g,-g)},{name:"button_left_front",a:30,b:30,c:30,point:new P(g,-g,-g)}],b=[{name:"top_front",a:30,b:30,c:75,point:new P(g,g,0)},{name:"top_right",a:75,b:30,c:30,point:new P(0,g,g)},{name:"top_back",a:30,b:30,c:75,point:new P(-g,g,0)},{name:"top_left",a:75,b:30,c:30,point:new P(0,g,-g)},{name:"button_front",a:30,b:30,c:75,point:new P(g,-g,0)},{name:"button_right",a:75,b:30,c:30,point:new P(0,-g,g)},{name:"button_back",a:30,b:30,c:75,point:new P(-g,-g,0)},{name:"button_left",a:75,b:30,c:30,point:new P(0,-g,-g)},{name:"front_right",a:30,b:75,c:30,point:new P(g,0,g)},{name:"right_back",a:30,b:75,c:30,point:new P(-g,0,g)},{name:"back_left",a:30,b:75,c:30,point:new P(-g,0,-g)},{name:"left_front",a:30,b:75,c:30,point:new P(g,0,-g)}],v=0;v{let d=u.boundingBox.min,f=u.boundingBox.max;d.xi.x&&(i.x=f.x),f.y>i.y&&(i.y=f.y),f.z>i.z&&(i.z=f.z)});let r=Math.min(n.x,i.x),o=Math.min(n.y,i.y),a=Math.min(n.z,i.z),l=Math.max(n.x,i.x),c=Math.max(n.y,i.y),h=Math.max(n.z,i.z);return{min:new P(r,o,a),max:new P(l,c,h)}},e.rayInterationModel=function(t){let n=[];return s.engineStatus.models.forEach(r=>{r.info.lods.forEach(o=>{let a=o.octreeBox;i(t,a,r)})}),t.intersectObjects(n,!1);function i(r,o,a){if(o==null)return;let l=new P(o.min.X*.3048,o.min.Z*.3048,-o.min.Y*.3048),c=new P(o.max.X*.3048,o.max.Z*.3048,-o.max.Y*.3048),h=new P(Math.min(l.x,c.X),Math.min(l.y,c.y),Math.min(l.z,c.z)),u=new P(Math.max(c.x,l.x),Math.max(c.y,l.y),Math.max(c.z,l.z)),d=new xt(h,u),f=r.ray.intersectsBox(d);if(!(f==null||f==!1))if(o.children==null||o.children.length==0){if(o.elements!=null)for(var p of o.elements){let g=s.engineStatus.hideModels.find(m=>m.url==a.url)?.ids;if(g!=null&&g.includes(p))continue;s.models.find(m=>m.url==a.url).nodesMap.get(p)?.infos.map(m=>m.mesh).forEach(m=>{n.push(m)})}}else{if(o.elements!=null)for(var p of o.elements){let x=s.engineStatus.hideModels.find(b=>b.url==a.url)?.ids;if(x!=null&&x.includes(p))continue;s.models.find(b=>b.url==a.url).nodesMap.get(p)?.infos.map(b=>b.mesh).forEach(b=>{n.push(b)})}for(let g of o.children)i(r,g,a)}}},e}class _w{engine;isDrawing=!1;startPoint=new ce;endPoint=new ce;selectionBox=null;worldToScreen=null;boundMouseDown;boundMouseMove;boundMouseUp;boundKeyDown;constructor(e){this.engine=e,this.boundMouseDown=this.onMouseDown.bind(this),this.boundMouseMove=this.onMouseMove.bind(this),this.boundMouseUp=this.onMouseUp.bind(this),this.boundKeyDown=this.onKeyDown.bind(this)}init(){this.createSelectionBoxElement(),this.engine.scene&&this.engine.camera&&this.engine.renderer&&(this.worldToScreen=new kn(this.engine.camera,this.engine.renderer,this.engine.scene))}active(){this.engine.controlModule.disActive();const e=this.engine.renderer?.domElement;e&&(e.addEventListener("mousedown",this.boundMouseDown),e.addEventListener("mousemove",this.boundMouseMove),e.addEventListener("mouseup",this.boundMouseUp),e.style.cursor="crosshair"),window.addEventListener("keydown",this.boundKeyDown)}disActive(){this.engine.controlModule.active();const e=this.engine.renderer?.domElement;e&&(e.removeEventListener("mousedown",this.boundMouseDown),e.removeEventListener("mousemove",this.boundMouseMove),e.removeEventListener("mouseup",this.boundMouseUp),e.style.cursor="default"),window.removeEventListener("keydown",this.boundKeyDown),this.isDrawing&&this.endDrawing()}createSelectionBoxElement(){this.selectionBox=document.createElement("div"),this.selectionBox.style.position="absolute",this.selectionBox.style.border="2px dashed #00aaff",this.selectionBox.style.backgroundColor="rgba(0, 170, 255, 0.1)",this.selectionBox.style.pointerEvents="none",this.selectionBox.style.display="none",this.selectionBox.style.zIndex="1000",this.selectionBox.style.boxSizing="border-box";const e=this.engine.renderer?.domElement;e&&e.parentElement&&e.parentElement.appendChild(this.selectionBox)}onMouseDown(e){e.button!==0||!this.engine.renderer?.domElement||(this.startPoint.set(e.offsetX,e.offsetY),this.endPoint.copy(this.startPoint),this.isDrawing=!0,this.selectionBox&&(this.selectionBox.style.display="block",this.updateSelectionBoxUI()),e.preventDefault(),e.stopPropagation())}onMouseMove(e){!this.isDrawing||!this.engine.renderer?.domElement||(this.endPoint.set(e.offsetX,e.offsetY),this.updateSelectionBoxUI(),e.preventDefault(),e.stopPropagation())}onMouseUp(e){this.isDrawing&&(this.endDrawing(),this.performZoom(),e.preventDefault(),e.stopPropagation(),this.disActive())}onKeyDown(e){e.key==="Escape"&&(this.disActive(),e.preventDefault(),e.stopPropagation())}endDrawing(){this.isDrawing&&(this.isDrawing=!1,this.selectionBox&&(this.selectionBox.style.display="none"))}updateSelectionBoxUI(){if(!this.selectionBox||!this.engine.renderer?.domElement)return;const e=Math.min(this.startPoint.x,this.endPoint.x),t=Math.min(this.startPoint.y,this.endPoint.y),n=Math.abs(this.endPoint.x-this.startPoint.x),i=Math.abs(this.endPoint.y-this.startPoint.y);this.selectionBox.style.left=`${e}px`,this.selectionBox.style.top=`${t}px`,this.selectionBox.style.width=`${n}px`,this.selectionBox.style.height=`${i}px`}performZoom(){const e=Math.abs(this.endPoint.x-this.startPoint.x),t=Math.abs(this.endPoint.y-this.startPoint.y);if(e<5||t<5)return;if(!this.worldToScreen){console.warn("RangeScale: 坐标转换工具未初始化");return}const n=Math.min(this.startPoint.x,this.endPoint.x),i=Math.max(this.startPoint.x,this.endPoint.x),r=Math.min(this.startPoint.y,this.endPoint.y),o=Math.max(this.startPoint.y,this.endPoint.y),a=[],l=[{x:n,y:r},{x:i,y:r},{x:i,y:o},{x:n,y:o}];for(const h of l){const u=this.worldToScreen.screenToWorld(h.x,h.y);u&&a.push(u)}if(a.length<3){console.warn("RangeScale: 框选区域未命中模型,无法执行缩放操作");return}if(a.length<3){console.warn("RangeScale: 无法将屏幕区域转换为世界坐标");return}const c=new xt;for(const h of a)c.expandByPoint(h);if(c.isEmpty()){console.warn("RangeScale: 计算得到的包围盒无效");return}this.fitCameraToBoundingBox(c)}fitCameraToBoundingBox(e){const t=this.engine.camera,n=this.engine.controls;if(!t||!n){console.warn("RangeScale: 相机或控制器未初始化");return}const i=new P;e.getCenter(i);const r=new P;e.getSize(r);const o=Math.max(r.x,r.y,r.z);if(t instanceof sn){const a=t.fov*(Math.PI/180),l=o/(2*Math.tan(a/2))*1.2,c=new P;t.getWorldDirection(c);const h=i.clone().sub(t.position);c.dot(h.normalize())<0&&c.negate();const u=i.clone().sub(c.multiplyScalar(l));t.position.copy(u),n.target&&n.target.copy(i),t.lookAt(i),n.update()}else if(t instanceof us){const a=o*1.2,l=this.engine.renderer?.domElement,c=l?l.width/l.height:1;t.left=-a*c/2,t.right=a*c/2,t.top=a/2,t.bottom=-a/2,t.updateProjectionMatrix();const h=new P;t.getWorldDirection(h);const u=o*1.5,d=i.clone().sub(h.multiplyScalar(u));t.position.copy(d),n.target&&n.target.copy(i),t.lookAt(i),n.update()}}}class Mw{engine;ground=null;constructor(e){this.engine=e}init(){}setStatsVisible(e){this.engine.stats?.dom&&(this.engine.stats.dom.style.display=e?"block":"none")}setAmbientLightIntensity(e){const t=this.engine.scene.children.find(n=>n instanceof Na);t&&(t.intensity=e)}setAmbientLightColor(e){const t=this.engine.scene.children.find(n=>n instanceof Na);t&&t.color.set(e)}setDirectionalLightIntensity(e){const t=this.engine.scene.children.find(n=>n instanceof vr);t&&(t.intensity=e)}setDirectionalLightColor(e){const t=this.engine.scene.children.find(n=>n instanceof vr);t&&t.color.set(e)}setShadowQuality(e){const t=this.engine.scene.children.find(n=>n instanceof vr);if(t?.shadow){const n={low:1024,medium:2048,high:4096,ultra:8192}[e];t.shadow.mapSize.width=n,t.shadow.mapSize.height=n,t.shadow.map?.dispose(),t.shadow.map=null}}setDirectionalLightShadow(e){const t=this.engine.scene.children.find(n=>n instanceof vr);t&&(t.castShadow=e),this.engine.renderer&&(this.engine.renderer.shadowMap.enabled=e)}setGTAOEnabled(e){if(!this.engine.composerModule?.composer){console.warn("Composer not initialized");return}const t=this.engine.composerModule.composer,n=t.passes.find(i=>i instanceof bn);if(e)if(n)n.enabled=!0;else{const{width:i,height:r}=this.engine.deviceModule.getContainerSize(),o=new bn(this.engine.scene,this.engine.camera,i,r);o.output=bn.OUTPUT.Default,o.blendIntensity=.5,o.updateGtaoMaterial&&o.updateGtaoMaterial({radius:1,distanceExponent:1,thickness:1,scale:1,distanceFallOff:1,screenSpaceRadius:!0});const a=t.passes.findIndex(l=>l.constructor.name==="RenderPass");t.passes.splice(a+1,0,o)}else n&&(n.enabled=!1)}setSceneSaturation(e){if(!this.engine.composerModule?.saturationPass){console.warn("Saturation pass not initialized");return}this.engine.composerModule.saturationPass.uniforms.saturation.value=e}setSceneContrast(e){if(!this.engine.composerModule?.saturationPass){console.warn("Saturation pass not initialized");return}this.engine.composerModule.saturationPass.uniforms.contrast.value=e}setGroundEnabled(e,t){if(e)if(this.ground)this.ground.visible=!0;else{const n=t?.size??100,i=t?.color??8421504,r=t?.opacity??.3,o=new bo(n,n),a=new cs({color:i,transparent:!0,opacity:r,side:Et});this.ground=new ut(o,a),this.ground.rotation.x=-Math.PI/2,this.ground.position.y=0,this.ground.receiveShadow=!0,this.ground.name="ground",this.engine.scene.add(this.ground)}else this.ground&&(this.ground.visible=!1)}setHDRBackground(e){e?(this.engine.scene.background=e,this.engine.scene.environment=e):(this.engine.scene.background=null,this.engine.scene.environment=null)}}function Ai(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(s){var e=Math.random()*16|0,t=s=="x"?e:e&3|8;return t.toString(16)})}class Ci{engine;handelBehaved;constructor(e){this.engine=e,this.handelBehaved=qh(e),this.handelBehaved.init(this,null)}active(){this.handelBehaved.active()}disActive(){this.handelBehaved.disActive()}cancelCurrentSelectedAnnotation(){let e=this.engine.measure.annotationData;for(let t in e)e[t].forEach(n=>{n.highlight==!0&&(n.highlight=!1,n.container.classList.remove("Hight"),n.container.getElementsByTagName("svg")[0].classList.remove("Hight"))})}handelKeyEscDown(){this.cancelCurrentSelectedAnnotation();let e=this.engine.measure.annotationData;for(let t in e)for(let n=e[t].length-1;n>=0;n--){let i=e[t][n];i.isSelect==!0&&(i.container.remove(),e[t].splice(n,1))}this.engine.measure.clearAllPoints()}handelKeyDeleteDown(){let e=this.engine.measure.annotationData;for(let t in e)for(let n=e[t].length-1;n>=0;n--){let i=e[t][n];i.highlight==!0&&(i.container.remove(),e[t].splice(n,1))}}clearHighlight(){let e=this.engine.measure.annotationData;for(let t in e)e[t].forEach(n=>{n.highlight=!1,n.container.classList.remove("Hight"),n.container.getElementsByTagName("svg")[0].classList.remove("Hight")})}drawNormalAnnotation(){let e=this;this.engine.measure.annotationData.normalAnnotation.forEach(l=>{a(l)}),this.engine.measure.annotationData.elevationAnnotation.forEach(l=>{o(l)}),this.engine.measure.annotationData.coordinateAnnotation.forEach(l=>{r(l)}),this.engine.measure.annotationData.angleAnnotation.forEach(l=>{t(l)}),this.engine.measure.annotationData.areaAnnotation.forEach(l=>{n(l)}),this.engine.measure.annotationData.slopeAnnotation.forEach(l=>{i(l)});function t(l){if(l.container==null){let m=['','','','','','','',''+l.text+"",""].join("");l.container=document.createElement("div"),l.container.className="angle-annotation",l.container.id=l.id,l.container.style.pointerEvents="none",l.container.innerHTML=m,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0})}let c=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point1),h=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point2),u=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point3),d=e.engine.reactBoundingClientRect.left,f=e.engine.reactBoundingClientRect.top;c.x+=d,c.y+=f,h.x+=d,h.y+=f,u.x+=d,u.y+=f;let p=l.container;p.getElementsByTagName("circle")[0].setAttribute("cx",c.x),p.getElementsByTagName("circle")[0].setAttribute("cy",c.y),p.getElementsByTagName("circle")[1].setAttribute("cx",h.x),p.getElementsByTagName("circle")[1].setAttribute("cy",h.y),p.getElementsByTagName("circle")[2].setAttribute("cx",u.x),p.getElementsByTagName("circle")[2].setAttribute("cy",u.y),p.getElementsByTagName("polyline")[0].setAttribute("points",c.x+","+c.y+" "+h.x+","+h.y),p.getElementsByTagName("polyline")[1].setAttribute("points",h.x+","+h.y+" "+u.x+","+u.y);let g=h.x,x=h.y-30;p.getElementsByTagName("rect")[0].setAttribute("x",g-40),p.getElementsByTagName("rect")[0].setAttribute("y",x-12.5),p.getElementsByTagName("text")[0].setAttribute("x",g),p.getElementsByTagName("text")[0].setAttribute("y",x+4),p.getElementsByTagName("text")[0].innerHTML=l.text,p.style.top="0px",p.style.left="0px"}function n(l){if(l.container==null){let b=['','','','',''+l.text+"",""].join("");l.container=document.createElement("div"),l.container.className="area-annotation",l.container.id=l.id,l.container.innerHTML=b,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0})}if(!l.points||l.points.length<3)return;let c=e.engine.reactBoundingClientRect.left,h=e.engine.reactBoundingClientRect.top,u=[],d=0,f=0;for(let b=0;bb.x+","+b.y).join(" "),g=l.container;g.getElementsByTagName("polygon")[0].setAttribute("points",p),g.getElementsByTagName("polyline")[0].setAttribute("points",p);let x=d,m=f;g.getElementsByTagName("rect")[0].setAttribute("x",x-40),g.getElementsByTagName("rect")[0].setAttribute("y",m-12.5),g.getElementsByTagName("text")[0].setAttribute("x",x),g.getElementsByTagName("text")[0].setAttribute("y",m+4),g.getElementsByTagName("text")[0].innerHTML=l.text,g.style.top="0px",g.style.left="0px"}function i(l){if(l.container==null){let x=['',"",'','',"","",'','',''+l.text+"",""].join("");l.container=document.createElement("div"),l.container.className="slope-annotation",l.container.id=l.id,l.container.innerHTML=x,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0})}let c=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point1),h=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point2),u=e.engine.reactBoundingClientRect.left,d=e.engine.reactBoundingClientRect.top;c.x+=u,c.y+=d,h.x+=u,h.y+=d;let f=l.container;f.getElementsByTagName("polyline")[0].setAttribute("points",c.x+","+c.y+" "+h.x+","+h.y);let p=(c.x+h.x)/2,g=(c.y+h.y)/2-30;f.getElementsByTagName("rect")[0].setAttribute("x",p-50),f.getElementsByTagName("rect")[0].setAttribute("y",g-12.5),f.getElementsByTagName("text")[0].setAttribute("x",p),f.getElementsByTagName("text")[0].setAttribute("y",g+4),f.getElementsByTagName("text")[0].innerHTML=l.text,f.style.top="0px",f.style.left="0px"}function r(l){if(l.container==null){let m=['','','',''+l.textX+"",'',''+l.textY+"",'',''+l.textZ+"",""].join("");l.container=document.createElement("div"),l.container.className="coordinate-annotation",l.container.id=l.id,l.container.style.position="absolute",l.container.style.pointerEvents="none",l.container.innerHTML=m,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0})}let c=l.container,h=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point),u=e.engine.reactBoundingClientRect.left,d=e.engine.reactBoundingClientRect.top;h.x+=u,h.y+=d,c.style.top="0px",c.style.left="0px";let f=c.getElementsByTagName("circle")[0];f&&(f.setAttribute("cx",h.x),f.setAttribute("cy",h.y));let p=c.getElementsByTagName("rect"),g=c.getElementsByTagName("text"),x=-55;p[0]&&(p[0].setAttribute("x",h.x+10),p[0].setAttribute("y",h.y+10+x)),g[0]&&(g[0].setAttribute("x",h.x+10+40),g[0].setAttribute("y",h.y+10+16+x)),p[1]&&(p[1].setAttribute("x",h.x+10),p[1].setAttribute("y",h.y+10+30+x)),g[1]&&(g[1].setAttribute("x",h.x+10+40),g[1].setAttribute("y",h.y+10+46+x)),p[2]&&(p[2].setAttribute("x",h.x+10),p[2].setAttribute("y",h.y+10+60+x)),g[2]&&(g[2].setAttribute("x",h.x+10+40),g[2].setAttribute("y",h.y+10+76+x)),g[0]&&(g[0].innerHTML=l.textX),g[1]&&(g[1].innerHTML=l.textY),g[2]&&(g[2].innerHTML=l.textZ)}function o(l){if(l.container==null){let f=['','',''+l.text+"",'',""].join("");l.container=document.createElement("div"),l.container.className="elevation-annotation",l.container.id=l.id,l.container.style.position="absolute",l.container.style.pointerEvents="none",l.container.innerHTML=f,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0})}let c=l.container,h=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point),u=e.engine.reactBoundingClientRect.left,d=e.engine.reactBoundingClientRect.top;c.style.top=h.y+d-48+"px",c.style.left=h.x+u-16+"px",c.getElementsByTagName("text")[0].innerHTML=l.text}function a(l){if(l.container==null){let p=['','','','','',''+l.text+"",""].join("");l.container=document.createElement("div"),l.container.className="normal-annotation",l.container.id=l.id,l.container.innerHTML=p,e.engine.measure.annotationContainer.appendChild(l.container),l.container.getElementsByTagName("svg")[0].addEventListener("click",function(){e.clearHighlight(),l.container.getElementsByTagName("svg")[0].classList.add("Hight"),l.highlight=!0})}let c=l.container;if(l.point1==null||l.point2==null){c.style.display="none";return}else c.style.display="block";let h=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point1),u=new kn(e.engine.camera,e.engine.renderer,e.engine.scene).worldToScreen(l.point2),d=e.engine.reactBoundingClientRect.left,f=e.engine.reactBoundingClientRect.top;h.x+=d,h.y+=f,u.x+=d,u.y+=f,c.getElementsByTagName("polyline")[0].setAttribute("points",h.x+","+h.y+" "+u.x+","+u.y),c.getElementsByTagName("circle")[0].setAttribute("cx",h.x),c.getElementsByTagName("circle")[0].setAttribute("cy",h.y),c.getElementsByTagName("circle")[1].setAttribute("cx",u.x),c.getElementsByTagName("circle")[1].setAttribute("cy",u.y),c.getElementsByTagName("rect")[0].setAttribute("x",h.x*.5+u.x*.5-40),c.getElementsByTagName("rect")[0].setAttribute("y",h.y*.5+u.y*.5-12.5),c.getElementsByTagName("text")[0].setAttribute("x",h.x*.5+u.x*.5+40-40),c.getElementsByTagName("text")[0].setAttribute("y",h.y*.5+u.y*.5+16-12.5),c.getElementsByTagName("text")[0].innerHTML=l.text,c.style.top="0px",c.style.left="0px"}}}class ww{engine;isActive=!1;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ci(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.isActive=!0,this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active()}disActive(){this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}handleMouseClick(e){if(e.catch==null)return;if(this.points.length==0){this.points.push(e.catch.point);return}let t=this.engine.measure.annotationData.normalAnnotation.find(n=>n.isSelect==!0);t!=null&&(t.isSelect=!1)}handleMouseMove(e){if(e.catch==null||this.points.length==0)return;let t=this.engine.measure.annotationData.normalAnnotation.find(o=>o.isSelect==!0);t==null&&(t={text:null,id:Ai(),isSelect:!0},this.engine.measure.annotationData.normalAnnotation.push(t));let n=new ds(e.catch.point.clone().add(new P(0,.01,0)),new P(0,1,0));const i=this.engine.octreeBox.rayInterationModel(n);if(i.length===0){t.point2=null;return}let r=e.catch;t.point1=r.point,t.point2=i[0].point,t.text=t.point1.clone().distanceTo(t.point2.clone()).toFixed(2)+" m"}}class Sw{engine;tools;isActive=!1;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ci(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.isActive=!0,this.points=[],this.behavior=this.engine.handelBehaved,this.behavior.init(this,{showCatch:!0}),this.behavior.active()}disActive(){this.points=[],this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}handleMouseClick(e){if(e.catch==null)return;let t=e.catch;if(this.points.length==0)this.points.push(t.point);else if(this.points.length==1){let n=this.engine.measure.annotationData.normalAnnotation.find(i=>i.isSelect==!0);if(n==null)return;n.point2=t.point,n.isSelect=!1,this.points=[],this.engine.events.trigger(Ti.MeasureChanged,n)}}handleMouseMove(e){if(e.catch==null)return;let t=e.catch;if(t!=null&&this.points.length==1){let n=this.engine.measure.annotationData.normalAnnotation.find(i=>i.isSelect==!0);n==null&&(n={id:Ai(),point1:this.points[0].clone(),point2:t.point.clone(),text:this.points[0].clone().distanceTo(t.point.clone()).toFixed(2)+" m",isSelect:!0},this.engine.measure.annotationData.normalAnnotation.push(n)),n.point2=t.point,n.text=n.point1.clone().distanceTo(n.point2.clone()).toFixed(2)+" m",console.log("距离",n.text)}}}class Ew{engine;isActive=!1;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ci(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.isActive=!0,this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active()}disActive(){this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}handleMouseClick(e){if(e.catch==null)return;if(this.points.length==0){this.points.push(e.catch.point);return}let t=this.engine.measure.annotationData.normalAnnotation.find(n=>n.isSelect==!0);t!=null&&(t.isSelect=!1)}handleMouseMove(e){if(e.catch==null||this.points.length==0)return;let t=this.engine.measure.annotationData.normalAnnotation.find(o=>o.isSelect==!0);t==null&&(t={text:null,id:Ai(),isSelect:!0},this.engine.measure.annotationData.normalAnnotation.push(t));let n=new ds(e.catch.point.clone().add(e.catch.normal.clone().setLength(.01)),e.catch.normal);const i=this.engine.octreeBox.rayInterationModel(n);if(i.length==0){t.point2=null;return}let r=e.catch;t.point1=r.point,t.point2=i[0].point,t.text=t.point1.clone().distanceTo(t.point2.clone()).toFixed(2)+" m"}}class Tw{engine;isActive=!1;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ci(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active(),this.isActive=!0}disActive(){this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}handleMouseMove(e){if(e.catch==null)return;let t=this.engine.measure.annotationData.elevationAnnotation.find(n=>n.isSelect==!0);t==null&&(t={id:Ai(),point:e.catch.point.clone(),text:Math.round(e.catch.point.y)+" m",isSelect:!0},this.engine.measure.annotationData.elevationAnnotation.push(t)),t.point=e.catch.point.clone(),t.text=Math.round(e.catch.point.y)+" m"}handleMouseClick(e){if(e.catch==null)return;let t=this.engine.measure.annotationData.elevationAnnotation.find(n=>n.isSelect==!0);t!=null&&(t.isSelect=!1,t.point=e.catch.point.clone(),t.text=Math.round(e.catch.point.y)+" m",this.engine.events.trigger(Ti.MeasureChanged,t))}}class Aw{engine;isActive=!1;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ci(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active(),this.isActive=!0}disActive(){this.isActive=!1,this.behavior?.disActive()}clearAllPoints(){this.points=[]}handleMouseMove(e){if(e.catch==null)return;let t=this.engine.measure.annotationData.coordinateAnnotation.find(n=>n.isSelect==!0);t==null&&(t={id:Ai(),point:e.catch.point.clone(),text:Math.round(e.catch.point.y)+" m",isSelect:!0},this.engine.measure.annotationData.coordinateAnnotation.push(t)),t.point=e.catch.point.clone(),t.textX=Math.round(e.catch.point.x)+" m",t.textY=Math.round(e.catch.point.y)+" m",t.textZ=Math.round(e.catch.point.z)+" m"}handleMouseClick(e){if(e.catch==null)return;let t=this.engine.measure.annotationData.coordinateAnnotation.find(n=>n.isSelect==!0);t!=null&&(t.isSelect=!1,t.point=e.catch.point.clone(),t.textX=Math.round(e.catch.point.x)+" m",t.textY=Math.round(e.catch.point.y)+" m",t.textZ=Math.round(e.catch.point.z)+" m",this.engine.events.trigger(Ti.MeasureChanged,t))}}class Cw{engine;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ci(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.points=[],this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active()}disActive(){this.points=[],this.behavior?.disActive()}clearAllPoints(){this.points=[]}calculateAngle(e,t,n){const i=new P().subVectors(e,t),r=new P().subVectors(n,t),o=i.length(),a=r.length();if(o===0||a===0)return 0;const l=i.dot(r)/(o*a),c=Math.max(-1,Math.min(1,l));return Math.acos(c)*(180/Math.PI)}handleMouseClick(e){if(e.catch==null)return;let t=e.catch;if(this.points.length==0)this.points.push(t.point);else if(this.points.length==1)this.points.push(t.point);else if(this.points.length==2){let n=this.engine.measure.annotationData.angleAnnotation.find(i=>i.isSelect==!0);if(n==null)return;n.point3=t.point.clone(),n.angle=this.calculateAngle(n.point1,n.point2,n.point3),n.text=n.angle.toFixed(2)+"°",n.isSelect=!1,this.points=[],this.engine.events.trigger(Ti.MeasureChanged,n)}}handleMouseMove(e){if(e.catch==null)return;let t=this.tools.renderCatchElement(e.catch);if(t!=null&&this.points.length!=1&&this.points.length==2){let n=this.engine.measure.annotationData.angleAnnotation.find(i=>i.isSelect==!0);n==null&&(n={id:Ai(),point1:this.points[0].clone(),point2:this.points[1].clone(),point3:t.point.clone(),angle:0,text:"0.00°",isSelect:!0},this.engine.measure.annotationData.angleAnnotation.push(n)),n.point3=t.point.clone(),n.angle=this.calculateAngle(n.point1,n.point2,n.point3),n.text=n.angle.toFixed(2)+"°",console.log("角度",n.text)}}}class Pw{engine;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ci(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.points=[],this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active()}disActive(){this.points=[],this.behavior?.disActive()}clearAllPoints(){this.points=[]}calculateArea(e){if(e.length<3)return 0;let t=0;const n=e.length;for(let i=0;i=3){let n=this.engine.measure.annotationData.areaAnnotation.find(i=>i.isSelect==!0);n==null?(n={id:Ai(),points:this.points.map(i=>i.clone()),area:0,text:"0.00 m²",isSelect:!0},this.engine.measure.annotationData.areaAnnotation.push(n)):n.points=this.points.map(i=>i.clone()),n.area=this.calculateArea(n.points),n.text=n.area.toFixed(2)+" m²",console.log("面积",n.text)}}handleMouseMove(e){if(e.catch==null)return;let t=this.tools.renderCatchElement(e.catch);if(t!=null&&this.points.length>=2){let n=this.engine.measure.annotationData.areaAnnotation.find(i=>i.isSelect==!0);if(n==null){if(this.points.length>=2){let i=this.points.map(r=>r.clone());i.push(t.point.clone()),i.length>=3&&(n={id:Ai(),points:i,area:0,text:"0.00 m²",isSelect:!0},this.engine.measure.annotationData.areaAnnotation.push(n))}}else if(n.points.length>0){const i=n.points.length-1;n.points[i]=t.point.clone()}else n.points=this.points.map(i=>i.clone()),n.points.push(t.point.clone());n&&n.points.length>=3&&(n.area=this.calculateArea(n.points),n.text=n.area.toFixed(2)+" m²")}}finishMeasure(){let e=this.engine.measure.annotationData.areaAnnotation.find(t=>t.isSelect==!0);e!=null&&e.points.length>=3&&(e.points.length>this.points.length&&(e.points=this.points.map(t=>t.clone())),e.area=this.calculateArea(e.points),e.text=e.area.toFixed(2)+" m²",e.isSelect=!1,this.points=[],this.engine.events.trigger(Ti.MeasureChanged,e))}}class Rw{engine;tools;points=[];behavior;constructor(e){this.engine=e,this.tools=new Ci(e)}active(){this.engine.measure.tools.cancelCurrentSelectedAnnotation(),this.points=[],this.behavior=this.engine.handelBehaved,this.behavior.init(this),this.behavior.active()}disActive(){this.points=[],this.behavior?.disActive()}clearAllPoints(){this.points=[]}calculateSlope(e,t){const n=t.y-e.y,i=t.x-e.x,r=t.z-e.z,o=Math.sqrt(i*i+r*r);if(o===0)return{percentage:0,angle:0,heightDiff:n,horizontalDist:0};const a=n/o*100,l=Math.atan(n/o)*(180/Math.PI);return{percentage:a,angle:l,heightDiff:n,horizontalDist:o}}handleMouseClick(e){if(e.catch==null)return;let t=this.tools.renderCatchElement(e.catch);if(this.points.length==0)this.points.push(t.point);else if(this.points.length==1){let n=this.engine.measure.annotationData.slopeAnnotation.find(r=>r.isSelect==!0);if(n==null)return;n.point2=t.point.clone();const i=this.calculateSlope(n.point1,n.point2);n.slopePercentage=i.percentage,n.slopeAngle=i.angle,n.heightDiff=i.heightDiff,n.horizontalDist=i.horizontalDist,n.text=i.percentage.toFixed(2)+"% ("+i.angle.toFixed(2)+"°)",n.isSelect=!1,this.points=[],this.engine.events.trigger(Ti.MeasureChanged,n)}}handleMouseMove(e){if(e.catch==null)return;let t=this.tools.renderCatchElement(e.catch);if(t!=null&&this.points.length==1){let n=this.engine.measure.annotationData.slopeAnnotation.find(r=>r.isSelect==!0);n==null&&(n={id:Ai(),point1:this.points[0].clone(),point2:t.point.clone(),slopePercentage:0,slopeAngle:0,heightDiff:0,horizontalDist:0,text:"0.00% (0.00°)",isSelect:!0},this.engine.measure.annotationData.slopeAnnotation.push(n)),n.point2=t.point.clone();const i=this.calculateSlope(n.point1,n.point2);n.slopePercentage=i.percentage,n.slopeAngle=i.angle,n.heightDiff=i.heightDiff,n.horizontalDist=i.horizontalDist,n.text=i.percentage.toFixed(2)+"% ("+i.angle.toFixed(2)+"°)",console.log("坡度",n.text)}}}class Lw{isActive=!1;engine;clearHeightMeasure;distanceMeasure;clearDistanceMeasure;elevationMeasure;pointMeasure;angleMeasure;areaMeasure;slopeMeasure;tools;annotationContainer;annotationData={normalAnnotation:[],textAnnotation:[],coordinateAnnotation:[],angleAnnotation:[],distanceAnnotation:[],areaAnnotation:[],slopeAnnotation:[],elevationAnnotation:[],volumeAnnotation:[]};constructor(e){this.engine=e,this.clearHeightMeasure=new ww(e),this.distanceMeasure=new Sw(e),this.clearDistanceMeasure=new Ew(e),this.elevationMeasure=new Tw(e),this.pointMeasure=new Aw(e),this.angleMeasure=new Cw(e),this.areaMeasure=new Pw(e),this.slopeMeasure=new Rw(e),this.tools=new Ci(e),this.annotationContainer=document.createElement("div"),this.annotationContainer.className="annotation-container",e.container.parentElement.appendChild(this.annotationContainer)}active(){this.isActive=!0,this.tools.active()}disActive(){this.tools.disActive(),this.clearAll(),this.isActive=!1,this.clearHeightMeasure.disActive(),this.distanceMeasure.disActive(),this.clearDistanceMeasure.disActive(),this.elevationMeasure.disActive(),this.pointMeasure.disActive(),this.angleMeasure.disActive(),this.areaMeasure.disActive(),this.slopeMeasure.disActive(),this.engine.interactionModule.active()}clearAllPoints(){this.clearHeightMeasure.clearAllPoints(),this.distanceMeasure.clearAllPoints(),this.clearDistanceMeasure.clearAllPoints(),this.elevationMeasure.clearAllPoints(),this.pointMeasure.clearAllPoints(),this.angleMeasure.clearAllPoints(),this.areaMeasure.clearAllPoints(),this.slopeMeasure.clearAllPoints()}clearAll(){e(this.annotationData.normalAnnotation),e(this.annotationData.textAnnotation),e(this.annotationData.coordinateAnnotation),e(this.annotationData.angleAnnotation),e(this.annotationData.distanceAnnotation),e(this.annotationData.areaAnnotation),e(this.annotationData.slopeAnnotation),e(this.annotationData.elevationAnnotation),e(this.annotationData.volumeAnnotation);function e(t){for(let n=0;n{t.visible=!0}),this.engine.handelBehaved.init(this),this.engine.handelBehaved.active();let e=this;e.engine.scene.children.filter(t=>t.type=="Mesh"&&t.url).forEach(t=>{t.material&&Array.isArray(t.material)?t.material.forEach(n=>{n.clippingPlanes=e.engine.sectionPlane}):t.material.clippingPlanes=e.engine.sectionPlane,e.engine.clipping.clippingStencil?.addMesh(e.engine.sectionPlane.find(n=>n.name=="前"),t)})}disActive(){this.isActive=!1,this.engine.handelBehaved.disActive();const e=this.engine.sectionPlane.find(t=>t.name=="前");e&&(e.constant=1e5),this.meshs.forEach(t=>{t.visible=!1})}init(){let e=this.engine.octreeBox.getBoundingBox();this.box=e,this.updata_face(e)}updata_face(e){let t=this,n=t.engine.scene.children.find(o=>o.type=="Group"&&o.name=="ClippingBox");n==null&&(n=new xn,n.name="ClippingBox",t.engine.scene.add(n));let i=[new P(e.min.x,e.min.y,e.min.z),new P(e.max.x,e.min.y,e.min.z),new P(e.max.x,e.max.y,e.min.z),new P(e.min.x,e.max.y,e.min.z)];r(i,new P(0,0,-1),"前");function r(o,a,l){const c=new ht,h=new Float32Array([o[0].x,o[0].y,o[0].z,o[1].x,o[1].y,o[1].z,o[2].x,o[2].y,o[2].z,o[3].x,o[3].y,o[3].z]),u=[0,1,2,0,2,3];c.setAttribute("position",new at(h,3)),c.setIndex(u);let d=t.meshs.find(m=>m.name==l);if(d==null){const m=new Xt({color:65280,transparent:!0,opacity:.02,side:Et}),b=new ut(c,m);b.normal=a,b.name=l,n.add(b),t.meshs.push(b)}else d.geometry=c;const f=new Float32Array([o[0].x,o[0].y,o[0].z,o[1].x,o[1].y,o[1].z,o[2].x,o[2].y,o[2].z,o[3].x,o[3].y,o[3].z,o[0].x,o[0].y,o[0].z]);let p=new as({color:255}),g=new ht;g.setAttribute("position",new at(f,3));let x=t.meshs.find(m=>m.name==l+"Line");x==null&&(x=new Xi(g,p),x.name=l+"Line",n.add(x),t.meshs.push(x)),x.geometry=g,x.material=p,t.engine.sectionPlane.find(m=>m.name==l).setFromNormalAndCoplanarPoint(a.clone().setLength(-1),e.min)}}handleMouseDown(e){this.isDrag=!0;const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0)if(this.pickPoint=t[0].point,this.pickNormal=t[0].face.normal,this.engine.controls.enabled=!1,this.pickMesh=t[0].object,this.box_={min:this.box.min.clone(),max:this.box.max.clone()},this.pickNormal.y==0){const n=new yt;n.setFromNormalAndCoplanarPoint(new P(0,1,0),this.pickPoint),this.plane=n}else{let n=new P(this.engine.camera.position.x,this.pickPoint.y,this.engine.camera.position.z);const i=new yt;i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1),this.pickPoint),this.plane=i}}handleMouseUp(e){this.isDrag=!1,this.pickPoint=null,this.pickNormal=null,this.pickMesh=null,this.engine.controls.enabled=!0}handleMouseMove(e){this.meshs.forEach(n=>{n.material.opacity=0});const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0&&(t[0].object.material.opacity=.05),this.pickPoint!=null){const n=new P;if(e.raycaster.ray.intersectPlane(this.plane,n)){let i=n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());this.pickMesh.name=="前"||this.pickMesh.name=="左"||this.pickMesh.name=="底"?this.box.min=this.box_.min.clone().add(this.pickNormal.clone().setLength(i)):this.box.max=this.box_.max.clone().add(this.pickNormal.clone().setLength(i)),this.updata_face(this.box)}}}}const zm=0,Iw=1,Bw=2,Hm=2,gu=1.25,Vm=1,cn=32,qt=cn/4,Gm=65535,Nw=Math.pow(2,-24),xu=Symbol("SKIP_GENERATION");function kw(s){return s.index?s.index.count:s.attributes.position.count}function Ms(s){return kw(s)/3}function Uw(s,e=ArrayBuffer){return s>65535?new Uint32Array(new e(4*s)):new Uint16Array(new e(2*s))}function Ow(s,e){if(!s.index){const t=s.attributes.position.count,n=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,i=Uw(t,n);s.setIndex(new at(i,1));for(let r=0;ri&&(a.push({pos:Math.max(i,f),isStart:!0}),a.push({pos:Math.min(r,g),isStart:!1}))}a.sort((h,u)=>h.pos!==u.pos?h.pos-u.pos:h.type==="end"?-1:1);let l=0,c=null;for(const h of a){const u=h.pos;l!==0&&u!==c&&t.push({offset:c,count:u-c}),l+=h.isStart?1:-1,c=u}return t}function vu(s,e,t,n,i){let r=1/0,o=1/0,a=1/0,l=-1/0,c=-1/0,h=-1/0,u=1/0,d=1/0,f=1/0,p=-1/0,g=-1/0,x=-1/0;const m=s.offset||0;for(let b=(e-m)*6,v=(e+t-m)*6;bl&&(l=A),yp&&(p=y);const R=s[b+2],_=s[b+3],S=R-_,D=R+_;Sc&&(c=D),Rg&&(g=R);const C=s[b+4],B=s[b+5],w=C-B,F=C+B;wh&&(h=F),Cx&&(x=C)}n[0]=r,n[1]=o,n[2]=a,n[3]=l,n[4]=c,n[5]=h,i[0]=u,i[1]=d,i[2]=f,i[3]=p,i[4]=g,i[5]=x}function jm(s,e,t=null,n=null,i=null){const r=s.attributes.position,o=s.index?s.index.array:null,a=r.normalized;if(i===null)i=new Float32Array(t*6),i.offset=e;else if(e<0||t+e>i.length/6)throw new Error("MeshBVH: compute triangle bounds range is invalid.");const l=r.array,c=r.offset||0;let h=3;r.isInterleavedBufferAttribute&&(h=r.data.stride);const u=["getX","getY","getZ"],d=i.offset;for(let f=e,p=e+t;f_&&(_=E),A>_&&(_=A);const S=(_-R)/2,D=y*2;i[x+D+0]=R+S,i[x+D+1]=S+(Math.abs(R)+S)*Nw}}return i}function Dt(s,e,t){return t.min.x=e[s],t.min.y=e[s+1],t.min.z=e[s+2],t.max.x=e[s+3],t.max.y=e[s+4],t.max.z=e[s+5],t}function qm(s){let e=-1,t=-1/0;for(let n=0;n<3;n++){const i=s[n+3]-s[n];i>t&&(t=i,e=n)}return e}function Zm(s,e){e.set(s)}function Ym(s,e,t){let n,i;for(let r=0;r<3;r++){const o=r+3;n=s[r],i=e[r],t[r]=ni?n:i}}function hl(s,e,t){for(let n=0;n<3;n++){const i=e[s+2*n],r=e[s+2*n+1],o=i-r,a=i+r;ot[n+3]&&(t[n+3]=a)}}function Do(s){const e=s[3]-s[0],t=s[4]-s[1],n=s[5]-s[2];return 2*(e*t+t*n+n*e)}const Pi=32,Fw=(s,e)=>s.candidate-e.candidate,Zi=new Array(Pi).fill().map(()=>({count:0,bounds:new Float32Array(6),rightCacheBounds:new Float32Array(6),leftCacheBounds:new Float32Array(6),candidate:0})),ul=new Float32Array(6);function zw(s,e,t,n,i,r){let o=-1,a=0;if(r===zm)o=qm(e),o!==-1&&(a=(e[o]+e[o+3])/2);else if(r===Iw)o=qm(s),o!==-1&&(a=Hw(t,n,i,o));else if(r===Bw){const l=Do(s);let c=gu*i;const h=t.offset||0,u=(n-h)*6,d=(n+i-h)*6;for(let f=0;f<3;f++){const p=e[f],g=(e[f+3]-p)/Pi;if(i=E.candidate?hl(v,t,E.rightCacheBounds):(hl(v,t,E.leftCacheBounds),E.count++)}}for(let v=0;v=Pi&&(v=Pi-1);const y=Zi[v];y.count++,hl(b,t,y.bounds)}const x=Zi[Pi-1];Zm(x.bounds,x.rightCacheBounds);for(let b=Pi-2;b>=0;b--){const v=Zi[b],y=Zi[b+1];Ym(v.bounds,y.rightCacheBounds,v.rightCacheBounds)}let m=0;for(let b=0;b=l;)a--;if(o=l;)a--;if(oWw)throw new Error("MeshBVH: Cannot store relative child node offset greater than 32 bits.");return dl[t+6]=d,dl[t+7]=l,Mu(h,a)}}function jw(s,e,t){const n=(s.index?s.index.count:s.attributes.position.count)/3>65536,i=t.reduce((c,h)=>c+h.count,0),r=n?4:2,o=e?new SharedArrayBuffer(i*r):new ArrayBuffer(i*r),a=n?new Uint32Array(o):new Uint16Array(o);let l=0;for(let c=0;c=r&&(m=!0,o&&(console.warn(`MeshBVH: Max depth of ${r} reached when generating BVH. Consider increasing maxDepth.`),console.warn(d))),A<=a||_>=r)return v(E+A),M.offset=E,M.count=A,M;const S=zw(M.boundingData,R,e,E,A,l);if(S.axis===-1)return v(E+A),M.offset=E,M.count=A,M;const D=p(u,f,e,E,A,S);if(D===E||D===E+A)v(E+A),M.offset=E,M.count=A;else{M.splitAxis=S.axis;const C=new bu,B=E,w=D-E;M.left=C,vu(e,B,w,C.boundingData,x),y(C,B,w,x,_+1);const F=new bu,W=D,j=A-w;M.right=F,vu(e,W,j,F.boundingData,x),y(F,W,j,x,_+1)}return M}}function Zw(s,e){const t=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,n=s.geometry;let i,r;if(e.indirect){const o=Xm(n,e.range),a=jw(n,e.useSharedArrayBuffer,o);s._indirectBuffer=a,i=jm(n,0,a.length,a),r=[{offset:0,count:a.length}]}else{Ow(n,e);const o=Wm(n,e.range)[0];i=jm(n,o.offset,o.count),r=Xm(n,e.range)}s._roots=r.map(o=>{const a=qw(s,i,o.offset,o.count,e),l=_u(a),c=new t(cn*l);return Xw(0,a,c),c})}class Ri{constructor(){this.min=1/0,this.max=-1/0}setFromPointsField(e,t){let n=1/0,i=-1/0;for(let r=0,o=e.length;ri?a:i}this.min=n,this.max=i}setFromPoints(e,t){let n=1/0,i=-1/0;for(let r=0,o=t.length;ri?l:i}this.min=n,this.max=i}isSeparated(e){return this.min>e.max||e.min>this.max}}Ri.prototype.setFromBox=(function(){const s=new P;return function(e,t){const n=t.min,i=t.max;let r=1/0,o=-1/0;for(let a=0;a<=1;a++)for(let l=0;l<=1;l++)for(let c=0;c<=1;c++){s.x=n.x*a+i.x*(1-a),s.y=n.y*l+i.y*(1-l),s.z=n.z*c+i.z*(1-c);const h=e.dot(s);r=Math.min(h,r),o=Math.max(h,o)}this.min=r,this.max=o}})();const Yw=(function(){const s=new P,e=new P,t=new P;return function(n,i,r){const o=n.start,a=s,l=i.start,c=e;t.subVectors(o,l),s.subVectors(n.end,n.start),e.subVectors(i.end,i.start);const h=t.dot(c),u=c.dot(a),d=c.dot(c),f=t.dot(a),p=a.dot(a)*d-u*u;let g,x;p!==0?g=(h*u-f*d)/p:g=0,x=(h+g*u)/d,r.x=g,r.y=x}})(),wu=(function(){const s=new ce,e=new P,t=new P;return function(n,i,r,o){Yw(n,i,s);let a=s.x,l=s.y;if(a>=0&&a<=1&&l>=0&&l<=1){n.at(a,r),i.at(l,o);return}else if(a>=0&&a<=1){l<0?i.at(0,o):i.at(1,o),n.closestPointToPoint(o,!0,r);return}else if(l>=0&&l<=1){a<0?n.at(0,r):n.at(1,r),i.closestPointToPoint(r,!0,o);return}else{let c;a<0?c=n.start:c=n.end;let h;l<0?h=i.start:h=i.end;const u=e,d=t;if(n.closestPointToPoint(h,!0,e),i.closestPointToPoint(c,!0,t),u.distanceToSquared(h)<=d.distanceToSquared(c)){r.copy(u),o.copy(h);return}else{r.copy(c),o.copy(d);return}}}})(),Kw=(function(){const s=new P,e=new P,t=new yt,n=new Bn;return function(i,r){const{radius:o,center:a}=i,{a:l,b:c,c:h}=r;if(n.start=l,n.end=c,n.closestPointToPoint(a,!0,s).distanceTo(a)<=o||(n.start=l,n.end=h,n.closestPointToPoint(a,!0,s).distanceTo(a)<=o)||(n.start=c,n.end=h,n.closestPointToPoint(a,!0,s).distanceTo(a)<=o))return!0;const u=r.getPlane(t);if(Math.abs(u.distanceToPoint(a))<=o){const d=u.projectPoint(a,e);if(r.containsPoint(d))return!0}return!1}})(),$w=["x","y","z"],Li=1e-15,Jm=Li*Li;function Un(s){return Math.abs(s)new P),this.satBounds=new Array(4).fill().map(()=>new Ri),this.points=[this.a,this.b,this.c],this.plane=new yt,this.isDegenerateIntoSegment=!1,this.isDegenerateIntoPoint=!1,this.degenerateSegment=new Bn,this.needsUpdate=!0}intersectsSphere(e){return Kw(e,this)}update(){const e=this.a,t=this.b,n=this.c,i=this.points,r=this.satAxes,o=this.satBounds,a=r[0],l=o[0];this.getNormal(a),l.setFromPoints(a,i);const c=r[1],h=o[1];c.subVectors(e,t),h.setFromPoints(c,i);const u=r[2],d=o[2];u.subVectors(t,n),d.setFromPoints(u,i);const f=r[3],p=o[3];f.subVectors(n,e),p.setFromPoints(f,i);const g=c.length(),x=u.length(),m=f.length();this.isDegenerateIntoPoint=!1,this.isDegenerateIntoSegment=!1,g0)f(v.c,v.a,v.b,E,y,M,D,_,S,C,B);else if(R>0)f(v.b,v.a,v.c,M,y,E,S,_,D,C,B);else if(S*D>0||_!=0)f(v.a,v.b,v.c,y,M,E,_,S,D,C,B);else if(S!=0)f(v.b,v.a,v.c,M,y,E,S,_,D,C,B);else if(D!=0)f(v.c,v.a,v.b,E,y,M,D,_,S,C,B);else return!0;return!1}function g(v,y,M,E){const A=y.degenerateSegment,R=v.plane.distanceToPoint(A.start),_=v.plane.distanceToPoint(A.end);return Un(R)?Un(_)?d(v,y,M,E):(M&&(M.start.copy(A.start),M.end.copy(A.start)),v.containsPoint(A.start)):Un(_)?(M&&(M.start.copy(A.end),M.end.copy(A.end)),v.containsPoint(A.end)):v.plane.intersectLine(A,n)!=null?(M&&(M.start.copy(n),M.end.copy(n)),v.containsPoint(n)):!1}function x(v,y,M){const E=y.a;return Un(v.plane.distanceToPoint(E))&&v.containsPoint(E)?(M&&(M.start.copy(E),M.end.copy(E)),!0):!1}function m(v,y,M){const E=v.degenerateSegment,A=y.a;return E.closestPointToPoint(A,!0,n),A.distanceToSquared(n)1||w<0||w>1)return!1;const F=A.start.z+_.z*B,W=R.start.z+S.z*w;return Un(F-W)?(M&&(M.start.copy(A.start).addScaledVector(_,B),M.end.copy(A.start).addScaledVector(_,B)),!0):!1}else return y.isDegenerateIntoPoint?m(v,y,M):g(y,v,M,E);else{if(v.isDegenerateIntoPoint)return y.isDegenerateIntoPoint?y.a.distanceToSquared(v.a)0&&B>0)return!1;let w=A.distanceToPoint(v.a),F=A.distanceToPoint(v.b),W=A.distanceToPoint(v.c);Un(w)&&(w=0),Un(F)&&(F=0),Un(W)&&(W=0);const j=w*F,$=w*W;if(j>0&&$>0)return!1;i.copy(A.normal),r.copy(R.normal);const Z=i.cross(r);let re=0,X=Math.abs(Z.x);const Y=Math.abs(Z.y);Y>X&&(X=Y,re=1),Math.abs(Z.z)>X&&(re=2);const ge=$w[re],pe=this.a[ge],de=this.b[ge],ie=this.c[ge],he=v.a[ge],fe=v.b[ge],ve=v.c[ge];if(p(this,pe,de,ie,C,B,_,S,D,h,a))return d(this,v,y,M);if(p(v,he,fe,ve,j,$,w,F,W,u,l))return d(this,v,y,M);if(h.yh.x?y.start.copy(l.start):y.start.copy(a.start),u.ynew P),this.satAxes=new Array(3).fill().map(()=>new P),this.satBounds=new Array(3).fill().map(()=>new Ri),this.alignedSatBounds=new Array(3).fill().map(()=>new Ri),this.needsUpdate=!1,e&&this.min.copy(e),t&&this.max.copy(t),n&&this.matrix.copy(n)}set(e,t,n){this.min.copy(e),this.max.copy(t),this.matrix.copy(n),this.needsUpdate=!0}copy(e){this.min.copy(e.min),this.max.copy(e.max),this.matrix.copy(e.matrix),this.needsUpdate=!0}}hn.prototype.update=(function(){return function(){const s=this.matrix,e=this.min,t=this.max,n=this.points;for(let l=0;l<=1;l++)for(let c=0;c<=1;c++)for(let h=0;h<=1;h++){const u=1*l|2*c|4*h,d=n[u];d.x=l?t.x:e.x,d.y=c?t.y:e.y,d.z=h?t.z:e.z,d.applyMatrix4(s)}const i=this.satBounds,r=this.satAxes,o=n[0];for(let l=0;l<3;l++){const c=r[l],h=i[l],u=1<new Bn),t=new Array(12).fill().map(()=>new Bn),n=new P,i=new P;return function(r,o=0,a=null,l=null){if(this.needsUpdate&&this.update(),this.intersectsBox(r))return(a||l)&&(r.getCenter(i),this.closestPointToPoint(i,n),r.closestPointToPoint(n,i),a&&a.copy(n),l&&l.copy(i)),0;const c=o*o,h=r.min,u=r.max,d=this.points;let f=1/0;for(let g=0;g<8;g++){const x=d[g];i.copy(x).clamp(h,u);const m=x.distanceToSquared(i);if(mnew On)}}const Fn=new Jw;function Zt(s,e){return e[s+15]===Gm}function Tn(s,e){return e[s+6]}function zn(s,e){return e[s+14]}function Jt(s){return s+qt}function Qt(s,e){const t=e[s+6];return s+t*qt}function Eu(s,e){return e[s+7]}class Qw{constructor(){this.float32Array=null,this.uint16Array=null,this.uint32Array=null;const e=[];let t=null;this.setBuffer=n=>{t&&e.push(t),t=n,this.float32Array=new Float32Array(n),this.uint16Array=new Uint16Array(n),this.uint32Array=new Uint32Array(n)},this.clearBuffer=()=>{t=null,this.float32Array=null,this.uint16Array=null,this.uint32Array=null,e.length!==0&&this.setBuffer(e.pop())}}}const _t=new Qw;let Yi,Rr;const Lr=[],fl=new Su(()=>new xt);function eS(s,e,t,n,i,r){Yi=fl.getPrimitive(),Rr=fl.getPrimitive(),Lr.push(Yi,Rr),_t.setBuffer(s._roots[e]);const o=Tu(0,s.geometry,t,n,i,r);_t.clearBuffer(),fl.releasePrimitive(Yi),fl.releasePrimitive(Rr),Lr.pop(),Lr.pop();const a=Lr.length;return a>0&&(Rr=Lr[a-1],Yi=Lr[a-2]),o}function Tu(s,e,t,n,i=null,r=0,o=0){const{float32Array:a,uint16Array:l,uint32Array:c}=_t;let h=s*2;if(Zt(h,l)){const u=Tn(s,c),d=zn(h,l);return Dt(s,a,Yi),n(u,d,!1,o,r+s/qt,Yi)}else{let u=function(D){const{uint16Array:C,uint32Array:B}=_t;let w=D*2;for(;!Zt(w,C);)D=Jt(D),w=D*2;return Tn(D,B)},d=function(D){const{uint16Array:C,uint32Array:B}=_t;let w=D*2;for(;!Zt(w,C);)D=Qt(D,B),w=D*2;return Tn(D,B)+zn(w,C)};const f=Jt(s),p=Qt(s,c);let g=f,x=p,m,b,v,y;if(i&&(v=Yi,y=Rr,Dt(g,a,v),Dt(x,a,y),m=i(v),b=i(y),b(Io.copy(e).clamp(h.min,h.max),Io.distanceToSquared(e)),intersectsBounds:(h,u,d)=>d{h.closestPointToPoint(e,Io);const d=e.distanceToSquared(Io);return d=169,nS=parseInt(Hr)<=161,ws=new P,Ss=new P,Es=new P,ml=new ce,gl=new ce,xl=new ce,Qm=new P,e0=new P,t0=new P,Bo=new P;function iS(s,e,t,n,i,r,o,a){let l;if(r===on?l=s.intersectTriangle(n,t,e,!0,i):l=s.intersectTriangle(e,t,n,r!==Et,i),l===null)return null;const c=s.origin.distanceTo(i);return ca?null:{distance:c,point:i.clone()}}function n0(s,e,t,n,i,r,o,a,l,c,h){ws.fromBufferAttribute(e,r),Ss.fromBufferAttribute(e,o),Es.fromBufferAttribute(e,a);const u=iS(s,ws,Ss,Es,Bo,l,c,h);if(u){if(n){ml.fromBufferAttribute(n,r),gl.fromBufferAttribute(n,o),xl.fromBufferAttribute(n,a),u.uv=new ce;const f=bt.getInterpolation(Bo,ws,Ss,Es,ml,gl,xl,u.uv);pl||(u.uv=f)}if(i){ml.fromBufferAttribute(i,r),gl.fromBufferAttribute(i,o),xl.fromBufferAttribute(i,a),u.uv1=new ce;const f=bt.getInterpolation(Bo,ws,Ss,Es,ml,gl,xl,u.uv1);pl||(u.uv1=f),nS&&(u.uv2=u.uv1)}if(t){Qm.fromBufferAttribute(t,r),e0.fromBufferAttribute(t,o),t0.fromBufferAttribute(t,a),u.normal=new P;const f=bt.getInterpolation(Bo,ws,Ss,Es,Qm,e0,t0,u.normal);u.normal.dot(s.direction)>0&&u.normal.multiplyScalar(-1),pl||(u.normal=f)}const d={a:r,b:o,c:a,normal:new P,materialIndex:0};if(bt.getNormal(ws,Ss,Es,d.normal),u.face=d,u.faceIndex=r,pl){const f=new P;bt.getBarycoord(Bo,ws,Ss,Es,f),u.barycoord=f}}return u}function i0(s){return s&&s.isMaterial?s.side:s}function vl(s,e,t,n,i,r,o){const a=n*3;let l=a+0,c=a+1,h=a+2;const{index:u,groups:d}=s;s.index&&(l=u.getX(l),c=u.getX(c),h=u.getX(h));const{position:f,normal:p,uv:g,uv1:x}=s.attributes;if(Array.isArray(e)){const m=n*3;for(let b=0,v=d.length;b=y&&mM&&(M=D),CE&&(E=C),BA&&(A=B)}return l[d+0]!==b||l[d+1]!==v||l[d+2]!==y||l[d+3]!==M||l[d+4]!==E||l[d+5]!==A?(l[d+0]=b,l[d+1]=v,l[d+2]=y,l[d+3]=M,l[d+4]=E,l[d+5]=A,!0):!1}else{const x=Jt(d),m=Qt(d,o);let b=p,v=!1,y=!1;if(e){if(!b){const S=x/qt+f/cn,D=m/qt+f/cn;v=e.has(S),y=e.has(D),b=!v&&!y}}else v=!0,y=!0;const M=b||v,E=b||y;let A=!1;M&&(A=u(x,f,b));let R=!1;E&&(R=u(m,f,b));const _=A||R;if(_)for(let S=0;S<3;S++){const D=x+S,C=m+S,B=l[D],w=l[D+3],F=l[C],W=l[C+3];l[d+S]=BW?w:W}return _}}}function Ki(s,e,t,n,i){let r,o,a,l,c,h;const u=1/t.direction.x,d=1/t.direction.y,f=1/t.direction.z,p=t.origin.x,g=t.origin.y,x=t.origin.z;let m=e[s],b=e[s+3],v=e[s+1],y=e[s+3+1],M=e[s+2],E=e[s+3+2];return u>=0?(r=(m-p)*u,o=(b-p)*u):(r=(b-p)*u,o=(m-p)*u),d>=0?(a=(v-g)*d,l=(y-g)*d):(a=(y-g)*d,l=(v-g)*d),r>l||a>o||((a>r||isNaN(r))&&(r=a),(l=0?(c=(M-x)*f,h=(E-x)*f):(c=(E-x)*f,h=(M-x)*f),r>h||c>o)?!1:((c>r||r!==r)&&(r=c),(h=n)}function lS(s,e,t,n,i,r,o,a){const{geometry:l,_indirectBuffer:c}=s;for(let h=n,u=n+i;h=0;let f,p;d?(f=Jt(s),p=Qt(s,l)):(f=Qt(s,l),p=Jt(s));const g=Ki(f,o,n,i,r)?Pu(f,e,t,n,i,r):null;if(g){const m=g.point[u];if(d?m<=o[p+h]:m>=o[p+h+3])return g}const x=Ki(p,o,n,i,r)?Pu(p,e,t,n,i,r):null;return g&&x?g.distance<=x.distance?g:x:g||x||null}}const bl=new xt,Dr=new On,Ir=new On,No=new ze,s0=new hn,yl=new hn;function pS(s,e,t,n){_t.setBuffer(s._roots[e]);const i=Ru(0,s,t,n);return _t.clearBuffer(),i}function Ru(s,e,t,n,i=null){const{float32Array:r,uint16Array:o,uint32Array:a}=_t;let l=s*2;if(i===null&&(t.boundingBox||t.computeBoundingBox(),s0.set(t.boundingBox.min,t.boundingBox.max,n),i=s0),Zt(l,o)){const c=e.geometry,h=c.index,u=c.attributes.position,d=t.index,f=t.attributes.position,p=Tn(s,a),g=zn(l,o);if(No.copy(n).invert(),t.boundsTree)return Dt(s,r,yl),yl.matrix.copy(No),yl.needsUpdate=!0,t.boundsTree.shapecast({intersectsBounds:x=>yl.intersectsBox(x),intersectsTriangle:x=>{x.a.applyMatrix4(n),x.b.applyMatrix4(n),x.c.applyMatrix4(n),x.needsUpdate=!0;for(let m=p*3,b=(g+p)*3;mLu.distanceToBox(M),intersectsBounds:(M,E,A)=>A{if(e.boundsTree)return e.boundsTree.shapecast({boundsTraverseOrder:A=>ko.distanceToBox(A),intersectsBounds:(A,R,_)=>_{for(let _=A,S=A+R;_M&&(M=B),wE&&(E=w),FA&&(A=F)}}return l[d+0]!==b||l[d+1]!==v||l[d+2]!==y||l[d+3]!==M||l[d+4]!==E||l[d+5]!==A?(l[d+0]=b,l[d+1]=v,l[d+2]=y,l[d+3]=M,l[d+4]=E,l[d+5]=A,!0):!1}else{const x=Jt(d),m=Qt(d,o);let b=p,v=!1,y=!1;if(e){if(!b){const S=x/qt+f/cn,D=m/qt+f/cn;v=e.has(S),y=e.has(D),b=!v&&!y}}else v=!0,y=!0;const M=b||v,E=b||y;let A=!1;M&&(A=u(x,f,b));let R=!1;E&&(R=u(m,f,b));const _=A||R;if(_)for(let S=0;S<3;S++){const D=x+S,C=m+S,B=l[D],w=l[D+3],F=l[C],W=l[C+3];l[d+S]=BW?w:W}return _}}}function _S(s,e,t,n,i,r,o){_t.setBuffer(s._roots[e]),Du(0,s,t,n,i,r,o),_t.clearBuffer()}function Du(s,e,t,n,i,r,o){const{float32Array:a,uint16Array:l,uint32Array:c}=_t,h=s*2;if(Zt(h,l)){const u=Tn(s,c),d=zn(h,l);lS(e,t,n,u,d,i,r,o)}else{const u=Jt(s);Ki(u,a,n,r,o)&&Du(u,e,t,n,i,r,o);const d=Qt(s,c);Ki(d,a,n,r,o)&&Du(d,e,t,n,i,r,o)}}const MS=["x","y","z"];function wS(s,e,t,n,i,r){_t.setBuffer(s._roots[e]);const o=Iu(0,s,t,n,i,r);return _t.clearBuffer(),o}function Iu(s,e,t,n,i,r){const{float32Array:o,uint16Array:a,uint32Array:l}=_t;let c=s*2;if(Zt(c,a)){const h=Tn(s,l),u=zn(c,a);return cS(e,t,n,h,u,i,r)}else{const h=Eu(s,l),u=MS[h],d=n.direction[u]>=0;let f,p;d?(f=Jt(s),p=Qt(s,l)):(f=Qt(s,l),p=Jt(s));const g=Ki(f,o,n,i,r)?Iu(f,e,t,n,i,r):null;if(g){const m=g.point[u];if(d?m<=o[p+h]:m>=o[p+h+3])return g}const x=Ki(p,o,n,i,r)?Iu(p,e,t,n,i,r):null;return g&&x?g.distance<=x.distance?g:x:g||x||null}}const Ml=new xt,Br=new On,Nr=new On,Uo=new ze,r0=new hn,wl=new hn;function SS(s,e,t,n){_t.setBuffer(s._roots[e]);const i=Bu(0,s,t,n);return _t.clearBuffer(),i}function Bu(s,e,t,n,i=null){const{float32Array:r,uint16Array:o,uint32Array:a}=_t;let l=s*2;if(i===null&&(t.boundingBox||t.computeBoundingBox(),r0.set(t.boundingBox.min,t.boundingBox.max,n),i=r0),Zt(l,o)){const c=e.geometry,h=c.index,u=c.attributes.position,d=t.index,f=t.attributes.position,p=Tn(s,a),g=zn(l,o);if(Uo.copy(n).invert(),t.boundsTree)return Dt(s,r,wl),wl.matrix.copy(Uo),wl.needsUpdate=!0,t.boundsTree.shapecast({intersectsBounds:x=>wl.intersectsBox(x),intersectsTriangle:x=>{x.a.applyMatrix4(n),x.b.applyMatrix4(n),x.c.applyMatrix4(n),x.needsUpdate=!0;for(let m=p,b=g+p;mNu.distanceToBox(M),intersectsBounds:(M,E,A)=>A{if(e.boundsTree){const A=e.boundsTree;return A.shapecast({boundsTraverseOrder:R=>Oo.distanceToBox(R),intersectsBounds:(R,_,S)=>S{for(let S=R,D=R+_;Snew xt),kr=new xt,Ur=new xt,ku=new xt,Uu=new xt;let Ou=!1;function LS(s,e,t,n){if(Ou)throw new Error("MeshBVH: Recursive calls to bvhcast not supported.");Ou=!0;const i=s._roots,r=e._roots;let o,a=0,l=0;const c=new ze().copy(t).invert();for(let h=0,u=i.length;hl.slice()),a.index=o?o.array.slice():null,a.indirectBuffer=r?r.slice():null):(a.roots=i,a.index=o?o.array:null,a.indirectBuffer=r),a}static deserialize(e,t,n={}){n={setIndex:!0,indirect:!!e.indirectBuffer,...n};const{index:i,roots:r,indirectBuffer:o}=e;e.version||(console.warn("MeshBVH.deserialize: Serialization format has been changed and will be fixed up. It is recommended to regenerate any stored serialized data."),l(r));const a=new Fu(t,{...n,[xu]:!0});if(a._roots=r,a._indirectBuffer=o||null,n.setIndex){const c=t.getIndex();if(c===null){const h=new at(e.index,1,!1);t.setIndex(h)}else c.array!==i&&(c.array.set(i),c.needsUpdate=!0)}return a;function l(c){for(let h=0;hthis._indirectBuffer[n]:n=>n}shiftTriangleOffsets(e){const t=this._indirectBuffer;if(t)for(let n=0,i=t.length;nu(d,f,p,g,x)?!0:n(d,f,this,a,p,g,t)}else o||(a?o=(u,d,f,p)=>n(u,d,this,a,f,p,t):o=(u,d,f)=>f);let l=!1,c=0;const h=this._roots;for(let u=0,d=h.length;u{const g=this.resolveTriangleIndex(p);zt(o,g*3,a,l)}:p=>{zt(o,p*3,a,l)},h=Fn.getPrimitive(),u=e.geometry.index,d=e.geometry.attributes.position,f=e.indirect?p=>{const g=e.resolveTriangleIndex(p);zt(h,g*3,u,d)}:p=>{zt(h,p*3,u,d)};if(r){const p=(g,x,m,b,v,y,M,E)=>{for(let A=m,R=m+b;ATl.intersectsBox(n),intersectsTriangle:n=>Tl.intersectsTriangle(n)})}intersectsSphere(e){return this.shapecast({intersectsBounds:t=>e.intersectsBox(t),intersectsTriangle:t=>t.intersectsSphere(e)})}closestPointToGeometry(e,t,n={},i={},r=0,o=1/0){return(this.indirect?PS:bS)(this,e,t,n,i,r,o)}closestPointToPoint(e,t={},n=0,i=1/0){return tS(this,e,t,n,i)}getBoundingBox(e){return e.makeEmpty(),this._roots.forEach(t=>{Dt(0,new Float32Array(t),o0),e.union(o0)}),e}}const a0=1e-6,IS=a0*.5,l0=Math.pow(10,-Math.log10(a0)),BS=IS*l0;function di(s){return~~(s*l0+BS)}function NS(s){return`${di(s.x)},${di(s.y)}`}function c0(s){return`${di(s.x)},${di(s.y)},${di(s.z)}`}function kS(s){return`${di(s.x)},${di(s.y)},${di(s.z)},${di(s.w)}`}function US(s,e,t){t.direction.subVectors(e,s).normalize();const n=s.dot(t.direction);return t.origin.copy(s).addScaledVector(t.direction,-n),t}function h0(){return typeof SharedArrayBuffer<"u"}function OS(s){if(s.buffer instanceof SharedArrayBuffer)return s;const e=s.constructor,t=s.buffer,n=new SharedArrayBuffer(t.byteLength),i=new Uint8Array(t);return new Uint8Array(n).set(i,0),new e(n)}function FS(s,e=ArrayBuffer){return s>65535?new Uint32Array(new e(4*s)):new Uint16Array(new e(2*s))}function zS(s,e){if(!s.index){const t=s.attributes.position.count,n=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,i=FS(t,n);s.setIndex(new at(i,1));for(let r=0;rl.end)){if(l.end=h.end)r(h.end,l.end)||s.splice(a+1,0,{start:h.end,end:l.end,index:l.index}),l.end=h.start,h.start=0,h.end=0;else if(l.start>=h.start&&l.end<=h.end)r(l.end,h.end)||e.splice(c+1,0,{start:l.end,end:h.end,index:h.index}),h.end=l.start,l.start=0,l.end=0;else if(l.start<=h.start&&l.end<=h.end){const u=l.end;l.end=h.start,h.start=u}else if(l.start>=h.start&&l.end>=h.end){const u=h.end;h.end=l.start,l.start=u}else throw new Error}if(t.has(l.index)||t.set(l.index,[]),t.has(h.index)||t.set(h.index,[]),t.get(l.index).push(h.index),t.get(h.index).push(l.index),o(h)&&(e.splice(c,1),c--),o(l)){s.splice(a,1),a--;break}}}i(s),i(e);function i(a){for(let l=0;lf0;return l.direction.angleTo(c.direction)>p0||h}function a(l,c){const h=l.origin.distanceTo(c.origin),u=l.direction.angleTo(c.direction);return h/f0+u/p0}}}const Hu=new P,Vu=new P,Al=new zi;function ZS(s,e,t){const n=s.attributes,i=s.index,r=n.position,o=new Map,a=new Map,l=Array.from(e),c=new qS;for(let h=0,u=l.length;hy&&([v,y]=[y,v]),Al.direction.dot(b.direction)<0?m.reverse.push({start:v,end:y,index:d}):m.forward.push({start:v,end:y,index:d})}return a.forEach(({forward:h,reverse:u},d)=>{jS(h,u,o,t),h.length===0&&u.length===0&&a.delete(d)}),{disjointConnectivityMap:o,fragmentMap:a}}const YS=new ce,Gu=new P,KS=new tt,Wu=["","",""];class $S{constructor(e=null){this.data=null,this.disjointConnections=null,this.unmatchedDisjointEdges=null,this.unmatchedEdges=-1,this.matchedEdges=-1,this.useDrawRange=!0,this.useAllAttributes=!1,this.matchDisjointEdges=!1,this.degenerateEpsilon=1e-8,e&&this.updateFrom(e)}getSiblingTriangleIndex(e,t){const n=this.data[e*3+t];return n===-1?-1:~~(n/3)}getSiblingEdgeIndex(e,t){const n=this.data[e*3+t];return n===-1?-1:n%3}getDisjointSiblingTriangleIndices(e,t){const n=e*3+t,i=this.disjointConnections.get(n);return i?i.map(r=>~~(r/3)):[]}getDisjointSiblingEdgeIndices(e,t){const n=e*3+t,i=this.disjointConnections.get(n);return i?i.map(r=>r%3):[]}isFullyConnected(){return this.unmatchedEdges===0}updateFrom(e){const{useAllAttributes:t,useDrawRange:n,matchDisjointEdges:i,degenerateEpsilon:r}=this,o=t?v:b,a=new Map,{attributes:l}=e,c=t?Object.keys(l):null,h=e.index,u=l.position;let d=zu(e);const f=d;let p=0;n&&(p=e.drawRange.start,e.drawRange.count!==1/0&&(d=~~(e.drawRange.count/3)));let g=this.data;(!g||g.length<3*f)&&(g=new Int32Array(3*f)),g.fill(-1);let x=0,m=new Set;for(let y=p,M=d*3+p;y{E.forEach(({index:R})=>m.add(R)),A.forEach(({index:R})=>m.add(R))}),this.unmatchedDisjointEdges=y,this.disjointConnections=M,x=d*3-m.size}this.matchedEdges=x,this.unmatchedEdges=m.size,this.data=g;function b(y){return Gu.fromBufferAttribute(u,y),c0(Gu)}function v(y){let M="";for(let E=0,A=c.length;E=this._pool.length&&this._pool.push(new bt),this._pool[this._index++]}clear(){this._index=0}reset(){this._pool.length=0,this._index=0}}class tE{constructor(){this.trianglePool=new eE,this.triangles=[],this.normal=new P,this.coplanarTriangleUsed=!1}initialize(e){this.reset();const{triangles:t,trianglePool:n,normal:i}=this;if(Array.isArray(e))for(let r=0,o=e.length;rju)throw new Error("Triangle Splitter: Cannot initialize with triangles that have different normals.");const l=n.getTriangle();l.copy(a),t.push(l)}else{e.getNormal(i);const r=n.getTriangle();r.copy(e),t.push(r)}}splitByTriangle(e){const{normal:t,triangles:n}=this;if(e.getNormal(qu).normalize(),Math.abs(1-Math.abs(qu.dot(t)))0?p.push(m):g.push(m),Math.abs(v)zo)if(d!==-1){d=(d+1)%3;let m=0;m===d&&(m=(m+1)%3);let b=m+1;b===d&&(b=(b+1)%3);const v=i.getTriangle();v.a.copy(x[b]),v.b.copy(Ut.end),v.c.copy(Ut.start),Ji(v)||n.push(v),a.a.copy(x[m]),a.b.copy(Ut.start),a.c.copy(Ut.end),Ji(a)&&(n.splice(r,1),r--,o--)}else{const m=p.length>=2?g[0]:p[0];if(m===0){let E=Ut.start;Ut.start=Ut.end,Ut.end=E}const b=(m+1)%3,v=(m+2)%3,y=i.getTriangle(),M=i.getTriangle();x[b].distanceToSquared(Ut.start)t.length&&(this.expand(),t=this.array);for(let i=0,r=e.length;i=t.length;){const i={};t.push(i);for(const r in n){const o=n[r],a=new v0(o.type);a.itemSize=o.itemSize,a.normalized=o.normalized,i[r]=a}}return t[e]}getGroupAttrArray(e,t=0){const{groupAttributes:n}=this;if(!n[0][e])throw new Error(`TypedAttributeData: Attribute with "${e}" has not been initialized`);return this.getGroupAttrSet(t)[e]}initializeArray(e,t,n,i){const{groupAttributes:r}=this,o=r[0][e];if(o){if(o.type!==t)for(let a=0,l=r.length;a{for(const n in t)t[n].clear()})}delete(e){this.groupAttributes.forEach(t=>{delete t[e]})}reset(){this.groupAttributes=[],this.groupCount=0}}class b0{constructor(){this.intersectionSet={},this.ids=[]}add(e,t){const{intersectionSet:n,ids:i}=this;n[e]||(n[e]=[],i.push(e)),n[e].push(t)}}const sE=0,rE=1,oE=2,y0=3,aE=4,_0=5,M0=6,Hn=new zi,w0=new ze,un=new bt,Bi=new P,S0=new tt,E0=new tt,T0=new tt,Yu=new tt,Rl=new tt,Ll=new tt,A0=new Bn,Ku=new P,$u=1e-8,lE=1e-15,Ts=-1,As=1,Dl=-2,Il=2,Ho=0,Cs=1,Ju=2,cE=1e-14;let Bl=null;function C0(s){Bl=s}function P0(s,e){s.getMidpoint(Hn.origin),s.getNormal(Hn.direction);const t=e.raycastFirst(Hn,Et);return t&&Hn.direction.dot(t.face.normal)>0?Ts:As}function hE(s,e){function t(){return Math.random()-.5}s.getNormal(Ku),Hn.direction.copy(Ku),s.getMidpoint(Hn.origin);const n=3;let i=0,r=1/0;for(let o=0;o0&&i++,a!==null&&(r=Math.min(r,a.distance)),r<=lE)return a.face.normal.dot(Ku)>0?Il:Dl;if(i/n>.5||(o-i+1)/n>.5)break}return i/n>.5?Ts:As}function uE(s,e){const t=new b0,n=new b0;return w0.copy(s.matrixWorld).invert().multiply(e.matrixWorld),s.geometry.boundsTree.bvhcast(e.geometry.boundsTree,w0,{intersectsTriangles(i,r,o,a){if(!Ji(i)&&!Ji(r)){let l=i.intersectsTriangle(r,A0,!0);if(!l){const c=i.plane,h=r.plane,u=c.normal,d=h.normal;u.dot(d)===1&&Math.abs(c.constant-h.constant){r.push(c.x),i>1&&r.push(c.y),i>2&&r.push(c.z),i>3&&r.push(c.w)};Yu.set(0,0,0,0).addScaledVector(s,n.a.x).addScaledVector(e,n.a.y).addScaledVector(t,n.a.z),Rl.set(0,0,0,0).addScaledVector(s,n.b.x).addScaledVector(e,n.b.y).addScaledVector(t,n.b.z),Ll.set(0,0,0,0).addScaledVector(s,n.c.x).addScaledVector(e,n.c.y).addScaledVector(t,n.c.z),a&&(Yu.normalize(),Rl.normalize(),Ll.normalize()),l(Yu),o?(l(Ll),l(Rl)):(l(Rl),l(Ll))}function ed(s,e,t,n,i,r=!1){for(const o in i){const a=e[o],l=i[o];if(!(o in e))throw new Error(`CSG Operations: Attribute ${o} no available on geometry.`);const c=a.itemSize;o==="position"?(Bi.fromBufferAttribute(a,s).applyMatrix4(t),l.push(Bi.x,Bi.y,Bi.z)):o==="normal"?(Bi.fromBufferAttribute(a,s).applyNormalMatrix(n),r&&Bi.multiplyScalar(-1),l.push(Bi.x,Bi.y,Bi.z)):(l.push(a.getX(s)),c>1&&l.push(a.getY(s)),c>2&&l.push(a.getZ(s)),c>3&&l.push(a.getW(s)))}}class pE{constructor(e){this.triangle=new bt().copy(e),this.intersects={}}addTriangle(e,t){this.intersects[e]=new bt().copy(t)}getIntersectArray(){const e=[],{intersects:t}=this;for(const n in t)e.push(t[n]);return e}}class L0{constructor(){this.data={}}addTriangleIntersection(e,t,n,i){const{data:r}=this;r[e]||(r[e]=new pE(t)),r[e].addTriangle(n,i)}getTrianglesAsArray(e=null){const{data:t}=this,n=[];if(e!==null)e in t&&n.push(t[e].triangle);else for(const i in t)n.push(t[i].triangle);return n}getTriangleIndices(){return Object.keys(this.data).map(e=>parseInt(e))}getIntersectionIndices(e){const{data:t}=this;return t[e]?Object.keys(t[e].intersects).map(n=>parseInt(n)):[]}getIntersectionsAsArray(e=null,t=null){const{data:n}=this,i=new Set,r=[],o=a=>{if(n[a])if(t!==null)n[a].intersects[t]&&r.push(n[a].intersects[t]);else{const l=n[a].intersects;for(const c in l)i.has(c)||(i.add(c),r.push(l[c]))}};if(e!==null)o(e);else for(const a in n)o(a);return r}reset(){this.data={}}}class mE{constructor(){this.enabled=!1,this.triangleIntersectsA=new L0,this.triangleIntersectsB=new L0,this.intersectionEdges=[]}addIntersectingTriangles(e,t,n,i){const{triangleIntersectsA:r,triangleIntersectsB:o}=this;r.addTriangleIntersection(e,t,n,i),o.addTriangleIntersection(n,i,e,t)}addEdge(e){this.intersectionEdges.push(e.clone())}reset(){this.triangleIntersectsA.reset(),this.triangleIntersectsB.reset(),this.intersectionEdges=[]}init(){this.enabled&&(this.reset(),C0(this))}complete(){this.enabled&&C0(null)}}const Qi=new ze,Nl=new Ke,Ps=new bt,kl=new bt,es=new bt,Ul=new bt,ei=[],Rs=[];function gE(s){for(const e of s)return e}function xE(s,e,t,n,i,r={}){const{useGroups:o=!0}=r,{aIntersections:a,bIntersections:l}=uE(s,e),c=[];let h=null,u;return u=o?0:-1,D0(s,e,a,t,!1,n,i,u),I0(s,e,a,t,!1,i,u),t.findIndex(d=>d!==M0&&d!==_0)!==-1&&(u=o?s.geometry.groups.length||1:-1,D0(e,s,l,t,!0,n,i,u),I0(e,s,l,t,!0,i,u)),ei.length=0,Rs.length=0,{groups:c,materials:h}}function D0(s,e,t,n,i,r,o,a=0){const l=s.matrixWorld.determinant()<0;Qi.copy(e.matrixWorld).invert().multiply(s.matrixWorld),Nl.getNormalMatrix(s.matrixWorld).multiplyScalar(l?-1:1);const c=s.geometry.groupIndices,h=s.geometry.index,u=s.geometry.attributes.position,d=e.geometry.boundsTree,f=e.geometry.index,p=e.geometry.attributes.position,g=t.ids,x=t.intersectionSet;for(let m=0,b=g.length;m0;){const m=gE(g);g.delete(m),f.push(m);const b=3*m,v=h.getX(b+0),y=h.getX(b+1),M=h.getX(b+2);es.a.fromBufferAttribute(d,v).applyMatrix4(Qi),es.b.fromBufferAttribute(d,y).applyMatrix4(Qi),es.c.fromBufferAttribute(d,M).applyMatrix4(Qi);const E=P0(es,l);Rs.length=0,ei.length=0;for(let A=0,R=n.length;A0;){const A=f.pop();for(let R=0;R<3;R++){const _=p.getSiblingTriangleIndex(A,R);_!==-1&&g.has(_)&&(f.push(_),g.delete(_))}if(ei.length!==0){const R=3*A,_=h.getX(R+0),S=h.getX(R+1),D=h.getX(R+2),C=o===-1?0:c[A]+o;if(es.a.fromBufferAttribute(d,_),es.b.fromBufferAttribute(d,S),es.c.fromBufferAttribute(d,D),!Ji(es))for(let B=0,w=ei.length;B{t[n.materialIndex]=e})),t}class _E{constructor(){this.triangleSplitter=new tE,this.attributeData=[],this.attributes=["position","uv","normal"],this.useGroups=!0,this.consolidateGroups=!0,this.debug=new mE}getGroupRanges(e){return!this.useGroups||e.groups.length===0?[{start:0,count:1/0,materialIndex:0}]:e.groups.map(t=>({...t}))}evaluate(e,t,n,i=new Cl){let r=!0;if(Array.isArray(n)||(n=[n]),Array.isArray(i)||(i=[i],r=!1),i.length!==n.length)throw new Error("Evaluator: operations and target array passed as different sizes.");e.prepareGeometry(),t.prepareGeometry();const{triangleSplitter:o,attributeData:a,attributes:l,useGroups:c,consolidateGroups:h,debug:u}=this;for(;a.length{bE(e.geometry,m.geometry,a[b],l)}),u.init(),xE(e,t,n,o,a,{useGroups:c}),u.complete();const d=this.getGroupRanges(e.geometry),f=B0(d,e.material),p=this.getGroupRanges(t.geometry),g=B0(p,t.material);p.forEach(m=>m.materialIndex+=f.length);let x=[...d,...p].map((m,b)=>({...m,index:b}));if(c){const m=[...f,...g];h&&(x=x.map(v=>{const y=m[v.materialIndex];return v.materialIndex=m.indexOf(y),v}).sort((v,y)=>v.materialIndex-y.materialIndex));const b=[];for(let v=0,y=m.length;v{v.material=b})}else x=[{start:0,count:1/0,index:0,materialIndex:0}],i.forEach(m=>{m.material=f[0]});return i.forEach((m,b)=>{const v=m.geometry;yE(v,a[b],x),h&&vE(v.groups)}),r?i:i[0]}evaluateHierarchy(e,t=new Cl){e.updateMatrixWorld(!0);const n=(r,o)=>{const a=r.children;for(let l=0,c=a.length;l{const o=r.children;let a=!1;for(let c=0,h=o.length;c{c?c=this.evaluate(c,h,h.operation):c=this.evaluate(r,h,h.operation)}),r._cachedGeometry=c.geometry,r._cachedMaterials=c.material,!0}else return a||l};return i(e),t.geometry=e._cachedGeometry,t.material=e._cachedMaterials,t}reset(){this.triangleSplitter.reset()}}class N0{engine;planeObjects=[];planes=[];isActive=!1;evaluator;geometryCache=new Map;sectionMeshes=new Map;planeGroup;planeSize=1e3;sourceMeshes=new Map;planeThickness=.01;updateThrottleTime=100;lastUpdateTime=0;pendingUpdate=!1;updateTimer=null;cacheExpireTime=3e4;planeStates=new Map;constructor(e,t={}){this.engine=e,this.evaluator=new _E,this.planeGroup=new xn,this.planeGroup.name="CSG_ClippingPlanes_Optimized",t.updateThrottleTime!==void 0&&(this.updateThrottleTime=t.updateThrottleTime),t.cacheExpireTime!==void 0&&(this.cacheExpireTime=t.cacheExpireTime),t.planeThickness!==void 0&&(this.planeThickness=t.planeThickness),this.evaluator.attributes=["position","normal"],this.evaluator.useGroups=!1}init(){this.calculateSceneSize(),this.engine.scene.add(this.planeGroup),this.planes.forEach((e,t)=>{const n=this.createEmptySectionMesh(e,t);this.planeGroup.add(n),this.sectionMeshes.set(`plane_${t}`,n),this.planeObjects.push(n),this.planeStates.set(t,{constant:e.constant,normal:e.normal.clone()})})}createEmptySectionMesh(e,t){const n=new ht,i=new cs({color:new Ue(33023),metalness:.1,roughness:.75,side:Et,depthWrite:!0,depthTest:!0,clippingPlanes:this.planes.filter((o,a)=>a!==t)}),r=new ut(n,i);return r.name=`CSG_Section_Optimized_${t}`,r.visible=!1,r.renderOrder=t+1,r}active(){this.isActive=!0,this.requestUpdate(),this.planeObjects.forEach(e=>{e.visible=!0})}disActive(){this.isActive=!1,this.planeObjects.forEach(e=>{e.visible=!1}),this.updateTimer&&(clearTimeout(this.updateTimer),this.updateTimer=null)}setSourceMeshes(e){this.sourceMeshes.clear(),e.forEach(t=>{const n=t.uuid;this.sourceMeshes.set(n,t)}),this.isActive&&this.requestUpdate()}addSourceMesh(e){const t=e.uuid;this.sourceMeshes.has(t)||(this.sourceMeshes.set(t,e),this.isActive&&this.requestUpdate())}removeSourceMesh(e){const t=e.uuid;this.sourceMeshes.delete(t)&&(this.clearMeshCache(t),this.isActive&&this.requestUpdate())}requestUpdate(){if(!this.isActive)return;const e=Date.now(),t=e-this.lastUpdateTime;t>=this.updateThrottleTime?(this.lastUpdateTime=e,this.pendingUpdate=!1):(this.pendingUpdate=!0,this.updateTimer&&clearTimeout(this.updateTimer),this.updateTimer=setTimeout(()=>{this.pendingUpdate&&this.isActive&&(this.lastUpdateTime=Date.now(),this.pendingUpdate=!1),this.updateTimer=null},this.updateThrottleTime-t))}updateAllSections(){this.isActive&&(this.planes.forEach((e,t)=>{if(Math.abs(e.constant)<99999)this.hasPlaneChanged(t,e)&&(this.updateSection(e,t),this.updatePlaneState(t,e));else{const n=this.sectionMeshes.get(`plane_${t}`);n&&(n.visible=!1)}}),this.cleanExpiredCache())}hasPlaneChanged(e,t){const n=this.planeStates.get(e);if(!n)return!0;const i=Math.abs(n.constant-t.constant)>1e-4,r=!n.normal.equals(t.normal);return i||r}updatePlaneState(e,t){this.planeStates.set(e,{constant:t.constant,normal:t.normal.clone()})}getPlaneHash(e){const t=e.normal,n=e.constant;return`${t.x.toFixed(4)}_${t.y.toFixed(4)}_${t.z.toFixed(4)}_${n.toFixed(4)}`}getCacheKey(e,t){return`${e}_plane_${t}`}updateSection(e,t){const n=this.sectionMeshes.get(`plane_${t}`);if(!n)return;const i=this.getPlaneHash(e),r=[];if(this.sourceMeshes.forEach((o,a)=>{const l=this.getCacheKey(a,t),c=this.geometryCache.get(l);if(c&&c.planeHash===i)r.push(c.geometry.clone()),c.timestamp=Date.now();else try{const h=this.createPlaneBrush(e),u=new Cl(o.geometry);o.updateMatrixWorld(!0),u.matrix.copy(o.matrixWorld),u.updateMatrixWorld();const d=this.evaluator.evaluate(h,u,y0);d&&d.geometry.attributes.position.count>0?(r.push(d.geometry),this.geometryCache.set(l,{geometry:d.geometry.clone(),planeHash:i,timestamp:Date.now()})):this.geometryCache.delete(l)}catch(h){console.warn(`CSG intersection failed for mesh ${a}:`,h)}}),r.length>0){const o=this.mergeGeometries(r);n.geometry&&n.geometry.dispose(),n.geometry=o,n.visible=!0,n.position.set(0,0,0),n.rotation.set(0,0,0),n.scale.set(1,1,1),n.updateMatrixWorld()}else n.visible=!1;r.forEach(o=>o.dispose())}clearMeshCache(e){const t=[];this.geometryCache.forEach((n,i)=>{i.startsWith(e)&&(n.geometry.dispose(),t.push(i))}),t.forEach(n=>this.geometryCache.delete(n))}cleanExpiredCache(){const e=Date.now(),t=[];this.geometryCache.forEach((n,i)=>{e-n.timestamp>this.cacheExpireTime&&(n.geometry.dispose(),t.push(i))}),t.forEach(n=>this.geometryCache.delete(n))}clearAllCache(){this.geometryCache.forEach(e=>{e.geometry.dispose()}),this.geometryCache.clear()}createPlaneBrush(e){const t=new Gi(this.planeSize,this.planeThickness,this.planeSize);t.translate(0,e.constant,0),t.applyQuaternion(new Dn().setFromUnitVectors(new P(0,-1,0),e.normal));const n=new ut(t),i=new Cl(t);return i.matrix.copy(n.matrixWorld),i.updateMatrixWorld(),i}mergeGeometries(e){if(e.length===1)return e[0].clone();const t=new ht,n=[],i=[],r=[];let o=0;return e.forEach(a=>{const l=a.attributes.position,c=a.attributes.normal;for(let h=0;h0?t.setAttribute("normal",new nn(i,3)):t.computeVertexNormals(),r.length>0&&t.setIndex(r),t}calculateSceneSize(){const e=new xt;if(this.engine.scene.traverse(t=>{if(t.isMesh&&t.geometry){const n=new xt().setFromObject(t);e.union(n)}}),e.isEmpty())this.planeSize=1e3;else{const t=e.getSize(new P),n=Math.max(t.x,t.y,t.z);this.planeSize=n*3}}update(){this.isActive&&this.pendingUpdate&&!this.updateTimer&&this.requestUpdate()}dispose(){this.updateTimer&&(clearTimeout(this.updateTimer),this.updateTimer=null),this.clearAllCache(),this.planeObjects.forEach(e=>{e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(t=>t.dispose()):e.material.dispose())}),this.sectionMeshes.clear(),this.planeObjects=[],this.sourceMeshes.clear(),this.planeGroup.parent&&this.planeGroup.parent.remove(this.planeGroup)}setSectionColor(e){this.planeObjects.forEach(t=>{t.material instanceof cs&&t.material.color.set(e)})}getCacheStats(){return{cacheSize:this.geometryCache.size,sourceMeshCount:this.sourceMeshes.size,sectionMeshCount:this.sectionMeshes.size}}setPlaneThickness(e){if(e<=0){console.warn("Plane thickness must be positive");return}this.planeThickness=e,this.clearAllCache(),this.isActive&&this.requestUpdate()}getPlaneThickness(){return this.planeThickness}showSections(){this.sectionMeshes.forEach(e=>{e.geometry?.attributes.position?.count&&e.geometry.attributes.position.count>0&&(e.visible=!0)})}hideSections(){this.sectionMeshes.forEach(e=>{e.visible=!1})}showSection(){this.planeGroup.visible=!0}hideSection(){this.planeGroup.visible=!1}toggleSectionsVisibility(){let e=!1;return this.sectionMeshes.forEach(t=>{t.visible&&(e=!0)}),e?(this.hideSections(),!1):(this.showSections(),!0)}toggleSectionVisibility(e){const t=this.sectionMeshes.get(`plane_${e}`);return t?(t.visible=!t.visible,t.visible):!1}}class ME{engine;isActive=!1;isDrag=!1;meshs=[];box;pickPoint;pickNormal;pickMesh;box_;plane;csgClipping=null;useCsgClipping=!0;constructor(e,t){this.engine=e,this.meshs=[],this.box=null,t?.useCsgClipping!==void 0&&(this.useCsgClipping=t.useCsgClipping),this.useCsgClipping&&this.initCsgClipping()}initCsgClipping(){this.csgClipping=new N0(this.engine,{updateThrottleTime:150,cacheExpireTime:45e3}),this.csgClipping.planes=this.engine.sectionPlane,this.csgClipping.init()}active(){this.isActive||(this.isActive=!0,this.init(),this.meshs.forEach(e=>{e.visible=!0}),this.engine.handelBehaved.init(this),this.engine.handelBehaved.active(),this.csgClipping&&this.csgClipping.active(),this.engine.models.forEach(e=>{e.nodesMap.forEach(t=>{t.infos.forEach(n=>{this.csgClipping?.addSourceMesh(n.mesh)})})}))}disActive(){this.isActive=!1,this.engine.handelBehaved.disActive(),this.csgClipping&&this.csgClipping.disActive();const e=this.engine.sectionPlane.find(t=>t.name=="顶");e&&(e.constant=1e5),this.meshs.forEach(t=>{t.visible=!1})}init(){let e=this.engine.octreeBox.getBoundingBox();this.box=e,this.updata_face(e)}updata_face(e){let t=this,n=t.engine.scene.children.find(o=>o.type=="Group"&&o.name=="ClippingBox");n==null&&(n=new xn,n.name="ClippingBox",t.engine.scene.add(n));let i=[new P(e.min.x,e.max.y,e.min.z),new P(e.max.x,e.max.y,e.min.z),new P(e.max.x,e.max.y,e.max.z),new P(e.min.x,e.max.y,e.max.z)];r(i,new P(0,1,0),"顶");function r(o,a,l){const c=new ht,h=new Float32Array([o[0].x,o[0].y,o[0].z,o[1].x,o[1].y,o[1].z,o[2].x,o[2].y,o[2].z,o[3].x,o[3].y,o[3].z]),u=[0,1,2,0,2,3];c.setAttribute("position",new at(h,3)),c.setIndex(u);let d=t.meshs.find(m=>m.name==l);if(d==null){const m=new Xt({color:65280,transparent:!0,opacity:.02,side:Et}),b=new ut(c,m);b.normal=a,b.name=l,n.add(b),t.meshs.push(b)}else d.geometry=c;const f=new Float32Array([o[0].x,o[0].y,o[0].z,o[1].x,o[1].y,o[1].z,o[2].x,o[2].y,o[2].z,o[3].x,o[3].y,o[3].z,o[0].x,o[0].y,o[0].z]);let p=new as({color:255}),g=new ht;g.setAttribute("position",new at(f,3));let x=t.meshs.find(m=>m.name==l+"Line");x==null&&(x=new Xi(g,p),x.name=l+"Line",n.add(x),t.meshs.push(x)),x.geometry=g,x.material=p,t.engine.sectionPlane.find(m=>m.name==l).setFromNormalAndCoplanarPoint(a.clone().setLength(-1),e.max),t.engine.scene.children.filter(m=>m.type=="Mesh"&&m.url).forEach(m=>{m.material&&Array.isArray(m.material)?m.material.forEach(b=>{b.clippingPlanes=t.engine.sectionPlane}):m.material.clippingPlanes=t.engine.sectionPlane})}}handleMouseDown(e){this.csgClipping?.hideSection(),this.isDrag=!0;const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0)if(this.pickPoint=t[0].point,this.pickNormal=t[0].face.normal,this.engine.controls.enabled=!1,this.pickMesh=t[0].object,this.box_={min:this.box.min.clone(),max:this.box.max.clone()},this.pickNormal.y==0){const n=new yt;n.setFromNormalAndCoplanarPoint(new P(0,1,0),this.pickPoint),this.plane=n}else{let n=new P(this.engine.camera.position.x,this.pickPoint.y,this.engine.camera.position.z);const i=new yt;i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1),this.pickPoint),this.plane=i}}handleMouseUp(e){this.isDrag=!1,this.pickPoint=null,this.pickNormal=null,this.pickMesh=null,this.engine.controls.enabled=!0,this.csgClipping&&this.isActive&&(this.csgClipping.updateAllSections(),this.csgClipping?.showSection())}handleMouseMove(e){this.meshs.forEach(n=>{n.material.opacity=0});const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0&&(t[0].object.material.opacity=.05),this.pickPoint!=null){const n=new P;if(e.raycaster.ray.intersectPlane(this.plane,n)){let i=n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());this.pickMesh.name=="前"||this.pickMesh.name=="左"||this.pickMesh.name=="底"?this.box.min=this.box_.min.clone().add(this.pickNormal.clone().setLength(i)):this.box.max=this.box_.max.clone().add(this.pickNormal.clone().setLength(i)),this.updata_face(this.box)}}}update(){this.csgClipping&&this.csgClipping.update()}enableCsgClipping(){this.csgClipping||this.initCsgClipping(),this.useCsgClipping=!0,this.isActive&&this.csgClipping&&(this.engine.clipping?.clippingStencil&&this.engine.clipping.clippingStencil.disActive(),this.csgClipping.active())}enableStencilClipping(){this.useCsgClipping=!1,this.isActive&&(this.csgClipping&&this.csgClipping.disActive(),this.engine.clipping?.clippingStencil&&this.engine.clipping.clippingStencil.active())}setCsgColor(e){this.csgClipping&&this.csgClipping.setSectionColor(e)}getCsgStats(){return this.csgClipping?.getCacheStats()}clearCsgCache(){this.csgClipping?.clearAllCache()}dispose(){this.disActive(),this.csgClipping&&(this.csgClipping.dispose(),this.csgClipping=null)}}class wE{engine;isActive=!1;isDrag=!1;meshs=[];box;pickPoint;pickNormal;pickMesh;box_;plane;constructor(e){this.engine=e,this.meshs=[],this.box=null}active(){this.isActive!=!0&&(this.isActive=!0,this.init(),this.meshs.forEach(e=>{e.visible=!0}),this.engine.handelBehaved.init(this),this.engine.handelBehaved.active())}disActive(){this.isActive=!1,this.engine.handelBehaved.disActive();const e=this.engine.sectionPlane.find(t=>t.name=="左");e&&(e.constant=1e5),this.meshs.forEach(t=>{t.visible=!1})}init(){let e=this.engine.octreeBox.getBoundingBox();this.box=e,this.updata_face(e)}updata_face(e){let t=this,n=t.engine.scene.children.find(o=>o.type=="Group"&&o.name=="ClippingBox");n==null&&(n=new xn,n.name="ClippingBox",t.engine.scene.add(n));let i=[new P(e.min.x,e.min.y,e.max.z),new P(e.min.x,e.min.y,e.min.z),new P(e.min.x,e.max.y,e.min.z),new P(e.min.x,e.max.y,e.max.z)];r(i,new P(-1,0,0),"左");function r(o,a,l){const c=new ht,h=new Float32Array([o[0].x,o[0].y,o[0].z,o[1].x,o[1].y,o[1].z,o[2].x,o[2].y,o[2].z,o[3].x,o[3].y,o[3].z]),u=[0,1,2,0,2,3];c.setAttribute("position",new at(h,3)),c.setIndex(u);let d=t.meshs.find(m=>m.name==l);if(d==null){const m=new Xt({color:65280,transparent:!0,opacity:.02,side:Et}),b=new ut(c,m);b.normal=a,b.name=l,n.add(b),t.meshs.push(b)}else d.geometry=c;const f=new Float32Array([o[0].x,o[0].y,o[0].z,o[1].x,o[1].y,o[1].z,o[2].x,o[2].y,o[2].z,o[3].x,o[3].y,o[3].z,o[0].x,o[0].y,o[0].z]);let p=new as({color:255}),g=new ht;g.setAttribute("position",new at(f,3));let x=t.meshs.find(m=>m.name==l+"Line");x==null&&(x=new Xi(g,p),x.name=l+"Line",n.add(x),t.meshs.push(x)),x.geometry=g,x.material=p,t.engine.sectionPlane.find(m=>m.name==l).setFromNormalAndCoplanarPoint(a.clone().setLength(-1),e.min),t.engine.scene.children.filter(m=>m.type=="Mesh"&&m.url).forEach(m=>{m.material&&Array.isArray(m.material)?m.material.forEach(b=>{b.clippingPlanes=t.engine.sectionPlane}):m.material.clippingPlanes=t.engine.sectionPlane})}}handleMouseDown(e){this.isDrag=!0;const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0)if(this.pickPoint=t[0].point,this.pickNormal=t[0].face.normal,this.engine.controls.enabled=!1,this.pickMesh=t[0].object,this.box_={min:this.box.min.clone(),max:this.box.max.clone()},this.pickNormal.y==0){const n=new yt;n.setFromNormalAndCoplanarPoint(new P(0,1,0),this.pickPoint),this.plane=n}else{let n=new P(this.engine.camera.position.x,this.pickPoint.y,this.engine.camera.position.z);const i=new yt;i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1),this.pickPoint),this.plane=i}}handleMouseUp(e){this.isDrag=!1,this.pickPoint=null,this.pickNormal=null,this.pickMesh=null,this.engine.controls.enabled=!0}handleMouseMove(e){this.meshs.forEach(n=>{n.material.opacity=0});const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0&&(t[0].object.material.opacity=.05),this.pickPoint!=null){const n=new P;if(e.raycaster.ray.intersectPlane(this.plane,n)){let i=n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());this.pickMesh.name=="前"||this.pickMesh.name=="左"||this.pickMesh.name=="底"?this.box.min=this.box_.min.clone().add(this.pickNormal.clone().setLength(i)):this.box.max=this.box_.max.clone().add(this.pickNormal.clone().setLength(i)),this.updata_face(this.box)}}}}class SE{engine;isActive=!1;box;pickPoint;pickNormal;pickMesh;box_;plane;meshs;isDrag=!1;csgClipping=null;useCsgClipping=!0;constructor(e,t){this.engine=e,this.meshs=[],t?.useCsgClipping!==void 0&&(this.useCsgClipping=t.useCsgClipping),this.useCsgClipping&&this.initCsgClipping()}initCsgClipping(){this.csgClipping=new N0(this.engine,{updateThrottleTime:150,cacheExpireTime:45e3}),this.csgClipping.planes=this.engine.sectionPlane,this.csgClipping.init()}active(){console.log("调用这里了"),!this.isActive&&(this.isActive=!0,this.init(),this.meshs.forEach(e=>{e.visible=!0}),this.engine.handelBehaved.init(this),this.engine.handelBehaved.active(),this.csgClipping&&this.csgClipping.active(),this.engine.models.forEach(e=>{e.nodesMap.forEach(t=>{t.infos.forEach(n=>{this.csgClipping?.addSourceMesh(n.mesh)})})}))}disActive(){this.isActive=!1,this.engine.handelBehaved.disActive(),this.csgClipping&&this.csgClipping.disActive(),this.engine.sectionPlane.forEach(e=>{e.constant=1e5}),this.meshs.forEach(e=>{e.visible=!1})}init(){let e=this.engine.octreeBox.getBoundingBox();this.box=e,this.updata_face(e)}getboxXyz(){return{minX:this.box.min.x,minY:this.box.min.y,minZ:this.box.min.z,maxX:this.box.max.x,maxY:this.box.max.y,maxZ:this.box.max.z}}setboxXyz(e){this.box.min.x=e.minX,this.box.min.y=e.minY,this.box.min.z=e.minZ,this.box.max.x=e.maxX,this.box.max.y=e.maxY,this.box.max.z=e.maxZ,this.updata_face(this.box)}setBox(e){this.box=e,this.updata_face(e)}reverseBox(){}setboxPercent(e){console.log("[SectionBox] setboxPercent called with:",e)}handleMouseDown(e){this.isDrag=!0;const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0)if(this.pickPoint=t[0].point,this.pickNormal=t[0].face.normal,this.engine.controls.enabled=!1,this.pickMesh=t[0].object,this.box_={min:this.box.min.clone(),max:this.box.max.clone()},this.pickNormal.y==0){const n=new yt;n.setFromNormalAndCoplanarPoint(new P(0,1,0),this.pickPoint),this.plane=n}else{let n=new P(this.engine.camera.position.x,this.pickPoint.y,this.engine.camera.position.z);const i=new yt;i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1),this.pickPoint),this.plane=i}}handleMouseUp(e){this.isDrag=!1,this.pickPoint=null,this.pickNormal=null,this.pickMesh=null,this.engine.controls.enabled=!0,this.csgClipping&&this.isActive&&(this.csgClipping.updateAllSections(),this.csgClipping?.showSection())}handleMouseMove(e){this.meshs.forEach(n=>{n.material.opacity=0});const t=e.raycaster.intersectObjects(this.meshs,!1);if(t!=null&&t.length>0&&(t[0].object.material.opacity=.05),this.pickPoint!=null){const n=new P;if(e.raycaster.ray.intersectPlane(this.plane,n)){let i=n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());this.pickMesh.name=="前"||this.pickMesh.name=="左"||this.pickMesh.name=="底"?this.box.min=this.box_.min.clone().add(this.pickNormal.clone().setLength(i)):this.box.max=this.box_.max.clone().add(this.pickNormal.clone().setLength(i)),this.updata_face(this.box)}}}updata_face(e){let t=this,n=[new P(e.min.x,e.min.y,e.min.z),new P(e.max.x,e.min.y,e.min.z),new P(e.max.x,e.max.y,e.min.z),new P(e.min.x,e.max.y,e.min.z)],i=[new P(e.min.x,e.min.y,e.max.z),new P(e.max.x,e.min.y,e.max.z),new P(e.max.x,e.max.y,e.max.z),new P(e.min.x,e.max.y,e.max.z)],r=[new P(e.max.x,e.min.y,e.max.z),new P(e.max.x,e.min.y,e.min.z),new P(e.max.x,e.max.y,e.min.z),new P(e.max.x,e.max.y,e.max.z)],o=[new P(e.min.x,e.min.y,e.min.z),new P(e.min.x,e.min.y,e.max.z),new P(e.min.x,e.max.y,e.max.z),new P(e.min.x,e.max.y,e.min.z)],a=[new P(e.min.x,e.max.y,e.min.z),new P(e.max.x,e.max.y,e.min.z),new P(e.max.x,e.max.y,e.max.z),new P(e.min.x,e.max.y,e.max.z)],l=[new P(e.min.x,e.min.y,e.min.z),new P(e.max.x,e.min.y,e.min.z),new P(e.max.x,e.min.y,e.max.z),new P(e.min.x,e.min.y,e.max.z)];c(n,new P(0,0,-1),"前"),c(i,new P(0,0,1),"后"),c(r,new P(1,0,0),"右"),c(o,new P(-1,0,0),"左"),c(a,new P(0,1,0),"顶"),c(l,new P(0,-1,0),"底");function c(h,u,d){const f=new ht,p=new Float32Array([h[0].x,h[0].y,h[0].z,h[1].x,h[1].y,h[1].z,h[2].x,h[2].y,h[2].z,h[3].x,h[3].y,h[3].z]),g=[0,1,2,0,2,3];f.setAttribute("position",new at(p,3)),f.setIndex(g);let x=t.engine.scene.children.find(E=>E.type=="Group"&&E.name=="ClippingBox");x==null&&(x=new xn,x.name="ClippingBox",t.engine.scene.add(x));let m=t.meshs.find(E=>E.name==d);if(m==null){const E=new Xt({color:65280,transparent:!0,opacity:0,side:Et}),A=new ut(f,E);A.normal=u,A.name=d,x.add(A),t.meshs.push(A)}else m.geometry=f;const b=new Float32Array([h[0].x,h[0].y,h[0].z,h[1].x,h[1].y,h[1].z,h[2].x,h[2].y,h[2].z,h[3].x,h[3].y,h[3].z,h[0].x,h[0].y,h[0].z]);let v=new as({color:255}),y=new ht;y.setAttribute("position",new at(b,3));let M=t.meshs.find(E=>E.name==d+"Line");M==null&&(M=new Xi(y,v),M.name=d+"Line",x.add(M),t.meshs.push(M)),M.geometry=y,M.material=v,d=="前"||d=="左"||d=="底"?t.engine.sectionPlane.find(E=>E.name==d).setFromNormalAndCoplanarPoint(u.clone().setLength(-1),e.min):t.engine.sectionPlane.find(E=>E.name==d).setFromNormalAndCoplanarPoint(u.clone().setLength(-1),e.max),t.engine.scene.children.filter(E=>E.type=="Mesh"&&E.url).forEach(E=>{E.material&&Array.isArray(E.material)?E.material.forEach(A=>{A.clippingPlanes=t.engine.sectionPlane}):E.material.clippingPlanes=t.engine.sectionPlane})}}}class EE{engine;sectionPlaneX;sectionPlaneY;sectionPlaneZ;sectionBox;clippingStencil;constructor(e){this.engine=e;let t=new yt(new P(0,0,1),1e5);t.name="前";let n=new yt(new P(0,0,1),1e5);n.name="左";let i=new yt(new P(0,0,1),1e5);i.name="后";let r=new yt(new P(0,0,1),1e5);r.name="右";let o=new yt(new P(0,0,1),1e5);o.name="顶";let a=new yt(new P(0,0,1),1e5);a.name="底",this.engine.sectionPlane=[t,n,i,r,o,a]}init(){this.sectionPlaneX=new Dw(this.engine),this.sectionPlaneY=new ME(this.engine),this.sectionPlaneZ=new wE(this.engine),this.sectionBox=new SE(this.engine)}disActive(){this.sectionPlaneX.disActive(),this.sectionPlaneY.disActive(),this.sectionPlaneZ.disActive(),this.sectionBox.disActive()}}class TE{engine;constructor(e){this.engine=e}getLevelTreeData(){let e=[];return this.engine.engineStatus.models.forEach(t=>{e.push({children:t.info.modelTree.modelTreeLevel,name:t.info.baseInfo.name})}),e}getTypeTreeData(){let e=[];return this.engine.engineStatus.models.forEach(t=>{e.push({children:t.info.modelTree.modelTreeType,name:t.info.baseInfo.name})}),e}getMajorTreeData(){let e=[];return this.engine.engineStatus.models.forEach(t=>{e.push({children:t.info.modelTree.modelTreeMajor,name:t.info.baseInfo.name})}),e}}class AE{engine;constructor(e){this.engine=e}getEngineInfo(){let e=0,t=0,n=0;return!this.engine||!this.engine.scene?{totalVertices:0,totalTriangles:0,meshCount:0}:(this.engine.scene.traverse(i=>{if(i instanceof ut){const r=i.geometry;if(r&&r.attributes){const o=r.attributes.position;if(o){const a=o.count;e+=a;let l=0;r.index?l=r.index.count/3:l=a/3,t+=l,n++}}}}),{totalVertices:Math.floor(e),totalTriangles:Math.floor(t),meshCount:n})}}class CE{engine;constructor(e){this.engine=e}init(){}getModelProperties(e,t,n){let i=this.engine.engineStatus.models.find(o=>o.url===e);i.properties==null&&Am(e+"/property",o=>{let a=JSON.parse(o);i.properties=a,setTimeout(()=>{r(a,t,n)},100)}),r(i.properties,t,n);function r(o,a,l){let c=[],h=o.models[a.toString()||""],u=h.map(d=>d[0]);u=u.filter((d,f)=>u.indexOf(d)===f),u.forEach(d=>{let f={name:o.categorys[d],children:[]};c.push(f),h.filter(p=>p[0]===d).forEach(p=>{f.children.push({name:o.names[p[1]],value:o.values[p[2]]})})}),l?.({properties:c,materials:[]})}}}class PE{engine;constructor(e){this.engine=e}getModelTypes(){let e=[];return this.engine.engineStatus.models.forEach(t=>{t.info.modelMapper.forEach(n=>{e.push(n.typeName)})}),e=e.filter((t,n,i)=>i.indexOf(t)===n),e}getModelMajors(){let e=[];return this.engine.engineStatus.models.forEach(t=>{t.info.modelMapper.forEach(n=>{e.push(n.majorName)})}),e=e.filter((t,n,i)=>i.indexOf(t)===n),e}getModelLevels(){let e=[];return this.engine.engineStatus.models.forEach(t=>{t.info.modelMapper.forEach(n=>{e.push(n.levelName)})}),e=e.filter((t,n,i)=>i.indexOf(t)===n),e}getModelMappers(e){}getModelMapper(e,t){let n=this.engine.engineStatus.models.find(i=>i.url==e);return n?n.info.modelMapper.find(i=>i.id==t):null}getModelSWithType(e,t=null){let n=[];return this.engine.engineStatus.models.forEach(i=>{let r={url:i.url,ids:[]};n.push(r),i.info.modelMapper.filter(o=>o.typeName===e).forEach(o=>{r.ids.push(Number(o.id))})}),t&&t(n),n}getModelSWithLevel(e,t){let n=[];return this.engine.engineStatus.models.forEach(i=>{let r={url:i.url,ids:[]};n.push(r),i.info.modelMapper.filter(o=>o.levelName===e).forEach(o=>{r.ids.push(Number(o.id))})}),t&&t(n),n}getModelsWithMajor(e,t){let n=[];return this.engine.engineStatus.models.forEach(i=>{let r={url:i.url,ids:[]};n.push(r),i.info.modelMapper.filter(o=>o.majorName===e).forEach(o=>{r.ids.push(Number(o.id))})}),t&&t(n),n}}class RE{engine;isActive=!1;groupEdge;material;indexes=new Map;constructor(e){this.engine=e,this.groupEdge=this.engine.scene.getObjectByName("groupEdge"),this.material=new as({color:"#000000",depthTest:!0})}active(){this.isActive=!0,this.groupEdge.visible=!0,this.show()}disActive(){this.isActive=!1,this.groupEdge.visible=!1}show(){this.engine.engineStatus.models.forEach(e=>{if(!this.groupEdge.children.find(t=>t.url==e.url)){let t=e.info,n=[],i=new Map;t.modelEdge.forEach(a=>{let l=n.length;for(let c=0;cc.url==e);if(l){let c=l.geometry.attributes.position.array;for(let h=r;hc.url==e);if(l){let c=l.geometry.attributes.position.array,h=0;for(let u=r;u=3;if(a[d]&&a[d].length===2){const p=f?a[d][1]:a[d][0];c[u]=p.X,c[u+1]=p.Z,c[u+2]=-p.Y}h+=3}l.geometry.attributes.position.needsUpdate=!0}}}}}class LE{config;constructor(e){this.config={temperature:.7,maxTokens:2e3,timeout:3e4,...e}}async chat(e){const t=new AbortController,n=setTimeout(()=>t.abort(),this.config.timeout);try{const i=await fetch(`${this.config.baseURL}/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:JSON.stringify({model:this.config.model,messages:e,temperature:this.config.temperature,max_tokens:this.config.maxTokens,stream:!1}),signal:t.signal});if(clearTimeout(n),!i.ok){const r=await i.json().catch(()=>({}));throw new Error(`API请求失败 (${i.status}): ${r.error?.message||r.message||i.statusText}`)}return(await i.json()).choices?.[0]?.message?.content||""}catch(i){throw clearTimeout(n),i.name==="AbortError"?new Error("请求超时,请重试"):i.message.includes("Failed to fetch")?new Error(`网络请求失败,请检查: 1. 网络连接 2. API地址是否正确 3. 是否有CORS限制`):i}}async chatStream(e,t){const n=new AbortController,i=setTimeout(()=>n.abort(),this.config.timeout);try{const r=await fetch(`${this.config.baseURL}/chat/completions`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:JSON.stringify({model:this.config.model,messages:e,temperature:this.config.temperature,max_tokens:this.config.maxTokens,stream:!0}),signal:n.signal});if(clearTimeout(i),!r.ok){const c=await r.json().catch(()=>({}));throw new Error(`API请求失败 (${r.status}): ${c.error?.message||c.message||r.statusText}`)}const o=r.body?.getReader();if(!o)throw new Error("无法读取响应流");const a=new TextDecoder;let l="";for(;;){const{done:c,value:h}=await o.read();if(c){t("",!0);break}l+=a.decode(h,{stream:!0});const u=l.split(` -`);l=u.pop()||"";for(const d of u){const f=d.trim();if(!f||!f.startsWith("data: "))continue;const p=f.slice(6);if(p!=="[DONE]")try{const g=JSON.parse(p).choices?.[0]?.delta?.content;g&&t(g,!1)}catch(g){console.warn("解析流式数据失败:",g)}}}}catch(r){throw clearTimeout(i),r.name==="AbortError"?new Error("请求超时,请重试"):r.message.includes("Failed to fetch")?new Error("网络请求失败,请检查网络连接"):r}}updateConfig(e){this.config={...this.config,...e}}getConfig(){return{...this.config}}}class IE{engine;steps=[];stepResults=new Map;conversationHistory=[];state="idle";llmApi=null;config=null;_callback_message;_callback_question;_callback_content;prompts={};constructor(e){this.engine=e}async init(e,t,n){this._callback_message=e,this._callback_question=t,this._callback_content=n,this.conversationHistory=[];let i={llmConfig:{baseURL:"https://api.deepseek.com/v1",apiKey:"sk-4677b153277a40b096c6716686c29ac4",model:"deepseek-chat",temperature:.7,maxTokens:2e3},debug:!0,stepExecution:{maxRetries:5},prompts:{main:"",step:"",apiDoc:""}};try{this.config=i,this.llmApi=new DE(i.llmConfig);try{const r=await Promise.resolve().then(()=>wT);this.prompts.main=r.default;const o=await Promise.resolve().then(()=>ST);this.prompts.step=o.default;const a=await Promise.resolve().then(()=>ET);this.prompts.apiDoc=a.default}catch(r){throw console.error("[AI Manager] 提示词文件加载失败:",r),new Error(`提示词文件加载失败: ${r.message||"未知错误"}`)}}catch(r){throw console.error("[AI Manager] 初始化失败:",r),r}}async conversationV2(e){if(this.conversationHistory.length===0){const i={role:"system",content:`${this.prompts.main}`},r={role:"system",content:`## BIM引擎API文档 +`);l=u.pop()||"";for(const d of u){const f=d.trim();if(!f||!f.startsWith("data: "))continue;const p=f.slice(6);if(p!=="[DONE]")try{const g=JSON.parse(p).choices?.[0]?.delta?.content;g&&t(g,!1)}catch(g){console.warn("解析流式数据失败:",g)}}}}catch(r){throw clearTimeout(i),r.name==="AbortError"?new Error("请求超时,请重试"):r.message.includes("Failed to fetch")?new Error("网络请求失败,请检查网络连接"):r}}updateConfig(e){this.config={...this.config,...e}}getConfig(){return{...this.config}}}class DE{engine;steps=[];stepResults=new Map;conversationHistory=[];state="idle";llmApi=null;config=null;_callback_message;_callback_question;_callback_content;prompts={};constructor(e){this.engine=e}async init(e,t,n){this._callback_message=e,this._callback_question=t,this._callback_content=n,this.conversationHistory=[];let i={llmConfig:{baseURL:"https://api.deepseek.com/v1",apiKey:"sk-4677b153277a40b096c6716686c29ac4",model:"deepseek-chat",temperature:.7,maxTokens:2e3},debug:!0,stepExecution:{maxRetries:5},prompts:{main:"",step:"",apiDoc:""}};try{this.config=i,this.llmApi=new LE(i.llmConfig);try{const r=await Promise.resolve().then(()=>vT);this.prompts.main=r.default;const o=await Promise.resolve().then(()=>bT);this.prompts.step=o.default;const a=await Promise.resolve().then(()=>yT);this.prompts.apiDoc=a.default}catch(r){throw console.error("[AI Manager] 提示词文件加载失败:",r),new Error(`提示词文件加载失败: ${r.message||"未知错误"}`)}}catch(r){throw console.error("[AI Manager] 初始化失败:",r),r}}async conversationV2(e){if(this.conversationHistory.length===0){const i={role:"system",content:`${this.prompts.main}`},r={role:"system",content:`## BIM引擎API文档 ${this.prompts.apiDoc}`};this.conversationHistory.push(i),this.conversationHistory.push(r)}this.conversationHistory.push({role:"user",content:e});const t=await this.llmApi.chat(this.conversationHistory);this.conversationHistory.push({role:"assistant",content:t}),this.config?.debug&&console.log("[AI Manager] 大模型响应:",t);let n=await this.parseAnalysisResponse(t);n&&n.questions&&n.questions.length>0&&this._callback_question(n.questions)}async parseAnalysisResponse(e){try{if(e.includes("##question##")){const t=e.match(/##question##\s*([\s\S]*?)(?=##|$)/);if(t){let n=t[1].trim();n=n.replace(/^```json\n?/,"").replace(/^```\n?/,"").replace(/\n?```$/,"");const i=n.match(/(\[[\s\S]*\])/);i&&(n=i[1]);const r=JSON.parse(n);return this.state="waiting_answer",{state:"waiting_answer",questions:r}}}if(e.includes("##steps##")){const t=e.match(/##steps##\s*([\s\S]*?)(?=##|$)/);if(t){let n=t[1].trim();n=n.replace(/^```json\n?/,"").replace(/^```\n?/,"").replace(/\n?```$/,"");const i=n.match(/(\[[\s\S]*\])/);return i&&(n=i[1]),this.steps=JSON.parse(n),this.config?.debug&&console.log("[AI Manager] 步骤规划完成,共",this.steps.length,"个步骤"),this._callback_message(this.steps),await this.executeSteps()}}return{state:"completed",data:e}}catch(t){return console.error("[AI Manager] 解析响应失败:",t),{state:"error",error:"解析大模型响应失败: "+t.message}}}async executeSteps(){try{this.state="executing",this.stepResults.clear();for(const e of this.steps){this._callback_message(e),this.config?.debug&&console.log(`[AI Manager] 执行步骤 ${e.id}: ${e.content}`);const t=await this.getDependenciesOutput(e.dependencies),n=await this.executeStep(e,t);this.stepResults.set(e.id,n),this.config?.debug&&console.log(`[AI Manager] 步骤 ${e.id} 执行完成:`,n)}return this.state="completed",{state:"completed",steps:this.steps,result:Array.from(this.stepResults.values())}}catch(e){return console.error("[AI Manager] 步骤执行失败:",e),{state:"error",error:"步骤执行失败: "+e.message}}}async getDependenciesOutput(e){return e.length===0?null:e.length===1?this.stepResults.get(e[0]):e.map(t=>this.stepResults.get(t))}async executeStep(e,t){const n=this.config?.stepExecution?.maxRetries??1,i=[];let r=null,o=!1;for(let a=0;a<=n;a++)try{const l=i.length>0?i[i.length-1]:"",c=await(a===0?this.generateCode(e,t):o?this.regenerateCodeAfterFailure(e,t,l,r,a):this.generateCode(e,t));i.push(c),this.config?.debug&&console.log(`[AI Manager] 步骤 ${e.id} 第 ${a+1} 次生成的代码: ${c}`);try{const h=await this.executeCode(c,t);if(h instanceof Object&&h.success==!1||h instanceof String&&(h.includes("undefined")||h.includes("not"))){r=h,o=!0;debugger;throw h}debugger;return h}catch(h){debugger;throw r=h,o=!0,h}}catch(l){if(o||(r=l),a>=n)throw console.error(`[AI Manager] 执行步骤 ${e.id} 失败(已达重试上限):`,l),new Error(`步骤 ${e.id} (${e.content}) 执行失败: ${l.message}`);console.warn(`[AI Manager] 步骤 ${e.id} 第 ${a+1} 次执行失败,将尝试让AI修复后重试(剩余重试次数:${n-a}):`,l)}throw new Error(`步骤 ${e.id} (${e.content}) 执行失败: 未知错误`)}extractCodeFromResponse(e){const t=e.match(/##code##\s*([\s\S]*?)(?=##|$)/);if(t){let o=t[1].trim();if(o=o.replace(/^```javascript\n?/,"").replace(/^```js\n?/,"").replace(/^```\n?/,"").replace(/\n?```$/,""),o.length>0)return o}const n=[/```javascript\s*([\s\S]*?)```/i,/```js\s*([\s\S]*?)```/i,/```\s*([\s\S]*?)```/];for(const o of n){const a=e.match(o);if(a&&a[1]){const l=a[1].trim();if(l.length>0)return this.config?.debug&&console.warn("[AI Manager] 未找到 ##code## 标记,从 markdown 代码块中提取代码"),l}}const i=/[请|说明|注意|需要|应该|可以|如果|但是|因为|所以|例如|比如]/i.test(e),r=/(function|const|let|var|return|async|await|=>|engine\.|previousStepOutput)/.test(e);if(!i&&r){const o=e.trim().replace(/^[,。:;!?\s]+/,"").replace(/[,。:;!?\s]+$/,"");if(o.length>10)return this.config?.debug&&console.warn("[AI Manager] 未找到 ##code## 标记和代码块,尝试使用整个响应作为代码"),o}throw new Error(`无法从大模型响应中提取代码。响应内容:${e.substring(0,200)}...`)}async generateCode(e,t){try{const n={role:"system",content:`${this.prompts.step}`},i={role:"system",content:` @@ -4836,14 +4836,11 @@ ${JSON.stringify(l,null,2)} 4) 代码需要能在浏览器环境运行(不要使用 Node 专属 API)`},h=await this.llmApi.chat([o,a,c]);try{return this.extractCodeFromResponse(h)}catch(u){throw new Error(`无法从大模型响应中提取代码(修复重试阶段):${u.message}`)}}catch(o){throw console.error("[AI Manager] 修复后代码生成失败:",o),o}}async executeCode(e,t){try{const n=this.engine;let i=e;i=i.replace(/\b(const|let|var)\s+previousStepOutput\s*=\s*[^;]*;/g,""),i=i.replace(/\b(const|let|var)\s+previousStepOutput\s*;/g,"");const r=new Function("engine","previousStepOutput",` 'use strict'; ${i} - `)(n,t);return r&&typeof r.then=="function"?await r:r}catch(n){return console.error("[AI Manager] 代码执行失败:",n),"error"+n.message}}reset(){this.conversationHistory=[],this.steps=[],this.stepResults.clear(),this.state="idle",this.config?.debug&&console.log("[AI Manager] 对话已重置")}getState(){return this.state}getHistory(){return[...this.conversationHistory]}getSteps(){return[...this.steps]}getStepResults(){return new Map(this.stepResults)}}class BE{options;DeviceType;animationId=null;isRenderingPaused=!1;controlsEnabledBeforePause=!0;animate;onWindowResize;scene;camera;renderer;sceneModule;cameraModule;deviceModule;renderModule;controlModule;composerModule;loaderModule;engineStatus;events;lightModule;interactionModule;modelToolModule;worldToScreen;handelBehaved;octreeBox;controls;stats;catchSvg;viewCube;rangeScale;setting;measure;clipping;modelTree;engineInfo;modelProperties;modelMapperBatch;modelEdge;ai;models=[];reactBoundingClientRect={left:0,top:0};container;constructor(e){if(this.options=e,this.container=document.getElementById(e.containerId),!this.container)throw new Error(`Container ${e.containerId} not found`);this.ai=new IE(this),this.ai.init(),this.deviceModule=new r2(this),this.DeviceType=this.deviceModule.getDeviceType(),this.cameraModule=new s2(this),this.sceneModule=new i2(this),this.scene=this.sceneModule.scene,this.renderModule=new o2(this),this.renderer=this.renderModule.createRenderer(),this.camera=this.cameraModule.orthographicCamera,this.scene.camera=this.camera,this.controlModule=new _2(this),this.controlModule.switchDefaultMode(),this.controls=this.controlModule.orbitControls,this.composerModule=new k2(this),this.composerModule.init(),this.events=new aw,this.engineStatus=new ow(this),this.engineStatus.init(),this.loaderModule=new rw(this),this.lightModule=new lw(this),this.lightModule.init(),this.viewCube=new yw(this),this.viewCube.init(),this.octreeBox=_w(this),this.rangeScale=new Mw(this),this.rangeScale.init(),this.clipping=new TE(this),this.clipping.init(),this.setting=new ww(this),this.setting.init(),this.handelBehaved=qh(this),this.modelMapperBatch=new RE(this),this.measure=new Dw(this),this.modelToolModule=new hw(this),this.modelProperties=new PE(this),this.interactionModule=new cw(this),this.interactionModule.init(),this.interactionModule.active(),this.modelEdge=new LE(this),this.modelTree=new AE(this),this.engineInfo=new CE(this),this.worldToScreen=new kn(this.camera,this.renderer,this.scene),this.reactBoundingClientRect=this.container.getBoundingClientRect(),this.stats=new pw,this.stats.showPanel(0),this.stats.dom.style.position="absolute",this.stats.dom.style.top="0px",this.stats.dom.style.left="0px",this.stats.dom.style.zIndex="1000",this.container.appendChild(this.stats.dom);let t=document.createElementNS("http://www.w3.org/2000/svg","svg");t.style.position="absolute",t.style.width="100%",t.style.height="100%",t.style.zIndex="1000",t.style.left="0px",t.style.top="0px",t.style.pointerEvents="none";const n=this.renderer?.domElement.width||1920,i=this.renderer?.domElement.height||1080;t.setAttribute("viewBox",`0 0 ${n} ${i}`),t.setAttribute("preserveAspectRatio","none"),this.container.appendChild(t),this.catchSvg=t,this.onWindowResize=()=>{this.handleWindowResize()},window.addEventListener("resize",this.onWindowResize),this.animate=()=>{if(!this.isRenderingPaused)this.animationId=requestAnimationFrame(this.animate);else{this.animationId=null;return}this.stats&&this.stats.begin(),this.composerModule&&this.composerModule.composer.render(),this.viewCube.cubeTool.RenderScene(),this.measure.update(),this.controlModule.update(),this.stats&&this.stats.end()},this.animate()}pauseRendering(){if(this.isRenderingPaused){console.warn("[BimEngine] Rendering is already paused");return}this.isRenderingPaused=!0,this.controls&&(this.controlsEnabledBeforePause=this.controls.enabled,this.controls.enabled=!1)}resumeRendering(){if(!this.isRenderingPaused){console.warn("[BimEngine] Rendering is not paused");return}this.isRenderingPaused=!1,this.controls&&(this.controls.enabled=this.controlsEnabledBeforePause),this.animationId===null&&this.animate()}isRenderingPausedState(){return this.isRenderingPaused}handleWindowResize(){if(!this.container||!this.renderer||!this.camera)return;this.reactBoundingClientRect=this.container.getBoundingClientRect();const{width:e,height:t}=this.deviceModule.getContainerSize();this.renderer.setSize(e,t);const n=e/t;if(this.camera===this.cameraModule.perspectiveCamera?(this.cameraModule.perspectiveCamera.aspect=n,this.cameraModule.perspectiveCamera.updateProjectionMatrix()):this.camera===this.cameraModule.orthographicCamera&&(this.cameraModule.orthographicCamera.left=50*n/-2,this.cameraModule.orthographicCamera.right=50*n/2,this.cameraModule.orthographicCamera.top=50/2,this.cameraModule.orthographicCamera.bottom=50/-2,this.cameraModule.orthographicCamera.updateProjectionMatrix()),this.composerModule&&this.composerModule.composer&&this.composerModule.composer.setSize(e,t),this.catchSvg){const i=this.renderer.domElement.width,r=this.renderer.domElement.height;this.catchSvg.setAttribute("viewBox",`0 0 ${i} ${r}`)}this.events&&this.events.trigger(Ar.ViewportResize,{width:e,height:t})}dispose(){console.log("[BimEngine] Starting engine disposal..."),this.animationId!==null&&(cancelAnimationFrame(this.animationId),this.animationId=null),this.isRenderingPaused=!0,this.onWindowResize&&window.removeEventListener("resize",this.onWindowResize);try{this.measure&&(this.measure.disActive(),this.measure.clearAll(),this.measure.annotationContainer&&this.measure.annotationContainer.remove()),this.clipping&&this.clipping.disActive(),this.interactionModule&&this.interactionModule.disActive(),this.viewCube&&this.viewCube.cubeTool&&typeof this.viewCube.cubeTool.dispose=="function"&&this.viewCube.cubeTool.dispose()}catch(e){console.warn("[BimEngine] Error disposing managers:",e)}try{this.controlModule&&(this.controlModule.originDiv&&this.controlModule.originDiv.remove(),this.controlModule.orbitControls&&typeof this.controlModule.orbitControls.dispose=="function"&&this.controlModule.orbitControls.dispose(),this.controlModule.firstPersonControls&&typeof this.controlModule.firstPersonControls.dispose=="function"&&this.controlModule.firstPersonControls.dispose())}catch(e){console.warn("[BimEngine] Error disposing controls:",e)}this.scene&&this.clearScene(this.scene);try{this.composerModule&&this.composerModule.composer&&(this.composerModule.composer.passes&&this.composerModule.composer.passes.forEach(e=>{e.dispose&&e.dispose()}),this.composerModule.composer.renderTarget1&&this.composerModule.composer.renderTarget1.dispose(),this.composerModule.composer.renderTarget2&&this.composerModule.composer.renderTarget2.dispose())}catch(e){console.warn("[BimEngine] Error disposing composer:",e)}try{this.renderModule&&this.renderModule.disposeRenderer(),this.renderer&&(this.renderer.domElement&&this.renderer.domElement.parentElement&&this.renderer.domElement.parentElement.removeChild(this.renderer.domElement),this.renderer.dispose(),this.renderer.forceContextLoss())}catch(e){console.warn("[BimEngine] Error disposing renderer:",e)}try{this.stats&&this.stats.dom&&this.stats.dom.parentElement&&this.stats.dom.parentElement.removeChild(this.stats.dom),this.catchSvg&&this.catchSvg.parentElement&&this.catchSvg.parentElement.removeChild(this.catchSvg)}catch(e){console.warn("[BimEngine] Error disposing DOM elements:",e)}try{this.events&&this.events.listeners&&this.events.listeners.clear()}catch(e){console.warn("[BimEngine] Error clearing event listeners:",e)}this.scene=null,this.camera=null,this.renderer=null,this.controls=null,this.models=[],this.container=null,console.log("[BimEngine] Engine disposal completed")}clearScene(e){e&&([...e.children].forEach(t=>{this.clearScene(t)}),e.parent&&e.parent.remove(e),e instanceof ut&&(e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(t=>this.disposeMaterial(t)):this.disposeMaterial(e.material))),e instanceof Xi&&(e.geometry&&e.geometry.dispose(),e.material&&this.disposeMaterial(e.material)),e instanceof Cf&&(e.geometry&&e.geometry.dispose(),e.material&&this.disposeMaterial(e.material)),e instanceof ho&&(e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(t=>this.disposeMaterial(t)):this.disposeMaterial(e.material)),e.instanceMatrix&&(e.instanceMatrix=null),e.instanceColor&&(e.instanceColor=null)),e instanceof Ex&&e.material&&this.disposeMaterial(e.material))}disposeMaterial(e){e&&(["map","lightMap","bumpMap","normalMap","specularMap","envMap","alphaMap","aoMap","displacementMap","emissiveMap","gradientMap","metalnessMap","roughnessMap","clearcoatMap","clearcoatNormalMap","clearcoatRoughnessMap","transmissionMap","thicknessMap","sheenColorMap","sheenRoughnessMap","specularIntensityMap","specularColorMap","iridescenceMap","iridescenceThicknessMap"].forEach(t=>{const n=e[t];n&&n instanceof Ht&&n.dispose()}),e.dispose())}}function NE(s){return new BE(s)}class kE{engine=null;container;containerId;options;_isInitialized=!1;_isDestroyed=!1;unsubscribeTheme=null;currentMeasureType=null;isMeasureActive=!1;currentSectionAxis=null;isSectionBoxActive=!1;constructor(e){this.container=e.container,this.container.id?this.containerId=this.container.id:(this.containerId=`engine-container-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,this.container.id=this.containerId),this.options={backgroundColor:"linear-gradient(to bottom, rgb(214, 224, 235), rgb(246, 250, 255))",version:e.version??"v2",showStats:e.showStats??!1,showViewCube:e.showViewCube??!0}}init(){if(this._isInitialized){console.warn("[Engine] Engine already initialized.");return}if(this._isDestroyed){console.error("[Engine] Cannot initialize destroyed engine.");return}try{typeof this.options.backgroundColor=="string"&&(this.container.style.background=this.options.backgroundColor);const e={containerId:this.containerId,backgroundColor:this.options.backgroundColor,version:this.options.version,showStats:this.options.showStats,showViewCube:this.options.showViewCube};if(console.log("引擎配置信息:",e),this.engine=NE(e),!this.engine)throw new Error("Failed to create engine instance");this._isInitialized=!0,this.unsubscribeTheme=rt.subscribe(t=>{this.setTheme(t)}),this.setTheme(rt.getTheme())}catch(e){throw console.error("[Engine] Failed to initialize engine:",e),this._isInitialized=!1,e}}setTheme(e){}setLocales(){}isInitialized(){return this._isInitialized}loadModel(e,t){if(!this._isInitialized||!this.engine){console.error("[Engine] Engine not initialized. Please call init() first.");return}if(!e){console.error("[Engine] Model URL is required.");return}this.engine.loaderModule.loadModels([e],t)}CameraGoHome(){this.engine.viewCube.CameraGoHome()}getEngine(){return this.engine}pauseRendering(){if(!this._isInitialized||!this.engine){console.warn("[Engine] Engine not initialized.");return}this.engine.pauseRendering()}resumeRendering(){if(!this._isInitialized||!this.engine){console.warn("[Engine] Engine not initialized.");return}this.engine.resumeRendering()}dispose(){if(!this._isInitialized||!this.engine){console.warn("[Engine] Engine not initialized.");return}this.engine.dispose()}activateMeasureType(e,t){if(!this._isInitialized||!this.engine){console.error("Cannot activate measure: engine not initialized.");return}if(!this.engine.measure){console.error("Measure module not available.");return}this.isMeasureActive||(console.log("激活测量功能"),this.engine.measure.active(),this.isMeasureActive=!0),t(),this.currentMeasureType=e}activateDistanceMeasure(){this.activateMeasureType("distance",()=>{console.log("激活距离测量"),this.engine.measure.distanceMeasure.active()})}activateMinDistanceMeasure(){this.activateMeasureType("minDistance",()=>{console.log("激活最小距离测量"),this.engine.measure.clearDistanceMeasure.active()})}activateAngleMeasure(){this.activateMeasureType("angle",()=>{console.log("激活角度测量"),this.engine.measure.angleMeasure.active(),console.log("[Engine] Angle measure activated (placeholder)")})}activateElevationMeasure(){this.activateMeasureType("elevation",()=>{console.log("激活标高测量"),this.engine.measure.elevationMeasure.active()})}activateVolumeMeasure(){this.activateMeasureType("volume",()=>{console.log("激活体积测量"),this.engine.measure.areaMeasure.active()})}activateLaserDistanceMeasure(){this.activateMeasureType("laserDistance",()=>{console.log("[Engine] Laser distance measure activated (placeholder)")})}activateSlopeMeasure(){this.activateMeasureType("slope",()=>{console.log("激活坡度测量"),this.engine.measure.slopeMeasure.active()})}activateSpaceVolumeMeasure(){this.activateMeasureType("spaceVolume",()=>{console.log("[Engine] Space volume measure activated (placeholder)")})}activateMeasure(e){switch(e){case"distance":this.activateDistanceMeasure();break;case"minDistance":this.activateMinDistanceMeasure();break;case"angle":this.activateAngleMeasure();break;case"elevation":this.activateElevationMeasure();break;case"volume":this.activateVolumeMeasure();break;case"laserDistance":this.activateLaserDistanceMeasure();break;case"slope":this.activateSlopeMeasure();break;case"spaceVolume":this.activateSpaceVolumeMeasure();break}}deactivateMeasure(){!this._isInitialized||!this.engine?.measure||this.isMeasureActive&&(console.log("停用测量功能"),this.engine.measure.disActive(),this.isMeasureActive=!1,this.currentMeasureType=null)}getCurrentMeasureType(){return this.currentMeasureType}clearAllMeasures(){!this._isInitialized||!this.engine?.measure||(console.log("清除所有测量标注"),this.engine.measure.clearAll())}activateSectionAxis(e){if(!this._isInitialized||!this.engine){console.error("[Engine] Cannot activate section axis: engine not initialized.");return}if(!this.engine.clipping){console.error("[Engine] Clipping module not available.");return}if(this.currentSectionAxis===e){console.log(`[Engine] Section axis ${e} already active, skipping.`);return}this.currentSectionAxis&&this.deactivateCurrentSectionAxis();const n={x:this.engine.clipping.sectionPlaneX,y:this.engine.clipping.sectionPlaneY,z:this.engine.clipping.sectionPlaneZ}[e];n&&typeof n.active=="function"?(console.log(`[Engine] Activating section axis: ${e}`),n.active(),this.currentSectionAxis=e):console.error(`[Engine] Section plane ${e} not available.`)}deactivateCurrentSectionAxis(){if(!this.currentSectionAxis||!this.engine?.clipping)return;const t={x:this.engine.clipping.sectionPlaneX,y:this.engine.clipping.sectionPlaneY,z:this.engine.clipping.sectionPlaneZ}[this.currentSectionAxis];t&&typeof t.disActive=="function"&&(console.log(`[Engine] Deactivating section axis: ${this.currentSectionAxis}`),t.disActive())}deactivateSectionAxis(){!this._isInitialized||!this.engine?.clipping||this.currentSectionAxis&&(console.log("[Engine] Deactivating all section axis"),this.engine.clipping.disActive(),this.currentSectionAxis=null)}getCurrentSectionAxis(){return this.currentSectionAxis}activateSectionBox(){if(!this._isInitialized||!this.engine){console.error("[Engine] Cannot activate section box: engine not initialized.");return}if(!this.engine.clipping?.sectionBox){console.error("[Engine] Section box module not available.");return}if(this.isSectionBoxActive){console.log("[Engine] Section box already active, skipping.");return}console.log("[Engine] Activating section box"),this.engine.clipping.sectionBox.active(),this.isSectionBoxActive=!0}deactivateSectionBox(){!this._isInitialized||!this.engine?.clipping?.sectionBox||this.isSectionBoxActive&&(console.log("[Engine] Deactivating section box"),this.engine.clipping.sectionBox.disActive(),this.isSectionBoxActive=!1)}setSectionBoxRange(e){if(!this._isInitialized||!this.engine?.clipping?.sectionBox){console.error("[Engine] Cannot set section box range: engine not initialized.");return}console.log("[Engine] Setting section box range:",e),this.engine.clipping.sectionBox.setboxPercent(e)}fitSectionBoxToModel(){if(!this._isInitialized||!this.engine?.clipping?.sectionBox){console.error("[Engine] Cannot fit section box: engine not initialized.");return}const e=this.engine.octreeBox?.getBoundingBox();if(!e){console.error("[Engine] Cannot fit section box: model bounding box not available.");return}console.log("[Engine] Fitting section box to model"),this.engine.clipping.sectionBox.setBox(e)}resetSectionBox(){this.fitSectionBoxToModel()}isWalkModeActive=!1;activateFirstPersonMode(){if(!this._isInitialized||!this.engine){console.error("[Engine] Cannot activate first person mode: engine not initialized.");return}if(!this.engine.controlModule){console.error("[Engine] Control module not available.");return}if(this.isWalkModeActive){console.log("[Engine] First person mode already active, skipping.");return}console.log("[Engine] Activating first person mode"),this.engine.controlModule.switchFirstPersonMode(),this.isWalkModeActive=!0}deactivateFirstPersonMode(){!this._isInitialized||!this.engine?.controlModule||this.isWalkModeActive&&(console.log("[Engine] Deactivating first person mode"),this.engine.controlModule.switchDefaultMode(),this.isWalkModeActive=!1)}setWalkSpeed(e){if(!this._isInitialized||!this.engine?.controlModule?.firstPersonControls){console.error("[Engine] Cannot set walk speed: engine not initialized.");return}console.log("[Engine] Setting walk speed:",e),this.engine.controlModule.firstPersonControls.moveSpeed=e}setWalkGravity(e){if(!this._isInitialized||!this.engine?.controlModule?.firstPersonControls){console.error("[Engine] Cannot set walk gravity: engine not initialized.");return}console.log("[Engine] Setting walk gravity:",e),this.engine.controlModule.firstPersonControls.applyGravity=e}setWalkCollision(e){if(!this._isInitialized||!this.engine?.controlModule?.firstPersonControls){console.error("[Engine] Cannot set walk collision: engine not initialized.");return}console.log("[Engine] Setting walk collision:",e),this.engine.controlModule.firstPersonControls.applyCollision=e}isFirstPersonModeActive(){return this.isWalkModeActive}activateZoomBox(){if(!this._isInitialized||!this.engine){console.warn("[Engine] Engine not initialized.");return}this.engine.rangeScale?.active()}destroy(){this._isDestroyed||(this.deactivateMeasure(),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.engine&&(this.engine.dispose(),this.engine=null),this.container.innerHTML="",this.currentMeasureType=null,this.isMeasureActive=!1,this._isDestroyed=!0,this._isInitialized=!1)}}class UE{element;content=null;isVisible=!1;onCloseCallback;options;mouseDownTime=0;CLICK_THRESHOLD=200;constructor(e){this.options=e,this.element=document.createElement("div"),this.element.className=`bim-right-key ${e?.className||""}`,e?.zIndex&&(this.element.style.zIndex=e.zIndex.toString()),document.body.appendChild(this.element)}init(){document.addEventListener("mousedown",this.handleGlobalClick),this.element.addEventListener("contextmenu",e=>{e.preventDefault(),e.stopPropagation()}),this.options?.container&&(this.options.container.addEventListener("mousedown",this.handleContainerMouseDown),this.options.container.addEventListener("mouseup",this.handleContainerMouseUp),this.options.container.addEventListener("contextmenu",this.handleContainerContextMenu))}setTheme(e){}setLocales(){}destroy(){document.removeEventListener("mousedown",this.handleGlobalClick),this.options?.container&&(this.options.container.removeEventListener("mousedown",this.handleContainerMouseDown),this.options.container.removeEventListener("mouseup",this.handleContainerMouseUp),this.options.container.removeEventListener("contextmenu",this.handleContainerContextMenu)),this.unmountContent(),this.element.remove()}handleContainerMouseDown=e=>{e.button===2&&(this.mouseDownTime=Date.now())};handleContainerMouseUp=e=>{e.button!==2||Date.now()-this.mouseDownTime>this.CLICK_THRESHOLD||this.options?.onContext&&this.options.onContext(e)};handleContainerContextMenu=e=>{e.preventDefault()};setOnClose(e){this.onCloseCallback=e}mount(e){this.unmountContent(),this.content=e,this.element.appendChild(e.getElement())}unmountContent(){this.content&&(this.content.destroy(),this.element.innerHTML="",this.content=null)}show(e,t){this.element.classList.add("visible"),this.isVisible=!0,this.element.style.left=`${e}px`,this.element.style.top=`${t}px`;const n=this.element.getBoundingClientRect(),i=window.innerWidth,r=window.innerHeight;let o=e,a=t;e+n.width>i&&(o=e-n.width),t+n.height>r&&(a=t-n.height),this.element.style.left=`${o}px`,this.element.style.top=`${a}px`}hide(){this.element.classList.remove("visible"),this.isVisible=!1,this.unmountContent(),this.onCloseCallback&&this.onCloseCallback()}handleGlobalClick=e=>{this.isVisible&&(this.element.contains(e.target)||this.hide())}}class td{element;options;unsubscribeLocale=null;unsubscribeTheme=null;activeSubMenu=null;constructor(e){this.options=e,this.element=document.createElement("ul"),this.element.className="bim-menu"}init(){this.render(),this.unsubscribeLocale=Yt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=rt.subscribe(e=>{this.setTheme(e)})}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-divider",e.divider),t.setProperty("--bim-component-bg-hover",e.componentBgHover),t.setProperty("--bim-shadow-lg",e.shadowLg)}setLocales(){this.element.innerHTML="",this.render()}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.closeSubMenu(),this.element.remove()}getElement(){return this.element}render(){const{items:e,groupOrder:t}=this.options,n=new Map,i="default";e.forEach(o=>{const a=o.group||i;n.has(a)||n.set(a,[]),n.get(a).push(o)});let r=[];if(t){r=t.filter(o=>n.has(o));for(const o of n.keys())r.includes(o)||r.push(o)}else r=Array.from(n.keys());r.forEach((o,a)=>{if(a>0){const c=document.createElement("li");c.className="bim-menu-divider",this.element.appendChild(c)}const l=n.get(o);l.sort((c,h)=>(c.order||0)-(h.order||0)),l.forEach(c=>{c.visible!==!1&&this.element.appendChild(this.createItemElement(c))})})}createItemElement(e){const t=document.createElement("li"),n=!e.disabled;t.className=`bim-menu-item ${n?"":"disabled"}`;const i=document.createElement("div");i.className="bim-menu-item-icon",e.icon&&(i.innerHTML=e.icon),t.appendChild(i);const r=document.createElement("div");r.className="bim-menu-item-label",r.textContent=Ce(e.label),t.appendChild(r);const o=e.children,a=o&&o.length>0;if(a){const l=document.createElement("div");l.className="bim-menu-item-arrow",l.innerHTML='',t.appendChild(l),t.addEventListener("mouseenter",()=>this.openSubMenu(e,t))}else t.addEventListener("mouseenter",()=>this.closeSubMenu());return n&&t.addEventListener("click",l=>{l.stopPropagation(),console.log(`[BimMenu] Clicked item: ${e.id}`),a||(e.onClick?(console.log(`[BimMenu] Executing onClick for ${e.id}`),e.onClick()):console.warn(`[BimMenu] No onClick handler for ${e.id}`))}),t}openSubMenu(e,t){const n=e.children;if(!n||n.length===0)return;this.closeSubMenu();const i=document.createElement("div");i.style.position="fixed",i.style.zIndex="10001";const r=t.getBoundingClientRect();i.style.top=`${r.top}px`,i.style.left=`${r.right}px`,i.addEventListener("mousedown",l=>l.stopPropagation());const o=new td({items:n});o.init(),i.appendChild(o.element),document.body.appendChild(i),this.activeSubMenu={menu:o,container:i};const a=i.getBoundingClientRect();a.right>window.innerWidth&&(i.style.left=`${r.left-a.width}px`)}closeSubMenu(){this.activeSubMenu&&(this.activeSubMenu.menu.destroy(),this.activeSubMenu.container.remove(),this.activeSubMenu=null)}}class U0 extends pi{container;rightKeyPanel;contextHandlers=[];constructor(e){super(),this.container=e,this.rightKeyPanel=new UE({zIndex:9e3,container:this.container,onContext:this.handleContextMenu}),this.rightKeyPanel.init()}destroy(){this.rightKeyPanel.destroy(),super.destroy()}registerHandler(e){this.contextHandlers.push(e)}showMenu(e,t,n,i){if(!n||n.length===0)return;const r=new td({items:n,groupOrder:i});r.init(),this.rightKeyPanel.mount(r),this.rightKeyPanel.show(e,t)}hide(){this.rightKeyPanel.hide()}handleContextMenu=e=>{let t=null;for(const n of this.contextHandlers){const i=n(e);i&&i.length>0&&(t||(t=[]),t=t.concat(i))}t&&t.length>0?this.showMenu(e.clientX,e.clientY,t):this.hide()}}const OE=()=>({id:"infoMenu",label:"menu.info",group:"info",icon:'',onClick:()=>{console.log("dianjile");const s=bt.getInstance();s.dialog?.showInfoDialog(),s.engine3d?.rightKey?.hide()}}),FE=()=>({id:"infoMenu",label:"menu.info",icon:'',onClick:()=>{console.log("dianjile");const s=bt.getInstance();s.dialog?.showInfoDialog(),s.engine3d?.rightKey?.hide()}}),zE=()=>({id:"fourMenu",label:"menu.info",icon:'',onClick:()=>{console.log("dianjile");const s=bt.getInstance();s.dialog?.showInfoDialog(),s.engine3d?.rightKey?.hide()}}),HE=()=>({id:"homeMenu",label:"menu.home",group:"home",children:[FE(),zE()],icon:'',onClick:()=>{const s=bt.getInstance();s.dialog?.showInfoDialog(),s.engine3d?.rightKey?.hide()}});class VE extends pi{container;engineInstance=null;rightKey=null;constructor(e){super(),this.container=e}initialize(e){this.engineInstance&&this.engineInstance.isInitialized()&&(console.warn("[EngineManager] 3D Engine already initialized. Destroying old instance..."),this.engineInstance.destroy(),this.engineInstance=null);try{return this.engineInstance=new kE({container:this.container,...e}),this.engineInstance.init(),this.rightKey=new U0(this.container),this.rightKey.registerHandler(t=>[OE(),HE()]),this.engineInstance.isInitialized()}catch(t){return console.error("[EngineManager] Failed to initialize 3D engine:",t),this.engineInstance=null,!1}}isInitialized(){return this.engineInstance!==null&&this.engineInstance.isInitialized()}loadModel(e,t){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.loadModel(e,t)}getEngine(){return this.engineInstance?this.engineInstance.getEngine():(console.warn("[EngineManager] 3D Engine not initialized."),null)}CameraGoHome(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.CameraGoHome()}pauseRendering(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.pauseRendering()}resumeRendering(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.resumeRendering()}activateMeasure(e){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.activateMeasure(e)}deactivateMeasure(){this.engineInstance&&this.engineInstance.deactivateMeasure()}getCurrentMeasureType(){return this.engineInstance?this.engineInstance.getCurrentMeasureType():null}clearAllMeasures(){this.engineInstance&&this.engineInstance.clearAllMeasures()}activateSectionAxis(e){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.activateSectionAxis(e)}deactivateSectionAxis(){this.engineInstance&&this.engineInstance.deactivateSectionAxis()}getCurrentSectionAxis(){return this.engineInstance?this.engineInstance.getCurrentSectionAxis():null}activateSectionBox(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.activateSectionBox()}deactivateSectionBox(){this.engineInstance&&this.engineInstance.deactivateSectionBox()}setSectionBoxRange(e){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.setSectionBoxRange(e)}fitSectionBoxToModel(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.fitSectionBoxToModel()}resetSectionBox(){this.engineInstance&&this.engineInstance.resetSectionBox()}activateZoomBox(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.activateZoomBox()}activateFirstPersonMode(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.activateFirstPersonMode()}deactivateFirstPersonMode(){this.engineInstance&&this.engineInstance.deactivateFirstPersonMode()}setWalkSpeed(e){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.setWalkSpeed(e)}setWalkGravity(e){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.setWalkGravity(e)}setWalkCollision(e){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.setWalkCollision(e)}isFirstPersonModeActive(){return this.engineInstance?this.engineInstance.isFirstPersonModeActive():!1}destroy(){this.engineInstance&&(this.engineInstance.destroy(),this.engineInstance=null),this.rightKey&&(this.rightKey.destroy(),this.rightKey=null),super.destroy()}}var It=(s=>(s[s.Unchecked=0]="Unchecked",s[s.Checked=1]="Checked",s[s.Indeterminate=2]="Indeterminate",s))(It||{});class GE{config;element;children=[];parent=null;checkState=It.Unchecked;contentEl;switcherEl;checkboxEl=null;titleEl;actionsEl;childrenContainer;onExpandChange;onCheckChange;onNodeClick;renderActions;constructor(e,t,n){this.config=e,this.onExpandChange=n.onExpand,this.onCheckChange=n.onCheck,this.onNodeClick=n.onClick,this.renderActions=t.renderActions,this.checkState=e.checked?It.Checked:It.Unchecked,this.element=this.createDom(t)}createDom(e){const t=document.createElement("div");t.className="bim-tree-node",this.config.disabled&&t.classList.add("is-disabled"),this.contentEl=document.createElement("div"),this.contentEl.className="bim-tree-node-content",this.switcherEl=document.createElement("span"),this.switcherEl.className="bim-tree-switcher",this.switcherEl.innerHTML='';const n=this.config.children&&this.config.children.length>0;if(n?this.config.expanded&&this.switcherEl.classList.add("is-expanded"):this.switcherEl.classList.add("is-hidden"),this.switcherEl.addEventListener("click",r=>{r.stopPropagation(),this.toggleExpand()}),this.contentEl.appendChild(this.switcherEl),e.checkable!==!1&&(this.checkboxEl=document.createElement("span"),this.checkboxEl.className="bim-tree-checkbox",this.updateCheckboxUI(),this.checkboxEl.addEventListener("click",r=>{r.stopPropagation(),!this.config.disabled&&this.toggleCheck()}),this.contentEl.appendChild(this.checkboxEl)),this.config.icon){const r=document.createElement("span");r.className="bim-tree-icon",r.innerHTML=this.config.icon.includes("`,this.contentEl.appendChild(r)}this.titleEl=document.createElement("span"),this.titleEl.className="bim-tree-title",this.updateLabel(),this.contentEl.appendChild(this.titleEl),this.actionsEl=document.createElement("div"),this.actionsEl.className="bim-tree-node-actions",this.actionsEl.addEventListener("click",r=>{r.stopPropagation()}),this.contentEl.appendChild(this.actionsEl),this.contentEl.addEventListener("click",r=>{if(r.stopPropagation(),this.config.disabled)return;(this.config.clickAction||"select")==="expand"?this.toggleExpand():this.onNodeClick(this)}),t.appendChild(this.contentEl),this.childrenContainer=document.createElement("div"),this.childrenContainer.className="bim-tree-children";const i=e.indent||24;return this.childrenContainer.style.paddingLeft=`${i}px`,this.config.expanded&&n&&this.childrenContainer.classList.add("is-visible"),t.appendChild(this.childrenContainer),t}setSelected(e){if(e){if(this.contentEl.classList.add("is-selected"),this.renderActions){const t=this.renderActions(this.config);this.actionsEl.innerHTML="",typeof t=="string"?this.actionsEl.innerHTML=t:t instanceof HTMLElement&&this.actionsEl.appendChild(t)}}else this.contentEl.classList.remove("is-selected"),this.actionsEl.innerHTML=""}updateLabel(){this.titleEl&&(this.titleEl.textContent=this.config.label)}toggleExpand(e){if(!this.config.children||this.config.children.length===0)return;const t=e!==void 0?e:!this.config.expanded;this.config.expanded=t,t?(this.switcherEl.classList.add("is-expanded"),this.childrenContainer.classList.add("is-visible")):(this.switcherEl.classList.remove("is-expanded"),this.childrenContainer.classList.remove("is-visible")),e===void 0&&this.onExpandChange(this)}toggleCheck(){const e=this.checkState!==It.Checked;this.setChecked(e?It.Checked:It.Unchecked,!0)}setChecked(e,t=!1){this.checkState!==e&&(this.checkState=e,this.config.checked=e===It.Checked,this.updateCheckboxUI(),t&&this.onCheckChange(this))}updateCheckboxUI(){this.checkboxEl&&(this.checkboxEl.classList.remove("is-checked","is-indeterminate"),this.checkState===It.Checked?this.checkboxEl.classList.add("is-checked"):this.checkState===It.Indeterminate&&this.checkboxEl.classList.add("is-indeterminate"))}appendChild(e){e.parent=this,this.children.push(e),this.childrenContainer.appendChild(e.element),this.children.length===1&&this.switcherEl.classList.remove("is-hidden")}destroy(){this.children.forEach(e=>e.destroy()),this.children=[],this.element.remove(),this.parent=null}}class WE{element;contentElement;searchInput=null;searchResults=null;options;nodeMap=new Map;rootNodes=[];selectedNode=null;unsubscribeLocale=null;unsubscribeTheme=null;clickOutsideHandler=null;onNodeCheck;onNodeSelect;onNodeExpand;constructor(e){this.options={checkable:!0,checkStrictly:!0,indent:24,defaultExpandAll:!0,enableSearch:!1,searchPlaceholder:"tree.searchPlaceholder",...e},this.element=document.createElement("div"),this.element.className="bim-tree",this.options.enableSearch&&this.createSearchDOM(),this.contentElement=document.createElement("div"),this.contentElement.className="bim-tree-content",this.element.appendChild(this.contentElement),e.onNodeCheck&&(this.onNodeCheck=e.onNodeCheck),e.onNodeSelect&&(this.onNodeSelect=e.onNodeSelect),e.onNodeExpand&&(this.onNodeExpand=e.onNodeExpand)}createSearchDOM(){const e=document.createElement("div");e.className="bim-tree-search";const t=document.createElement("div");t.className="bim-tree-search-wrapper";const n=document.createElement("span");n.className="bim-tree-search-icon",n.innerHTML='',t.appendChild(n),this.searchInput=document.createElement("input"),this.searchInput.className="bim-tree-search-input",this.searchInput.type="text",this.searchInput.placeholder=Ce(this.options.searchPlaceholder||"搜索..."),this.searchInput.addEventListener("input",i=>{const r=i.target.value;this.handleSearch(r)}),t.appendChild(this.searchInput),e.appendChild(t),this.searchResults=document.createElement("div"),this.searchResults.className="bim-tree-search-results",e.appendChild(this.searchResults),this.element.appendChild(e),this.clickOutsideHandler=i=>{this.searchResults&&!this.searchResults.contains(i.target)&&!this.searchInput?.contains(i.target)&&this.searchResults.classList.remove("is-visible")},document.addEventListener("click",this.clickOutsideHandler)}init(){this.render(),this.unsubscribeLocale=Yt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=rt.subscribe(e=>this.setTheme(e)),this.setTheme(rt.getTheme())}handleSearch(e){if(!this.searchResults)return;if(!e.trim()){this.searchResults.classList.remove("is-visible"),this.searchResults.innerHTML="";return}const t=[],n=e.toLowerCase();this.nodeMap.forEach(i=>{const r=i.config.label;r.toLowerCase().includes(n)&&t.push({node:i,label:r,path:this.getNodePath(i)})}),this.renderSearchResults(t)}getNodePath(e){const t=[];let n=e.parent;for(;n;)t.unshift(n.config.label),n=n.parent;return t.join(" > ")}renderSearchResults(e){if(this.searchResults){if(this.searchResults.innerHTML="",e.length===0){const t=document.createElement("div");t.className="bim-tree-search-item",t.style.cursor="default",t.style.color="#999",t.textContent="No results",this.searchResults.appendChild(t)}else e.forEach(t=>{const n=document.createElement("div");n.className="bim-tree-search-item";const i=document.createElement("span");i.className="bim-tree-search-item-title",i.textContent=t.label;const r=document.createElement("span");r.className="bim-tree-search-item-path",r.textContent=t.path,n.appendChild(i),t.path&&n.appendChild(r),n.addEventListener("click",()=>{this.revealNode(t.node)}),this.searchResults.appendChild(n)});this.searchResults.classList.add("is-visible")}}revealNode(e){this.searchResults&&(this.searchResults.classList.remove("is-visible"),this.searchInput&&(this.searchInput.value=""));let t=e.parent;for(;t;)t.toggleExpand(!0),t=t.parent;this.handleNodeSelect(e),setTimeout(()=>{e.element.scrollIntoView({behavior:"smooth",block:"center"})},100)}setTheme(e){const t=this.element.style;t.setProperty("--bim-primary",e.primary),t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-text-secondary",e.textSecondary),t.setProperty("--bim-text-tertiary",e.textTertiary),t.setProperty("--bim-text-disabled",e.textDisabled),t.setProperty("--bim-text-inverse",e.textInverse),t.setProperty("--bim-border-default",e.borderDefault),t.setProperty("--bim-border-disabled",e.borderDisabled),t.setProperty("--bim-component-bg-hover",e.componentBgHover),t.setProperty("--bim-component-bg-selected",e.componentBgSelected),t.setProperty("--bim-component-bg-disabled",e.componentBgDisabled),t.setProperty("--bim-shadow-md",e.shadowMd),t.setProperty("--bim-focus-ring",e.focusRing)}setLocales(){this.nodeMap.forEach(e=>e.updateLabel()),this.searchInput&&(this.searchInput.placeholder=Ce(this.options.searchPlaceholder||"tree.searchPlaceholder"))}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.clickOutsideHandler&&(document.removeEventListener("click",this.clickOutsideHandler),this.clickOutsideHandler=null),this.rootNodes.forEach(e=>e.destroy()),this.rootNodes=[],this.nodeMap.clear(),this.element.remove(),this.selectedNode=null}render(){this.contentElement.innerHTML="",this.nodeMap.clear(),this.rootNodes=[],this.options.data.forEach(e=>{this.createNodeRecursively(e,null)})}createNodeRecursively(e,t){e.expanded===void 0&&(e.expanded=this.options.defaultExpandAll);const n=new GE(e,this.options,{onExpand:i=>{this.onNodeExpand&&this.onNodeExpand(i)},onCheck:i=>this.handleNodeCheck(i),onClick:i=>this.handleNodeSelect(i)});this.nodeMap.set(e.id,n),t?t.appendChild(n):(this.rootNodes.push(n),this.contentElement.appendChild(n.element)),e.children&&e.children.length>0&&e.children.forEach(i=>{this.createNodeRecursively(i,n)})}handleNodeSelect(e){this.selectedNode&&this.selectedNode!==e&&this.selectedNode.setSelected(!1),e.setSelected(!0),this.selectedNode=e,this.onNodeSelect&&this.onNodeSelect(e)}handleNodeCheck(e){const t=e.checkState===It.Checked;if(this.onNodeCheck&&this.onNodeCheck(e),this.options.checkStrictly===!1)return;const n=(r,o)=>{r.children.forEach(a=>{a.config.disabled||(a.setChecked(o,!1),n(a,o))})};t?n(e,It.Checked):n(e,It.Unchecked);let i=e.parent;for(;i;){if(i.config.disabled){i=i.parent;continue}const r=i.children,o=r.every(l=>l.checkState===It.Checked),a=r.every(l=>l.checkState===It.Unchecked);o?i.setChecked(It.Checked,!1):a?i.setChecked(It.Unchecked,!1):i.setChecked(It.Indeterminate,!1),i=i.parent}}getNode(e){return this.nodeMap.get(e)}checkNode(e,t){const n=this.nodeMap.get(e);n&&n.setChecked(t?It.Checked:It.Unchecked,!0)}expandAll(e){this.nodeMap.forEach(t=>t.toggleExpand(e))}getCheckedNodes(e=!1){const t=[];return this.nodeMap.forEach(n=>{(n.checkState===It.Checked||e&&n.checkState===It.Indeterminate)&&t.push(n.config)}),t}}class O0{element;navElement;contentElement;options;activeId;tabMap=new Map;panelMap=new Map;unsubscribeLocale=null;unsubscribeTheme=null;navClickHandler=null;constructor(e){this.options=e,this.activeId=e.activeId||(e.tabs[0]?.id??null),e.tabs.forEach(t=>this.tabMap.set(t.id,t)),this.element=document.createElement("div"),this.element.className="bim-tab",this.navElement=document.createElement("div"),this.navElement.className="bim-tab__nav",this.navElement.setAttribute("role","tablist"),this.element.appendChild(this.navElement),this.contentElement=document.createElement("div"),this.contentElement.className="bim-tab__content",this.element.appendChild(this.contentElement),this.options.container.appendChild(this.element)}init(){this.renderNav(),this.renderPanels(),this.setLocales(),this.setTheme(rt.getTheme()),this.unsubscribeLocale=Yt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=rt.subscribe(e=>this.setTheme(e))}renderNav(){this.navElement.innerHTML="",this.navClickHandler=e=>{const t=e.target.closest(".bim-tab__item");if(!t)return;const n=t.dataset.id;!n||this.tabMap.get(n)?.disabled||this.activateTab(n)},this.navElement.addEventListener("click",this.navClickHandler),this.options.tabs.forEach(e=>{const t=document.createElement("button");if(t.type="button",t.className="bim-tab__item",t.dataset.id=e.id,t.setAttribute("role","tab"),t.id=`tab-${e.id}`,t.setAttribute("aria-selected",`${e.id===this.activeId}`),e.disabled&&(t.disabled=!0,t.setAttribute("aria-disabled","true"),t.classList.add("is-disabled")),e.icon){const i=document.createElement("span");i.className="bim-tab__icon",i.innerHTML=e.icon,t.appendChild(i)}const n=document.createElement("span");n.className="bim-tab__title",n.textContent=this.resolveTitle(e.title),t.appendChild(n),e.id===this.activeId&&t.classList.add("is-active"),this.navElement.appendChild(t)})}renderPanels(){this.contentElement.innerHTML="",this.panelMap.clear(),this.options.tabs.forEach(e=>{const t=document.createElement("div");t.className="bim-tab__panel",t.dataset.id=e.id,t.setAttribute("role","tabpanel"),t.setAttribute("aria-labelledby",`tab-${e.id}`),e.content instanceof HTMLElement?t.appendChild(e.content):typeof e.content=="string"&&(t.innerHTML=e.content),e.id===this.activeId?t.classList.add("is-active"):t.style.display="none",this.panelMap.set(e.id,t),this.contentElement.appendChild(t)})}activateTab(e){if(this.activeId===e)return;const t=this.tabMap.get(e);if(!t||t.disabled)return;this.activeId=e,this.navElement.querySelectorAll(".bim-tab__item").forEach(i=>{const r=i.dataset.id===e;i.classList.toggle("is-active",r),i.setAttribute("aria-selected",`${r}`)}),this.panelMap.forEach((i,r)=>{const o=r===e;i.classList.toggle("is-active",o),i.style.display=o?"block":"none"}),this.options.onChange&&this.options.onChange(e,t)}setTheme(e){const t=this.element.style;t.setProperty("--bim-tab-bg",e.bgElevated),t.setProperty("--bim-tab-nav-bg",e.bgElevated),t.setProperty("--bim-tab-text",e.textPrimary),t.setProperty("--bim-tab-text-secondary",e.textSecondary),t.setProperty("--bim-tab-text-active",e.primary),t.setProperty("--bim-tab-border",e.borderDefault),t.setProperty("--bim-tab-hover-bg",e.componentBgHover),t.setProperty("--bim-tab-active-bg",e.componentBgActive),t.setProperty("--bim-tab-icon",e.iconDefault)}setLocales(){this.navElement.querySelectorAll(".bim-tab__item").forEach(t=>{const n=t.dataset.id;if(!n)return;const i=this.tabMap.get(n);if(!i)return;const r=t.querySelector(".bim-tab__title");r&&(r.textContent=this.resolveTitle(i.title))})}destroy(){this.navClickHandler&&(this.navElement.removeEventListener("click",this.navClickHandler),this.navClickHandler=null),this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.panelMap.clear(),this.tabMap.clear(),this.element.remove()}resolveTitle(e){try{return Ce(e)||e}catch{return e}}}const F0={测量:'',地图:'',框选放大:'',漫游:'',目录树:'',剖切:'',剖切盒:'',全屏:'',设置:'',拾曲面剖切:'',轴向剖切:'',主视角:'',文档:'',第一人称漫游:'',反向:'',路径漫游:'',适应到模型:'',隐藏:'',重置:'',标高:'',距离:'',最小距离:'',激光边距:'',角度:'',坡度:'',体积:'',空间体积:'',close:'',check:'',warning:'',error:'',success:'',plus:'',minus:'',arrowUp:'',arrowDown:'',arrowLeft:'',arrowRight:'',search:'',refresh:'',delete:'',edit:'',save:'',expand:'',collapse:'',default:''};function At(s){const e=F0[s];return e||(console.warn(`[IconManager] Icon "${s}" not found, using default icon`),F0.default)}const XE=[{id:"root",label:"全部构件",expanded:!0,clickAction:"expand",children:[{id:"level-1",label:"一层",expanded:!1,icon:'',clickAction:"expand",children:[{id:"l1-wall",label:"墙体(128)"},{id:"l1-column",label:"柱(46)"},{id:"l1-beam",label:"梁(82)"},{id:"l1-slab",label:"楼板(12)"},{id:"l1-door",label:"门(24)"},{id:"l1-window",label:"窗(36)"}]},{id:"level-2",label:"二层",expanded:!1,clickAction:"expand",children:[{id:"l2-wall",label:"墙体(141)"},{id:"l2-column",label:"柱(52)"},{id:"l2-beam",label:"梁(90)"},{id:"l2-slab",label:"楼板(12)"},{id:"l2-door",label:"门(18)"},{id:"l2-window",label:"窗(40)"}]},{id:"level-3",label:"三层",expanded:!1,clickAction:"expand",children:[{id:"l3-wall",label:"墙体(136)"},{id:"l3-column",label:"柱(48)"},{id:"l3-beam",label:"梁(88)"},{id:"l3-slab",label:"楼板(12)"},{id:"l3-door",label:"门(16)"},{id:"l3-window",label:"窗(38)"}]},{id:"level-roof",label:"屋面层",expanded:!1,clickAction:"expand",children:[{id:"rf-slab",label:"屋面板(6)"},{id:"rf-beam",label:"屋面梁(24)"},{id:"rf-parapet",label:"女儿墙(18)"}]}]}];class jE extends pi{toolbar=null;toolbarContainer=null;container;dialog=null;constructor(e){super(),this.container=e,this.init()}init(){this.toolbarContainer=document.createElement("div"),this.toolbarContainer.id="bim-construct-tree",this.container.appendChild(this.toolbarContainer),this.toolbar=new zl({container:this.toolbarContainer,showLabel:!1,direction:"column",position:"top-left",align:"vertical",expand:"up"}),this.toolbar.init(),this.toolbar.addGroup("construct-tree"),this.toolbar.addButton({id:"construct-tree-btn",groupId:"construct-tree",type:"button",label:"construct-tree",icon:At("目录树"),onClick:()=>{this.openConstructTreeDialog()}}),this.toolbar.render()}openConstructTreeDialog(){this.setVisible(!1);const e=new WE({data:XE,checkable:!0,indent:0,enableSearch:!0,checkStrictly:!0,defaultExpandAll:!0,renderActions:a=>'',onNodeCheck:a=>{console.log("onNodeCheck",a)},onNodeSelect:a=>{console.log("onNodeSelect",a)},onNodeExpand:a=>{console.log("onNodeExpand",a),this.dialog?.fitWidth()}});e.init();const t=document.createElement("div");t.className="construct-tab__panel-content";const n=document.createElement("div");n.className="construct-tab__panel-content";const i=document.createElement("div");i.className="construct-tab__panel-content",i.appendChild(e.element);const r=document.createElement("div");r.className="construct-tab__container",r.style.height="100%",r.style.overflow="hidden";const o=new O0({container:r,tabs:[{id:"component",title:"tab.component",content:i},{id:"system",title:"tab.system",content:t},{id:"space",title:"tab.space",content:n}],activeId:"component",onChange:()=>{this.dialog?.fitWidth()}});o.init(),this.dialog=this.registry.dialog.create({title:"constructTree.title",minWidth:320,height:420,content:r,position:{x:20,y:20},resizable:!1,onClose:()=>{o.destroy(),e.destroy(),this.setVisible(!0)}}),this.dialog?.fitWidth()}refresh(){this.toolbar?.render()}destroy(){this.toolbar?.destroy(),this.toolbar=null,super.destroy()}addGroup(e,t){this.toolbar?.addGroup(e,t),this.toolbar?.render()}addButton(e){this.toolbar?.addButton(e),this.toolbar?.render()}setButtonVisibility(e,t){this.toolbar?.updateButtonVisibility(e,t)}setShowLabel(e){this.toolbar?.setShowLabel(e)}setVisible(e){this.toolbarContainer&&(this.toolbarContainer.style.visibility=e?"visible":"hidden")}setBackgroundColor(e){this.toolbar?.setBackgroundColor(e)}setColors(e){this.toolbar?.setColors(e)}}class qE{element;headerEl;contentEl;contentBoxEl;arrowEl;titleEl;config;parent;constructor(e,t){this.config=e,this.parent=t,this.element=this.createDom()}createDom(){const e=document.createElement("div");if(e.className=`bim-collapse-item ${this.config.className||""}`,this.config.disabled&&e.classList.add("is-disabled"),e.dataset.id=this.config.id,this.headerEl=document.createElement("div"),this.headerEl.className="bim-collapse-header",this.arrowEl=document.createElement("span"),this.arrowEl.className="bim-collapse-arrow",this.arrowEl.innerHTML='',this.headerEl.appendChild(this.arrowEl),this.config.icon){const t=document.createElement("span");t.className="bim-collapse-icon",t.innerHTML=this.config.icon,this.headerEl.appendChild(t)}if(this.titleEl=document.createElement("span"),this.titleEl.className="bim-collapse-title",this.titleEl.textContent=Ce(this.config.title),this.headerEl.appendChild(this.titleEl),this.config.extra){const t=document.createElement("div");t.className="bim-collapse-extra",typeof this.config.extra=="string"?t.innerHTML=this.config.extra:t.appendChild(this.config.extra),this.headerEl.appendChild(t)}return this.headerEl.addEventListener("click",()=>{this.config.disabled||this.parent.toggleItem(this.config.id)}),e.appendChild(this.headerEl),this.contentEl=document.createElement("div"),this.contentEl.className="bim-collapse-content is-hidden",this.contentBoxEl=document.createElement("div"),this.contentBoxEl.className="bim-collapse-content-box",typeof this.config.content=="string"?this.contentBoxEl.innerHTML=this.config.content:this.contentBoxEl.appendChild(this.config.content),this.contentEl.appendChild(this.contentBoxEl),e.appendChild(this.contentEl),e}updateLocale(){this.titleEl&&(this.titleEl.textContent=Ce(this.config.title))}setActive(e){e?(this.element.classList.add("is-active"),this.contentEl.classList.remove("is-hidden")):(this.element.classList.remove("is-active"),this.contentEl.classList.add("is-hidden"))}}class z0{element;options;items=new Map;activeIds=new Set;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e){this.options={bordered:!0,accordion:!1,...e},this.element=document.createElement("div"),this.element.className=`bim-collapse ${this.options.className||""}`,this.options.bordered||(this.element.style.border="none"),this.options.ghost&&this.element.classList.add("is-ghost");const t=typeof this.options.container=="string"?document.getElementById(this.options.container):this.options.container;t&&t.appendChild(this.element),this.options.activeIds&&this.options.activeIds.forEach(n=>this.activeIds.add(n)),this.init()}init(){this.options.items.forEach(e=>{const t=new qE(e,this);this.items.set(e.id,t),this.element.appendChild(t.element),this.activeIds.has(e.id)&&t.setActive(!0)}),this.unsubscribeLocale=Yt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=rt.subscribe(e=>{this.setTheme(e)}),this.setTheme(rt.getTheme())}toggleItem(e){const t=this.activeIds.has(e);this.options.accordion?(this.activeIds.clear(),t||this.activeIds.add(e)):t?this.activeIds.delete(e):this.activeIds.add(e),this.refreshState(),this.options.onChange&&this.options.onChange(Array.from(this.activeIds))}refreshState(){this.items.forEach((e,t)=>{e.setActive(this.activeIds.has(t))})}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-color",e.bgElevated),t.setProperty("--bim-border-color",e.borderDefault),t.setProperty("--bim-text-color",e.textPrimary),t.setProperty("--bim-header-bg-color",e.componentBgHover),t.setProperty("--bim-header-hover-bg-color",e.componentBgActive),t.setProperty("--bim-content-bg-color",e.bgElevated),t.setProperty("--bim-disabled-color",e.textDisabled)}setLocales(){this.items.forEach(e=>e.updateLocale())}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove(),this.items.clear()}}class nd{element;options;unsubscribeTheme=null;constructor(e){this.options={bordered:!1,...e},this.element=this.createDom();const t=typeof this.options.container=="string"?document.getElementById(this.options.container):this.options.container;t&&t.appendChild(this.element),this.init()}init(){this.applyCustomStyles(),this.renderItems(),this.unsubscribeTheme=rt.subscribe(e=>{this.setTheme(e)}),this.setTheme(rt.getTheme())}createDom(){const e=document.createElement("div");return e.className=`bim-description ${this.options.className||""}`,this.options.bordered&&e.classList.add("is-bordered"),e}applyCustomStyles(){const e=this.element.style;this.options.fontSize&&e.setProperty("--bim-desc-font-size",this.options.fontSize),this.options.labelColor&&e.setProperty("--bim-desc-label-color",this.options.labelColor),this.options.valueColor&&e.setProperty("--bim-desc-value-color",this.options.valueColor),this.options.labelPadding&&e.setProperty("--bim-desc-label-padding",this.options.labelPadding),this.options.valuePadding&&e.setProperty("--bim-desc-value-padding",this.options.valuePadding)}renderItems(){this.element.innerHTML="",this.options.items.forEach(e=>{const t=document.createElement("div");t.className=`bim-description-item ${e.className||""}`;const n=document.createElement("div");n.className="bim-description-label",e.labelColor&&(n.style.color=e.labelColor),this.options.labelWidth&&(n.style.width=this.options.labelWidth),n.textContent=this.options.bordered?e.label:e.label+":";const i=document.createElement("div");i.className="bim-description-value",e.valueColor&&(i.style.color=e.valueColor),typeof e.value=="string"?i.innerHTML=e.value:i.appendChild(e.value),t.appendChild(n),t.appendChild(i),this.element.appendChild(t)})}setItems(e){this.options.items=e,this.renderItems()}setTheme(e){const t=this.element.style;t.setProperty("--bim-text-color",e.textPrimary),t.setProperty("--bim-label-color",e.textSecondary),t.setProperty("--bim-value-color",e.textPrimary),t.setProperty("--bim-border-color",e.borderDefault)}setLocales(){}destroy(){this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove()}}class ZE extends pi{dialogId="property-panel-dialog";dialog=null;constructor(){super()}init(){document.addEventListener("bim-demo:open-property-panel",()=>{this.show()})}show(){if(!this.registry.dialog){console.warn("Dialog manager is not initialized");return}if(this.isOpen())return;const e=360,t=document.body.clientWidth-e-40;this.dialog=this.registry.dialog.create({id:this.dialogId,title:"panel.property.title",content:"",width:`${e}px`,height:"500px",position:{x:t,y:20},showMask:!1,resizable:!0,onClose:()=>{this.hide()}});const n=document.createElement("div");n.style.height="100%",n.style.display="flex",n.style.flexDirection="column",this.dialog.setContent(n),new O0({container:n,tabs:[{id:"props",title:"panel.property.tab.props",content:this.createPropsTabContent()},{id:"material",title:"panel.property.tab.material",content:this.createMaterialTabContent()}]}).init()}createPropsTabContent(){const e=document.createElement("div");return e.style.height="100%",e.style.overflowY="auto",new z0({container:e,accordion:!0,activeIds:["base","location"],items:[{id:"base",title:"panel.property.base",content:this.createBaseInfoContent()},{id:"advanced",title:"panel.property.advanced",content:this.createAdvancedInfoContent(),disabled:!1}]}),e}createMaterialTabContent(){const e=document.createElement("div");return e.style.height="100%",e.style.overflowY="auto",new z0({container:e,accordion:!0,activeIds:["material"],items:[{id:"material",title:"panel.property.material",content:this.createMaterialContent()}]}),e}createBaseInfoContent(){const e=document.createElement("div");return new nd({container:e,labelWidth:"80px",bordered:!0,items:[{label:"Guid",value:'1f8d-4a2e-9c'},{label:"Name",value:"Basic Wall: Generic - 200mm"},{label:"Type",value:"Basic Wall"},{label:"Level",value:"Trane - Centrifugal Water Chiller - CVHF 2 Stage direct drive TAG(BP-RHS-1100RT) 0202104531 1"}]}),e}createAdvancedInfoContent(){const e=document.createElement("div");return new nd({container:e,labelWidth:"100px",bordered:!0,items:[{label:"Area",value:"32.5 m²"},{label:"Volume",value:"6.5 m³"},{label:"Length",value:"5000 mm"},{label:"Phase",value:"New Construction"}]}),e}createMaterialContent(){const e=document.createElement("div"),t=document.createElement("div");t.style.display="flex",t.style.alignItems="center",t.style.marginBottom="4px",t.innerHTML=` -
    - Concrete - Cast-in-Place Gray - `;const n=document.createElement("div");return new nd({container:n,items:[{label:"Preview",value:t},{label:"Class",value:"Concrete"},{label:"Density",value:"2400 kg/m³"},{label:"Thermal",value:"0.6 W/(m·K)"}]}),e.appendChild(n),e}isOpen(){return this.dialog!==null}hide(){this.dialog&&(this.dialog.destroy(),this.dialog=null)}destroy(){this.hide(),super.destroy()}}class Or extends pi{dialog=null;isVisible=!1;get dialogWidth(){return 300}get dialogHeight(){return"auto"}get dialogOptions(){return{draggable:!0,resizable:!1}}onDialogClose(){}onDialogCreated(){}onBeforeDestroy(){}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=e.clientWidth,n=e.clientHeight,i=this.dialogWidth,r=typeof this.dialogHeight=="number"?this.dialogHeight:300;return{x:t-i-20,y:(n-r)/2}}show(){if(!this.registry.dialog||!this.registry.container){console.warn(`[${this.dialogId}] Dialog manager or container is not initialized`);return}this.dialog&&this.destroyDialog();const e=this.getDialogPosition(),t=this.createContent(),n=this.dialogOptions;this.dialog=this.registry.dialog.create({id:this.dialogId,title:this.dialogTitle,content:t,width:this.dialogWidth,height:this.dialogHeight,position:e,draggable:n.draggable,resizable:n.resizable,onClose:()=>{this.onDialogClose(),this.destroyDialog()}}),this.dialog.init(),this.isVisible=!0,this.onDialogCreated()}hide(){this.destroyDialog()}toggle(){this.isVisible?this.hide():this.show()}isOpen(){return this.isVisible}destroyDialog(){this.onBeforeDestroy(),this.dialog&&(this.dialog.destroy(),this.dialog=null),this.isVisible=!1}destroy(){this.destroyDialog(),super.destroy()}}const YE={distance:'',minDistance:'',angle:'',elevation:'',volume:'',laserDistance:'',slope:'',spaceVolume:''};class Vo{element;options;activeMode;isExpanded;result=null;config;draftConfig=null;view="main";static CONFIG_CACHE_KEY="bim-engine:measure:config";static DEFAULT_CONFIG={unit:"mm",precision:2};toolButtons=new Map;toggleBtn;toggleTextEl;mainValueValueEl;mainValueLabelEl;mainNumberEl;mainUnitEl;xyzBoxEl;xyzXEl;xyzYEl;xyzZEl;clearBtn;settingsBtn;mainViewEl;settingsViewEl;unitSelectEl;precisionSelectEl;saveSettingsBtn;cancelSettingsBtn;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e={}){this.options=e,this.activeMode=e.defaultMode??"distance",this.isExpanded=e.defaultExpanded??!1,this.config=this.loadConfigFromCache()??{...Vo.DEFAULT_CONFIG},this.element=this.createDom()}init(){this.unsubscribeLocale=Yt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=rt.subscribe(e=>{this.setTheme(e)}),this.setLocales(),this.setTheme(rt.getTheme()),this.applyExpandedState(),this.applyActiveModeState(),this.applyViewState(),this.renderResult(),this.options.onModeChange&&this.options.onModeChange(this.activeMode)}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-bg-elevated",e.bgElevated??"#1f2d3e"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-divider",e.divider??"#334155"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-hover",e.primaryHover??"#60a5fa"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-danger",e.danger??"#ef4444"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-text-secondary",e.textSecondary??"#94a3b8"),t.setProperty("--bim-text-tertiary",e.textTertiary??"#64748b"),t.setProperty("--bim-text-inverse",e.textInverse??"#152232"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)")}setLocales(){for(const[t,n]of this.toolButtons.entries())n.title=Ce(this.getModeI18nKey(t)),n.setAttribute("aria-label",n.title);this.toggleBtn.title=this.isExpanded?Ce("measure.actions.collapse"):Ce("measure.actions.expand"),this.toggleBtn.setAttribute("aria-label",this.toggleBtn.title),this.toggleTextEl&&(this.toggleTextEl.textContent=this.toggleBtn.title),this.clearBtn.textContent=Ce("measure.actions.clearAll"),this.settingsBtn.title=Ce("measure.actions.settings"),this.settingsBtn.setAttribute("aria-label",this.settingsBtn.title),this.mainValueLabelEl.textContent=Ce(this.getModeValueLabelI18nKey(this.activeMode)),this.element.querySelectorAll("[data-i18n-key]").forEach(t=>{const n=t.dataset.i18nKey;n&&(t.textContent=Ce(n))}),this.saveSettingsBtn.textContent=Ce("measure.settings.save"),this.cancelSettingsBtn.textContent=Ce("measure.settings.cancel")}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove()}getActiveMode(){return this.activeMode}switchMode(e){this.setActiveMode(e)}setActiveMode(e){this.activeMode!==e&&(this.activeMode=e,this.applyActiveModeState(),this.mainValueLabelEl.textContent=Ce(this.getModeValueLabelI18nKey(this.activeMode)),this.options.onModeChange&&this.options.onModeChange(e),this.renderResult(),this.options.onExpandedChange&&this.options.onExpandedChange(this.isExpanded))}setResult(e){this.result=e,this.renderResult()}clearAll(){this.result=null,this.renderResult(),this.options.onClearAll&&this.options.onClearAll()}openSettings(){this.enterSettingsView(),this.options.onSettings&&this.options.onSettings()}getConfig(){return{...this.config}}setConfig(e,t=!1){const n={unit:e.unit??this.config.unit,precision:e.precision??this.config.precision};this.config=n,t&&this.saveConfigToCache(n),this.renderResult(),this.view==="settings"&&this.syncSettingsFormFromConfig(n)}setExpanded(e){this.isExpanded!==e&&(this.isExpanded=e,this.applyExpandedState(),this.setLocales(),this.options.onExpandedChange&&this.options.onExpandedChange(this.isExpanded))}getExpanded(){return this.isExpanded}createDom(){const e=document.createElement("div");e.className="bim-measure-panel",this.mainViewEl=document.createElement("div"),this.mainViewEl.className="bim-measure-main";const t=document.createElement("div");t.className="bim-measure-tools";const n=document.createElement("div");n.className="bim-measure-tool-grid";const i=["distance","minDistance","angle","elevation","volume","laserDistance","slope","spaceVolume"],r=` + `)(n,t);return r&&typeof r.then=="function"?await r:r}catch(n){return console.error("[AI Manager] 代码执行失败:",n),"error"+n.message}}reset(){this.conversationHistory=[],this.steps=[],this.stepResults.clear(),this.state="idle",this.config?.debug&&console.log("[AI Manager] 对话已重置")}getState(){return this.state}getHistory(){return[...this.conversationHistory]}getSteps(){return[...this.steps]}getStepResults(){return new Map(this.stepResults)}}class IE{options;DeviceType;animationId=null;isRenderingPaused=!1;controlsEnabledBeforePause=!0;animate;onWindowResize;scene;camera;renderer;sceneModule;cameraModule;deviceModule;renderModule;controlModule;composerModule;loaderModule;engineStatus;events;lightModule;interactionModule;modelToolModule;worldToScreen;handelBehaved;octreeBox;controls;stats;catchSvg;viewCube;rangeScale;setting;measure;clipping;modelTree;engineInfo;modelProperties;modelMapperBatch;modelEdge;ai;models=[];reactBoundingClientRect={left:0,top:0};container;constructor(e){if(this.options=e,this.container=document.getElementById(e.containerId),!this.container)throw new Error(`Container ${e.containerId} not found`);this.ai=new DE(this),this.ai.init(),this.deviceModule=new s2(this),this.DeviceType=this.deviceModule.getDeviceType(),this.cameraModule=new i2(this),this.sceneModule=new n2(this),this.scene=this.sceneModule.scene,this.renderModule=new r2(this),this.renderer=this.renderModule.createRenderer(),this.camera=this.cameraModule.orthographicCamera,this.scene.camera=this.camera,this.controlModule=new y2(this),this.controlModule.switchDefaultMode(),this.controls=this.controlModule.orbitControls,this.composerModule=new N2(this),this.composerModule.init(),this.events=new ow,this.engineStatus=new rw(this),this.engineStatus.init(),this.loaderModule=new sw(this),this.lightModule=new aw(this),this.lightModule.init(),this.viewCube=new bw(this),this.viewCube.init(),this.octreeBox=yw(this),this.rangeScale=new _w(this),this.rangeScale.init(),this.clipping=new EE(this),this.clipping.init(),this.setting=new Mw(this),this.setting.init(),this.handelBehaved=qh(this),this.modelMapperBatch=new PE(this),this.measure=new Lw(this),this.modelToolModule=new cw(this),this.modelProperties=new CE(this),this.interactionModule=new lw(this),this.interactionModule.init(),this.interactionModule.active(),this.modelEdge=new RE(this),this.modelTree=new TE(this),this.engineInfo=new AE(this),this.worldToScreen=new kn(this.camera,this.renderer,this.scene),this.reactBoundingClientRect=this.container.getBoundingClientRect(),this.stats=new fw,this.stats.showPanel(0),this.stats.dom.style.position="absolute",this.stats.dom.style.top="0px",this.stats.dom.style.left="0px",this.stats.dom.style.zIndex="1000",this.container.appendChild(this.stats.dom);let t=document.createElementNS("http://www.w3.org/2000/svg","svg");t.style.position="absolute",t.style.width="100%",t.style.height="100%",t.style.zIndex="1000",t.style.left="0px",t.style.top="0px",t.style.pointerEvents="none";const n=this.renderer?.domElement.width||1920,i=this.renderer?.domElement.height||1080;t.setAttribute("viewBox",`0 0 ${n} ${i}`),t.setAttribute("preserveAspectRatio","none"),this.container.appendChild(t),this.catchSvg=t,this.onWindowResize=()=>{this.handleWindowResize()},window.addEventListener("resize",this.onWindowResize),this.animate=()=>{if(!this.isRenderingPaused)this.animationId=requestAnimationFrame(this.animate);else{this.animationId=null;return}this.stats&&this.stats.begin(),this.composerModule&&this.composerModule.composer.render(),this.viewCube.cubeTool.RenderScene(),this.measure.update(),this.controlModule.update(),this.stats&&this.stats.end()},this.animate()}pauseRendering(){if(this.isRenderingPaused){console.warn("[BimEngine] Rendering is already paused");return}this.isRenderingPaused=!0,this.controls&&(this.controlsEnabledBeforePause=this.controls.enabled,this.controls.enabled=!1)}resumeRendering(){if(!this.isRenderingPaused){console.warn("[BimEngine] Rendering is not paused");return}this.isRenderingPaused=!1,this.controls&&(this.controls.enabled=this.controlsEnabledBeforePause),this.animationId===null&&this.animate()}isRenderingPausedState(){return this.isRenderingPaused}handleWindowResize(){if(!this.container||!this.renderer||!this.camera)return;this.reactBoundingClientRect=this.container.getBoundingClientRect();const{width:e,height:t}=this.deviceModule.getContainerSize();this.renderer.setSize(e,t);const n=e/t;if(this.camera===this.cameraModule.perspectiveCamera?(this.cameraModule.perspectiveCamera.aspect=n,this.cameraModule.perspectiveCamera.updateProjectionMatrix()):this.camera===this.cameraModule.orthographicCamera&&(this.cameraModule.orthographicCamera.left=50*n/-2,this.cameraModule.orthographicCamera.right=50*n/2,this.cameraModule.orthographicCamera.top=50/2,this.cameraModule.orthographicCamera.bottom=50/-2,this.cameraModule.orthographicCamera.updateProjectionMatrix()),this.composerModule&&this.composerModule.composer&&this.composerModule.composer.setSize(e,t),this.catchSvg){const i=this.renderer.domElement.width,r=this.renderer.domElement.height;this.catchSvg.setAttribute("viewBox",`0 0 ${i} ${r}`)}this.events&&this.events.trigger(Ar.ViewportResize,{width:e,height:t})}dispose(){console.log("[BimEngine] Starting engine disposal..."),this.animationId!==null&&(cancelAnimationFrame(this.animationId),this.animationId=null),this.isRenderingPaused=!0,this.onWindowResize&&window.removeEventListener("resize",this.onWindowResize);try{this.measure&&(this.measure.disActive(),this.measure.clearAll(),this.measure.annotationContainer&&this.measure.annotationContainer.remove()),this.clipping&&this.clipping.disActive(),this.interactionModule&&this.interactionModule.disActive(),this.viewCube&&this.viewCube.cubeTool&&typeof this.viewCube.cubeTool.dispose=="function"&&this.viewCube.cubeTool.dispose()}catch(e){console.warn("[BimEngine] Error disposing managers:",e)}try{this.controlModule&&(this.controlModule.originDiv&&this.controlModule.originDiv.remove(),this.controlModule.orbitControls&&typeof this.controlModule.orbitControls.dispose=="function"&&this.controlModule.orbitControls.dispose(),this.controlModule.firstPersonControls&&typeof this.controlModule.firstPersonControls.dispose=="function"&&this.controlModule.firstPersonControls.dispose())}catch(e){console.warn("[BimEngine] Error disposing controls:",e)}this.scene&&this.clearScene(this.scene);try{this.composerModule&&this.composerModule.composer&&(this.composerModule.composer.passes&&this.composerModule.composer.passes.forEach(e=>{e.dispose&&e.dispose()}),this.composerModule.composer.renderTarget1&&this.composerModule.composer.renderTarget1.dispose(),this.composerModule.composer.renderTarget2&&this.composerModule.composer.renderTarget2.dispose())}catch(e){console.warn("[BimEngine] Error disposing composer:",e)}try{this.renderModule&&this.renderModule.disposeRenderer(),this.renderer&&(this.renderer.domElement&&this.renderer.domElement.parentElement&&this.renderer.domElement.parentElement.removeChild(this.renderer.domElement),this.renderer.dispose(),this.renderer.forceContextLoss())}catch(e){console.warn("[BimEngine] Error disposing renderer:",e)}try{this.stats&&this.stats.dom&&this.stats.dom.parentElement&&this.stats.dom.parentElement.removeChild(this.stats.dom),this.catchSvg&&this.catchSvg.parentElement&&this.catchSvg.parentElement.removeChild(this.catchSvg)}catch(e){console.warn("[BimEngine] Error disposing DOM elements:",e)}try{this.events&&this.events.listeners&&this.events.listeners.clear()}catch(e){console.warn("[BimEngine] Error clearing event listeners:",e)}this.scene=null,this.camera=null,this.renderer=null,this.controls=null,this.models=[],this.container=null,console.log("[BimEngine] Engine disposal completed")}clearScene(e){e&&([...e.children].forEach(t=>{this.clearScene(t)}),e.parent&&e.parent.remove(e),e instanceof ut&&(e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(t=>this.disposeMaterial(t)):this.disposeMaterial(e.material))),e instanceof Xi&&(e.geometry&&e.geometry.dispose(),e.material&&this.disposeMaterial(e.material)),e instanceof Af&&(e.geometry&&e.geometry.dispose(),e.material&&this.disposeMaterial(e.material)),e instanceof ho&&(e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material.forEach(t=>this.disposeMaterial(t)):this.disposeMaterial(e.material)),e.instanceMatrix&&(e.instanceMatrix=null),e.instanceColor&&(e.instanceColor=null)),e instanceof Sx&&e.material&&this.disposeMaterial(e.material))}disposeMaterial(e){e&&(["map","lightMap","bumpMap","normalMap","specularMap","envMap","alphaMap","aoMap","displacementMap","emissiveMap","gradientMap","metalnessMap","roughnessMap","clearcoatMap","clearcoatNormalMap","clearcoatRoughnessMap","transmissionMap","thicknessMap","sheenColorMap","sheenRoughnessMap","specularIntensityMap","specularColorMap","iridescenceMap","iridescenceThicknessMap"].forEach(t=>{const n=e[t];n&&n instanceof Ht&&n.dispose()}),e.dispose())}}function BE(s){return new IE(s)}class NE{engine=null;container;containerId;options;_isInitialized=!1;_isDestroyed=!1;unsubscribeTheme=null;currentMeasureType=null;isMeasureActive=!1;currentSectionAxis=null;isSectionBoxActive=!1;selectedComponent=null;constructor(e){this.container=e.container,this.container.id?this.containerId=this.container.id:(this.containerId=`engine-container-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,this.container.id=this.containerId),this.options={backgroundColor:"linear-gradient(to bottom, rgb(214, 224, 235), rgb(246, 250, 255))",version:e.version??"v2",showStats:e.showStats??!1,showViewCube:e.showViewCube??!0}}init(){if(this._isInitialized){console.warn("[Engine] Engine already initialized.");return}if(this._isDestroyed){console.error("[Engine] Cannot initialize destroyed engine.");return}try{typeof this.options.backgroundColor=="string"&&(this.container.style.background=this.options.backgroundColor);const e={containerId:this.containerId,backgroundColor:this.options.backgroundColor,version:this.options.version,showStats:this.options.showStats,showViewCube:this.options.showViewCube};if(console.log("引擎配置信息:",e),this.engine=BE(e),!this.engine)throw new Error("Failed to create engine instance");this._isInitialized=!0,this.unsubscribeTheme=rt.subscribe(t=>{this.setTheme(t)}),this.setTheme(rt.getTheme()),this.engine.events.on("click",t=>{const n=wt.getInstance();t&&t.object?(this.selectedComponent={url:t.object.url,id:t.object.name},console.log("[Engine] 构件选中:",this.selectedComponent),n.emit("component:selected",this.selectedComponent)):(this.selectedComponent=null,console.log("[Engine] 取消选中"),n.emit("component:deselected",{}))})}catch(e){throw console.error("[Engine] Failed to initialize engine:",e),this._isInitialized=!1,e}}setTheme(e){}setLocales(){}isInitialized(){return this._isInitialized}loadModel(e,t){if(!this._isInitialized||!this.engine){console.error("[Engine] Engine not initialized. Please call init() first.");return}if(!e){console.error("[Engine] Model URL is required.");return}this.engine.loaderModule.loadModels([e],t)}CameraGoHome(){this.engine.viewCube.CameraGoHome()}getEngine(){return this.engine}pauseRendering(){if(!this._isInitialized||!this.engine){console.warn("[Engine] Engine not initialized.");return}this.engine.pauseRendering()}resumeRendering(){if(!this._isInitialized||!this.engine){console.warn("[Engine] Engine not initialized.");return}this.engine.resumeRendering()}dispose(){if(!this._isInitialized||!this.engine){console.warn("[Engine] Engine not initialized.");return}this.engine.dispose()}activateMeasureType(e,t){if(!this._isInitialized||!this.engine){console.error("Cannot activate measure: engine not initialized.");return}if(!this.engine.measure){console.error("Measure module not available.");return}this.isMeasureActive||(console.log("激活测量功能"),this.engine.measure.active(),this.isMeasureActive=!0),t(),this.currentMeasureType=e}activateDistanceMeasure(){this.activateMeasureType("distance",()=>{console.log("激活距离测量"),this.engine.measure.distanceMeasure.active()})}activateMinDistanceMeasure(){this.activateMeasureType("minDistance",()=>{console.log("激活最小距离测量"),this.engine.measure.clearDistanceMeasure.active()})}activateAngleMeasure(){this.activateMeasureType("angle",()=>{console.log("激活角度测量"),this.engine.measure.angleMeasure.active(),console.log("[Engine] Angle measure activated (placeholder)")})}activateElevationMeasure(){this.activateMeasureType("elevation",()=>{console.log("激活标高测量"),this.engine.measure.elevationMeasure.active()})}activateVolumeMeasure(){this.activateMeasureType("volume",()=>{console.log("激活体积测量"),this.engine.measure.areaMeasure.active()})}activateLaserDistanceMeasure(){this.activateMeasureType("laserDistance",()=>{console.log("[Engine] Laser distance measure activated (placeholder)")})}activateSlopeMeasure(){this.activateMeasureType("slope",()=>{console.log("激活坡度测量"),this.engine.measure.slopeMeasure.active()})}activateSpaceVolumeMeasure(){this.activateMeasureType("spaceVolume",()=>{console.log("[Engine] Space volume measure activated (placeholder)")})}activateMeasure(e){switch(e){case"distance":this.activateDistanceMeasure();break;case"minDistance":this.activateMinDistanceMeasure();break;case"angle":this.activateAngleMeasure();break;case"elevation":this.activateElevationMeasure();break;case"volume":this.activateVolumeMeasure();break;case"laserDistance":this.activateLaserDistanceMeasure();break;case"slope":this.activateSlopeMeasure();break;case"spaceVolume":this.activateSpaceVolumeMeasure();break}}deactivateMeasure(){!this._isInitialized||!this.engine?.measure||this.isMeasureActive&&(console.log("停用测量功能"),this.engine.measure.disActive(),this.isMeasureActive=!1,this.currentMeasureType=null)}getCurrentMeasureType(){return this.currentMeasureType}clearAllMeasures(){!this._isInitialized||!this.engine?.measure||(console.log("清除所有测量标注"),this.engine.measure.clearAll())}activateSectionAxis(e){if(!this._isInitialized||!this.engine){console.error("[Engine] Cannot activate section axis: engine not initialized.");return}if(!this.engine.clipping){console.error("[Engine] Clipping module not available.");return}if(this.currentSectionAxis===e){console.log(`[Engine] Section axis ${e} already active, skipping.`);return}this.currentSectionAxis&&this.deactivateCurrentSectionAxis();const n={x:this.engine.clipping.sectionPlaneX,y:this.engine.clipping.sectionPlaneY,z:this.engine.clipping.sectionPlaneZ}[e];n&&typeof n.active=="function"?(console.log(`[Engine] Activating section axis: ${e}`),n.active(),this.currentSectionAxis=e):console.error(`[Engine] Section plane ${e} not available.`)}deactivateCurrentSectionAxis(){if(!this.currentSectionAxis||!this.engine?.clipping)return;const t={x:this.engine.clipping.sectionPlaneX,y:this.engine.clipping.sectionPlaneY,z:this.engine.clipping.sectionPlaneZ}[this.currentSectionAxis];t&&typeof t.disActive=="function"&&(console.log(`[Engine] Deactivating section axis: ${this.currentSectionAxis}`),t.disActive())}deactivateSectionAxis(){!this._isInitialized||!this.engine?.clipping||this.currentSectionAxis&&(console.log("[Engine] Deactivating all section axis"),this.engine.clipping.disActive(),this.currentSectionAxis=null)}getCurrentSectionAxis(){return this.currentSectionAxis}activateSectionBox(){if(!this._isInitialized||!this.engine){console.error("[Engine] Cannot activate section box: engine not initialized.");return}if(!this.engine.clipping?.sectionBox){console.error("[Engine] Section box module not available.");return}if(this.isSectionBoxActive){console.log("[Engine] Section box already active, skipping.");return}console.log("[Engine] Activating section box"),this.engine.clipping.sectionBox.active(),this.isSectionBoxActive=!0}deactivateSectionBox(){!this._isInitialized||!this.engine?.clipping?.sectionBox||this.isSectionBoxActive&&(console.log("[Engine] Deactivating section box"),this.engine.clipping.sectionBox.disActive(),this.isSectionBoxActive=!1)}setSectionBoxRange(e){if(!this._isInitialized||!this.engine?.clipping?.sectionBox){console.error("[Engine] Cannot set section box range: engine not initialized.");return}console.log("[Engine] Setting section box range:",e),this.engine.clipping.sectionBox.setboxPercent(e)}fitSectionBoxToModel(){if(!this._isInitialized||!this.engine?.clipping?.sectionBox){console.error("[Engine] Cannot fit section box: engine not initialized.");return}const e=this.engine.octreeBox?.getBoundingBox();if(!e){console.error("[Engine] Cannot fit section box: model bounding box not available.");return}console.log("[Engine] Fitting section box to model"),this.engine.clipping.sectionBox.setBox(e)}resetSectionBox(){this.fitSectionBoxToModel()}isWalkModeActive=!1;activateFirstPersonMode(){if(!this._isInitialized||!this.engine){console.error("[Engine] Cannot activate first person mode: engine not initialized.");return}if(!this.engine.controlModule){console.error("[Engine] Control module not available.");return}if(this.isWalkModeActive){console.log("[Engine] First person mode already active, skipping.");return}console.log("[Engine] Activating first person mode"),this.engine.controlModule.switchFirstPersonMode(),this.isWalkModeActive=!0}deactivateFirstPersonMode(){!this._isInitialized||!this.engine?.controlModule||this.isWalkModeActive&&(console.log("[Engine] Deactivating first person mode"),this.engine.controlModule.switchDefaultMode(),this.isWalkModeActive=!1)}setWalkSpeed(e){if(!this._isInitialized||!this.engine?.controlModule?.firstPersonControls){console.error("[Engine] Cannot set walk speed: engine not initialized.");return}console.log("[Engine] Setting walk speed:",e),this.engine.controlModule.firstPersonControls.moveSpeed=e}setWalkGravity(e){if(!this._isInitialized||!this.engine?.controlModule?.firstPersonControls){console.error("[Engine] Cannot set walk gravity: engine not initialized.");return}console.log("[Engine] Setting walk gravity:",e),this.engine.controlModule.firstPersonControls.applyGravity=e}setWalkCollision(e){if(!this._isInitialized||!this.engine?.controlModule?.firstPersonControls){console.error("[Engine] Cannot set walk collision: engine not initialized.");return}console.log("[Engine] Setting walk collision:",e),this.engine.controlModule.firstPersonControls.applyCollision=e}isFirstPersonModeActive(){return this.isWalkModeActive}getSelectedComponent(){return this.selectedComponent}getComponentProperties(e,t,n){if(!this._isInitialized||!this.engine){console.error("[Engine] Cannot get component properties: engine not initialized.");return}if(!this.engine.modelProperties){console.error("[Engine] modelProperties not available");return}console.log("[Engine] Getting component properties:",{url:e,id:t}),this.engine.modelProperties.getModelProperties(e,t,n)}getTypeTreeData(){return!this._isInitialized||!this.engine?.modelTree?[]:this.engine.modelTree.getTypeTreeData()}getLevelTreeData(){return!this._isInitialized||!this.engine?.modelTree?[]:this.engine.modelTree.getLevelTreeData()}getMajorTreeData(){return!this._isInitialized||!this.engine?.modelTree?[]:this.engine.modelTree.getMajorTreeData()}activateZoomBox(){if(!this._isInitialized||!this.engine){console.warn("[Engine] Engine not initialized.");return}this.engine.rangeScale?.active()}destroy(){this._isDestroyed||(this.deactivateMeasure(),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.engine&&(this.engine.dispose(),this.engine=null),this.container.innerHTML="",this.currentMeasureType=null,this.isMeasureActive=!1,this._isDestroyed=!0,this._isInitialized=!1)}}class kE{element;content=null;isVisible=!1;onCloseCallback;options;mouseDownTime=0;CLICK_THRESHOLD=200;constructor(e){this.options=e,this.element=document.createElement("div"),this.element.className=`bim-right-key ${e?.className||""}`,e?.zIndex&&(this.element.style.zIndex=e.zIndex.toString()),document.body.appendChild(this.element)}init(){document.addEventListener("mousedown",this.handleGlobalClick),this.element.addEventListener("contextmenu",e=>{e.preventDefault(),e.stopPropagation()}),this.options?.container&&(this.options.container.addEventListener("mousedown",this.handleContainerMouseDown),this.options.container.addEventListener("mouseup",this.handleContainerMouseUp),this.options.container.addEventListener("contextmenu",this.handleContainerContextMenu))}setTheme(e){}setLocales(){}destroy(){document.removeEventListener("mousedown",this.handleGlobalClick),this.options?.container&&(this.options.container.removeEventListener("mousedown",this.handleContainerMouseDown),this.options.container.removeEventListener("mouseup",this.handleContainerMouseUp),this.options.container.removeEventListener("contextmenu",this.handleContainerContextMenu)),this.unmountContent(),this.element.remove()}handleContainerMouseDown=e=>{e.button===2&&(this.mouseDownTime=Date.now())};handleContainerMouseUp=e=>{e.button!==2||Date.now()-this.mouseDownTime>this.CLICK_THRESHOLD||this.options?.onContext&&this.options.onContext(e)};handleContainerContextMenu=e=>{e.preventDefault()};setOnClose(e){this.onCloseCallback=e}mount(e){this.unmountContent(),this.content=e,this.element.appendChild(e.getElement())}unmountContent(){this.content&&(this.content.destroy(),this.element.innerHTML="",this.content=null)}show(e,t){this.element.classList.add("visible"),this.isVisible=!0,this.element.style.left=`${e}px`,this.element.style.top=`${t}px`;const n=this.element.getBoundingClientRect(),i=window.innerWidth,r=window.innerHeight;let o=e,a=t;e+n.width>i&&(o=e-n.width),t+n.height>r&&(a=t-n.height),this.element.style.left=`${o}px`,this.element.style.top=`${a}px`}hide(){this.element.classList.remove("visible"),this.isVisible=!1,this.unmountContent(),this.onCloseCallback&&this.onCloseCallback()}handleGlobalClick=e=>{this.isVisible&&(this.element.contains(e.target)||this.hide())}}class td{element;options;unsubscribeLocale=null;unsubscribeTheme=null;activeSubMenu=null;constructor(e){this.options=e,this.element=document.createElement("ul"),this.element.className="bim-menu"}init(){this.render(),this.unsubscribeLocale=Yt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=rt.subscribe(e=>{this.setTheme(e)})}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-divider",e.divider),t.setProperty("--bim-component-bg-hover",e.componentBgHover),t.setProperty("--bim-shadow-lg",e.shadowLg)}setLocales(){this.element.innerHTML="",this.render()}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.closeSubMenu(),this.element.remove()}getElement(){return this.element}hasAnyIcon(e){return e.some(t=>t.icon?!0:t.children?this.hasAnyIcon(t.children):!1)}render(){const{items:e,groupOrder:t}=this.options;this.hasAnyIcon(e)?this.element.classList.add("has-icons"):this.element.classList.remove("has-icons");const n=new Map,i="default";e.forEach(o=>{const a=o.group||i;n.has(a)||n.set(a,[]),n.get(a).push(o)});let r=[];if(t){r=t.filter(o=>n.has(o));for(const o of n.keys())r.includes(o)||r.push(o)}else r=Array.from(n.keys());r.forEach((o,a)=>{if(a>0){const c=document.createElement("li");c.className="bim-menu-divider",this.element.appendChild(c)}const l=n.get(o);l.sort((c,h)=>(c.order||0)-(h.order||0)),l.forEach(c=>{if(c.visible!==!1&&(this.element.appendChild(this.createItemElement(c)),c.divider)){const h=document.createElement("li");h.className="bim-menu-divider",this.element.appendChild(h)}})})}createItemElement(e){const t=document.createElement("li"),n=!e.disabled;t.className=`bim-menu-item ${n?"":"disabled"}`;const i=document.createElement("div");i.className="bim-menu-item-icon",e.icon&&(i.innerHTML=e.icon),t.appendChild(i);const r=document.createElement("div");r.className="bim-menu-item-label",r.textContent=Te(e.label),t.appendChild(r);const o=e.children,a=o&&o.length>0;if(a){const l=document.createElement("div");l.className="bim-menu-item-arrow",l.innerHTML='',t.appendChild(l),t.addEventListener("mouseenter",()=>this.openSubMenu(e,t))}else t.addEventListener("mouseenter",()=>this.closeSubMenu());return n&&t.addEventListener("click",l=>{l.stopPropagation(),console.log(`[BimMenu] Clicked item: ${e.id}`),a||(e.onClick?(console.log(`[BimMenu] Executing onClick for ${e.id}`),e.onClick()):console.warn(`[BimMenu] No onClick handler for ${e.id}`))}),t}openSubMenu(e,t){const n=e.children;if(!n||n.length===0)return;this.closeSubMenu();const i=document.createElement("div");i.style.position="fixed",i.style.zIndex="10001";const r=t.getBoundingClientRect();i.style.top=`${r.top}px`,i.style.left=`${r.right}px`,i.addEventListener("mousedown",l=>l.stopPropagation());const o=new td({items:n});o.init(),i.appendChild(o.element),document.body.appendChild(i),this.activeSubMenu={menu:o,container:i};const a=i.getBoundingClientRect();a.right>window.innerWidth&&(i.style.left=`${r.left-a.width}px`)}closeSubMenu(){this.activeSubMenu&&(this.activeSubMenu.menu.destroy(),this.activeSubMenu.container.remove(),this.activeSubMenu=null)}}class k0 extends pi{container;rightKeyPanel;contextHandlers=[];constructor(e){super(),this.container=e,this.rightKeyPanel=new kE({zIndex:9e3,container:this.container,onContext:this.handleContextMenu}),this.rightKeyPanel.init()}destroy(){this.rightKeyPanel.destroy(),super.destroy()}registerHandler(e){this.contextHandlers.push(e)}showMenu(e,t,n,i){if(!n||n.length===0)return;const r=new td({items:n,groupOrder:i});r.init(),this.rightKeyPanel.mount(r),this.rightKeyPanel.show(e,t)}hide(){this.rightKeyPanel.hide()}handleContextMenu=e=>{let t=null;for(const n of this.contextHandlers){const i=n(e);i&&i.length>0&&(t||(t=[]),t=t.concat(i))}t&&t.length>0?this.showMenu(e.clientX,e.clientY,t):this.hide()}}class UE extends pi{container;engineInstance=null;rightKey=null;constructor(e){super(),this.container=e}initialize(e){this.engineInstance&&this.engineInstance.isInitialized()&&(console.warn("[EngineManager] 3D Engine already initialized. Destroying old instance..."),this.engineInstance.destroy(),this.engineInstance=null);try{return this.engineInstance=new NE({container:this.container,...e}),this.engineInstance.init(),this.rightKey=new k0(this.container),this.rightKey.registerHandler(t=>{const n=this.getSelectedComponent(),i=[];return n&&(i.push({id:"componentDetail",label:"menu.componentDetail",group:"component",order:1,divider:!0,onClick:()=>{wt.getInstance().componentDetail?.show(),this.rightKey?.hide()}}),i.push({id:"hideSelected",label:"menu.hideSelected",group:"component",order:2,onClick:()=>{console.log("[Menu] 隐藏选中构件 - 暂未实现"),this.rightKey?.hide()}}),i.push({id:"transparentSelected",label:"menu.transparentSelected",group:"component",order:3,onClick:()=>{console.log("[Menu] 半透明选中构件 - 暂未实现"),this.rightKey?.hide()}}),i.push({id:"isolateSelected",label:"menu.isolateSelected",group:"component",order:4,divider:!0,children:[{id:"hideOthers",label:"menu.hideOthers",onClick:()=>{console.log("[Menu] 隔离 - 其他构件隐藏 - 暂未实现"),this.rightKey?.hide()}},{id:"transparentOthers",label:"menu.transparentOthers",onClick:()=>{console.log("[Menu] 隔离 - 其他构件半透明 - 暂未实现"),this.rightKey?.hide()}}]}),i.push({id:"fitSectionBox",label:"menu.fitSectionBox",group:"component",order:5,onClick:()=>{console.log("[Menu] 剖切盒适应 - 暂未实现"),this.rightKey?.hide()}})),i.push({id:"showAll",label:"menu.showAll",group:"component",order:6,onClick:()=>{console.log("[Menu] 显示全部 - 暂未实现"),this.rightKey?.hide()}}),i}),this.engineInstance.isInitialized()}catch(t){return console.error("[EngineManager] Failed to initialize 3D engine:",t),this.engineInstance=null,!1}}isInitialized(){return this.engineInstance!==null&&this.engineInstance.isInitialized()}loadModel(e,t){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.loadModel(e,t)}getEngine(){return this.engineInstance?this.engineInstance.getEngine():(console.warn("[EngineManager] 3D Engine not initialized."),null)}CameraGoHome(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.CameraGoHome()}pauseRendering(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.pauseRendering()}resumeRendering(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.resumeRendering()}activateMeasure(e){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.activateMeasure(e)}deactivateMeasure(){this.engineInstance&&this.engineInstance.deactivateMeasure()}getCurrentMeasureType(){return this.engineInstance?this.engineInstance.getCurrentMeasureType():null}clearAllMeasures(){this.engineInstance&&this.engineInstance.clearAllMeasures()}activateSectionAxis(e){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.activateSectionAxis(e)}deactivateSectionAxis(){this.engineInstance&&this.engineInstance.deactivateSectionAxis()}getCurrentSectionAxis(){return this.engineInstance?this.engineInstance.getCurrentSectionAxis():null}activateSectionBox(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.activateSectionBox()}deactivateSectionBox(){this.engineInstance&&this.engineInstance.deactivateSectionBox()}setSectionBoxRange(e){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.setSectionBoxRange(e)}fitSectionBoxToModel(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.fitSectionBoxToModel()}resetSectionBox(){this.engineInstance&&this.engineInstance.resetSectionBox()}activateZoomBox(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.activateZoomBox()}activateFirstPersonMode(){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.activateFirstPersonMode()}deactivateFirstPersonMode(){this.engineInstance&&this.engineInstance.deactivateFirstPersonMode()}setWalkSpeed(e){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.setWalkSpeed(e)}setWalkGravity(e){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.setWalkGravity(e)}setWalkCollision(e){if(!this.engineInstance){console.warn("[EngineManager] 3D Engine not initialized.");return}this.engineInstance.setWalkCollision(e)}isFirstPersonModeActive(){return this.engineInstance?this.engineInstance.isFirstPersonModeActive():!1}getSelectedComponent(){return this.engineInstance?.getSelectedComponent()??null}getComponentProperties(e,t,n){this.engineInstance?.getComponentProperties(e,t,n)}getTypeTreeData(){return this.engineInstance?.getTypeTreeData()??[]}getLevelTreeData(){return this.engineInstance?.getLevelTreeData()??[]}getMajorTreeData(){return this.engineInstance?.getMajorTreeData()??[]}destroy(){this.engineInstance&&(this.engineInstance.destroy(),this.engineInstance=null),this.rightKey&&(this.rightKey.destroy(),this.rightKey=null),super.destroy()}}var It=(s=>(s[s.Unchecked=0]="Unchecked",s[s.Checked=1]="Checked",s[s.Indeterminate=2]="Indeterminate",s))(It||{});class OE{config;element;children=[];parent=null;checkState=It.Unchecked;contentEl;switcherEl;checkboxEl=null;titleEl;actionsEl;childrenContainer;onExpandChange;onCheckChange;onNodeClick;renderActions;constructor(e,t,n){this.config=e,this.onExpandChange=n.onExpand,this.onCheckChange=n.onCheck,this.onNodeClick=n.onClick,this.renderActions=t.renderActions,this.checkState=e.checked?It.Checked:It.Unchecked,this.element=this.createDom(t)}createDom(e){const t=document.createElement("div");t.className="bim-tree-node",this.config.disabled&&t.classList.add("is-disabled"),this.contentEl=document.createElement("div"),this.contentEl.className="bim-tree-node-content",this.switcherEl=document.createElement("span"),this.switcherEl.className="bim-tree-switcher",this.switcherEl.innerHTML='';const n=this.config.children&&this.config.children.length>0;if(n?this.config.expanded&&this.switcherEl.classList.add("is-expanded"):this.switcherEl.classList.add("is-hidden"),this.switcherEl.addEventListener("click",r=>{r.stopPropagation(),this.toggleExpand()}),this.contentEl.appendChild(this.switcherEl),e.checkable!==!1&&(this.checkboxEl=document.createElement("span"),this.checkboxEl.className="bim-tree-checkbox",this.updateCheckboxUI(),this.checkboxEl.addEventListener("click",r=>{r.stopPropagation(),!this.config.disabled&&this.toggleCheck()}),this.contentEl.appendChild(this.checkboxEl)),this.config.icon){const r=document.createElement("span");r.className="bim-tree-icon",r.innerHTML=this.config.icon.includes("`,this.contentEl.appendChild(r)}this.titleEl=document.createElement("span"),this.titleEl.className="bim-tree-title",this.updateLabel(),this.contentEl.appendChild(this.titleEl),this.actionsEl=document.createElement("div"),this.actionsEl.className="bim-tree-node-actions",this.actionsEl.addEventListener("click",r=>{r.stopPropagation()}),this.contentEl.appendChild(this.actionsEl),this.contentEl.addEventListener("click",r=>{if(r.stopPropagation(),this.config.disabled)return;(this.config.clickAction||"select")==="expand"?this.toggleExpand():this.onNodeClick(this)}),t.appendChild(this.contentEl),this.childrenContainer=document.createElement("div"),this.childrenContainer.className="bim-tree-children";const i=e.indent||24;return this.childrenContainer.style.paddingLeft=`${i}px`,this.config.expanded&&n&&this.childrenContainer.classList.add("is-visible"),t.appendChild(this.childrenContainer),t}setSelected(e){if(e){if(this.contentEl.classList.add("is-selected"),this.renderActions){const t=this.renderActions(this.config);this.actionsEl.innerHTML="",typeof t=="string"?this.actionsEl.innerHTML=t:t instanceof HTMLElement&&this.actionsEl.appendChild(t)}}else this.contentEl.classList.remove("is-selected"),this.actionsEl.innerHTML=""}updateLabel(){this.titleEl&&(this.titleEl.textContent=this.config.label)}toggleExpand(e){if(!this.config.children||this.config.children.length===0)return;const t=e!==void 0?e:!this.config.expanded;this.config.expanded=t,t?(this.switcherEl.classList.add("is-expanded"),this.childrenContainer.classList.add("is-visible")):(this.switcherEl.classList.remove("is-expanded"),this.childrenContainer.classList.remove("is-visible")),e===void 0&&this.onExpandChange(this)}toggleCheck(){const e=this.checkState!==It.Checked;this.setChecked(e?It.Checked:It.Unchecked,!0)}setChecked(e,t=!1){this.checkState!==e&&(this.checkState=e,this.config.checked=e===It.Checked,this.updateCheckboxUI(),t&&this.onCheckChange(this))}updateCheckboxUI(){this.checkboxEl&&(this.checkboxEl.classList.remove("is-checked","is-indeterminate"),this.checkState===It.Checked?this.checkboxEl.classList.add("is-checked"):this.checkState===It.Indeterminate&&this.checkboxEl.classList.add("is-indeterminate"))}appendChild(e){e.parent=this,this.children.push(e),this.childrenContainer.appendChild(e.element),this.children.length===1&&this.switcherEl.classList.remove("is-hidden")}destroy(){this.children.forEach(e=>e.destroy()),this.children=[],this.element.remove(),this.parent=null}}class FE{element;contentElement;searchInput=null;searchResults=null;options;nodeMap=new Map;rootNodes=[];selectedNode=null;unsubscribeLocale=null;unsubscribeTheme=null;clickOutsideHandler=null;onNodeCheck;onNodeSelect;onNodeExpand;constructor(e){this.options={checkable:!0,checkStrictly:!0,indent:24,defaultExpandAll:!0,enableSearch:!1,searchPlaceholder:"tree.searchPlaceholder",...e},this.element=document.createElement("div"),this.element.className="bim-tree",this.options.enableSearch&&this.createSearchDOM(),this.contentElement=document.createElement("div"),this.contentElement.className="bim-tree-content",this.element.appendChild(this.contentElement),e.onNodeCheck&&(this.onNodeCheck=e.onNodeCheck),e.onNodeSelect&&(this.onNodeSelect=e.onNodeSelect),e.onNodeExpand&&(this.onNodeExpand=e.onNodeExpand)}createSearchDOM(){const e=document.createElement("div");e.className="bim-tree-search";const t=document.createElement("div");t.className="bim-tree-search-wrapper";const n=document.createElement("span");n.className="bim-tree-search-icon",n.innerHTML='',t.appendChild(n),this.searchInput=document.createElement("input"),this.searchInput.className="bim-tree-search-input",this.searchInput.type="text",this.searchInput.placeholder=Te(this.options.searchPlaceholder||"搜索..."),this.searchInput.addEventListener("input",i=>{const r=i.target.value;this.handleSearch(r)}),t.appendChild(this.searchInput),e.appendChild(t),this.searchResults=document.createElement("div"),this.searchResults.className="bim-tree-search-results",e.appendChild(this.searchResults),this.element.appendChild(e),this.clickOutsideHandler=i=>{this.searchResults&&!this.searchResults.contains(i.target)&&!this.searchInput?.contains(i.target)&&this.searchResults.classList.remove("is-visible")},document.addEventListener("click",this.clickOutsideHandler)}init(){this.render(),this.unsubscribeLocale=Yt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=rt.subscribe(e=>this.setTheme(e)),this.setTheme(rt.getTheme())}handleSearch(e){if(!this.searchResults)return;if(!e.trim()){this.searchResults.classList.remove("is-visible"),this.searchResults.innerHTML="";return}const t=[],n=e.toLowerCase();this.nodeMap.forEach(i=>{const r=i.config.label;r.toLowerCase().includes(n)&&t.push({node:i,label:r,path:this.getNodePath(i)})}),this.renderSearchResults(t)}getNodePath(e){const t=[];let n=e.parent;for(;n;)t.unshift(n.config.label),n=n.parent;return t.join(" > ")}renderSearchResults(e){if(this.searchResults){if(this.searchResults.innerHTML="",e.length===0){const t=document.createElement("div");t.className="bim-tree-search-item",t.style.cursor="default",t.style.color="#999",t.textContent="No results",this.searchResults.appendChild(t)}else e.forEach(t=>{const n=document.createElement("div");n.className="bim-tree-search-item";const i=document.createElement("span");i.className="bim-tree-search-item-title",i.textContent=t.label;const r=document.createElement("span");r.className="bim-tree-search-item-path",r.textContent=t.path,n.appendChild(i),t.path&&n.appendChild(r),n.addEventListener("click",()=>{this.revealNode(t.node)}),this.searchResults.appendChild(n)});this.searchResults.classList.add("is-visible")}}revealNode(e){this.searchResults&&(this.searchResults.classList.remove("is-visible"),this.searchInput&&(this.searchInput.value=""));let t=e.parent;for(;t;)t.toggleExpand(!0),t=t.parent;this.handleNodeSelect(e),setTimeout(()=>{e.element.scrollIntoView({behavior:"smooth",block:"center"})},100)}setTheme(e){const t=this.element.style;t.setProperty("--bim-primary",e.primary),t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-text-secondary",e.textSecondary),t.setProperty("--bim-text-tertiary",e.textTertiary),t.setProperty("--bim-text-disabled",e.textDisabled),t.setProperty("--bim-text-inverse",e.textInverse),t.setProperty("--bim-border-default",e.borderDefault),t.setProperty("--bim-border-disabled",e.borderDisabled),t.setProperty("--bim-component-bg-hover",e.componentBgHover),t.setProperty("--bim-component-bg-selected",e.componentBgSelected),t.setProperty("--bim-component-bg-disabled",e.componentBgDisabled),t.setProperty("--bim-shadow-md",e.shadowMd),t.setProperty("--bim-focus-ring",e.focusRing)}setLocales(){this.nodeMap.forEach(e=>e.updateLabel()),this.searchInput&&(this.searchInput.placeholder=Te(this.options.searchPlaceholder||"tree.searchPlaceholder"))}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.clickOutsideHandler&&(document.removeEventListener("click",this.clickOutsideHandler),this.clickOutsideHandler=null),this.rootNodes.forEach(e=>e.destroy()),this.rootNodes=[],this.nodeMap.clear(),this.element.remove(),this.selectedNode=null}render(){this.contentElement.innerHTML="",this.nodeMap.clear(),this.rootNodes=[],this.options.data.forEach(e=>{this.createNodeRecursively(e,null)})}createNodeRecursively(e,t){e.expanded===void 0&&(e.expanded=this.options.defaultExpandAll);const n=new OE(e,this.options,{onExpand:i=>{this.onNodeExpand&&this.onNodeExpand(i)},onCheck:i=>this.handleNodeCheck(i),onClick:i=>this.handleNodeSelect(i)});this.nodeMap.set(e.id,n),t?t.appendChild(n):(this.rootNodes.push(n),this.contentElement.appendChild(n.element)),e.children&&e.children.length>0&&e.children.forEach(i=>{this.createNodeRecursively(i,n)})}handleNodeSelect(e){this.selectedNode&&this.selectedNode!==e&&this.selectedNode.setSelected(!1),e.setSelected(!0),this.selectedNode=e,this.onNodeSelect&&this.onNodeSelect(e)}handleNodeCheck(e){const t=e.checkState===It.Checked;if(this.onNodeCheck&&this.onNodeCheck(e),this.options.checkStrictly===!1)return;const n=(r,o)=>{r.children.forEach(a=>{a.config.disabled||(a.setChecked(o,!1),n(a,o))})};t?n(e,It.Checked):n(e,It.Unchecked);let i=e.parent;for(;i;){if(i.config.disabled){i=i.parent;continue}const r=i.children,o=r.every(l=>l.checkState===It.Checked),a=r.every(l=>l.checkState===It.Unchecked);o?i.setChecked(It.Checked,!1):a?i.setChecked(It.Unchecked,!1):i.setChecked(It.Indeterminate,!1),i=i.parent}}getNode(e){return this.nodeMap.get(e)}checkNode(e,t){const n=this.nodeMap.get(e);n&&n.setChecked(t?It.Checked:It.Unchecked,!0)}expandAll(e){this.nodeMap.forEach(t=>t.toggleExpand(e))}getCheckedNodes(e=!1){const t=[];return this.nodeMap.forEach(n=>{(n.checkState===It.Checked||e&&n.checkState===It.Indeterminate)&&t.push(n.config)}),t}}class U0{element;navElement;contentElement;options;activeId;tabMap=new Map;panelMap=new Map;unsubscribeLocale=null;unsubscribeTheme=null;navClickHandler=null;constructor(e){this.options=e,this.activeId=e.activeId||(e.tabs[0]?.id??null),e.tabs.forEach(t=>this.tabMap.set(t.id,t)),this.element=document.createElement("div"),this.element.className="bim-tab",this.navElement=document.createElement("div"),this.navElement.className="bim-tab__nav",this.navElement.setAttribute("role","tablist"),this.element.appendChild(this.navElement),this.contentElement=document.createElement("div"),this.contentElement.className="bim-tab__content",this.element.appendChild(this.contentElement),this.options.container.appendChild(this.element)}init(){this.renderNav(),this.renderPanels(),this.setLocales(),this.setTheme(rt.getTheme()),this.unsubscribeLocale=Yt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=rt.subscribe(e=>this.setTheme(e))}renderNav(){this.navElement.innerHTML="",this.navClickHandler=e=>{const t=e.target.closest(".bim-tab__item");if(!t)return;const n=t.dataset.id;!n||this.tabMap.get(n)?.disabled||this.activateTab(n)},this.navElement.addEventListener("click",this.navClickHandler),this.options.tabs.forEach(e=>{const t=document.createElement("button");if(t.type="button",t.className="bim-tab__item",t.dataset.id=e.id,t.setAttribute("role","tab"),t.id=`tab-${e.id}`,t.setAttribute("aria-selected",`${e.id===this.activeId}`),e.disabled&&(t.disabled=!0,t.setAttribute("aria-disabled","true"),t.classList.add("is-disabled")),e.icon){const i=document.createElement("span");i.className="bim-tab__icon",i.innerHTML=e.icon,t.appendChild(i)}const n=document.createElement("span");n.className="bim-tab__title",n.textContent=this.resolveTitle(e.title),t.appendChild(n),e.id===this.activeId&&t.classList.add("is-active"),this.navElement.appendChild(t)})}renderPanels(){this.contentElement.innerHTML="",this.panelMap.clear(),this.options.tabs.forEach(e=>{const t=document.createElement("div");t.className="bim-tab__panel",t.dataset.id=e.id,t.setAttribute("role","tabpanel"),t.setAttribute("aria-labelledby",`tab-${e.id}`),e.content instanceof HTMLElement?t.appendChild(e.content):typeof e.content=="string"&&(t.innerHTML=e.content),e.id===this.activeId?t.classList.add("is-active"):t.style.display="none",this.panelMap.set(e.id,t),this.contentElement.appendChild(t)})}activateTab(e){if(this.activeId===e)return;const t=this.tabMap.get(e);if(!t||t.disabled)return;this.activeId=e,this.navElement.querySelectorAll(".bim-tab__item").forEach(i=>{const r=i.dataset.id===e;i.classList.toggle("is-active",r),i.setAttribute("aria-selected",`${r}`)}),this.panelMap.forEach((i,r)=>{const o=r===e;i.classList.toggle("is-active",o),i.style.display=o?"block":"none"}),this.options.onChange&&this.options.onChange(e,t)}setTheme(e){const t=this.element.style;t.setProperty("--bim-tab-bg",e.bgElevated),t.setProperty("--bim-tab-nav-bg",e.bgElevated),t.setProperty("--bim-tab-text",e.textPrimary),t.setProperty("--bim-tab-text-secondary",e.textSecondary),t.setProperty("--bim-tab-text-active",e.primary),t.setProperty("--bim-tab-border",e.borderDefault),t.setProperty("--bim-tab-hover-bg",e.componentBgHover),t.setProperty("--bim-tab-active-bg",e.componentBgActive),t.setProperty("--bim-tab-icon",e.iconDefault)}setLocales(){this.navElement.querySelectorAll(".bim-tab__item").forEach(t=>{const n=t.dataset.id;if(!n)return;const i=this.tabMap.get(n);if(!i)return;const r=t.querySelector(".bim-tab__title");r&&(r.textContent=this.resolveTitle(i.title))})}destroy(){this.navClickHandler&&(this.navElement.removeEventListener("click",this.navClickHandler),this.navClickHandler=null),this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.panelMap.clear(),this.tabMap.clear(),this.element.remove()}resolveTitle(e){try{return Te(e)||e}catch{return e}}}const O0={测量:'',地图:'',框选放大:'',漫游:'',目录树:'',剖切:'',剖切盒:'',全屏:'',设置:'',拾曲面剖切:'',轴向剖切:'',主视角:'',文档:'',第一人称漫游:'',反向:'',路径漫游:'',适应到模型:'',隐藏:'',重置:'',标高:'',距离:'',最小距离:'',激光边距:'',角度:'',坡度:'',体积:'',空间体积:'',close:'',check:'',warning:'',error:'',success:'',plus:'',minus:'',arrowUp:'',arrowDown:'',arrowLeft:'',arrowRight:'',search:'',refresh:'',delete:'',edit:'',save:'',expand:'',collapse:'',default:''};function At(s){const e=O0[s];return e||(console.warn(`[IconManager] Icon "${s}" not found, using default icon`),O0.default)}function zE(s){return!s||s.length===0?[]:s.map((e,t)=>{const n=(r,o)=>{const a=r.children&&r.children.length>0;return{id:r.id||`node-${t}-${o}`,label:r.name||r.label||"未命名",expanded:!1,clickAction:a?"expand":"select",children:a?r.children.map((l,c)=>n(l,c)):void 0,data:r}},i=e.children&&e.children.length>0;return{id:`model-${t}`,label:e.name||"模型",expanded:!0,clickAction:"expand",children:i?e.children.map((r,o)=>n(r,o)):void 0}})}class HE extends pi{toolbar=null;toolbarContainer=null;container;dialog=null;constructor(e){super(),this.container=e,this.init()}init(){this.toolbarContainer=document.createElement("div"),this.toolbarContainer.id="bim-construct-tree",this.container.appendChild(this.toolbarContainer),this.toolbar=new zl({container:this.toolbarContainer,showLabel:!1,direction:"column",position:"top-left",align:"vertical",expand:"up"}),this.toolbar.init(),this.toolbar.addGroup("construct-tree"),this.toolbar.addButton({id:"construct-tree-btn",groupId:"construct-tree",type:"button",label:"construct-tree",icon:At("目录树"),onClick:()=>{this.openConstructTreeDialog()}}),this.toolbar.render()}openConstructTreeDialog(){this.setVisible(!1);const e=this.registry.engine3d?.getLevelTreeData()??[],t=this.registry.engine3d?.getTypeTreeData()??[],n=this.registry.engine3d?.getMajorTreeData()??[];console.log("[ConstructTree] 构件树数据 (Level):",e),console.log("[ConstructTree] 类型树数据 (Type):",t),console.log("[ConstructTree] 专业树数据 (Major):",n);const i=f=>{const p=new FE({data:zE(f),checkable:!0,indent:0,enableSearch:!0,checkStrictly:!0,defaultExpandAll:!0,onNodeCheck:g=>{console.log("onNodeCheck",g)},onNodeSelect:g=>{console.log("onNodeSelect",g)},onNodeExpand:()=>{this.dialog?.fitWidth()}});return p.init(),p},r=i(e),o=i(t),a=i(n),l=document.createElement("div");l.className="construct-tab__panel-content",l.appendChild(r.element);const c=document.createElement("div");c.className="construct-tab__panel-content",c.appendChild(o.element);const h=document.createElement("div");h.className="construct-tab__panel-content",h.appendChild(a.element);const u=document.createElement("div");u.className="construct-tab__container",u.style.height="100%",u.style.overflow="hidden";const d=new U0({container:u,tabs:[{id:"component",title:"tab.component",content:l},{id:"type",title:"tab.type",content:c},{id:"major",title:"tab.major",content:h}],activeId:"component",onChange:()=>{this.dialog?.fitWidth()}});d.init(),this.dialog=this.registry.dialog.create({title:"constructTree.title",minWidth:320,height:420,content:u,position:{x:20,y:20},resizable:!1,onClose:()=>{d.destroy(),r.destroy(),o.destroy(),a.destroy(),this.setVisible(!0)}}),this.dialog?.fitWidth()}refresh(){this.toolbar?.render()}destroy(){this.toolbar?.destroy(),this.toolbar=null,super.destroy()}addGroup(e,t){this.toolbar?.addGroup(e,t),this.toolbar?.render()}addButton(e){this.toolbar?.addButton(e),this.toolbar?.render()}setButtonVisibility(e,t){this.toolbar?.updateButtonVisibility(e,t)}setShowLabel(e){this.toolbar?.setShowLabel(e)}setVisible(e){this.toolbarContainer&&(this.toolbarContainer.style.visibility=e?"visible":"hidden")}setBackgroundColor(e){this.toolbar?.setBackgroundColor(e)}setColors(e){this.toolbar?.setColors(e)}}class Or extends pi{dialog=null;isVisible=!1;get dialogWidth(){return 300}get dialogHeight(){return"auto"}get dialogOptions(){return{draggable:!0,resizable:!1}}onDialogClose(){}onDialogCreated(){}onBeforeDestroy(){}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=e.clientWidth,n=e.clientHeight,i=this.dialogWidth,r=typeof this.dialogHeight=="number"?this.dialogHeight:300;return{x:t-i-20,y:(n-r)/2}}show(){if(!this.registry.dialog||!this.registry.container){console.warn(`[${this.dialogId}] Dialog manager or container is not initialized`);return}this.dialog&&this.destroyDialog();const e=this.getDialogPosition(),t=this.createContent(),n=this.dialogOptions;this.dialog=this.registry.dialog.create({id:this.dialogId,title:this.dialogTitle,content:t,width:this.dialogWidth,height:this.dialogHeight,position:e,draggable:n.draggable,resizable:n.resizable,onClose:()=>{this.onDialogClose(),this.destroyDialog()}}),this.dialog.init(),this.isVisible=!0,this.onDialogCreated()}hide(){this.destroyDialog()}toggle(){this.isVisible?this.hide():this.show()}isOpen(){return this.isVisible}destroyDialog(){this.onBeforeDestroy(),this.dialog&&(this.dialog.destroy(),this.dialog=null),this.isVisible=!1}destroy(){this.destroyDialog(),super.destroy()}}const VE={distance:'',minDistance:'',angle:'',elevation:'',volume:'',laserDistance:'',slope:'',spaceVolume:''};class Vo{element;options;activeMode;isExpanded;result=null;config;draftConfig=null;view="main";static CONFIG_CACHE_KEY="bim-engine:measure:config";static DEFAULT_CONFIG={unit:"mm",precision:2};toolButtons=new Map;toggleBtn;toggleTextEl;mainValueValueEl;mainValueLabelEl;mainNumberEl;mainUnitEl;xyzBoxEl;xyzXEl;xyzYEl;xyzZEl;clearBtn;settingsBtn;mainViewEl;settingsViewEl;unitSelectEl;precisionSelectEl;saveSettingsBtn;cancelSettingsBtn;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e={}){this.options=e,this.activeMode=e.defaultMode??"distance",this.isExpanded=e.defaultExpanded??!1,this.config=this.loadConfigFromCache()??{...Vo.DEFAULT_CONFIG},this.element=this.createDom()}init(){this.unsubscribeLocale=Yt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=rt.subscribe(e=>{this.setTheme(e)}),this.setLocales(),this.setTheme(rt.getTheme()),this.applyExpandedState(),this.applyActiveModeState(),this.applyViewState(),this.renderResult(),this.options.onModeChange&&this.options.onModeChange(this.activeMode)}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-bg-elevated",e.bgElevated??"#1f2d3e"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-divider",e.divider??"#334155"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-hover",e.primaryHover??"#60a5fa"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-danger",e.danger??"#ef4444"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-text-secondary",e.textSecondary??"#94a3b8"),t.setProperty("--bim-text-tertiary",e.textTertiary??"#64748b"),t.setProperty("--bim-text-inverse",e.textInverse??"#152232"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)")}setLocales(){for(const[t,n]of this.toolButtons.entries())n.title=Te(this.getModeI18nKey(t)),n.setAttribute("aria-label",n.title);this.toggleBtn.title=this.isExpanded?Te("measure.actions.collapse"):Te("measure.actions.expand"),this.toggleBtn.setAttribute("aria-label",this.toggleBtn.title),this.toggleTextEl&&(this.toggleTextEl.textContent=this.toggleBtn.title),this.clearBtn.textContent=Te("measure.actions.clearAll"),this.settingsBtn.title=Te("measure.actions.settings"),this.settingsBtn.setAttribute("aria-label",this.settingsBtn.title),this.mainValueLabelEl.textContent=Te(this.getModeValueLabelI18nKey(this.activeMode)),this.element.querySelectorAll("[data-i18n-key]").forEach(t=>{const n=t.dataset.i18nKey;n&&(t.textContent=Te(n))}),this.saveSettingsBtn.textContent=Te("measure.settings.save"),this.cancelSettingsBtn.textContent=Te("measure.settings.cancel")}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove()}getActiveMode(){return this.activeMode}switchMode(e){this.setActiveMode(e)}setActiveMode(e){this.activeMode!==e&&(this.activeMode=e,this.applyActiveModeState(),this.mainValueLabelEl.textContent=Te(this.getModeValueLabelI18nKey(this.activeMode)),this.options.onModeChange&&this.options.onModeChange(e),this.renderResult(),this.options.onExpandedChange&&this.options.onExpandedChange(this.isExpanded))}setResult(e){this.result=e,this.renderResult()}clearAll(){this.result=null,this.renderResult(),this.options.onClearAll&&this.options.onClearAll()}openSettings(){this.enterSettingsView(),this.options.onSettings&&this.options.onSettings()}getConfig(){return{...this.config}}setConfig(e,t=!1){const n={unit:e.unit??this.config.unit,precision:e.precision??this.config.precision};this.config=n,t&&this.saveConfigToCache(n),this.renderResult(),this.view==="settings"&&this.syncSettingsFormFromConfig(n)}setExpanded(e){this.isExpanded!==e&&(this.isExpanded=e,this.applyExpandedState(),this.setLocales(),this.options.onExpandedChange&&this.options.onExpandedChange(this.isExpanded))}getExpanded(){return this.isExpanded}createDom(){const e=document.createElement("div");e.className="bim-measure-panel",this.mainViewEl=document.createElement("div"),this.mainViewEl.className="bim-measure-main";const t=document.createElement("div");t.className="bim-measure-tools";const n=document.createElement("div");n.className="bim-measure-tool-grid";const i=["distance","minDistance","angle","elevation","volume","laserDistance","slope","spaceVolume"],r=` - `;for(let g=0;g{this.setActiveMode(x)}),this.toolButtons.set(x,m),n.appendChild(m)}t.appendChild(n);const o=document.createElement("div");o.className="bim-measure-toggle",this.toggleBtn=document.createElement("button"),this.toggleBtn.type="button",this.toggleBtn.className="bim-measure-toggle-btn",this.toggleTextEl=document.createElement("span"),this.toggleTextEl.className="bim-measure-toggle-text";const a=document.createElement("span");a.className="bim-measure-toggle-icon",a.innerHTML=` + `;for(let g=0;g{this.setActiveMode(x)}),this.toolButtons.set(x,m),n.appendChild(m)}t.appendChild(n);const o=document.createElement("div");o.className="bim-measure-toggle",this.toggleBtn=document.createElement("button"),this.toggleBtn.type="button",this.toggleBtn.className="bim-measure-toggle-btn",this.toggleTextEl=document.createElement("span"),this.toggleTextEl.className="bim-measure-toggle-text";const a=document.createElement("span");a.className="bim-measure-toggle-icon",a.innerHTML=` @@ -4851,7 +4848,37 @@ ${JSON.stringify(l,null,2)} - `,this.settingsBtn.addEventListener("click",()=>{this.openSettings()}),p.appendChild(this.clearBtn),p.appendChild(this.settingsBtn),this.mainViewEl.appendChild(p),this.settingsViewEl=this.createSettingsDom(),e.appendChild(this.mainViewEl),e.appendChild(this.settingsViewEl),e}createSettingsDom(){const e=document.createElement("div");e.className="bim-measure-settings";const t=document.createElement("div");t.className="bim-measure-settings-title",t.dataset.i18nKey="measure.settings.title",e.appendChild(t);const n=document.createElement("div");n.className="bim-measure-settings-row";const i=document.createElement("div");i.className="label",i.dataset.i18nKey="measure.settings.unit",this.unitSelectEl=document.createElement("select"),this.unitSelectEl.className="bim-measure-settings-select",this.unitSelectEl.appendChild(this.makeOption("m")),this.unitSelectEl.appendChild(this.makeOption("cm")),this.unitSelectEl.appendChild(this.makeOption("mm")),this.unitSelectEl.appendChild(this.makeOption("km")),n.appendChild(i),n.appendChild(this.unitSelectEl),e.appendChild(n);const r=document.createElement("div");r.className="bim-measure-settings-hint",r.dataset.i18nKey="measure.settings.hint",e.appendChild(r);const o=document.createElement("div");o.className="bim-measure-settings-row";const a=document.createElement("div");a.className="label",a.dataset.i18nKey="measure.settings.precision",this.precisionSelectEl=document.createElement("select"),this.precisionSelectEl.className="bim-measure-settings-select",this.precisionSelectEl.appendChild(this.makePrecisionOption(0)),this.precisionSelectEl.appendChild(this.makePrecisionOption(1)),this.precisionSelectEl.appendChild(this.makePrecisionOption(2)),this.precisionSelectEl.appendChild(this.makePrecisionOption(3)),o.appendChild(a),o.appendChild(this.precisionSelectEl),e.appendChild(o);const l=document.createElement("div");return l.className="bim-measure-settings-actions",this.saveSettingsBtn=document.createElement("button"),this.saveSettingsBtn.type="button",this.saveSettingsBtn.className="bim-measure-settings-save",this.saveSettingsBtn.addEventListener("click",()=>{this.saveSettings()}),this.cancelSettingsBtn=document.createElement("button"),this.cancelSettingsBtn.type="button",this.cancelSettingsBtn.className="bim-measure-settings-cancel",this.cancelSettingsBtn.addEventListener("click",()=>{this.cancelSettings()}),l.appendChild(this.saveSettingsBtn),l.appendChild(this.cancelSettingsBtn),e.appendChild(l),this.syncSettingsFormFromConfig(this.config),e}makeOption(e){const t=document.createElement("option");return t.value=e,t.textContent=e,t}makePrecisionOption(e){const t=document.createElement("option");return t.value=String(e),t.textContent=e===0?"0":`0.${"0".repeat(e)}`,t}enterSettingsView(){this.draftConfig={...this.config},this.view="settings",this.syncSettingsFormFromConfig(this.config),this.applyViewState()}saveSettings(){const e=this.unitSelectEl.value||this.config.unit,t=Number(this.precisionSelectEl.value),n={unit:e,precision:this.isValidPrecision(t)?t:this.config.precision};this.config=n,this.saveConfigToCache(n),this.draftConfig=null,this.view="main",this.applyViewState(),this.renderResult(),this.options.onExpandedChange&&this.options.onExpandedChange(this.isExpanded)}cancelSettings(){this.draftConfig&&(this.config={...this.draftConfig}),this.draftConfig=null,this.view="main",this.applyViewState(),this.renderResult(),this.options.onExpandedChange&&this.options.onExpandedChange(this.isExpanded)}syncSettingsFormFromConfig(e){this.unitSelectEl.value=e.unit,this.precisionSelectEl.value=String(e.precision)}applyViewState(){this.view==="settings"?(this.mainViewEl.style.display="none",this.settingsViewEl.style.display="block"):(this.mainViewEl.style.display="block",this.settingsViewEl.style.display="none")}loadConfigFromCache(){try{const e=localStorage.getItem(Vo.CONFIG_CACHE_KEY);if(!e)return null;const t=JSON.parse(e);if(!t||typeof t!="object")return null;const n=t.unit,i=t.precision;return!this.isValidUnit(n)||!this.isValidPrecision(i)?null:{unit:n,precision:i}}catch{return null}}saveConfigToCache(e){try{localStorage.setItem(Vo.CONFIG_CACHE_KEY,JSON.stringify(e))}catch{}}isValidUnit(e){return e==="m"||e==="cm"||e==="mm"||e==="km"}isValidPrecision(e){return e===0||e===1||e===2||e===3}applyExpandedState(){let e=0;for(const t of this.toolButtons.values())e>=4?t.style.display=this.isExpanded?"":"none":t.style.display="",e++;this.isExpanded?this.toggleBtn.classList.add("is-expanded"):this.toggleBtn.classList.remove("is-expanded")}applyActiveModeState(){for(const[e,t]of this.toolButtons.entries())e===this.activeMode?t.classList.add("is-active"):t.classList.remove("is-active")}renderResult(){if(this.activeMode==="laserDistance")this.mainValueLabelEl.style.display="none",this.mainNumberEl.textContent=Ce(this.getModeI18nKey("laserDistance")),this.mainUnitEl.textContent="",this.mainNumberEl.classList.add("is-laser-text");else{this.mainValueLabelEl.style.display="",this.mainValueLabelEl.textContent=Ce(this.getModeValueLabelI18nKey(this.activeMode));const e=this.formatMainValueParts(this.activeMode,this.result);this.mainNumberEl.textContent=e.numberText,this.mainUnitEl.textContent=e.unitText,this.mainNumberEl.classList.remove("is-laser-text")}if(this.activeMode==="distance"){this.xyzBoxEl.style.display="";const e=this.result?.xyz;if(!e){this.xyzXEl.textContent="--",this.xyzYEl.textContent="--",this.xyzZEl.textContent="--";return}this.xyzXEl.textContent=this.formatNumberWithPrecision(e.x,this.config.precision),this.xyzYEl.textContent=this.formatNumberWithPrecision(e.y,this.config.precision),this.xyzZEl.textContent=this.formatNumberWithPrecision(e.z,this.config.precision);return}this.xyzBoxEl.style.display="none"}getModeI18nKey(e){return`measure.modes.${e}`}getModeValueLabelI18nKey(e){return`measure.labels.value.${e}`}formatNumberWithPrecision(e,t){return e.toFixed(t)}convertMmToUnit(e,t){switch(t){case"mm":return e;case"cm":return e/10;case"m":return e/1e3;case"km":return e/1e6;default:return e}}getUnitI18nKey(e){return`measure.units.${e}`}convertMm3ToUnit3(e,t){switch(t){case"mm":return e;case"cm":return e/1e3;case"m":return e/1e9;case"km":return e/1e18;default:return e}}formatMainValueParts(e,t){if(e==="laserDistance")return{numberText:Ce(this.getModeI18nKey("laserDistance")),unitText:""};if(!t)return this.getEmptyValuePartsByMode(e);switch(e){case"distance":return this.formatLengthParts(t.distanceMm);case"minDistance":return this.formatLengthParts(t.minDistanceMm);case"angle":return this.formatFixedUnitParts(t.angleDeg,Ce("measure.units.deg"));case"elevation":return this.formatFixedUnitParts(t.elevationMm===void 0?void 0:t.elevationMm/1e3,Ce("measure.units.m"));case"volume":return this.formatVolumeParts(t.volumeM3);case"slope":return this.formatFixedUnitParts(t.slopePercent,Ce("measure.units.percent"));case"spaceVolume":return this.formatVolumeParts(t.spaceVolumeM3);default:return{numberText:"--",unitText:""}}}getEmptyValuePartsByMode(e){switch(e){case"distance":case"minDistance":return{numberText:"--",unitText:Ce(this.getUnitI18nKey(this.config.unit))};case"angle":return{numberText:"--",unitText:Ce("measure.units.deg")};case"elevation":return{numberText:"--",unitText:Ce("measure.units.m")};case"volume":case"spaceVolume":return{numberText:"--",unitText:`${this.config.unit}³`};case"slope":return{numberText:"--",unitText:Ce("measure.units.percent")};default:return{numberText:"--",unitText:""}}}formatFixedUnitParts(e,t){return e==null||Number.isNaN(e)?{numberText:"--",unitText:t}:{numberText:this.formatNumberWithPrecision(e,this.config.precision),unitText:t}}formatLengthParts(e){const t=Ce(this.getUnitI18nKey(this.config.unit));if(e==null||Number.isNaN(e))return{numberText:"--",unitText:t};const n=this.convertMmToUnit(e,this.config.unit);return{numberText:this.formatNumberWithPrecision(n,this.config.precision),unitText:t}}formatVolumeParts(e){const t=`${this.config.unit}³`;if(e==null||Number.isNaN(e))return{numberText:"--",unitText:t};const n=this.convertMm3ToUnit3(e,this.config.unit);return{numberText:this.formatNumberWithPrecision(n,this.config.precision),unitText:t}}}class KE extends Or{panel=null;config=null;get dialogId(){return"measure-dialog"}get dialogTitle(){return"measure.dialogTitle"}get dialogWidth(){return 250}createContent(){this.panel=new Vo({defaultMode:"distance",defaultExpanded:!1,onModeChange:t=>{console.log("[MeasureDialogManager] 当前测量方式已切换:",t),this.registry.engine3d?.activateMeasure(t)},onClearAll:()=>{console.log("[MeasureDialogManager] 删除全部"),this.registry.engine3d?.clearAllMeasures()},onSettings:()=>{console.log("[MeasureDialogManager] 打开设置")},onExpandedChange:()=>{this.dialog?.fitHeight(!1)}}),this.panel.init(),this.config=this.panel.getConfig();const e=document.createElement("div");return e.style.padding="12px",e.appendChild(this.panel.element),e}onDialogCreated(){this.dialog?.fitHeight(!1)}onDialogClose(){this.registry.toolbar?.setBtnActive("measure",!1)}onBeforeDestroy(){this.registry.engine3d&&this.registry.engine3d.deactivateMeasure(),this.panel&&(this.panel.destroy(),this.panel=null)}getActiveMode(){return this.panel?this.panel.getActiveMode():null}switchMode(e){this.panel&&this.panel.switchMode(e)}setMeasureResult(e){this.panel&&this.panel.setResult(e)}getConfig(){return this.panel&&(this.config=this.panel.getConfig()),this.config?{...this.config}:null}setConfig(e,t=!0){if(this.panel){this.panel.setConfig(e,t),this.config=this.panel.getConfig(),this.dialog?.fitHeight(!1);return}const n=this.config,i={unit:e.unit??n?.unit??"mm",precision:e.precision??n?.precision??2};this.config=i}clearAll(){this.panel&&this.panel.clearAll()}openSettings(){this.panel&&this.panel.openSettings()}}class $E{element;options;hideBtn;reverseBtn;resetBtn;hideLabelEl;reverseLabelEl;resetLabelEl;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e={}){this.options=e,this.element=this.createDom()}init(){this.unsubscribeLocale=Yt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=rt.subscribe(e=>{this.setTheme(e)}),this.setLocales(),this.setTheme(rt.getTheme())}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)")}setLocales(){this.hideLabelEl.textContent=Ce("sectionPlane.actions.hide"),this.reverseLabelEl.textContent=Ce("sectionPlane.actions.reverse"),this.resetLabelEl.textContent=Ce("sectionPlane.actions.reset"),this.hideBtn.title=Ce("sectionPlane.actions.hide"),this.reverseBtn.title=Ce("sectionPlane.actions.reverse"),this.resetBtn.title=Ce("sectionPlane.actions.reset")}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove()}createDom(){const e=document.createElement("div");return e.className="section-plane-panel",this.hideBtn=this.createButton("hide",At("隐藏"),()=>{this.options.onHide&&this.options.onHide()}),this.reverseBtn=this.createButton("reverse",At("反向"),()=>{this.options.onReverse&&this.options.onReverse()}),this.resetBtn=this.createButton("reset",At("重置"),()=>{this.options.onReset&&this.options.onReset()}),e.appendChild(this.hideBtn),e.appendChild(this.reverseBtn),e.appendChild(this.resetBtn),e}createButton(e,t,n){const i=document.createElement("button");i.type="button",i.className="section-plane-btn";const r=document.createElement("div");r.className="section-plane-btn-icon",r.innerHTML=t,i.appendChild(r);const o=document.createElement("div");return o.className="section-plane-btn-label",i.appendChild(o),e==="hide"?this.hideLabelEl=o:e==="reverse"?this.reverseLabelEl=o:this.resetLabelEl=o,i.addEventListener("click",n),i}}class JE extends Or{panel=null;get dialogId(){return"section-plane-dialog"}get dialogTitle(){return"sectionPlane.dialogTitle"}get dialogWidth(){return 240}get dialogHeight(){return 120}init(){}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=20,n=50,i=e.clientWidth,r=e.clientHeight;return{x:i-this.dialogWidth-t,y:r-this.dialogHeight-n}}createContent(){return this.panel=new $E({onHide:()=>{console.log("[SectionPlaneDialogManager] 隐藏")},onReverse:()=>{console.log("[SectionPlaneDialogManager] 反向")},onReset:()=>{console.log("[SectionPlaneDialogManager] 重置")}}),this.panel.init(),this.panel.element}onDialogClose(){this.registry.toolbar?.setBtnActive("section-plane",!1)}onBeforeDestroy(){this.panel&&(this.panel.destroy(),this.panel=null)}}class QE{element;options;isHidden=!1;activeAxis="x";hideBtn;reverseBtn;hideLabelEl;reverseLabelEl;axisXBtn;axisYBtn;axisZBtn;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e={}){this.options=e,this.isHidden=e.defaultHidden??!1,this.activeAxis=e.defaultAxis??"x",this.element=this.createDom()}init(){this.unsubscribeLocale=Yt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=rt.subscribe(e=>{this.setTheme(e)}),this.setLocales(),this.setTheme(rt.getTheme()),this.updateHideButtonState(),this.updateAxisButtonsState()}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-divider",e.divider??"#334155"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)")}setLocales(){this.hideLabelEl.textContent=Ce("sectionAxis.actions.hide"),this.reverseLabelEl.textContent=Ce("sectionAxis.actions.reverse"),this.hideBtn.title=Ce("sectionAxis.actions.hide"),this.reverseBtn.title=Ce("sectionAxis.actions.reverse"),this.axisXBtn.title=Ce("sectionAxis.actions.axisX"),this.axisYBtn.title=Ce("sectionAxis.actions.axisY"),this.axisZBtn.title=Ce("sectionAxis.actions.axisZ")}setHiddenState(e){this.isHidden=e,this.updateHideButtonState()}getHiddenState(){return this.isHidden}setActiveAxis(e){this.activeAxis=e,this.updateAxisButtonsState()}getActiveAxis(){return this.activeAxis}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove()}createDom(){const e=document.createElement("div");e.className="section-axis-panel";const t=document.createElement("div");t.className="section-axis-row-1",this.hideBtn=this.createButton("hide",At("隐藏"),()=>this.handleHideToggle()),this.reverseBtn=this.createButton("reverse",At("反向"),()=>this.handleReverse()),t.appendChild(this.hideBtn),t.appendChild(this.reverseBtn);const n=document.createElement("div");return n.className="section-axis-row-2",this.axisXBtn=this.createAxisButton("axisX","X",()=>this.handleAxisChange("x")),this.axisYBtn=this.createAxisButton("axisY","Y",()=>this.handleAxisChange("y")),this.axisZBtn=this.createAxisButton("axisZ","Z",()=>this.handleAxisChange("z")),n.appendChild(this.axisXBtn),n.appendChild(this.axisYBtn),n.appendChild(this.axisZBtn),e.appendChild(t),e.appendChild(n),e}createButton(e,t,n){const i=document.createElement("button");i.type="button",i.className="section-axis-btn";const r=document.createElement("div");r.className="section-axis-btn-icon",r.innerHTML=t,i.appendChild(r);const o=document.createElement("div");return o.className="section-axis-btn-label",i.appendChild(o),e==="hide"?this.hideLabelEl=o:e==="reverse"&&(this.reverseLabelEl=o),i.addEventListener("click",n),i}createAxisButton(e,t,n){const i=document.createElement("button");i.type="button",i.className="section-axis-btn section-axis-btn-text";const r=document.createElement("div");return r.className="section-axis-btn-label",r.textContent=t,i.appendChild(r),i.addEventListener("click",n),i}handleHideToggle(){this.isHidden=!this.isHidden,this.updateHideButtonState(),this.options.onHideToggle&&this.options.onHideToggle(this.isHidden)}handleReverse(){this.options.onReverse&&this.options.onReverse()}handleAxisChange(e){this.activeAxis!==e&&(this.activeAxis=e,this.updateAxisButtonsState(),this.options.onAxisChange&&this.options.onAxisChange(e))}updateHideButtonState(){this.isHidden?this.hideBtn.classList.add("active"):this.hideBtn.classList.remove("active")}updateAxisButtonsState(){this.axisXBtn.classList.toggle("active",this.activeAxis==="x"),this.axisYBtn.classList.toggle("active",this.activeAxis==="y"),this.axisZBtn.classList.toggle("active",this.activeAxis==="z")}}class eT extends Or{panel=null;get dialogId(){return"section-axis-dialog"}get dialogTitle(){return"sectionAxis.dialogTitle"}get dialogWidth(){return 240}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=e.clientWidth,n=e.clientHeight;return{x:t-this.dialogWidth-20,y:n-50-200}}createContent(){return this.panel=new QE({defaultAxis:"x",defaultHidden:!1,onHideToggle:e=>{console.log("[SectionAxisDialogManager] 隐藏切换(暂不支持):",e)},onReverse:()=>{console.log("[SectionAxisDialogManager] 反向剖切(暂不支持)")},onAxisChange:e=>{console.log("[SectionAxisDialogManager] 切换轴向:",e),this.registry.engine3d?.activateSectionAxis(e)}}),this.panel.init(),this.panel.element}onDialogCreated(){if(this.dialog?.fitHeight(!1),!this.registry.engine3d){console.error("[SectionAxisDialogManager] Engine not initialized. Call initEngine() first.");return}this.registry.engine3d.activateSectionAxis("x")}onDialogClose(){this.registry.toolbar?.setBtnActive("section-axis",!1)}onBeforeDestroy(){this.registry.engine3d?.deactivateSectionAxis(),this.panel&&(this.panel.destroy(),this.panel=null)}getHiddenState(){return this.panel?.getHiddenState()??!1}setHiddenState(e){this.panel?.setHiddenState(e)}getActiveAxis(){return this.panel?.getActiveAxis()??"x"}setActiveAxis(e){this.panel?.setActiveAxis(e)}}const H0={x:{min:0,max:100},y:{min:0,max:100},z:{min:0,max:100}};class tT{element;options;isHidden=!1;isReversed=!1;range;hideBtn;reverseBtn;fitBtn;resetBtn;hideLabelEl;reverseLabelEl;fitLabelEl;resetLabelEl;xLabelEl;yLabelEl;zLabelEl;unsubscribeLocale=null;unsubscribeTheme=null;xSlider;ySlider;zSlider;xMinHandle;xMaxHandle;yMinHandle;yMaxHandle;zMinHandle;zMaxHandle;dragState={isDragging:!1,axis:null,handleType:null,pointerId:null};constructor(e={}){this.options=e,this.isHidden=e.defaultHidden??!1,this.isReversed=e.defaultReversed??!1,this.range=JSON.parse(JSON.stringify(e.defaultRange??H0))}init(){this.element=this.createPanel(),this.unsubscribeLocale=Yt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=rt.subscribe(e=>this.setTheme(e)),this.setLocales(),this.setTheme(rt.getTheme()),this.updateButtonStates(),this.updateAllSlidersUI(),this.setupDragListeners()}setHiddenState(e){this.isHidden=e,this.updateButtonStates()}getHiddenState(){return this.isHidden}setReversedState(e){this.isReversed=e,this.updateButtonStates()}getReversedState(){return this.isReversed}setRange(e){e.x&&(this.range.x={...this.range.x,...e.x}),e.y&&(this.range.y={...this.range.y,...e.y}),e.z&&(this.range.z={...this.range.z,...e.z}),this.updateAllSlidersUI()}getRange(){return JSON.parse(JSON.stringify(this.range))}reset(){this.isHidden=this.options.defaultHidden??!1,this.isReversed=this.options.defaultReversed??!1,this.range=JSON.parse(JSON.stringify(this.options.defaultRange??H0)),this.updateButtonStates(),this.updateAllSlidersUI(),this.options.onReset?.(),this.options.onRangeChange?.(this.range)}createPanel(){const e=document.createElement("div");e.className="section-box-panel";const t=document.createElement("div");t.className="section-box-row-buttons",this.hideBtn=this.createButton("hide",Ce("sectionBox.actions.hide"),()=>{this.isHidden=!this.isHidden,this.updateButtonStates(),this.options.onHideToggle?.(this.isHidden)},"hide"),this.reverseBtn=this.createButton("reverse",Ce("sectionBox.actions.reverse"),()=>{this.isReversed=!this.isReversed,this.updateButtonStates(),this.options.onReverseToggle?.(this.isReversed)},"reverse"),this.fitBtn=this.createButton("fit",Ce("sectionBox.actions.fitToModel"),()=>{this.options.onFitToModel?.()},"fit"),this.resetBtn=this.createButton("reset",Ce("sectionBox.actions.reset"),()=>this.reset(),"reset"),[this.hideBtn,this.reverseBtn,this.fitBtn,this.resetBtn].forEach(i=>t.appendChild(i));const n=document.createElement("div");return n.className="section-box-sliders",n.addEventListener("pointerdown",i=>i.stopPropagation()),this.xSlider=this.createSlider("x",Ce("sectionBox.axes.x")),this.ySlider=this.createSlider("y",Ce("sectionBox.axes.y")),this.zSlider=this.createSlider("z",Ce("sectionBox.axes.z")),[this.xSlider,this.ySlider,this.zSlider].forEach(i=>n.appendChild(i)),e.appendChild(t),e.appendChild(n),e}createButton(e,t,n,i){const r=document.createElement("button");r.className="section-box-btn",r.title=t;const o={hide:"隐藏",reverse:"反向",fit:"适应到模型",reset:"重置"},a=document.createElement("div");a.className="section-box-btn-icon",a.innerHTML=At(o[e]||e);const l=document.createElement("div");return l.className="section-box-btn-label",l.textContent=t,i==="hide"?this.hideLabelEl=l:i==="reverse"?this.reverseLabelEl=l:i==="fit"?this.fitLabelEl=l:i==="reset"&&(this.resetLabelEl=l),r.appendChild(a),r.appendChild(l),r.addEventListener("click",n),r}createSlider(e,t){const n=document.createElement("div");n.className="section-box-slider";const i=document.createElement("div");i.className="section-box-slider-label",i.textContent=t,e==="x"?this.xLabelEl=i:e==="y"?this.yLabelEl=i:this.zLabelEl=i;const r=document.createElement("div");r.className="section-box-slider-track";const o=document.createElement("div");o.className="section-box-slider-range";const a=document.createElement("div");a.className="section-box-slider-handle",a.setAttribute("data-axis",e),a.setAttribute("data-handle","min");const l=document.createElement("div");return l.className="section-box-slider-handle",l.setAttribute("data-axis",e),l.setAttribute("data-handle","max"),r.append(o,a,l),n.append(i,r),e==="x"?(this.xMinHandle=a,this.xMaxHandle=l):e==="y"?(this.yMinHandle=a,this.yMaxHandle=l):(this.zMinHandle=a,this.zMaxHandle=l),n}setupDragListeners(){[this.xMinHandle,this.xMaxHandle,this.yMinHandle,this.yMaxHandle,this.zMinHandle,this.zMaxHandle].forEach(t=>{t.addEventListener("pointerdown",i=>{i.preventDefault(),i.stopPropagation(),t.setPointerCapture(i.pointerId),this.dragState={isDragging:!0,axis:t.getAttribute("data-axis"),handleType:t.getAttribute("data-handle"),pointerId:i.pointerId},t.classList.add("dragging"),t.closest(".section-box-slider").style.zIndex="100"}),t.addEventListener("pointermove",i=>{this.dragState.isDragging&&this.dragState.pointerId===i.pointerId&&this.onDragging(i)});const n=i=>{this.dragState.isDragging&&this.dragState.pointerId===i.pointerId&&(t.releasePointerCapture(i.pointerId),t.closest(".section-box-slider").style.zIndex="",t.classList.remove("dragging"),this.dragState.isDragging=!1,this.dragState.pointerId=null)};t.addEventListener("pointerup",n),t.addEventListener("pointercancel",n)})}onDragging(e){const{axis:t,handleType:n}=this.dragState;if(!t||!n)return;const o=(t==="x"?this.xSlider:t==="y"?this.ySlider:this.zSlider).querySelector(".section-box-slider-track").getBoundingClientRect();let a=(e.clientX-o.left)/o.width*100;a=Math.max(0,Math.min(100,a));const l=this.range[t];n==="min"?l.min=Math.min(a,l.max):l.max=Math.max(a,l.min),this.updateSliderUI(t),this.options.onRangeChange?.(this.range)}updateSliderUI(e){const t=this.range[e],n=e==="x"?this.xMinHandle:e==="y"?this.yMinHandle:this.zMinHandle,i=e==="x"?this.xMaxHandle:e==="y"?this.yMaxHandle:this.zMaxHandle,o=(e==="x"?this.xSlider:e==="y"?this.ySlider:this.zSlider).querySelector(".section-box-slider-range");n.style.left=`${t.min}%`,i.style.left=`${t.max}%`,o.style.left=`${t.min}%`,o.style.width=`${t.max-t.min}%`,n.setAttribute("data-value",Math.round(t.min).toString()),i.setAttribute("data-value",Math.round(t.max).toString())}updateAllSlidersUI(){["x","y","z"].forEach(e=>this.updateSliderUI(e))}updateButtonStates(){this.hideBtn&&this.hideBtn.classList.toggle("active",this.isHidden),this.reverseBtn&&this.reverseBtn.classList.toggle("active",this.isReversed)}setLocales(){this.hideLabelEl&&(this.hideLabelEl.textContent=Ce("sectionBox.actions.hide"),this.reverseLabelEl.textContent=Ce("sectionBox.actions.reverse"),this.fitLabelEl.textContent=Ce("sectionBox.actions.fitToModel"),this.resetLabelEl.textContent=Ce("sectionBox.actions.reset"),this.xLabelEl.textContent=Ce("sectionBox.axes.x"),this.yLabelEl.textContent=Ce("sectionBox.axes.y"),this.zLabelEl.textContent=Ce("sectionBox.axes.z"),this.hideBtn.title=Ce("sectionBox.actions.hide"),this.reverseBtn.title=Ce("sectionBox.actions.reverse"),this.fitBtn.title=Ce("sectionBox.actions.fitToModel"),this.resetBtn.title=Ce("sectionBox.actions.reset"))}setTheme(e){if(!this.element)return;const t=this.element.style;t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-bg-elevated",e.bgElevated??"#1f2d3e"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-divider",e.divider??"#334155"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)")}destroy(){this.unsubscribeLocale?.(),this.unsubscribeTheme?.(),this.element&&this.element.parentElement&&this.element.parentElement.removeChild(this.element)}}class nT extends Or{panel=null;get dialogId(){return"section-box-dialog"}get dialogTitle(){return"sectionBox.dialogTitle"}get dialogWidth(){return 280}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=e.clientWidth,n=e.clientHeight;return{x:t-this.dialogWidth-20,y:n-50-300}}createContent(){return this.panel=new tT({defaultHidden:!1,defaultReversed:!1,onHideToggle:e=>{console.log("[SectionBoxDialogManager] 隐藏切换(底层暂不支持):",e)},onReverseToggle:e=>{console.log("[SectionBoxDialogManager] 反向切换(底层暂不支持):",e)},onFitToModel:()=>{this.registry.engine3d?.fitSectionBoxToModel()},onReset:()=>{this.registry.engine3d?.resetSectionBox()},onRangeChange:e=>{this.registry.engine3d?.setSectionBoxRange(e)}}),this.panel.init(),this.panel.element}onDialogCreated(){this.registry.engine3d?.activateSectionBox(),this.dialog?.fitHeight(!1)}onDialogClose(){this.registry.toolbar?.setBtnActive("section-box",!1)}onBeforeDestroy(){this.registry.engine3d?.deactivateSectionBox(),this.panel&&(this.panel.destroy(),this.panel=null)}getHiddenState(){return this.panel?.getHiddenState()??!1}setHiddenState(e){this.panel?.setHiddenState(e)}getReversedState(){return this.panel?.getReversedState()??!1}setReversedState(e){this.panel?.setReversedState(e)}getRange(){return this.panel?.getRange()??null}setRange(e){this.panel?.setRange(e)}}class iT{element;options;state={mode:"none",isPlanViewActive:!1,speed:1,gravity:!1,collision:!1,characterModel:"construction-worker",walkMode:"walk"};planViewBtn;pathModeBtn;walkModeBtn;settingsContainer;speedControl;speedDecreaseBtn;speedIncreaseBtn;speedDisplay;gravityCheckbox;gravityLabel;collisionCheckbox;collisionLabel;characterModelSelect;characterModelLabel;walkModeSelect;walkModeLabel;exitBtn;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e={}){this.options=e,this.state.speed=e.defaultSpeed??1,this.state.gravity=e.defaultGravity??!1,this.state.collision=e.defaultCollision??!1,this.state.characterModel=e.defaultCharacterModel??"construction-worker",this.state.walkMode=e.defaultWalkMode??"walk"}init(){this.element=this.createPanel(),this.updateSettingsView(),this.unsubscribeLocale=Yt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=rt.subscribe(e=>this.setTheme(e)),this.setLocales(),this.setTheme(rt.getTheme())}setPlanViewActive(e){this.state.isPlanViewActive=e,this.updateButtonStates()}setPathModeActive(e){if(!e&&this.state.mode!=="path")return;const t=e?"path":"none";this.setMode(t)}getState(){return{...this.state}}createPanel(){const e=document.createElement("div");e.className="walk-control-panel";const t=this.createLeftButtons(),n=document.createElement("div");n.className="walk-divider",this.settingsContainer=this.createSettingsContainer();const i=document.createElement("div");i.className="walk-divider";const r=this.createExitButton();return e.appendChild(t),e.appendChild(n),e.appendChild(this.settingsContainer),e.appendChild(i),e.appendChild(r),e}createLeftButtons(){const e=document.createElement("div");return e.className="walk-control-left",this.planViewBtn=this.createIconButton("plan-view",()=>{this.state.isPlanViewActive=!this.state.isPlanViewActive,this.updateButtonStates(),this.options.onPlanViewToggle?.(this.state.isPlanViewActive)}),this.pathModeBtn=this.createIconButton("path",()=>{const t=this.state.mode==="path"?"none":"path";this.setMode(t),this.options.onPathModeToggle?.(t==="path")}),this.walkModeBtn=this.createIconButton("walk",()=>{const t=this.state.mode==="walk"?"none":"walk";this.setMode(t),this.options.onWalkModeToggle?.(t==="walk")}),e.appendChild(this.planViewBtn),e.appendChild(this.pathModeBtn),e.appendChild(this.walkModeBtn),e}createSettingsContainer(){const e=document.createElement("div");e.className="walk-control-settings",this.speedControl=this.createSpeedControl();const t=document.createElement("label");t.className="walk-checkbox-wrapper walk-checkbox-gravity",this.gravityCheckbox=document.createElement("input"),this.gravityCheckbox.type="checkbox",this.gravityCheckbox.className="walk-checkbox",this.gravityCheckbox.checked=this.state.gravity,this.gravityCheckbox.addEventListener("change",()=>{this.state.gravity=this.gravityCheckbox.checked,this.options.onGravityToggle?.(this.state.gravity)}),this.gravityLabel=document.createElement("span"),this.gravityLabel.className="walk-checkbox-label",t.appendChild(this.gravityCheckbox),t.appendChild(this.gravityLabel);const n=document.createElement("label");n.className="walk-checkbox-wrapper walk-checkbox-collision",this.collisionCheckbox=document.createElement("input"),this.collisionCheckbox.type="checkbox",this.collisionCheckbox.className="walk-checkbox",this.collisionCheckbox.checked=this.state.collision,this.collisionCheckbox.addEventListener("change",()=>{this.state.collision=this.collisionCheckbox.checked,this.options.onCollisionToggle?.(this.state.collision)}),this.collisionLabel=document.createElement("span"),this.collisionLabel.className="walk-checkbox-label",n.appendChild(this.collisionCheckbox),n.appendChild(this.collisionLabel);const i=document.createElement("div");i.className="walk-select-wrapper walk-select-wrapper-character-model",this.characterModelLabel=document.createElement("label"),this.characterModelLabel.className="walk-select-label",this.characterModelSelect=document.createElement("select"),this.characterModelSelect.className="walk-select walk-select-character-model",this.characterModelSelect.addEventListener("change",()=>{this.state.characterModel=this.characterModelSelect.value,this.options.onCharacterModelChange?.(this.state.characterModel)}),i.appendChild(this.characterModelLabel),i.appendChild(this.characterModelSelect);const r=document.createElement("div");return r.className="walk-select-wrapper walk-select-wrapper-walk-mode",this.walkModeLabel=document.createElement("label"),this.walkModeLabel.className="walk-select-label",this.walkModeSelect=document.createElement("select"),this.walkModeSelect.className="walk-select walk-select-walk-mode",this.walkModeSelect.addEventListener("change",()=>{this.state.walkMode=this.walkModeSelect.value,this.options.onWalkModeChange?.(this.state.walkMode)}),r.appendChild(this.walkModeLabel),r.appendChild(this.walkModeSelect),e.appendChild(this.speedControl),e.appendChild(i),e.appendChild(r),e.appendChild(t),e.appendChild(n),e}createSpeedControl(){const e=document.createElement("div");e.className="walk-speed-control";const t=document.createElement("label");t.className="walk-speed-label",t.textContent=Ce("walkControl.speed");const n=document.createElement("div");return n.className="walk-speed-group",this.speedDecreaseBtn=document.createElement("button"),this.speedDecreaseBtn.className="walk-speed-btn",this.speedDecreaseBtn.textContent="-",this.speedDecreaseBtn.addEventListener("click",()=>{this.state.speed>1&&(this.state.speed--,this.updateSpeedDisplay(),this.options.onSpeedChange?.(this.state.speed))}),this.speedDisplay=document.createElement("div"),this.speedDisplay.className="walk-speed-display",this.speedDisplay.textContent=`${this.state.speed}X`,this.speedIncreaseBtn=document.createElement("button"),this.speedIncreaseBtn.className="walk-speed-btn",this.speedIncreaseBtn.textContent="+",this.speedIncreaseBtn.addEventListener("click",()=>{this.state.speed<10&&(this.state.speed++,this.updateSpeedDisplay(),this.options.onSpeedChange?.(this.state.speed))}),n.appendChild(this.speedDecreaseBtn),n.appendChild(this.speedDisplay),n.appendChild(this.speedIncreaseBtn),e.appendChild(t),e.appendChild(n),e}createIconButton(e,t){const n=document.createElement("button");return n.className=`walk-icon-btn walk-icon-btn-${e}`,n.innerHTML=this.getIconSVG(e),n.addEventListener("click",t),n}createExitButton(){const e=document.createElement("button");return e.className="walk-exit-btn",e.addEventListener("click",()=>{this.options.onExit?.()}),this.exitBtn=e,e}setMode(e){const t=this.state.mode;t==="walk"&&e!=="walk"&&this.options.onWalkModeToggle?.(!1),t==="path"&&e!=="path"&&this.options.onPathModeToggle?.(!1),this.state.mode=e,e==="path"?(this.state.gravity=!1,this.state.collision=!1,this.gravityCheckbox.checked=!1,this.gravityCheckbox.disabled=!0,this.collisionCheckbox.checked=!1,this.collisionCheckbox.disabled=!0):(this.gravityCheckbox.disabled=!1,this.collisionCheckbox.disabled=!1),this.updateButtonStates(),this.updateSettingsView(),this.updateSpeedButtonStates()}updateButtonStates(){this.planViewBtn.classList.toggle("active",this.state.isPlanViewActive),this.pathModeBtn.classList.toggle("active",this.state.mode==="path"),this.walkModeBtn.classList.toggle("active",this.state.mode==="walk")}updateSettingsView(){const e=this.speedControl,t=this.gravityCheckbox.parentElement,n=this.collisionCheckbox.parentElement,i=this.characterModelSelect.parentElement,r=this.walkModeSelect.parentElement;this.state.mode==="walk"?(e.style.display="none",t.style.display="flex",n.style.display="flex",i.style.display="flex",r.style.display="flex"):(e.style.display="flex",t.style.display="flex",n.style.display="flex",i.style.display="none",r.style.display="none")}updateSpeedDisplay(){this.speedDisplay.textContent=`${this.state.speed}X`,this.updateSpeedButtonStates()}updateSpeedButtonStates(){this.speedDecreaseBtn.disabled=this.state.speed<=1,this.speedIncreaseBtn.disabled=this.state.speed>=10}getIconSVG(e){return{"plan-view":At("地图"),path:At("路径漫游"),walk:At("第一人称漫游")}[e]||""}setLocales(){const e=this.speedControl.querySelector(".walk-speed-label");e&&(e.textContent=Ce("walkControl.speed")),this.gravityLabel.textContent=Ce("walkControl.gravity"),this.collisionLabel.textContent=Ce("walkControl.collision"),this.characterModelLabel.textContent=Ce("walkControl.characterModel.label"),this.characterModelSelect.innerHTML="";const t=document.createElement("option");t.value="construction-worker",t.textContent=Ce("walkControl.characterModel.constructionWorker"),t.selected=this.state.characterModel==="construction-worker",this.characterModelSelect.appendChild(t);const n=document.createElement("option");n.value="office-male",n.textContent=Ce("walkControl.characterModel.officeMale"),n.selected=this.state.characterModel==="office-male",this.characterModelSelect.appendChild(n),this.walkModeLabel.textContent=Ce("walkControl.walkMode.label"),this.walkModeSelect.innerHTML="";const i=document.createElement("option");i.value="walk",i.textContent=Ce("walkControl.walkMode.walk"),i.selected=this.state.walkMode==="walk",this.walkModeSelect.appendChild(i);const r=document.createElement("option");r.value="run",r.textContent=Ce("walkControl.walkMode.run"),r.selected=this.state.walkMode==="run",this.walkModeSelect.appendChild(r),this.exitBtn.textContent=Ce("walkControl.exit")}setTheme(e){if(!this.element)return;const t=this.element.style;t.setProperty("--bim-bg-base",e.bgBase??"#152232"),t.setProperty("--bim-bg-elevated",e.bgElevated??"#1f2d3e"),t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-border-subtle",e.borderSubtle??"#1e293b"),t.setProperty("--bim-divider",e.divider??"#334155"),t.setProperty("--bim-shadow-xl",e.shadowXl??"0 20px 40px rgba(0, 0, 0, 0.3)"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-hover",e.primaryHover??"#60a5fa"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-text-inverse",e.textInverse??"#152232"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)"),t.setProperty("--bim-component-bg-active",e.componentBgActive??"rgba(248, 250, 252, 0.1)")}destroy(){this.unsubscribeLocale?.(),this.unsubscribeTheme?.(),this.element&&this.element.parentElement&&this.element.parentElement.removeChild(this.element)}}class sT{element;unsubscribeLocale=null;unsubscribeTheme=null;constructor(){}init(){this.element=this.createPanel(),this.unsubscribeLocale=Yt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=rt.subscribe(e=>this.setTheme(e)),this.setLocales(),this.setTheme(rt.getTheme())}createPanel(){const e=document.createElement("div");return e.className="walk-path-panel",e.style.padding="20px",e.style.color="var(--bim-text-color, #fff)",e.textContent="路径漫游内容待实现",e}setLocales(){}setTheme(e){}destroy(){this.unsubscribeLocale?.(),this.unsubscribeTheme?.(),this.element&&this.element.parentElement&&this.element.parentElement.removeChild(this.element)}}class rT extends Or{panel=null;get dialogId(){return"walk-path-dialog"}get dialogTitle(){return"walkControl.path.dialogTitle"}get dialogWidth(){return 300}get dialogHeight(){return 400}init(){}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=20,n=e.clientWidth,i=e.clientHeight;return{x:n-this.dialogWidth-t,y:(i-this.dialogHeight)/2}}createContent(){return this.panel=new sT,this.panel.init(),this.panel.element}onDialogClose(){this.registry.walkControl&&this.registry.walkControl.panel&&this.registry.walkControl.panel.setPathModeActive(!1)}onBeforeDestroy(){this.panel&&(this.panel.destroy(),this.panel=null)}}class oT extends pi{panel=null;pathManager=null;constructor(){super()}init(){this.pathManager=new rT,this.pathManager.init()}show(){if(!this.registry.toolbar){console.warn("Toolbar not initialized");return}this.registry.toolbar.hide(),console.log("[WalkControl] 打开漫游面板,激活第一人称模式"),this.registry.engine3d?.activateFirstPersonMode(),this.panel=new iT({onPlanViewToggle:e=>{console.log("[WalkControl] 地图:",e),e?this.registry.map?.show():this.registry.map?.hide(),this.emit("walk:plan-view-toggle",{isActive:e})},onPathModeToggle:e=>{console.log("[WalkControl] 路径漫游:",e),e?this.pathManager?.show():this.pathManager?.hide(),this.emit("walk:path-mode-toggle",{isActive:e})},onWalkModeToggle:e=>{console.log("[WalkControl] 第三人称漫游按钮点击:",e),e&&(this.pathManager?.hide(),alert("第三人称功能开发中")),this.emit("walk:walk-mode-toggle",{isActive:e})},onSpeedChange:e=>{console.log("[WalkControl] 速度变化:",e);const t=e*.1;this.registry.engine3d?.setWalkSpeed(t),this.emit("walk:speed-change",{speed:e})},onGravityToggle:e=>{console.log("[WalkControl] 重力:",e),this.registry.engine3d?.setWalkGravity(e),this.emit("walk:gravity-toggle",{enabled:e})},onCollisionToggle:e=>{console.log("[WalkControl] 碰撞:",e),this.registry.engine3d?.setWalkCollision(e),this.emit("walk:collision-toggle",{enabled:e})},onCharacterModelChange:e=>{console.log("[WalkControl] 角色模型:",e)},onWalkModeChange:e=>{console.log("[WalkControl] 行走模式:",e)},onExit:()=>{this.hide()}}),this.panel.init(),this.registry.map?.isOpen()&&this.panel.setPlanViewActive(!0),this.subscribe("map:opened",()=>{this.panel?.setPlanViewActive(!0)}),this.subscribe("map:closed",()=>{this.panel?.setPlanViewActive(!1)}),this.registry.container?(this.panel.element.style.position="absolute",this.panel.element.style.bottom="20px",this.panel.element.style.left="50%",this.panel.element.style.transform="translateX(-50%)",this.panel.element.style.zIndex="1000",this.registry.container.appendChild(this.panel.element)):console.warn("[WalkControlManager] Container not found")}hide(){this.pathManager?.hide(),console.log("[WalkControl] 关闭漫游面板,退出第一人称模式"),this.registry.engine3d?.deactivateFirstPersonMode(),this.panel&&(this.panel.destroy(),this.panel=null),this.registry.toolbar&&this.registry.toolbar.show()}destroy(){this.hide(),this.pathManager?.destroy(),this.pathManager=null,super.destroy()}}class aT{element;unsubscribeLocale=null;unsubscribeTheme=null;constructor(){}init(){this.element=this.createPanel(),this.unsubscribeLocale=Yt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=rt.subscribe(e=>this.setTheme(e)),this.setLocales(),this.setTheme(rt.getTheme())}createPanel(){const e=document.createElement("div");return e.className="map-panel",e.style.padding="20px",e.style.color="#fff",e.textContent="地图内容待实现",e}setLocales(){}setTheme(e){}destroy(){this.unsubscribeLocale?.(),this.unsubscribeTheme?.(),this.element&&this.element.parentElement&&this.element.parentElement.removeChild(this.element)}}class lT extends Or{panel=null;get dialogId(){return"map-dialog"}get dialogTitle(){return"map.dialogTitle"}get dialogWidth(){return 300}get dialogHeight(){return 400}init(){}getDialogPosition(){const e=this.registry.container;if(!e)return{x:20,y:100};const t=20,n=20,i=e.clientHeight;return{x:t,y:i-this.dialogHeight-n}}createContent(){return this.panel=new aT,this.panel.init(),this.panel.element}onDialogCreated(){this.emit("map:opened",{})}onDialogClose(){this.emit("map:closed",{})}onBeforeDestroy(){this.panel&&(this.panel.destroy(),this.panel=null)}hide(){super.hide(),this.emit("map:closed",{})}}class cT{container;wrapper=null;registry;toolbar=null;constructTreeBtn=null;buttonGroup=null;dialog=null;engine=null;rightKey=null;propertyPanel=null;measure=null;sectionPlane=null;sectionAxis=null;sectionBox=null;walkControl=null;map=null;constructor(e,t){const n=typeof e=="string"?document.getElementById(e):e;if(!n)throw new Error("Container not found");this.container=n,this.registry=bt.getInstance(),t?.locale&&Yt.setLocale(t.locale),t?.theme&&(t.theme==="custom"?console.warn("Custom theme should be set via setCustomTheme()."):rt.setTheme(t.theme)),this.init()}emit(e,t){this.registry.emit(e,t)}on(e,t){return this.registry.on(e,t)}setLocale(e){Yt.setLocale(e)}getLocale(){return Yt.getLocale()}setTheme(e){rt.setTheme(e)}setCustomTheme(e){rt.setCustomTheme(e)}init(){this.container.innerHTML="",this.wrapper=document.createElement("div"),this.wrapper.className="bim-engine-wrapper",this.container.appendChild(this.wrapper),this.registry.container=this.container,this.registry.wrapper=this.wrapper,this.engine=new VE(this.wrapper),this.dialog=new rg(this.wrapper),this.toolbar=new ng(this.wrapper),this.buttonGroup=new ig(this.wrapper),this.rightKey=new U0(this.wrapper),this.constructTreeBtn=new jE(this.wrapper),this.propertyPanel=new ZE,this.measure=new KE,this.sectionPlane=new JE,this.sectionAxis=new eT,this.sectionBox=new nT,this.walkControl=new oT,this.walkControl.init(),this.map=new lT,this.map.init(),this.registry.engine3d=this.engine,this.registry.dialog=this.dialog,this.registry.toolbar=this.toolbar,this.registry.buttonGroup=this.buttonGroup,this.registry.rightKey=this.rightKey,this.registry.constructTree=this.constructTreeBtn,this.registry.propertyPanel=this.propertyPanel,this.registry.measure=this.measure,this.registry.sectionPlane=this.sectionPlane,this.registry.sectionAxis=this.sectionAxis,this.registry.sectionBox=this.sectionBox,this.registry.walkControl=this.walkControl,this.registry.map=this.map,this.updateTheme(rt.getTheme()),rt.subscribe(e=>{this.updateTheme(e)})}updateTheme(e){this.wrapper&&(this.wrapper.style.color=e.textPrimary)}destroy(){this.toolbar?.destroy(),this.buttonGroup?.destroy(),this.engine?.destroy(),this.dialog?.destroy(),this.rightKey?.destroy(),this.propertyPanel?.destroy(),this.measure?.destroy(),this.sectionPlane?.destroy(),this.sectionAxis?.destroy(),this.sectionBox?.destroy(),this.walkControl?.destroy(),this.container.innerHTML="",bt.reset()}}const hT=Object.freeze(Object.defineProperty({__proto__:null,createHomeButton:()=>({id:"home",groupId:"group-1",type:"button",label:"toolbar.home",icon:At("主视角"),keepActive:!1,onClick:s=>{console.log("首页按钮被点击:",s.id),bt.getInstance().engine3d?.CameraGoHome()}})},Symbol.toStringTag,{value:"Module"})),uT=Object.freeze(Object.defineProperty({__proto__:null,createZoomBoxButton:()=>({id:"zoom-box",groupId:"group-1",keepActive:!1,type:"button",label:"toolbar.zoomBox",icon:At("框选放大"),onClick:()=>{bt.getInstance().engine3d?.activateZoomBox()}})},Symbol.toStringTag,{value:"Module"})),dT=Object.freeze(Object.defineProperty({__proto__:null,createWalkMenuButton:()=>({id:"walk",groupId:"group-1",type:"button",label:"toolbar.walk",align:"vertical",icon:At("漫游"),onClick:()=>{console.log("漫游按钮被点击"),bt.getInstance().walkControl?.show()}})},Symbol.toStringTag,{value:"Module"})),fT=Object.freeze(Object.defineProperty({__proto__:null,createMapButton:()=>{const s=bt.getInstance();return s.on("map:opened",()=>{s.toolbar?.setBtnActive("map",!0)}),s.on("map:closed",()=>{s.toolbar?.setBtnActive("map",!1)}),{id:"map",groupId:"group-1",type:"button",label:"toolbar.map",align:"vertical",keepActive:!0,icon:At("地图"),onClick:()=>{s.map?.isOpen()?s.map?.hide():s.map?.show()}}}},Symbol.toStringTag,{value:"Module"})),pT=Object.freeze(Object.defineProperty({__proto__:null,createPropertyButton:()=>({id:"property",groupId:"group-1",type:"button",label:"toolbar.property",align:"vertical",icon:At("文档"),onClick:()=>{console.log("构件详情按钮被点击"),bt.getInstance().propertyPanel?.show()}})},Symbol.toStringTag,{value:"Module"})),mT=Object.freeze(Object.defineProperty({__proto__:null,createSettingButton:()=>({id:"setting",groupId:"group-2",type:"button",label:"toolbar.setting",icon:At("设置"),keepActive:!1,onClick:s=>{console.log("设置按钮被点击:",s.id)}})},Symbol.toStringTag,{value:"Module"})),gT=Object.freeze(Object.defineProperty({__proto__:null,createInfoButton:()=>({id:"info",groupId:"group-2",type:"button",label:"toolbar.info",icon:At("信息"),keepActive:!1,onClick:()=>{bt.getInstance().emit("ui:open-dialog",{id:"info"})}})},Symbol.toStringTag,{value:"Module"})),xT=Object.freeze(Object.defineProperty({__proto__:null,createFullscreenButton:()=>({id:"fullscreen",groupId:"group-2",type:"button",label:"toolbar.fullscreen",align:"vertical",icon:At("全屏"),onClick:async()=>{console.log("全屏按钮被点击"),window.self!==window.top&&console.warn('检测到在 Iframe 中运行,请确保父级 iframe 标签拥有 allow="fullscreen" 属性');try{const e=document,n=!!(e.fullscreenElement||e.webkitFullscreenElement||e.mozFullScreenElement||e.msFullscreenElement);console.log("当前是否全屏:",n);const r=document.querySelector(".bim-engine-container")||document.body,o=r;if(n){console.log("准备退出全屏...");const a=e.exitFullscreen||e.webkitExitFullscreen||e.mozCancelFullScreen||e.msExitFullscreen;a&&(await a.call(e),console.log("退出全屏请求已发送"))}else{console.log("准备进入全屏..."),(r.style.backgroundColor===""||r.style.backgroundColor==="transparent")&&(r.style.backgroundColor="#ffffff");const a=o.requestFullscreen||o.webkitRequestFullscreen||o.mozRequestFullScreen||o.msRequestFullscreen;a?(await a.call(o,{navigationUI:"hide"}),console.log("全屏请求已发送")):(console.warn("当前浏览器不支持全屏 API"),alert("当前浏览器不支持全屏功能"))}}catch(e){console.error("全屏操作失败:",e),e&&e.message&&e.message.includes("denied")&&console.error('全屏请求被拒绝。如果是 Iframe,请检查 allow="fullscreen"。如果是自动触发,请确保由用户点击触发。')}}})},Symbol.toStringTag,{value:"Module"})),vT=Object.freeze(Object.defineProperty({__proto__:null,createMeasureButton:()=>({id:"measure",groupId:"group-1",type:"button",label:"toolbar.measure",icon:At("测量"),keepActive:!0,onClick:s=>{const e=bt.getInstance();s.isActive?e.measure?.show():e.measure?.destroy()}})},Symbol.toStringTag,{value:"Module"})),bT=Object.freeze(Object.defineProperty({__proto__:null,createSectionMenuButton:()=>({id:"section",groupId:"group-1",type:"menu",label:"toolbar.section",align:"vertical",icon:At("剖切"),keepActive:!0,onClick:s=>{console.log("剖切按钮被点击:",s.id)}})},Symbol.toStringTag,{value:"Module"})),yT=Object.freeze(Object.defineProperty({__proto__:null,createSectionPlaneButton:()=>({id:"section-plane",groupId:"group-1",parentId:"section",type:"button",keepActive:!0,exclusive:!0,align:"vertical",label:"toolbar.sectionPlane",icon:At("拾曲面剖切"),onClick:s=>{console.log("拾取面剖切被点击:",s.id,"激活状态:",s.isActive);const e=bt.getInstance();s.isActive?e.sectionPlane?.show():e.sectionPlane?.hide()}})},Symbol.toStringTag,{value:"Module"})),_T=Object.freeze(Object.defineProperty({__proto__:null,createSectionAxisButton:()=>({id:"section-axis",groupId:"group-1",parentId:"section",type:"button",keepActive:!0,exclusive:!0,align:"vertical",label:"toolbar.sectionAxis",icon:At("轴向剖切"),onClick:s=>{const e=bt.getInstance();s.isActive?e.sectionAxis?.show():e.sectionAxis?.destroy()}})},Symbol.toStringTag,{value:"Module"})),MT=Object.freeze(Object.defineProperty({__proto__:null,createSectionBoxButton:()=>({id:"section-box",groupId:"group-1",parentId:"section",type:"button",keepActive:!0,exclusive:!0,align:"vertical",label:"toolbar.sectionBox",icon:At("剖切盒"),onClick:s=>{console.log("剖切盒被点击:",s.id,"激活状态:",s.isActive);const e=bt.getInstance();s.isActive?e.sectionBox?.show():e.sectionBox?.hide()}})},Symbol.toStringTag,{value:"Module"})),wT=Object.freeze(Object.defineProperty({__proto__:null,default:`# BIM引擎AI助手 - 需求分析与步骤规划专家 + `,this.settingsBtn.addEventListener("click",()=>{this.openSettings()}),p.appendChild(this.clearBtn),p.appendChild(this.settingsBtn),this.mainViewEl.appendChild(p),this.settingsViewEl=this.createSettingsDom(),e.appendChild(this.mainViewEl),e.appendChild(this.settingsViewEl),e}createSettingsDom(){const e=document.createElement("div");e.className="bim-measure-settings";const t=document.createElement("div");t.className="bim-measure-settings-title",t.dataset.i18nKey="measure.settings.title",e.appendChild(t);const n=document.createElement("div");n.className="bim-measure-settings-row";const i=document.createElement("div");i.className="label",i.dataset.i18nKey="measure.settings.unit",this.unitSelectEl=document.createElement("select"),this.unitSelectEl.className="bim-measure-settings-select",this.unitSelectEl.appendChild(this.makeOption("m")),this.unitSelectEl.appendChild(this.makeOption("cm")),this.unitSelectEl.appendChild(this.makeOption("mm")),this.unitSelectEl.appendChild(this.makeOption("km")),n.appendChild(i),n.appendChild(this.unitSelectEl),e.appendChild(n);const r=document.createElement("div");r.className="bim-measure-settings-hint",r.dataset.i18nKey="measure.settings.hint",e.appendChild(r);const o=document.createElement("div");o.className="bim-measure-settings-row";const a=document.createElement("div");a.className="label",a.dataset.i18nKey="measure.settings.precision",this.precisionSelectEl=document.createElement("select"),this.precisionSelectEl.className="bim-measure-settings-select",this.precisionSelectEl.appendChild(this.makePrecisionOption(0)),this.precisionSelectEl.appendChild(this.makePrecisionOption(1)),this.precisionSelectEl.appendChild(this.makePrecisionOption(2)),this.precisionSelectEl.appendChild(this.makePrecisionOption(3)),o.appendChild(a),o.appendChild(this.precisionSelectEl),e.appendChild(o);const l=document.createElement("div");return l.className="bim-measure-settings-actions",this.saveSettingsBtn=document.createElement("button"),this.saveSettingsBtn.type="button",this.saveSettingsBtn.className="bim-measure-settings-save",this.saveSettingsBtn.addEventListener("click",()=>{this.saveSettings()}),this.cancelSettingsBtn=document.createElement("button"),this.cancelSettingsBtn.type="button",this.cancelSettingsBtn.className="bim-measure-settings-cancel",this.cancelSettingsBtn.addEventListener("click",()=>{this.cancelSettings()}),l.appendChild(this.saveSettingsBtn),l.appendChild(this.cancelSettingsBtn),e.appendChild(l),this.syncSettingsFormFromConfig(this.config),e}makeOption(e){const t=document.createElement("option");return t.value=e,t.textContent=e,t}makePrecisionOption(e){const t=document.createElement("option");return t.value=String(e),t.textContent=e===0?"0":`0.${"0".repeat(e)}`,t}enterSettingsView(){this.draftConfig={...this.config},this.view="settings",this.syncSettingsFormFromConfig(this.config),this.applyViewState()}saveSettings(){const e=this.unitSelectEl.value||this.config.unit,t=Number(this.precisionSelectEl.value),n={unit:e,precision:this.isValidPrecision(t)?t:this.config.precision};this.config=n,this.saveConfigToCache(n),this.draftConfig=null,this.view="main",this.applyViewState(),this.renderResult(),this.options.onExpandedChange&&this.options.onExpandedChange(this.isExpanded)}cancelSettings(){this.draftConfig&&(this.config={...this.draftConfig}),this.draftConfig=null,this.view="main",this.applyViewState(),this.renderResult(),this.options.onExpandedChange&&this.options.onExpandedChange(this.isExpanded)}syncSettingsFormFromConfig(e){this.unitSelectEl.value=e.unit,this.precisionSelectEl.value=String(e.precision)}applyViewState(){this.view==="settings"?(this.mainViewEl.style.display="none",this.settingsViewEl.style.display="block"):(this.mainViewEl.style.display="block",this.settingsViewEl.style.display="none")}loadConfigFromCache(){try{const e=localStorage.getItem(Vo.CONFIG_CACHE_KEY);if(!e)return null;const t=JSON.parse(e);if(!t||typeof t!="object")return null;const n=t.unit,i=t.precision;return!this.isValidUnit(n)||!this.isValidPrecision(i)?null:{unit:n,precision:i}}catch{return null}}saveConfigToCache(e){try{localStorage.setItem(Vo.CONFIG_CACHE_KEY,JSON.stringify(e))}catch{}}isValidUnit(e){return e==="m"||e==="cm"||e==="mm"||e==="km"}isValidPrecision(e){return e===0||e===1||e===2||e===3}applyExpandedState(){let e=0;for(const t of this.toolButtons.values())e>=4?t.style.display=this.isExpanded?"":"none":t.style.display="",e++;this.isExpanded?this.toggleBtn.classList.add("is-expanded"):this.toggleBtn.classList.remove("is-expanded")}applyActiveModeState(){for(const[e,t]of this.toolButtons.entries())e===this.activeMode?t.classList.add("is-active"):t.classList.remove("is-active")}renderResult(){if(this.activeMode==="laserDistance")this.mainValueLabelEl.style.display="none",this.mainNumberEl.textContent=Te(this.getModeI18nKey("laserDistance")),this.mainUnitEl.textContent="",this.mainNumberEl.classList.add("is-laser-text");else{this.mainValueLabelEl.style.display="",this.mainValueLabelEl.textContent=Te(this.getModeValueLabelI18nKey(this.activeMode));const e=this.formatMainValueParts(this.activeMode,this.result);this.mainNumberEl.textContent=e.numberText,this.mainUnitEl.textContent=e.unitText,this.mainNumberEl.classList.remove("is-laser-text")}if(this.activeMode==="distance"){this.xyzBoxEl.style.display="";const e=this.result?.xyz;if(!e){this.xyzXEl.textContent="--",this.xyzYEl.textContent="--",this.xyzZEl.textContent="--";return}this.xyzXEl.textContent=this.formatNumberWithPrecision(e.x,this.config.precision),this.xyzYEl.textContent=this.formatNumberWithPrecision(e.y,this.config.precision),this.xyzZEl.textContent=this.formatNumberWithPrecision(e.z,this.config.precision);return}this.xyzBoxEl.style.display="none"}getModeI18nKey(e){return`measure.modes.${e}`}getModeValueLabelI18nKey(e){return`measure.labels.value.${e}`}formatNumberWithPrecision(e,t){return e.toFixed(t)}convertMmToUnit(e,t){switch(t){case"mm":return e;case"cm":return e/10;case"m":return e/1e3;case"km":return e/1e6;default:return e}}getUnitI18nKey(e){return`measure.units.${e}`}convertMm3ToUnit3(e,t){switch(t){case"mm":return e;case"cm":return e/1e3;case"m":return e/1e9;case"km":return e/1e18;default:return e}}formatMainValueParts(e,t){if(e==="laserDistance")return{numberText:Te(this.getModeI18nKey("laserDistance")),unitText:""};if(!t)return this.getEmptyValuePartsByMode(e);switch(e){case"distance":return this.formatLengthParts(t.distanceMm);case"minDistance":return this.formatLengthParts(t.minDistanceMm);case"angle":return this.formatFixedUnitParts(t.angleDeg,Te("measure.units.deg"));case"elevation":return this.formatFixedUnitParts(t.elevationMm===void 0?void 0:t.elevationMm/1e3,Te("measure.units.m"));case"volume":return this.formatVolumeParts(t.volumeM3);case"slope":return this.formatFixedUnitParts(t.slopePercent,Te("measure.units.percent"));case"spaceVolume":return this.formatVolumeParts(t.spaceVolumeM3);default:return{numberText:"--",unitText:""}}}getEmptyValuePartsByMode(e){switch(e){case"distance":case"minDistance":return{numberText:"--",unitText:Te(this.getUnitI18nKey(this.config.unit))};case"angle":return{numberText:"--",unitText:Te("measure.units.deg")};case"elevation":return{numberText:"--",unitText:Te("measure.units.m")};case"volume":case"spaceVolume":return{numberText:"--",unitText:`${this.config.unit}³`};case"slope":return{numberText:"--",unitText:Te("measure.units.percent")};default:return{numberText:"--",unitText:""}}}formatFixedUnitParts(e,t){return e==null||Number.isNaN(e)?{numberText:"--",unitText:t}:{numberText:this.formatNumberWithPrecision(e,this.config.precision),unitText:t}}formatLengthParts(e){const t=Te(this.getUnitI18nKey(this.config.unit));if(e==null||Number.isNaN(e))return{numberText:"--",unitText:t};const n=this.convertMmToUnit(e,this.config.unit);return{numberText:this.formatNumberWithPrecision(n,this.config.precision),unitText:t}}formatVolumeParts(e){const t=`${this.config.unit}³`;if(e==null||Number.isNaN(e))return{numberText:"--",unitText:t};const n=this.convertMm3ToUnit3(e,this.config.unit);return{numberText:this.formatNumberWithPrecision(n,this.config.precision),unitText:t}}}class GE extends Or{panel=null;config=null;get dialogId(){return"measure-dialog"}get dialogTitle(){return"measure.dialogTitle"}get dialogWidth(){return 250}createContent(){this.panel=new Vo({defaultMode:"distance",defaultExpanded:!1,onModeChange:t=>{console.log("[MeasureDialogManager] 当前测量方式已切换:",t),this.registry.engine3d?.activateMeasure(t)},onClearAll:()=>{console.log("[MeasureDialogManager] 删除全部"),this.registry.engine3d?.clearAllMeasures()},onSettings:()=>{console.log("[MeasureDialogManager] 打开设置")},onExpandedChange:()=>{this.dialog?.fitHeight(!1)}}),this.panel.init(),this.config=this.panel.getConfig();const e=document.createElement("div");return e.style.padding="12px",e.appendChild(this.panel.element),e}onDialogCreated(){this.dialog?.fitHeight(!1)}onDialogClose(){this.registry.toolbar?.setBtnActive("measure",!1)}onBeforeDestroy(){this.registry.engine3d&&this.registry.engine3d.deactivateMeasure(),this.panel&&(this.panel.destroy(),this.panel=null)}getActiveMode(){return this.panel?this.panel.getActiveMode():null}switchMode(e){this.panel&&this.panel.switchMode(e)}setMeasureResult(e){this.panel&&this.panel.setResult(e)}getConfig(){return this.panel&&(this.config=this.panel.getConfig()),this.config?{...this.config}:null}setConfig(e,t=!0){if(this.panel){this.panel.setConfig(e,t),this.config=this.panel.getConfig(),this.dialog?.fitHeight(!1);return}const n=this.config,i={unit:e.unit??n?.unit??"mm",precision:e.precision??n?.precision??2};this.config=i}clearAll(){this.panel&&this.panel.clearAll()}openSettings(){this.panel&&this.panel.openSettings()}}class WE{element;options;hideBtn;reverseBtn;resetBtn;hideLabelEl;reverseLabelEl;resetLabelEl;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e={}){this.options=e,this.element=this.createDom()}init(){this.unsubscribeLocale=Yt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=rt.subscribe(e=>{this.setTheme(e)}),this.setLocales(),this.setTheme(rt.getTheme())}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)")}setLocales(){this.hideLabelEl.textContent=Te("sectionPlane.actions.hide"),this.reverseLabelEl.textContent=Te("sectionPlane.actions.reverse"),this.resetLabelEl.textContent=Te("sectionPlane.actions.reset"),this.hideBtn.title=Te("sectionPlane.actions.hide"),this.reverseBtn.title=Te("sectionPlane.actions.reverse"),this.resetBtn.title=Te("sectionPlane.actions.reset")}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove()}createDom(){const e=document.createElement("div");return e.className="section-plane-panel",this.hideBtn=this.createButton("hide",At("隐藏"),()=>{this.options.onHide&&this.options.onHide()}),this.reverseBtn=this.createButton("reverse",At("反向"),()=>{this.options.onReverse&&this.options.onReverse()}),this.resetBtn=this.createButton("reset",At("重置"),()=>{this.options.onReset&&this.options.onReset()}),e.appendChild(this.hideBtn),e.appendChild(this.reverseBtn),e.appendChild(this.resetBtn),e}createButton(e,t,n){const i=document.createElement("button");i.type="button",i.className="section-plane-btn";const r=document.createElement("div");r.className="section-plane-btn-icon",r.innerHTML=t,i.appendChild(r);const o=document.createElement("div");return o.className="section-plane-btn-label",i.appendChild(o),e==="hide"?this.hideLabelEl=o:e==="reverse"?this.reverseLabelEl=o:this.resetLabelEl=o,i.addEventListener("click",n),i}}class XE extends Or{panel=null;get dialogId(){return"section-plane-dialog"}get dialogTitle(){return"sectionPlane.dialogTitle"}get dialogWidth(){return 240}get dialogHeight(){return 120}init(){}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=20,n=50,i=e.clientWidth,r=e.clientHeight;return{x:i-this.dialogWidth-t,y:r-this.dialogHeight-n}}createContent(){return this.panel=new WE({onHide:()=>{console.log("[SectionPlaneDialogManager] 隐藏")},onReverse:()=>{console.log("[SectionPlaneDialogManager] 反向")},onReset:()=>{console.log("[SectionPlaneDialogManager] 重置")}}),this.panel.init(),this.panel.element}onDialogClose(){this.registry.toolbar?.setBtnActive("section-plane",!1)}onBeforeDestroy(){this.panel&&(this.panel.destroy(),this.panel=null)}}class jE{element;options;isHidden=!1;activeAxis="x";hideBtn;reverseBtn;hideLabelEl;reverseLabelEl;axisXBtn;axisYBtn;axisZBtn;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e={}){this.options=e,this.isHidden=e.defaultHidden??!1,this.activeAxis=e.defaultAxis??"x",this.element=this.createDom()}init(){this.unsubscribeLocale=Yt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=rt.subscribe(e=>{this.setTheme(e)}),this.setLocales(),this.setTheme(rt.getTheme()),this.updateHideButtonState(),this.updateAxisButtonsState()}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-divider",e.divider??"#334155"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)")}setLocales(){this.hideLabelEl.textContent=Te("sectionAxis.actions.hide"),this.reverseLabelEl.textContent=Te("sectionAxis.actions.reverse"),this.hideBtn.title=Te("sectionAxis.actions.hide"),this.reverseBtn.title=Te("sectionAxis.actions.reverse"),this.axisXBtn.title=Te("sectionAxis.actions.axisX"),this.axisYBtn.title=Te("sectionAxis.actions.axisY"),this.axisZBtn.title=Te("sectionAxis.actions.axisZ")}setHiddenState(e){this.isHidden=e,this.updateHideButtonState()}getHiddenState(){return this.isHidden}setActiveAxis(e){this.activeAxis=e,this.updateAxisButtonsState()}getActiveAxis(){return this.activeAxis}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove()}createDom(){const e=document.createElement("div");e.className="section-axis-panel";const t=document.createElement("div");t.className="section-axis-row-1",this.hideBtn=this.createButton("hide",At("隐藏"),()=>this.handleHideToggle()),this.reverseBtn=this.createButton("reverse",At("反向"),()=>this.handleReverse()),t.appendChild(this.hideBtn),t.appendChild(this.reverseBtn);const n=document.createElement("div");return n.className="section-axis-row-2",this.axisXBtn=this.createAxisButton("axisX","X",()=>this.handleAxisChange("x")),this.axisYBtn=this.createAxisButton("axisY","Y",()=>this.handleAxisChange("y")),this.axisZBtn=this.createAxisButton("axisZ","Z",()=>this.handleAxisChange("z")),n.appendChild(this.axisXBtn),n.appendChild(this.axisYBtn),n.appendChild(this.axisZBtn),e.appendChild(t),e.appendChild(n),e}createButton(e,t,n){const i=document.createElement("button");i.type="button",i.className="section-axis-btn";const r=document.createElement("div");r.className="section-axis-btn-icon",r.innerHTML=t,i.appendChild(r);const o=document.createElement("div");return o.className="section-axis-btn-label",i.appendChild(o),e==="hide"?this.hideLabelEl=o:e==="reverse"&&(this.reverseLabelEl=o),i.addEventListener("click",n),i}createAxisButton(e,t,n){const i=document.createElement("button");i.type="button",i.className="section-axis-btn section-axis-btn-text";const r=document.createElement("div");return r.className="section-axis-btn-label",r.textContent=t,i.appendChild(r),i.addEventListener("click",n),i}handleHideToggle(){this.isHidden=!this.isHidden,this.updateHideButtonState(),this.options.onHideToggle&&this.options.onHideToggle(this.isHidden)}handleReverse(){this.options.onReverse&&this.options.onReverse()}handleAxisChange(e){this.activeAxis!==e&&(this.activeAxis=e,this.updateAxisButtonsState(),this.options.onAxisChange&&this.options.onAxisChange(e))}updateHideButtonState(){this.isHidden?this.hideBtn.classList.add("active"):this.hideBtn.classList.remove("active")}updateAxisButtonsState(){this.axisXBtn.classList.toggle("active",this.activeAxis==="x"),this.axisYBtn.classList.toggle("active",this.activeAxis==="y"),this.axisZBtn.classList.toggle("active",this.activeAxis==="z")}}class qE extends Or{panel=null;get dialogId(){return"section-axis-dialog"}get dialogTitle(){return"sectionAxis.dialogTitle"}get dialogWidth(){return 240}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=e.clientWidth,n=e.clientHeight;return{x:t-this.dialogWidth-20,y:n-50-200}}createContent(){return this.panel=new jE({defaultAxis:"x",defaultHidden:!1,onHideToggle:e=>{console.log("[SectionAxisDialogManager] 隐藏切换(暂不支持):",e)},onReverse:()=>{console.log("[SectionAxisDialogManager] 反向剖切(暂不支持)")},onAxisChange:e=>{console.log("[SectionAxisDialogManager] 切换轴向:",e),this.registry.engine3d?.activateSectionAxis(e)}}),this.panel.init(),this.panel.element}onDialogCreated(){if(this.dialog?.fitHeight(!1),!this.registry.engine3d){console.error("[SectionAxisDialogManager] Engine not initialized. Call initEngine() first.");return}this.registry.engine3d.activateSectionAxis("x")}onDialogClose(){this.registry.toolbar?.setBtnActive("section-axis",!1)}onBeforeDestroy(){this.registry.engine3d?.deactivateSectionAxis(),this.panel&&(this.panel.destroy(),this.panel=null)}getHiddenState(){return this.panel?.getHiddenState()??!1}setHiddenState(e){this.panel?.setHiddenState(e)}getActiveAxis(){return this.panel?.getActiveAxis()??"x"}setActiveAxis(e){this.panel?.setActiveAxis(e)}}const F0={x:{min:0,max:100},y:{min:0,max:100},z:{min:0,max:100}};class ZE{element;options;isHidden=!1;isReversed=!1;range;hideBtn;reverseBtn;fitBtn;resetBtn;hideLabelEl;reverseLabelEl;fitLabelEl;resetLabelEl;xLabelEl;yLabelEl;zLabelEl;unsubscribeLocale=null;unsubscribeTheme=null;xSlider;ySlider;zSlider;xMinHandle;xMaxHandle;yMinHandle;yMaxHandle;zMinHandle;zMaxHandle;dragState={isDragging:!1,axis:null,handleType:null,pointerId:null};constructor(e={}){this.options=e,this.isHidden=e.defaultHidden??!1,this.isReversed=e.defaultReversed??!1,this.range=JSON.parse(JSON.stringify(e.defaultRange??F0))}init(){this.element=this.createPanel(),this.unsubscribeLocale=Yt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=rt.subscribe(e=>this.setTheme(e)),this.setLocales(),this.setTheme(rt.getTheme()),this.updateButtonStates(),this.updateAllSlidersUI(),this.setupDragListeners()}setHiddenState(e){this.isHidden=e,this.updateButtonStates()}getHiddenState(){return this.isHidden}setReversedState(e){this.isReversed=e,this.updateButtonStates()}getReversedState(){return this.isReversed}setRange(e){e.x&&(this.range.x={...this.range.x,...e.x}),e.y&&(this.range.y={...this.range.y,...e.y}),e.z&&(this.range.z={...this.range.z,...e.z}),this.updateAllSlidersUI()}getRange(){return JSON.parse(JSON.stringify(this.range))}reset(){this.isHidden=this.options.defaultHidden??!1,this.isReversed=this.options.defaultReversed??!1,this.range=JSON.parse(JSON.stringify(this.options.defaultRange??F0)),this.updateButtonStates(),this.updateAllSlidersUI(),this.options.onReset?.(),this.options.onRangeChange?.(this.range)}createPanel(){const e=document.createElement("div");e.className="section-box-panel";const t=document.createElement("div");t.className="section-box-row-buttons",this.hideBtn=this.createButton("hide",Te("sectionBox.actions.hide"),()=>{this.isHidden=!this.isHidden,this.updateButtonStates(),this.options.onHideToggle?.(this.isHidden)},"hide"),this.reverseBtn=this.createButton("reverse",Te("sectionBox.actions.reverse"),()=>{this.isReversed=!this.isReversed,this.updateButtonStates(),this.options.onReverseToggle?.(this.isReversed)},"reverse"),this.fitBtn=this.createButton("fit",Te("sectionBox.actions.fitToModel"),()=>{this.options.onFitToModel?.()},"fit"),this.resetBtn=this.createButton("reset",Te("sectionBox.actions.reset"),()=>this.reset(),"reset"),[this.hideBtn,this.reverseBtn,this.fitBtn,this.resetBtn].forEach(i=>t.appendChild(i));const n=document.createElement("div");return n.className="section-box-sliders",n.addEventListener("pointerdown",i=>i.stopPropagation()),this.xSlider=this.createSlider("x",Te("sectionBox.axes.x")),this.ySlider=this.createSlider("y",Te("sectionBox.axes.y")),this.zSlider=this.createSlider("z",Te("sectionBox.axes.z")),[this.xSlider,this.ySlider,this.zSlider].forEach(i=>n.appendChild(i)),e.appendChild(t),e.appendChild(n),e}createButton(e,t,n,i){const r=document.createElement("button");r.className="section-box-btn",r.title=t;const o={hide:"隐藏",reverse:"反向",fit:"适应到模型",reset:"重置"},a=document.createElement("div");a.className="section-box-btn-icon",a.innerHTML=At(o[e]||e);const l=document.createElement("div");return l.className="section-box-btn-label",l.textContent=t,i==="hide"?this.hideLabelEl=l:i==="reverse"?this.reverseLabelEl=l:i==="fit"?this.fitLabelEl=l:i==="reset"&&(this.resetLabelEl=l),r.appendChild(a),r.appendChild(l),r.addEventListener("click",n),r}createSlider(e,t){const n=document.createElement("div");n.className="section-box-slider";const i=document.createElement("div");i.className="section-box-slider-label",i.textContent=t,e==="x"?this.xLabelEl=i:e==="y"?this.yLabelEl=i:this.zLabelEl=i;const r=document.createElement("div");r.className="section-box-slider-track";const o=document.createElement("div");o.className="section-box-slider-range";const a=document.createElement("div");a.className="section-box-slider-handle",a.setAttribute("data-axis",e),a.setAttribute("data-handle","min");const l=document.createElement("div");return l.className="section-box-slider-handle",l.setAttribute("data-axis",e),l.setAttribute("data-handle","max"),r.append(o,a,l),n.append(i,r),e==="x"?(this.xMinHandle=a,this.xMaxHandle=l):e==="y"?(this.yMinHandle=a,this.yMaxHandle=l):(this.zMinHandle=a,this.zMaxHandle=l),n}setupDragListeners(){[this.xMinHandle,this.xMaxHandle,this.yMinHandle,this.yMaxHandle,this.zMinHandle,this.zMaxHandle].forEach(t=>{t.addEventListener("pointerdown",i=>{i.preventDefault(),i.stopPropagation(),t.setPointerCapture(i.pointerId),this.dragState={isDragging:!0,axis:t.getAttribute("data-axis"),handleType:t.getAttribute("data-handle"),pointerId:i.pointerId},t.classList.add("dragging"),t.closest(".section-box-slider").style.zIndex="100"}),t.addEventListener("pointermove",i=>{this.dragState.isDragging&&this.dragState.pointerId===i.pointerId&&this.onDragging(i)});const n=i=>{this.dragState.isDragging&&this.dragState.pointerId===i.pointerId&&(t.releasePointerCapture(i.pointerId),t.closest(".section-box-slider").style.zIndex="",t.classList.remove("dragging"),this.dragState.isDragging=!1,this.dragState.pointerId=null)};t.addEventListener("pointerup",n),t.addEventListener("pointercancel",n)})}onDragging(e){const{axis:t,handleType:n}=this.dragState;if(!t||!n)return;const o=(t==="x"?this.xSlider:t==="y"?this.ySlider:this.zSlider).querySelector(".section-box-slider-track").getBoundingClientRect();let a=(e.clientX-o.left)/o.width*100;a=Math.max(0,Math.min(100,a));const l=this.range[t];n==="min"?l.min=Math.min(a,l.max):l.max=Math.max(a,l.min),this.updateSliderUI(t),this.options.onRangeChange?.(this.range)}updateSliderUI(e){const t=this.range[e],n=e==="x"?this.xMinHandle:e==="y"?this.yMinHandle:this.zMinHandle,i=e==="x"?this.xMaxHandle:e==="y"?this.yMaxHandle:this.zMaxHandle,o=(e==="x"?this.xSlider:e==="y"?this.ySlider:this.zSlider).querySelector(".section-box-slider-range");n.style.left=`${t.min}%`,i.style.left=`${t.max}%`,o.style.left=`${t.min}%`,o.style.width=`${t.max-t.min}%`,n.setAttribute("data-value",Math.round(t.min).toString()),i.setAttribute("data-value",Math.round(t.max).toString())}updateAllSlidersUI(){["x","y","z"].forEach(e=>this.updateSliderUI(e))}updateButtonStates(){this.hideBtn&&this.hideBtn.classList.toggle("active",this.isHidden),this.reverseBtn&&this.reverseBtn.classList.toggle("active",this.isReversed)}setLocales(){this.hideLabelEl&&(this.hideLabelEl.textContent=Te("sectionBox.actions.hide"),this.reverseLabelEl.textContent=Te("sectionBox.actions.reverse"),this.fitLabelEl.textContent=Te("sectionBox.actions.fitToModel"),this.resetLabelEl.textContent=Te("sectionBox.actions.reset"),this.xLabelEl.textContent=Te("sectionBox.axes.x"),this.yLabelEl.textContent=Te("sectionBox.axes.y"),this.zLabelEl.textContent=Te("sectionBox.axes.z"),this.hideBtn.title=Te("sectionBox.actions.hide"),this.reverseBtn.title=Te("sectionBox.actions.reverse"),this.fitBtn.title=Te("sectionBox.actions.fitToModel"),this.resetBtn.title=Te("sectionBox.actions.reset"))}setTheme(e){if(!this.element)return;const t=this.element.style;t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-bg-elevated",e.bgElevated??"#1f2d3e"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-divider",e.divider??"#334155"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)")}destroy(){this.unsubscribeLocale?.(),this.unsubscribeTheme?.(),this.element&&this.element.parentElement&&this.element.parentElement.removeChild(this.element)}}class YE extends Or{panel=null;get dialogId(){return"section-box-dialog"}get dialogTitle(){return"sectionBox.dialogTitle"}get dialogWidth(){return 280}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=e.clientWidth,n=e.clientHeight;return{x:t-this.dialogWidth-20,y:n-50-300}}createContent(){return this.panel=new ZE({defaultHidden:!1,defaultReversed:!1,onHideToggle:e=>{console.log("[SectionBoxDialogManager] 隐藏切换(底层暂不支持):",e)},onReverseToggle:e=>{console.log("[SectionBoxDialogManager] 反向切换(底层暂不支持):",e)},onFitToModel:()=>{this.registry.engine3d?.fitSectionBoxToModel()},onReset:()=>{this.registry.engine3d?.resetSectionBox()},onRangeChange:e=>{this.registry.engine3d?.setSectionBoxRange(e)}}),this.panel.init(),this.panel.element}onDialogCreated(){this.registry.engine3d?.activateSectionBox(),this.dialog?.fitHeight(!1)}onDialogClose(){this.registry.toolbar?.setBtnActive("section-box",!1)}onBeforeDestroy(){this.registry.engine3d?.deactivateSectionBox(),this.panel&&(this.panel.destroy(),this.panel=null)}getHiddenState(){return this.panel?.getHiddenState()??!1}setHiddenState(e){this.panel?.setHiddenState(e)}getReversedState(){return this.panel?.getReversedState()??!1}setReversedState(e){this.panel?.setReversedState(e)}getRange(){return this.panel?.getRange()??null}setRange(e){this.panel?.setRange(e)}}class KE{element;options;state={mode:"none",isPlanViewActive:!1,speed:1,gravity:!1,collision:!1,characterModel:"construction-worker",walkMode:"walk"};planViewBtn;pathModeBtn;walkModeBtn;settingsContainer;speedControl;speedDecreaseBtn;speedIncreaseBtn;speedDisplay;gravityCheckbox;gravityLabel;collisionCheckbox;collisionLabel;characterModelSelect;characterModelLabel;walkModeSelect;walkModeLabel;exitBtn;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e={}){this.options=e,this.state.speed=e.defaultSpeed??1,this.state.gravity=e.defaultGravity??!1,this.state.collision=e.defaultCollision??!1,this.state.characterModel=e.defaultCharacterModel??"construction-worker",this.state.walkMode=e.defaultWalkMode??"walk"}init(){this.element=this.createPanel(),this.updateSettingsView(),this.unsubscribeLocale=Yt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=rt.subscribe(e=>this.setTheme(e)),this.setLocales(),this.setTheme(rt.getTheme())}setPlanViewActive(e){this.state.isPlanViewActive=e,this.updateButtonStates()}setPathModeActive(e){if(!e&&this.state.mode!=="path")return;const t=e?"path":"none";this.setMode(t)}getState(){return{...this.state}}createPanel(){const e=document.createElement("div");e.className="walk-control-panel";const t=this.createLeftButtons(),n=document.createElement("div");n.className="walk-divider",this.settingsContainer=this.createSettingsContainer();const i=document.createElement("div");i.className="walk-divider";const r=this.createExitButton();return e.appendChild(t),e.appendChild(n),e.appendChild(this.settingsContainer),e.appendChild(i),e.appendChild(r),e}createLeftButtons(){const e=document.createElement("div");return e.className="walk-control-left",this.planViewBtn=this.createIconButton("plan-view",()=>{this.state.isPlanViewActive=!this.state.isPlanViewActive,this.updateButtonStates(),this.options.onPlanViewToggle?.(this.state.isPlanViewActive)}),this.pathModeBtn=this.createIconButton("path",()=>{const t=this.state.mode==="path"?"none":"path";this.setMode(t),this.options.onPathModeToggle?.(t==="path")}),this.walkModeBtn=this.createIconButton("walk",()=>{const t=this.state.mode==="walk"?"none":"walk";this.setMode(t),this.options.onWalkModeToggle?.(t==="walk")}),e.appendChild(this.planViewBtn),e.appendChild(this.pathModeBtn),e.appendChild(this.walkModeBtn),e}createSettingsContainer(){const e=document.createElement("div");e.className="walk-control-settings",this.speedControl=this.createSpeedControl();const t=document.createElement("label");t.className="walk-checkbox-wrapper walk-checkbox-gravity",this.gravityCheckbox=document.createElement("input"),this.gravityCheckbox.type="checkbox",this.gravityCheckbox.className="walk-checkbox",this.gravityCheckbox.checked=this.state.gravity,this.gravityCheckbox.addEventListener("change",()=>{this.state.gravity=this.gravityCheckbox.checked,this.options.onGravityToggle?.(this.state.gravity)}),this.gravityLabel=document.createElement("span"),this.gravityLabel.className="walk-checkbox-label",t.appendChild(this.gravityCheckbox),t.appendChild(this.gravityLabel);const n=document.createElement("label");n.className="walk-checkbox-wrapper walk-checkbox-collision",this.collisionCheckbox=document.createElement("input"),this.collisionCheckbox.type="checkbox",this.collisionCheckbox.className="walk-checkbox",this.collisionCheckbox.checked=this.state.collision,this.collisionCheckbox.addEventListener("change",()=>{this.state.collision=this.collisionCheckbox.checked,this.options.onCollisionToggle?.(this.state.collision)}),this.collisionLabel=document.createElement("span"),this.collisionLabel.className="walk-checkbox-label",n.appendChild(this.collisionCheckbox),n.appendChild(this.collisionLabel);const i=document.createElement("div");i.className="walk-select-wrapper walk-select-wrapper-character-model",this.characterModelLabel=document.createElement("label"),this.characterModelLabel.className="walk-select-label",this.characterModelSelect=document.createElement("select"),this.characterModelSelect.className="walk-select walk-select-character-model",this.characterModelSelect.addEventListener("change",()=>{this.state.characterModel=this.characterModelSelect.value,this.options.onCharacterModelChange?.(this.state.characterModel)}),i.appendChild(this.characterModelLabel),i.appendChild(this.characterModelSelect);const r=document.createElement("div");return r.className="walk-select-wrapper walk-select-wrapper-walk-mode",this.walkModeLabel=document.createElement("label"),this.walkModeLabel.className="walk-select-label",this.walkModeSelect=document.createElement("select"),this.walkModeSelect.className="walk-select walk-select-walk-mode",this.walkModeSelect.addEventListener("change",()=>{this.state.walkMode=this.walkModeSelect.value,this.options.onWalkModeChange?.(this.state.walkMode)}),r.appendChild(this.walkModeLabel),r.appendChild(this.walkModeSelect),e.appendChild(this.speedControl),e.appendChild(i),e.appendChild(r),e.appendChild(t),e.appendChild(n),e}createSpeedControl(){const e=document.createElement("div");e.className="walk-speed-control";const t=document.createElement("label");t.className="walk-speed-label",t.textContent=Te("walkControl.speed");const n=document.createElement("div");return n.className="walk-speed-group",this.speedDecreaseBtn=document.createElement("button"),this.speedDecreaseBtn.className="walk-speed-btn",this.speedDecreaseBtn.textContent="-",this.speedDecreaseBtn.addEventListener("click",()=>{this.state.speed>1&&(this.state.speed--,this.updateSpeedDisplay(),this.options.onSpeedChange?.(this.state.speed))}),this.speedDisplay=document.createElement("div"),this.speedDisplay.className="walk-speed-display",this.speedDisplay.textContent=`${this.state.speed}X`,this.speedIncreaseBtn=document.createElement("button"),this.speedIncreaseBtn.className="walk-speed-btn",this.speedIncreaseBtn.textContent="+",this.speedIncreaseBtn.addEventListener("click",()=>{this.state.speed<10&&(this.state.speed++,this.updateSpeedDisplay(),this.options.onSpeedChange?.(this.state.speed))}),n.appendChild(this.speedDecreaseBtn),n.appendChild(this.speedDisplay),n.appendChild(this.speedIncreaseBtn),e.appendChild(t),e.appendChild(n),e}createIconButton(e,t){const n=document.createElement("button");return n.className=`walk-icon-btn walk-icon-btn-${e}`,n.innerHTML=this.getIconSVG(e),n.addEventListener("click",t),n}createExitButton(){const e=document.createElement("button");return e.className="walk-exit-btn",e.addEventListener("click",()=>{this.options.onExit?.()}),this.exitBtn=e,e}setMode(e){const t=this.state.mode;t==="walk"&&e!=="walk"&&this.options.onWalkModeToggle?.(!1),t==="path"&&e!=="path"&&this.options.onPathModeToggle?.(!1),this.state.mode=e,e==="path"?(this.state.gravity=!1,this.state.collision=!1,this.gravityCheckbox.checked=!1,this.gravityCheckbox.disabled=!0,this.collisionCheckbox.checked=!1,this.collisionCheckbox.disabled=!0):(this.gravityCheckbox.disabled=!1,this.collisionCheckbox.disabled=!1),this.updateButtonStates(),this.updateSettingsView(),this.updateSpeedButtonStates()}updateButtonStates(){this.planViewBtn.classList.toggle("active",this.state.isPlanViewActive),this.pathModeBtn.classList.toggle("active",this.state.mode==="path"),this.walkModeBtn.classList.toggle("active",this.state.mode==="walk")}updateSettingsView(){const e=this.speedControl,t=this.gravityCheckbox.parentElement,n=this.collisionCheckbox.parentElement,i=this.characterModelSelect.parentElement,r=this.walkModeSelect.parentElement;this.state.mode==="walk"?(e.style.display="none",t.style.display="flex",n.style.display="flex",i.style.display="flex",r.style.display="flex"):(e.style.display="flex",t.style.display="flex",n.style.display="flex",i.style.display="none",r.style.display="none")}updateSpeedDisplay(){this.speedDisplay.textContent=`${this.state.speed}X`,this.updateSpeedButtonStates()}updateSpeedButtonStates(){this.speedDecreaseBtn.disabled=this.state.speed<=1,this.speedIncreaseBtn.disabled=this.state.speed>=10}getIconSVG(e){return{"plan-view":At("地图"),path:At("路径漫游"),walk:At("第一人称漫游")}[e]||""}setLocales(){const e=this.speedControl.querySelector(".walk-speed-label");e&&(e.textContent=Te("walkControl.speed")),this.gravityLabel.textContent=Te("walkControl.gravity"),this.collisionLabel.textContent=Te("walkControl.collision"),this.characterModelLabel.textContent=Te("walkControl.characterModel.label"),this.characterModelSelect.innerHTML="";const t=document.createElement("option");t.value="construction-worker",t.textContent=Te("walkControl.characterModel.constructionWorker"),t.selected=this.state.characterModel==="construction-worker",this.characterModelSelect.appendChild(t);const n=document.createElement("option");n.value="office-male",n.textContent=Te("walkControl.characterModel.officeMale"),n.selected=this.state.characterModel==="office-male",this.characterModelSelect.appendChild(n),this.walkModeLabel.textContent=Te("walkControl.walkMode.label"),this.walkModeSelect.innerHTML="";const i=document.createElement("option");i.value="walk",i.textContent=Te("walkControl.walkMode.walk"),i.selected=this.state.walkMode==="walk",this.walkModeSelect.appendChild(i);const r=document.createElement("option");r.value="run",r.textContent=Te("walkControl.walkMode.run"),r.selected=this.state.walkMode==="run",this.walkModeSelect.appendChild(r),this.exitBtn.textContent=Te("walkControl.exit")}setTheme(e){if(!this.element)return;const t=this.element.style;t.setProperty("--bim-bg-base",e.bgBase??"#152232"),t.setProperty("--bim-bg-elevated",e.bgElevated??"#1f2d3e"),t.setProperty("--bim-bg-inset",e.bgInset??"#152232"),t.setProperty("--bim-border-default",e.borderDefault??"#334155"),t.setProperty("--bim-border-strong",e.borderStrong??"#475569"),t.setProperty("--bim-border-subtle",e.borderSubtle??"#1e293b"),t.setProperty("--bim-divider",e.divider??"#334155"),t.setProperty("--bim-shadow-xl",e.shadowXl??"0 20px 40px rgba(0, 0, 0, 0.3)"),t.setProperty("--bim-primary",e.primary??"#3b82f6"),t.setProperty("--bim-primary-hover",e.primaryHover??"#60a5fa"),t.setProperty("--bim-primary-subtle",e.primarySubtle??"rgba(59, 130, 246, 0.15)"),t.setProperty("--bim-text-primary",e.textPrimary??"#ffffff"),t.setProperty("--bim-text-inverse",e.textInverse??"#152232"),t.setProperty("--bim-icon-default",e.iconDefault??"#ffffff"),t.setProperty("--bim-component-bg-hover",e.componentBgHover??"rgba(248, 250, 252, 0.06)"),t.setProperty("--bim-component-bg-active",e.componentBgActive??"rgba(248, 250, 252, 0.1)")}destroy(){this.unsubscribeLocale?.(),this.unsubscribeTheme?.(),this.element&&this.element.parentElement&&this.element.parentElement.removeChild(this.element)}}class $E{element;unsubscribeLocale=null;unsubscribeTheme=null;constructor(){}init(){this.element=this.createPanel(),this.unsubscribeLocale=Yt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=rt.subscribe(e=>this.setTheme(e)),this.setLocales(),this.setTheme(rt.getTheme())}createPanel(){const e=document.createElement("div");return e.className="walk-path-panel",e.style.padding="20px",e.style.color="var(--bim-text-color, #fff)",e.textContent="路径漫游内容待实现",e}setLocales(){}setTheme(e){}destroy(){this.unsubscribeLocale?.(),this.unsubscribeTheme?.(),this.element&&this.element.parentElement&&this.element.parentElement.removeChild(this.element)}}class JE extends Or{panel=null;get dialogId(){return"walk-path-dialog"}get dialogTitle(){return"walkControl.path.dialogTitle"}get dialogWidth(){return 300}get dialogHeight(){return 400}init(){}getDialogPosition(){const e=this.registry.container;if(!e)return{x:100,y:100};const t=20,n=e.clientWidth,i=e.clientHeight;return{x:n-this.dialogWidth-t,y:(i-this.dialogHeight)/2}}createContent(){return this.panel=new $E,this.panel.init(),this.panel.element}onDialogClose(){this.registry.walkControl&&this.registry.walkControl.panel&&this.registry.walkControl.panel.setPathModeActive(!1)}onBeforeDestroy(){this.panel&&(this.panel.destroy(),this.panel=null)}}class QE extends pi{panel=null;pathManager=null;constructor(){super()}init(){this.pathManager=new JE,this.pathManager.init()}show(){if(!this.registry.toolbar){console.warn("Toolbar not initialized");return}this.registry.toolbar.hide(),console.log("[WalkControl] 打开漫游面板,激活第一人称模式"),this.registry.engine3d?.activateFirstPersonMode(),this.panel=new KE({onPlanViewToggle:e=>{console.log("[WalkControl] 地图:",e),e?this.registry.map?.show():this.registry.map?.hide(),this.emit("walk:plan-view-toggle",{isActive:e})},onPathModeToggle:e=>{console.log("[WalkControl] 路径漫游:",e),e?this.pathManager?.show():this.pathManager?.hide(),this.emit("walk:path-mode-toggle",{isActive:e})},onWalkModeToggle:e=>{console.log("[WalkControl] 第三人称漫游按钮点击:",e),e&&(this.pathManager?.hide(),alert("第三人称功能开发中")),this.emit("walk:walk-mode-toggle",{isActive:e})},onSpeedChange:e=>{console.log("[WalkControl] 速度变化:",e);const t=e*.1;this.registry.engine3d?.setWalkSpeed(t),this.emit("walk:speed-change",{speed:e})},onGravityToggle:e=>{console.log("[WalkControl] 重力:",e),this.registry.engine3d?.setWalkGravity(e),this.emit("walk:gravity-toggle",{enabled:e})},onCollisionToggle:e=>{console.log("[WalkControl] 碰撞:",e),this.registry.engine3d?.setWalkCollision(e),this.emit("walk:collision-toggle",{enabled:e})},onCharacterModelChange:e=>{console.log("[WalkControl] 角色模型:",e)},onWalkModeChange:e=>{console.log("[WalkControl] 行走模式:",e)},onExit:()=>{this.hide()}}),this.panel.init(),this.registry.map?.isOpen()&&this.panel.setPlanViewActive(!0),this.subscribe("map:opened",()=>{this.panel?.setPlanViewActive(!0)}),this.subscribe("map:closed",()=>{this.panel?.setPlanViewActive(!1)}),this.registry.container?(this.panel.element.style.position="absolute",this.panel.element.style.bottom="20px",this.panel.element.style.left="50%",this.panel.element.style.transform="translateX(-50%)",this.panel.element.style.zIndex="1000",this.registry.container.appendChild(this.panel.element)):console.warn("[WalkControlManager] Container not found")}hide(){this.pathManager?.hide(),console.log("[WalkControl] 关闭漫游面板,退出第一人称模式"),this.registry.engine3d?.deactivateFirstPersonMode(),this.panel&&(this.panel.destroy(),this.panel=null),this.registry.toolbar&&this.registry.toolbar.show()}destroy(){this.hide(),this.pathManager?.destroy(),this.pathManager=null,super.destroy()}}class eT{element;unsubscribeLocale=null;unsubscribeTheme=null;constructor(){}init(){this.element=this.createPanel(),this.unsubscribeLocale=Yt.subscribe(()=>this.setLocales()),this.unsubscribeTheme=rt.subscribe(e=>this.setTheme(e)),this.setLocales(),this.setTheme(rt.getTheme())}createPanel(){const e=document.createElement("div");return e.className="map-panel",e.style.padding="20px",e.style.color="#fff",e.textContent="地图内容待实现",e}setLocales(){}setTheme(e){}destroy(){this.unsubscribeLocale?.(),this.unsubscribeTheme?.(),this.element&&this.element.parentElement&&this.element.parentElement.removeChild(this.element)}}class tT extends Or{panel=null;get dialogId(){return"map-dialog"}get dialogTitle(){return"map.dialogTitle"}get dialogWidth(){return 300}get dialogHeight(){return 400}init(){}getDialogPosition(){const e=this.registry.container;if(!e)return{x:20,y:100};const t=20,n=20,i=e.clientHeight;return{x:t,y:i-this.dialogHeight-n}}createContent(){return this.panel=new eT,this.panel.init(),this.panel.element}onDialogCreated(){this.emit("map:opened",{})}onDialogClose(){this.emit("map:closed",{})}onBeforeDestroy(){this.panel&&(this.panel.destroy(),this.panel=null)}hide(){super.hide(),this.emit("map:closed",{})}}class nT{element;headerEl;contentEl;contentBoxEl;arrowEl;titleEl;config;parent;constructor(e,t){this.config=e,this.parent=t,this.element=this.createDom()}createDom(){const e=document.createElement("div");if(e.className=`bim-collapse-item ${this.config.className||""}`,this.config.disabled&&e.classList.add("is-disabled"),e.dataset.id=this.config.id,this.headerEl=document.createElement("div"),this.headerEl.className="bim-collapse-header",this.arrowEl=document.createElement("span"),this.arrowEl.className="bim-collapse-arrow",this.arrowEl.innerHTML='',this.headerEl.appendChild(this.arrowEl),this.config.icon){const t=document.createElement("span");t.className="bim-collapse-icon",t.innerHTML=this.config.icon,this.headerEl.appendChild(t)}if(this.titleEl=document.createElement("span"),this.titleEl.className="bim-collapse-title",this.titleEl.textContent=Te(this.config.title),this.headerEl.appendChild(this.titleEl),this.config.extra){const t=document.createElement("div");t.className="bim-collapse-extra",typeof this.config.extra=="string"?t.innerHTML=this.config.extra:t.appendChild(this.config.extra),this.headerEl.appendChild(t)}return this.headerEl.addEventListener("click",()=>{this.config.disabled||this.parent.toggleItem(this.config.id)}),e.appendChild(this.headerEl),this.contentEl=document.createElement("div"),this.contentEl.className="bim-collapse-content is-hidden",this.contentBoxEl=document.createElement("div"),this.contentBoxEl.className="bim-collapse-content-box",typeof this.config.content=="string"?this.contentBoxEl.innerHTML=this.config.content:this.contentBoxEl.appendChild(this.config.content),this.contentEl.appendChild(this.contentBoxEl),e.appendChild(this.contentEl),e}updateLocale(){this.titleEl&&(this.titleEl.textContent=Te(this.config.title))}setActive(e){e?(this.element.classList.add("is-active"),this.contentEl.classList.remove("is-hidden")):(this.element.classList.remove("is-active"),this.contentEl.classList.add("is-hidden"))}}class z0{element;options;items=new Map;activeIds=new Set;unsubscribeLocale=null;unsubscribeTheme=null;constructor(e){this.options={bordered:!0,accordion:!1,...e},this.element=document.createElement("div"),this.element.className=`bim-collapse ${this.options.className||""}`,this.options.bordered||(this.element.style.border="none"),this.options.ghost&&this.element.classList.add("is-ghost");const t=typeof this.options.container=="string"?document.getElementById(this.options.container):this.options.container;t&&t.appendChild(this.element),this.options.activeIds&&this.options.activeIds.forEach(n=>this.activeIds.add(n)),this.init()}init(){this.options.items.forEach(e=>{const t=new nT(e,this);this.items.set(e.id,t),this.element.appendChild(t.element),this.activeIds.has(e.id)&&t.setActive(!0)}),this.unsubscribeLocale=Yt.subscribe(()=>{this.setLocales()}),this.unsubscribeTheme=rt.subscribe(e=>{this.setTheme(e)}),this.setTheme(rt.getTheme())}toggleItem(e){const t=this.activeIds.has(e);this.options.accordion?(this.activeIds.clear(),t||this.activeIds.add(e)):t?this.activeIds.delete(e):this.activeIds.add(e),this.refreshState(),this.options.onChange&&this.options.onChange(Array.from(this.activeIds))}refreshState(){this.items.forEach((e,t)=>{e.setActive(this.activeIds.has(t))})}setTheme(e){const t=this.element.style;t.setProperty("--bim-bg-elevated",e.bgElevated),t.setProperty("--bim-border-default",e.borderDefault),t.setProperty("--bim-border-subtle",e.borderSubtle),t.setProperty("--bim-border-strong",e.borderStrong),t.setProperty("--bim-text-primary",e.textPrimary),t.setProperty("--bim-text-disabled",e.textDisabled),t.setProperty("--bim-component-bg",e.componentBg),t.setProperty("--bim-component-bg-hover",e.componentBgHover),t.setProperty("--bim-component-bg-active",e.componentBgActive)}setLocales(){this.items.forEach(e=>e.updateLocale())}destroy(){this.unsubscribeLocale&&(this.unsubscribeLocale(),this.unsubscribeLocale=null),this.unsubscribeTheme&&(this.unsubscribeTheme(),this.unsubscribeTheme=null),this.element.remove(),this.items.clear()}}class iT extends pi{dialogId="component-detail-dialog";dialog=null;currentSelection=null;unsubscribeSelected=null;unsubscribeDeselected=null;tabInstance=null;propertiesData=null;constructor(){super()}init(){this.unsubscribeSelected=this.registry.on("component:selected",e=>{this.currentSelection=e,this.isOpen()&&this.loadAndRenderContent()}),this.unsubscribeDeselected=this.registry.on("component:deselected",()=>{this.currentSelection=null,this.isOpen()&&this.renderNoSelection()})}show(){if(!this.registry.dialog){console.warn("[ComponentDetailManager] Dialog manager not initialized");return}this.isOpen()||this.createDialog(),this.currentSelection?this.loadAndRenderContent():this.renderNoSelection()}createDialog(){const t=document.body.clientWidth-300-40;this.dialog=this.registry.dialog?.create({id:this.dialogId,title:"panel.componentDetail.title",content:"",width:"300px",height:"500px",position:{x:t,y:20},resizable:!0,onClose:()=>this.hide()})}loadAndRenderContent(){!this.dialog||!this.currentSelection||(this.showLoading(),this.registry.engine3d?.getComponentProperties(this.currentSelection.url,this.currentSelection.id,e=>{this.propertiesData=e,this.renderTabbedContent()}))}showLoading(){const e=document.createElement("div");e.style.cssText="height:100%;display:flex;align-items:center;justify-content:center;",e.textContent="加载中...",this.dialog?.setContent(e)}renderNoSelection(){if(!this.dialog)return;const e=document.createElement("div");e.style.cssText="height:100%;display:flex;align-items:center;justify-content:center;color:var(--bim-text-secondary,#999);",e.textContent=Te("panel.componentDetail.noSelection")||"请先选中构件",this.dialog.setContent(e)}renderTabbedContent(){if(!this.dialog)return;this.tabInstance&&(this.tabInstance.destroy(),this.tabInstance=null);const e=document.createElement("div");e.style.cssText="height:100%;display:flex;flex-direction:column;";const t=this.createPropertiesPanel(),n=this.createMaterialsPanel();this.tabInstance=new U0({container:e,activeId:"properties",tabs:[{id:"properties",title:"panel.property.tab.props",content:t},{id:"materials",title:"panel.property.tab.material",content:n}]}),this.tabInstance.init(),this.dialog.setContent(e)}createPropertiesPanel(){const e=document.createElement("div");e.style.cssText="height:100%;overflow-y:auto;";const t=this.propertiesData?.properties||[];if(t.length===0)return e.innerHTML='
    无属性数据
    ',e;const n=t.map((r,o)=>({id:`category-${o}`,title:r.name||`分类 ${o+1}`,content:this.createCategoryContent(r.children||[])}));new z0({container:e,accordion:!1,ghost:!0,activeIds:n.length>0?[n[0].id]:[],items:n});const i=document.createElement("style");return i.textContent=` + #${this.dialogId} .bim-collapse-header { + background-color: var(--bim-component-bg-hover) !important; + } + #${this.dialogId} .bim-collapse-header:hover { + background-color: var(--bim-component-bg-active) !important; + } + `,e.appendChild(i),e}createMaterialsPanel(){const e=document.createElement("div");e.style.cssText="height:100%;overflow-y:auto;";const t=this.propertiesData?.materials||[];if(t.length===0)return e.innerHTML='
    无材质数据
    ',e;const n=t.map((r,o)=>({id:`material-${o}`,title:r.name||`材质 ${o+1}`,content:this.createCategoryContent(r.children||r.properties||[])}));new z0({container:e,accordion:!1,ghost:!0,activeIds:n.length>0?[n[0].id]:[],items:n});const i=document.createElement("style");return i.textContent=` + #${this.dialogId} .bim-collapse-header { + background-color: var(--bim-component-bg-hover) !important; + } + #${this.dialogId} .bim-collapse-header:hover { + background-color: var(--bim-component-bg-active) !important; + } + `,e.appendChild(i),e}createCategoryContent(e){const t=document.createElement("div");return e.forEach((n,i)=>{const r=document.createElement("div");r.style.cssText=` + display: flex; + border-bottom: 1px solid var(--bim-border-default, rgba(255,255,255,0.15)); + `,i===e.length-1&&(r.style.borderBottom="none");const o=document.createElement("div");o.style.cssText=` + width: 120px; + flex-shrink: 0; + color: var(--bim-text-secondary, #999); + font-size: 13px; + padding: 8px 12px; + border-right: 1px solid var(--bim-border-default, rgba(255,255,255,0.15)); + `,o.textContent=n.name||"-";const a=document.createElement("div");a.style.cssText=` + flex: 1; + color: var(--bim-text-primary, #fff); + font-size: 13px; + padding: 8px 12px; + word-break: break-all; + `,a.textContent=String(n.value??"-"),r.appendChild(o),r.appendChild(a),t.appendChild(r)}),t}isOpen(){return this.dialog!==null}hide(){this.tabInstance&&(this.tabInstance.destroy(),this.tabInstance=null),this.dialog&&(this.dialog.destroy(),this.dialog=null)}destroy(){this.unsubscribeSelected&&(this.unsubscribeSelected(),this.unsubscribeSelected=null),this.unsubscribeDeselected&&(this.unsubscribeDeselected(),this.unsubscribeDeselected=null),this.hide(),super.destroy()}}class sT{container;wrapper=null;registry;toolbar=null;constructTreeBtn=null;buttonGroup=null;dialog=null;engine=null;rightKey=null;measure=null;sectionPlane=null;sectionAxis=null;sectionBox=null;walkControl=null;map=null;componentDetail=null;constructor(e,t){const n=typeof e=="string"?document.getElementById(e):e;if(!n)throw new Error("Container not found");this.container=n,this.registry=wt.getInstance(),t?.locale&&Yt.setLocale(t.locale),t?.theme&&(t.theme==="custom"?console.warn("Custom theme should be set via setCustomTheme()."):rt.setTheme(t.theme)),this.init()}emit(e,t){this.registry.emit(e,t)}on(e,t){return this.registry.on(e,t)}setLocale(e){Yt.setLocale(e)}getLocale(){return Yt.getLocale()}setTheme(e){rt.setTheme(e)}setCustomTheme(e){rt.setCustomTheme(e)}init(){this.container.innerHTML="",this.wrapper=document.createElement("div"),this.wrapper.className="bim-engine-wrapper",this.container.appendChild(this.wrapper),this.registry.container=this.container,this.registry.wrapper=this.wrapper,this.engine=new UE(this.wrapper),this.dialog=new sg(this.wrapper),this.toolbar=new tg(this.wrapper),this.buttonGroup=new ng(this.wrapper),this.rightKey=new k0(this.wrapper),this.constructTreeBtn=new HE(this.wrapper),this.measure=new GE,this.sectionPlane=new XE,this.sectionAxis=new qE,this.sectionBox=new YE,this.walkControl=new QE,this.walkControl.init(),this.map=new tT,this.map.init(),this.registry.engine3d=this.engine,this.registry.dialog=this.dialog,this.registry.toolbar=this.toolbar,this.registry.buttonGroup=this.buttonGroup,this.registry.rightKey=this.rightKey,this.registry.constructTree=this.constructTreeBtn,this.registry.measure=this.measure,this.registry.sectionPlane=this.sectionPlane,this.registry.sectionAxis=this.sectionAxis,this.registry.sectionBox=this.sectionBox,this.registry.walkControl=this.walkControl,this.registry.map=this.map,this.componentDetail=new iT,this.registry.componentDetail=this.componentDetail,this.componentDetail.init(),this.updateTheme(rt.getTheme()),rt.subscribe(e=>{this.updateTheme(e)})}updateTheme(e){this.wrapper&&(this.wrapper.style.color=e.textPrimary)}destroy(){this.toolbar?.destroy(),this.buttonGroup?.destroy(),this.engine?.destroy(),this.dialog?.destroy(),this.rightKey?.destroy(),this.measure?.destroy(),this.sectionPlane?.destroy(),this.sectionAxis?.destroy(),this.sectionBox?.destroy(),this.walkControl?.destroy(),this.container.innerHTML="",wt.reset()}}const rT=Object.freeze(Object.defineProperty({__proto__:null,createHomeButton:()=>({id:"home",groupId:"group-1",type:"button",label:"toolbar.home",icon:At("主视角"),keepActive:!1,onClick:s=>{console.log("首页按钮被点击:",s.id),wt.getInstance().engine3d?.CameraGoHome()}})},Symbol.toStringTag,{value:"Module"})),oT=Object.freeze(Object.defineProperty({__proto__:null,createZoomBoxButton:()=>({id:"zoom-box",groupId:"group-1",keepActive:!1,type:"button",label:"toolbar.zoomBox",icon:At("框选放大"),onClick:()=>{wt.getInstance().engine3d?.activateZoomBox()}})},Symbol.toStringTag,{value:"Module"})),aT=Object.freeze(Object.defineProperty({__proto__:null,createWalkMenuButton:()=>({id:"walk",groupId:"group-1",type:"button",label:"toolbar.walk",align:"vertical",icon:At("漫游"),onClick:()=>{console.log("漫游按钮被点击"),wt.getInstance().walkControl?.show()}})},Symbol.toStringTag,{value:"Module"})),lT=Object.freeze(Object.defineProperty({__proto__:null,createMapButton:()=>{const s=wt.getInstance();return s.on("map:opened",()=>{s.toolbar?.setBtnActive("map",!0)}),s.on("map:closed",()=>{s.toolbar?.setBtnActive("map",!1)}),{id:"map",groupId:"group-1",type:"button",label:"toolbar.map",align:"vertical",keepActive:!0,icon:At("地图"),onClick:()=>{s.map?.isOpen()?s.map?.hide():s.map?.show()}}}},Symbol.toStringTag,{value:"Module"})),cT=Object.freeze(Object.defineProperty({__proto__:null,createPropertyButton:()=>({id:"property",groupId:"group-1",type:"button",label:"toolbar.property",align:"vertical",icon:At("文档"),onClick:()=>{console.log("构件详情按钮被点击"),wt.getInstance().componentDetail?.show()}})},Symbol.toStringTag,{value:"Module"})),hT=Object.freeze(Object.defineProperty({__proto__:null,createSettingButton:()=>({id:"setting",groupId:"group-2",type:"button",label:"toolbar.setting",icon:At("设置"),keepActive:!1,onClick:s=>{console.log("设置按钮被点击:",s.id)}})},Symbol.toStringTag,{value:"Module"})),uT=Object.freeze(Object.defineProperty({__proto__:null,createInfoButton:()=>({id:"info",groupId:"group-2",type:"button",label:"toolbar.info",icon:At("信息"),keepActive:!1,onClick:()=>{wt.getInstance().emit("ui:open-dialog",{id:"info"})}})},Symbol.toStringTag,{value:"Module"})),dT=Object.freeze(Object.defineProperty({__proto__:null,createFullscreenButton:()=>({id:"fullscreen",groupId:"group-2",type:"button",label:"toolbar.fullscreen",align:"vertical",icon:At("全屏"),onClick:async()=>{console.log("全屏按钮被点击"),window.self!==window.top&&console.warn('检测到在 Iframe 中运行,请确保父级 iframe 标签拥有 allow="fullscreen" 属性');try{const e=document,n=!!(e.fullscreenElement||e.webkitFullscreenElement||e.mozFullScreenElement||e.msFullscreenElement);console.log("当前是否全屏:",n);const r=document.querySelector(".bim-engine-container")||document.body,o=r;if(n){console.log("准备退出全屏...");const a=e.exitFullscreen||e.webkitExitFullscreen||e.mozCancelFullScreen||e.msExitFullscreen;a&&(await a.call(e),console.log("退出全屏请求已发送"))}else{console.log("准备进入全屏..."),(r.style.backgroundColor===""||r.style.backgroundColor==="transparent")&&(r.style.backgroundColor="#ffffff");const a=o.requestFullscreen||o.webkitRequestFullscreen||o.mozRequestFullScreen||o.msRequestFullscreen;a?(await a.call(o,{navigationUI:"hide"}),console.log("全屏请求已发送")):(console.warn("当前浏览器不支持全屏 API"),alert("当前浏览器不支持全屏功能"))}}catch(e){console.error("全屏操作失败:",e),e&&e.message&&e.message.includes("denied")&&console.error('全屏请求被拒绝。如果是 Iframe,请检查 allow="fullscreen"。如果是自动触发,请确保由用户点击触发。')}}})},Symbol.toStringTag,{value:"Module"})),fT=Object.freeze(Object.defineProperty({__proto__:null,createMeasureButton:()=>({id:"measure",groupId:"group-1",type:"button",label:"toolbar.measure",icon:At("测量"),keepActive:!0,onClick:s=>{const e=wt.getInstance();s.isActive?e.measure?.show():e.measure?.destroy()}})},Symbol.toStringTag,{value:"Module"})),pT=Object.freeze(Object.defineProperty({__proto__:null,createSectionMenuButton:()=>({id:"section",groupId:"group-1",type:"menu",label:"toolbar.section",align:"vertical",icon:At("剖切"),keepActive:!0,onClick:s=>{console.log("剖切按钮被点击:",s.id)}})},Symbol.toStringTag,{value:"Module"})),mT=Object.freeze(Object.defineProperty({__proto__:null,createSectionPlaneButton:()=>({id:"section-plane",groupId:"group-1",parentId:"section",type:"button",keepActive:!0,exclusive:!0,align:"vertical",label:"toolbar.sectionPlane",icon:At("拾曲面剖切"),onClick:s=>{console.log("拾取面剖切被点击:",s.id,"激活状态:",s.isActive);const e=wt.getInstance();s.isActive?e.sectionPlane?.show():e.sectionPlane?.hide()}})},Symbol.toStringTag,{value:"Module"})),gT=Object.freeze(Object.defineProperty({__proto__:null,createSectionAxisButton:()=>({id:"section-axis",groupId:"group-1",parentId:"section",type:"button",keepActive:!0,exclusive:!0,align:"vertical",label:"toolbar.sectionAxis",icon:At("轴向剖切"),onClick:s=>{const e=wt.getInstance();s.isActive?e.sectionAxis?.show():e.sectionAxis?.destroy()}})},Symbol.toStringTag,{value:"Module"})),xT=Object.freeze(Object.defineProperty({__proto__:null,createSectionBoxButton:()=>({id:"section-box",groupId:"group-1",parentId:"section",type:"button",keepActive:!0,exclusive:!0,align:"vertical",label:"toolbar.sectionBox",icon:At("剖切盒"),onClick:s=>{console.log("剖切盒被点击:",s.id,"激活状态:",s.isActive);const e=wt.getInstance();s.isActive?e.sectionBox?.show():e.sectionBox?.hide()}})},Symbol.toStringTag,{value:"Module"})),vT=Object.freeze(Object.defineProperty({__proto__:null,default:`# BIM引擎AI助手 - 需求分析与步骤规划专家 ## 角色定位 @@ -5021,7 +5048,7 @@ json内容 5. **用户友好**:步骤描述要清晰易懂,便于用户理解整个执行流程 -''`},Symbol.toStringTag,{value:"Module"})),ST=Object.freeze(Object.defineProperty({__proto__:null,default:`# BIM引擎AI助手 - 代码生成专家 +''`},Symbol.toStringTag,{value:"Module"})),bT=Object.freeze(Object.defineProperty({__proto__:null,default:`# BIM引擎AI助手 - 代码生成专家 ## 角色定位 @@ -5267,7 +5294,7 @@ try { 5. **代码可读性**:优先保证代码的可读性,而不是追求"高级"写法 6. **注释清晰**:关键逻辑要有注释,但不要过度注释 7. **性能考虑**:对于大量数据的处理,考虑性能优化 -8. **测试友好**:生成的代码应该便于测试和调试 `},Symbol.toStringTag,{value:"Module"})),ET=Object.freeze(Object.defineProperty({__proto__:null,default:`# BIM Engine SDK API 文档 +8. **测试友好**:生成的代码应该便于测试和调试 `},Symbol.toStringTag,{value:"Module"})),yT=Object.freeze(Object.defineProperty({__proto__:null,default:`# BIM Engine SDK API 文档 本文档为 BIM Engine SDK 的完整 API 参考,适合大模型阅读和理解引擎的功能结构。 @@ -6771,5 +6798,5 @@ BIM Engine SDK 提供了完整的 3D BIM 模型渲染和交互能力,主要特 - 施工模拟 - 运维管理 - AI 辅助设计 -`},Symbol.toStringTag,{value:"Module"}));Is.BimEngine=cT,Object.defineProperty(Is,Symbol.toStringTag,{value:"Module"})})); +`},Symbol.toStringTag,{value:"Module"}));Is.BimEngine=sT,Object.defineProperty(Is,Symbol.toStringTag,{value:"Module"})})); //# sourceMappingURL=iflow-engine.umd.js.map diff --git a/demo/lib/iflow-engine.umd.js.map b/demo/lib/iflow-engine.umd.js.map index dd2c9b8..4bc4f12 100644 --- a/demo/lib/iflow-engine.umd.js.map +++ b/demo/lib/iflow-engine.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"iflow-engine.umd.js","sources":["../src/locales/zh-CN.ts","../src/locales/en-US.ts","../src/services/locale.ts","../src/themes/presets.ts","../src/services/theme.ts","../src/core/event-emitter.ts","../src/core/manager-registry.ts","../src/components/button-group/index.ts","../src/components/button-group/toolbar/index.ts","../src/core/base-manager.ts","../src/managers/toolbar-manager.ts","../src/managers/button-group-manager.ts","../src/components/dialog/index.ts","../src/components/dialog/bimInfoDialog/index.ts","../src/managers/dialog-manager.ts","../../bim_engine_base/node_modules/three/build/three.core.js","../../bim_engine_base/node_modules/three/build/three.module.js","../../bim_engine_base/dist/bim-engine-sdk.es.js","../src/components/engine/index.ts","../src/components/right-key/index.ts","../src/components/menu/index.ts","../src/managers/right-key-manager.ts","../src/components/menu/buttons/info.ts","../src/components/menu/buttons/second.ts","../src/components/menu/buttons/four.ts","../src/components/menu/buttons/home.ts","../src/managers/engine-manager.ts","../src/components/tree/types.ts","../src/components/tree/tree-node.ts","../src/components/tree/index.ts","../src/components/tab/index.ts","../src/utils/icon-manager.ts","../src/managers/construct-tree-manager-btn.ts","../src/components/collapse/index.ts","../src/components/description/index.ts","../src/managers/property-panel-manager.ts","../src/core/base-dialog-manager.ts","../src/components/measure-panel/index.ts","../src/managers/measure-dialog-manager.ts","../src/components/section-plane-panel/index.ts","../src/managers/section-plane-dialog-manager.ts","../src/components/section-axis-panel/index.ts","../src/managers/section-axis-dialog-manager.ts","../src/components/section-box-panel/index.ts","../src/managers/section-box-dialog-manager.ts","../src/components/walk-control-panel/index.ts","../src/components/walk-path-panel/index.ts","../src/managers/walk-path-dialog-manager.ts","../src/managers/walk-control-manager.ts","../src/components/map-panel/index.ts","../src/managers/map-dialog-manager.ts","../src/bim-engine.ts","../src/components/button-group/toolbar/buttons/home/index.ts","../src/components/button-group/toolbar/buttons/zoom-box/index.ts","../src/components/button-group/toolbar/buttons/walk/walk-menu/index.ts","../src/components/button-group/toolbar/buttons/map/index.ts","../src/components/button-group/toolbar/buttons/property/index.ts","../src/components/button-group/toolbar/buttons/setting/index.ts","../src/components/button-group/toolbar/buttons/info/index.ts","../src/components/button-group/toolbar/buttons/fullscreen/index.ts","../src/components/button-group/toolbar/buttons/measure/index.ts","../src/components/button-group/toolbar/buttons/section/section-menu/index.ts","../src/components/button-group/toolbar/buttons/section/section-plane/index.ts","../src/components/button-group/toolbar/buttons/section/section-axis/index.ts","../src/components/button-group/toolbar/buttons/section/section-box/index.ts","../../bim_engine_base/dist/main-2Txx2Vau.mjs","../../bim_engine_base/dist/step-CkmZYIvn.mjs","../../bim_engine_base/dist/API文档-B1v8UcRF.mjs"],"sourcesContent":["import {TranslationDictionary} from './types';\n\nexport const zhCN: TranslationDictionary = {\n common: {\n title: 'BimEngine',\n description: '这是一个使用 BIM-ENGINE。',\n openTestDialog: '打开测试弹窗',\n openInfoDialog: '打开信息弹窗 (封装版)',\n },\n toolbar: {\n home: '首页',\n measure: '测量',\n zoomBox: '选框放大',\n info: '信息',\n location: '定位',\n setting: '设置',\n walk: '漫游',\n map: '地图',\n property: '构件详情',\n fullscreen: '全屏',\n walkMenu: '漫游菜单',\n walkPerson: '第一人称',\n walkBird: '第三人称',\n tree: '模型树',\n section: '剖切',\n sectionPlane: '拾取面剖切',\n sectionAxis: '轴向剖切',\n sectionBox: '剖切盒'\n },\n dialog: {\n testTitle: '测试弹窗',\n testContent: '
    这是一个 可拖拽可缩放 的弹窗。

    你可以尝试拖动标题栏,或者拖动右下角改变大小。
    ',\n },\n menu: {\n info: '信息',\n home: '首页'\n },\n tree: {\n searchPlaceholder: '请输入要搜索的内容',\n },\n constructTree: {\n title: '目录树',\n },\n tab: {\n component: '构件',\n system: '系统',\n space: '空间',\n },\n panel: {\n property: {\n title: '构件详情',\n base: '基本属性',\n material: '材质信息',\n advanced: '高级设置',\n tab: {\n props: '属性',\n material: '材质'\n }\n }\n },\n measure: {\n btnName: '测量',\n dialogTitle: '测量',\n modes: {\n distance: '距离',\n minDistance: '最小距离',\n angle: '角度',\n elevation: '标高',\n volume: '体积',\n laserDistance: '激光测距',\n slope: '坡度',\n spaceVolume: '空间体积',\n },\n actions: {\n expand: '展开',\n collapse: '收起',\n clearAll: '删除全部',\n settings: '设置',\n },\n labels: {\n currentMode: '当前测量方式:',\n x: 'X:',\n y: 'Y:',\n z: 'Z:',\n value: {\n distance: '距离:',\n minDistance: '最小距离:',\n angle: '角度:',\n elevation: '标高:',\n volume: '体积:',\n laserDistance: '激光测距:',\n slope: '坡度:',\n spaceVolume: '空间体积:',\n }\n },\n units: {\n mm: 'mm',\n cm: 'cm',\n m: 'm',\n km: 'km',\n deg: '°',\n m3: 'm³',\n percent: '%',\n },\n settings: {\n title: '设置',\n unit: '单位:',\n precision: '精度:',\n hint: '距离、最小距离和标高默认使用该单位;角度和体积有各自默认单位。',\n save: '保存设置',\n cancel: '取消',\n }\n },\n sectionPlane: {\n dialogTitle: '拾取面剖切',\n actions: {\n hide: '隐藏',\n reverse: '反向',\n reset: '重置'\n }\n },\n sectionAxis: {\n dialogTitle: '轴向剖切',\n actions: {\n hide: '隐藏',\n reverse: '反向',\n axisX: 'X',\n axisY: 'Y',\n axisZ: 'Z'\n }\n },\n sectionBox: {\n dialogTitle: '剖切盒',\n actions: {\n hide: '隐藏',\n reverse: '反向',\n fitToModel: '适应',\n reset: '重置'\n },\n axes: {\n x: 'X',\n y: 'Y',\n z: 'Z'\n }\n },\n walkControl: {\n speed: '移动速度:',\n gravity: '重力',\n collision: '碰撞',\n characterModel: {\n label: '建筑工人',\n constructionWorker: '建筑工人',\n officeMale: '办公室男性'\n },\n walkMode: {\n label: '行走模式',\n walk: '行走模式',\n run: '奔跑模式'\n },\n exit: '退出',\n path: {\n dialogTitle: '路径漫游'\n }\n },\n map: {\n dialogTitle: '地图'\n }\n};\n","import {TranslationDictionary} from './types';\n\nexport const enUS: TranslationDictionary = {\n common: {\n title: 'BimEngine',\n description: 'This is a BIM-ENGINE demo.',\n openTestDialog: 'Open Test Dialog',\n openInfoDialog: 'Open Info Dialog (Wrapped)',\n },\n toolbar: {\n home: 'Home',\n measure: 'Measure',\n zoomBox: 'Zoom Box',\n info: 'Info',\n location: 'Location',\n setting: 'Settings',\n walk: 'Walk',\n map: 'Map',\n property: 'Property',\n fullscreen: 'Fullscreen',\n walkPerson: 'Person',\n walkBird: 'Bird Eye',\n walkMenu: 'Menu',\n tree: 'Tree',\n section: 'Section',\n sectionPlane: 'Plane Section',\n sectionAxis: 'Axis Section',\n sectionBox: 'Section Box'\n },\n dialog: {\n testTitle: 'Test Dialog',\n testContent: '
    This is a draggable and resizable dialog.

    Try dragging the title bar or resizing from the bottom-right corner.
    ',\n },\n menu: {\n info: 'Info',\n home: 'Home',\n },\n tree: {\n searchPlaceholder: 'Please enter content to search',\n },\n constructTree: {\n title: 'Construct Tree',\n },\n tab: {\n component: 'Component',\n system: 'System',\n space: 'Space',\n },\n panel: {\n property: {\n title: 'Component Details',\n base: 'Basic Info',\n material: 'Material',\n advanced: 'Advanced',\n tab: {\n props: 'Properties',\n material: 'Material'\n }\n }\n },\n measure: {\n btnName: 'Measure',\n dialogTitle: 'Measure',\n modes: {\n distance: 'Distance',\n minDistance: 'Min Distance',\n angle: 'Angle',\n elevation: 'Elevation',\n volume: 'Volume',\n laserDistance: 'Laser Distance',\n slope: 'Slope',\n spaceVolume: 'Space Volume',\n },\n actions: {\n expand: 'Expand',\n collapse: 'Collapse',\n clearAll: 'Clear All',\n settings: 'Settings',\n },\n labels: {\n currentMode: 'Mode:',\n x: 'X:',\n y: 'Y:',\n z: 'Z:',\n value: {\n distance: 'Distance:',\n minDistance: 'Min Distance:',\n angle: 'Angle:',\n elevation: 'Elevation:',\n volume: 'Volume:',\n laserDistance: 'Laser Distance:',\n slope: 'Slope:',\n spaceVolume: 'Space Volume:',\n }\n },\n units: {\n mm: 'mm',\n cm: 'cm',\n m: 'm',\n km: 'km',\n deg: '°',\n m3: 'm³',\n percent: '%',\n },\n settings: {\n title: 'Settings',\n unit: 'Unit:',\n precision: 'Precision:',\n hint: 'Distance, min distance and elevation use this unit by default; angle and volume use their own units.',\n save: 'Save',\n cancel: 'Cancel',\n }\n },\n sectionPlane: {\n dialogTitle: 'Plane Section',\n actions: {\n hide: 'Hide',\n reverse: 'Reverse',\n reset: 'Reset'\n }\n },\n sectionAxis: {\n dialogTitle: 'Axis Section',\n actions: {\n hide: 'Hide',\n reverse: 'Reverse',\n axisX: 'X',\n axisY: 'Y',\n axisZ: 'Z'\n }\n },\n sectionBox: {\n dialogTitle: 'Section Box',\n actions: {\n hide: 'Hide',\n reverse: 'Reverse',\n fitToModel: 'Fit',\n reset: 'Reset'\n },\n axes: {\n x: 'X',\n y: 'Y',\n z: 'Z'\n }\n },\n walkControl: {\n speed: 'Speed:',\n gravity: 'Gravity',\n collision: 'Collision',\n characterModel: {\n label: 'Construction Worker',\n constructionWorker: 'Construction Worker',\n officeMale: 'Office Male'\n },\n walkMode: {\n label: 'Walk Mode',\n walk: 'Walk',\n run: 'Run'\n },\n exit: 'Exit',\n path: {\n dialogTitle: 'Path Walk'\n }\n },\n map: {\n dialogTitle: 'Map'\n }\n};\n","import { LocaleType, TranslationDictionary } from '../locales/types';\nimport { zhCN } from '../locales/zh-CN';\nimport { enUS } from '../locales/en-US';\n\ntype LocaleChangeListener = (locale: LocaleType) => void;\n\n/**\n * 语言管理器类\n */\nexport class LocaleManager {\n private currentLocale: LocaleType = 'zh-CN';\n private messages: Record = {\n 'zh-CN': zhCN,\n 'en-US': enUS,\n };\n private listeners: LocaleChangeListener[] = [];\n\n constructor() {\n // 默认初始化\n }\n\n /**\n * 获取当前语言\n */\n public getLocale(): LocaleType {\n return this.currentLocale;\n }\n\n /**\n * 切换语言\n */\n public setLocale(locale: LocaleType) {\n if (this.currentLocale === locale) return;\n this.currentLocale = locale;\n this.notifyListeners();\n }\n\n /**\n * 翻译核心方法\n */\n public t(key: string): string {\n if (!key) return '';\n \n const keys = key.split('.');\n let value: any = this.messages[this.currentLocale];\n \n for (const k of keys) {\n if (value && typeof value === 'object' && k in value) {\n value = value[k];\n } else {\n return key;\n }\n }\n return value as string;\n }\n\n /**\n * 订阅变更\n */\n public subscribe(listener: LocaleChangeListener): () => void {\n this.listeners.push(listener);\n return () => {\n this.listeners = this.listeners.filter(l => l !== listener);\n };\n }\n\n private notifyListeners() {\n this.listeners.forEach(listener => listener(this.currentLocale));\n }\n}\n\n// --- 导出单例 ---\nexport const localeManager = new LocaleManager();\n\n// --- 导出便捷方法 ---\n/**\n * 全局翻译函数\n * @param key 键路径 (如 'toolbar.home')\n */\nexport const t = (key: string): string => localeManager.t(key);\n","import { ThemeConfig } from './types';\n\n/**\n * Tailwind CSS 调色板参考(维护者参考)\n * \n * Slate: #f8fafc #f1f5f9 #e2e8f0 #cbd5e1 #94a3b8 #64748b #475569 #334155 #1e293b #0f172a\n * Blue: #eff6ff #dbeafe #bfdbfe #93c5fd #60a5fa #3b82f6 #2563eb #1d4ed8 #1e40af #1e3a8a\n * Green: #f0fdf4 #dcfce7 #bbf7d0 #86efac #4ade80 #22c55e #16a34a #15803d #166534 #14532d\n * Amber: #fffbeb #fef3c7 #fde68a #fcd34d #fbbf24 #f59e0b #d97706 #b45309 #92400e #78350f\n * Red: #fef2f2 #fee2e2 #fecaca #fca5a5 #f87171 #ef4444 #dc2626 #b91c1c #991b1b #7f1d1d\n * Cyan: #ecfeff #cffafe #a5f3fc #67e8f9 #22d3ee #06b6d4 #0891b2 #0e7490 #155e75 #164e63\n */\n\nexport const lightTheme: ThemeConfig = {\n name: 'light',\n\n primary: '#2563eb',\n primaryHover: '#1d4ed8',\n primaryActive: '#1e40af',\n primarySubtle: 'rgba(37, 99, 235, 0.1)',\n\n success: '#16a34a',\n successHover: '#15803d',\n successSubtle: 'rgba(22, 163, 74, 0.1)',\n\n warning: '#d97706',\n warningHover: '#b45309',\n warningSubtle: 'rgba(217, 119, 6, 0.1)',\n\n danger: '#dc2626',\n dangerHover: '#b91c1c',\n dangerSubtle: 'rgba(220, 38, 38, 0.1)',\n\n info: '#0891b2',\n infoHover: '#0e7490',\n infoSubtle: 'rgba(8, 145, 178, 0.1)',\n\n bgBase: '#f8fafc',\n bgElevated: '#ffffff',\n bgOverlay: 'rgba(255, 255, 255, 0.98)',\n bgInset: '#f1f5f9',\n bgGlass: 'rgba(255, 255, 255, 0.8)',\n bgGlassBlur: '24px',\n\n textPrimary: '#0f172a',\n textSecondary: '#475569',\n textTertiary: '#94a3b8',\n textDisabled: '#cbd5e1',\n textInverse: '#ffffff',\n textLink: '#2563eb',\n textLinkHover: '#1d4ed8',\n\n iconDefault: '#64748b',\n iconHover: '#334155',\n iconActive: '#2563eb',\n iconDisabled: '#cbd5e1',\n iconInverse: '#ffffff',\n\n borderDefault: '#e2e8f0',\n borderSubtle: '#f1f5f9',\n borderStrong: '#cbd5e1',\n borderDisabled: '#f1f5f9',\n divider: '#e2e8f0',\n\n componentBg: 'transparent',\n componentBgHover: 'rgba(15, 23, 42, 0.04)',\n componentBgActive: 'rgba(15, 23, 42, 0.08)',\n componentBgSelected: 'rgba(37, 99, 235, 0.08)',\n componentBgDisabled: '#f8fafc',\n\n focusRing: 'rgba(37, 99, 235, 0.5)',\n focusRingOffset: '#ffffff',\n selectionBg: 'rgba(37, 99, 235, 0.15)',\n selectionText: '#0f172a',\n\n shadowSm: '0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08)',\n shadowMd: '0 4px 12px rgba(0, 0, 0, 0.12), 0 6px 20px rgba(0, 0, 0, 0.1)',\n shadowLg: '0 10px 25px rgba(0, 0, 0, 0.15), 0 6px 10px rgba(0, 0, 0, 0.1)',\n shadowXl: '0 20px 40px rgba(0, 0, 0, 0.2), 0 10px 15px rgba(0, 0, 0, 0.1)',\n shadowGlow: '0 2px 8px rgba(59, 130, 246, 0.3), 0 4px 16px rgba(59, 130, 246, 0.2)',\n\n scrollbarTrack: '#f1f5f9',\n scrollbarThumb: '#cbd5e1',\n scrollbarThumbHover: '#94a3b8',\n\n floatingBg: 'rgba(255, 255, 255, 0.8)',\n floatingBorder: 'rgba(226, 232, 240, 0.5)',\n floatingShadow: '0 4px 24px rgba(0, 0, 0, 0.06)',\n floatingBtnBg: 'rgba(255, 255, 255, 0.9)',\n floatingBtnBorder: 'rgba(203, 213, 225, 0.6)',\n floatingBtnShadow: '0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08)',\n floatingBtnBgHover: '#ffffff',\n floatingBtnShadowHover: '0 4px 12px rgba(0, 0, 0, 0.12), 0 6px 20px rgba(0, 0, 0, 0.1)',\n floatingIconColor: '#334155',\n floatingIconColorHover: '#1e293b',\n\n panelBg: 'rgba(255, 255, 255, 0.95)',\n panelBorder: 'rgba(226, 232, 240, 0.6)',\n panelHeaderBg: 'rgba(248, 250, 252, 0.9)',\n panelRadius: '12px',\n\n tabBg: '#f1f5f9',\n tabItemBg: 'transparent',\n tabItemBgHover: 'rgba(255, 255, 255, 0.6)',\n tabItemBgActive: '#ffffff',\n tabItemTextActive: '#2563eb',\n\n overrides: {\n dialog: {\n headerBg: '#f8fafc',\n },\n toolbar: {\n bg: 'rgba(255, 255, 255, 0.9)',\n buttonBg: 'rgba(255, 255, 255, 0.95)',\n buttonBgHover: '#ffffff',\n buttonBgActive: '#2563eb',\n },\n input: {\n bg: '#ffffff',\n bgFocus: '#ffffff',\n placeholder: '#94a3b8',\n },\n },\n};\n\nexport const darkTheme: ThemeConfig = {\n name: 'dark',\n\n primary: '#3b82f6',\n primaryHover: '#60a5fa',\n primaryActive: '#2563eb',\n primarySubtle: 'rgba(59, 130, 246, 0.15)',\n\n success: '#22c55e',\n successHover: '#4ade80',\n successSubtle: 'rgba(34, 197, 94, 0.15)',\n\n warning: '#f59e0b',\n warningHover: '#fbbf24',\n warningSubtle: 'rgba(245, 158, 11, 0.15)',\n\n danger: '#ef4444',\n dangerHover: '#f87171',\n dangerSubtle: 'rgba(239, 68, 68, 0.15)',\n\n info: '#06b6d4',\n infoHover: '#22d3ee',\n infoSubtle: 'rgba(6, 182, 212, 0.15)',\n\n bgBase: '#152232',\n bgElevated: '#1f2d3e',\n bgOverlay: 'rgba(21, 34, 50, 0.98)',\n bgInset: '#152232',\n bgGlass: 'rgba(21, 34, 50, 0.85)',\n bgGlassBlur: '24px',\n\n textPrimary: '#ffffff',\n textSecondary: '#94a3b8',\n textTertiary: '#64748b',\n textDisabled: '#475569',\n textInverse: '#152232',\n textLink: '#60a5fa',\n textLinkHover: '#93c5fd',\n\n iconDefault: '#ffffff',\n iconHover: '#ffffff',\n iconActive: '#3b82f6',\n iconDisabled: '#475569',\n iconInverse: '#152232',\n\n borderDefault: 'rgba(51, 65, 85, 0.5)',\n borderSubtle: 'rgba(51, 65, 85, 0.5)',\n borderStrong: '#475569',\n borderDisabled: '#1e293b',\n divider: '#334155',\n\n componentBg: 'transparent',\n componentBgHover: 'rgba(248, 250, 252, 0.06)',\n componentBgActive: 'rgba(248, 250, 252, 0.1)',\n componentBgSelected: 'rgba(59, 130, 246, 0.2)',\n componentBgDisabled: '#1e293b',\n\n focusRing: 'rgba(59, 130, 246, 0.5)',\n focusRingOffset: '#1e293b',\n selectionBg: 'rgba(59, 130, 246, 0.3)',\n selectionText: '#f8fafc',\n\n shadowSm: '0 2px 8px rgba(0, 0, 0, 0.4), 0 4px 12px rgba(0, 0, 0, 0.3)',\n shadowMd: '0 4px 12px rgba(0, 0, 0, 0.5), 0 6px 20px rgba(0, 0, 0, 0.4)',\n shadowLg: '0 10px 25px rgba(0, 0, 0, 0.6), 0 6px 10px rgba(0, 0, 0, 0.4)',\n shadowXl: '0 20px 40px rgba(0, 0, 0, 0.7), 0 10px 15px rgba(0, 0, 0, 0.5)',\n shadowGlow: '0 2px 8px rgba(59, 130, 246, 0.4), 0 4px 16px rgba(59, 130, 246, 0.25)',\n\n scrollbarTrack: '#1e293b',\n scrollbarThumb: '#475569',\n scrollbarThumbHover: '#64748b',\n\n floatingBg: 'rgba(15, 23, 42, 0.85)',\n floatingBorder: 'rgba(51, 65, 85, 0.4)',\n floatingShadow: '0 4px 24px rgba(0, 0, 0, 0.25)',\n floatingBtnBg: 'rgba(51, 65, 85, 0.6)',\n floatingBtnBorder: 'rgba(100, 116, 139, 0.5)',\n floatingBtnShadow: '0 2px 8px rgba(0, 0, 0, 0.3), 0 4px 12px rgba(0, 0, 0, 0.25)',\n floatingBtnBgHover: 'rgba(71, 85, 105, 0.7)',\n floatingBtnShadowHover: '0 4px 12px rgba(0, 0, 0, 0.35), 0 6px 20px rgba(0, 0, 0, 0.3)',\n floatingIconColor: '#e2e8f0',\n floatingIconColorHover: '#f8fafc',\n\n panelBg: 'rgba(15, 23, 42, 0.95)',\n panelBorder: 'rgba(51, 65, 85, 0.5)',\n panelHeaderBg: 'rgba(15, 23, 42, 0.9)',\n panelRadius: '12px',\n\n tabBg: 'rgba(30, 41, 59, 0.6)',\n tabItemBg: 'transparent',\n tabItemBgHover: 'rgba(51, 65, 85, 0.5)',\n tabItemBgActive: 'rgba(51, 65, 85, 0.8)',\n tabItemTextActive: '#60a5fa',\n\n overrides: {\n dialog: {\n headerBg: '#0f172a',\n },\n toolbar: {\n bg: 'rgba(30, 41, 59, 0.9)',\n buttonBg: 'rgba(51, 65, 85, 0.6)',\n buttonBgHover: 'rgba(71, 85, 105, 0.7)',\n buttonBgActive: '#3b82f6',\n },\n input: {\n bg: '#0f172a',\n bgFocus: '#1e293b',\n placeholder: '#64748b',\n },\n },\n};\n\nexport function createThemeFromPartial(base: ThemeConfig, partial: Partial): ThemeConfig {\n return {\n ...base,\n ...partial,\n overrides: {\n ...base.overrides,\n ...partial.overrides,\n },\n };\n}\n\nexport function getThemeByName(name: string): ThemeConfig {\n switch (name) {\n case 'light':\n return lightTheme;\n case 'dark':\n default:\n return darkTheme;\n }\n}\n","import { ThemeConfig } from '../themes/types';\nimport { darkTheme, lightTheme } from '../themes/presets';\n\ntype ThemeChangeListener = (theme: ThemeConfig) => void;\n\n/**\n * 主题管理器 (单例)\n */\nexport class ThemeManager {\n private currentTheme: ThemeConfig = lightTheme;\n private listeners: ThemeChangeListener[] = [];\n\n constructor() {\n // 默认初始化\n }\n\n /**\n * 获取当前主题配置\n */\n public getTheme(): ThemeConfig {\n return this.currentTheme;\n }\n\n /**\n * 切换预设主题\n * @param themeName 'dark' | 'light'\n */\n public setTheme(themeName: 'dark' | 'light') {\n if (themeName === 'light') {\n this.applyTheme(lightTheme);\n } else {\n this.applyTheme(darkTheme);\n }\n }\n\n /**\n * 应用自定义主题配置\n * @param theme 配置对象\n */\n public setCustomTheme(theme: ThemeConfig) {\n this.applyTheme(theme);\n }\n\n /**\n * 内部应用主题逻辑\n */\n private applyTheme(theme: ThemeConfig) {\n this.currentTheme = theme;\n this.notifyListeners();\n }\n\n /**\n * 订阅主题变更\n */\n public subscribe(listener: ThemeChangeListener): () => void {\n this.listeners.push(listener);\n // 立即回调一次当前状态\n listener(this.currentTheme);\n return () => {\n this.listeners = this.listeners.filter(l => l !== listener);\n };\n }\n\n private notifyListeners() {\n this.listeners.forEach(listener => listener(this.currentTheme));\n }\n}\n\n// 导出单例\nexport const themeManager = new ThemeManager();","/**\n * 事件发射器\n * 提供简单的发布/订阅模式实现\n */\n\n/** 事件监听器类型 */\ntype Listener = (payload: T) => void;\n\n/**\n * 事件发射器类\n * 用于组件间的事件通信\n */\nexport class EventEmitter {\n /** 事件监听器映射表 */\n private events: Map = new Map();\n\n /**\n * 订阅事件\n * @param event 事件名称\n * @param listener 事件处理函数\n * @returns 取消订阅的函数\n */\n public on(event: string, listener: Listener): () => void {\n if (!this.events.has(event)) {\n this.events.set(event, []);\n }\n this.events.get(event)!.push(listener);\n\n return () => this.off(event, listener);\n }\n\n /**\n * 取消订阅事件\n * @param event 事件名称\n * @param listener 要移除的事件处理函数\n */\n public off(event: string, listener: Listener): void {\n const listeners = this.events.get(event);\n if (!listeners) return;\n\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n\n /**\n * 发送事件\n * @param event 事件名称\n * @param payload 事件数据\n */\n public emit(event: string, payload?: any): void {\n const listeners = this.events.get(event);\n if (listeners) {\n listeners.forEach(listener => {\n try {\n listener(payload);\n } catch (error) {\n console.error(`[EventEmitter] Error in listener for event \"${event}\":`, error);\n }\n });\n }\n }\n\n /** 清除所有事件监听器 */\n public clear(): void {\n this.events.clear();\n }\n}\n","/**\n * Manager 注册表\n * 全局单例,提供所有 Manager 的集中访问点\n */\nimport { EventEmitter } from './event-emitter';\nimport type { EngineEvents } from '../types/events';\n\nimport type { ToolbarManager } from '../managers/toolbar-manager';\nimport type { DialogManager } from '../managers/dialog-manager';\nimport type { EngineManager } from '../managers/engine-manager';\nimport type { ButtonGroupManager } from '../managers/button-group-manager';\nimport type { RightKeyManager } from '../managers/right-key-manager';\nimport type { ConstructTreeManagerBtn } from '../managers/construct-tree-manager-btn';\nimport type { PropertyPanelManager } from '../managers/property-panel-manager';\nimport type { MeasureDialogManager } from '../managers/measure-dialog-manager';\nimport type { WalkControlManager } from '../managers/walk-control-manager';\nimport type { MapDialogManager } from '../managers/map-dialog-manager';\nimport type { SectionPlaneDialogManager } from '../managers/section-plane-dialog-manager';\nimport type { SectionAxisDialogManager } from '../managers/section-axis-dialog-manager';\nimport type { SectionBoxDialogManager } from '../managers/section-box-dialog-manager';\nimport type { WalkPathDialogManager } from '../managers/walk-path-dialog-manager';\nimport type { WalkPlanViewDialogManager } from '../managers/walk-plan-view-dialog-manager';\n\n/**\n * Manager 注册表 - 单例模式\n * 提供所有 Manager 的全局访问点,替代 engine 层层传递\n */\nexport class ManagerRegistry {\n /** 单例实例 */\n private static instance: ManagerRegistry | null = null;\n /** 事件发射器 */\n private eventEmitter: EventEmitter = new EventEmitter();\n\n /** 主容器元素 */\n public container: HTMLElement | null = null;\n /** 包装容器元素 */\n public wrapper: HTMLElement | null = null;\n\n /** 工具栏管理器 */\n public toolbar: ToolbarManager | null = null;\n /** 对话框管理器 */\n public dialog: DialogManager | null = null;\n /** 3D 引擎管理器 */\n public engine3d: EngineManager | null = null;\n /** 按钮组管理器 */\n public buttonGroup: ButtonGroupManager | null = null;\n /** 右键菜单管理器 */\n public rightKey: RightKeyManager | null = null;\n /** 构件树管理器 */\n public constructTree: ConstructTreeManagerBtn | null = null;\n /** 属性面板管理器 */\n public propertyPanel: PropertyPanelManager | null = null;\n /** 测量对话框管理器 */\n public measure: MeasureDialogManager | null = null;\n /** 漫游控制管理器 */\n public walkControl: WalkControlManager | null = null;\n /** 地图对话框管理器 */\n public map: MapDialogManager | null = null;\n /** 拾取面剖切对话框管理器 */\n public sectionPlane: SectionPlaneDialogManager | null = null;\n /** 轴向剖切对话框管理器 */\n public sectionAxis: SectionAxisDialogManager | null = null;\n /** 剖切盒对话框管理器 */\n public sectionBox: SectionBoxDialogManager | null = null;\n /** 漫游路径对话框管理器 */\n public walkPath: WalkPathDialogManager | null = null;\n /** 漫游平面图对话框管理器 */\n public walkPlanView: WalkPlanViewDialogManager | null = null;\n\n private constructor() {}\n\n /** 获取单例实例 */\n public static getInstance(): ManagerRegistry {\n if (!ManagerRegistry.instance) {\n ManagerRegistry.instance = new ManagerRegistry();\n }\n return ManagerRegistry.instance;\n }\n\n /** 重置单例(用于测试或重新初始化) */\n public static reset(): void {\n if (ManagerRegistry.instance) {\n ManagerRegistry.instance.eventEmitter.clear();\n ManagerRegistry.instance = null;\n }\n }\n\n /**\n * 发送事件\n * @param event 事件名称\n * @param payload 事件数据\n */\n public emit(event: K, payload: EngineEvents[K]): void {\n this.eventEmitter.emit(event, payload);\n }\n\n /**\n * 订阅事件\n * @param event 事件名称\n * @param listener 事件处理函数\n * @returns 取消订阅的函数\n */\n public on(\n event: K,\n listener: (payload: EngineEvents[K]) => void\n ): () => void {\n return this.eventEmitter.on(event, listener);\n }\n\n /**\n * 取消订阅事件\n * @param event 事件名称\n * @param listener 事件处理函数\n */\n public off(\n event: K,\n listener: (payload: EngineEvents[K]) => void\n ): void {\n this.eventEmitter.off(event, listener);\n }\n\n /** 清除所有事件监听器 */\n public clearEvents(): void {\n this.eventEmitter.clear();\n }\n}\n","import './index.css';\nimport type {\n OptButton,\n ButtonGroup,\n ButtonGroupOptions,\n ButtonConfig,\n ButtonGroupColors\n} from './index.type';\nimport { t, localeManager } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { ManagerRegistry } from '../../core/manager-registry';\nimport { EngineEvents } from '../../types/events';\n\nexport class BimButtonGroup implements IBimComponent {\n private container: HTMLElement;\n private options: ButtonGroupOptions;\n private groups: ButtonGroup[] = [];\n private activeBtnIds: Set = new Set();\n private btnRefs: Map = new Map();\n private dropdownElement: HTMLElement | null = null;\n private hoverTimeout: number | null = null;\n private customColors: Set = new Set();\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n private readonly DEFAULT_ICON = '';\n\n constructor(options: ButtonGroupOptions) {\n const el = typeof options.container === 'string'\n ? document.getElementById(options.container)\n : options.container;\n\n if (!el) throw new Error('Container not found');\n\n this.container = el;\n // 合并默认配置\n this.options = {\n showLabel: true,\n visibility: {},\n direction: 'row', // 默认横向\n position: 'static', // 默认静态定位\n align: 'vertical', // 默认图标在上\n expand: 'down', // 默认向下展开\n ...options\n };\n\n // 记录初始传入的自定义颜色\n const colorKeys: (keyof ButtonGroupColors)[] = [\n 'backgroundColor', 'btnBackgroundColor', 'btnHoverColor',\n 'btnActiveColor', 'iconColor', 'iconActiveColor',\n 'textColor', 'textActiveColor'\n ];\n colorKeys.forEach(key => {\n if (options[key]) {\n this.customColors.add(key);\n }\n });\n\n this.initContainer();\n this.applyStyles();\n }\n\n protected emit(event: K, payload: EngineEvents[K]) {\n const registry = ManagerRegistry.getInstance();\n registry.emit(event, payload);\n }\n\n private initContainer(): void {\n this.container.innerHTML = '';\n this.container.classList.add('bim-btn-group-root');\n\n if (this.options.direction === 'column') {\n this.container.classList.add('dir-column');\n } else {\n this.container.classList.add('dir-row');\n }\n\n if (this.options.className) {\n this.container.classList.add(this.options.className);\n }\n\n if (this.options.type && this.options.type !== 'default') {\n this.container.classList.add(`type-${this.options.type}`);\n }\n\n this.updatePosition();\n\n // 添加事件拦截,防止点击穿透到 3D 引擎\n this.setupEventInterception(this.container);\n }\n\n /**\n * 设置事件拦截,防止事件冒泡到下层元素(如 3D 引擎)\n */\n private setupEventInterception(el: HTMLElement): void {\n const stopPropagation = (e: Event) => {\n e.stopPropagation();\n };\n\n const events = [\n 'click', 'dblclick', 'contextmenu', 'wheel',\n 'mousedown', 'mouseup', 'mousemove',\n 'touchstart', 'touchend', 'touchmove',\n 'pointerdown', 'pointerup', 'pointermove', 'pointerenter', 'pointerleave', 'pointerover', 'pointerout'\n ];\n\n events.forEach(eventType => {\n el.addEventListener(eventType, stopPropagation, { passive: false });\n });\n }\n\n private updatePosition() {\n const pos = this.options.position;\n const style = this.container.style;\n\n style.top = ''; style.bottom = ''; style.left = ''; style.right = ''; style.transform = '';\n\n if (pos === 'static') {\n this.container.classList.add('static');\n return;\n }\n\n this.container.classList.remove('static');\n this.container.style.position = 'absolute';\n\n if (typeof pos === 'object' && 'x' in pos) {\n style.left = `${pos.x}px`;\n style.top = `${pos.y}px`;\n } else {\n const margin = '20px';\n switch (pos) {\n case 'top-left':\n style.top = margin; style.left = margin;\n break;\n case 'top-center':\n style.top = margin; style.left = '50%'; style.transform = 'translateX(-50%)';\n break;\n case 'top-right':\n style.top = margin; style.right = margin;\n break;\n case 'bottom-left':\n style.bottom = margin; style.left = margin;\n break;\n case 'bottom-center':\n style.bottom = margin; style.left = '50%'; style.transform = 'translateX(-50%)';\n break;\n case 'bottom-right':\n style.bottom = margin; style.right = margin;\n break;\n case 'left-center':\n style.left = margin; style.top = '50%'; style.transform = 'translateY(-50%)';\n break;\n case 'right-center':\n style.right = margin; style.top = '50%'; style.transform = 'translateY(-50%)';\n break;\n case 'center':\n style.top = '50%'; style.left = '50%'; style.transform = 'translate(-50%, -50%)';\n break;\n }\n }\n }\n\n /**\n * 应用样式到容器\n */\n private applyStyles(): void {\n const style = this.container.style;\n if (this.options.backgroundColor) style.setProperty('--bim-btn-group-section-bg', this.options.backgroundColor);\n if (this.options.btnBackgroundColor) style.setProperty('--bim-btn-bg', this.options.btnBackgroundColor);\n if (this.options.btnHoverColor) style.setProperty('--bim-btn-hover-bg', this.options.btnHoverColor);\n if (this.options.btnActiveColor) style.setProperty('--bim-btn-active-bg', this.options.btnActiveColor);\n if (this.options.iconColor) style.setProperty('--bim-icon-color', this.options.iconColor);\n if (this.options.iconActiveColor) style.setProperty('--bim-icon-active-color', this.options.iconActiveColor);\n if (this.options.textColor) style.setProperty('--bim-btn-text-color', this.options.textColor);\n if (this.options.textActiveColor) style.setProperty('--bim-btn-text-active-color', this.options.textActiveColor);\n\n // 同步更新所有已存在的dropdown元素的CSS变量(dropdown被添加到body,无法继承容器的CSS变量)\n const dropdowns = document.querySelectorAll('.opt-btn-dropdown');\n dropdowns.forEach(dropdown => {\n const dropdownStyle = (dropdown as HTMLElement).style;\n if (this.options.iconColor) dropdownStyle.setProperty('--bim-icon-color', this.options.iconColor);\n if (this.options.iconActiveColor) dropdownStyle.setProperty('--bim-icon-active-color', this.options.iconActiveColor);\n if (this.options.textColor) dropdownStyle.setProperty('--bim-btn-text-color', this.options.textColor);\n if (this.options.textActiveColor) dropdownStyle.setProperty('--bim-btn-text-active-color', this.options.textActiveColor);\n if (this.options.btnBackgroundColor) dropdownStyle.setProperty('--bim-btn-bg', this.options.btnBackgroundColor);\n if (this.options.btnHoverColor) dropdownStyle.setProperty('--bim-btn-hover-bg', this.options.btnHoverColor);\n if (this.options.btnActiveColor) dropdownStyle.setProperty('--bim-btn-active-bg', this.options.btnActiveColor);\n });\n }\n\n /**\n * 设置主题的primary颜色(用于边框等)\n */\n private setPrimaryColor(color: string): void {\n this.container.style.setProperty('--bim-primary-color', color);\n\n // 同步更新所有dropdown(dropdown被添加到body,无法继承容器的CSS变量)\n const dropdowns = document.querySelectorAll('.opt-btn-dropdown');\n dropdowns.forEach(dropdown => {\n (dropdown as HTMLElement).style.setProperty('--bim-primary-color', color);\n });\n }\n\n /**\n * 设置主题颜色\n * 只会应用到没有被用户自定义的颜色属性上\n */\n public setTheme(theme: ThemeConfig): void {\n const themeColors: ButtonGroupColors = {\n backgroundColor: theme.bgElevated,\n btnBackgroundColor: theme.componentBg,\n btnHoverColor: theme.componentBgHover,\n btnActiveColor: theme.componentBgActive,\n iconColor: theme.iconDefault,\n iconActiveColor: theme.iconActive,\n textColor: theme.textSecondary,\n textActiveColor: theme.textPrimary\n };\n\n Object.entries(themeColors).forEach(([key, value]) => {\n const colorKey = key as keyof ButtonGroupColors;\n if (!this.customColors.has(colorKey)) {\n this.options[colorKey] = value;\n }\n });\n\n this.container.classList.remove('theme-dark', 'theme-light');\n this.container.classList.add(`theme-${theme.name}`);\n\n this.applyStyles();\n this.setPrimaryColor(theme.primary);\n this.applyThemeCssVars(theme);\n }\n\n /**\n * 应用主题系统的 CSS 变量到容器\n * 供 glass-pill 等样式变体使用\n */\n private applyThemeCssVars(theme: ThemeConfig): void {\n const style = this.container.style;\n\n style.setProperty('--bim-primary', theme.primary);\n style.setProperty('--bim-primary-hover', theme.primaryHover);\n style.setProperty('--bim-primary-active', theme.primaryActive);\n\n style.setProperty('--bim-bg-glass', theme.bgGlass);\n style.setProperty('--bim-bg-glass-blur', theme.bgGlassBlur);\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-bg-overlay', theme.bgOverlay);\n style.setProperty('--bim-bg-inset', theme.bgInset);\n\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-secondary', theme.textSecondary);\n style.setProperty('--bim-text-tertiary', theme.textTertiary);\n style.setProperty('--bim-text-inverse', theme.textInverse);\n\n style.setProperty('--bim-icon-default', theme.iconDefault);\n style.setProperty('--bim-icon-hover', theme.iconHover);\n style.setProperty('--bim-icon-active', theme.iconActive);\n style.setProperty('--bim-icon-inverse', theme.iconInverse);\n\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-border-subtle', theme.borderSubtle);\n\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover);\n style.setProperty('--bim-component-bg-active', theme.componentBgActive);\n\n style.setProperty('--bim-shadow-sm', theme.shadowSm);\n style.setProperty('--bim-shadow-md', theme.shadowMd);\n style.setProperty('--bim-shadow-lg', theme.shadowLg);\n style.setProperty('--bim-shadow-glow', theme.shadowGlow);\n\n style.setProperty('--bim-floating-bg', theme.floatingBg);\n style.setProperty('--bim-floating-border', theme.floatingBorder);\n style.setProperty('--bim-floating-shadow', theme.floatingShadow);\n style.setProperty('--bim-floating-btn-bg', theme.floatingBtnBg);\n style.setProperty('--bim-floating-btn-border', theme.floatingBtnBorder);\n style.setProperty('--bim-floating-btn-shadow', theme.floatingBtnShadow);\n style.setProperty('--bim-floating-btn-bg-hover', theme.floatingBtnBgHover);\n style.setProperty('--bim-floating-btn-shadow-hover', theme.floatingBtnShadowHover);\n style.setProperty('--bim-floating-icon-color', theme.floatingIconColor);\n style.setProperty('--bim-floating-icon-color-hover', theme.floatingIconColorHover);\n\n this.syncDropdownCssVars(theme);\n }\n\n /**\n * 同步 CSS 变量到所有 dropdown 元素\n * dropdown 被添加到 body,无法继承容器的 CSS 变量\n */\n private syncDropdownCssVars(theme: ThemeConfig): void {\n const dropdowns = document.querySelectorAll('.opt-btn-dropdown');\n dropdowns.forEach(dropdown => {\n const style = (dropdown as HTMLElement).style;\n\n style.setProperty('--bim-primary', theme.primary);\n style.setProperty('--bim-bg-overlay', theme.bgOverlay);\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-inverse', theme.textInverse);\n style.setProperty('--bim-shadow-lg', theme.shadowLg);\n style.setProperty('--bim-floating-btn-bg', theme.floatingBtnBg);\n style.setProperty('--bim-floating-btn-bg-hover', theme.floatingBtnBgHover);\n style.setProperty('--bim-floating-icon-color', theme.floatingIconColor);\n });\n }\n\n /**\n * 直接设置颜色(强制覆盖)\n * 设置的颜色会被标记为自定义,后续的 setTheme 不会覆盖它们\n */\n public setColors(colors: ButtonGroupColors): void {\n // 更新 options\n this.options = { ...this.options, ...colors };\n\n // 标记这些颜色为自定义\n Object.keys(colors).forEach(key => {\n this.customColors.add(key as keyof ButtonGroupColors);\n });\n\n this.applyStyles();\n }\n\n public async init(): Promise {\n this.render();\n\n // 自动订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 自动订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n }\n\n public setLocales(): void {\n this.render();\n }\n\n public addGroup(groupId: string, beforeGroupId?: string): void {\n if (this.groups.some(g => g.id === groupId)) return;\n const newGroup: ButtonGroup = { id: groupId, buttons: [] };\n if (beforeGroupId) {\n const index = this.groups.findIndex(g => g.id === beforeGroupId);\n index !== -1 ? this.groups.splice(index, 0, newGroup) : this.groups.push(newGroup);\n } else {\n this.groups.push(newGroup);\n }\n }\n\n public addButton(config: ButtonConfig): void {\n const { groupId, parentId } = config;\n const group = this.groups.find(g => g.id === groupId);\n if (!group) return;\n\n const button: OptButton = { ...config, children: config.children || [] };\n if (parentId) {\n const parentBtn = this.findButton(group.buttons, parentId);\n if (parentBtn) {\n if (!parentBtn.children) parentBtn.children = [];\n parentBtn.children.push(button);\n }\n } else {\n group.buttons.push(button);\n }\n }\n\n private findButton(buttons: OptButton[], id: string): OptButton | undefined {\n for (const btn of buttons) {\n if (btn.id === id) return btn;\n if (btn.children) {\n const found = this.findButton(btn.children, id);\n if (found) return found;\n }\n }\n return undefined;\n }\n\n public render(): void {\n this.container.innerHTML = '';\n this.btnRefs.clear();\n\n this.groups.forEach((group, index) => {\n const groupElement = this.renderGroup(group, index, this.groups.length);\n this.container.appendChild(groupElement);\n });\n }\n\n private renderGroup(group: ButtonGroup, index: number, total: number): HTMLElement {\n const groupEl = document.createElement('div');\n groupEl.className = 'bim-btn-group-section';\n\n if (index < total - 1) {\n groupEl.classList.add('has-divider');\n }\n\n group.buttons.forEach(button => {\n if (this.isVisible(button.id)) {\n const btnWrapper = this.renderButton(button);\n groupEl.appendChild(btnWrapper);\n }\n });\n return groupEl;\n }\n\n private renderButton(button: OptButton): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'opt-btn-wrapper';\n\n const btnEl = document.createElement('div');\n btnEl.className = 'opt-btn';\n\n // 初始化时根据 button 自身的属性同步 active 状态\n if (button.isActive) {\n this.activeBtnIds.add(button.id);\n }\n\n // 按钮优先使用自己的 align,否则使用全局配置,默认为 vertical\n const align = button.align || this.options.align || 'vertical';\n if (align === 'horizontal') {\n btnEl.classList.add('align-horizontal');\n } else {\n btnEl.classList.add('align-vertical');\n }\n\n if (this.activeBtnIds.has(button.id)) btnEl.classList.add('active');\n if (button.disabled) btnEl.classList.add('disabled');\n\n // 判断是否显示 label\n const hasLabel = this.options.showLabel && button.label;\n if (!hasLabel) {\n btnEl.classList.add('no-label');\n // 当不显示 label 时,添加 title 属性作为 tooltip\n if (button.label) {\n btnEl.title = t(button.label);\n }\n }\n\n // 应用按钮的自定义样式\n const iconSize = button.iconSize || 32;\n const minWidth = button.minWidth || 50;\n btnEl.style.minWidth = `${minWidth}px`;\n\n const icon = document.createElement('div');\n icon.className = 'opt-btn-icon';\n icon.style.width = `${iconSize}px`;\n icon.style.height = `${iconSize}px`;\n icon.innerHTML = this.getIcon(button.icon);\n btnEl.appendChild(icon);\n\n // 创建文字和箭头的容器,确保它们始终在一起(无论主轴是横是竖)\n const textWrapper = document.createElement('div');\n textWrapper.className = 'opt-btn-text-wrapper';\n\n if (this.options.showLabel && button.label) {\n const label = document.createElement('span');\n label.className = 'opt-btn-label';\n label.textContent = t(button.label);\n textWrapper.appendChild(label);\n }\n\n // TODO: 暂时隐藏下拉箭头\n // if (button.children && button.children.length > 0) {\n // const arrow = document.createElement('span');\n // arrow.className = 'opt-btn-arrow';\n // arrow.textContent = '▼';\n // textWrapper.appendChild(arrow);\n // }\n\n // 只有当有内容时才添加 wrapper\n if (textWrapper.hasChildNodes()) {\n btnEl.appendChild(textWrapper);\n }\n\n btnEl.addEventListener('click', () => this.handleClick(button));\n btnEl.addEventListener('mouseenter', () => this.handleMouseEnter(button, btnEl));\n btnEl.addEventListener('mouseleave', () => this.handleMouseLeave());\n\n this.btnRefs.set(button.id, btnEl);\n wrapper.appendChild(btnEl);\n return wrapper;\n }\n\n /**\n * 设置按钮的激活状态\n * @param id 按钮 ID\n * @param active 可选,如果不传则切换(toggle)当前状态\n */\n public setBtnActive(id: string, active?: boolean): void {\n const button = this.findButtonById(id);\n if (!button) return;\n\n // 确定最终状态\n const newState = active !== undefined ? active : !this.activeBtnIds.has(id);\n\n if (newState) {\n this.activeBtnIds.add(id);\n } else {\n this.activeBtnIds.delete(id);\n }\n\n // 同步对象状态并更新 DOM\n button.isActive = newState;\n this.updateButtonState(id);\n }\n\n private handleClick(button: OptButton): void {\n if (button.disabled) return;\n if (!button.children || button.children.length === 0) {\n if (button.keepActive) {\n // 1) 先切换自身激活状态(onClick 里通常会根据 isActive 决定“打开/关闭”逻辑)\n const wasActive = this.activeBtnIds.has(button.id);\n const newState = !wasActive;\n this.setBtnActive(button.id, newState);\n\n // 2) 互斥逻辑:仅在“本次切换为激活”时触发\n // - 一级按钮:同 groupId 下其它一级按钮互斥\n // - 二级按钮:同 groupId + 同 parentId 下其它二级按钮互斥\n // - 被关闭的按钮需要触发 onClick(用于执行关闭逻辑)\n if (newState && button.exclusive && button.groupId) {\n this.deactivateExclusiveSiblings(button);\n }\n }\n this.closeDropdown();\n if (button.onClick) button.onClick(button);\n }\n }\n\n /**\n * 互斥关闭同范围内的其它已激活按钮,并触发它们的 onClick\n * @param button 当前被激活的按钮\n */\n private deactivateExclusiveSiblings(button: OptButton): void {\n const group = this.groups.find(g => g.id === button.groupId);\n if (!group) return;\n\n // 二级按钮:同 groupId + 同 parentId\n if (button.parentId) {\n const parent = this.findButton(group.buttons, button.parentId);\n const siblings = parent?.children || [];\n for (const sib of siblings) {\n if (!sib) continue;\n if (sib.id === button.id) continue;\n if (sib.parentId !== button.parentId) continue;\n if (sib.groupId !== button.groupId) continue;\n\n if (this.activeBtnIds.has(sib.id)) {\n this.setBtnActive(sib.id, false);\n // 触发被关闭按钮的 onClick(此时 sib.isActive 已经同步为 false)\n if (sib.onClick) sib.onClick(sib);\n }\n }\n return;\n }\n\n // 一级按钮:同 groupId 下其它一级按钮(不包含二级)\n for (const sib of group.buttons) {\n if (sib.id === button.id) continue;\n if (sib.groupId !== button.groupId) continue;\n if (sib.parentId) continue; // 只处理一级按钮\n\n if (this.activeBtnIds.has(sib.id)) {\n this.setBtnActive(sib.id, false);\n if (sib.onClick) sib.onClick(sib);\n }\n }\n }\n\n private handleMouseEnter(button: OptButton, btnEl: HTMLElement): void {\n if (this.hoverTimeout) clearTimeout(this.hoverTimeout);\n if (button.children && button.children.length > 0) {\n this.showDropdown(button, btnEl);\n } else {\n this.closeDropdown();\n }\n }\n\n private handleMouseLeave(): void {\n this.hoverTimeout = window.setTimeout(() => this.closeDropdown(), 200);\n }\n\n private showDropdown(button: OptButton, btnEl: HTMLElement): void {\n this.closeDropdown();\n if (!button.children) return;\n\n const dropdown = document.createElement('div');\n dropdown.className = 'opt-btn-dropdown';\n if (this.options.backgroundColor) dropdown.style.setProperty('--bim-toolbar-bg', this.options.backgroundColor);\n\n // 将主题CSS变量复制到dropdown元素上(因为dropdown被添加到body,无法继承容器的CSS变量)\n const dropdownStyle = dropdown.style;\n if (this.options.iconColor) dropdownStyle.setProperty('--bim-icon-color', this.options.iconColor);\n if (this.options.iconActiveColor) dropdownStyle.setProperty('--bim-icon-active-color', this.options.iconActiveColor);\n if (this.options.textColor) dropdownStyle.setProperty('--bim-btn-text-color', this.options.textColor);\n if (this.options.textActiveColor) dropdownStyle.setProperty('--bim-btn-text-active-color', this.options.textActiveColor);\n if (this.options.btnBackgroundColor) dropdownStyle.setProperty('--bim-btn-bg', this.options.btnBackgroundColor);\n if (this.options.btnHoverColor) dropdownStyle.setProperty('--bim-btn-hover-bg', this.options.btnHoverColor);\n if (this.options.btnActiveColor) dropdownStyle.setProperty('--bim-btn-active-bg', this.options.btnActiveColor);\n\n // 获取按钮的位置信息\n const btnRect = btnEl.getBoundingClientRect();\n const expand = this.options.expand || 'down';\n\n // 根据主按钮组的方向设置下拉菜单的布局方向\n if (this.options.direction === 'row') {\n dropdown.style.flexDirection = 'column'; // 横向按钮组,菜单纵向排列\n } else {\n dropdown.style.flexDirection = 'row'; // 纵向按钮组,菜单横向排列\n }\n\n if (this.options.type && this.options.type !== 'default') {\n dropdown.classList.add(`type-${this.options.type}`);\n }\n\n const currentTheme = themeManager.getTheme();\n dropdown.classList.add(`theme-${currentTheme.name}`);\n\n dropdownStyle.setProperty('--bim-primary', currentTheme.primary);\n dropdownStyle.setProperty('--bim-bg-overlay', currentTheme.bgOverlay);\n dropdownStyle.setProperty('--bim-border-default', currentTheme.borderDefault);\n dropdownStyle.setProperty('--bim-text-primary', currentTheme.textPrimary);\n dropdownStyle.setProperty('--bim-text-inverse', currentTheme.textInverse);\n dropdownStyle.setProperty('--bim-shadow-lg', currentTheme.shadowLg);\n dropdownStyle.setProperty('--bim-floating-btn-bg', currentTheme.floatingBtnBg);\n dropdownStyle.setProperty('--bim-floating-btn-bg-hover', currentTheme.floatingBtnBgHover);\n dropdownStyle.setProperty('--bim-floating-icon-color', currentTheme.floatingIconColor);\n\n document.body.appendChild(dropdown);\n\n // 添加事件拦截\n this.setupEventInterception(dropdown);\n\n // 添加菜单项\n button.children.forEach(subBtn => {\n if (this.isVisible(subBtn.id)) {\n const item = this.renderDropdownItem(subBtn);\n dropdown.appendChild(item);\n }\n });\n\n // 获取下拉菜单的实际尺寸\n const dropdownRect = dropdown.getBoundingClientRect();\n\n if (expand === 'up') {\n // 向上展开,与按钮水平居中对齐\n dropdown.style.bottom = (window.innerHeight - btnRect.top + 8) + 'px';\n dropdown.style.left = (btnRect.left + (btnRect.width - dropdownRect.width) / 2) + 'px';\n } else if (expand === 'down') {\n // 向下展开,与按钮水平居中对齐\n dropdown.style.top = (btnRect.bottom + 8) + 'px';\n dropdown.style.left = (btnRect.left + (btnRect.width - dropdownRect.width) / 2) + 'px';\n } else if (expand === 'right') {\n // 向右展开,与按钮垂直居中对齐\n dropdown.style.top = (btnRect.top + (btnRect.height - dropdownRect.height) / 2) + 'px';\n dropdown.style.left = (btnRect.right + 8) + 'px';\n } else if (expand === 'left') {\n // 向左展开,与按钮垂直居中对齐\n dropdown.style.top = (btnRect.top + (btnRect.height - dropdownRect.height) / 2) + 'px';\n dropdown.style.right = (window.innerWidth - btnRect.left + 8) + 'px';\n }\n\n dropdown.addEventListener('mouseenter', () => { if (this.hoverTimeout) clearTimeout(this.hoverTimeout); });\n dropdown.addEventListener('mouseleave', () => this.handleMouseLeave());\n this.dropdownElement = dropdown;\n }\n\n private renderDropdownItem(button: OptButton): HTMLElement {\n const item = document.createElement('div');\n item.className = 'opt-btn-dropdown-item';\n\n // 应用按钮的 align 设置,默认为 horizontal(图标在左)\n const align = button.align || 'horizontal';\n if (align === 'horizontal') {\n item.classList.add('align-horizontal');\n } else {\n item.classList.add('align-vertical');\n }\n\n // 二级菜单项的 active 状态渲染(修复 keepActive 在二级按钮“看起来不生效”的问题)\n // 说明:\n // - keepActive 的状态会记录在 activeBtnIds / button.isActive 上\n // - 下拉菜单每次打开都会重新渲染,因此必须在这里同步一次 active 样式\n if (this.activeBtnIds.has(button.id) || button.isActive) {\n item.classList.add('active');\n }\n\n // 应用按钮的自定义样式\n const iconSize = button.iconSize || 32; // 二级菜单默认图标更小\n const minWidth = button.minWidth; // 不设置默认值,让下拉菜单项保持紧凑\n if (minWidth) {\n item.style.minWidth = `${minWidth}px`;\n }\n\n const icon = document.createElement('div');\n icon.className = 'opt-btn-icon';\n icon.style.width = `${iconSize}px`;\n icon.style.height = `${iconSize}px`;\n icon.innerHTML = this.getIcon(button.icon);\n item.appendChild(icon);\n\n // 只有在 showLabel 为 true 时才显示 label\n if (this.options.showLabel && button.label) {\n const label = document.createElement('span');\n label.className = 'opt-btn-dropdown-label';\n label.textContent = t(button.label);\n item.appendChild(label);\n } else if (button.label) {\n // 当不显示 label 时,添加 title 属性作为 tooltip\n item.title = t(button.label);\n }\n\n item.addEventListener('click', (e) => { e.stopPropagation(); this.handleClick(button); });\n return item;\n }\n\n private closeDropdown(): void {\n if (this.dropdownElement) {\n this.dropdownElement.remove();\n this.dropdownElement = null;\n }\n this.btnRefs.forEach(btnEl => {\n const arrow = btnEl.querySelector('.opt-btn-arrow');\n if (arrow) arrow.classList.remove('rotated');\n });\n }\n\n private updateButtonState(buttonId: string): void {\n const btnEl = this.btnRefs.get(buttonId);\n if (btnEl) {\n if (this.activeBtnIds.has(buttonId)) {\n btnEl.classList.add('active');\n } else {\n btnEl.classList.remove('active');\n }\n }\n }\n\n private getIcon(icon?: string): string { return icon || this.DEFAULT_ICON; }\n\n public updateButtonVisibility(id: string, visible: boolean): void {\n if (!this.options.visibility) this.options.visibility = {};\n this.options.visibility[id] = visible;\n this.render();\n }\n\n public setShowLabel(show: boolean): void {\n this.options.showLabel = show;\n this.updateLabelsVisibility();\n }\n\n private updateLabelsVisibility(): void {\n this.btnRefs.forEach((btnEl, buttonId) => {\n // 查找按钮配置\n const button = this.findButtonById(buttonId);\n if (!button) return;\n\n const hasLabel = this.options.showLabel && button.label;\n\n // 更新 no-label 类和 title 属性\n if (hasLabel) {\n btnEl.classList.remove('no-label');\n // 显示标签时,移除 title(避免重复显示)\n btnEl.removeAttribute('title');\n } else {\n btnEl.classList.add('no-label');\n // 隐藏标签时,添加 title 作为 tooltip\n if (button.label) {\n btnEl.title = t(button.label);\n }\n }\n });\n }\n\n private findButtonById(id: string): OptButton | undefined {\n for (const group of this.groups) {\n const found = this.findButton(group.buttons, id);\n if (found) return found;\n }\n return undefined;\n }\n\n public setBackgroundColor(color: string): void { this.setColors({ backgroundColor: color }); }\n private isVisible(id: string): boolean { return this.options.visibility?.[id] !== false; }\n\n public setType(type: 'default' | 'glass-pill'): void {\n this.container.classList.remove('type-default', 'type-glass-pill');\n this.options.type = type;\n\n if (type && type !== 'default') {\n this.container.classList.add(`type-${type}`);\n }\n\n this.render();\n }\n\n public getType(): 'default' | 'glass-pill' {\n return this.options.type || 'default';\n }\n\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.closeDropdown();\n this.container.innerHTML = '';\n this.btnRefs.clear();\n }\n}\n","import { BimButtonGroup } from '../index';\n\nexport class Toolbar extends BimButtonGroup {\n public async init(): Promise {\n await super.init();\n\n const { createHomeButton } = await import('./buttons/home');\n const { createZoomBoxButton } = await import('./buttons/zoom-box');\n const { createWalkMenuButton } = await import('./buttons/walk/walk-menu');\n const { createMapButton } = await import('./buttons/map');\n const { createPropertyButton } = await import('./buttons/property');\n const { createSettingButton } = await import('./buttons/setting');\n const { createInfoButton } = await import('./buttons/info');\n const { createFullscreenButton } = await import('./buttons/fullscreen');\n const { createMeasureButton } = await import('./buttons/measure');\n const { createSectionMenuButton } = await import('./buttons/section/section-menu');\n const { createSectionPlaneButton } = await import('./buttons/section/section-plane');\n const { createSectionAxisButton } = await import('./buttons/section/section-axis');\n const { createSectionBoxButton } = await import('./buttons/section/section-box');\n\n this.addGroup('group-1');\n\n this.addButton(createHomeButton());\n this.addButton(createZoomBoxButton());\n this.addButton(createMeasureButton());\n this.addButton(createSectionMenuButton());\n this.addButton(createSectionPlaneButton());\n this.addButton(createSectionAxisButton());\n this.addButton(createSectionBoxButton());\n this.addButton(createWalkMenuButton());\n this.addButton(createMapButton());\n this.addButton(createPropertyButton());\n this.addGroup('group-2');\n this.addButton(createSettingButton());\n this.addButton(createInfoButton());\n this.addButton(createFullscreenButton());\n\n this.render();\n }\n}\n","/**\n * Manager 基类\n * 提供所有 Manager 的通用功能\n */\nimport { ManagerRegistry } from './manager-registry';\nimport type { EngineEvents } from '../types/events';\n\n/**\n * Manager 抽象基类\n * - 自动获取 Registry 实例\n * - 自动管理事件订阅的清理\n */\nexport abstract class BaseManager {\n /** 注册表实例 */\n protected registry: ManagerRegistry;\n /** 事件订阅列表,用于自动清理 */\n private subscriptions: Array<() => void> = [];\n\n constructor() {\n this.registry = ManagerRegistry.getInstance();\n }\n\n /**\n * 订阅事件(自动追踪,destroy 时自动取消)\n * @param event 事件名称\n * @param handler 事件处理函数\n */\n protected subscribe(\n event: K,\n handler: (payload: EngineEvents[K]) => void\n ): void {\n const unsubscribe = this.registry.on(event, handler);\n this.subscriptions.push(unsubscribe);\n }\n\n /**\n * 发送事件\n * @param event 事件名称\n * @param payload 事件数据\n */\n protected emit(\n event: K,\n payload: EngineEvents[K]\n ): void {\n this.registry.emit(event, payload);\n }\n\n /**\n * 销毁 Manager,清理所有订阅\n * 子类应该调用 super.destroy()\n */\n public destroy(): void {\n this.subscriptions.forEach(unsub => unsub());\n this.subscriptions = [];\n }\n}\n","/**\n * 工具栏管理器\n * 负责管理底部工具栏的创建、按钮配置和显示控制\n */\nimport type { ButtonGroupColors, ButtonConfig } from '../components/button-group/index.type';\nimport { Toolbar } from '../components/button-group/toolbar';\nimport type { ThemeConfig } from '../themes/types';\nimport { BaseManager } from '../core/base-manager';\n\n/**\n * 工具栏管理器\n * 提供工具栏按钮的添加、显示/隐藏、主题更新等功能\n */\nexport class ToolbarManager extends BaseManager {\n /** 工具栏实例 */\n private toolbar: Toolbar | null = null;\n /** 工具栏容器元素 */\n private toolbarContainer: HTMLElement | null = null;\n /** 主容器元素 */\n private container: HTMLElement;\n\n constructor(container: HTMLElement) {\n super();\n this.container = container;\n this.init();\n }\n\n /** 初始化工具栏 */\n private init() {\n this.toolbarContainer = document.createElement('div');\n this.toolbarContainer.id = 'opt-btn-groups';\n this.toolbarContainer.className = 'bim-engine-opt-btn-container is-bottom-toolbar';\n this.container.appendChild(this.toolbarContainer);\n\n this.toolbar = new Toolbar({\n container: this.toolbarContainer,\n type: 'glass-pill',\n showLabel: true,\n direction: 'row',\n position: 'bottom-right',\n align: 'vertical',\n expand: 'up'\n });\n\n this.toolbar.init();\n }\n\n /**\n * 更新工具栏主题\n * @param theme 主题配置\n */\n public updateTheme(theme: ThemeConfig) {\n this.toolbar?.setTheme(theme);\n }\n\n /** 刷新工具栏渲染 */\n public refresh() {\n this.toolbar?.render();\n }\n\n /** 销毁工具栏 */\n public destroy() {\n this.toolbar?.destroy();\n this.toolbar = null;\n super.destroy();\n }\n\n /**\n * 添加按钮组\n * @param groupId 组 ID\n * @param beforeGroupId 插入到指定组之前\n */\n public addGroup(groupId: string, beforeGroupId?: string) {\n this.toolbar?.addGroup(groupId, beforeGroupId);\n this.toolbar?.render();\n }\n\n /**\n * 添加按钮\n * @param config 按钮配置\n */\n public addButton(config: ButtonConfig) {\n this.toolbar?.addButton(config);\n this.toolbar?.render();\n }\n\n /**\n * 设置按钮可见性\n * @param id 按钮 ID\n * @param v 是否可见\n */\n public setButtonVisibility(id: string, v: boolean) {\n this.toolbar?.updateButtonVisibility(id, v);\n }\n\n /**\n * 设置是否显示标签\n * @param show 是否显示\n */\n public setShowLabel(show: boolean) {\n this.toolbar?.setShowLabel(show);\n }\n\n /**\n * 设置按钮激活状态\n * @param id 按钮 ID\n * @param active 是否激活\n */\n public setBtnActive(id: string, active?: boolean) {\n this.toolbar?.setBtnActive(id, active);\n }\n\n /**\n * 设置工具栏可见性\n * @param visible 是否可见\n */\n public setVisible(visible: boolean) {\n if (this.toolbarContainer) {\n this.toolbarContainer.style.visibility = visible ? 'visible' : 'hidden';\n }\n }\n\n /**\n * 设置背景颜色\n * @param color 颜色值\n */\n public setBackgroundColor(color: string) {\n this.toolbar?.setBackgroundColor(color);\n }\n\n /**\n * 设置按钮组颜色\n * @param colors 颜色配置\n */\n public setColors(colors: ButtonGroupColors) {\n this.toolbar?.setColors(colors);\n }\n\n /** 隐藏工具栏 */\n public hide(): void {\n if (this.toolbarContainer) {\n this.toolbarContainer.style.display = 'none';\n }\n }\n\n /** 显示工具栏 */\n public show(): void {\n if (this.toolbarContainer) {\n this.toolbarContainer.style.display = '';\n }\n }\n\n /**\n * 获取工具栏容器\n * @returns 容器元素\n */\n public getContainer(): HTMLElement | null {\n return this.toolbarContainer;\n }\n\n public setType(type: 'default' | 'glass-pill'): void {\n this.toolbar?.setType(type);\n }\n\n public getType(): 'default' | 'glass-pill' {\n return this.toolbar?.getType() || 'default';\n }\n}\n","/**\n * 按钮组管理器\n * 负责创建和管理按钮组实例\n */\nimport { BimButtonGroup } from '../components/button-group';\nimport type { ButtonGroupOptions } from '../components/button-group/index.type';\nimport type { ThemeConfig } from '../themes/types';\nimport { BaseManager } from '../core/base-manager';\n\n/**\n * 按钮组管理器\n * 统一管理多个按钮组的创建、主题更新和销毁\n */\nexport class ButtonGroupManager extends BaseManager {\n /** 按钮组映射表 */\n private groups: Map = new Map();\n /** 容器元素 */\n private container: HTMLElement;\n\n constructor(container: HTMLElement) {\n super();\n this.container = container;\n }\n\n /**\n * 创建按钮组\n * @param id 按钮组 ID\n * @param options 按钮组配置\n * @returns 按钮组实例\n */\n public create(id: string, options: Omit): BimButtonGroup {\n const group = new BimButtonGroup({\n container: this.container,\n ...options\n });\n\n group.init();\n this.groups.set(id, group);\n return group;\n }\n\n /**\n * 获取按钮组\n * @param id 按钮组 ID\n * @returns 按钮组实例\n */\n public get(id: string): BimButtonGroup | undefined {\n return this.groups.get(id);\n }\n\n /**\n * 更新所有按钮组的主题\n * @param theme 主题配置\n */\n public updateTheme(theme: ThemeConfig) {\n this.groups.forEach(group => group.setTheme(theme));\n }\n\n /** 销毁管理器和所有按钮组 */\n public destroy() {\n this.groups.forEach(group => group.destroy());\n this.groups.clear();\n super.destroy();\n }\n}\n","import './index.css';\nimport type { DialogOptions } from './index.type';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { themeManager } from '../../services/theme';\nimport { t, localeManager } from '../../services/locale';\n\n/**\n * 通用弹窗组件类\n * 支持拖拽、缩放、自定义内容和位置。\n */\nexport class BimDialog implements IBimComponent {\n private element: HTMLElement;\n private options: DialogOptions;\n private container: HTMLElement;\n private header: HTMLElement;\n private contentArea: HTMLElement;\n private _isDestroyed = false;\n private _isInitialized = false;\n private unsubscribeTheme: (() => void) | null = null;\n private unsubscribeLocale: (() => void) | null = null;\n\n // 性能优化:用于存储 requestAnimationFrame 的 ID\n private rafId: number | null = null;\n\n /**\n * 构造函数\n * @param options 弹窗配置选项\n */\n constructor(options: DialogOptions) {\n // 合并默认配置\n this.options = {\n title: 'Dialog',\n width: 300,\n height: 'auto',\n position: 'center',\n draggable: true,\n resizable: false,\n minWidth: 200,\n minHeight: 100,\n ...options\n };\n this.container = options.container;\n\n // 创建 DOM 结构\n this.element = this.createDom();\n this.header = this.element.querySelector('.bim-dialog-header') as HTMLElement;\n this.contentArea = this.element.querySelector('.bim-dialog-content') as HTMLElement;\n\n // 自动初始化 (为了兼容现有逻辑)\n this.init();\n }\n\n /**\n * 设置主题\n * @param theme 全局主题配置\n */\n public setTheme(theme: ThemeConfig) {\n const style = this.element.style;\n if (!this.options.backgroundColor) style.setProperty('--bim-dialog-bg', theme.bgElevated);\n if (!this.options.headerBackgroundColor) style.setProperty('--bim-dialog-header-bg', theme.bgInset);\n if (!this.options.titleColor) style.setProperty('--bim-dialog-title-color', theme.textPrimary);\n if (!this.options.textColor) style.setProperty('--bim-dialog-text-color', theme.textSecondary);\n if (!this.options.borderColor) style.setProperty('--bim-dialog-border-color', theme.borderDefault);\n\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-bg-inset', theme.bgInset);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-secondary', theme.textSecondary);\n style.setProperty('--bim-text-tertiary', theme.textTertiary);\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-shadow-lg', theme.shadowLg);\n }\n\n /**\n * 初始化组件功能 (接口实现)\n */\n public init() {\n if (this._isInitialized) return;\n\n this.container.appendChild(this.element);\n\n // 必须先挂载才能计算尺寸进行定位\n this.initPosition();\n\n if (this.options.draggable) {\n this.initDrag();\n }\n\n if (this.options.resizable) {\n this.initResize();\n }\n\n this._isInitialized = true;\n\n // 调用弹窗开启后回调\n if (this.options.onOpen) {\n this.options.onOpen();\n }\n\n // 自动订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 自动订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n }\n\n public setLocales(): void {\n if (this.options.title) {\n const titleEl = this.header.querySelector('.bim-dialog-title');\n if (titleEl) {\n titleEl.textContent = t(this.options.title);\n }\n }\n }\n\n /**\n * 创建弹窗的 DOM 结构\n */\n private createDom(): HTMLElement {\n const el = document.createElement('div');\n el.className = 'bim-dialog';\n\n if (this.options.id) el.id = this.options.id;\n\n // 应用颜色配置到 CSS 变量\n const style = el.style;\n if (this.options.backgroundColor) style.setProperty('--bim-dialog-bg', this.options.backgroundColor);\n if (this.options.headerBackgroundColor) style.setProperty('--bim-dialog-header-bg', this.options.headerBackgroundColor);\n if (this.options.titleColor) style.setProperty('--bim-dialog-title-color', this.options.titleColor);\n if (this.options.textColor) style.setProperty('--bim-dialog-text-color', this.options.textColor);\n if (this.options.borderColor) style.setProperty('--bim-dialog-border-color', this.options.borderColor);\n\n // 设置初始尺寸\n this.setSize(el, this.options.width, this.options.height);\n // 确保最小尺寸生效\n if (this.options.minWidth) el.style.minWidth = `${this.options.minWidth}px`;\n\n // 创建标题栏 (Header)\n const header = document.createElement('div');\n header.className = 'bim-dialog-header';\n if (this.options.draggable) header.classList.add('draggable');\n\n const title = document.createElement('span');\n title.className = 'bim-dialog-title';\n title.textContent = this.options.title ? t(this.options.title) : '';\n\n const closeBtn = document.createElement('span');\n closeBtn.className = 'bim-dialog-close';\n closeBtn.innerHTML = '×';\n // 修复 TS 报错:去掉未使用的参数 e\n closeBtn.onclick = () => {\n this.close();\n };\n\n header.appendChild(title);\n header.appendChild(closeBtn);\n\n // 创建内容区域 (Content)\n const content = document.createElement('div');\n content.className = 'bim-dialog-content';\n if (typeof this.options.content === 'string') {\n content.innerHTML = this.options.content;\n } else if (this.options.content instanceof HTMLElement) {\n content.appendChild(this.options.content);\n }\n\n el.appendChild(header);\n el.appendChild(content);\n\n // 如果允许缩放,创建缩放手柄\n if (this.options.resizable) {\n const resizeHandle = document.createElement('div');\n resizeHandle.className = 'bim-dialog-resize-handle';\n el.appendChild(resizeHandle);\n }\n\n // ==================== 事件拦截核心逻辑 ====================\n // 定义阻断逻辑:只阻止冒泡,不阻止捕获,也不阻止默认行为(除非显式阻止)\n const stopPropagation = (e: Event) => {\n e.stopPropagation();\n };\n\n // 现代浏览器和 3D 引擎 (Three.js/Cesium) 交互事件\n const events = [\n 'click', 'dblclick', 'contextmenu', 'wheel',\n 'mousedown', 'mouseup', 'mousemove',\n 'touchstart', 'touchend', 'touchmove',\n 'pointerdown', 'pointerup', 'pointermove', 'pointerenter', 'pointerleave', 'pointerover', 'pointerout'\n ];\n\n // 绑定监听器 (默认冒泡阶段)\n // 这样内部元素(如关闭按钮)先触发,然后冒泡到这里被拦截,不再传给地图\n events.forEach(eventType => {\n el.addEventListener(eventType, stopPropagation, { passive: false });\n });\n\n return el;\n }\n\n /**\n * 设置元素尺寸\n */\n private setSize(el: HTMLElement, width?: number | string, height?: number | string) {\n if (width !== undefined) {\n if (width === 'auto' || width === 'fit-content') {\n el.style.width = width;\n } else {\n el.style.width = typeof width === 'number' ? `${width}px` : width;\n }\n }\n if (height !== undefined) {\n if (height === 'auto' || height === 'fit-content') {\n el.style.height = height;\n } else {\n el.style.height = typeof height === 'number' ? `${height}px` : height;\n }\n }\n }\n\n /**\n * 根据内容自动调整弹窗宽度\n * @param recenter 是否重新计算定位(例如保持居中),默认 true\n */\n public fitWidth(recenter: boolean = false) {\n // 1. 设置为 fit-content 以获取自然宽度,高度保持不变\n this.element.style.width = 'fit-content';\n\n // 2. 如果需要重新定位\n if (recenter) {\n this.initPosition();\n }\n }\n\n /**\n * 根据内容自动调整弹窗高度\n *\n * 设计说明:\n * - 主要用于“内容展开/收起”场景(比如测量面板展开后,Dialog 高度跟随变化)\n * - 默认不改变用户拖拽后的当前位置,只做边界夹紧,避免弹窗超出容器\n *\n * @param recenter 是否根据 options.position 重新定位(默认 false)\n */\n public fitHeight(recenter: boolean = false) {\n // 1) 先让高度由内容自然撑开,便于测量真实高度\n this.element.style.height = 'auto';\n\n // 2) 获取自然高度并做约束(最小高度 + 不超过容器)\n const naturalHeight = this.element.getBoundingClientRect().height;\n const minHeight = this.options.minHeight ?? 100;\n const containerHeight = this.container.clientHeight || 0;\n\n // 如果容器高度不可用,至少保证最小高度\n let targetHeight = Math.max(minHeight, naturalHeight);\n\n // 约束最大高度:不超过容器高度(避免完全溢出)\n if (containerHeight > 0) {\n targetHeight = Math.min(targetHeight, containerHeight);\n }\n\n this.element.style.height = `${targetHeight}px`;\n\n // 3) 定位修正:recenter 则重新按 position 计算,否则只做边界夹紧\n if (recenter) {\n this.initPosition();\n } else {\n this.clampToContainer();\n }\n }\n\n /**\n * 边界夹紧:保持当前 left/top 不变的前提下,确保弹窗不超出容器\n * 说明:用于 fitHeight / fitWidth 后的\"尺寸变化\"场景,避免弹窗被裁切。\n */\n private clampToContainer(): void {\n const containerW = this.container.clientWidth;\n const containerH = this.container.clientHeight;\n const elW = this.element.offsetWidth;\n const elH = this.element.offsetHeight;\n const bottomOffset = this.options.bottomOffset ?? 70;\n\n const currentLeft = this.element.offsetLeft;\n const currentTop = this.element.offsetTop;\n\n const maxLeft = Math.max(0, containerW - elW);\n const maxTop = Math.max(0, containerH - elH - bottomOffset);\n\n const nextLeft = Math.max(0, Math.min(currentLeft, maxLeft));\n const nextTop = Math.max(0, Math.min(currentTop, maxTop));\n\n this.element.style.left = `${nextLeft}px`;\n this.element.style.top = `${nextTop}px`;\n }\n\n /**\n * 初始化弹窗位置\n */\n private initPosition() {\n const pos = this.options.position;\n const elRect = this.element.getBoundingClientRect();\n const bottomOffset = this.options.bottomOffset ?? 70;\n\n let left = 0;\n let top = 0;\n\n const pW = this.container.clientWidth;\n const pH = this.container.clientHeight;\n const elW = elRect.width;\n const elH = elRect.height;\n\n if (typeof pos === 'object' && 'x' in pos) {\n left = pos.x;\n top = pos.y;\n } else {\n switch (pos) {\n case 'center':\n left = (pW - elW) / 2;\n top = (pH - elH) / 2;\n break;\n case 'top-left': left = 0; top = 0; break;\n case 'top-center': left = (pW - elW) / 2; top = 0; break;\n case 'top-right': left = pW - elW; top = 0; break;\n case 'left-center': left = 0; top = (pH - elH) / 2; break;\n case 'right-center': left = pW - elW; top = (pH - elH) / 2; break;\n case 'bottom-left': left = 0; top = pH - elH - bottomOffset; break;\n case 'bottom-center': left = (pW - elW) / 2; top = pH - elH - bottomOffset; break;\n case 'bottom-right': left = pW - elW; top = pH - elH - bottomOffset; break;\n default:\n left = (pW - elW) / 2;\n top = (pH - elH) / 2;\n }\n }\n\n left = Math.max(0, Math.min(left, pW - elW));\n top = Math.max(0, Math.min(top, pH - elH - bottomOffset));\n\n this.element.style.left = `${left}px`;\n this.element.style.top = `${top}px`;\n }\n\n /**\n * 初始化拖拽功能 (性能优化 + 解决粘手)\n */\n private initDrag() {\n let startX = 0;\n let startY = 0;\n let startLeft = 0;\n let startTop = 0;\n let containerW = 0;\n let containerH = 0;\n let elW = 0;\n let elH = 0;\n let bottomOffset = 0;\n\n const onMouseDown = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n startX = e.clientX;\n startY = e.clientY;\n startLeft = this.element.offsetLeft;\n startTop = this.element.offsetTop;\n\n containerW = this.container.clientWidth;\n containerH = this.container.clientHeight;\n elW = this.element.offsetWidth;\n elH = this.element.offsetHeight;\n bottomOffset = this.options.bottomOffset ?? 70;\n\n document.addEventListener('mousemove', onMouseMove, { capture: true });\n document.addEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n const onMouseMove = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.rafId) return;\n\n this.rafId = requestAnimationFrame(() => {\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n\n let newLeft = startLeft + dx;\n let newTop = startTop + dy;\n\n const maxLeft = containerW - elW;\n const maxTop = containerH - elH - bottomOffset;\n\n newLeft = Math.max(0, Math.min(newLeft, maxLeft));\n newTop = Math.max(0, Math.min(newTop, maxTop));\n\n this.element.style.left = `${newLeft}px`;\n this.element.style.top = `${newTop}px`;\n\n this.rafId = null;\n });\n };\n\n const onMouseUp = () => {\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n // 移除监听\n document.removeEventListener('mousemove', onMouseMove, { capture: true });\n document.removeEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n this.header.addEventListener('mousedown', onMouseDown);\n }\n\n /**\n * 初始化缩放功能 (性能优化 + 解决粘手)\n */\n private initResize() {\n const handle = this.element.querySelector('.bim-dialog-resize-handle') as HTMLElement;\n if (!handle) return;\n\n let startX = 0;\n let startY = 0;\n let startW = 0;\n let startH = 0;\n\n const onMouseDown = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n startX = e.clientX;\n startY = e.clientY;\n startW = this.element.offsetWidth;\n startH = this.element.offsetHeight;\n\n // 关键:使用 capture: true\n document.addEventListener('mousemove', onMouseMove, { capture: true });\n document.addEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n const onMouseMove = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.rafId) return;\n\n this.rafId = requestAnimationFrame(() => {\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n\n const newW = Math.max(this.options.minWidth || 100, startW + dx);\n const newH = Math.max(this.options.minHeight || 50, startH + dy);\n\n this.element.style.width = `${newW}px`;\n this.element.style.height = `${newH}px`;\n\n this.rafId = null;\n });\n };\n\n const onMouseUp = () => {\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n document.removeEventListener('mousemove', onMouseMove, { capture: true });\n document.removeEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n handle.addEventListener('mousedown', onMouseDown);\n }\n\n /**\n * 动态设置内容\n * @param content 内容元素或 HTML 字符串\n */\n public setContent(content: HTMLElement | string) {\n this.contentArea.innerHTML = '';\n if (typeof content === 'string') {\n this.contentArea.innerHTML = content;\n } else {\n this.contentArea.appendChild(content);\n }\n }\n\n /**\n * 关闭弹窗并销毁\n */\n public close() {\n if (this._isDestroyed) return;\n\n // 清理可能存在的动画帧,防止报错\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n this.element.remove();\n this._isDestroyed = true;\n if (this.options.onClose) {\n this.options.onClose();\n }\n }\n\n /**\n * 销毁组件 (接口实现)\n */\n public destroy() {\n this.close();\n }\n}\n","import './index.css';\nimport { BimDialog } from '../index';\n\n/**\n * BimInfoDialog (继承版)\n * 这是一个展示项目信息的业务弹窗组件,直接继承自 BimDialog。\n */\nexport class BimInfoDialog extends BimDialog {\n /**\n * 构造函数\n * @param container 父容器\n */\n constructor(container: HTMLElement) {\n // 1. 准备内容 DOM\n const contentEl = document.createElement('div');\n contentEl.className = 'bim-info-dialog-content';\n\n const infoTitle = document.createElement('h3');\n infoTitle.textContent = 'Model Information';\n\n const infoList = document.createElement('ul');\n infoList.innerHTML = `\n
  • Name: Sample Project
  • \n
  • Version: 1.0.0
  • \n
  • Date: ${new Date().toLocaleDateString()}
  • \n
  • Status: Active
  • \n `;\n\n const actionBtn = document.createElement('button');\n actionBtn.textContent = 'Update Status';\n actionBtn.style.marginTop = '10px';\n actionBtn.onclick = () => {\n alert('Status updated!');\n };\n\n contentEl.appendChild(infoTitle);\n contentEl.appendChild(infoList);\n contentEl.appendChild(actionBtn);\n\n // 2. 调用父类构造函数,传入特定的配置\n super({\n container: container,\n title: 'dialog.testTitle',\n content: contentEl,\n width: 320,\n height: 'auto',\n position: 'center',\n resizable: true,\n draggable: true,\n // 可以在这里添加特定的 onClose 逻辑\n onClose: () => {\n console.log('Info dialog closed');\n },\n onOpen: () => {\n console.log('Info dialog opened');\n }\n });\n\n // 3. 如果有特定于子类的初始化逻辑,可以在 super() 之后执行\n // 例如:this.element.classList.add('my-special-class');\n }\n\n // 不需要再手动实现 setTheme, destroy, close, init\n // 它们都已从 BimDialog 继承\n}","/**\n * 对话框管理器\n * 负责创建和管理所有对话框实例\n */\nimport { BimDialog } from '../components/dialog';\nimport { BimInfoDialog } from '../components/dialog/bimInfoDialog';\nimport type { DialogOptions } from '../components/dialog/index.type';\nimport type { ThemeConfig } from '../themes/types';\nimport { themeManager } from '../services/theme';\nimport { BaseManager } from '../core/base-manager';\n\n/**\n * 对话框管理器\n * 统一管理对话框的创建、主题更新和销毁\n */\nexport class DialogManager extends BaseManager {\n /** 容器元素 */\n private container: HTMLElement;\n /** 活跃的对话框列表 */\n private activeDialogs: BimDialog[] = [];\n\n constructor(container: HTMLElement) {\n super();\n this.container = container;\n\n this.subscribe('ui:open-dialog', (payload) => {\n console.log('[DialogManager] Received open-dialog event:', payload);\n if (payload.id === 'info') {\n this.showInfoDialog();\n }\n });\n }\n\n /**\n * 创建对话框\n * @param options 对话框配置选项\n * @returns 对话框实例\n */\n public create(options: Omit): BimDialog {\n const dialog = new BimDialog({\n container: this.container,\n ...options,\n onClose: () => {\n this.activeDialogs = this.activeDialogs.filter(d => d !== dialog);\n if (options.onClose) options.onClose();\n }\n });\n\n dialog.setTheme(themeManager.getTheme());\n this.activeDialogs.push(dialog);\n return dialog;\n }\n\n /** 显示信息对话框 */\n public showInfoDialog() {\n new BimInfoDialog(this.container);\n }\n\n /**\n * 更新所有对话框的主题\n * @param theme 主题配置\n */\n public updateTheme(theme: ThemeConfig) {\n this.activeDialogs.forEach(dialog => {\n if (dialog.setTheme) {\n dialog.setTheme(theme);\n }\n });\n }\n\n /** 销毁管理器和所有对话框 */\n public destroy() {\n this.activeDialogs.forEach(d => d.destroy());\n this.activeDialogs = [];\n super.destroy();\n }\n}\n","/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nconst REVISION = '181';\n\n/**\n * Represents mouse buttons and interaction types in context of controls.\n *\n * @type {ConstantsMouse}\n * @constant\n */\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\n\n/**\n * Represents touch interaction types in context of controls.\n *\n * @type {ConstantsTouch}\n * @constant\n */\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\n\n/**\n * Disables face culling.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceNone = 0;\n\n/**\n * Culls back faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceBack = 1;\n\n/**\n * Culls front faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceFront = 2;\n\n/**\n * Culls both front and back faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceFrontBack = 3;\n\n/**\n * Gives unfiltered shadow maps - fastest, but lowest quality.\n *\n * @type {number}\n * @constant\n */\nconst BasicShadowMap = 0;\n\n/**\n * Filters shadow maps using the Percentage-Closer Filtering (PCF) algorithm.\n *\n * @type {number}\n * @constant\n */\nconst PCFShadowMap = 1;\n\n/**\n * Filters shadow maps using the Percentage-Closer Filtering (PCF) algorithm with\n * better soft shadows especially when using low-resolution shadow maps.\n *\n * @type {number}\n * @constant\n */\nconst PCFSoftShadowMap = 2;\n\n/**\n * Filters shadow maps using the Variance Shadow Map (VSM) algorithm.\n * When using VSMShadowMap all shadow receivers will also cast shadows.\n *\n * @type {number}\n * @constant\n */\nconst VSMShadowMap = 3;\n\n/**\n * Only front faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst FrontSide = 0;\n\n/**\n * Only back faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst BackSide = 1;\n\n/**\n * Both front and back faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst DoubleSide = 2;\n\n/**\n * No blending is performed which effectively disables\n * alpha transparency.\n *\n * @type {number}\n * @constant\n */\nconst NoBlending = 0;\n\n/**\n * The default blending.\n *\n * @type {number}\n * @constant\n */\nconst NormalBlending = 1;\n\n/**\n * Represents additive blending.\n *\n * @type {number}\n * @constant\n */\nconst AdditiveBlending = 2;\n\n/**\n * Represents subtractive blending.\n *\n * @type {number}\n * @constant\n */\nconst SubtractiveBlending = 3;\n\n/**\n * Represents multiply blending.\n *\n * @type {number}\n * @constant\n */\nconst MultiplyBlending = 4;\n\n/**\n * Represents custom blending.\n *\n * @type {number}\n * @constant\n */\nconst CustomBlending = 5;\n\n/**\n * A `source + destination` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst AddEquation = 100;\n\n/**\n * A `source - destination` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst SubtractEquation = 101;\n\n/**\n * A `destination - source` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst ReverseSubtractEquation = 102;\n\n/**\n * A blend equation that uses the minimum of source and destination.\n *\n * @type {number}\n * @constant\n */\nconst MinEquation = 103;\n\n/**\n * A blend equation that uses the maximum of source and destination.\n *\n * @type {number}\n * @constant\n */\nconst MaxEquation = 104;\n\n/**\n * Multiplies all colors by `0`.\n *\n * @type {number}\n * @constant\n */\nconst ZeroFactor = 200;\n\n/**\n * Multiplies all colors by `1`.\n *\n * @type {number}\n * @constant\n */\nconst OneFactor = 201;\n\n/**\n * Multiplies all colors by the source colors.\n *\n * @type {number}\n * @constant\n */\nconst SrcColorFactor = 202;\n\n/**\n * Multiplies all colors by `1` minus each source color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusSrcColorFactor = 203;\n\n/**\n * Multiplies all colors by the source alpha value.\n *\n * @type {number}\n * @constant\n */\nconst SrcAlphaFactor = 204;\n\n/**\n * Multiplies all colors by 1 minus the source alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusSrcAlphaFactor = 205;\n\n/**\n * Multiplies all colors by the destination alpha value.\n *\n * @type {number}\n * @constant\n */\nconst DstAlphaFactor = 206;\n\n/**\n * Multiplies all colors by `1` minus the destination alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusDstAlphaFactor = 207;\n\n/**\n * Multiplies all colors by the destination color.\n *\n * @type {number}\n * @constant\n */\nconst DstColorFactor = 208;\n\n/**\n * Multiplies all colors by `1` minus each destination color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusDstColorFactor = 209;\n\n/**\n * Multiplies the RGB colors by the smaller of either the source alpha\n * value or the value of `1` minus the destination alpha value. The alpha\n * value is multiplied by `1`.\n *\n * @type {number}\n * @constant\n */\nconst SrcAlphaSaturateFactor = 210;\n\n/**\n * Multiplies all colors by a constant color.\n *\n * @type {number}\n * @constant\n */\nconst ConstantColorFactor = 211;\n\n/**\n * Multiplies all colors by `1` minus a constant color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusConstantColorFactor = 212;\n\n/**\n * Multiplies all colors by a constant alpha value.\n *\n * @type {number}\n * @constant\n */\nconst ConstantAlphaFactor = 213;\n\n/**\n * Multiplies all colors by 1 minus a constant alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusConstantAlphaFactor = 214;\n\n/**\n * Never pass.\n *\n * @type {number}\n * @constant\n */\nconst NeverDepth = 0;\n\n/**\n * Always pass.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysDepth = 1;\n\n/**\n * Pass if the incoming value is less than the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst LessDepth = 2;\n\n/**\n * Pass if the incoming value is less than or equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualDepth = 3;\n\n/**\n * Pass if the incoming value equals the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst EqualDepth = 4;\n\n/**\n * Pass if the incoming value is greater than or equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualDepth = 5;\n\n/**\n * Pass if the incoming value is greater than the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterDepth = 6;\n\n/**\n * Pass if the incoming value is not equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualDepth = 7;\n\n/**\n * Multiplies the environment map color with the surface color.\n *\n * @type {number}\n * @constant\n */\nconst MultiplyOperation = 0;\n\n/**\n * Uses reflectivity to blend between the two colors.\n *\n * @type {number}\n * @constant\n */\nconst MixOperation = 1;\n\n/**\n * Adds the two colors.\n *\n * @type {number}\n * @constant\n */\nconst AddOperation = 2;\n\n/**\n * No tone mapping is applied.\n *\n * @type {number}\n * @constant\n */\nconst NoToneMapping = 0;\n\n/**\n * Linear tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst LinearToneMapping = 1;\n\n/**\n * Reinhard tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst ReinhardToneMapping = 2;\n\n/**\n * Cineon tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst CineonToneMapping = 3;\n\n/**\n * ACES Filmic tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst ACESFilmicToneMapping = 4;\n\n/**\n * Custom tone mapping.\n *\n * Expects a custom implementation by modifying shader code of the material's fragment shader.\n *\n * @type {number}\n * @constant\n */\nconst CustomToneMapping = 5;\n\n/**\n * AgX tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst AgXToneMapping = 6;\n\n/**\n * Neutral tone mapping.\n *\n * Implementation based on the Khronos 3D Commerce Group standard tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst NeutralToneMapping = 7;\n\n/**\n * The skinned mesh shares the same world space as the skeleton.\n *\n * @type {string}\n * @constant\n */\nconst AttachedBindMode = 'attached';\n\n/**\n * The skinned mesh does not share the same world space as the skeleton.\n * This is useful when a skeleton is shared across multiple skinned meshes.\n *\n * @type {string}\n * @constant\n */\nconst DetachedBindMode = 'detached';\n\n/**\n * Maps textures using the geometry's UV coordinates.\n *\n * @type {number}\n * @constant\n */\nconst UVMapping = 300;\n\n/**\n * Reflection mapping for cube textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeReflectionMapping = 301;\n\n/**\n * Refraction mapping for cube textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeRefractionMapping = 302;\n\n/**\n * Reflection mapping for equirectangular textures.\n *\n * @type {number}\n * @constant\n */\nconst EquirectangularReflectionMapping = 303;\n\n/**\n * Refraction mapping for equirectangular textures.\n *\n * @type {number}\n * @constant\n */\nconst EquirectangularRefractionMapping = 304;\n\n/**\n * Reflection mapping for PMREM textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeUVReflectionMapping = 306;\n\n/**\n * The texture will simply repeat to infinity.\n *\n * @type {number}\n * @constant\n */\nconst RepeatWrapping = 1000;\n\n/**\n * The last pixel of the texture stretches to the edge of the mesh.\n *\n * @type {number}\n * @constant\n */\nconst ClampToEdgeWrapping = 1001;\n\n/**\n * The texture will repeats to infinity, mirroring on each repeat.\n *\n * @type {number}\n * @constant\n */\nconst MirroredRepeatWrapping = 1002;\n\n/**\n * Returns the value of the texture element that is nearest (in Manhattan distance)\n * to the specified texture coordinates.\n *\n * @type {number}\n * @constant\n */\nconst NearestFilter = 1003;\n\n/**\n * Chooses the mipmap that most closely matches the size of the pixel being textured\n * and uses the `NearestFilter` criterion (the texel nearest to the center of the pixel)\n * to produce a texture value.\n *\n * @type {number}\n * @constant\n */\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004; // legacy\n\n/**\n * Chooses the two mipmaps that most closely match the size of the pixel being textured and\n * uses the `NearestFilter` criterion to produce a texture value from each mipmap.\n * The final texture value is a weighted average of those two values.\n *\n * @type {number}\n * @constant\n */\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005; // legacy\n\n/**\n * Returns the weighted average of the four texture elements that are closest to the specified\n * texture coordinates, and can include items wrapped or repeated from other parts of a texture,\n * depending on the values of `wrapS` and `wrapT`, and on the exact mapping.\n *\n * @type {number}\n * @constant\n */\nconst LinearFilter = 1006;\n\n/**\n * Chooses the mipmap that most closely matches the size of the pixel being textured and uses\n * the `LinearFilter` criterion (a weighted average of the four texels that are closest to the\n * center of the pixel) to produce a texture value.\n *\n * @type {number}\n * @constant\n */\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007; // legacy\n\n/**\n * Chooses the two mipmaps that most closely match the size of the pixel being textured and uses\n * the `LinearFilter` criterion to produce a texture value from each mipmap. The final texture value\n * is a weighted average of those two values.\n *\n * @type {number}\n * @constant\n */\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008; // legacy\n\n/**\n * An unsigned byte data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedByteType = 1009;\n\n/**\n * A byte data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst ByteType = 1010;\n\n/**\n * A short data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst ShortType = 1011;\n\n/**\n * An unsigned short data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShortType = 1012;\n\n/**\n * An int data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst IntType = 1013;\n\n/**\n * An unsigned int data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedIntType = 1014;\n\n/**\n * A float data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst FloatType = 1015;\n\n/**\n * A half float data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst HalfFloatType = 1016;\n\n/**\n * An unsigned short 4_4_4_4 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShort4444Type = 1017;\n\n/**\n * An unsigned short 5_5_5_1 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShort5551Type = 1018;\n\n/**\n * An unsigned int 24_8 data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt248Type = 1020;\n\n/**\n * An unsigned int 5_9_9_9 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt5999Type = 35902;\n\n/**\n * An unsigned int 10_11_11 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt101111Type = 35899;\n\n/**\n * Discards the red, green and blue components and reads just the alpha component.\n *\n * @type {number}\n * @constant\n */\nconst AlphaFormat = 1021;\n\n/**\n * Discards the alpha component and reads the red, green and blue component.\n *\n * @type {number}\n * @constant\n */\nconst RGBFormat = 1022;\n\n/**\n * Reads the red, green, blue and alpha components.\n *\n * @type {number}\n * @constant\n */\nconst RGBAFormat = 1023;\n\n/**\n * Reads each element as a single depth value, converts it to floating point, and clamps to the range `[0,1]`.\n *\n * @type {number}\n * @constant\n */\nconst DepthFormat = 1026;\n\n/**\n * Reads each element is a pair of depth and stencil values. The depth component of the pair is interpreted as\n * in `DepthFormat`. The stencil component is interpreted based on the depth + stencil internal format.\n *\n * @type {number}\n * @constant\n */\nconst DepthStencilFormat = 1027;\n\n/**\n * Discards the green, blue and alpha components and reads just the red component.\n *\n * @type {number}\n * @constant\n */\nconst RedFormat = 1028;\n\n/**\n * Discards the green, blue and alpha components and reads just the red component. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RedIntegerFormat = 1029;\n\n/**\n * Discards the alpha, and blue components and reads the red, and green components.\n *\n * @type {number}\n * @constant\n */\nconst RGFormat = 1030;\n\n/**\n * Discards the alpha, and blue components and reads the red, and green components. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGIntegerFormat = 1031;\n\n/**\n * Discards the alpha component and reads the red, green and blue component. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGBIntegerFormat = 1032;\n\n/**\n * Reads the red, green, blue and alpha components. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGBAIntegerFormat = 1033;\n\n/**\n * A DXT1-compressed image in an RGB image format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_S3TC_DXT1_Format = 33776;\n\n/**\n * A DXT1-compressed image in an RGB image format with a simple on/off alpha value.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT1_Format = 33777;\n\n/**\n * A DXT3-compressed image in an RGBA image format. Compared to a 32-bit RGBA texture, it offers 4:1 compression.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT3_Format = 33778;\n\n/**\n * A DXT5-compressed image in an RGBA image format. It also provides a 4:1 compression, but differs to the DXT3\n * compression in how the alpha compression is done.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT5_Format = 33779;\n\n/**\n * PVRTC RGB compression in 4-bit mode. One block for each 4×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGB_PVRTC_4BPPV1_Format = 35840;\n\n/**\n * PVRTC RGB compression in 2-bit mode. One block for each 8×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGB_PVRTC_2BPPV1_Format = 35841;\n\n/**\n * PVRTC RGBA compression in 4-bit mode. One block for each 4×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\n\n/**\n * PVRTC RGBA compression in 2-bit mode. One block for each 8×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\n\n/**\n * ETC1 RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_ETC1_Format = 36196;\n\n/**\n * ETC2 RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_ETC2_Format = 37492;\n\n/**\n * ETC2 RGBA format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ETC2_EAC_Format = 37496;\n\n/**\n * ASTC RGBA 4x4 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_4x4_Format = 37808;\n\n/**\n * ASTC RGBA 5x4 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_5x4_Format = 37809;\n\n/**\n * ASTC RGBA 5x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_5x5_Format = 37810;\n\n/**\n * ASTC RGBA 6x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_6x5_Format = 37811;\n\n/**\n * ASTC RGBA 6x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_6x6_Format = 37812;\n\n/**\n * ASTC RGBA 8x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x5_Format = 37813;\n\n/**\n * ASTC RGBA 8x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x6_Format = 37814;\n\n/**\n * ASTC RGBA 8x8 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x8_Format = 37815;\n\n/**\n * ASTC RGBA 10x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x5_Format = 37816;\n\n/**\n * ASTC RGBA 10x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x6_Format = 37817;\n\n/**\n * ASTC RGBA 10x8 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x8_Format = 37818;\n\n/**\n * ASTC RGBA 10x10 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x10_Format = 37819;\n\n/**\n * ASTC RGBA 12x10 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_12x10_Format = 37820;\n\n/**\n * ASTC RGBA 12x12 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_12x12_Format = 37821;\n\n/**\n * BPTC RGBA format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_BPTC_Format = 36492;\n\n/**\n * BPTC Signed RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_BPTC_SIGNED_Format = 36494;\n\n/**\n * BPTC Unsigned RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_BPTC_UNSIGNED_Format = 36495;\n\n/**\n * RGTC1 Red format.\n *\n * @type {number}\n * @constant\n */\nconst RED_RGTC1_Format = 36283;\n\n/**\n * RGTC1 Signed Red format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RED_RGTC1_Format = 36284;\n\n/**\n * RGTC2 Red Green format.\n *\n * @type {number}\n * @constant\n */\nconst RED_GREEN_RGTC2_Format = 36285;\n\n/**\n * RGTC2 Signed Red Green format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RED_GREEN_RGTC2_Format = 36286;\n\n/**\n * Animations are played once.\n *\n * @type {number}\n * @constant\n */\nconst LoopOnce = 2200;\n\n/**\n * Animations are played with a chosen number of repetitions, each time jumping from\n * the end of the clip directly to its beginning.\n *\n * @type {number}\n * @constant\n */\nconst LoopRepeat = 2201;\n\n/**\n * Animations are played with a chosen number of repetitions, alternately playing forward\n * and backward.\n *\n * @type {number}\n * @constant\n */\nconst LoopPingPong = 2202;\n\n/**\n * Discrete interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateDiscrete = 2300;\n\n/**\n * Linear interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateLinear = 2301;\n\n/**\n * Smooth interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateSmooth = 2302;\n\n/**\n * Zero curvature ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst ZeroCurvatureEnding = 2400;\n\n/**\n * Zero slope ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst ZeroSlopeEnding = 2401;\n\n/**\n * Wrap around ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst WrapAroundEnding = 2402;\n\n/**\n * Default animation blend mode.\n *\n * @type {number}\n * @constant\n */\nconst NormalAnimationBlendMode = 2500;\n\n/**\n * Additive animation blend mode. Can be used to layer motions on top of\n * each other to build complex performances from smaller re-usable assets.\n *\n * @type {number}\n * @constant\n */\nconst AdditiveAnimationBlendMode = 2501;\n\n/**\n * For every three vertices draw a single triangle.\n *\n * @type {number}\n * @constant\n */\nconst TrianglesDrawMode = 0;\n\n/**\n * For each vertex draw a triangle from the last three vertices.\n *\n * @type {number}\n * @constant\n */\nconst TriangleStripDrawMode = 1;\n\n/**\n * For each vertex draw a triangle from the first vertex and the last two vertices.\n *\n * @type {number}\n * @constant\n */\nconst TriangleFanDrawMode = 2;\n\n/**\n * Basic depth packing.\n *\n * @type {number}\n * @constant\n */\nconst BasicDepthPacking = 3200;\n\n/**\n * A depth value is packed into 32 bit RGBA.\n *\n * @type {number}\n * @constant\n */\nconst RGBADepthPacking = 3201;\n\n/**\n * A depth value is packed into 24 bit RGB.\n *\n * @type {number}\n * @constant\n */\nconst RGBDepthPacking = 3202;\n\n/**\n * A depth value is packed into 16 bit RG.\n *\n * @type {number}\n * @constant\n */\nconst RGDepthPacking = 3203;\n\n/**\n * Normal information is relative to the underlying surface.\n *\n * @type {number}\n * @constant\n */\nconst TangentSpaceNormalMap = 0;\n\n/**\n * Normal information is relative to the object orientation.\n *\n * @type {number}\n * @constant\n */\nconst ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\n\n/**\n * No color space.\n *\n * @type {string}\n * @constant\n */\nconst NoColorSpace = '';\n\n/**\n * sRGB color space.\n *\n * @type {string}\n * @constant\n */\nconst SRGBColorSpace = 'srgb';\n\n/**\n * sRGB-linear color space.\n *\n * @type {string}\n * @constant\n */\nconst LinearSRGBColorSpace = 'srgb-linear';\n\n/**\n * Linear transfer function.\n *\n * @type {string}\n * @constant\n */\nconst LinearTransfer = 'linear';\n\n/**\n * sRGB transfer function.\n *\n * @type {string}\n * @constant\n */\nconst SRGBTransfer = 'srgb';\n\n/**\n * Sets the stencil buffer value to `0`.\n *\n * @type {number}\n * @constant\n */\nconst ZeroStencilOp = 0;\n\n/**\n * Keeps the current value.\n *\n * @type {number}\n * @constant\n */\nconst KeepStencilOp = 7680;\n\n/**\n * Sets the stencil buffer value to the specified reference value.\n *\n * @type {number}\n * @constant\n */\nconst ReplaceStencilOp = 7681;\n\n/**\n * Increments the current stencil buffer value. Clamps to the maximum representable unsigned value.\n *\n * @type {number}\n * @constant\n */\nconst IncrementStencilOp = 7682;\n\n/**\n * Decrements the current stencil buffer value. Clamps to `0`.\n *\n * @type {number}\n * @constant\n */\nconst DecrementStencilOp = 7683;\n\n/**\n * Increments the current stencil buffer value. Wraps stencil buffer value to zero when incrementing\n * the maximum representable unsigned value.\n *\n * @type {number}\n * @constant\n */\nconst IncrementWrapStencilOp = 34055;\n\n/**\n * Decrements the current stencil buffer value. Wraps stencil buffer value to the maximum representable\n * unsigned value when decrementing a stencil buffer value of `0`.\n *\n * @type {number}\n * @constant\n */\nconst DecrementWrapStencilOp = 34056;\n\n/**\n * Inverts the current stencil buffer value bitwise.\n *\n * @type {number}\n * @constant\n */\nconst InvertStencilOp = 5386;\n\n/**\n * Will never return true.\n *\n * @type {number}\n * @constant\n */\nconst NeverStencilFunc = 512;\n\n/**\n * Will return true if the stencil reference value is less than the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst LessStencilFunc = 513;\n\n/**\n * Will return true if the stencil reference value is equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst EqualStencilFunc = 514;\n\n/**\n * Will return true if the stencil reference value is less than or equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualStencilFunc = 515;\n\n/**\n * Will return true if the stencil reference value is greater than the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterStencilFunc = 516;\n\n/**\n * Will return true if the stencil reference value is not equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualStencilFunc = 517;\n\n/**\n * Will return true if the stencil reference value is greater than or equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualStencilFunc = 518;\n\n/**\n * Will always return true.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysStencilFunc = 519;\n\n/**\n * Never pass.\n *\n * @type {number}\n * @constant\n */\nconst NeverCompare = 512;\n\n/**\n * Pass if the incoming value is less than the texture value.\n *\n * @type {number}\n * @constant\n */\nconst LessCompare = 513;\n\n/**\n * Pass if the incoming value equals the texture value.\n *\n * @type {number}\n * @constant\n */\nconst EqualCompare = 514;\n\n/**\n * Pass if the incoming value is less than or equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualCompare = 515;\n\n/**\n * Pass if the incoming value is greater than the texture value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterCompare = 516;\n\n/**\n * Pass if the incoming value is not equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualCompare = 517;\n\n/**\n * Pass if the incoming value is greater than or equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualCompare = 518;\n\n/**\n * Always pass.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysCompare = 519;\n\n/**\n * The contents are intended to be specified once by the application, and used many\n * times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StaticDrawUsage = 35044;\n\n/**\n * The contents are intended to be respecified repeatedly by the application, and\n * used many times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst DynamicDrawUsage = 35048;\n\n/**\n * The contents are intended to be specified once by the application, and used at most\n * a few times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StreamDrawUsage = 35040;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and queried\n * many times by the application.\n *\n * @type {number}\n * @constant\n */\nconst StaticReadUsage = 35045;\n\n/**\n * The contents are intended to be respecified repeatedly by reading data from the 3D API, and queried\n * many times by the application.\n *\n * @type {number}\n * @constant\n */\nconst DynamicReadUsage = 35049;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and queried at most\n * a few times by the application\n *\n * @type {number}\n * @constant\n */\nconst StreamReadUsage = 35041;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and used many times as\n * the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StaticCopyUsage = 35046;\n\n/**\n * The contents are intended to be respecified repeatedly by reading data from the 3D API, and used many times\n * as the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst DynamicCopyUsage = 35050;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and used at most a few times\n * as the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StreamCopyUsage = 35042;\n\n/**\n * GLSL 1 shader code.\n *\n * @type {string}\n * @constant\n */\nconst GLSL1 = '100';\n\n/**\n * GLSL 3 shader code.\n *\n * @type {string}\n * @constant\n */\nconst GLSL3 = '300 es';\n\n/**\n * WebGL coordinate system.\n *\n * @type {number}\n * @constant\n */\nconst WebGLCoordinateSystem = 2000;\n\n/**\n * WebGPU coordinate system.\n *\n * @type {number}\n * @constant\n */\nconst WebGPUCoordinateSystem = 2001;\n\n/**\n * Represents the different timestamp query types.\n *\n * @type {ConstantsTimestampQuery}\n * @constant\n */\nconst TimestampQuery = {\n\tCOMPUTE: 'compute',\n\tRENDER: 'render'\n};\n\n/**\n * Represents mouse buttons and interaction types in context of controls.\n *\n * @type {ConstantsInterpolationSamplingType}\n * @constant\n */\nconst InterpolationSamplingType = {\n\tPERSPECTIVE: 'perspective',\n\tLINEAR: 'linear',\n\tFLAT: 'flat'\n};\n\n/**\n * Represents the different interpolation sampling modes.\n *\n * @type {ConstantsInterpolationSamplingMode}\n * @constant\n */\nconst InterpolationSamplingMode = {\n\tNORMAL: 'normal',\n\tCENTROID: 'centroid',\n\tSAMPLE: 'sample',\n\tFIRST: 'first',\n\tEITHER: 'either'\n};\n\n/**\n * This type represents mouse buttons and interaction types in context of controls.\n *\n * @typedef {Object} ConstantsMouse\n * @property {number} MIDDLE - The left mouse button.\n * @property {number} LEFT - The middle mouse button.\n * @property {number} RIGHT - The right mouse button.\n * @property {number} ROTATE - A rotate interaction.\n * @property {number} DOLLY - A dolly interaction.\n * @property {number} PAN - A pan interaction.\n **/\n\n/**\n * This type represents touch interaction types in context of controls.\n *\n * @typedef {Object} ConstantsTouch\n * @property {number} ROTATE - A rotate interaction.\n * @property {number} PAN - A pan interaction.\n * @property {number} DOLLY_PAN - The dolly-pan interaction.\n * @property {number} DOLLY_ROTATE - A dolly-rotate interaction.\n **/\n\n/**\n * This type represents the different timestamp query types.\n *\n * @typedef {Object} ConstantsTimestampQuery\n * @property {string} COMPUTE - A `compute` timestamp query.\n * @property {string} RENDER - A `render` timestamp query.\n **/\n\n/**\n * Represents the different interpolation sampling types.\n *\n * @typedef {Object} ConstantsInterpolationSamplingType\n * @property {string} PERSPECTIVE - Perspective-correct interpolation.\n * @property {string} LINEAR - Linear interpolation.\n * @property {string} FLAT - Flat interpolation.\n */\n\n/**\n * Represents the different interpolation sampling modes.\n *\n * @typedef {Object} ConstantsInterpolationSamplingMode\n * @property {string} NORMAL - Normal sampling mode.\n * @property {string} CENTROID - Centroid sampling mode.\n * @property {string} SAMPLE - Sample-specific sampling mode.\n * @property {string} FIRST - Flat interpolation using the first vertex.\n * @property {string} EITHER - Flat interpolation using either vertex.\n */\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] >= 65535 ) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nconst _cache = {};\n\nlet _setConsoleFunction = null;\n\nfunction setConsoleFunction( fn ) {\n\n\t_setConsoleFunction = fn;\n\n}\n\nfunction getConsoleFunction() {\n\n\treturn _setConsoleFunction;\n\n}\n\nfunction log( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'log', message, ...params );\n\n\t} else {\n\n\t\tconsole.log( message, ...params );\n\n\t}\n\n}\n\nfunction warn( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'warn', message, ...params );\n\n\t} else {\n\n\t\tconsole.warn( message, ...params );\n\n\t}\n\n}\n\nfunction error( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'error', message, ...params );\n\n\t} else {\n\n\t\tconsole.error( message, ...params );\n\n\t}\n\n}\n\nfunction warnOnce( ...params ) {\n\n\tconst message = params.join( ' ' );\n\n\tif ( message in _cache ) return;\n\n\t_cache[ message ] = true;\n\n\twarn( ...params );\n\n}\n\nfunction probeAsync( gl, sync, interval ) {\n\n\treturn new Promise( function ( resolve, reject ) {\n\n\t\tfunction probe() {\n\n\t\t\tswitch ( gl.clientWaitSync( sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0 ) ) {\n\n\t\t\t\tcase gl.WAIT_FAILED:\n\t\t\t\t\treject();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase gl.TIMEOUT_EXPIRED:\n\t\t\t\t\tsetTimeout( probe, interval );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tresolve();\n\n\t\t\t}\n\n\t\t}\n\n\t\tsetTimeout( probe, interval );\n\n\t} );\n\n}\n\n/**\n * This modules allows to dispatch event objects on custom JavaScript objects.\n *\n * Main repository: [eventdispatcher.js](https://github.com/mrdoob/eventdispatcher.js/)\n *\n * Code Example:\n * ```js\n * class Car extends EventDispatcher {\n * \tstart() {\n *\t\tthis.dispatchEvent( { type: 'start', message: 'vroom vroom!' } );\n *\t}\n *};\n *\n * // Using events with the custom object\n * const car = new Car();\n * car.addEventListener( 'start', function ( event ) {\n * \talert( event.message );\n * } );\n *\n * car.start();\n * ```\n */\nclass EventDispatcher {\n\n\t/**\n\t * Adds the given event listener to the given event type.\n\t *\n\t * @param {string} type - The type of event to listen to.\n\t * @param {Function} listener - The function that gets called when the event is fired.\n\t */\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === -1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` if the given event listener has been added to the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to check.\n\t * @return {boolean} Whether the given event listener has been added to the given event type.\n\t */\n\thasEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return false;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== -1;\n\n\t}\n\n\t/**\n\t * Removes the given event listener from the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to remove.\n\t */\n\tremoveEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Dispatches an event object.\n\t *\n\t * @param {Object} event - The event that gets fired.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n/**\n * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)\n * (universally unique identifier).\n *\n * @return {string} The UUID.\n */\nfunction generateUUID() {\n\n\t// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\n/**\n * Clamps the given value between min and max.\n *\n * @param {number} value - The value to clamp.\n * @param {number} min - The min value.\n * @param {number} max - The max value.\n * @return {number} The clamped value.\n */\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n/**\n * Computes the Euclidean modulo of the given parameters that\n * is `( ( n % m ) + m ) % m`.\n *\n * @param {number} n - The first parameter.\n * @param {number} m - The second parameter.\n * @return {number} The Euclidean modulo.\n */\nfunction euclideanModulo( n, m ) {\n\n\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n/**\n * Performs a linear mapping from range `` to range ``\n * for the given value.\n *\n * @param {number} x - The value to be mapped.\n * @param {number} a1 - Minimum value for range A.\n * @param {number} a2 - Maximum value for range A.\n * @param {number} b1 - Minimum value for range B.\n * @param {number} b2 - Maximum value for range B.\n * @return {number} The mapped value.\n */\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n/**\n * Returns the percentage in the closed interval `[0, 1]` of the given value\n * between the start and end point.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} value - A value between start and end.\n * @return {number} The interpolation factor.\n */\nfunction inverseLerp( x, y, value ) {\n\n\t// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n/**\n * Returns a value linearly interpolated from two known points based on the given interval -\n * `t = 0` will return `x` and `t = 1` will return `y`.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n * @return {number} The interpolated value.\n */\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n/**\n * Smoothly interpolate a number from `x` to `y` in a spring-like manner using a delta\n * time to maintain frame rate independent movement. For details, see\n * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/).\n *\n * @param {number} x - The current point.\n * @param {number} y - The target point.\n * @param {number} lambda - A higher lambda value will make the movement more sudden,\n * and a lower value will make the movement more gradual.\n * @param {number} dt - Delta time in seconds.\n * @return {number} The interpolated value.\n */\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n/**\n * Returns a value that alternates between `0` and the given `length` parameter.\n *\n * @param {number} x - The value to pingpong.\n * @param {number} [length=1] - The positive value the function will pingpong to.\n * @return {number} The alternated value.\n */\nfunction pingpong( x, length = 1 ) {\n\n\t// https://www.desmos.com/calculator/vcsjnyz7x4\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n/**\n * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n * the `min` and `max`.\n *\n * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\n/**\n * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)\n * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n/**\n * Returns a random integer from `` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random integer.\n */\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n/**\n * Returns a random float from `` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random float.\n */\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n/**\n * Returns a random integer from `<-range/2, range/2>` interval.\n *\n * @param {number} range - Defines the value range.\n * @return {number} A random float.\n */\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n/**\n * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n *\n * @param {number} [s] - The integer seed.\n * @return {number} A random float.\n */\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\n/**\n * Converts degrees to radians.\n *\n * @param {number} degrees - A value in degrees.\n * @return {number} The converted value in radians.\n */\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\n/**\n * Converts radians to degrees.\n *\n * @param {number} radians - A value in radians.\n * @return {number} The converted value in degrees.\n */\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\n/**\n * Returns `true` if the given number is a power of two.\n *\n * @param {number} value - The value to check.\n * @return {boolean} Whether the given number is a power of two or not.\n */\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\n/**\n * Returns the smallest power of two that is greater than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The smallest power of two that is greater than or equal to the given number.\n */\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Returns the largest power of two that is less than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The largest power of two that is less than or equal to the given number.\n */\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles)\n * defined by the given angles and order.\n *\n * Rotations are applied to the axes in the order specified by order:\n * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n *\n * @param {Quaternion} q - The quaternion to set.\n * @param {number} a - The rotation applied to the first axis, in radians.\n * @param {number} b - The rotation applied to the second axis, in radians.\n * @param {number} c - The rotation applied to the third axis, in radians.\n * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n */\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\twarn( 'MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\n/**\n * Denormalizes the given value according to the given typed array.\n *\n * @param {number} value - The value to denormalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The denormalize (float) value in the range `[0,1]`.\n */\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, -1 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, -1 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, -1 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * Normalizes the given value according to the given typed array.\n *\n * @param {number} value - The float value in the range `[0,1]` to normalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The normalize value.\n */\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * @class\n * @classdesc A collection of math utility functions.\n * @hideconstructor\n */\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\t/**\n\t * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)\n\t * (universally unique identifier).\n\t *\n\t * @static\n\t * @method\n\t * @return {string} The UUID.\n\t */\n\tgenerateUUID: generateUUID,\n\t/**\n\t * Clamps the given value between min and max.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to clamp.\n\t * @param {number} min - The min value.\n\t * @param {number} max - The max value.\n\t * @return {number} The clamped value.\n\t */\n\tclamp: clamp,\n\t/**\n\t * Computes the Euclidean modulo of the given parameters that\n\t * is `( ( n % m ) + m ) % m`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} n - The first parameter.\n\t * @param {number} m - The second parameter.\n\t * @return {number} The Euclidean modulo.\n\t */\n\teuclideanModulo: euclideanModulo,\n\t/**\n\t * Performs a linear mapping from range `` to range ``\n\t * for the given value.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to be mapped.\n\t * @param {number} a1 - Minimum value for range A.\n\t * @param {number} a2 - Maximum value for range A.\n\t * @param {number} b1 - Minimum value for range B.\n\t * @param {number} b2 - Maximum value for range B.\n\t * @return {number} The mapped value.\n\t */\n\tmapLinear: mapLinear,\n\t/**\n\t * Returns the percentage in the closed interval `[0, 1]` of the given value\n\t * between the start and end point.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The start point\n\t * @param {number} y - The end point.\n\t * @param {number} value - A value between start and end.\n\t * @return {number} The interpolation factor.\n\t */\n\tinverseLerp: inverseLerp,\n\t/**\n\t * Returns a value linearly interpolated from two known points based on the given interval -\n\t * `t = 0` will return `x` and `t = 1` will return `y`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The start point\n\t * @param {number} y - The end point.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {number} The interpolated value.\n\t */\n\tlerp: lerp,\n\t/**\n\t * Smoothly interpolate a number from `x` to `y` in a spring-like manner using a delta\n\t * time to maintain frame rate independent movement. For details, see\n\t * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/).\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The current point.\n\t * @param {number} y - The target point.\n\t * @param {number} lambda - A higher lambda value will make the movement more sudden,\n\t * and a lower value will make the movement more gradual.\n\t * @param {number} dt - Delta time in seconds.\n\t * @return {number} The interpolated value.\n\t */\n\tdamp: damp,\n\t/**\n\t * Returns a value that alternates between `0` and the given `length` parameter.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to pingpong.\n\t * @param {number} [length=1] - The positive value the function will pingpong to.\n\t * @return {number} The alternated value.\n\t */\n\tpingpong: pingpong,\n\t/**\n\t * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n\t * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n\t * the `min` and `max`.\n\t *\n\t * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to evaluate based on its position between min and max.\n\t * @param {number} min - The min value. Any x value below min will be `0`.\n\t * @param {number} max - The max value. Any x value above max will be `1`.\n\t * @return {number} The alternated value.\n\t */\n\tsmoothstep: smoothstep,\n\t/**\n\t * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)\n\t * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to evaluate based on its position between min and max.\n\t * @param {number} min - The min value. Any x value below min will be `0`.\n\t * @param {number} max - The max value. Any x value above max will be `1`.\n\t * @return {number} The alternated value.\n\t */\n\tsmootherstep: smootherstep,\n\t/**\n\t * Returns a random integer from `` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} low - The lower value boundary.\n\t * @param {number} high - The upper value boundary\n\t * @return {number} A random integer.\n\t */\n\trandInt: randInt,\n\t/**\n\t * Returns a random float from `` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} low - The lower value boundary.\n\t * @param {number} high - The upper value boundary\n\t * @return {number} A random float.\n\t */\n\trandFloat: randFloat,\n\t/**\n\t * Returns a random integer from `<-range/2, range/2>` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} range - Defines the value range.\n\t * @return {number} A random float.\n\t */\n\trandFloatSpread: randFloatSpread,\n\t/**\n\t * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} [s] - The integer seed.\n\t * @return {number} A random float.\n\t */\n\tseededRandom: seededRandom,\n\t/**\n\t * Converts degrees to radians.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} degrees - A value in degrees.\n\t * @return {number} The converted value in radians.\n\t */\n\tdegToRad: degToRad,\n\t/**\n\t * Converts radians to degrees.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} radians - A value in radians.\n\t * @return {number} The converted value in degrees.\n\t */\n\tradToDeg: radToDeg,\n\t/**\n\t * Returns `true` if the given number is a power of two.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to check.\n\t * @return {boolean} Whether the given number is a power of two or not.\n\t */\n\tisPowerOfTwo: isPowerOfTwo,\n\t/**\n\t * Returns the smallest power of two that is greater than or equal to the given number.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to find a POT for.\n\t * @return {number} The smallest power of two that is greater than or equal to the given number.\n\t */\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\t/**\n\t * Returns the largest power of two that is less than or equal to the given number.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to find a POT for.\n\t * @return {number} The largest power of two that is less than or equal to the given number.\n\t */\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\t/**\n\t * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles)\n\t * defined by the given angles and order.\n\t *\n\t * Rotations are applied to the axes in the order specified by order:\n\t * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n\t *\n\t * @static\n\t * @method\n\t * @param {Quaternion} q - The quaternion to set.\n\t * @param {number} a - The rotation applied to the first axis, in radians.\n\t * @param {number} b - The rotation applied to the second axis, in radians.\n\t * @param {number} c - The rotation applied to the third axis, in radians.\n\t * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n\t */\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\t/**\n\t * Normalizes the given value according to the given typed array.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The float value in the range `[0,1]` to normalize.\n\t * @param {TypedArray} array - The typed array that defines the data type of the value.\n\t * @return {number} The normalize value.\n\t */\n\tnormalize: normalize,\n\t/**\n\t * Denormalizes the given value according to the given typed array.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to denormalize.\n\t * @param {TypedArray} array - The typed array that defines the data type of the value.\n\t * @return {number} The denormalize (float) value in the range `[0,1]`.\n\t */\n\tdenormalize: denormalize\n};\n\n/**\n * Class representing a 2D vector. A 2D vector is an ordered pair of numbers\n * (labeled x and y), which can be used to represent a number of things, such as:\n *\n * - A point in 2D space (i.e. a position on a plane).\n * - A direction and length across a plane. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0)` to `(x, y)`\n * and the direction is also measured from `(0, 0)` towards `(x, y)`.\n * - Any arbitrary ordered pair of numbers.\n *\n * There are other things a 2D vector can be used to represent, such as\n * momentum vectors, complex numbers and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector2( 0, 1 );\n *\n * //no arguments; will be initialised to (0, 0)\n * const b = new THREE.Vector2( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector2 {\n\n\t/**\n\t * Constructs a new 2D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t */\n\tconstructor( x = 0, y = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector2.prototype.isVector2 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#x}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#y}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @param {number} value - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to copy.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector2} v - The vector to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector2} v - The vector to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 as the 3rd component) by\n\t * the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the given vector's x or y\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is less than the given vector's x or y\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the max vector's x or y\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x or y value is less than the min vector's x or y value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector2} min - The minimum x and y values.\n\t * @param {Vector2} max - The maximum x and y values in the desired range.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x or y values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x and y = -y.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the cross product with.\n\t * @return {number} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0) to (x, y). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0) to (x, y).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Computes the angle in radians of this vector with respect to the positive x-axis.\n\t *\n\t * @return {number} The angle in radians.\n\t */\n\tangle() {\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector2} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector2} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector2} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector2} v1 - The first vector.\n\t * @param {Vector2} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector2} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]` and y\n\t * value to be `array[ offset + 1 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this vector around the given center by the given angle.\n\t *\n\t * @param {Vector2} center - The point around which to rotate.\n\t * @param {number} angle - The angle to rotate, in radians.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\n/**\n * Class for representing a Quaternion. Quaternions are used in three.js to represent rotations.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n *\n * Note that three.js expects Quaternions to be normalized.\n * ```js\n * const quaternion = new THREE.Quaternion();\n * quaternion.setFromAxisAngle( new THREE.Vector3( 0, 1, 0 ), Math.PI / 2 );\n *\n * const vector = new THREE.Vector3( 1, 0, 0 );\n * vector.applyQuaternion( quaternion );\n * ```\n */\nclass Quaternion {\n\n\t/**\n\t * Constructs a new quaternion.\n\t *\n\t * @param {number} [x=0] - The x value of this quaternion.\n\t * @param {number} [y=0] - The y value of this quaternion.\n\t * @param {number} [z=0] - The z value of this quaternion.\n\t * @param {number} [w=1] - The w value of this quaternion.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuaternion = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\t/**\n\t * Interpolates between two quaternions via SLERP. This implementation assumes the\n\t * quaternion data are managed in flat arrays.\n\t *\n\t * @param {Array} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array} src1 - The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @param {number} t - The interpolation factor in the range `[0,1]`.\n\t * @see {@link Quaternion#slerp}\n\t */\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tlet x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t <= 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t >= 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet dot = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1;\n\n\t\t\tif ( dot < 0 ) {\n\n\t\t\t\tx1 = - x1;\n\t\t\t\ty1 = - y1;\n\t\t\t\tz1 = - z1;\n\t\t\t\tw1 = - w1;\n\n\t\t\t\tdot = - dot;\n\n\t\t\t}\n\n\t\t\tlet s = 1 - t;\n\n\t\t\tif ( dot < 0.9995 ) {\n\n\t\t\t\t// slerp\n\n\t\t\t\tconst theta = Math.acos( dot );\n\t\t\t\tconst sin = Math.sin( theta );\n\n\t\t\t\ts = Math.sin( s * theta ) / sin;\n\t\t\t\tt = Math.sin( t * theta ) / sin;\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t} else {\n\n\t\t\t\t// for small angles, lerp then normalize\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\t/**\n\t * Multiplies two quaternions. This implementation assumes the quaternion data are managed\n\t * in flat arrays.\n\t *\n\t * @param {Array} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array} src1 - The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @return {Array} The destination array.\n\t * @see {@link Quaternion#multiplyQuaternions}.\n\t */\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\t/**\n\t * The x value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The y value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The z value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The w value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the quaternion components.\n\t *\n\t * @param {number} x - The x value of this quaternion.\n\t * @param {number} y - The y value of this quaternion.\n\t * @param {number} z - The z value of this quaternion.\n\t * @param {number} w - The w value of this quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new quaternion with copied values from this instance.\n\t *\n\t * @return {Quaternion} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given quaternion to this instance.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to copy.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the rotation specified by the given\n\t * Euler angles.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromEuler( euler, update = true ) {\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\twarn( 'Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given axis and angle.\n\t *\n\t * @param {Vector3} axis - The normalized axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the rotation required to rotate the direction vector\n\t * `vFrom` to the direction vector `vTo`.\n\t *\n\t * @param {Vector3} vFrom - The first (normalized) direction vector.\n\t * @param {Vector3} vTo - The second (normalized) direction vector.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < 1e-8 ) { // the epsilon value has been discussed in #31286\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Returns the angle between this quaternion and the given one in radians.\n\t *\n\t * @param {Quaternion} q - The quaternion to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( clamp( this.dot( q ), -1, 1 ) ) );\n\n\t}\n\n\t/**\n\t * Rotates this quaternion by a given angular step to the given quaternion.\n\t * The method ensures that the final quaternion will not overshoot `q`.\n\t *\n\t * @param {Quaternion} q - The target quaternion.\n\t * @param {number} step - The angular step in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the identity quaternion; that is, to the\n\t * quaternion that represents \"no rotation\".\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\t/**\n\t * Inverts this quaternion via {@link Quaternion#conjugate}. The\n\t * quaternion is assumed to have unit length.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tinvert() {\n\n\t\treturn this.conjugate();\n\n\t}\n\n\t/**\n\t * Returns the rotational conjugate of this quaternion. The conjugate of a\n\t * quaternion represents the same rotation in the opposite direction about\n\t * the rotational axis.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tconjugate() {\n\n\t\tthis._x *= -1;\n\t\tthis._y *= -1;\n\t\tthis._z *= -1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of this quaternion and the given one.\n\t *\n\t * @param {Quaternion} v - The quaternion to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\t/**\n\t * Computes the squared Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector. This can be useful if you are comparing the\n\t * lengths of two quaternions, as this is a slightly more efficient calculation than\n\t * {@link Quaternion#length}.\n\t *\n\t * @return {number} The squared Euclidean length.\n\t */\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector.\n\t *\n\t * @return {number} The Euclidean length.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\t/**\n\t * Normalizes this quaternion - that is, calculated the quaternion that performs\n\t * the same rotation as this one, but has a length equal to `1`.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\t/**\n\t * Multiplies the given quaternions and stores the result in this instance.\n\t *\n\t * @param {Quaternion} a - The first quaternion.\n\t * @param {Quaternion} b - The second quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between quaternions.\n\t *\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerp( qb, t ) {\n\n\t\tif ( t <= 0 ) return this;\n\n\t\tif ( t >= 1 ) return this.copy( qb ); // copy calls _onChangeCallback()\n\n\t\tlet x = qb._x, y = qb._y, z = qb._z, w = qb._w;\n\n\t\tlet dot = this.dot( qb );\n\n\t\tif ( dot < 0 ) {\n\n\t\t\tx = - x;\n\t\t\ty = - y;\n\t\t\tz = - z;\n\t\t\tw = - w;\n\n\t\t\tdot = - dot;\n\n\t\t}\n\n\t\tlet s = 1 - t;\n\n\t\tif ( dot < 0.9995 ) {\n\n\t\t\t// slerp\n\n\t\t\tconst theta = Math.acos( dot );\n\t\t\tconst sin = Math.sin( theta );\n\n\t\t\ts = Math.sin( s * theta ) / sin;\n\t\t\tt = Math.sin( t * theta ) / sin;\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis._onChangeCallback();\n\n\t\t} else {\n\n\t\t\t// for small angles, lerp then normalize\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis.normalize(); // normalize calls _onChangeCallback()\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between the given quaternions\n\t * and stores the result in this quaternion.\n\t *\n\t * @param {Quaternion} qa - The source quaternion.\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\t/**\n\t * Sets this quaternion to a uniformly random, normalized quaternion.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trandom() {\n\n\t\t// Ken Shoemake\n\t\t// Uniform random rotations\n\t\t// D. Kirk, editor, Graphics Gems III, pages 124-132. Academic Press, New York, 1992.\n\n\t\tconst theta1 = 2 * Math.PI * Math.random();\n\t\tconst theta2 = 2 * Math.PI * Math.random();\n\n\t\tconst x0 = Math.random();\n\t\tconst r1 = Math.sqrt( 1 - x0 );\n\t\tconst r2 = Math.sqrt( x0 );\n\n\t\treturn this.set(\n\t\t\tr1 * Math.sin( theta1 ),\n\t\t\tr1 * Math.cos( theta1 ),\n\t\t\tr2 * Math.sin( theta2 ),\n\t\t\tr2 * Math.cos( theta2 ),\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if this quaternion is equal with the given one.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to test for equality.\n\t * @return {boolean} Whether this quaternion is equal with the given one.\n\t */\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\t/**\n\t * Sets this quaternion's components from the given array.\n\t *\n\t * @param {Array} array - An array holding the quaternion component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this quaternion to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the quaternion components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The quaternion components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this quaternion from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding quaternion data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the\n\t * numerical elements of this quaternion in an array of format `[x, y, z, w]`.\n\t *\n\t * @return {Array} The serialized quaternion.\n\t */\n\ttoJSON() {\n\n\t\treturn this.toArray();\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\n/**\n * Class representing a 3D vector. A 3D vector is an ordered triplet of numbers\n * (labeled x, y and z), which can be used to represent a number of things, such as:\n *\n * - A point in 3D space.\n * - A direction and length in 3D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0)` to `(x, y, z)`\n * and the direction is also measured from `(0, 0, 0)` towards `(x, y, z)`.\n * - Any arbitrary ordered triplet of numbers.\n *\n * There are other things a 3D vector can be used to represent, such as\n * momentum vectors and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y, z)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector3( 0, 1, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0)\n * const b = new THREE.Vector3( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector3 {\n\n\t/**\n\t * Constructs a new 3D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector3.prototype.isVector3 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @param {number} value - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to copy.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector3} v - The vector to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Euler rotation to this vector.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyEuler( euler ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromEuler( euler ) );\n\n\t}\n\n\t/**\n\t * Applies a rotation specified by an axis and an angle to this vector.\n\t *\n\t * @param {Vector3} axis - A normalized vector representing the rotation axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector by the given normal matrix and normalizes\n\t * the result.\n\t *\n\t * @param {Matrix3} m - The normal matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and\n\t * divides by perspective.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Quaternion to this vector.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t// quaternion q is assumed to have unit length\n\n\t\tconst vx = this.x, vy = this.y, vz = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// t = 2 * cross( q.xyz, v );\n\t\tconst tx = 2 * ( qy * vz - qz * vy );\n\t\tconst ty = 2 * ( qz * vx - qx * vz );\n\t\tconst tz = 2 * ( qx * vy - qy * vx );\n\n\t\t// v + q.w * t + cross( q.xyz, t );\n\t\tthis.x = vx + qw * tx + qy * tz - qz * ty;\n\t\tthis.y = vy + qw * ty + qz * tx - qx * tz;\n\t\tthis.z = vz + qw * tz + qx * ty - qy * tx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector from world space into the camera's normalized\n\t * device coordinate (NDC) space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\t/**\n\t * Unprojects this vector from the camera's normalized device coordinate (NDC)\n\t * space into world space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\t/**\n\t * Transforms the direction of this vector by a matrix (the upper left 3 x 3\n\t * subset of the given 4x4 matrix and then normalizes the result.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector3} v - The vector to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the given vector's x, y or z\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is less than the given vector's x, y or z\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the max vector's x, y or z\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y or z value is less than the min vector's x, y or z value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector3} min - The minimum x, y and z values.\n\t * @param {Vector3} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y or z values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y and z = -z.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0, 0) to (x, y, z).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector3} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector3} v1 - The first vector.\n\t * @param {Vector3} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the cross product with.\n\t * @return {Vector3} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vectors and stores the result\n\t * in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector onto the given one.\n\t *\n\t * @param {Vector3} v - The vector to project to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\t/**\n\t * Projects this vector onto a plane by subtracting this\n\t * vector projected onto the plane's normal from this vector.\n\t *\n\t * @param {Vector3} planeNormal - The plane normal.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector$c.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector$c );\n\n\t}\n\n\t/**\n\t * Reflects this vector off a plane orthogonal to the given normal vector.\n\t *\n\t * @param {Vector3} normal - The (normalized) normal vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\treflect( normal ) {\n\n\t\treturn this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector3} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector3} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {Spherical} s - The spherical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The phi angle in radians.\n\t * @param {number} theta - The theta angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {Cylindrical} c - The cylindrical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle in radians.\n\t * @param {number} y - The y value.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the scale elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given Euler angles.\n\t *\n\t * @param {Euler} e - The Euler angles to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the RGB components of the\n\t * given color.\n\t *\n\t * @param {Color} c - The color to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromColor( c ) {\n\n\t\tthis.x = c.r;\n\t\tthis.y = c.g;\n\t\tthis.z = c.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector3} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`\n\t * and z value to be `array[ offset + 2 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this vector to a uniformly random point on a unit sphere.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandomDirection() {\n\n\t\t// https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst theta = Math.random() * Math.PI * 2;\n\t\tconst u = Math.random() * 2 - 1;\n\t\tconst c = Math.sqrt( 1 - u * u );\n\n\t\tthis.x = c * Math.cos( theta );\n\t\tthis.y = u;\n\t\tthis.z = c * Math.sin( theta );\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nconst _vector$c = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\n\n/**\n * Represents a 3x3 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix();\n * m.set( 11, 12, 13,\n * 21, 22, 23,\n * 31, 32, 33 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31,\n * 12, 22, 32,\n * 13, 23, 33 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix3 {\n\n\t/**\n\t * Constructs a new 3x3 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix3.prototype.isMatrix3 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n21, n22, n23, n31, n32, n33 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 3x3 identity matrix.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix3} m - The matrix to copy.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set this matrix to the upper 3x3 matrix of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 3x3 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix3} a - The first matrix.\n\t * @param {Matrix3} b - The second matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution).\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the normal matrix which is the inverse transpose of the upper\n\t * left 3x3 portion of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\t/**\n\t * Transposes this matrix into the supplied array, and returns itself unchanged.\n\t *\n\t * @param {Array} r - An array to store the transposed matrix elements.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the UV transform matrix from offset, repeat, rotation, and center.\n\t *\n\t * @param {number} tx - Offset x.\n\t * @param {number} ty - Offset y.\n\t * @param {number} sx - Repeat x.\n\t * @param {number} sy - Repeat y.\n\t * @param {number} rotation - Rotation, in radians. Positive values rotate counterclockwise.\n\t * @param {number} cx - Center x of rotation.\n\t * @param {number} cy - Center y of rotation\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this matrix with the given scalar values.\n\t *\n\t * @param {number} sx - The amount to scale in the X axis.\n\t * @param {number} sy - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tscale( sx, sy ) {\n\n\t\tthis.premultiply( _m3.makeScale( sx, sy ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this matrix by the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\trotate( theta ) {\n\n\t\tthis.premultiply( _m3.makeRotation( - theta ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates this matrix by the given scalar values.\n\t *\n\t * @param {number} tx - The amount to translate in the X axis.\n\t * @param {number} ty - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranslate( tx, ty ) {\n\n\t\tthis.premultiply( _m3.makeTranslation( tx, ty ) );\n\n\t\treturn this;\n\n\t}\n\n\t// for 2D Transforms\n\n\t/**\n\t * Sets this matrix as a 2D translation transform.\n\t *\n\t * @param {number|Vector2} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y ) {\n\n\t\tif ( x.isVector2 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x.x,\n\t\t\t\t0, 1, x.y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x,\n\t\t\t\t0, 1, y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D rotational transformation.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeRotation( theta ) {\n\n\t\t// counterclockwise\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0,\n\t\t\ts, c, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D scale transform.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeScale( x, y ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0,\n\t\t\t0, y, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix3} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nconst _m3 = /*@__PURE__*/ new Matrix3();\n\nconst LINEAR_REC709_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.4123908, 0.3575843, 0.1804808,\n\t0.2126390, 0.7151687, 0.0721923,\n\t0.0193308, 0.1191948, 0.9505322\n);\n\nconst XYZ_TO_LINEAR_REC709 = /*@__PURE__*/ new Matrix3().set(\n\t3.2409699, -1.5373832, -0.4986108,\n\t-0.9692436, 1.8759675, 0.0415551,\n\t0.0556301, -0.203977, 1.0569715\n);\n\nfunction createColorManagement() {\n\n\tconst ColorManagement = {\n\n\t\tenabled: true,\n\n\t\tworkingColorSpace: LinearSRGBColorSpace,\n\n\t\t/**\n\t\t * Implementations of supported color spaces.\n\t\t *\n\t\t * Required:\n\t\t *\t- primaries: chromaticity coordinates [ rx ry gx gy bx by ]\n\t\t *\t- whitePoint: reference white [ x y ]\n\t\t *\t- transfer: transfer function (pre-defined)\n\t\t *\t- toXYZ: Matrix3 RGB to XYZ transform\n\t\t *\t- fromXYZ: Matrix3 XYZ to RGB transform\n\t\t *\t- luminanceCoefficients: RGB luminance coefficients\n\t\t *\n\t\t * Optional:\n\t\t * - outputColorSpaceConfig: { drawingBufferColorSpace: ColorSpace, toneMappingMode: 'extended' | 'standard' }\n\t\t * - workingColorSpaceConfig: { unpackColorSpace: ColorSpace }\n\t\t *\n\t\t * Reference:\n\t\t * - https://www.russellcottrell.com/photo/matrixCalculator.htm\n\t\t */\n\t\tspaces: {},\n\n\t\tconvert: function ( color, sourceColorSpace, targetColorSpace ) {\n\n\t\t\tif ( this.enabled === false || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) {\n\n\t\t\t\treturn color;\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = SRGBToLinear( color.r );\n\t\t\t\tcolor.g = SRGBToLinear( color.g );\n\t\t\t\tcolor.b = SRGBToLinear( color.b );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].primaries !== this.spaces[ targetColorSpace ].primaries ) {\n\n\t\t\t\tcolor.applyMatrix3( this.spaces[ sourceColorSpace ].toXYZ );\n\t\t\t\tcolor.applyMatrix3( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ targetColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = LinearToSRGB( color.r );\n\t\t\t\tcolor.g = LinearToSRGB( color.g );\n\t\t\t\tcolor.b = LinearToSRGB( color.b );\n\n\t\t\t}\n\n\t\t\treturn color;\n\n\t\t},\n\n\t\tworkingToColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\treturn this.convert( color, this.workingColorSpace, targetColorSpace );\n\n\t\t},\n\n\t\tcolorSpaceToWorking: function ( color, sourceColorSpace ) {\n\n\t\t\treturn this.convert( color, sourceColorSpace, this.workingColorSpace );\n\n\t\t},\n\n\t\tgetPrimaries: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].primaries;\n\n\t\t},\n\n\t\tgetTransfer: function ( colorSpace ) {\n\n\t\t\tif ( colorSpace === NoColorSpace ) return LinearTransfer;\n\n\t\t\treturn this.spaces[ colorSpace ].transfer;\n\n\t\t},\n\n\t\tgetToneMappingMode: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.toneMappingMode || 'standard';\n\n\t\t},\n\n\t\tgetLuminanceCoefficients: function ( target, colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn target.fromArray( this.spaces[ colorSpace ].luminanceCoefficients );\n\n\t\t},\n\n\t\tdefine: function ( colorSpaces ) {\n\n\t\t\tObject.assign( this.spaces, colorSpaces );\n\n\t\t},\n\n\t\t// Internal APIs\n\n\t\t_getMatrix: function ( targetMatrix, sourceColorSpace, targetColorSpace ) {\n\n\t\t\treturn targetMatrix\n\t\t\t\t.copy( this.spaces[ sourceColorSpace ].toXYZ )\n\t\t\t\t.multiply( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t},\n\n\t\t_getDrawingBufferColorSpace: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.drawingBufferColorSpace;\n\n\t\t},\n\n\t\t_getUnpackColorSpace: function ( colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].workingColorSpaceConfig.unpackColorSpace;\n\n\t\t},\n\n\t\t// Deprecated\n\n\t\tfromWorkingColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\twarnOnce( 'ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace().' ); // @deprecated, r177\n\n\t\t\treturn ColorManagement.workingToColorSpace( color, targetColorSpace );\n\n\t\t},\n\n\t\ttoWorkingColorSpace: function ( color, sourceColorSpace ) {\n\n\t\t\twarnOnce( 'ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking().' ); // @deprecated, r177\n\n\t\t\treturn ColorManagement.colorSpaceToWorking( color, sourceColorSpace );\n\n\t\t},\n\n\t};\n\n\t/******************************************************************************\n\t * sRGB definitions\n\t */\n\n\tconst REC709_PRIMARIES = [ 0.640, 0.330, 0.300, 0.600, 0.150, 0.060 ];\n\tconst REC709_LUMINANCE_COEFFICIENTS = [ 0.2126, 0.7152, 0.0722 ];\n\tconst D65 = [ 0.3127, 0.3290 ];\n\n\tColorManagement.define( {\n\n\t\t[ LinearSRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: LinearTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\tworkingColorSpaceConfig: { unpackColorSpace: SRGBColorSpace },\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t\t[ SRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: SRGBTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t} );\n\n\treturn ColorManagement;\n\n}\n\nconst ColorManagement = /*@__PURE__*/ createColorManagement();\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nlet _canvas;\n\n/**\n * A class containing utility functions for images.\n *\n * @hideconstructor\n */\nclass ImageUtils {\n\n\t/**\n\t * Returns a data URI containing a representation of the given image.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement)} image - The image object.\n\t * @param {string} [type='image/png'] - Indicates the image format.\n\t * @return {string} The data URI.\n\t */\n\tstatic getDataURL( image, type = 'image/png' ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement === 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\treturn canvas.toDataURL( type );\n\n\t}\n\n\t/**\n\t * Converts the given sRGB image data to linear color space.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement|ImageBitmap|Object)} image - The image object.\n\t * @return {HTMLCanvasElement|Object} The converted image.\n\t */\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\twarn( 'ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nlet _sourceId = 0;\n\n/**\n * Represents the data source of a texture.\n *\n * The main purpose of this class is to decouple the data definition from the texture\n * definition so the same data can be used with multiple texture instances.\n */\nclass Source {\n\n\t/**\n\t * Constructs a new video texture.\n\t *\n\t * @param {any} [data=null] - The data definition of a texture.\n\t */\n\tconstructor( data = null ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSource = true;\n\n\t\t/**\n\t\t * The ID of the source.\n\t\t *\n\t\t * @name Source#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _sourceId ++ } );\n\n\t\t/**\n\t\t * The UUID of the source.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The data definition of a texture.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.data = data;\n\n\t\t/**\n\t\t * This property is only relevant when {@link Source#needsUpdate} is set to `true` and\n\t\t * provides more control on how texture data should be processed. When `dataReady` is set\n\t\t * to `false`, the engine performs the memory allocation (if necessary) but does not transfer\n\t\t * the data into the GPU memory.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.dataReady = true;\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Source#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Returns the dimensions of the source into the given target vector.\n\t *\n\t * @param {(Vector2|Vector3)} target - The target object the result is written into.\n\t * @return {(Vector2|Vector3)} The dimensions of the source.\n\t */\n\tgetSize( target ) {\n\n\t\tconst data = this.data;\n\n\t\tif ( ( typeof HTMLVideoElement !== 'undefined' ) && ( data instanceof HTMLVideoElement ) ) {\n\n\t\t\ttarget.set( data.videoWidth, data.videoHeight, 0 );\n\n\t\t} else if ( data instanceof VideoFrame ) {\n\n\t\t\ttarget.set( data.displayHeight, data.displayWidth, 0 );\n\n\t\t} else if ( data !== null ) {\n\n\t\t\ttarget.set( data.width, data.height, data.depth || 0 );\n\n\t\t} else {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * When the property is set to `true`, the engine allocates the memory\n\t * for the texture (if necessary) and triggers the actual texture upload\n\t * to the GPU next time the source is used.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Serializes the source into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized source.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.images[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\t\t\tuuid: this.uuid,\n\t\t\turl: ''\n\t\t};\n\n\t\tconst data = this.data;\n\n\t\tif ( data !== null ) {\n\n\t\t\tlet url;\n\n\t\t\tif ( Array.isArray( data ) ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\turl = [];\n\n\t\t\t\tfor ( let i = 0, l = data.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( data[ i ].isDataTexture ) {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ].image ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// texture\n\n\t\t\t\turl = serializeImage( data );\n\n\t\t\t}\n\n\t\t\toutput.url = url;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.images[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.from( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\twarn( 'Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nlet _textureId = 0;\n\nconst _tempVec3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Base class for all textures.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments EventDispatcher\n */\nclass Texture extends EventDispatcher {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {?Object} [image=Texture.DEFAULT_IMAGE] - The image holding the texture data.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = Texture.DEFAULT_ANISOTROPY, colorSpace = NoColorSpace ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isTexture = true;\n\n\t\t/**\n\t\t * The ID of the texture.\n\t\t *\n\t\t * @name Texture#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _textureId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The data definition of a texture. A reference to the data source can be\n\t\t * shared across textures. This is often useful in context of spritesheets\n\t\t * where multiple textures render the same data but with different texture\n\t\t * transformations.\n\t\t *\n\t\t * @type {Source}\n\t\t */\n\t\tthis.source = new Source( image );\n\n\t\t/**\n\t\t * An array holding user-defined mipmaps.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.mipmaps = [];\n\n\t\t/**\n\t\t * How the texture is applied to the object. The value `UVMapping`\n\t\t * is the default, where texture or uv coordinates are used to apply the map.\n\t\t *\n\t\t * @type {(UVMapping|CubeReflectionMapping|CubeRefractionMapping|EquirectangularReflectionMapping|EquirectangularRefractionMapping|CubeUVReflectionMapping)}\n\t\t * @default UVMapping\n\t\t*/\n\t\tthis.mapping = mapping;\n\n\t\t/**\n\t\t * Lets you select the uv attribute to map the texture to. `0` for `uv`,\n\t\t * `1` for `uv1`, `2` for `uv2` and `3` for `uv3`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.channel = 0;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *U* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapS = wrapS;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *V* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapT = wrapT;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearFilter\n\t\t */\n\t\tthis.magFilter = magFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearMipmapLinearFilter\n\t\t */\n\t\tthis.minFilter = minFilter;\n\n\t\t/**\n\t\t * The number of samples taken along the axis through the pixel that has the\n\t\t * highest density of texels. By default, this value is `1`. A higher value\n\t\t * gives a less blurry result than a basic mipmap, at the cost of more\n\t\t * texture samples being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.anisotropy = anisotropy;\n\n\t\t/**\n\t\t * The format of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default RGBAFormat\n\t\t */\n\t\tthis.format = format;\n\n\t\t/**\n\t\t * The default internal format is derived from {@link Texture#format} and {@link Texture#type} and\n\t\t * defines how the texture data is going to be stored on the GPU.\n\t\t *\n\t\t * This property allows to overwrite the default format.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.internalFormat = null;\n\n\t\t/**\n\t\t * The data type of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * How much a single repetition of the texture is offset from the beginning,\n\t\t * in each direction U and V. Typical range is `0.0` to `1.0`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.offset = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How many times the texture is repeated across the surface, in each\n\t\t * direction U and V. If repeat is set greater than `1` in either direction,\n\t\t * the corresponding wrap parameter should also be set to `RepeatWrapping`\n\t\t * or `MirroredRepeatWrapping` to achieve the desired tiling effect.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The point around which rotation occurs. A value of `(0.5, 0.5)` corresponds\n\t\t * to the center of the texture. Default is `(0, 0)`, the lower left.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.center = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How much the texture is rotated around the center point, in radians.\n\t\t * Positive values are counter-clockwise.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Whether to update the texture's uv-transformation {@link Texture#matrix}\n\t\t * from the properties {@link Texture#offset}, {@link Texture#repeat},\n\t\t * {@link Texture#rotation}, and {@link Texture#center}.\n\t\t *\n\t\t * Set this to `false` if you are specifying the uv-transform matrix directly.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = true;\n\n\t\t/**\n\t\t * The uv-transformation matrix of the texture.\n\t\t *\n\t\t * @type {Matrix3}\n\t\t */\n\t\tthis.matrix = new Matrix3();\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Set this to `false` if you are creating mipmaps manually.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.generateMipmaps = true;\n\n\t\t/**\n\t\t * If set to `true`, the alpha channel, if present, is multiplied into the\n\t\t * color channels when the texture is uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure premultiply alpha on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultiplyAlpha = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure the flip on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.flipY = true;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t * The allowable values are `1` (byte-alignment), `2` (rows aligned to even-numbered bytes),\n\t\t * `4` (word-alignment), and `8` (rows start on double-word boundaries).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 4\n\t\t */\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t/**\n\t\t * Textures containing color data should be annotated with `SRGBColorSpace` or `LinearSRGBColorSpace`.\n\t\t *\n\t\t * @type {string}\n\t\t * @default NoColorSpace\n\t\t */\n\t\tthis.colorSpace = colorSpace;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the texture. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This can be used to only update a subregion or specific rows of the texture (for example, just the\n\t\t * first 3 rows). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Texture#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * A callback function, called when the texture is updated (e.g., when\n\t\t * {@link Texture#needsUpdate} has been set to true and then the texture is used).\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.onUpdate = null;\n\n\t\t/**\n\t\t * An optional back reference to the textures render target.\n\t\t *\n\t\t * @type {?(RenderTarget|WebGLRenderTarget)}\n\t\t * @default null\n\t\t */\n\t\tthis.renderTarget = null;\n\n\t\t/**\n\t\t * Indicates whether a texture belongs to a render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isRenderTargetTexture = false;\n\n\t\t/**\n\t\t * Indicates if a texture should be handled like a texture array.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isArrayTexture = image && image.depth && image.depth > 1 ? true : false;\n\n\t\t/**\n\t\t * Indicates whether this texture should be processed by `PMREMGenerator` or not\n\t\t * (only relevant for render target textures).\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.pmremVersion = 0;\n\n\t}\n\n\t/**\n\t * The width of the texture in pixels.\n\t */\n\tget width() {\n\n\t\treturn this.source.getSize( _tempVec3 ).x;\n\n\t}\n\n\t/**\n\t * The height of the texture in pixels.\n\t */\n\tget height() {\n\n\t\treturn this.source.getSize( _tempVec3 ).y;\n\n\t}\n\n\t/**\n\t * The depth of the texture in pixels.\n\t */\n\tget depth() {\n\n\t\treturn this.source.getSize( _tempVec3 ).z;\n\n\t}\n\n\t/**\n\t * The image object holding the texture data.\n\t *\n\t * @type {?Object}\n\t */\n\tget image() {\n\n\t\treturn this.source.data;\n\n\t}\n\n\tset image( value = null ) {\n\n\t\tthis.source.data = value;\n\n\t}\n\n\t/**\n\t * Updates the texture transformation matrix from the from the properties {@link Texture#offset},\n\t * {@link Texture#repeat}, {@link Texture#rotation}, and {@link Texture#center}.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data texture to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Returns a new texture with copied values from this instance.\n\t *\n\t * @return {Texture} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given texture to this instance.\n\t *\n\t * @param {Texture} source - The texture to copy.\n\t * @return {Texture} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.source = source.source;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\t\tthis.channel = source.channel;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.colorSpace = source.colorSpace;\n\n\t\tthis.renderTarget = source.renderTarget;\n\t\tthis.isRenderTargetTexture = source.isRenderTargetTexture;\n\t\tthis.isArrayTexture = source.isArrayTexture;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this texture's properties based on `values`.\n\t * @param {Object} values - A container with texture parameters.\n\t */\n\tsetValues( values ) {\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\twarn( `Texture.setValues(): parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\twarn( `Texture.setValues(): property '${ key }' does not exist.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( ( currentValue && newValue ) && ( currentValue.isVector2 && newValue.isVector2 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( ( currentValue && newValue ) && ( currentValue.isVector3 && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( ( currentValue && newValue ) && ( currentValue.isMatrix3 && newValue.isMatrix3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the texture into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized texture.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\timage: this.source.toJSON( meta ).uuid,\n\n\t\t\tmapping: this.mapping,\n\t\t\tchannel: this.channel,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\tinternalFormat: this.internalFormat,\n\t\t\ttype: this.type,\n\t\t\tcolorSpace: this.colorSpace,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tgenerateMipmaps: this.generateMipmaps,\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the texture has been disposed of.\n\t\t *\n\t\t * @event Texture#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Transforms the given uv vector with the textures uv transformation matrix.\n\t *\n\t * @param {Vector2} uv - The uv vector.\n\t * @return {Vector2} The transformed uv vector.\n\t */\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the texture\n\t * must be updated in the next render. This triggers a texture upload\n\t * to the GPU and ensures correct texture parameter configuration.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.source.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the PMREM\n\t * must be regenerated.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsPMREMUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.pmremVersion ++;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * The default image for all textures.\n *\n * @static\n * @type {?Image}\n * @default null\n */\nTexture.DEFAULT_IMAGE = null;\n\n/**\n * The default mapping for all textures.\n *\n * @static\n * @type {number}\n * @default UVMapping\n */\nTexture.DEFAULT_MAPPING = UVMapping;\n\n/**\n * The default anisotropy value for all textures.\n *\n * @static\n * @type {number}\n * @default 1\n */\nTexture.DEFAULT_ANISOTROPY = 1;\n\n/**\n * Class representing a 4D vector. A 4D vector is an ordered quadruplet of numbers\n * (labeled x, y, z and w), which can be used to represent a number of things, such as:\n *\n * - A point in 4D space.\n * - A direction and length in 4D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0, 0)` to `(x, y, z, w)`\n * and the direction is also measured from `(0, 0, 0, 0)` towards `(x, y, z, w)`.\n * - Any arbitrary ordered quadruplet of numbers.\n *\n * There are other things a 4D vector can be used to represent, however these\n * are the most common uses in *three.js*.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector4( 0, 1, 0, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0, 1)\n * const b = new THREE.Vector4( );\n *\n * const d = a.dot( b );\n * ```\n */\nclass Vector4 {\n\n\t/**\n\t * Constructs a new 4D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t * @param {number} [w=1] - The w value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector4.prototype.isVector4 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t\t/**\n\t\t * The w value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.w = w;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#z}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#w}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @param {number} w - The value of the w component.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's w component to the given value\n\t *\n\t * @param {number} w - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @param {number} value - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector to copy.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector4} v - The vector to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector4} v - The vector to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector4} v - The vector to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\t\tthis.w /= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the quaternion's axis and w to the angle.\n\t *\n\t * @param {Quaternion} q - The Quaternion to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the axis of rotation and w to the angle.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper left 3x3 matrix is a pure rotation matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\t\tthis.w = e[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is less than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the max vector's x, y, z or w\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y, z or w value is less than the min vector's x, y, z or w value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector4} min - The minimum x, y and z values.\n\t * @param {Vector4} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\t\tthis.w = clamp( this.w, min.w, max.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y, z or w values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\t\tthis.w = clamp( this.w, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\t\tthis.w = Math.trunc( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y, z = -z, w = -w.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0, 0) to (x, y, z, w). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector4} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector4} v1 - The first vector.\n\t * @param {Vector4} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector4} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`,\n\t * z value to be `array[ offset + 2 ]`, w value to be `array[ offset + 3 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\n/**\n * A render target is a buffer where the video card draws pixels for a scene\n * that is being rendered in the background. It is used in different effects,\n * such as applying postprocessing to a rendered image before displaying it\n * on the screen.\n *\n * @augments EventDispatcher\n */\nclass RenderTarget extends EventDispatcher {\n\n\t/**\n\t * Render target options.\n\t *\n\t * @typedef {Object} RenderTarget~Options\n\t * @property {boolean} [generateMipmaps=false] - Whether to generate mipmaps or not.\n\t * @property {number} [magFilter=LinearFilter] - The mag filter.\n\t * @property {number} [minFilter=LinearFilter] - The min filter.\n\t * @property {number} [format=RGBAFormat] - The texture format.\n\t * @property {number} [type=UnsignedByteType] - The texture type.\n\t * @property {?string} [internalFormat=null] - The texture's internal format.\n\t * @property {number} [wrapS=ClampToEdgeWrapping] - The texture's uv wrapping mode.\n\t * @property {number} [wrapT=ClampToEdgeWrapping] - The texture's uv wrapping mode.\n\t * @property {number} [anisotropy=1] - The texture's anisotropy value.\n\t * @property {string} [colorSpace=NoColorSpace] - The texture's color space.\n\t * @property {boolean} [depthBuffer=true] - Whether to allocate a depth buffer or not.\n\t * @property {boolean} [stencilBuffer=false] - Whether to allocate a stencil buffer or not.\n\t * @property {boolean} [resolveDepthBuffer=true] - Whether to resolve the depth buffer or not.\n\t * @property {boolean} [resolveStencilBuffer=true] - Whether to resolve the stencil buffer or not.\n\t * @property {?Texture} [depthTexture=null] - Reference to a depth texture.\n\t * @property {number} [samples=0] - The MSAA samples count.\n\t * @property {number} [count=1] - Defines the number of color attachments . Must be at least `1`.\n\t * @property {number} [depth=1] - The texture depth.\n\t * @property {boolean} [multiview=false] - Whether this target is used for multiview rendering.\n\t */\n\n\t/**\n\t * Constructs a new render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper();\n\n\t\toptions = Object.assign( {\n\t\t\tgenerateMipmaps: false,\n\t\t\tinternalFormat: null,\n\t\t\tminFilter: LinearFilter,\n\t\t\tdepthBuffer: true,\n\t\t\tstencilBuffer: false,\n\t\t\tresolveDepthBuffer: true,\n\t\t\tresolveStencilBuffer: true,\n\t\t\tdepthTexture: null,\n\t\t\tsamples: 0,\n\t\t\tcount: 1,\n\t\t\tdepth: 1,\n\t\t\tmultiview: false\n\t\t}, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderTarget = true;\n\n\t\t/**\n\t\t * The width of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.height = height;\n\n\t\t/**\n\t\t * The depth of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.depth = options.depth;\n\n\t\t/**\n\t\t * A rectangular area inside the render target's viewport. Fragments that are\n\t\t * outside the area will be discarded.\n\t\t *\n\t\t * @type {Vector4}\n\t\t * @default (0,0,width,height)\n\t\t */\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\n\t\t/**\n\t\t * Indicates whether the scissor test should be enabled when rendering into\n\t\t * this render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.scissorTest = false;\n\n\t\t/**\n\t\t * A rectangular area representing the render target's viewport.\n\t\t *\n\t\t * @type {Vector4}\n\t\t * @default (0,0,width,height)\n\t\t */\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tconst image = { width: width, height: height, depth: options.depth };\n\n\t\tconst texture = new Texture( image );\n\n\t\t/**\n\t\t * An array of textures. Each color attachment is represented as a separate texture.\n\t\t * Has at least a single entry for the default color attachment.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.textures = [];\n\n\t\tconst count = options.count;\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.textures[ i ] = texture.clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t}\n\n\t\tthis._setTextureOptions( options );\n\n\t\t/**\n\t\t * Whether to allocate a depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthBuffer = options.depthBuffer;\n\n\t\t/**\n\t\t * Whether to allocate a stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilBuffer = options.stencilBuffer;\n\n\t\t/**\n\t\t * Whether to resolve the depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resolveDepthBuffer = options.resolveDepthBuffer;\n\n\t\t/**\n\t\t * Whether to resolve the stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resolveStencilBuffer = options.resolveStencilBuffer;\n\n\t\tthis._depthTexture = null;\n\t\tthis.depthTexture = options.depthTexture;\n\n\t\t/**\n\t\t * The number of MSAA samples.\n\t\t *\n\t\t * A value of `0` disables MSAA.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.samples = options.samples;\n\n\t\t/**\n\t\t * Whether to this target is used in multiview rendering.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.multiview = options.multiview;\n\n\t}\n\n\t_setTextureOptions( options = {} ) {\n\n\t\tconst values = {\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\tflipY: false,\n\t\t\tinternalFormat: null\n\t\t};\n\n\t\tif ( options.mapping !== undefined ) values.mapping = options.mapping;\n\t\tif ( options.wrapS !== undefined ) values.wrapS = options.wrapS;\n\t\tif ( options.wrapT !== undefined ) values.wrapT = options.wrapT;\n\t\tif ( options.wrapR !== undefined ) values.wrapR = options.wrapR;\n\t\tif ( options.magFilter !== undefined ) values.magFilter = options.magFilter;\n\t\tif ( options.minFilter !== undefined ) values.minFilter = options.minFilter;\n\t\tif ( options.format !== undefined ) values.format = options.format;\n\t\tif ( options.type !== undefined ) values.type = options.type;\n\t\tif ( options.anisotropy !== undefined ) values.anisotropy = options.anisotropy;\n\t\tif ( options.colorSpace !== undefined ) values.colorSpace = options.colorSpace;\n\t\tif ( options.flipY !== undefined ) values.flipY = options.flipY;\n\t\tif ( options.generateMipmaps !== undefined ) values.generateMipmaps = options.generateMipmaps;\n\t\tif ( options.internalFormat !== undefined ) values.internalFormat = options.internalFormat;\n\n\t\tfor ( let i = 0; i < this.textures.length; i ++ ) {\n\n\t\t\tconst texture = this.textures[ i ];\n\t\t\ttexture.setValues( values );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The texture representing the default color attachment.\n\t *\n\t * @type {Texture}\n\t */\n\tget texture() {\n\n\t\treturn this.textures[ 0 ];\n\n\t}\n\n\tset texture( value ) {\n\n\t\tthis.textures[ 0 ] = value;\n\n\t}\n\n\tset depthTexture( current ) {\n\n\t\tif ( this._depthTexture !== null ) this._depthTexture.renderTarget = null;\n\t\tif ( current !== null ) current.renderTarget = this;\n\n\t\tthis._depthTexture = current;\n\n\t}\n\n\t/**\n\t * Instead of saving the depth in a renderbuffer, a texture\n\t * can be used instead which is useful for further processing\n\t * e.g. in context of post-processing.\n\t *\n\t * @type {?DepthTexture}\n\t * @default null\n\t */\n\tget depthTexture() {\n\n\t\treturn this._depthTexture;\n\n\t}\n\n\t/**\n\t * Sets the size of this render target.\n\t *\n\t * @param {number} width - The width.\n\t * @param {number} height - The height.\n\t * @param {number} [depth=1] - The depth.\n\t */\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tfor ( let i = 0, il = this.textures.length; i < il; i ++ ) {\n\n\t\t\t\tthis.textures[ i ].image.width = width;\n\t\t\t\tthis.textures[ i ].image.height = height;\n\t\t\t\tthis.textures[ i ].image.depth = depth;\n\n\t\t\t\tif ( this.textures[ i ].isData3DTexture !== true ) { // Fix for #31693\n\n\t\t\t\t\t// TODO: Reconsider setting isArrayTexture flag here and in the ctor of Texture.\n\t\t\t\t\t// Maybe a method `isArrayTexture()` or just a getter could replace a flag since\n\t\t\t\t\t// both are evaluated on each call?\n\n\t\t\t\t\tthis.textures[ i ].isArrayTexture = this.textures[ i ].image.depth > 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\t/**\n\t * Returns a new render target with copied values from this instance.\n\t *\n\t * @return {RenderTarget} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the settings of the given render target. This is a structural copy so\n\t * no resources are shared between render targets after the copy. That includes\n\t * all MRT textures and the depth texture.\n\t *\n\t * @param {RenderTarget} source - The render target to copy.\n\t * @return {RenderTarget} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.scissor.copy( source.scissor );\n\t\tthis.scissorTest = source.scissorTest;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.textures.length = 0;\n\n\t\tfor ( let i = 0, il = source.textures.length; i < il; i ++ ) {\n\n\t\t\tthis.textures[ i ] = source.textures[ i ].clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t\t// ensure image object is not shared, see #20328\n\n\t\t\tconst image = Object.assign( {}, source.textures[ i ].image );\n\t\t\tthis.textures[ i ].source = new Source( image );\n\n\t\t}\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tthis.resolveDepthBuffer = source.resolveDepthBuffer;\n\t\tthis.resolveStencilBuffer = source.resolveStencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires RenderTarget#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\n/**\n * A render target used in context of {@link WebGLRenderer}.\n *\n * @augments RenderTarget\n */\nclass WebGLRenderTarget extends RenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLRenderTarget = true;\n\n\t}\n\n}\n\n/**\n * Creates an array of textures directly from raw buffer data.\n *\n * @augments Texture\n */\nclass DataArrayTexture extends Texture {\n\n\t/**\n\t * Constructs a new data array texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDataArrayTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image = { data, width, height, depth };\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t *\n\t\t * @type {Set}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\t/**\n\t * Describes that a specific layer of the texture needs to be updated.\n\t * Normally when {@link Texture#needsUpdate} is set to `true`, the\n\t * entire data texture array is sent to the GPU. Marking specific\n\t * layers will only transmit subsets of all mipmaps associated with a\n\t * specific depth in the array which is often much more performant.\n\t *\n\t * @param {number} layerIndex - The layer index that should be updated.\n\t */\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\t/**\n\t * Resets the layer updates registry.\n\t */\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\n/**\n * An array render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGLArrayRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new array render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLArrayRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {DataArrayTexture}\n\t\t */\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Creates a three-dimensional texture from raw data, with parameters to\n * divide it into width, height, and depth.\n *\n * @augments Texture\n */\nclass Data3DTexture extends Texture {\n\n\t/**\n\t * Constructs a new data array texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in Data3DTexture directly.\n\t\t//\n\t\t//\tconst texture = new THREE.Data3DTexture( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isData3DTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image = { data, width, height, depth };\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\n/**\n * A 3D render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGL3DRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGL3DRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {Data3DTexture}\n\t\t */\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 3D space.\n */\nclass Box3 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector3} [min=(Infinity,Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector3} [max=(-Infinity,-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox3 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector3} min - The lower boundary of the box.\n\t * @param {Vector3} max - The upper boundary of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} array - An array holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromArray( array ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromArray( array, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromBufferAttribute( attribute, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} points - An array holding 3D position data as instances of {@link Vector3}.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector3} center - The center of the box.\n\t * @param {Vector3} size - The x, y and z dimensions of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the world-axis-aligned bounding box for the given 3D object\n\t * (including its children), accounting for the object's, and children's,\n\t * world transforms. The function may result in a larger box than strictly necessary.\n\t *\n\t * @param {Object3D} object - The 3D object to compute the bounding box for.\n\t * @param {boolean} [precise=false] - If set to `true`, the method computes the smallest\n\t * world-axis-aligned bounding box at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box3} box - The box to copy.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector3} point - The point that should be included by the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions. The depth of this box will be\n\t * expanded by the z component of the vector in both directions.\n\t *\n\t * @param {Vector3} vector - The vector that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given 3D object and\n\t * its children, accounting for the object's, and children's, world\n\t * transforms. The function may result in a larger box than strictly\n\t * necessary (unless the precise parameter is set to true).\n\t *\n\t * @param {Object3D} object - The 3D object that should expand the bounding box.\n\t * @param {boolean} precise - If set to `true`, the method expands the bounding box\n\t * as little as necessary at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\t// precise AABB computation based on vertex data requires at least a position attribute.\n\t\t\t// instancing isn't supported so far and uses the normal (conservative) code path.\n\n\t\t\tif ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) {\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tif ( object.isMesh === true ) {\n\n\t\t\t\t\t\tobject.getVertexPosition( i, _vector$b );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_vector$b.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_vector$b.applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector$b );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( object.boundingBox !== undefined ) {\n\n\t\t\t\t\t// object-level bounding box\n\n\t\t\t\t\tif ( object.boundingBox === null ) {\n\n\t\t\t\t\t\tobject.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( object.boundingBox );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// geometry-level bounding box\n\n\t\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( geometry.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\t_box$4.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box$4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y &&\n\t\t\tpoint.z >= this.min.z && point.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width, height and depth.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A point as a proportion of this box's width, height and depth.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y &&\n\t\t\tbox.max.z >= this.min.z && box.min.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with this bounding box.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with this bounding box.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$b );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given plane intersects with this bounding box.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether the given plane intersects with this bounding box.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given triangle intersects with this bounding box.\n\t *\n\t * @param {Triangle} triangle - The triangle to test.\n\t * @return {boolean} Whether the given triangle intersects with this bounding box.\n\t */\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$2.subVectors( triangle.a, _center );\n\t\t_v1$7.subVectors( triangle.b, _center );\n\t\t_v2$4.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$7, _v0$2 );\n\t\t_f1.subVectors( _v2$4, _v1$7 );\n\t\t_f2.subVectors( _v0$2, _v2$4 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents );\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector3} point - The point to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$b ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Returns a bounding sphere that encloses this bounding box.\n\t *\n\t * @param {Sphere} target - The target sphere that is used to store the method's result.\n\t * @return {Sphere} The bounding sphere that encloses this bounding box.\n\t */\n\tgetBoundingSphere( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\ttarget.makeEmpty();\n\n\t\t} else {\n\n\t\t\tthis.getCenter( target.center );\n\n\t\t\ttarget.radius = this.getSize( _vector$b ).length() * 0.5;\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box3} box - The bounding box to intersect with.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box3} box - The bounding box that will be unioned with this instance.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this bounding box by the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 3D space.\n\t *\n\t * @param {Vector3} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box3} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding box.\n\t *\n\t * @return {Object} Serialized structure with fields representing the object state.\n\t */\n\ttoJSON() {\n\n\t\treturn {\n\t\t\tmin: this.min.toArray(),\n\t\t\tmax: this.max.toArray()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding box.\n\t *\n\t * @param {Object} json - The serialized json to set the box from.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.min.fromArray( json.min );\n\t\tthis.max.fromArray( json.max );\n\t\treturn this;\n\n\t}\n\n}\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\n\nconst _box$4 = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0$2 = /*@__PURE__*/ new Vector3();\nconst _v1$7 = /*@__PURE__*/ new Vector3();\nconst _v2$4 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$3 = /*@__PURE__*/ new Box3();\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical 3D sphere defined by a center and radius. This class is mainly\n * used as a Bounding Sphere for 3D objects.\n */\nclass Sphere {\n\n\t/**\n\t * Constructs a new sphere.\n\t *\n\t * @param {Vector3} [center=(0,0,0)] - The center of the sphere\n\t * @param {number} [radius=-1] - The radius of the sphere.\n\t */\n\tconstructor( center = new Vector3(), radius = -1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphere = true;\n\n\t\t/**\n\t\t * The center of the sphere\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.center = center;\n\n\t\t/**\n\t\t * The radius of the sphere.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.radius = radius;\n\n\t}\n\n\t/**\n\t * Sets the sphere's components by copying the given values.\n\t *\n\t * @param {Vector3} center - The center.\n\t * @param {number} radius - The radius.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the minimum bounding sphere for list of points.\n\t * If the optional center point is given, it is used as the sphere's\n\t * center. Otherwise, the center of the axis-aligned bounding box\n\t * encompassing the points is calculated.\n\t *\n\t * @param {Array} points - A list of points in 3D space.\n\t * @param {Vector3} [optionalCenter] - The center of the sphere.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$3.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given sphere to this instance.\n\t *\n\t * @param {Sphere} sphere - The sphere to copy.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the sphere is empty (the radius set to a negative number).\n\t *\n\t * Spheres with a radius of `0` contain only their center point and are not\n\t * considered to be empty.\n\t *\n\t * @return {boolean} Whether this sphere is empty or not.\n\t */\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\t/**\n\t * Makes this sphere empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = -1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere contains the given point inclusive of\n\t * the surface of the sphere.\n\t *\n\t * @param {Vector3} point - The point to check.\n\t * @return {boolean} Whether this sphere contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\t/**\n\t * Returns the closest distance from the boundary of the sphere to the\n\t * given point. If the sphere contains the point, the distance will\n\t * be negative.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The distance to the point.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test.\n\t * @return {boolean} Whether this sphere intersects with the given one or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to test.\n\t * @return {boolean} Whether this sphere intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether this sphere intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\t/**\n\t * Clamps a point within the sphere. If the point is outside the sphere, it\n\t * will clamp it to the closest point on the edge of the sphere. Points\n\t * already inside the sphere will not be affected.\n\t *\n\t * @param {Vector3} point - The plane to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a bounding box that encloses this sphere.\n\t *\n\t * @param {Box3} target - The target box that is used to store the method's result.\n\t * @return {Box3} The bounding box that encloses this sphere.\n\t */\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Transforms this sphere with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the sphere's center by the given offset.\n\t *\n\t * @param {Vector3} offset - The offset.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this sphere to include the given point.\n\t *\n\t * @param {Vector3} point - The point to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\texpandByPoint( point ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.center.copy( point );\n\n\t\t\tthis.radius = 0;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t_v1$6.subVectors( point, this.center );\n\n\t\tconst lengthSq = _v1$6.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t// calculate the minimal sphere\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\n\t\t\tconst delta = ( length - this.radius ) * 0.5;\n\n\t\t\tthis.center.addScaledVector( _v1$6, delta / length );\n\n\t\t\tthis.radius += delta;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this sphere to enclose both the original sphere and the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tunion( sphere ) {\n\n\t\tif ( sphere.isEmpty() ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.copy( sphere );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t this.radius = Math.max( this.radius, sphere.radius );\n\n\t\t} else {\n\n\t\t\t_v2$3.subVectors( sphere.center, this.center ).setLength( sphere.radius );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).add( _v2$3 ) );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).sub( _v2$3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere is equal with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test for equality.\n\t * @return {boolean} Whether this bounding sphere is equal with the given one.\n\t */\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\t/**\n\t * Returns a new sphere with copied values from this instance.\n\t *\n\t * @return {Sphere} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding sphere.\n\t *\n\t * @return {Object} Serialized structure with fields representing the object state.\n\t */\n\ttoJSON() {\n\n\t\treturn {\n\t\t\tradius: this.radius,\n\t\t\tcenter: this.center.toArray()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding sphere.\n\t *\n\t * @param {Object} json - The serialized json to set the sphere from.\n\t * @return {Box3} A reference to this bounding sphere.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.radius = json.radius;\n\t\tthis.center.fromArray( json.center );\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A ray that emits from an origin in a certain direction. The class is used by\n * {@link Raycaster} to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3D space the mouse is over)\n * amongst other things.\n */\nclass Ray {\n\n\t/**\n\t * Constructs a new ray.\n\t *\n\t * @param {Vector3} [origin=(0,0,0)] - The origin of the ray.\n\t * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray.\n\t */\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, -1 ) ) {\n\n\t\t/**\n\t\t * The origin of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.origin = origin;\n\n\t\t/**\n\t\t * The (normalized) direction of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.direction = direction;\n\n\t}\n\n\t/**\n\t * Sets the ray's components by copying the given values.\n\t *\n\t * @param {Vector3} origin - The origin.\n\t * @param {Vector3} direction - The direction.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given ray to this instance.\n\t *\n\t * @param {Ray} ray - The ray to copy.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector that is located at a given distance along this ray.\n\t *\n\t * @param {number} t - The distance along the ray to retrieve a position for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A position on the ray.\n\t */\n\tat( t, target ) {\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, t );\n\n\t}\n\n\t/**\n\t * Adjusts the direction of the ray to point at the given vector in world space.\n\t *\n\t * @param {Vector3} v - The target position.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Shift the origin of this ray along its direction by the given distance.\n\t *\n\t * @param {number} t - The distance along the ray to interpolate.\n\t * @return {Ray} A reference to this ray.\n\t */\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$a ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the point along this ray that is closest to the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to get the closet location on the ray for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on this ray.\n\t */\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t}\n\n\t/**\n\t * Returns the distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the squared distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$a.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t\treturn _vector$a.distanceToSquared( point );\n\n\t}\n\n\t/**\n\t * Returns the squared distance between this ray and the given line segment.\n\t *\n\t * @param {Vector3} v0 - The start point of the line segment.\n\t * @param {Vector3} v1 - The end point of the line segment.\n\t * @param {Vector3} [optionalPointOnRay] - When provided, it receives the point on this ray that is closest to the segment.\n\t * @param {Vector3} [optionalPointOnSegment] - When provided, it receives the point on the line segment that is closest to this ray.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given sphere, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$a.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$a.dot( this.direction );\n\t\tconst d2 = _vector$a.dot( _vector$a ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if t1 is behind the ray - if so, return null\n\t\tif ( t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @return {boolean} Whether this ray intersects with the given sphere or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tif ( sphere.radius < 0 ) return false; // handle empty spheres, see #31187\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray\n\t * does not intersect with the plane.\n\t *\n\t * @param {Plane} plane - The plane to compute the distance to.\n\t * @return {?number} Whether this ray intersects with the given sphere or not.\n\t */\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given plane, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @return {boolean} Whether this ray intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given bounding box, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\tif ( tymin > tmin || isNaN( tmin ) ) tmin = tymin;\n\n\t\tif ( tymax < tmax || isNaN( tmax ) ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this ray intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector$a ) !== null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given triangle, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Vector3} a - The first vertex of the triangle.\n\t * @param {Vector3} b - The second vertex of the triangle.\n\t * @param {Vector3} c - The third vertex of the triangle.\n\t * @param {boolean} backfaceCulling - Whether to use backface culling or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal$1.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal$1 );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = -1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal$1 );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\t/**\n\t * Transforms this ray with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The transformation matrix.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray is equal with the given one.\n\t *\n\t * @param {Ray} ray - The ray to test for equality.\n\t * @return {boolean} Whether this ray is equal with the given one.\n\t */\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\t/**\n\t * Returns a new ray with copied values from this instance.\n\t *\n\t * @return {Ray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 4x4 matrix.\n *\n * The most common use of a 4x4 matrix in 3D computer graphics is as a transformation matrix.\n * For an introduction to transformation matrices as used in WebGL, check out [this tutorial](https://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices)\n *\n * This allows a 3D vector representing a point in 3D space to undergo\n * transformations such as translation, rotation, shear, scale, reflection,\n * orthogonal or perspective projection and so on, by being multiplied by the\n * matrix. This is known as `applying` the matrix to the vector.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix4();\n * m.set( 11, 12, 13, 14,\n * 21, 22, 23, 24,\n * 31, 32, 33, 34,\n * 41, 42, 43, 44 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31, 41,\n * 12, 22, 32, 42,\n * 13, 23, 33, 43,\n * 14, 24, 34, 44 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix4 {\n\n\t/**\n\t * Constructs a new 4x4 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix4.prototype.isMatrix4 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 4x4 identity matrix.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix4} m - The matrix to copy.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the translation component of the given matrix\n\t * into this matrix's translation component.\n\t *\n\t * @param {Matrix4} m - The matrix to copy the translation component.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given basis vectors to this matrix.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the rotation component of the given matrix\n\t * into this matrix's rotation component.\n\t *\n\t * Note: This method does not support reflection matrices.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractRotation( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component (the upper left 3x3 matrix) of this matrix to\n\t * the rotation specified by the given Euler angles. The rest of\n\t * the matrix is set to the identity. Depending on the {@link Euler#order},\n\t * there are six possible outcomes. See [this page](https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix)\n\t * for a complete list.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromEuler( euler ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component of this matrix to the rotation specified by\n\t * the given Quaternion as outlined [here](https://en.wikipedia.org/wiki/Rotation_matrix#Quaternion)\n\t * The rest of the matrix is set to the identity.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\t/**\n\t * Sets the rotation component of the transformation matrix, looking from `eye` towards\n\t * `target`, and oriented by the up-direction.\n\t *\n\t * @param {Vector3} eye - The eye vector.\n\t * @param {Vector3} target - The target vector.\n\t * @param {Vector3} up - The up vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 4x4 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix4} a - The first matrix.\n\t * @param {Matrix4} b - The second matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * Based on the method outlined [here](http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html).\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the position component for this matrix from the given vector,\n\t * without affecting the rest of the matrix.\n\t *\n\t * @param {number|Vector3} x - The x component of the vector or alternatively the vector object.\n\t * @param {number} y - The y component of the vector.\n\t * @param {number} z - The z component of the vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution).\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the columns of this matrix by the given vector.\n\t *\n\t * @param {Vector3} v - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the maximum scale value of the three axes.\n\t *\n\t * @return {number} The maximum scale.\n\t */\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\t/**\n\t * Sets this matrix as a translation transform from the given vector.\n\t *\n\t * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @param {number} z - The amount to translate in the z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y, z ) {\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x.x,\n\t\t\t\t0, 1, 0, x.y,\n\t\t\t\t0, 0, 1, x.z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the X axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Y axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Z axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the given axis by\n\t * the given angle.\n\t *\n\t * This is a somewhat controversial but mathematically sound alternative to\n\t * rotating via Quaternions. See the discussion [here](https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199).\n\t *\n\t * @param {Vector3} axis - The normalized rotation axis.\n\t * @param {number} angle - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a scale transformation.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @param {number} z - The amount to scale in the Z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a shear transformation.\n\t *\n\t * @param {number} xy - The amount to shear X by Y.\n\t * @param {number} xz - The amount to shear X by Z.\n\t * @param {number} yx - The amount to shear Y by X.\n\t * @param {number} yz - The amount to shear Y by Z.\n\t * @param {number} zx - The amount to shear Z by X.\n\t * @param {number} zy - The amount to shear Z by Y.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the transformation composed of the given position,\n\t * rotation (Quaternion) and scale.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Decomposes this matrix into its position, rotation and scale components\n\t * and provides the result in the given objects.\n\t *\n\t * Note: Not all matrices are decomposable in this way. For example, if an\n\t * object has a non-uniformly scaled parent, then the object's world matrix\n\t * may not be decomposable, and this method may not be appropriate.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1$2.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1$2.elements[ 0 ] *= invSX;\n\t\t_m1$2.elements[ 1 ] *= invSX;\n\t\t_m1$2.elements[ 2 ] *= invSX;\n\n\t\t_m1$2.elements[ 4 ] *= invSY;\n\t\t_m1$2.elements[ 5 ] *= invSY;\n\t\t_m1$2.elements[ 6 ] *= invSY;\n\n\t\t_m1$2.elements[ 8 ] *= invSZ;\n\t\t_m1$2.elements[ 9 ] *= invSZ;\n\t\t_m1$2.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1$2 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a perspective projection matrix. This is used internally by\n\t * {@link PerspectiveCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tc = near / ( far - near );\n\t\t\td = ( far * near ) / ( far - near );\n\n\t\t} else {\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tc = - ( far + near ) / ( far - near );\n\t\t\t\td = ( -2 * far * near ) / ( far - near );\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tc = - far / ( far - near );\n\t\t\t\td = ( - far * near ) / ( far - near );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a; \tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b; \tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c; \tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = -1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a orthographic projection matrix. This is used internally by\n\t * {@link OrthographicCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = 2 / ( right - left );\n\t\tconst y = 2 / ( top - bottom );\n\n\t\tconst a = - ( right + left ) / ( right - left );\n\t\tconst b = - ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tc = 1 / ( far - near );\n\t\t\td = far / ( far - near );\n\n\t\t} else {\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tc = -2 / ( far - near );\n\t\t\t\td = - ( far + near ) / ( far - near );\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tc = -1 / ( far - near );\n\t\t\t\td = - near / ( far - near );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\tte[ 0 ] = x;\t\tte[ 4 ] = 0;\t\tte[ 8 ] = 0; \t\tte[ 12 ] = a;\n\t\tte[ 1 ] = 0; \t\tte[ 5 ] = y;\t\tte[ 9 ] = 0; \t\tte[ 13 ] = b;\n\t\tte[ 2 ] = 0; \t\tte[ 6 ] = 0;\t\tte[ 10 ] = c;\t\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0; \t\tte[ 7 ] = 0;\t\tte[ 11 ] = 0;\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix4} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nconst _v1$5 = /*@__PURE__*/ new Vector3();\nconst _m1$2 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix$2 = /*@__PURE__*/ new Matrix4();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\n\n/**\n * A class representing Euler angles.\n *\n * Euler angles describe a rotational transformation by rotating an object on\n * its various axes in specified amounts per axis, and a specified axis\n * order.\n *\n * Iterating through an instance will yield its components (x, y, z,\n * order) in the corresponding order.\n *\n * ```js\n * const a = new THREE.Euler( 0, 1, 1.57, 'XYZ' );\n * const b = new THREE.Vector3( 1, 0, 1 );\n * b.applyEuler(a);\n * ```\n */\nclass Euler {\n\n\t/**\n\t * Constructs a new euler instance.\n\t *\n\t * @param {number} [x=0] - The angle of the x axis in radians.\n\t * @param {number} [y=0] - The angle of the y axis in radians.\n\t * @param {number} [z=0] - The angle of the z axis in radians.\n\t * @param {string} [order=Euler.DEFAULT_ORDER] - A string representing the order that the rotations are applied.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEuler = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\t/**\n\t * The angle of the x axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the y axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the z axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * A string representing the order that the rotations are applied.\n\t *\n\t * @type {string}\n\t * @default 'XYZ'\n\t */\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the Euler components.\n\t *\n\t * @param {number} x - The angle of the x axis in radians.\n\t * @param {number} y - The angle of the y axis in radians.\n\t * @param {number} z - The angle of the z axis in radians.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new Euler instance with copied values from this instance.\n\t *\n\t * @return {Euler} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\t/**\n\t * Copies the values of the given Euler instance to this instance.\n\t *\n\t * @param {Euler} euler - The Euler instance to copy.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a pure rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\twarn( 'Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a normalized quaternion.\n\t *\n\t * @param {Quaternion} q - A normalized Quaternion.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix$2.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix$2, order, update );\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from the given vector.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\t/**\n\t * Resets the euler angle with a new order by creating a quaternion from this\n\t * euler angle and then setting this euler angle with the quaternion and the\n\t * new order.\n\t *\n\t * Warning: This discards revolution information.\n\t *\n\t * @param {string} [newOrder] - A string representing the new order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\treorder( newOrder ) {\n\n\t\t_quaternion$3.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$3, newOrder );\n\n\t}\n\n\t/**\n\t * Returns `true` if this Euler instance is equal with the given one.\n\t *\n\t * @param {Euler} euler - The Euler instance to test for equality.\n\t * @return {boolean} Whether this Euler instance is equal with the given one.\n\t */\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\t/**\n\t * Sets this Euler instance's components to values from the given array. The first three\n\t * entries of the array are assign to the x,y and z components. An optional fourth entry\n\t * defines the Euler order.\n\t *\n\t * @param {Array} array - An array holding the Euler component values.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this Euler instance to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the Euler components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The Euler components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\n/**\n * The default Euler angle order.\n *\n * @static\n * @type {string}\n * @default 'XYZ'\n */\nEuler.DEFAULT_ORDER = 'XYZ';\n\n/**\n * A layers object assigns an 3D object to 1 or more of 32\n * layers numbered `0` to `31` - internally the layers are stored as a\n * bit mask], and by default all 3D objects are a member of layer `0`.\n *\n * This can be used to control visibility - an object must share a layer with\n * a camera to be visible when that camera's view is\n * rendered.\n *\n * All classes that inherit from {@link Object3D} have an `layers` property which\n * is an instance of this class.\n */\nclass Layers {\n\n\t/**\n\t * Constructs a new layers instance, with membership\n\t * initially set to layer `0`.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A bit mask storing which of the 32 layers this layers object is currently\n\t\t * a member of.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\t/**\n\t * Sets membership to the given layer, and remove membership all other layers.\n\t *\n\t * @param {number} layer - The layer to set.\n\t */\n\tset( layer ) {\n\n\t\tthis.mask = ( 1 << layer | 0 ) >>> 0;\n\n\t}\n\n\t/**\n\t * Adds membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to enable.\n\t */\n\tenable( layer ) {\n\n\t\tthis.mask |= 1 << layer | 0;\n\n\t}\n\n\t/**\n\t * Adds membership to all layers.\n\t */\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\t/**\n\t * Toggles the membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to toggle.\n\t */\n\ttoggle( layer ) {\n\n\t\tthis.mask ^= 1 << layer | 0;\n\n\t}\n\n\t/**\n\t * Removes membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to enable.\n\t */\n\tdisable( layer ) {\n\n\t\tthis.mask &= ~ ( 1 << layer | 0 );\n\n\t}\n\n\t/**\n\t * Removes the membership from all layers.\n\t */\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if this and the given layers object have at least one\n\t * layer in common.\n\t *\n\t * @param {Layers} layers - The layers to test.\n\t * @return {boolean } Whether this and the given layers object have at least one layer in common or not.\n\t */\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given layer is enabled.\n\t *\n\t * @param {number} layer - The layer to test.\n\t * @return {boolean } Whether the given layer is enabled or not.\n\t */\n\tisEnabled( layer ) {\n\n\t\treturn ( this.mask & ( 1 << layer | 0 ) ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$4 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$2 = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\n/**\n * Fires when the object has been added to its parent object.\n *\n * @event Object3D#added\n * @type {Object}\n */\nconst _addedEvent = { type: 'added' };\n\n/**\n * Fires when the object has been removed from its parent object.\n *\n * @event Object3D#removed\n * @type {Object}\n */\nconst _removedEvent = { type: 'removed' };\n\n/**\n * Fires when a new child object has been added.\n *\n * @event Object3D#childadded\n * @type {Object}\n */\nconst _childaddedEvent = { type: 'childadded', child: null };\n\n/**\n * Fires when a child object has been removed.\n *\n * @event Object3D#childremoved\n * @type {Object}\n */\nconst _childremovedEvent = { type: 'childremoved', child: null };\n\n/**\n * This is the base class for most objects in three.js and provides a set of\n * properties and methods for manipulating objects in 3D space.\n *\n * @augments EventDispatcher\n */\nclass Object3D extends EventDispatcher {\n\n\t/**\n\t * Constructs a new 3D object.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isObject3D = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name Object3D#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Object3D';\n\n\t\t/**\n\t\t * A reference to the parent object.\n\t\t *\n\t\t * @type {?Object3D}\n\t\t * @default null\n\t\t */\n\t\tthis.parent = null;\n\n\t\t/**\n\t\t * An array holding the child 3D objects of this instance.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.children = [];\n\n\t\t/**\n\t\t * Defines the `up` direction of the 3D object which influences\n\t\t * the orientation via methods like {@link Object3D#lookAt}.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_UP`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.up = Object3D.DEFAULT_UP.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * Represents the object's local position.\n\t\t\t *\n\t\t\t * @name Object3D#position\n\t\t\t * @type {Vector3}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Euler angles, in radians.\n\t\t\t *\n\t\t\t * @name Object3D#rotation\n\t\t\t * @type {Euler}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Quaternions.\n\t\t\t *\n\t\t\t * @name Object3D#quaternion\n\t\t\t * @type {Quaternion}\n\t\t\t */\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local scale.\n\t\t\t *\n\t\t\t * @name Object3D#scale\n\t\t\t * @type {Vector3}\n\t\t\t * @default (1,1,1)\n\t\t\t */\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's model-view matrix.\n\t\t\t *\n\t\t\t * @name Object3D#modelViewMatrix\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's normal matrix.\n\t\t\t *\n\t\t\t * @name Object3D#normalMatrix\n\t\t\t * @type {Matrix3}\n\t\t\t */\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in local space.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in world space.\n\t\t * If the 3D object has no parent, then it's identical to the local transformation matrix\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the local matrix from position,\n\t\t * rotation and scale every frame.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE;\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the world matrix from the current local\n\t\t * matrix and the object's transformation hierarchy.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer\n\n\t\t/**\n\t\t * When set to `true`, it calculates the world matrix in that frame and resets this property\n\t\t * to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t/**\n\t\t * The layer membership of the 3D object. The 3D object is only visible if it has\n\t\t * at least one layer in common with the camera in use. This property can also be\n\t\t * used to filter out unwanted objects in ray-intersection tests when using {@link Raycaster}.\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered into shadow maps.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.castShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is affected by shadows in the scene.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.receiveShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is honored by view frustum culling.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.frustumCulled = true;\n\n\t\t/**\n\t\t * This value allows the default rendering order of scene graph objects to be\n\t\t * overridden although opaque and transparent objects remain sorted independently.\n\t\t * When this property is set for an instance of {@link Group},all descendants\n\t\t * objects will be sorted and rendered together. Sorting is from lowest to highest\n\t\t * render order.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.renderOrder = 0;\n\n\t\t/**\n\t\t * An array holding the animation clips of the 3D object.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.animations = [];\n\n\t\t/**\n\t\t * Custom depth material to be used when rendering to the depth map. Can only be used\n\t\t * in context of meshes. When shadow-casting with a {@link DirectionalLight} or {@link SpotLight},\n\t\t * if you are modifying vertex positions in the vertex shader you must specify a custom depth\n\t\t * material for proper shadows.\n\t\t *\n\t\t * Only relevant in context of {@link WebGLRenderer}.\n\t\t *\n\t\t * @type {(Material|undefined)}\n\t\t * @default undefined\n\t\t */\n\t\tthis.customDepthMaterial = undefined;\n\n\t\t/**\n\t\t * Same as {@link Object3D#customDepthMaterial}, but used with {@link PointLight}.\n\t\t *\n\t\t * Only relevant in context of {@link WebGLRenderer}.\n\t\t *\n\t\t * @type {(Material|undefined)}\n\t\t * @default undefined\n\t\t */\n\t\tthis.customDistanceMaterial = undefined;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the 3D object. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * Applies the given transformation matrix to the object and updates the object's position,\n\t * rotation and scale.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\t/**\n\t * Applies a rotation represented by given the quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as an axis/angle couple to the 3D object.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t */\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as Euler angles to the 3D object.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t */\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as rotation matrix to the 3D object.\n\t *\n\t * @param {Matrix4} m - Although a 4x4 matrix is expected, the upper 3x3 portion must be\n\t * a pure rotation matrix (i.e, unscaled).\n\t */\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as a Quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The Quaternion\n\t */\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in world space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its X axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Y axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Z axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along the given axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$4.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$4.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its X-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Y-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Z-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's local space to world space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tlocalToWorld( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's word space to local space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tworldToLocal( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\t/**\n\t * Rotates the object to face a point in world space.\n\t *\n\t * This method does not support objects having non-uniformly-scaled parent(s).\n\t *\n\t * @param {number|Vector3} x - The x coordinate in world space. Alternatively, a vector representing a position in world space\n\t * @param {number} [y] - The y coordinate in world space.\n\t * @param {number} [z] - The z coordinate in world space.\n\t */\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position$3.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$1.lookAt( _position$3, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$1.lookAt( _target, _position$3, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child to this 3D object. An arbitrary number of\n\t * objects may be added. Any current parent on an object passed in here will be\n\t * removed, since an object can have at most one parent.\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to add.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\terror( 'Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tobject.removeFromParent();\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t\t_childaddedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t\t_childaddedEvent.child = null;\n\n\t\t} else {\n\n\t\t\terror( 'Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given 3D object as child from this 3D object.\n\t * An arbitrary number of objects may be removed.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @param {Object3D} object - The 3D object to remove.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== -1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t\t_childremovedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childremovedEvent );\n\t\t\t_childremovedEvent.child = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes this 3D object from its current parent.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes all child objects.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tclear() {\n\n\t\treturn this.remove( ... this.children );\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child of this 3D object, while maintaining the object's world\n\t * transform. This method does not support scene graphs having non-uniformly-scaled nodes(s).\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to attach.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$1 );\n\n\t\tobject.removeFromParent();\n\t\tobject.parent = this;\n\t\tthis.children.push( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t_childaddedEvent.child = object;\n\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t_childaddedEvent.child = null;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching ID.\n\t *\n\t * @param {number} id - The id.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching name.\n\t *\n\t * @param {string} name - The name.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns all 3D objects with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @param {Array} result - The method stores the result in this array.\n\t * @return {Array} The found 3D objects.\n\t */\n\tgetObjectsByProperty( name, value, result = [] ) {\n\n\t\tif ( this[ name ] === value ) result.push( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].getObjectsByProperty( name, value, result );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the position of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's position in world space.\n\t */\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Returns a Quaternion representing the position of the 3D object in world space.\n\t *\n\t * @param {Quaternion} target - The target Quaternion the result is stored to.\n\t * @return {Quaternion} The 3D object's rotation in world space.\n\t */\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, target, _scale$2 );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the scale of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's scale in world space.\n\t */\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$2, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\t/**\n\t * Abstract method to get intersections between a casted ray and this\n\t * 3D object. Renderable 3D objects such as {@link Mesh}, {@link Line} or {@link Points}\n\t * implement this method in order to use raycasting.\n\t *\n\t * @abstract\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - An array holding the result of the method.\n\t */\n\traycast( /* raycaster, intersects */ ) {}\n\n\t/**\n\t * Executes the callback on this 3D object and all descendants.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for visible 3D objects.\n\t * Descendants of invisible 3D objects are not traversed.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for all ancestors.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in local space by computing it from the current\n\t * position, rotation and scale values.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in world space of this 3D objects and its descendants.\n\t *\n\t * To ensure correct results, this method also recomputes the 3D object's transformation matrix in\n\t * local space. The computation of the local and world matrix can be controlled with the\n\t * {@link Object3D#matrixAutoUpdate} and {@link Object3D#matrixWorldAutoUpdate} flags which are both\n\t * `true` by default. Set these flags to `false` if you need more control over the update matrix process.\n\t *\n\t * @param {boolean} [force=false] - When set to `true`, a recomputation of world matrices is forced even\n\t * when {@link Object3D#matrixWorldAutoUpdate} is set to `false`.\n\t */\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// make sure descendants are updated if required\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst child = children[ i ];\n\n\t\t\tchild.updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * An alternative version of {@link Object3D#updateMatrixWorld} with more control over the\n\t * update of ancestor and descendant nodes.\n\t *\n\t * @param {boolean} [updateParents=false] Whether ancestor nodes should be updated or not.\n\t * @param {boolean} [updateChildren=false] Whether descendant nodes should be updated or not.\n\t */\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// make sure descendants are updated\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = children[ i ];\n\n\t\t\t\tchild.updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the 3D object into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized 3D object.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( Object.keys( this.userData ).length > 0 ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\t\tobject.up = this.up.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\tif ( this.isBatchedMesh ) {\n\n\t\t\tobject.type = 'BatchedMesh';\n\t\t\tobject.perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\t\tobject.sortObjects = this.sortObjects;\n\n\t\t\tobject.drawRanges = this._drawRanges;\n\t\t\tobject.reservedRanges = this._reservedRanges;\n\n\t\t\tobject.geometryInfo = this._geometryInfo.map( info => ( {\n\t\t\t\t...info,\n\t\t\t\tboundingBox: info.boundingBox ? info.boundingBox.toJSON() : undefined,\n\t\t\t\tboundingSphere: info.boundingSphere ? info.boundingSphere.toJSON() : undefined\n\t\t\t} ) );\n\t\t\tobject.instanceInfo = this._instanceInfo.map( info => ( { ...info } ) );\n\n\t\t\tobject.availableInstanceIds = this._availableInstanceIds.slice();\n\t\t\tobject.availableGeometryIds = this._availableGeometryIds.slice();\n\n\t\t\tobject.nextIndexStart = this._nextIndexStart;\n\t\t\tobject.nextVertexStart = this._nextVertexStart;\n\t\t\tobject.geometryCount = this._geometryCount;\n\n\t\t\tobject.maxInstanceCount = this._maxInstanceCount;\n\t\t\tobject.maxVertexCount = this._maxVertexCount;\n\t\t\tobject.maxIndexCount = this._maxIndexCount;\n\n\t\t\tobject.geometryInitialized = this._geometryInitialized;\n\n\t\t\tobject.matricesTexture = this._matricesTexture.toJSON( meta );\n\n\t\t\tobject.indirectTexture = this._indirectTexture.toJSON( meta );\n\n\t\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\t\tobject.colorsTexture = this._colorsTexture.toJSON( meta );\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tobject.boundingSphere = this.boundingSphere.toJSON();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tobject.boundingBox = this.boundingBox.toJSON();\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new 3D object with copied values from this instance.\n\t *\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are also cloned.\n\t * @return {Object3D} A clone of this instance.\n\t */\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\t/**\n\t * Copies the values of the given 3D object to this instance.\n\t *\n\t * @param {Object3D} source - The 3D object to copy.\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are cloned.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\tthis.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.animations = source.animations.slice();\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * The default up direction for objects, also used as the default\n * position for {@link DirectionalLight} and {@link HemisphereLight}.\n *\n * @static\n * @type {Vector3}\n * @default (0,1,0)\n */\nObject3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 );\n\n/**\n * The default setting for {@link Object3D#matrixAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_AUTO_UPDATE = true;\n\n/**\n * The default setting for {@link Object3D#matrixWorldAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true;\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$2 = /*@__PURE__*/ new Vector3();\nconst _v3$2 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nconst _v40 = /*@__PURE__*/ new Vector4();\nconst _v41 = /*@__PURE__*/ new Vector4();\nconst _v42 = /*@__PURE__*/ new Vector4();\n\n/**\n * A geometric triangle as defined by three vectors representing its three corners.\n */\nclass Triangle {\n\n\t/**\n\t * Constructs a new triangle.\n\t *\n\t * @param {Vector3} [a=(0,0,0)] - The first corner of the triangle.\n\t * @param {Vector3} [b=(0,0,0)] - The second corner of the triangle.\n\t * @param {Vector3} [c=(0,0,0)] - The third corner of the triangle.\n\t */\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\t/**\n\t\t * The first corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.a = a;\n\n\t\t/**\n\t\t * The second corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.b = b;\n\n\t\t/**\n\t\t * The third corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.c = c;\n\n\t}\n\n\t/**\n\t * Computes the normal vector of a triangle.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$1.subVectors( a, b );\n\t\ttarget.cross( _v0$1 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\n\t\t_v0$1.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$2.subVectors( point, a );\n\n\t\tconst dot00 = _v0$1.dot( _v0$1 );\n\t\tconst dot01 = _v0$1.dot( _v1$3 );\n\t\tconst dot02 = _v0$1.dot( _v2$2 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\t// if the triangle is degenerate then we can't contain a point\n\t\tif ( this.getBarycoord( point, a, b, c, _v3$2 ) === null ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn ( _v3$2.x >= 0 ) && ( _v3$2.y >= 0 ) && ( ( _v3$2.x + _v3$2.y ) <= 1 );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} p1 - The first corner of the triangle.\n\t * @param {Vector3} p2 - The second corner of the triangle.\n\t * @param {Vector3} p3 - The third corner of the triangle.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tstatic getInterpolation( point, p1, p2, p3, v1, v2, v3, target ) {\n\n\t\tif ( this.getBarycoord( point, p1, p2, p3, _v3$2 ) === null ) {\n\n\t\t\ttarget.x = 0;\n\t\t\ttarget.y = 0;\n\t\t\tif ( 'z' in target ) target.z = 0;\n\t\t\tif ( 'w' in target ) target.w = 0;\n\t\t\treturn null;\n\n\t\t}\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( v1, _v3$2.x );\n\t\ttarget.addScaledVector( v2, _v3$2.y );\n\t\ttarget.addScaledVector( v3, _v3$2.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given attribute and indices.\n\t *\n\t * @param {BufferAttribute} attr - The attribute to interpolate.\n\t * @param {number} i1 - Index of first vertex.\n\t * @param {number} i2 - Index of second vertex.\n\t * @param {number} i3 - Index of third vertex.\n\t * @param {Vector3} barycoord - The barycoordinate value to use to interpolate.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The interpolated attribute value.\n\t */\n\tstatic getInterpolatedAttribute( attr, i1, i2, i3, barycoord, target ) {\n\n\t\t_v40.setScalar( 0 );\n\t\t_v41.setScalar( 0 );\n\t\t_v42.setScalar( 0 );\n\n\t\t_v40.fromBufferAttribute( attr, i1 );\n\t\t_v41.fromBufferAttribute( attr, i2 );\n\t\t_v42.fromBufferAttribute( attr, i3 );\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( _v40, barycoord.x );\n\t\ttarget.addScaledVector( _v41, barycoord.y );\n\t\ttarget.addScaledVector( _v42, barycoord.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$1.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given values.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given array values.\n\t *\n\t * @param {Array} points - An array with 3D points.\n\t * @param {number} i0 - The array index representing the first corner of the triangle.\n\t * @param {number} i1 - The array index representing the second corner of the triangle.\n\t * @param {number} i2 - The array index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given attribute values.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute with 3D points data.\n\t * @param {number} i0 - The attribute index representing the first corner of the triangle.\n\t * @param {number} i1 - The attribute index representing the second corner of the triangle.\n\t * @param {number} i2 - The attribute index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new triangle with copied values from this instance.\n\t *\n\t * @return {Triangle} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given triangle to this instance.\n\t *\n\t * @param {Triangle} triangle - The triangle to copy.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the area of the triangle.\n\t *\n\t * @return {number} The triangle's area.\n\t */\n\tgetArea() {\n\n\t\t_v0$1.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$1.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\t/**\n\t * Computes the midpoint of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's midpoint.\n\t */\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\t/**\n\t * Computes the normal of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes a plane the triangle lies within.\n\t *\n\t * @param {Plane} target - The target vector that is used to store the method's result.\n\t * @return {Plane} The plane the triangle lies within.\n\t */\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tgetInterpolation( point, v1, v2, v3, target ) {\n\n\t\treturn Triangle.getInterpolation( point, this.a, this.b, this.c, v1, v2, v3, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this triangle intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\t/**\n\t * Returns the closest point on the triangle to the given point.\n\t *\n\t * @param {Vector3} p - The point to compute the closest point for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the triangle.\n\t */\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle is equal with the given one.\n\t *\n\t * @param {Triangle} triangle - The triangle to test for equality.\n\t * @return {boolean} Whether this triangle is equal with the given one.\n\t */\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\n/**\n * A Color instance is represented by RGB components in the linear working\n * color space, which defaults to `LinearSRGBColorSpace`. Inputs\n * conventionally using `SRGBColorSpace` (such as hexadecimals and CSS\n * strings) are converted to the working color space automatically.\n *\n * ```js\n * // converted automatically from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setHex( 0x112233 );\n * ```\n * Source color spaces may be specified explicitly, to ensure correct conversions.\n * ```js\n * // assumed already LinearSRGBColorSpace; no conversion\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5 );\n *\n * // converted explicitly from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5, SRGBColorSpace );\n * ```\n * If THREE.ColorManagement is disabled, no conversions occur. For details,\n * see Color management. Iterating through a Color instance will yield\n * its components (r, g, b) in the corresponding order. A Color can be initialised\n * in any of the following ways:\n * ```js\n * //empty constructor - will default white\n * const color1 = new THREE.Color();\n *\n * //Hexadecimal color (recommended)\n * const color2 = new THREE.Color( 0xff0000 );\n *\n * //RGB string\n * const color3 = new THREE.Color(\"rgb(255, 0, 0)\");\n * const color4 = new THREE.Color(\"rgb(100%, 0%, 0%)\");\n *\n * //X11 color name - all 140 color names are supported.\n * //Note the lack of CamelCase in the name\n * const color5 = new THREE.Color( 'skyblue' );\n * //HSL string\n * const color6 = new THREE.Color(\"hsl(0, 100%, 50%)\");\n *\n * //Separate RGB values between 0 and 1\n * const color7 = new THREE.Color( 1, 0, 0 );\n * ```\n */\nclass Color {\n\n\t/**\n\t * Constructs a new color.\n\t *\n\t * Note that standard method of specifying color in three.js is with a hexadecimal triplet,\n\t * and that method is used throughout the rest of the documentation.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t */\n\tconstructor( r, g, b ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isColor = true;\n\n\t\t/**\n\t\t * The red component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.r = 1;\n\n\t\t/**\n\t\t * The green component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.g = 1;\n\n\t\t/**\n\t\t * The blue component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.b = 1;\n\n\t\treturn this.set( r, g, b );\n\n\t}\n\n\t/**\n\t * Sets the colors's components from the given values.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t * @return {Color} A reference to this color.\n\t */\n\tset( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\n\t\t\tconst value = r;\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.setRGB( r, g, b );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the colors's components to the given scalar value.\n\t *\n\t * @param {number} scalar - The scalar value.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a hexadecimal value.\n\t *\n\t * @param {number} hex - The hexadecimal value.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHex( hex, colorSpace = SRGBColorSpace ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} r - Red channel value between `0.0` and `1.0`.\n\t * @param {number} g - Green channel value between `0.0` and `1.0`.\n\t * @param {number} b - Blue channel value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetRGB( r, g, b, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHSL( h, s, l, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = euclideanModulo( h, 1 );\n\t\ts = clamp( s, 0, 1 );\n\t\tl = clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a CSS-style string. For example, `rgb(250, 0,0)`,\n\t * `rgb(100%, 0%, 0%)`, `hsl(0, 100%, 50%)`, `#ff0000`, `#f00`, or `red` ( or\n\t * any [X11 color name](https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart) -\n\t * all 140 color names are supported).\n\t *\n\t * @param {string} style - Color as a CSS-style string.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetStyle( style, colorSpace = SRGBColorSpace ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\twarn( 'Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^(\\w+)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 1 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 2 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 3 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 1 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 2 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 3 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL(\n\t\t\t\t\t\t\tparseFloat( color[ 1 ] ) / 360,\n\t\t\t\t\t\t\tparseFloat( color[ 2 ] ) / 100,\n\t\t\t\t\t\t\tparseFloat( color[ 3 ] ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\twarn( 'Color: Unknown color model ' + style );\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\treturn this.setRGB(\n\t\t\t\t\tparseInt( hex.charAt( 0 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 1 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 2 ), 16 ) / 15,\n\t\t\t\t\tcolorSpace\n\t\t\t\t);\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\treturn this.setHex( parseInt( hex, 16 ), colorSpace );\n\n\t\t\t} else {\n\n\t\t\t\twarn( 'Color: Invalid hex color ' + style );\n\n\t\t\t}\n\n\t\t} else if ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style, colorSpace );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a color name. Faster than {@link Color#setStyle} if\n\t * you don't need the other CSS-style formats.\n\t *\n\t * For convenience, the list of names is exposed in `Color.NAMES` as a hash.\n\t * ```js\n\t * Color.NAMES.aliceblue // returns 0xF0F8FF\n\t * ```\n\t *\n\t * @param {string} style - The color name.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetColorName( style, colorSpace = SRGBColorSpace ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex, colorSpace );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\twarn( 'Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new color with copied values from this instance.\n\t *\n\t * @return {Color} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\t/**\n\t * Copies the values of the given color to this instance.\n\t *\n\t * @param {Color} color - The color to copy.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {number} The hexadecimal value.\n\t */\n\tgetHex( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\treturn Math.round( clamp( _color.r * 255, 0, 255 ) ) * 65536 + Math.round( clamp( _color.g * 255, 0, 255 ) ) * 256 + Math.round( clamp( _color.b * 255, 0, 255 ) );\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color as a string (for example, 'FFFFFF').\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The hexadecimal value as a string.\n\t */\n\tgetHexString( colorSpace = SRGBColorSpace ) {\n\n\t\treturn ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( -6 );\n\n\t}\n\n\t/**\n\t * Converts the colors RGB values into the HSL format and stores them into the\n\t * given target object.\n\t *\n\t * @param {{h:number,s:number,l:number}} target - The target object that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {{h:number,s:number,l:number}} The HSL representation of this color.\n\t */\n\tgetHSL( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the RGB values of this color and stores them into the given target object.\n\t *\n\t * @param {Color} target - The target color that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} The RGB representation of this color.\n\t */\n\tgetRGB( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\ttarget.r = _color.r;\n\t\ttarget.g = _color.g;\n\t\ttarget.b = _color.b;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the value of this color as a CSS style string. Example: `rgb(255,0,0)`.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The CSS representation of this color.\n\t */\n\tgetStyle( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tif ( colorSpace !== SRGBColorSpace ) {\n\n\t\t\t// Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n\t\t\treturn `color(${ colorSpace } ${ r.toFixed( 3 ) } ${ g.toFixed( 3 ) } ${ b.toFixed( 3 ) })`;\n\n\t\t}\n\n\t\treturn `rgb(${ Math.round( r * 255 ) },${ Math.round( g * 255 ) },${ Math.round( b * 255 ) })`;\n\n\t}\n\n\t/**\n\t * Adds the given HSL values to this color's values.\n\t * Internally, this converts the color's RGB values to HSL, adds HSL\n\t * and then converts the color back to RGB.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @return {Color} A reference to this color.\n\t */\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\treturn this.setHSL( _hslA.h + h, _hslA.s + s, _hslA.l + l );\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given color to the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to add.\n\t * @return {Color} A reference to this color.\n\t */\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given colors and stores the result in this instance.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @return {Color} A reference to this color.\n\t */\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Color} A reference to this color.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the RGB values of the given color from the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to subtract.\n\t * @return {Color} A reference to this color.\n\t */\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the RGB values of the given color with the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's RGB values toward the RGB values of the\n\t * given color. The alpha argument can be thought of as the ratio between\n\t * the two colors, where `0.0` is this color and `1.0` is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given colors and stores the result in this instance.\n\t * The alpha argument can be thought of as the ratio between the two colors, where `0.0`\n\t * is the first and `1.0` is the second color.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's HSL values toward the HSL values of the\n\t * given color. It differs from {@link Color#lerp} by not interpolating straight\n\t * from one color to the other, but instead going through all the hues in between\n\t * those two colors. The alpha argument can be thought of as the ratio between\n\t * the two colors, where 0.0 is this color and 1.0 is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the color's RGB components from the given 3D vector.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetFromVector3( v ) {\n\n\t\tthis.r = v.x;\n\t\tthis.g = v.y;\n\t\tthis.b = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this color with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix.\n\t * @return {Color} A reference to this color.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\t\tconst e = m.elements;\n\n\t\tthis.r = e[ 0 ] * r + e[ 3 ] * g + e[ 6 ] * b;\n\t\tthis.g = e[ 1 ] * r + e[ 4 ] * g + e[ 7 ] * b;\n\t\tthis.b = e[ 2 ] * r + e[ 5 ] * g + e[ 8 ] * b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this color is equal with the given one.\n\t *\n\t * @param {Color} c - The color to test for equality.\n\t * @return {boolean} Whether this bounding color is equal with the given one.\n\t */\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\t/**\n\t * Sets this color's RGB components from the given array.\n\t *\n\t * @param {Array} array - An array holding the RGB values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the RGB components of this color to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the color components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The color components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this color from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding color data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the color\n\t * as a hexadecimal value.\n\t *\n\t * @return {number} The hexadecimal value.\n\t */\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\n\t}\n\n}\n\nconst _color = /*@__PURE__*/ new Color();\n\n/**\n * A dictionary with X11 color names.\n *\n * Note that multiple words such as Dark Orange become the string 'darkorange'.\n *\n * @static\n * @type {Object}\n */\nColor.NAMES = _colorKeywords;\n\nlet _materialId = 0;\n\n/**\n * Abstract base class for materials.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Material extends EventDispatcher {\n\n\t/**\n\t * Constructs a new material.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMaterial = true;\n\n\t\t/**\n\t\t * The ID of the material.\n\t\t *\n\t\t * @name Material#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _materialId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Material';\n\n\t\t/**\n\t\t * Defines the blending type of the material.\n\t\t *\n\t\t * It must be set to `CustomBlending` if custom blending properties like\n\t\t * {@link Material#blendSrc}, {@link Material#blendDst} or {@link Material#blendEquation}\n\t\t * should have any effect.\n\t\t *\n\t\t * @type {(NoBlending|NormalBlending|AdditiveBlending|SubtractiveBlending|MultiplyBlending|CustomBlending)}\n\t\t * @default NormalBlending\n\t\t */\n\t\tthis.blending = NormalBlending;\n\n\t\t/**\n\t\t * Defines which side of faces will be rendered - front, back or both.\n\t\t *\n\t\t * @type {(FrontSide|BackSide|DoubleSide)}\n\t\t * @default FrontSide\n\t\t */\n\t\tthis.side = FrontSide;\n\n\t\t/**\n\t\t * If set to `true`, vertex colors should be used.\n\t\t *\n\t\t * The engine supports RGB and RGBA vertex colors depending on whether a three (RGB) or\n\t\t * four (RGBA) component color buffer attribute is used.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.vertexColors = false;\n\n\t\t/**\n\t\t * Defines how transparent the material is.\n\t\t * A value of `0.0` indicates fully transparent, `1.0` is fully opaque.\n\t\t *\n\t\t * If the {@link Material#transparent} is not set to `true`,\n\t\t * the material will remain fully opaque and this value will only affect its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.opacity = 1;\n\n\t\t/**\n\t\t * Defines whether this material is transparent. This has an effect on\n\t\t * rendering as transparent objects need special treatment and are rendered\n\t\t * after non-transparent objects.\n\t\t *\n\t\t * When set to true, the extent to which the material is transparent is\n\t\t * controlled by {@link Material#opacity}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.transparent = false;\n\n\t\t/**\n\t\t * Enables alpha hashed transparency, an alternative to {@link Material#transparent} or\n\t\t * {@link Material#alphaTest}. The material will not be rendered if opacity is lower than\n\t\t * a random threshold. Randomization introduces some grain or noise, but approximates alpha\n\t\t * blending without the associated problems of sorting. Using TAA can reduce the resulting noise.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaHash = false;\n\n\t\t/**\n\t\t * Defines the blending source factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default SrcAlphaFactor\n\t\t */\n\t\tthis.blendSrc = SrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending destination factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default OneMinusSrcAlphaFactor\n\t\t */\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending equation.\n\t\t *\n\t\t * @type {(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default AddEquation\n\t\t */\n\t\tthis.blendEquation = AddEquation;\n\n\t\t/**\n\t\t * Defines the blending source alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendSrcAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending destination alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendDstAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending equation of the alpha channel.\n\t\t *\n\t\t * @type {?(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendEquationAlpha = null;\n\n\t\t/**\n\t\t * Represents the RGB values of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantColor` or `OneMinusConstantColor`.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.blendColor = new Color( 0, 0, 0 );\n\n\t\t/**\n\t\t * Represents the alpha value of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantAlpha` or `OneMinusConstantAlpha`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.blendAlpha = 0;\n\n\t\t/**\n\t\t * Defines the depth function.\n\t\t *\n\t\t * @type {(NeverDepth|AlwaysDepth|LessDepth|LessEqualDepth|EqualDepth|GreaterEqualDepth|GreaterDepth|NotEqualDepth)}\n\t\t * @default LessEqualDepth\n\t\t */\n\t\tthis.depthFunc = LessEqualDepth;\n\n\t\t/**\n\t\t * Whether to have depth test enabled when rendering this material.\n\t\t * When the depth test is disabled, the depth write will also be implicitly disabled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthTest = true;\n\n\t\t/**\n\t\t * Whether rendering this material has any effect on the depth buffer.\n\t\t *\n\t\t * When drawing 2D overlays it can be useful to disable the depth writing in\n\t\t * order to layer several things together without creating z-index artifacts.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthWrite = true;\n\n\t\t/**\n\t\t * The bit mask to use when writing to the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilWriteMask = 0xff;\n\n\t\t/**\n\t\t * The stencil comparison function to use.\n\t\t *\n\t\t * @type {NeverStencilFunc|LessStencilFunc|EqualStencilFunc|LessEqualStencilFunc|GreaterStencilFunc|NotEqualStencilFunc|GreaterEqualStencilFunc|AlwaysStencilFunc}\n\t\t * @default AlwaysStencilFunc\n\t\t */\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\n\t\t/**\n\t\t * The value to use when performing stencil comparisons or stencil operations.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.stencilRef = 0;\n\n\t\t/**\n\t\t * The bit mask to use when comparing against the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilFuncMask = 0xff;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns `false`.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` but the depth test fails.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` and the depth test passes.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZPass = KeepStencilOp;\n\n\t\t/**\n\t\t * Whether stencil operations are performed against the stencil buffer. In\n\t\t * order to perform writes or comparisons against the stencil buffer this\n\t\t * value must be `true`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilWrite = false;\n\n\t\t/**\n\t\t * User-defined clipping planes specified as THREE.Plane objects in world\n\t\t * space. These planes apply to the objects this material is attached to.\n\t\t * Points in space whose signed distance to the plane is negative are clipped\n\t\t * (not rendered). This requires {@link WebGLRenderer#localClippingEnabled} to\n\t\t * be `true`.\n\t\t *\n\t\t * @type {?Array}\n\t\t * @default null\n\t\t */\n\t\tthis.clippingPlanes = null;\n\n\t\t/**\n\t\t * Changes the behavior of clipping planes so that only their intersection is\n\t\t * clipped, rather than their union.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipIntersection = false;\n\n\t\t/**\n\t\t * Defines whether to clip shadows according to the clipping planes specified\n\t\t * on this material.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipShadows = false;\n\n\t\t/**\n\t\t * Defines which side of faces cast shadows. If `null`, the side casting shadows\n\t\t * is determined as follows:\n\t\t *\n\t\t * - When {@link Material#side} is set to `FrontSide`, the back side cast shadows.\n\t\t * - When {@link Material#side} is set to `BackSide`, the front side cast shadows.\n\t\t * - When {@link Material#side} is set to `DoubleSide`, both sides cast shadows.\n\t\t *\n\t\t * @type {?(FrontSide|BackSide|DoubleSide)}\n\t\t * @default null\n\t\t */\n\t\tthis.shadowSide = null;\n\n\t\t/**\n\t\t * Whether to render the material's color.\n\t\t *\n\t\t * This can be used in conjunction with {@link Object3D#renderOder} to create invisible\n\t\t * objects that occlude other objects.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.colorWrite = true;\n\n\t\t/**\n\t\t * Override the renderer's default precision for this material.\n\t\t *\n\t\t * @type {?('highp'|'mediump'|'lowp')}\n\t\t * @default null\n\t\t */\n\t\tthis.precision = null;\n\n\t\t/**\n\t\t * Whether to use polygon offset or not. When enabled, each fragment's depth value will\n\t\t * be offset after it is interpolated from the depth values of the appropriate vertices.\n\t\t * The offset is added before the depth test is performed and before the value is written\n\t\t * into the depth buffer.\n\t\t *\n\t\t * Can be useful for rendering hidden-line images, for applying decals to surfaces, and for\n\t\t * rendering solids with highlighted edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.polygonOffset = false;\n\n\t\t/**\n\t\t * Specifies a scale factor that is used to create a variable depth offset for each polygon.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetFactor = 0;\n\n\t\t/**\n\t\t * Is multiplied by an implementation-specific value to create a constant depth offset.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\t/**\n\t\t * Whether to apply dithering to the color to remove the appearance of banding.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.dithering = false;\n\n\t\t/**\n\t\t * Whether alpha to coverage should be enabled or not. Can only be used with MSAA-enabled contexts\n\t\t * (meaning when the renderer was created with *antialias* parameter set to `true`). Enabling this\n\t\t * will smooth aliasing on clip plane edges and alphaTest-clipped edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaToCoverage = false;\n\n\t\t/**\n\t\t * Whether to premultiply the alpha (transparency) value.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultipliedAlpha = false;\n\n\t\t/**\n\t\t * Whether double-sided, transparent objects should be rendered with a single pass or not.\n\t\t *\n\t\t * The engine renders double-sided, transparent objects with two draw calls (back faces first,\n\t\t * then front faces) to mitigate transparency artifacts. There are scenarios however where this\n\t\t * approach produces no quality gains but still doubles draw calls e.g. when rendering flat\n\t\t * vegetation like grass sprites. In these cases, set the `forceSinglePass` flag to `true` to\n\t\t * disable the two pass rendering to avoid performance issues.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.forceSinglePass = false;\n\n\t\t/**\n\t\t * Whether it's possible to override the material with {@link Scene#overrideMaterial} or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.allowOverride = true;\n\n\t\t/**\n\t\t * Defines whether 3D objects using this material are visible.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * Defines whether this material is tone mapped according to the renderer's tone mapping setting.\n\t\t *\n\t\t * It is ignored when rendering to a render target or using post processing or when using\n\t\t * `WebGPURenderer`. In all these cases, all materials are honored by tone mapping.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.toneMapped = true;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the Material. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Material#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\t/**\n\t * Sets the alpha value to be used when running an alpha test. The material\n\t * will not be rendered if the opacity is lower than this value.\n\t *\n\t * @type {number}\n\t * @readonly\n\t * @default 0\n\t */\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\t/**\n\t * An optional callback that is executed immediately before the material is used to render a 3D object.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Scene} scene - The scene.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\t/**\n\t * An optional callback that is executed immediately before the shader\n\t * program is compiled. This function is called with the shader source code\n\t * as a parameter. Useful for the modification of built-in materials.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}. The\n\t * recommended approach when customizing materials is to use `WebGPURenderer` with the new\n\t * Node Material system and [TSL](https://github.com/mrdoob/three.js/wiki/Three.js-Shading-Language).\n\t *\n\t * @param {{vertexShader:string,fragmentShader:string,uniforms:Object}} shaderobject - The object holds the uniforms and the vertex and fragment shader source.\n\t * @param {WebGLRenderer} renderer - A reference to the renderer.\n\t */\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\t/**\n\t * In case {@link Material#onBeforeCompile} is used, this callback can be used to identify\n\t * values of settings used in `onBeforeCompile()`, so three.js can reuse a cached\n\t * shader or recompile the shader for this material as needed.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @return {string} The custom program cache key.\n\t */\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\t/**\n\t * This method can be used to set default values from parameter objects.\n\t * It is a generic implementation so it can be used with different types\n\t * of materials.\n\t *\n\t * @param {Object} [values] - The material values to set.\n\t */\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\twarn( `Material: parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\twarn( `Material: '${ key }' is not a property of THREE.${ this.type }.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the material into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized material.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRootObject ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity !== undefined && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.sheenColorMap && this.sheenColorMap.isTexture ) {\n\n\t\t\tdata.sheenColorMap = this.sheenColorMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.sheenRoughnessMap && this.sheenRoughnessMap.isTexture ) {\n\n\t\t\tdata.sheenRoughnessMap = this.sheenRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.dispersion !== undefined ) data.dispersion = this.dispersion;\n\n\t\tif ( this.iridescence !== undefined ) data.iridescence = this.iridescence;\n\t\tif ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR;\n\t\tif ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange;\n\n\t\tif ( this.iridescenceMap && this.iridescenceMap.isTexture ) {\n\n\t\t\tdata.iridescenceMap = this.iridescenceMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture ) {\n\n\t\t\tdata.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.anisotropy !== undefined ) data.anisotropy = this.anisotropy;\n\t\tif ( this.anisotropyRotation !== undefined ) data.anisotropyRotation = this.anisotropyRotation;\n\n\t\tif ( this.anisotropyMap && this.anisotropyMap.isTexture ) {\n\n\t\t\tdata.anisotropyMap = this.anisotropyMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapRotation !== undefined ) data.envMapRotation = this.envMapRotation.toArray();\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined && this.attenuationDistance !== Infinity ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors === true ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = true;\n\n\t\tif ( this.blendSrc !== SrcAlphaFactor ) data.blendSrc = this.blendSrc;\n\t\tif ( this.blendDst !== OneMinusSrcAlphaFactor ) data.blendDst = this.blendDst;\n\t\tif ( this.blendEquation !== AddEquation ) data.blendEquation = this.blendEquation;\n\t\tif ( this.blendSrcAlpha !== null ) data.blendSrcAlpha = this.blendSrcAlpha;\n\t\tif ( this.blendDstAlpha !== null ) data.blendDstAlpha = this.blendDstAlpha;\n\t\tif ( this.blendEquationAlpha !== null ) data.blendEquationAlpha = this.blendEquationAlpha;\n\t\tif ( this.blendColor && this.blendColor.isColor ) data.blendColor = this.blendColor.getHex();\n\t\tif ( this.blendAlpha !== 0 ) data.blendAlpha = this.blendAlpha;\n\n\t\tif ( this.depthFunc !== LessEqualDepth ) data.depthFunc = this.depthFunc;\n\t\tif ( this.depthTest === false ) data.depthTest = this.depthTest;\n\t\tif ( this.depthWrite === false ) data.depthWrite = this.depthWrite;\n\t\tif ( this.colorWrite === false ) data.colorWrite = this.colorWrite;\n\n\t\tif ( this.stencilWriteMask !== 0xff ) data.stencilWriteMask = this.stencilWriteMask;\n\t\tif ( this.stencilFunc !== AlwaysStencilFunc ) data.stencilFunc = this.stencilFunc;\n\t\tif ( this.stencilRef !== 0 ) data.stencilRef = this.stencilRef;\n\t\tif ( this.stencilFuncMask !== 0xff ) data.stencilFuncMask = this.stencilFuncMask;\n\t\tif ( this.stencilFail !== KeepStencilOp ) data.stencilFail = this.stencilFail;\n\t\tif ( this.stencilZFail !== KeepStencilOp ) data.stencilZFail = this.stencilZFail;\n\t\tif ( this.stencilZPass !== KeepStencilOp ) data.stencilZPass = this.stencilZPass;\n\t\tif ( this.stencilWrite === true ) data.stencilWrite = this.stencilWrite;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaHash === true ) data.alphaHash = true;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = true;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = true;\n\t\tif ( this.forceSinglePass === true ) data.forceSinglePass = true;\n\n\t\tif ( this.wireframe === true ) data.wireframe = true;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( this.fog === false ) data.fog = false;\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new material with copied values from this instance.\n\t *\n\t * @return {Material} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given material to this instance.\n\t *\n\t * @param {Material} source - The material to copy.\n\t * @return {Material} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\t\tthis.blendColor.copy( source.blendColor );\n\t\tthis.blendAlpha = source.blendAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaHash = source.alphaHash;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\t\tthis.forceSinglePass = source.forceSinglePass;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Material#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the material has been disposed of.\n\t\t *\n\t\t * @event Material#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the material\n\t * needs to be recompiled.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\n/**\n * A material for drawing geometries in a simple shaded (flat or wireframe) way.\n *\n * This material is not affected by lights.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshBasicMaterial\n */\nclass MeshBasicMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh basic material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshBasicMaterial = true;\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Specular map used by the material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst _tables = /*@__PURE__*/ _generateTables();\n\nfunction _generateTables() {\n\n\t// float32 to float16 helpers\n\n\tconst buffer = new ArrayBuffer( 4 );\n\tconst floatView = new Float32Array( buffer );\n\tconst uint32View = new Uint32Array( buffer );\n\n\tconst baseTable = new Uint32Array( 512 );\n\tconst shiftTable = new Uint32Array( 512 );\n\n\tfor ( let i = 0; i < 256; ++ i ) {\n\n\t\tconst e = i - 127;\n\n\t\t// very small number (0, -0)\n\n\t\tif ( e < -27 ) {\n\n\t\t\tbaseTable[ i ] = 0x0000;\n\t\t\tbaseTable[ i | 0x100 ] = 0x8000;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// small number (denorm)\n\n\t\t} else if ( e < -14 ) {\n\n\t\t\tbaseTable[ i ] = 0x0400 >> ( - e - 14 );\n\t\t\tbaseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000;\n\t\t\tshiftTable[ i ] = - e - 1;\n\t\t\tshiftTable[ i | 0x100 ] = - e - 1;\n\n\t\t\t// normal number\n\n\t\t} else if ( e <= 15 ) {\n\n\t\t\tbaseTable[ i ] = ( e + 15 ) << 10;\n\t\t\tbaseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t\t// large number (Infinity, -Infinity)\n\n\t\t} else if ( e < 128 ) {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// stay (NaN, Infinity, -Infinity)\n\n\t\t} else {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t}\n\n\t}\n\n\t// float16 to float32 helpers\n\n\tconst mantissaTable = new Uint32Array( 2048 );\n\tconst exponentTable = new Uint32Array( 64 );\n\tconst offsetTable = new Uint32Array( 64 );\n\n\tfor ( let i = 1; i < 1024; ++ i ) {\n\n\t\tlet m = i << 13; // zero pad mantissa bits\n\t\tlet e = 0; // zero exponent\n\n\t\t// normalized\n\t\twhile ( ( m & 0x00800000 ) === 0 ) {\n\n\t\t\tm <<= 1;\n\t\t\te -= 0x00800000; // decrement exponent\n\n\t\t}\n\n\t\tm &= -8388609; // clear leading 1 bit\n\t\te += 0x38800000; // adjust bias\n\n\t\tmantissaTable[ i ] = m | e;\n\n\t}\n\n\tfor ( let i = 1024; i < 2048; ++ i ) {\n\n\t\tmantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 );\n\n\t}\n\n\tfor ( let i = 1; i < 31; ++ i ) {\n\n\t\texponentTable[ i ] = i << 23;\n\n\t}\n\n\texponentTable[ 31 ] = 0x47800000;\n\texponentTable[ 32 ] = 0x80000000;\n\n\tfor ( let i = 33; i < 63; ++ i ) {\n\n\t\texponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 );\n\n\t}\n\n\texponentTable[ 63 ] = 0xc7800000;\n\n\tfor ( let i = 1; i < 64; ++ i ) {\n\n\t\tif ( i !== 32 ) {\n\n\t\t\toffsetTable[ i ] = 1024;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tfloatView: floatView,\n\t\tuint32View: uint32View,\n\t\tbaseTable: baseTable,\n\t\tshiftTable: shiftTable,\n\t\tmantissaTable: mantissaTable,\n\t\texponentTable: exponentTable,\n\t\toffsetTable: offsetTable\n\t};\n\n}\n\n/**\n * Returns a half precision floating point value (FP16) from the given single\n * precision floating point value (FP32).\n *\n * @param {number} val - A single precision floating point value.\n * @return {number} The FP16 value.\n */\nfunction toHalfFloat( val ) {\n\n\tif ( Math.abs( val ) > 65504 ) warn( 'DataUtils.toHalfFloat(): Value out of range.' );\n\n\tval = clamp( val, -65504, 65504 );\n\n\t_tables.floatView[ 0 ] = val;\n\tconst f = _tables.uint32View[ 0 ];\n\tconst e = ( f >> 23 ) & 0x1ff;\n\treturn _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] );\n\n}\n\n/**\n * Returns a single precision floating point value (FP32) from the given half\n * precision floating point value (FP16).\n *\n * @param {number} val - A half precision floating point value.\n * @return {number} The FP32 value.\n */\nfunction fromHalfFloat( val ) {\n\n\tconst m = val >> 10;\n\t_tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ];\n\treturn _tables.floatView[ 0 ];\n\n}\n\n/**\n * A class containing utility functions for data.\n *\n * @hideconstructor\n */\nclass DataUtils {\n\n\t/**\n\t * Returns a half precision floating point value (FP16) from the given single\n\t * precision floating point value (FP32).\n\t *\n\t * @param {number} val - A single precision floating point value.\n\t * @return {number} The FP16 value.\n\t */\n\tstatic toHalfFloat( val ) {\n\n\t\treturn toHalfFloat( val );\n\n\t}\n\n\t/**\n\t * Returns a single precision floating point value (FP32) from the given half\n\t * precision floating point value (FP16).\n\t *\n\t * @param {number} val - A half precision floating point value.\n\t * @return {number} The FP32 value.\n\t */\n\tstatic fromHalfFloat( val ) {\n\n\t\treturn fromHalfFloat( val );\n\n\t}\n\n}\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\nconst _vector2$1 = /*@__PURE__*/ new Vector2();\n\nlet _id$2 = 0;\n\n/**\n * This class stores data for an attribute (such as vertex positions, face\n * indices, normals, colors, UVs, and any custom attributes ) associated with\n * a geometry, which allows for more efficient passing of data to the GPU.\n *\n * When working with vector-like data, the `fromBufferAttribute( attribute, index )`\n * helper methods on vector and color class might be helpful. E.g. {@link Vector3#fromBufferAttribute}.\n */\nclass BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {TypedArray} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized = false ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferAttribute = true;\n\n\t\t/**\n\t\t * The ID of the buffer attribute.\n\t\t *\n\t\t * @name BufferAttribute#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$2 ++ } );\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The array holding the attribute data. It should have `itemSize * numVertices`\n\t\t * elements, where `numVertices` is the number of vertices in the associated geometry.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of values of the array that should be associated with a particular vertex.\n\t\t * For instance, if this attribute is storing a 3-component vector (such as a position,\n\t\t * normal, or color), then the value should be `3`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * Represents the number of items this buffer attribute stores. It is internally computed\n\t\t * by dividing the `array` length by the `itemSize`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\n\t\t/**\n\t\t * Applies to integer data only. Indicates how the underlying data in the buffer maps to\n\t\t * the values in the GLSL code. For instance, if `array` is an instance of `UInt16Array`,\n\t\t * and `normalized` is `true`, the values `0 - +65535` in the array data will be mapped to\n\t\t * `0.0f - +1.0f` in the GLSL attribute. If `normalized` is `false`, the values will be converted\n\t\t * to floats unmodified, i.e. `65535` becomes `65535.0f`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t *\n\t\t * Note: After the initial use of a buffer, its usage cannot be changed. Instead,\n\t\t * instantiate a new one and set the desired usage before the next render.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * This can be used to only update some components of stored vectors (for example, just the\n\t\t * component related to color). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * Configures the bound GPU type for use in shaders.\n\t\t *\n\t\t * Note: this only has an effect for integer arrays and is not configurable for float arrays.\n\t\t * For lower precision float types, use `Float16BufferAttribute`.\n\t\t *\n\t\t * @type {(FloatType|IntType)}\n\t\t * @default FloatType\n\t\t */\n\t\tthis.gpuType = FloatType;\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * A callback function that is executed after the renderer has transferred the attribute\n\t * array data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the usage of this buffer attribute.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {BufferAttribute} A reference to this buffer attribute.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Copies the values of the given buffer attribute to this instance.\n\t *\n\t * @param {BufferAttribute} source - The buffer attribute to copy.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\t\tthis.gpuType = source.gpuType;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies a vector from the given buffer attribute to this one. The start\n\t * and destination position in the attribute buffers are represented by the\n\t * given indices.\n\t *\n\t * @param {number} index1 - The destination index into this buffer attribute.\n\t * @param {BufferAttribute} attribute - The buffer attribute to copy from.\n\t * @param {number} index2 - The source index into the given buffer attribute.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given array data into this buffer attribute.\n\t *\n\t * @param {(TypedArray|Array)} array - The array to copy.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 matrix to the given attribute. Works with\n\t * item size `2` and `3`.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$9.fromBufferAttribute( this, i );\n\t\t\t\t_vector$9.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 normal matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix3} m - The normal matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3` and with direction vectors.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given array data in the buffer attribute.\n\t *\n\t * @param {(TypedArray|Array)} value - The array data to set.\n\t * @param {number} [offset=0] - The offset in this buffer attribute's array.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tset( value, offset = 0 ) {\n\n\t\t// Matching BufferAttribute constructor, do not normalize the array.\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @return {number} The returned value.\n\t */\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.itemSize + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Sets the given value to the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @param {number} value - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.array[ index * this.itemSize + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The x component.\n\t */\n\tgetX( index ) {\n\n\t\tlet x = this.array[ index * this.itemSize ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\t/**\n\t * Sets the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The y component.\n\t */\n\tgetY( index ) {\n\n\t\tlet y = this.array[ index * this.itemSize + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\t/**\n\t * Sets the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} y - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The z component.\n\t */\n\tgetZ( index ) {\n\n\t\tlet z = this.array[ index * this.itemSize + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\t/**\n\t * Sets the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} z - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The w component.\n\t */\n\tgetW( index ) {\n\n\t\tlet w = this.array[ index * this.itemSize + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\t/**\n\t * Sets the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} w - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x and y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y, z and w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @param {number} w - The value for the w component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given callback function that is executed after the Renderer has transferred\n\t * the attribute array data to the GPU. Can be used to perform clean-up operations after\n\t * the upload when attribute data are not needed anymore on the CPU side.\n\t *\n\t * @param {Function} callback - The `onUpload()` callback.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new buffer attribute with copied values from this instance.\n\t *\n\t * @return {BufferAttribute} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the buffer attribute into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized buffer attribute.\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.from( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int8` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int8BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Int8Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt8` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint8Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt8Clamped` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint8ClampedArray)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int16` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Int16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt16` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Int32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Float16` buffer attribute with\n * a plain `Array` instance.\n *\n * This class automatically converts to and from FP16 via `Uint16Array` since `Float16Array`\n * browser support is still problematic.\n *\n * @augments BufferAttribute\n */\nclass Float16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t\tthis.isFloat16BufferAttribute = true;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = fromHalfFloat( this.array[ index * this.itemSize ] );\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = toHalfFloat( x );\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] );\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] );\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] );\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\t\tthis.array[ index + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Float32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Float32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Float32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nlet _id$1 = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box$2 = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector$8 = /*@__PURE__*/ new Vector3();\n\n/**\n * A representation of mesh, line, or point geometry. Includes vertex\n * positions, face indices, normals, colors, UVs, and custom attributes\n * within buffers, reducing the cost of passing all this data to the GPU.\n *\n * ```js\n * const geometry = new THREE.BufferGeometry();\n * // create a simple square shape. We duplicate the top left and bottom right\n * // vertices because each vertex needs to appear once per triangle.\n * const vertices = new Float32Array( [\n * \t-1.0, -1.0, 1.0, // v0\n * \t 1.0, -1.0, 1.0, // v1\n * \t 1.0, 1.0, 1.0, // v2\n *\n * \t 1.0, 1.0, 1.0, // v3\n * \t-1.0, 1.0, 1.0, // v4\n * \t-1.0, -1.0, 1.0 // v5\n * ] );\n * // itemSize = 3 because there are 3 values (components) per vertex\n * geometry.setAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );\n * const material = new THREE.MeshBasicMaterial( { color: 0xff0000 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * ```\n *\n * @augments EventDispatcher\n */\nclass BufferGeometry extends EventDispatcher {\n\n\t/**\n\t * Constructs a new geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferGeometry = true;\n\n\t\t/**\n\t\t * The ID of the geometry.\n\t\t *\n\t\t * @name BufferGeometry#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$1 ++ } );\n\n\t\t/**\n\t\t * The UUID of the geometry.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the geometry.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\t/**\n\t\t * Allows for vertices to be re-used across multiple triangles; this is\n\t\t * called using \"indexed triangles\". Each triangle is associated with the\n\t\t * indices of three vertices. This attribute therefore stores the index of\n\t\t * each vertex for each triangular face. If this attribute is not set, the\n\t\t * renderer assumes that each three contiguous positions represent a single triangle.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.index = null;\n\n\t\t/**\n\t\t * A (storage) buffer attribute which was generated with a compute shader and\n\t\t * now defines indirect draw calls.\n\t\t *\n\t\t * Can only be used with {@link WebGPURenderer} and a WebGPU backend.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.indirect = null;\n\n\t\t/**\n\t\t * This dictionary has as id the name of the attribute to be set and as value\n\t\t * the buffer attribute to set it to. Rather than accessing this property directly,\n\t\t * use `setAttribute()` and `getAttribute()` to access attributes of this geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.attributes = {};\n\n\t\t/**\n\t\t * This dictionary holds the morph targets of the geometry.\n\t\t *\n\t\t * Note: Once the geometry has been rendered, the morph attribute data cannot\n\t\t * be changed. You will have to call `dispose()?, and create a new geometry instance.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.morphAttributes = {};\n\n\t\t/**\n\t\t * Used to control the morph target behavior; when set to `true`, the morph\n\t\t * target data is treated as relative offsets, rather than as absolute\n\t\t * positions/normals.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.morphTargetsRelative = false;\n\n\t\t/**\n\t\t * Split the geometry into groups, each of which will be rendered in a\n\t\t * separate draw call. This allows an array of materials to be used with the geometry.\n\t\t *\n\t\t * Use `addGroup()` and `clearGroups()` to edit groups, rather than modifying this array directly.\n\t\t *\n\t\t * Every vertex and index must belong to exactly one group — groups must not share vertices or\n\t\t * indices, and must not leave vertices or indices unused.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.groups = [];\n\n\t\t/**\n\t\t * Bounding box for the geometry which can be calculated with `computeBoundingBox()`.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * Bounding sphere for the geometry which can be calculated with `computeBoundingSphere()`.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Determines the part of the geometry to render. This should not be set directly,\n\t\t * instead use `setDrawRange()`.\n\t\t *\n\t\t * @type {{start:number,count:number}}\n\t\t */\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the geometry.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * Returns the index of this geometry.\n\t *\n\t * @return {?BufferAttribute} The index. Returns `null` if no index is defined.\n\t */\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\t/**\n\t * Sets the given index to this geometry.\n\t *\n\t * @param {Array|BufferAttribute} index - The index to set.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given indirect attribute to this geometry.\n\t *\n\t * @param {BufferAttribute} indirect - The attribute holding indirect draw calls.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetIndirect( indirect ) {\n\n\t\tthis.indirect = indirect;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the indirect attribute of this geometry.\n\t *\n\t * @return {?BufferAttribute} The indirect attribute. Returns `null` if no indirect attribute is defined.\n\t */\n\tgetIndirect() {\n\n\t\treturn this.indirect;\n\n\t}\n\n\t/**\n\t * Returns the buffer attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {BufferAttribute|InterleavedBufferAttribute|undefined} The buffer attribute.\n\t * Returns `undefined` if not attribute has been found.\n\t */\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\t/**\n\t * Sets the given attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @param {BufferAttribute|InterleavedBufferAttribute} attribute - The attribute to set.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes the attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name to delete.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this geometry has an attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {boolean} Whether this geometry has an attribute for the given name or not.\n\t */\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\t/**\n\t * Adds a group to this geometry.\n\t *\n\t * @param {number} start - The first element in this draw call. That is the first\n\t * vertex for non-indexed geometry, otherwise the first triangle index.\n\t * @param {number} count - Specifies how many vertices (or indices) are part of this group.\n\t * @param {number} [materialIndex=0] - The material array index to use.\n\t */\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Clears all groups.\n\t */\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\t/**\n\t * Sets the draw range for this geometry.\n\t *\n\t * @param {number} start - The first vertex for non-indexed geometry, otherwise the first triangle index.\n\t * @param {number} count - For non-indexed BufferGeometry, `count` is the number of vertices to render.\n\t * For indexed BufferGeometry, `count` is the number of indices to render.\n\t */\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 transformation matrix to the geometry.\n\t *\n\t * @param {Matrix4} matrix - The matrix to apply.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the rotation represented by the Quaternion to the geometry.\n\t *\n\t * @param {Quaternion} q - The Quaternion to apply.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the X axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the Y axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the Z axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the geometry. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#position} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} x - The x offset.\n\t * @param {number} y - The y offset.\n\t * @param {number} z - The z offset.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales the geometry. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#scale} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} x - The x scale.\n\t * @param {number} y - The y scale.\n\t * @param {number} z - The z scale.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry to face a point in 3D space. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#lookAt} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {Vector3} vector - The target point.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Center the geometry based on its bounding box.\n\t *\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines a geometry by creating a `position` attribute based on the given array of points. The array\n\t * can hold 2D or 3D vectors. When using two-dimensional data, the `z` coordinate for all vertices is\n\t * set to `0`.\n\t *\n\t * If the method is used with an existing `position` attribute, the vertex data are overwritten with the\n\t * data from the array. The length of the array must match the vertex count.\n\t *\n\t * @param {Array|Array} points - The points.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute === undefined ) {\n\n\t\t\tconst position = [];\n\n\t\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\t} else {\n\n\t\t\tconst l = Math.min( points.length, positionAttribute.count ); // make sure data do not exceed buffer size\n\n\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tpositionAttribute.setXYZ( i, point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tif ( points.length > positionAttribute.count ) {\n\n\t\t\t\twarn( 'BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry.' );\n\n\t\t\t}\n\n\t\t\tpositionAttribute.needsUpdate = true;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the geometry, and updates the `boundingBox` member.\n\t * The bounding box is not computed by the engine; it must be computed by your app.\n\t * You may need to recompute the bounding box if the geometry vertices are modified.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$2.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.min, _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.max, _box$2.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the geometry, and updates the `boundingSphere` member.\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if the geometry vertices are modified.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$2.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$2.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$8.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$8.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$8.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\terror( 'BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calculates and adds a tangent attribute to this geometry.\n\t *\n\t * The computation is only supported for indexed geometries and if position, normal, and uv attributes\n\t * are defined. When using a tangent space normal map, prefer the MikkTSpace algorithm provided by\n\t * {@link BufferGeometryUtils#computeMikkTSpaceTangents} instead.\n\t */\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\terror( 'BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst positionAttribute = attributes.position;\n\t\tconst normalAttribute = attributes.normal;\n\t\tconst uvAttribute = attributes.uv;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * positionAttribute.count ), 4 ) );\n\n\t\t}\n\n\t\tconst tangentAttribute = this.getAttribute( 'tangent' );\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromBufferAttribute( positionAttribute, a );\n\t\t\tvB.fromBufferAttribute( positionAttribute, b );\n\t\t\tvC.fromBufferAttribute( positionAttribute, c );\n\n\t\t\tuvA.fromBufferAttribute( uvAttribute, a );\n\t\t\tuvB.fromBufferAttribute( uvAttribute, b );\n\t\t\tuvC.fromBufferAttribute( uvAttribute, c );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: index.count\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindex.getX( j + 0 ),\n\t\t\t\t\tindex.getX( j + 1 ),\n\t\t\t\t\tindex.getX( j + 2 )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromBufferAttribute( normalAttribute, v );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? -1 : 1.0;\n\n\t\t\ttangentAttribute.setXYZW( v, tmp.x, tmp.y, tmp.z, w );\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( index.getX( j + 0 ) );\n\t\t\t\thandleVertex( index.getX( j + 1 ) );\n\t\t\t\thandleVertex( index.getX( j + 2 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes vertex normals for the given vertex data. For indexed geometries, the method sets\n\t * each vertex normal to be the average of the face normals of the faces that share that vertex.\n\t * For non-indexed geometries, vertices are not shared, and the method sets each vertex normal\n\t * to be the same as the face normal.\n\t */\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Ensures every normal vector in a geometry will have a magnitude of `1`. This will\n\t * correct lighting on the geometry surfaces.\n\t */\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$8.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a new non-index version of this indexed geometry. If the geometry\n\t * is already non-indexed, the method is a NOOP.\n\t *\n\t * @return {BufferGeometry} The non-indexed version of this indexed geometry.\n\t */\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\twarn( 'BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\t/**\n\t * Serializes the geometry into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized geometry.\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = boundingSphere.toJSON();\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new geometry with copied values from this instance.\n\t *\n\t * @return {BufferGeometry} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given geometry to this instance.\n\t *\n\t * @param {BufferGeometry} source - The geometry to copy.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires BufferGeometry#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nconst _inverseMatrix$3 = /*@__PURE__*/ new Matrix4();\nconst _ray$3 = /*@__PURE__*/ new Ray();\nconst _sphere$6 = /*@__PURE__*/ new Sphere();\nconst _sphereHitAt = /*@__PURE__*/ new Vector3();\n\nconst _vA$1 = /*@__PURE__*/ new Vector3();\nconst _vB$1 = /*@__PURE__*/ new Vector3();\nconst _vC$1 = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _morphA = /*@__PURE__*/ new Vector3();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\n/**\n * Class representing triangular polygon mesh based objects.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments Object3D\n */\nclass Mesh extends Object3D {\n\n\t/**\n\t * Constructs a new mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMesh = true;\n\n\t\tthis.type = 'Mesh';\n\n\t\t/**\n\t\t * The mesh geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The mesh material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default MeshBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\t/**\n\t\t * The number of instances of this mesh.\n\t\t * Can only be used with {@link WebGPURenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.count = 1;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Mesh#morphTargetDictionary} and {@link Mesh#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the local-space position of the vertex at the given index, taking into\n\t * account the current animation state of both morph targets and skinning.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * @return {Vector3} The vertex position in local space.\n\t */\n\tgetVertexPosition( index, target ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.attributes.position;\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\n\t\ttarget.fromBufferAttribute( position, index );\n\n\t\tconst morphInfluences = this.morphTargetInfluences;\n\n\t\tif ( morphPosition && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morphAttribute, index );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( target ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttarget.add( _morphA );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$6.copy( geometry.boundingSphere );\n\t\t_sphere$6.applyMatrix4( matrixWorld );\n\n\t\t// check distance from ray origin to bounding sphere\n\n\t\t_ray$3.copy( raycaster.ray ).recast( raycaster.near );\n\n\t\tif ( _sphere$6.containsPoint( _ray$3.origin ) === false ) {\n\n\t\t\tif ( _ray$3.intersectSphere( _sphere$6, _sphereHitAt ) === null ) return;\n\n\t\t\tif ( _ray$3.origin.distanceToSquared( _sphereHitAt ) > ( raycaster.far - raycaster.near ) ** 2 ) return;\n\n\t\t}\n\n\t\t// convert ray to local space of mesh\n\n\t\t_inverseMatrix$3.copy( matrixWorld ).invert();\n\t\t_ray$3.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$3 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray$3.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$3 );\n\n\t}\n\n\t_computeIntersections( raycaster, intersects, rayLocalSpace ) {\n\n\t\tlet intersection;\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\tconst index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\t\tconst uv = geometry.attributes.uv;\n\t\tconst uv1 = geometry.attributes.uv1;\n\t\tconst normal = geometry.attributes.normal;\n\t\tconst groups = geometry.groups;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\tif ( index !== null ) {\n\n\t\t\t// indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( position !== undefined ) {\n\n\t\t\t// non-indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = i;\n\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection$1( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, ( material.side === FrontSide ), point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkGeometryIntersection( object, material, raycaster, ray, uv, uv1, normal, a, b, c ) {\n\n\tobject.getVertexPosition( a, _vA$1 );\n\tobject.getVertexPosition( b, _vB$1 );\n\tobject.getVertexPosition( c, _vC$1 );\n\n\tconst intersection = checkIntersection$1( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tconst barycoord = new Vector3();\n\t\tTriangle.getBarycoord( _intersectionPoint, _vA$1, _vB$1, _vC$1, barycoord );\n\n\t\tif ( uv ) {\n\n\t\t\tintersection.uv = Triangle.getInterpolatedAttribute( uv, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv1 ) {\n\n\t\t\tintersection.uv1 = Triangle.getInterpolatedAttribute( uv1, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( normal ) {\n\n\t\t\tintersection.normal = Triangle.getInterpolatedAttribute( normal, a, b, c, barycoord, new Vector3() );\n\n\t\t\tif ( intersection.normal.dot( ray.direction ) > 0 ) {\n\n\t\t\t\tintersection.normal.multiplyScalar( -1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal );\n\n\t\tintersection.face = face;\n\t\tintersection.barycoord = barycoord;\n\n\t}\n\n\treturn intersection;\n\n}\n\n/**\n * A geometry class for a rectangular cuboid with a given width, height, and depth.\n * On creation, the cuboid is centred on the origin, with each edge parallel to one\n * of the axes.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const cube = new THREE.Mesh( geometry, material );\n * scene.add( cube );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#BoxGeometry\n */\nclass BoxGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new box geometry.\n\t *\n\t * @param {number} [width=1] - The width. That is, the length of the edges parallel to the X axis.\n\t * @param {number} [height=1] - The height. That is, the length of the edges parallel to the Y axis.\n\t * @param {number} [depth=1] - The depth. That is, the length of the edges parallel to the Z axis.\n\t * @param {number} [widthSegments=1] - Number of segmented rectangular faces along the width of the sides.\n\t * @param {number} [heightSegments=1] - Number of segmented rectangular faces along the height of the sides.\n\t * @param {number} [depthSegments=1] - Number of segmented rectangular faces along the depth of the sides.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, -1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, -1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', -1, -1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : -1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {BoxGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\n/**\n * Provides utility functions for managing uniforms.\n *\n * @module UniformsUtils\n */\n\n/**\n * Clones the given uniform definitions by performing a deep-copy. That means\n * if the value of a uniform refers to an object like a Vector3 or Texture,\n * the cloned uniform will refer to a new object reference.\n *\n * @param {Object} src - An object representing uniform definitions.\n * @return {Object} The cloned uniforms.\n */\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tif ( property.isRenderTargetTexture ) {\n\n\t\t\t\t\twarn( 'UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().' );\n\t\t\t\t\tdst[ u ][ p ] = null;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\n/**\n * Merges the given uniform definitions into a single object. Since the\n * method internally uses cloneUniforms(), it performs a deep-copy when\n * producing the merged uniform definitions.\n *\n * @param {Array} uniforms - An array of objects containing uniform definitions.\n * @return {Object} The merged uniforms.\n */\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\nfunction cloneUniformsGroups( src ) {\n\n\tconst dst = [];\n\n\tfor ( let u = 0; u < src.length; u ++ ) {\n\n\t\tdst.push( src[ u ].clone() );\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction getUnlitUniformColorSpace( renderer ) {\n\n\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\tif ( currentRenderTarget === null ) {\n\n\t\t// https://github.com/mrdoob/three.js/pull/23937#issuecomment-1111067398\n\t\treturn renderer.outputColorSpace;\n\n\t}\n\n\t// https://github.com/mrdoob/three.js/issues/27868\n\tif ( currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\treturn currentRenderTarget.texture.colorSpace;\n\n\t}\n\n\treturn ColorManagement.workingColorSpace;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\n/**\n * A material rendered with custom shaders. A shader is a small program written in GLSL.\n * that runs on the GPU. You may want to use a custom shader if you need to implement an\n * effect not included with any of the built-in materials.\n *\n * There are the following notes to bear in mind when using a `ShaderMaterial`:\n *\n * - `ShaderMaterial` can only be used with {@link WebGLRenderer}.\n * - Built in attributes and uniforms are passed to the shaders along with your code. If\n * you don't want that, use {@link RawShaderMaterial} instead.\n * - You can use the directive `#pragma unroll_loop_start` and `#pragma unroll_loop_end`\n * in order to unroll a `for` loop in GLSL by the shader preprocessor. The directive has\n * to be placed right above the loop. The loop formatting has to correspond to a defined standard.\n * - The loop has to be [normalized](https://en.wikipedia.org/wiki/Normalized_loop).\n * - The loop variable has to be *i*.\n * - The value `UNROLLED_LOOP_INDEX` will be replaced with the explicitly\n * value of *i* for the given iteration and can be used in preprocessor\n * statements.\n *\n * ```js\n * const material = new THREE.ShaderMaterial( {\n * \tuniforms: {\n * \t\ttime: { value: 1.0 },\n * \t\tresolution: { value: new THREE.Vector2() }\n * \t},\n * \tvertexShader: document.getElementById( 'vertexShader' ).textContent,\n * \tfragmentShader: document.getElementById( 'fragmentShader' ).textContent\n * } );\n * ```\n *\n * @augments Material\n */\nclass ShaderMaterial extends Material {\n\n\t/**\n\t * Constructs a new shader material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShaderMaterial = true;\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\t/**\n\t\t * Defines custom constants using `#define` directives within the GLSL code\n\t\t * for both the vertex shader and the fragment shader; each key/value pair\n\t\t * yields another directive.\n\t\t * ```js\n\t\t * defines: {\n\t\t * \tFOO: 15,\n\t\t * \tBAR: true\n\t\t * }\n\t\t * ```\n\t\t * Yields the lines:\n\t\t * ```\n\t\t * #define FOO 15\n\t\t * #define BAR true\n\t\t * ```\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.defines = {};\n\n\t\t/**\n\t\t * An object of the form:\n\t\t * ```js\n\t\t * {\n\t\t * \t\"uniform1\": { value: 1.0 },\n\t\t * \t\"uniform2\": { value: 2 }\n\t\t * }\n\t\t * ```\n\t\t * specifying the uniforms to be passed to the shader code; keys are uniform\n\t\t * names, values are definitions of the form\n\t\t * ```\n\t\t * {\n\t\t * \tvalue: 1.0\n\t\t * }\n\t\t * ```\n\t\t * where `value` is the value of the uniform. Names must match the name of\n\t\t * the uniform, as defined in the GLSL code. Note that uniforms are refreshed\n\t\t * on every frame, so updating the value of the uniform will immediately\n\t\t * update the value available to the GLSL code.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = {};\n\n\t\t/**\n\t\t * An array holding uniforms groups for configuring UBOs.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.uniformsGroups = [];\n\n\t\t/**\n\t\t * Vertex shader GLSL code. This is the actual code for the shader.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.vertexShader = default_vertex;\n\n\t\t/**\n\t\t * Fragment shader GLSL code. This is the actual code for the shader.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.fragmentShader = default_fragment;\n\n\t\t/**\n\t\t * Controls line thickness or lines.\n\t\t *\n\t\t * WebGL and WebGPU ignore this setting and always render line primitives with a\n\t\t * width of one pixel.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.linewidth = 1;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Define whether the material color is affected by global fog settings; `true`\n\t\t * to pass fog uniforms to the shader.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.fog = false;\n\n\t\t/**\n\t\t * Defines whether this material uses lighting; `true` to pass uniform data\n\t\t * related to lighting to this shader.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.lights = false;\n\n\t\t/**\n\t\t * Defines whether this material supports clipping; `true` to let the renderer\n\t\t * pass the clippingPlanes uniform.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipping = false;\n\n\t\t/**\n\t\t * Overwritten and set to `true` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.forceSinglePass = true;\n\n\t\t/**\n\t\t * This object allows to enable certain WebGL 2 extensions.\n\t\t *\n\t\t * - clipCullDistance: set to `true` to use vertex shader clipping\n\t\t * - multiDraw: set to `true` to use vertex shader multi_draw / enable gl_DrawID\n\t\t *\n\t\t * @type {{clipCullDistance:false,multiDraw:false}}\n\t\t */\n\t\tthis.extensions = {\n\t\t\tclipCullDistance: false, // set to use vertex shader clipping\n\t\t\tmultiDraw: false // set to use vertex shader multi_draw / enable gl_DrawID\n\t\t};\n\n\t\t/**\n\t\t * When the rendered geometry doesn't include these attributes but the\n\t\t * material does, these default values will be passed to the shaders. This\n\t\t * avoids errors when buffer data is missing.\n\t\t *\n\t\t * - color: [ 1, 1, 1 ]\n\t\t * - uv: [ 0, 0 ]\n\t\t * - uv1: [ 0, 0 ]\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv1': [ 0, 0 ]\n\t\t};\n\n\t\t/**\n\t\t * If set, this calls [gl.bindAttribLocation](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bindAttribLocation)\n\t\t * to bind a generic vertex index to an attribute variable.\n\t\t *\n\t\t * @type {string|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.index0AttributeName = undefined;\n\n\t\t/**\n\t\t * Can be used to force a uniform update while changing uniforms in\n\t\t * {@link Object3D#onBeforeRender}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\t/**\n\t\t * Defines the GLSL version of custom shader code.\n\t\t *\n\t\t * @type {?(GLSL1|GLSL3)}\n\t\t * @default null\n\t\t */\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\t\tthis.uniformsGroups = cloneUniformsGroups( source.uniformsGroups );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tdata.lights = this.lights;\n\t\tdata.clipping = this.clipping;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Abstract base class for cameras. This class should always be inherited\n * when you build a new camera.\n *\n * @abstract\n * @augments Object3D\n */\nclass Camera extends Object3D {\n\n\t/**\n\t * Constructs a new camera.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCamera = true;\n\n\t\tthis.type = 'Camera';\n\n\t\t/**\n\t\t * The inverse of the camera's world matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\t/**\n\t\t * The camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The inverse of the camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The coordinate system in which the camera is used.\n\t\t *\n\t\t * @type {(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t\tthis._reversedDepth = false;\n\n\t}\n\n\t/**\n\t * The flag that indicates whether the camera uses a reversed depth buffer.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t */\n\tget reversedDepth() {\n\n\t\treturn this._reversedDepth;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\tthis.coordinateSystem = source.coordinateSystem;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * This method is overwritten since cameras have a different forward vector compared to other\n\t * 3D objects. A camera looks down its local, negative z-axis by default.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\treturn super.getWorldDirection( target ).negate();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _v3$1 = /*@__PURE__*/ new Vector3();\nconst _minTarget = /*@__PURE__*/ new Vector2();\nconst _maxTarget = /*@__PURE__*/ new Vector2();\n\n/**\n * Camera that uses [perspective projection](https://en.wikipedia.org/wiki/Perspective_(graphical)).\n *\n * This projection mode is designed to mimic the way the human eye sees. It\n * is the most common projection mode used for rendering a 3D scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 45, width / height, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass PerspectiveCamera extends Camera {\n\n\t/**\n\t * Constructs a new perspective camera.\n\t *\n\t * @param {number} [fov=50] - The vertical field of view.\n\t * @param {number} [aspect=1] - The aspect ratio.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPerspectiveCamera = true;\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\t/**\n\t\t * The vertical field of view, from bottom to top of view,\n\t\t * in degrees.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 50\n\t\t */\n\t\tthis.fov = fov;\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link PerspectiveCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link OrthographicCamera}, `0` is not a\n\t\t * valid value for a perspective camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link PerspectiveCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * Object distance used for stereoscopy and depth-of-field effects. This\n\t\t * parameter does not influence the projection matrix unless a\n\t\t * {@link StereoCamera} is being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.focus = 10;\n\n\t\t/**\n\t\t * The aspect ratio, usually the canvas width / canvas height.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = aspect;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * Film size used for the larger axis. Default is `35` (millimeters). This\n\t\t * parameter does not influence the projection matrix unless {@link PerspectiveCamera#filmOffset}\n\t\t * is set to a nonzero value.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 35\n\t\t */\n\t\tthis.filmGauge = 35;\n\n\t\t/**\n\t\t * Horizontal off-center offset in the same unit as {@link PerspectiveCamera#filmGauge}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.filmOffset = 0;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * @param {number} focalLength - Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Returns the focal length from the current {@link PerspectiveCamera#fov} and\n\t * {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The computed focal length.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\t/**\n\t * Returns the current vertical field of view angle in degrees considering {@link PerspectiveCamera#zoom}.\n\t *\n\t * @return {number} The effective FOV.\n\t */\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\t/**\n\t * Returns the width of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Returns the height of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Computes the 2D bounds of the camera's viewable rectangle at a given distance along the viewing direction.\n\t * Sets `minTarget` and `maxTarget` to the coordinates of the lower-left and upper-right corners of the view rectangle.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} minTarget - The lower-left corner of the view rectangle is written into this vector.\n\t * @param {Vector2} maxTarget - The upper-right corner of the view rectangle is written into this vector.\n\t */\n\tgetViewBounds( distance, minTarget, maxTarget ) {\n\n\t\t_v3$1.set( -1, -1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tminTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t\t_v3$1.set( 1, 1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tmaxTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t}\n\n\t/**\n\t * Computes the width and height of the camera's viewable rectangle at a given distance along the viewing direction.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} target - The target vector that is used to store result where x is width and y is height.\n\t * @returns {Vector2} The view size.\n\t */\n\tgetViewSize( distance, target ) {\n\n\t\tthis.getViewBounds( distance, _minTarget, _maxTarget );\n\n\t\treturn target.subVectors( _maxTarget, _minTarget );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *```\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *```\n\t * then for each monitor you would call it like this:\n\t *```js\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * // --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * // --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * // --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * // --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * // --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * // --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t * ```\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = -0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far, this.coordinateSystem, this.reversedDepth );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst fov = -90; // negative fov is not an error\nconst aspect = 1;\n\n/**\n * A special type of camera that is positioned in 3D space to render its surroundings into a\n * cube render target. The render target can then be used as an environment map for rendering\n * realtime reflections in your scene.\n *\n * ```js\n * // Create cube render target\n * const cubeRenderTarget = new THREE.WebGLCubeRenderTarget( 256, { generateMipmaps: true, minFilter: THREE.LinearMipmapLinearFilter } );\n *\n * // Create cube camera\n * const cubeCamera = new THREE.CubeCamera( 1, 100000, cubeRenderTarget );\n * scene.add( cubeCamera );\n *\n * // Create car\n * const chromeMaterial = new THREE.MeshLambertMaterial( { color: 0xffffff, envMap: cubeRenderTarget.texture } );\n * const car = new THREE.Mesh( carGeometry, chromeMaterial );\n * scene.add( car );\n *\n * // Update the render target cube\n * car.visible = false;\n * cubeCamera.position.copy( car.position );\n * cubeCamera.update( renderer, scene );\n *\n * // Render the scene\n * car.visible = true;\n * renderer.render( scene, camera );\n * ```\n *\n * @augments Object3D\n */\nclass CubeCamera extends Object3D {\n\n\t/**\n\t * Constructs a new cube camera.\n\t *\n\t * @param {number} near - The camera's near plane.\n\t * @param {number} far - The camera's far plane.\n\t * @param {WebGLCubeRenderTarget} renderTarget - The cube render target.\n\t */\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\t/**\n\t\t * A reference to the cube render target.\n\t\t *\n\t\t * @type {WebGLCubeRenderTarget}\n\t\t */\n\t\tthis.renderTarget = renderTarget;\n\n\t\t/**\n\t\t * The current active coordinate system.\n\t\t *\n\t\t * @type {?(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t * @default null\n\t\t */\n\t\tthis.coordinateSystem = null;\n\n\t\t/**\n\t\t * The current active mipmap level\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.activeMipmapLevel = 0;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\t/**\n\t * Must be called when the coordinate system of the cube camera is changed.\n\t */\n\tupdateCoordinateSystem() {\n\n\t\tconst coordinateSystem = this.coordinateSystem;\n\n\t\tconst cameras = this.children.concat();\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = cameras;\n\n\t\tfor ( const camera of cameras ) this.remove( camera );\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, 1, 0 );\n\t\t\tcameraPX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, 1, 0 );\n\t\t\tcameraNX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, -1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, 1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, 1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, 1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, -1, 0 );\n\t\t\tcameraPX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, -1, 0 );\n\t\t\tcameraNX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, 1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, -1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, -1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, -1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tfor ( const camera of cameras ) {\n\n\t\t\tthis.add( camera );\n\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calling this method will render the given scene with the given renderer\n\t * into the cube render target of the camera.\n\t *\n\t * @param {(Renderer|WebGLRenderer)} renderer - The renderer.\n\t * @param {Scene} scene - The scene to render.\n\t */\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst { renderTarget, activeMipmapLevel } = this;\n\n\t\tif ( this.coordinateSystem !== renderer.coordinateSystem ) {\n\n\t\t\tthis.coordinateSystem = renderer.coordinateSystem;\n\n\t\t\tthis.updateCoordinateSystem();\n\n\t\t}\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst currentActiveCubeFace = renderer.getActiveCubeFace();\n\t\tconst currentActiveMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\t// mipmaps are generated during the last call of render()\n\t\t// at this point, all sides of the cube render target are defined\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\n/**\n * Creates a cube texture made up of six images.\n *\n * ```js\n * const loader = new THREE.CubeTextureLoader();\n * loader.setPath( 'textures/cube/pisa/' );\n *\n * const textureCube = loader.load( [\n * \t'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'\n * ] );\n *\n * const material = new THREE.MeshBasicMaterial( { color: 0xffffff, envMap: textureCube } );\n * ```\n *\n * @augments Texture\n */\nclass CubeTexture extends Texture {\n\n\t/**\n\t * Constructs a new cube texture.\n\t *\n\t * @param {Array} [images=[]] - An array holding a image for each side of a cube.\n\t * @param {number} [mapping=CubeReflectionMapping] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space value.\n\t */\n\tconstructor( images = [], mapping = CubeReflectionMapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ) {\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t}\n\n\t/**\n\t * Alias for {@link CubeTexture#image}.\n\t *\n\t * @type {Array}\n\t */\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\n/**\n * A cube render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new cube render target.\n\t *\n\t * @param {number} [size=1] - The size of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( size = 1, options = {} ) {\n\n\t\tsuper( size, size, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLCubeRenderTarget = true;\n\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {DataArrayTexture}\n\t\t */\n\t\tthis.texture = new CubeTexture( images );\n\t\tthis._setTextureOptions( options );\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n\t/**\n\t * Converts the given equirectangular texture to a cube map.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Texture} texture - The equirectangular texture.\n\t * @return {WebGLCubeRenderTarget} A reference to this cube render target.\n\t */\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.colorSpace = texture.colorSpace;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Clears this cube render target.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t */\n\tclear( renderer, color = true, depth = true, stencil = true ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\n/**\n * This is almost identical to an {@link Object3D}. Its purpose is to\n * make working with groups of objects syntactically clearer.\n *\n * ```js\n * // Create a group and add the two cubes.\n * // These cubes can now be rotated / scaled etc as a group.\n * const group = new THREE.Group();\n *\n * group.add( meshA );\n * group.add( meshB );\n *\n * scene.add( group );\n * ```\n *\n * @augments Object3D\n */\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGroup = true;\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nconst _moveEvent = { type: 'move' };\n\n/**\n * Class for representing a XR controller with its\n * different coordinate systems.\n *\n * @private\n */\nclass WebXRController {\n\n\t/**\n\t * Constructs a new XR controller.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A group representing the target ray space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._targetRay = null;\n\n\t\t/**\n\t\t * A group representing the grip space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._grip = null;\n\n\t\t/**\n\t\t * A group representing the hand space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._hand = null;\n\n\t}\n\n\t/**\n\t * Returns a group representing the hand space of the XR controller.\n\t *\n\t * @return {Group} A group representing the hand space of the XR controller.\n\t */\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\t/**\n\t * Returns a group representing the target ray space of the XR controller.\n\t *\n\t * @return {Group} A group representing the target ray space of the XR controller.\n\t */\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\t/**\n\t * Returns a group representing the grip space of the XR controller.\n\t *\n\t * @return {Group} A group representing the grip space of the XR controller.\n\t */\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\t/**\n\t * Dispatches the given event to the groups representing\n\t * the different coordinate spaces of the XR controller.\n\t *\n\t * @param {Object} event - The event to dispatch.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects the controller with the given XR input source.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tconnect( inputSource ) {\n\n\t\tif ( inputSource && inputSource.hand ) {\n\n\t\t\tconst hand = this._hand;\n\n\t\t\tif ( hand ) {\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Initialize hand with joints when connected\n\t\t\t\t\tthis._getHandJoint( hand, inputjoint );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects the controller from the given XR input source.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the controller with the given input source, XR frame and reference space.\n\t * This updates the transformations of the groups that represent the different\n\t * coordinate systems of the controller.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @param {XRFrame} frame - The XR frame.\n\t * @param {XRReferenceSpace} referenceSpace - The reference space.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\tconst joint = this._getHandJoint( hand, inputjoint );\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.matrixWorldNeedsUpdate = true;\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\t\t\t\t\t\tgrip.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\t// Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it\n\t\t\t\tif ( inputPose === null && gripPose !== null ) {\n\n\t\t\t\t\tinputPose = gripPose;\n\n\t\t\t\t}\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\t\t\t\t\ttargetRay.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a group representing the hand joint for the given input joint.\n\t *\n\t * @private\n\t * @param {Group} hand - The group representing the hand space.\n\t * @param {XRJointSpace} inputjoint - The hand joint data.\n\t * @return {Group} A group representing the hand joint for the given input joint.\n\t */\n\t_getHandJoint( hand, inputjoint ) {\n\n\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\tconst joint = new Group();\n\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\tjoint.visible = false;\n\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\n\t\t\thand.add( joint );\n\n\t\t}\n\n\t\treturn hand.joints[ inputjoint.jointName ];\n\n\t}\n\n}\n\n/**\n * This class can be used to define an exponential squared fog,\n * which gives a clear view near the camera and a faster than exponentially\n * densening fog farther from the camera.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );\n * ```\n */\nclass FogExp2 {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [density=0.00025] - Defines how fast the fog will grow dense.\n\t */\n\tconstructor( color, density = 0.00025 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFogExp2 = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * Defines how fast the fog will grow dense.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.00025\n\t\t */\n\t\tthis.density = density;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {FogExp2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n}\n\n/**\n * This class can be used to define a linear fog that grows linearly denser\n * with the distance.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );\n * ```\n */\nclass Fog {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [near=1] - The minimum distance to start applying fog.\n\t * @param {number} [far=1000] - The maximum distance at which fog stops being calculated and applied.\n\t */\n\tconstructor( color, near = 1, far = 1000 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFog = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The minimum distance to start applying fog. Objects that are less than\n\t\t * `near` units from the active camera won't be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The maximum distance at which fog stops being calculated and applied.\n\t\t * Objects that are more than `far` units away from the active camera won't\n\t\t * be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1000\n\t\t */\n\t\tthis.far = far;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {Fog} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n}\n\n/**\n * Scenes allow you to set up what is to be rendered and where by three.js.\n * This is where you place 3D objects like meshes, lines or lights.\n *\n * @augments Object3D\n */\nclass Scene extends Object3D {\n\n\t/**\n\t * Constructs a new scene.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isScene = true;\n\n\t\tthis.type = 'Scene';\n\n\t\t/**\n\t\t * Defines the background of the scene. Valid inputs are:\n\t\t *\n\t\t * - A color for defining a uniform colored background.\n\t\t * - A texture for defining a (flat) textured background.\n\t\t * - Cube textures or equirectangular textures for defining a skybox.\n\t\t *\n\t\t * @type {?(Color|Texture)}\n\t\t * @default null\n\t\t */\n\t\tthis.background = null;\n\n\t\t/**\n\t\t * Sets the environment map for all physical materials in the scene. However,\n\t\t * it's not possible to overwrite an existing texture assigned to the `envMap`\n\t\t * material property.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.environment = null;\n\n\t\t/**\n\t\t * A fog instance defining the type of fog that affects everything\n\t\t * rendered in the scene.\n\t\t *\n\t\t * @type {?(Fog|FogExp2)}\n\t\t * @default null\n\t\t */\n\t\tthis.fog = null;\n\n\t\t/**\n\t\t * Sets the blurriness of the background. Only influences environment maps\n\t\t * assigned to {@link Scene#background}. Valid input is a float between `0`\n\t\t * and `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.backgroundBlurriness = 0;\n\n\t\t/**\n\t\t * Attenuates the color of the background. Only applies to background textures.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.backgroundIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the background in radians. Only influences environment maps\n\t\t * assigned to {@link Scene#background}.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.backgroundRotation = new Euler();\n\n\t\t/**\n\t\t * Attenuates the color of the environment. Only influences environment maps\n\t\t * assigned to {@link Scene#environment}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.environmentIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians. Only influences physical materials\n\t\t * in the scene when {@link Scene#environment} is used.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.environmentRotation = new Euler();\n\n\t\t/**\n\t\t * Forces everything in the scene to be rendered with the defined material. It is possible\n\t\t * to exclude materials from override by setting {@link Material#allowOverride} to `false`.\n\t\t *\n\t\t * @type {?Material}\n\t\t * @default null\n\t\t */\n\t\tthis.overrideMaterial = null;\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tthis.backgroundBlurriness = source.backgroundBlurriness;\n\t\tthis.backgroundIntensity = source.backgroundIntensity;\n\t\tthis.backgroundRotation.copy( source.backgroundRotation );\n\n\t\tthis.environmentIntensity = source.environmentIntensity;\n\t\tthis.environmentRotation.copy( source.environmentRotation );\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\tif ( this.backgroundBlurriness > 0 ) data.object.backgroundBlurriness = this.backgroundBlurriness;\n\t\tif ( this.backgroundIntensity !== 1 ) data.object.backgroundIntensity = this.backgroundIntensity;\n\t\tdata.object.backgroundRotation = this.backgroundRotation.toArray();\n\n\t\tif ( this.environmentIntensity !== 1 ) data.object.environmentIntensity = this.environmentIntensity;\n\t\tdata.object.environmentRotation = this.environmentRotation.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * \"Interleaved\" means that multiple attributes, possibly of different types,\n * (e.g., position, normal, uv, color) are packed into a single array buffer.\n *\n * An introduction into interleaved arrays can be found here: [Interleaved array basics](https://blog.tojicode.com/2011/05/interleaved-array-basics.html)\n */\nclass InterleavedBuffer {\n\n\t/**\n\t * Constructs a new interleaved buffer.\n\t *\n\t * @param {TypedArray} array - A typed array with a shared buffer storing attribute data.\n\t * @param {number} stride - The number of typed-array elements per vertex.\n\t */\n\tconstructor( array, stride ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInterleavedBuffer = true;\n\n\t\t/**\n\t\t * A typed array with a shared buffer storing attribute data.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of typed-array elements per vertex.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.stride = stride;\n\n\t\t/**\n\t\t * The total number of elements in the array\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t *\n\t\t * Note: After the initial use of a buffer, its usage cannot be changed. Instead,\n\t\t * instantiate a new one and set the desired usage before the next render.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * This can be used to only update some components of stored vectors (for example, just the\n\t\t * component related to color). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * The UUID of the interleaved buffer.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t}\n\n\t/**\n\t * A callback function that is executed after the renderer has transferred the attribute array\n\t * data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the usage of this interleaved buffer.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {InterleavedBuffer} A reference to this interleaved buffer.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Copies the values of the given interleaved buffer to this instance.\n\t *\n\t * @param {InterleavedBuffer} source - The interleaved buffer to copy.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies a vector from the given interleaved buffer to this one. The start\n\t * and destination position in the attribute buffers are represented by the\n\t * given indices.\n\t *\n\t * @param {number} index1 - The destination index into this interleaved buffer.\n\t * @param {InterleavedBuffer} interleavedBuffer - The interleaved buffer to copy from.\n\t * @param {number} index2 - The source index into the given interleaved buffer.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tcopyAt( index1, interleavedBuffer, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= interleavedBuffer.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = interleavedBuffer.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given array data in the interleaved buffer.\n\t *\n\t * @param {(TypedArray|Array)} value - The array data to set.\n\t * @param {number} [offset=0] - The offset in this interleaved buffer's array.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new interleaved buffer with copied values from this instance.\n\t *\n\t * @param {Object} [data] - An object with shared array buffers that allows to retain shared structures.\n\t * @return {InterleavedBuffer} A clone of this instance.\n\t */\n\tclone( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new this.constructor( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t}\n\n\t/**\n\t * Sets the given callback function that is executed after the Renderer has transferred\n\t * the array data to the GPU. Can be used to perform clean-up operations after\n\t * the upload when data are not needed anymore on the CPU side.\n\t *\n\t * @param {Function} callback - The `onUpload()` callback.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the interleaved buffer into JSON.\n\t *\n\t * @param {Object} [data] - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized interleaved buffer.\n\t */\n\ttoJSON( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.from( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n}\n\nconst _vector$7 = /*@__PURE__*/ new Vector3();\n\n/**\n * An alternative version of a buffer attribute with interleaved data. Interleaved\n * attributes share a common interleaved data storage ({@link InterleavedBuffer}) and refer with\n * different offsets into the buffer.\n */\nclass InterleavedBufferAttribute {\n\n\t/**\n\t * Constructs a new interleaved buffer attribute.\n\t *\n\t * @param {InterleavedBuffer} interleavedBuffer - The buffer holding the interleaved data.\n\t * @param {number} itemSize - The item size.\n\t * @param {number} offset - The attribute offset into the buffer.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( interleavedBuffer, itemSize, offset, normalized = false ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInterleavedBufferAttribute = true;\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The buffer holding the interleaved data.\n\t\t *\n\t\t * @type {InterleavedBuffer}\n\t\t */\n\t\tthis.data = interleavedBuffer;\n\n\t\t/**\n\t\t * The item size, see {@link BufferAttribute#itemSize}.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * The attribute offset into the buffer.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.offset = offset;\n\n\t\t/**\n\t\t * Whether the data are normalized or not, see {@link BufferAttribute#normalized}\n\t\t *\n\t\t * @type {InterleavedBuffer}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t}\n\n\t/**\n\t * The item count of this buffer attribute.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget count() {\n\n\t\treturn this.data.count;\n\n\t}\n\n\t/**\n\t * The array holding the interleaved buffer attribute data.\n\t *\n\t * @type {TypedArray}\n\t */\n\tget array() {\n\n\t\treturn this.data.array;\n\n\t}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tthis.data.needsUpdate = value;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 normal matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix3} m - The normal matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3` and with direction vectors.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @return {number} The returned value.\n\t */\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.data.stride + this.offset + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Sets the given value to the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @param {number} value - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} y - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} z - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} w - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The x component.\n\t */\n\tgetX( index ) {\n\n\t\tlet x = this.data.array[ index * this.data.stride + this.offset ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\t/**\n\t * Returns the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The y component.\n\t */\n\tgetY( index ) {\n\n\t\tlet y = this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\t/**\n\t * Returns the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The z component.\n\t */\n\tgetZ( index ) {\n\n\t\tlet z = this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\t/**\n\t * Returns the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The w component.\n\t */\n\tgetW( index ) {\n\n\t\tlet w = this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\t/**\n\t * Sets the x and y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXY( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y, z and w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @param {number} w - The value for the w component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new buffer attribute with copied values from this instance.\n\t *\n\t * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data.\n\t *\n\t * @param {Object} [data] - An object with interleaved buffers that allows to retain the interleaved property.\n\t * @return {BufferAttribute|InterleavedBufferAttribute} A clone of this instance.\n\t */\n\tclone( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tlog( 'InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the buffer attribute into JSON.\n\t *\n\t * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data.\n\t *\n\t * @param {Object} [data] - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized buffer attribute.\n\t */\n\ttoJSON( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tlog( 'InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// de-interleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interleaved attribute\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * A material for rendering instances of {@link Sprite}.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'textures/sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map, color: 0xffffff } );\n *\n * const sprite = new THREE.Sprite( material );\n * sprite.scale.set(200, 200, 1)\n * scene.add( sprite );\n * ```\n *\n * @augments Material\n */\nclass SpriteMaterial extends Material {\n\n\t/**\n\t * Constructs a new sprite material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpriteMaterial = true;\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The rotation of the sprite in radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Specifies whether size of the sprite is attenuated by the camera depth (perspective camera only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Overwritten since sprite materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _geometry;\n\nconst _intersectPoint = /*@__PURE__*/ new Vector3();\nconst _worldScale = /*@__PURE__*/ new Vector3();\nconst _mvPosition = /*@__PURE__*/ new Vector3();\n\nconst _alignedPosition = /*@__PURE__*/ new Vector2();\nconst _rotatedPosition = /*@__PURE__*/ new Vector2();\nconst _viewWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\n/**\n * A sprite is a plane that always faces towards the camera, generally with a\n * partially transparent texture applied.\n *\n * Sprites do not cast shadows, setting {@link Object3D#castShadow} to `true` will\n * have no effect.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map } );\n *\n * const sprite = new THREE.Sprite( material );\n * scene.add( sprite );\n * ```\n *\n * @augments Object3D\n */\nclass Sprite extends Object3D {\n\n\t/**\n\t * Constructs a new sprite.\n\t *\n\t * @param {(SpriteMaterial|SpriteNodeMaterial)} [material] - The sprite material.\n\t */\n\tconstructor( material = new SpriteMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSprite = true;\n\n\t\tthis.type = 'Sprite';\n\n\t\tif ( _geometry === undefined ) {\n\n\t\t\t_geometry = new BufferGeometry();\n\n\t\t\tconst float32Array = new Float32Array( [\n\t\t\t\t-0.5, -0.5, 0, 0, 0,\n\t\t\t\t0.5, -0.5, 0, 1, 0,\n\t\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t\t-0.5, 0.5, 0, 0, 1\n\t\t\t] );\n\n\t\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t\t}\n\n\t\t/**\n\t\t * The sprite geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = _geometry;\n\n\t\t/**\n\t\t * The sprite material.\n\t\t *\n\t\t * @type {(SpriteMaterial|SpriteNodeMaterial)}\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * The sprite's anchor point, and the point around which the sprite rotates.\n\t\t * A value of `(0.5, 0.5)` corresponds to the midpoint of the sprite. A value\n\t\t * of `(0, 0)` corresponds to the lower left corner of the sprite.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0.5,0.5)\n\t\t */\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t\t/**\n\t\t * The number of instances of this sprite.\n\t\t * Can only be used with {@link WebGPURenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.count = 1;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this sprite.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\terror( 'Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA.set( -0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB.set( 0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA.set( 0, 0 );\n\t\t_uvB.set( 1, 0 );\n\t\t_uvC.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB.set( -0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getInterpolation( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$2 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A component for providing a basic Level of Detail (LOD) mechanism.\n *\n * Every LOD level is associated with an object, and rendering can be switched\n * between them at the distances specified. Typically you would create, say,\n * three meshes, one for far away (low detail), one for mid range (medium\n * detail) and one for close up (high detail).\n *\n * ```js\n * const lod = new THREE.LOD();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n *\n * //Create spheres with 3 levels of detail and create new LOD levels for them\n * for( let i = 0; i < 3; i++ ) {\n *\n * \tconst geometry = new THREE.IcosahedronGeometry( 10, 3 - i );\n * \tconst mesh = new THREE.Mesh( geometry, material );\n * \tlod.addLevel( mesh, i * 75 );\n *\n * }\n *\n * scene.add( lod );\n * ```\n *\n * @augments Object3D\n */\nclass LOD extends Object3D {\n\n\t/**\n\t * Constructs a new LOD.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLOD = true;\n\n\t\t/**\n\t\t * The current LOD index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._currentLevel = 0;\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * This array holds the LOD levels.\n\t\t\t *\n\t\t\t * @name LOD#levels\n\t\t\t * @type {Array<{object:Object3D,distance:number,hysteresis:number}>}\n\t\t\t */\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Whether the LOD object is updated automatically by the renderer per frame\n\t\t * or not. If set to `false`, you have to call {@link LOD#update} in the\n\t\t * render loop by yourself.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance, level.hysteresis );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a mesh that will display at a certain distance and greater. Typically\n\t * the further away the distance, the lower the detail on the mesh.\n\t *\n\t * @param {Object3D} object - The 3D object to display at this level.\n\t * @param {number} [distance=0] - The distance at which to display this level of detail.\n\t * @param {number} [hysteresis=0] - Threshold used to avoid flickering at LOD boundaries, as a fraction of distance.\n\t * @return {LOD} A reference to this instance.\n\t */\n\taddLevel( object, distance = 0, hysteresis = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, hysteresis: hysteresis, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes an existing level, based on the distance from the camera.\n\t * Returns `true` when the level has been removed. Otherwise `false`.\n\t *\n\t * @param {number} distance - Distance of the level to remove.\n\t * @return {boolean} Whether the level has been removed or not.\n\t */\n\tremoveLevel( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0; i < levels.length; i ++ ) {\n\n\t\t\tif ( levels[ i ].distance === distance ) {\n\n\t\t\t\tconst removedElements = levels.splice( i, 1 );\n\t\t\t\tthis.remove( removedElements[ 0 ].object );\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns the currently active LOD level index.\n\t *\n\t * @return {number} The current active LOD level index.\n\t */\n\tgetCurrentLevel() {\n\n\t\treturn this._currentLevel;\n\n\t}\n\n\t/**\n\t * Returns a reference to the first 3D object that is greater than\n\t * the given distance.\n\t *\n\t * @param {number} distance - The LOD distance.\n\t * @return {?Object3D} The found 3D object. `null` if no 3D object has been found.\n\t */\n\tgetObjectForDistance( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance < levelDistance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this LOD.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$2 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the LOD by computing which LOD level should be visible according\n\t * to the current distance of the given camera.\n\t *\n\t * @param {Camera} camera - The camera the scene is rendered with.\n\t */\n\tupdate( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$1.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance >= levelDistance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance,\n\t\t\t\thysteresis: level.hysteresis\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _basePosition = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\n\nconst _vector3 = /*@__PURE__*/ new Vector3();\nconst _matrix4 = /*@__PURE__*/ new Matrix4();\nconst _vertex = /*@__PURE__*/ new Vector3();\n\nconst _sphere$5 = /*@__PURE__*/ new Sphere();\nconst _inverseMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _ray$2 = /*@__PURE__*/ new Ray();\n\n/**\n * A mesh that has a {@link Skeleton} that can then be used to animate the\n * vertices of the geometry with skinning/skeleton animation.\n *\n * Next to a valid skeleton, the skinned mesh requires skin indices and weights\n * as buffer attributes in its geometry. These attribute define which bones affect a single\n * vertex to a certain extend.\n *\n * Typically skinned meshes are not created manually but loaders like {@link GLTFLoader}\n * or {@link FBXLoader } import respective models.\n *\n * @augments Mesh\n * @demo scenes/bones-browser.html\n */\nclass SkinnedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new skinned mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkinnedMesh = true;\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\t/**\n\t\t * `AttachedBindMode` means the skinned mesh shares the same world space as the skeleton.\n\t\t * This is not true when using `DetachedBindMode` which is useful when sharing a skeleton\n\t\t * across multiple skinned meshes.\n\t\t *\n\t\t * @type {(AttachedBindMode|DetachedBindMode)}\n\t\t * @default AttachedBindMode\n\t\t */\n\t\tthis.bindMode = AttachedBindMode;\n\n\t\t/**\n\t\t * The base matrix that is used for the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The base matrix that is used for resetting the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The bounding box of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the skinned mesh, and updates {@link SkinnedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * If the skinned mesh is animated, the bounding box should be recomputed per frame in order to reflect\n\t * the current animation state.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingBox.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the skinned mesh, and updates {@link SkinnedMesh#boundingSphere}.\n\t * The bounding sphere is automatically computed by the engine once when it is needed, e.g., for ray casting\n\t * and view frustum culling. If the skinned mesh is animated, the bounding sphere should be recomputed\n\t * per frame in order to reflect the current animation state.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingSphere.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$5.copy( this.boundingSphere );\n\t\t_sphere$5.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$5 ) === false ) return;\n\n\t\t// convert ray to local space of skinned mesh\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tif ( _ray$2.intersectsBox( this.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$2 );\n\n\t}\n\n\tgetVertexPosition( index, target ) {\n\n\t\tsuper.getVertexPosition( index, target );\n\n\t\tthis.applyBoneTransform( index, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Binds the given skeleton to the skinned mesh.\n\t *\n\t * @param {Skeleton} skeleton - The skeleton to bind.\n\t * @param {Matrix4} [bindMatrix] - The bind matrix. If no bind matrix is provided,\n\t * the skinned mesh's world matrix will be used instead.\n\t */\n\tbind( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.copy( bindMatrix ).invert();\n\n\t}\n\n\t/**\n\t * This method sets the skinned mesh in the rest pose).\n\t */\n\tpose() {\n\n\t\tthis.skeleton.pose();\n\n\t}\n\n\t/**\n\t * Normalizes the skin weights which are defined as a buffer attribute\n\t * in the skinned mesh's geometry.\n\t */\n\tnormalizeSkinWeights() {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.fromBufferAttribute( skinWeight, i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.bindMode === AttachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === DetachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\n\n\t\t} else {\n\n\t\t\twarn( 'SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies the bone transform associated with the given index to the given\n\t * vertex position. Returns the updated vector.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * the skinned mesh's world matrix will be used instead.\n\t * @return {Vector3} The updated vertex position.\n\t */\n\tapplyBoneTransform( index, target ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.copy( target ).applyMatrix4( this.bindMatrix );\n\n\t\ttarget.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix4.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\ttarget.addScaledVector( _vector3.copy( _basePosition ).applyMatrix4( _matrix4 ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n}\n\n/**\n * A bone which is part of a {@link Skeleton}. The skeleton in turn is used by\n * the {@link SkinnedMesh}.\n *\n * ```js\n * const root = new THREE.Bone();\n * const child = new THREE.Bone();\n *\n * root.add( child );\n * child.position.y = 5;\n * ```\n *\n * @augments Object3D\n */\nclass Bone extends Object3D {\n\n\t/**\n\t * Constructs a new bone.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBone = true;\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n}\n\n/**\n * Creates a texture directly from raw buffer data.\n *\n * The interpretation of the data depends on type and format: If the type is\n * `UnsignedByteType`, a `Uint8Array` will be useful for addressing the\n * texel data. If the format is `RGBAFormat`, data needs four values for\n * one texel; Red, Green, Blue and Alpha (typically the opacity).\n *\n * @augments Texture\n */\nclass DataTexture extends Texture {\n\n\t/**\n\t * Constructs a new data texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=NearestFilter] - The mag filter value.\n\t * @param {number} [minFilter=NearestFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDataTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number}}\n\t\t */\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nconst _offsetMatrix = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * Class for representing the armatures in `three.js`. The skeleton\n * is defined by a hierarchy of bones.\n *\n * ```js\n * const bones = [];\n *\n * const shoulder = new THREE.Bone();\n * const elbow = new THREE.Bone();\n * const hand = new THREE.Bone();\n *\n * shoulder.add( elbow );\n * elbow.add( hand );\n *\n * bones.push( shoulder , elbow, hand);\n *\n * shoulder.position.y = -5;\n * elbow.position.y = 0;\n * hand.position.y = 5;\n *\n * const armSkeleton = new THREE.Skeleton( bones );\n * ```\n */\nclass Skeleton {\n\n\t/**\n\t * Constructs a new skeleton.\n\t *\n\t * @param {Array} [bones] - An array of bones.\n\t * @param {Array} [boneInverses] - An array of bone inverse matrices.\n\t * If not provided, these matrices will be computed automatically via {@link Skeleton#calculateInverses}.\n\t */\n\tconstructor( bones = [], boneInverses = [] ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An array of bones defining the skeleton.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t/**\n\t\t * An array of bone inverse matrices.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.boneInverses = boneInverses;\n\n\t\t/**\n\t\t * An array buffer holding the bone data.\n\t\t * Input data for {@link Skeleton#boneTexture}.\n\t\t *\n\t\t * @type {?Float32Array}\n\t\t * @default null\n\t\t */\n\t\tthis.boneMatrices = null;\n\n\t\t/**\n\t\t * A texture holding the bone data for use\n\t\t * in the vertex shader.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.boneTexture = null;\n\n\t\tthis.init();\n\n\t}\n\n\t/**\n\t * Initializes the skeleton. This method gets automatically called by the constructor\n\t * but depending on how the skeleton is created it might be necessary to call this method\n\t * manually.\n\t */\n\tinit() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\twarn( 'Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bone inverse matrices. This method resets {@link Skeleton#boneInverses}\n\t * and fills it with new matrices.\n\t */\n\tcalculateInverses() {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tpose() {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tupdate() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new skeleton with copied values from this instance.\n\t *\n\t * @return {Skeleton} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t}\n\n\t/**\n\t * Computes a data texture for passing bone data to the vertex shader.\n\t *\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tcomputeBoneTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tboneMatrices.set( this.boneMatrices ); // copy current values\n\n\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\tboneTexture.needsUpdate = true;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the skeleton's bone array and returns the first with a\n\t * matching name.\n\t *\n\t * @param {string} name - The name of the bone.\n\t * @return {Bone|undefined} The found bone. `undefined` if no bone has been found.\n\t */\n\tgetBoneByName( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setups the skeleton by the given JSON and bones.\n\t *\n\t * @param {Object} json - The skeleton as serialized JSON.\n\t * @param {Object} bones - An array of bones.\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tfromJSON( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\twarn( 'Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the skeleton into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized skeleton.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * An instanced version of a buffer attribute.\n *\n * @augments BufferAttribute\n */\nclass InstancedBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new instanced buffer attribute.\n\t *\n\t * @param {TypedArray} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t * @param {number} [meshPerAttribute=1] - How often a value of this buffer attribute should be repeated.\n\t */\n\tconstructor( array, itemSize, normalized, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, itemSize, normalized );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedBufferAttribute = true;\n\n\t\t/**\n\t\t * Defines how often a value of this buffer attribute should be repeated. A\n\t\t * value of one means that each value of the instanced attribute is used for\n\t\t * a single instance. A value of two means that each value is used for two\n\t\t * consecutive instances (and so on).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _instanceLocalMatrix = /*@__PURE__*/ new Matrix4();\nconst _instanceWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _box3 = /*@__PURE__*/ new Box3();\nconst _identity = /*@__PURE__*/ new Matrix4();\nconst _mesh$1 = /*@__PURE__*/ new Mesh();\nconst _sphere$4 = /*@__PURE__*/ new Sphere();\n\n/**\n * A special version of a mesh with instanced rendering support. Use\n * this class if you have to render a large number of objects with the same\n * geometry and material(s) but with different world transformations. The usage\n * of 'InstancedMesh' will help you to reduce the number of draw calls and thus\n * improve the overall rendering performance in your application.\n *\n * @augments Mesh\n */\nclass InstancedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new instanced mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t * @param {number} count - The number of instances.\n\t */\n\tconstructor( geometry, material, count ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedMesh = true;\n\n\t\t/**\n\t\t * Represents the local transformation of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMatrixAt}.\n\t\t *\n\t\t * @type {InstancedBufferAttribute}\n\t\t */\n\t\tthis.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );\n\n\t\t/**\n\t\t * Represents the color of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setColorAt}.\n\t\t *\n\t\t * @type {?InstancedBufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.instanceColor = null;\n\n\t\t/**\n\t\t * Represents the morph target weights of all instances. You have to set its\n\t\t * {@link Texture#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMorphAt}.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.morphTexture = null;\n\n\t\t/**\n\t\t * The number of instances.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * The bounding box of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.setMatrixAt( i, _identity );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the instanced mesh, and updates {@link InstancedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * You may need to recompute the bounding box if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_box3.copy( geometry.boundingBox ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingBox.union( _box3 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the instanced mesh, and updates {@link InstancedMesh#boundingSphere}\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_sphere$4.copy( geometry.boundingSphere ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingSphere.union( _sphere$4 );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\n\t\tif ( source.morphTexture !== null ) this.morphTexture = source.morphTexture.clone();\n\t\tif ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();\n\n\t\tthis.count = source.count;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the color of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t */\n\tgetColorAt( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Gets the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t */\n\tgetMatrixAt( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Gets the morph target weights of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object - The target object that is used to store the method's result.\n\t */\n\tgetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tconst len = objectInfluences.length + 1; // All influences + the baseInfluenceSum\n\n\t\tconst dataIndex = index * len + 1; // Skip the baseInfluenceSum at the beginning\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tobjectInfluences[ i ] = array[ dataIndex + i ];\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh$1.geometry = this.geometry;\n\t\t_mesh$1.material = this.material;\n\n\t\tif ( _mesh$1.material === undefined ) return;\n\n\t\t// test with bounding sphere first\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$4.copy( this.boundingSphere );\n\t\t_sphere$4.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$4 ) === false ) return;\n\n\t\t// now test each instance\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh$1.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh$1.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceColor} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The instance color.\n\t */\n\tsetColorAt( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ).fill( 1 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceMatrix} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The local transformation.\n\t */\n\tsetMatrixAt( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Sets the morph target weights to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#morphTexture} to `true` after updating all the influences.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object - A mesh which `morphTargetInfluences` property containing the morph target weights\n\t * of a single instance.\n\t */\n\tsetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst len = objectInfluences.length + 1; // morphBaseInfluence + all influences\n\n\t\tif ( this.morphTexture === null ) {\n\n\t\t\tthis.morphTexture = new DataTexture( new Float32Array( len * this.count ), len, this.count, RedFormat, FloatType );\n\n\t\t}\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tlet morphInfluencesSum = 0;\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t}\n\n\t\tconst morphBaseInfluence = this.geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\tconst dataIndex = len * index;\n\n\t\tarray[ dataIndex ] = morphBaseInfluence;\n\n\t\tarray.set( objectInfluences, dataIndex + 1 );\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\tif ( this.morphTexture !== null ) {\n\n\t\t\tthis.morphTexture.dispose();\n\t\t\tthis.morphTexture = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\n/**\n * A two dimensional surface that extends infinitely in 3D space, represented\n * in [Hessian normal form](http://mathworld.wolfram.com/HessianNormalForm.html)\n * by a unit length normal vector and a constant.\n */\nclass Plane {\n\n\t/**\n\t * Constructs a new plane.\n\t *\n\t * @param {Vector3} [normal=(1,0,0)] - A unit length vector defining the normal of the plane.\n\t * @param {number} [constant=0] - The signed distance from the origin to the plane.\n\t */\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPlane = true;\n\n\t\t/**\n\t\t * A unit length vector defining the normal of the plane.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.normal = normal;\n\n\t\t/**\n\t\t * The signed distance from the origin to the plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.constant = constant;\n\n\t}\n\n\t/**\n\t * Sets the plane components by copying the given values.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {number} constant - The constant.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane components by defining `x`, `y`, `z` as the\n\t * plane normal and `w` as the constant.\n\t *\n\t * @param {number} x - The value for the normal's x component.\n\t * @param {number} y - The value for the normal's y component.\n\t * @param {number} z - The value for the normal's z component.\n\t * @param {number} w - The constant value.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from the given normal and coplanar point (that is a point\n\t * that lies onto the plane).\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Vector3} point - A coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from three coplanar points. The winding order is\n\t * assumed to be counter-clockwise, and determines the direction of\n\t * the plane normal.\n\t *\n\t * @param {Vector3} a - The first coplanar point.\n\t * @param {Vector3} b - The second coplanar point.\n\t * @param {Vector3} c - The third coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given plane to this instance.\n\t *\n\t * @param {Plane} plane - The plane to copy.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Normalizes the plane normal and adjusts the constant accordingly.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Negates both the plane normal and the constant.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnegate() {\n\n\t\tthis.constant *= -1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given point to this plane.\n\t *\n\t * @param {Vector3} point - The point to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given sphere to this plane.\n\t *\n\t * @param {Sphere} sphere - The sphere to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\t/**\n\t * Projects a the given point onto the plane.\n\t *\n\t * @param {Vector3} point - The point to project.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The projected point on the plane.\n\t */\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the intersection point of the passed line and the plane. Returns\n\t * `null` if the line does not intersect. Returns the line's starting point if\n\t * the line is coplanar with the plane.\n\t *\n\t * @param {Line3} line - The line to compute the intersection for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( line.start ).addScaledVector( direction, t );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given line segment intersects with (passes through) the plane.\n\t *\n\t * @param {Line3} line - The line to test.\n\t * @return {boolean} Whether the given line segment intersects with the plane or not.\n\t */\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with the plane.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with the plane or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with the plane.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with the plane or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns a coplanar vector to the plane, by calculating the\n\t * projection of the normal at the origin onto the plane.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The coplanar point.\n\t */\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\t/**\n\t * Apply a 4x4 matrix to the plane. The matrix must be an affine, homogeneous transform.\n\t *\n\t * The optional normal matrix can be pre-computed like so:\n\t * ```js\n\t * const optionalNormalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );\n\t * ```\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @param {Matrix4} [optionalNormalMatrix] - A pre-computed normal matrix.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the plane by the distance defined by the given offset vector.\n\t * Note that this only affects the plane constant and will not affect the normal vector.\n\t *\n\t * @param {Vector3} offset - The offset vector.\n\t * @return {Plane} A reference to this plane.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this plane is equal with the given one.\n\t *\n\t * @param {Plane} plane - The plane to test for equality.\n\t * @return {boolean} Whether this plane is equal with the given one.\n\t */\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\t/**\n\t * Returns a new plane with copied values from this instance.\n\t *\n\t * @return {Plane} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _sphere$3 = /*@__PURE__*/ new Sphere();\nconst _defaultSpriteCenter = /*@__PURE__*/ new Vector2( 0.5, 0.5 );\nconst _vector$6 = /*@__PURE__*/ new Vector3();\n\n/**\n * Frustums are used to determine what is inside the camera's field of view.\n * They help speed up the rendering process - objects which lie outside a camera's\n * frustum can safely be excluded from rendering.\n *\n * This class is mainly intended for use internally by a renderer.\n */\nclass Frustum {\n\n\t/**\n\t * Constructs a new frustum.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t */\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\t/**\n\t\t * This array holds the planes that enclose the frustum.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\t/**\n\t * Sets the frustum planes by copying the given planes.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given frustum to this instance.\n\t *\n\t * @param {Frustum} frustum - The frustum to copy.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the frustum planes from the given projection matrix.\n\t *\n\t * @param {Matrix4} m - The projection matrix.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} coordinateSystem - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tsetFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tplanes[ 4 ].setComponents( me2, me6, me10, me14 ).normalize(); // far\n\t\t\tplanes[ 5 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // near\n\n\t\t} else {\n\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // far\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); // near\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tplanes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize(); // near\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting this frustum.\n\t *\n\t * Note that the 3D object must have a geometry so that the bounding sphere can be calculated.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @return {boolean} Whether the 3D object's bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsObject( object ) {\n\n\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( object.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t} else {\n\n\t\t\tconst geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t}\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting this frustum.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @return {boolean} Whether the sprite is intersecting this frustum or not.\n\t */\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$3.center.set( 0, 0, 0 );\n\n\t\tconst offset = _defaultSpriteCenter.distanceTo( sprite.center );\n\n\t\t_sphere$3.radius = 0.7071067811865476 + offset;\n\t\t_sphere$3.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting this frustum.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting this frustum.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box is intersecting this frustum or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$6.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$6.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$6.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$6 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within the frustum.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the point lies within this frustum or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns a new frustum with copied values from this instance.\n\t *\n\t * @return {Frustum} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _projScreenMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _frustum$1 = /*@__PURE__*/ new Frustum();\n\n/**\n * FrustumArray is used to determine if an object is visible in at least one camera\n * from an array of cameras. This is particularly useful for multi-view renderers.\n*/\nclass FrustumArray {\n\n\t/**\n\t * Constructs a new frustum array.\n\t *\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The coordinate system to use.\n\t\t *\n\t\t * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}\n\t\t * @default WebGLCoordinateSystem\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the 3D object is visible in any camera.\n\t */\n\tintersectsObject( object, cameraArray ) {\n\n\t\tif ( ! cameraArray.isArrayCamera || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsObject( object ) ) {\n\n\t\t\t\treturn true; // Object is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the sprite is visible in any camera.\n\t */\n\tintersectsSprite( sprite, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsSprite( sprite ) ) {\n\n\t\t\t\treturn true; // Sprite is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the sphere is visible in any camera.\n\t */\n\tintersectsSphere( sphere, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsSphere( sphere ) ) {\n\n\t\t\t\treturn true; // Sphere is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the box is visible in any camera.\n\t */\n\tintersectsBox( box, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsBox( box ) ) {\n\n\t\t\t\treturn true; // Box is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within any frustum\n\t * from the camera array.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the point is visible in any camera.\n\t */\n\tcontainsPoint( point, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.containsPoint( point ) ) {\n\n\t\t\t\treturn true; // Point is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns a new frustum array with copied values from this instance.\n\t *\n\t * @return {FrustumArray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FrustumArray();\n\n\t}\n\n}\n\nfunction ascIdSort( a, b ) {\n\n\treturn a - b;\n\n}\n\nfunction sortOpaque( a, b ) {\n\n\treturn a.z - b.z;\n\n}\n\nfunction sortTransparent( a, b ) {\n\n\treturn b.z - a.z;\n\n}\n\nclass MultiDrawRenderList {\n\n\tconstructor() {\n\n\t\tthis.index = 0;\n\t\tthis.pool = [];\n\t\tthis.list = [];\n\n\t}\n\n\tpush( start, count, z, index ) {\n\n\t\tconst pool = this.pool;\n\t\tconst list = this.list;\n\t\tif ( this.index >= pool.length ) {\n\n\t\t\tpool.push( {\n\n\t\t\t\tstart: -1,\n\t\t\t\tcount: -1,\n\t\t\t\tz: -1,\n\t\t\t\tindex: -1,\n\n\t\t\t} );\n\n\t\t}\n\n\t\tconst item = pool[ this.index ];\n\t\tlist.push( item );\n\t\tthis.index ++;\n\n\t\titem.start = start;\n\t\titem.count = count;\n\t\titem.z = z;\n\t\titem.index = index;\n\n\t}\n\n\treset() {\n\n\t\tthis.list.length = 0;\n\t\tthis.index = 0;\n\n\t}\n\n}\n\nconst _matrix$1 = /*@__PURE__*/ new Matrix4();\nconst _whiteColor = /*@__PURE__*/ new Color( 1, 1, 1 );\nconst _frustum = /*@__PURE__*/ new Frustum();\nconst _frustumArray = /*@__PURE__*/ new FrustumArray();\nconst _box$1 = /*@__PURE__*/ new Box3();\nconst _sphere$2 = /*@__PURE__*/ new Sphere();\nconst _vector$5 = /*@__PURE__*/ new Vector3();\nconst _forward$1 = /*@__PURE__*/ new Vector3();\nconst _temp = /*@__PURE__*/ new Vector3();\nconst _renderList = /*@__PURE__*/ new MultiDrawRenderList();\nconst _mesh = /*@__PURE__*/ new Mesh();\nconst _batchIntersects = [];\n\n// copies data from attribute \"src\" into \"target\" starting at \"targetOffset\"\nfunction copyAttributeData( src, target, targetOffset = 0 ) {\n\n\tconst itemSize = target.itemSize;\n\tif ( src.isInterleavedBufferAttribute || src.array.constructor !== target.array.constructor ) {\n\n\t\t// use the component getters and setters if the array data cannot\n\t\t// be copied directly\n\t\tconst vertexCount = src.count;\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\ttarget.setComponent( i + targetOffset, c, src.getComponent( i, c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// faster copy approach using typed array set function\n\t\ttarget.array.set( src.array, targetOffset * itemSize );\n\n\t}\n\n\ttarget.needsUpdate = true;\n\n}\n\n// safely copies array contents to a potentially smaller array\nfunction copyArrayContents( src, target ) {\n\n\tif ( src.constructor !== target.constructor ) {\n\n\t\t// if arrays are of a different type (eg due to index size increasing) then data must be per-element copied\n\t\tconst len = Math.min( src.length, target.length );\n\t\tfor ( let i = 0; i < len; i ++ ) {\n\n\t\t\ttarget[ i ] = src[ i ];\n\n\t\t}\n\n\t} else {\n\n\t\t// if the arrays use the same data layout we can use a fast block copy\n\t\tconst len = Math.min( src.length, target.length );\n\t\ttarget.set( new src.constructor( src.buffer, 0, len ) );\n\n\t}\n\n}\n\n/**\n * A special version of a mesh with multi draw batch rendering support. Use\n * this class if you have to render a large number of objects with the same\n * material but with different geometries or world transformations. The usage of\n * `BatchedMesh` will help you to reduce the number of draw calls and thus improve the overall\n * rendering performance in your application.\n *\n * ```js\n * const box = new THREE.BoxGeometry( 1, 1, 1 );\n * const sphere = new THREE.SphereGeometry( 1, 12, 12 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n *\n * // initialize and add geometries into the batched mesh\n * const batchedMesh = new BatchedMesh( 10, 5000, 10000, material );\n * const boxGeometryId = batchedMesh.addGeometry( box );\n * const sphereGeometryId = batchedMesh.addGeometry( sphere );\n *\n * // create instances of those geometries\n * const boxInstancedId1 = batchedMesh.addInstance( boxGeometryId );\n * const boxInstancedId2 = batchedMesh.addInstance( boxGeometryId );\n *\n * const sphereInstancedId1 = batchedMesh.addInstance( sphereGeometryId );\n * const sphereInstancedId2 = batchedMesh.addInstance( sphereGeometryId );\n *\n * // position the geometries\n * batchedMesh.setMatrixAt( boxInstancedId1, boxMatrix1 );\n * batchedMesh.setMatrixAt( boxInstancedId2, boxMatrix2 );\n *\n * batchedMesh.setMatrixAt( sphereInstancedId1, sphereMatrix1 );\n * batchedMesh.setMatrixAt( sphereInstancedId2, sphereMatrix2 );\n *\n * scene.add( batchedMesh );\n * ```\n *\n * @augments Mesh\n */\nclass BatchedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new batched mesh.\n\t *\n\t * @param {number} maxInstanceCount - The maximum number of individual instances planned to be added and rendered.\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries.\n\t * @param {number} [maxIndexCount=maxVertexCount*2] - The maximum number of indices to be used by all unique geometries\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {\n\n\t\tsuper( new BufferGeometry(), material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBatchedMesh = true;\n\n\t\t/**\n\t\t * When set ot `true`, the individual objects of a batch are frustum culled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.perObjectFrustumCulled = true;\n\n\t\t/**\n\t\t * When set to `true`, the individual objects of a batch are sorted to improve overdraw-related artifacts.\n\t\t * If the material is marked as \"transparent\" objects are rendered back to front and if not then they are\n\t\t * rendered front to back.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t/**\n\t\t * The bounding box of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered\n\t\t * sort with.\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.customSort = null;\n\n\t\t// stores visible, active, and geometry id per instance and reserved buffer ranges for geometries\n\t\tthis._instanceInfo = [];\n\t\tthis._geometryInfo = [];\n\n\t\t// instance, geometry ids that have been set as inactive, and are available to be overwritten\n\t\tthis._availableInstanceIds = [];\n\t\tthis._availableGeometryIds = [];\n\n\t\t// used to track where the next point is that geometry should be inserted\n\t\tthis._nextIndexStart = 0;\n\t\tthis._nextVertexStart = 0;\n\t\tthis._geometryCount = 0;\n\n\t\t// flags\n\t\tthis._visibilityChanged = true;\n\t\tthis._geometryInitialized = false;\n\n\t\t// cached user options\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\t// buffers for multi draw\n\t\tthis._multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawCount = 0;\n\t\tthis._multiDrawInstances = null;\n\n\t\t// Local matrix per geometry by using data texture\n\t\tthis._matricesTexture = null;\n\t\tthis._indirectTexture = null;\n\t\tthis._colorsTexture = null;\n\n\t\tthis._initMatricesTexture();\n\t\tthis._initIndirectTexture();\n\n\t}\n\n\t/**\n\t * The maximum number of individual instances that can be stored in the batch.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget maxInstanceCount() {\n\n\t\treturn this._maxInstanceCount;\n\n\t}\n\n\t/**\n\t * The instance count.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget instanceCount() {\n\n\t\treturn this._instanceInfo.length - this._availableInstanceIds.length;\n\n\t}\n\n\t/**\n\t * The number of unused vertices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedVertexCount() {\n\n\t\treturn this._maxVertexCount - this._nextVertexStart;\n\n\t}\n\n\t/**\n\t * The number of unused indices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedIndexCount() {\n\n\t\treturn this._maxIndexCount - this._nextIndexStart;\n\n\t}\n\n\t_initMatricesTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 matrices * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 matrices * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 matrices * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst matricesArray = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tconst matricesTexture = new DataTexture( matricesArray, size, size, RGBAFormat, FloatType );\n\n\t\tthis._matricesTexture = matricesTexture;\n\n\t}\n\n\t_initIndirectTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\tconst indirectArray = new Uint32Array( size * size );\n\t\tconst indirectTexture = new DataTexture( indirectArray, size, size, RedIntegerFormat, UnsignedIntType );\n\n\t\tthis._indirectTexture = indirectTexture;\n\n\t}\n\n\t_initColorsTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\t// 4 floats per RGBA pixel initialized to white\n\t\tconst colorsArray = new Float32Array( size * size * 4 ).fill( 1 );\n\t\tconst colorsTexture = new DataTexture( colorsArray, size, size, RGBAFormat, FloatType );\n\t\tcolorsTexture.colorSpace = ColorManagement.workingColorSpace;\n\n\t\tthis._colorsTexture = colorsTexture;\n\n\t}\n\n\t_initializeGeometry( reference ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst maxVertexCount = this._maxVertexCount;\n\t\tconst maxIndexCount = this._maxIndexCount;\n\t\tif ( this._geometryInitialized === false ) {\n\n\t\t\tfor ( const attributeName in reference.attributes ) {\n\n\t\t\t\tconst srcAttribute = reference.getAttribute( attributeName );\n\t\t\t\tconst { array, itemSize, normalized } = srcAttribute;\n\n\t\t\t\tconst dstArray = new array.constructor( maxVertexCount * itemSize );\n\t\t\t\tconst dstAttribute = new BufferAttribute( dstArray, itemSize, normalized );\n\n\t\t\t\tgeometry.setAttribute( attributeName, dstAttribute );\n\n\t\t\t}\n\n\t\t\tif ( reference.getIndex() !== null ) {\n\n\t\t\t\t// Reserve last u16 index for primitive restart.\n\t\t\t\tconst indexArray = maxVertexCount > 65535\n\t\t\t\t\t? new Uint32Array( maxIndexCount )\n\t\t\t\t\t: new Uint16Array( maxIndexCount );\n\n\t\t\t\tgeometry.setIndex( new BufferAttribute( indexArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tthis._geometryInitialized = true;\n\n\t\t}\n\n\t}\n\n\t// Make sure the geometry is compatible with the existing combined geometry attributes\n\t_validateGeometry( geometry ) {\n\n\t\t// check to ensure the geometries are using consistent attributes and indices\n\t\tconst batchGeometry = this.geometry;\n\t\tif ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: All geometries must consistently have \"index\".' );\n\n\t\t}\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\tif ( ! geometry.hasAttribute( attributeName ) ) {\n\n\t\t\t\tthrow new Error( `THREE.BatchedMesh: Added geometry missing \"${ attributeName }\". All geometries must have consistent attributes.` );\n\n\t\t\t}\n\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tif ( srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized ) {\n\n\t\t\t\tthrow new Error( 'THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the instance defined by the given ID.\n\t *\n\t * @param {number} instanceId - The instance to validate.\n\t */\n\tvalidateInstanceId( instanceId ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tif ( instanceId < 0 || instanceId >= instanceInfo.length || instanceInfo[ instanceId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid instanceId ${instanceId}. Instance is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the geometry defined by the given ID.\n\t *\n\t * @param {number} geometryId - The geometry to validate.\n\t */\n\tvalidateGeometryId( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId < 0 || geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid geometryId ${geometryId}. Geometry is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered sort with.\n\t *\n\t * @param {Function} func - The custom sort function.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetCustomSort( func ) {\n\n\t\tthis.customSort = func;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box, updating {@link BatchedMesh#boundingBox}.\n\t * Bounding boxes aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst boundingBox = this.boundingBox;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingBox.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingBox.union( _box$1 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere, updating {@link BatchedMesh#boundingSphere}.\n\t * Bounding spheres aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingSphere.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingSphere.union( _sphere$2 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds a new instance to the batch using the geometry of the given ID and returns\n\t * a new id referring to the new instance to be used by other functions.\n\t *\n\t * @param {number} geometryId - The ID of a previously added geometry via {@link BatchedMesh#addGeometry}.\n\t * @return {number} The instance ID.\n\t */\n\taddInstance( geometryId ) {\n\n\t\tconst atCapacity = this._instanceInfo.length >= this.maxInstanceCount;\n\n\t\t// ensure we're not over geometry\n\t\tif ( atCapacity && this._availableInstanceIds.length === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum item count reached.' );\n\n\t\t}\n\n\t\tconst instanceInfo = {\n\t\t\tvisible: true,\n\t\t\tactive: true,\n\t\t\tgeometryIndex: geometryId,\n\t\t};\n\n\t\tlet drawId = null;\n\n\t\t// Prioritize using previously freed instance ids\n\t\tif ( this._availableInstanceIds.length > 0 ) {\n\n\t\t\tthis._availableInstanceIds.sort( ascIdSort );\n\n\t\t\tdrawId = this._availableInstanceIds.shift();\n\t\t\tthis._instanceInfo[ drawId ] = instanceInfo;\n\n\t\t} else {\n\n\t\t\tdrawId = this._instanceInfo.length;\n\t\t\tthis._instanceInfo.push( instanceInfo );\n\n\t\t}\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\t_matrix$1.identity().toArray( matricesTexture.image.data, drawId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\tconst colorsTexture = this._colorsTexture;\n\t\tif ( colorsTexture ) {\n\n\t\t\t_whiteColor.toArray( colorsTexture.image.data, drawId * 4 );\n\t\t\tcolorsTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn drawId;\n\n\t}\n\n\t/**\n\t * Adds the given geometry to the batch and returns the associated\n\t * geometry id referring to it to be used in other functions.\n\t *\n\t * @param {BufferGeometry} geometry - The geometry to add.\n\t * @param {number} [reservedVertexCount=-1] - Optional parameter specifying the amount of\n\t * vertex buffer space to reserve for the added geometry. This is necessary if it is planned\n\t * to set a new geometry at this index at a later time that is larger than the original geometry.\n\t * Defaults to the length of the given geometry vertex buffer.\n\t * @param {number} [reservedIndexCount=-1] - Optional parameter specifying the amount of index\n\t * buffer space to reserve for the added geometry. This is necessary if it is planned to set a\n\t * new geometry at this index at a later time that is larger than the original geometry. Defaults to\n\t * the length of the given geometry index buffer.\n\t * @return {number} The geometry ID.\n\t */\n\taddGeometry( geometry, reservedVertexCount = -1, reservedIndexCount = -1 ) {\n\n\t\tthis._initializeGeometry( geometry );\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst geometryInfo = {\n\t\t\t// geometry information\n\t\t\tvertexStart: -1,\n\t\t\tvertexCount: -1,\n\t\t\treservedVertexCount: -1,\n\n\t\t\tindexStart: -1,\n\t\t\tindexCount: -1,\n\t\t\treservedIndexCount: -1,\n\n\t\t\t// draw range information\n\t\t\tstart: -1,\n\t\t\tcount: -1,\n\n\t\t\t// state\n\t\t\tboundingBox: null,\n\t\t\tboundingSphere: null,\n\t\t\tactive: true,\n\t\t};\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tgeometryInfo.vertexStart = this._nextVertexStart;\n\t\tgeometryInfo.reservedVertexCount = reservedVertexCount === -1 ? geometry.getAttribute( 'position' ).count : reservedVertexCount;\n\n\t\tconst index = geometry.getIndex();\n\t\tconst hasIndex = index !== null;\n\t\tif ( hasIndex ) {\n\n\t\t\tgeometryInfo.indexStart = this._nextIndexStart;\n\t\t\tgeometryInfo.reservedIndexCount = reservedIndexCount === -1 ? index.count : reservedIndexCount;\n\n\t\t}\n\n\t\tif (\n\t\t\tgeometryInfo.indexStart !== -1 &&\n\t\t\tgeometryInfo.indexStart + geometryInfo.reservedIndexCount > this._maxIndexCount ||\n\t\t\tgeometryInfo.vertexStart + geometryInfo.reservedVertexCount > this._maxVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.' );\n\n\t\t}\n\n\t\t// update id\n\t\tlet geometryId;\n\t\tif ( this._availableGeometryIds.length > 0 ) {\n\n\t\t\tthis._availableGeometryIds.sort( ascIdSort );\n\n\t\t\tgeometryId = this._availableGeometryIds.shift();\n\t\t\tgeometryInfoList[ geometryId ] = geometryInfo;\n\n\n\t\t} else {\n\n\t\t\tgeometryId = this._geometryCount;\n\t\t\tthis._geometryCount ++;\n\t\t\tgeometryInfoList.push( geometryInfo );\n\n\t\t}\n\n\t\t// update the geometry\n\t\tthis.setGeometryAt( geometryId, geometry );\n\n\t\t// increment the next geometry position\n\t\tthis._nextIndexStart = geometryInfo.indexStart + geometryInfo.reservedIndexCount;\n\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Replaces the geometry at the given ID with the provided geometry. Throws an error if there\n\t * is not enough space reserved for geometry. Calling this will change all instances that are\n\t * rendering that geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry that should be replaced with the given geometry.\n\t * @param {BufferGeometry} geometry - The new geometry.\n\t * @return {number} The geometry ID.\n\t */\n\tsetGeometryAt( geometryId, geometry ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum geometry count reached.' );\n\n\t\t}\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst batchGeometry = this.geometry;\n\t\tconst hasIndex = batchGeometry.getIndex() !== null;\n\t\tconst dstIndex = batchGeometry.getIndex();\n\t\tconst srcIndex = geometry.getIndex();\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif (\n\t\t\thasIndex &&\n\t\t\tsrcIndex.count > geometryInfo.reservedIndexCount ||\n\t\t\tgeometry.attributes.position.count > geometryInfo.reservedVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space not large enough for provided geometry.' );\n\n\t\t}\n\n\t\t// copy geometry buffer data over\n\t\tconst vertexStart = geometryInfo.vertexStart;\n\t\tconst reservedVertexCount = geometryInfo.reservedVertexCount;\n\t\tgeometryInfo.vertexCount = geometry.getAttribute( 'position' ).count;\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\t// copy attribute data\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tcopyAttributeData( srcAttribute, dstAttribute, vertexStart );\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tconst itemSize = srcAttribute.itemSize;\n\t\t\tfor ( let i = srcAttribute.count, l = reservedVertexCount; i < l; i ++ ) {\n\n\t\t\t\tconst index = vertexStart + i;\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tdstAttribute.setComponent( index, c, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdstAttribute.needsUpdate = true;\n\t\t\tdstAttribute.addUpdateRange( vertexStart * itemSize, reservedVertexCount * itemSize );\n\n\t\t}\n\n\t\t// copy index\n\t\tif ( hasIndex ) {\n\n\t\t\tconst indexStart = geometryInfo.indexStart;\n\t\t\tconst reservedIndexCount = geometryInfo.reservedIndexCount;\n\t\t\tgeometryInfo.indexCount = geometry.getIndex().count;\n\n\t\t\t// copy index data over\n\t\t\tfor ( let i = 0; i < srcIndex.count; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart + srcIndex.getX( i ) );\n\n\t\t\t}\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tfor ( let i = srcIndex.count, l = reservedIndexCount; i < l; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart );\n\n\t\t\t}\n\n\t\t\tdstIndex.needsUpdate = true;\n\t\t\tdstIndex.addUpdateRange( indexStart, geometryInfo.reservedIndexCount );\n\n\t\t}\n\n\t\t// update the draw range\n\t\tgeometryInfo.start = hasIndex ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\t\tgeometryInfo.count = hasIndex ? geometryInfo.indexCount : geometryInfo.vertexCount;\n\n\t\t// store the bounding boxes\n\t\tgeometryInfo.boundingBox = null;\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tgeometryInfo.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\tgeometryInfo.boundingSphere = null;\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tgeometryInfo.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Deletes the geometry defined by the given ID from this batch. Any instances referencing\n\t * this geometry will also be removed as a side effect.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteGeometry( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t// delete any instances associated with this geometry\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active && instanceInfo[ i ].geometryIndex === geometryId ) {\n\n\t\t\t\tthis.deleteInstance( i );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometryInfoList[ geometryId ].active = false;\n\t\tthis._availableGeometryIds.push( geometryId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes an existing instance from the batch using the given ID.\n\t *\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteInstance( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tthis._instanceInfo[ instanceId ].active = false;\n\t\tthis._availableInstanceIds.push( instanceId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Repacks the sub geometries in [name] to remove any unused space remaining from\n\t * previously deleted geometry, freeing up space to add new geometry.\n\t *\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\toptimize() {\n\n\t\t// track the next indices to copy data to\n\t\tlet nextVertexStart = 0;\n\t\tlet nextIndexStart = 0;\n\n\t\t// Iterate over all geometry ranges in order sorted from earliest in the geometry buffer to latest\n\t\t// in the geometry buffer. Because draw range objects can be reused there is no guarantee of their order.\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst indices = geometryInfoList\n\t\t\t.map( ( e, i ) => i )\n\t\t\t.sort( ( a, b ) => {\n\n\t\t\t\treturn geometryInfoList[ a ].vertexStart - geometryInfoList[ b ].vertexStart;\n\n\t\t\t} );\n\n\t\tconst geometry = this.geometry;\n\t\tfor ( let i = 0, l = geometryInfoList.length; i < l; i ++ ) {\n\n\t\t\t// if a geometry range is inactive then don't copy anything\n\t\t\tconst index = indices[ i ];\n\t\t\tconst geometryInfo = geometryInfoList[ index ];\n\t\t\tif ( geometryInfo.active === false ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// if a geometry contains an index buffer then shift it, as well\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\tif ( geometryInfo.indexStart !== nextIndexStart ) {\n\n\t\t\t\t\tconst { indexStart, vertexStart, reservedIndexCount } = geometryInfo;\n\t\t\t\t\tconst index = geometry.index;\n\t\t\t\t\tconst array = index.array;\n\n\t\t\t\t\t// shift the index pointers based on how the vertex data will shift\n\t\t\t\t\t// adjusting the index must happen first so the original vertex start value is available\n\t\t\t\t\tconst elementDelta = nextVertexStart - vertexStart;\n\t\t\t\t\tfor ( let j = indexStart; j < indexStart + reservedIndexCount; j ++ ) {\n\n\t\t\t\t\t\tarray[ j ] = array[ j ] + elementDelta;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tindex.array.copyWithin( nextIndexStart, indexStart, indexStart + reservedIndexCount );\n\t\t\t\t\tindex.addUpdateRange( nextIndexStart, reservedIndexCount );\n\n\t\t\t\t\tgeometryInfo.indexStart = nextIndexStart;\n\n\t\t\t\t}\n\n\t\t\t\tnextIndexStart += geometryInfo.reservedIndexCount;\n\n\t\t\t}\n\n\t\t\t// if a geometry needs to be moved then copy attribute data to overwrite unused space\n\t\t\tif ( geometryInfo.vertexStart !== nextVertexStart ) {\n\n\t\t\t\tconst { vertexStart, reservedVertexCount } = geometryInfo;\n\t\t\t\tconst attributes = geometry.attributes;\n\t\t\t\tfor ( const key in attributes ) {\n\n\t\t\t\t\tconst attribute = attributes[ key ];\n\t\t\t\t\tconst { array, itemSize } = attribute;\n\t\t\t\t\tarray.copyWithin( nextVertexStart * itemSize, vertexStart * itemSize, ( vertexStart + reservedVertexCount ) * itemSize );\n\t\t\t\t\tattribute.addUpdateRange( nextVertexStart * itemSize, reservedVertexCount * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tgeometryInfo.vertexStart = nextVertexStart;\n\n\t\t\t}\n\n\t\t\tnextVertexStart += geometryInfo.reservedVertexCount;\n\t\t\tgeometryInfo.start = geometry.index ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\n\t\t\t// step the next geometry points to the shifted position\n\t\t\tthis._nextIndexStart = geometry.index ? geometryInfo.indexStart + geometryInfo.reservedIndexCount : 0;\n\t\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the bounding box for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding box for.\n\t * @param {Box3} target - The target object that is used to store the method's result.\n\t * @return {?Box3} The geometry's bounding box. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingBoxAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding box\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingBox === null ) {\n\n\t\t\tconst box = new Box3();\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\tbox.expandByPoint( _vector$5.fromBufferAttribute( position, iv ) );\n\n\t\t\t}\n\n\t\t\tgeometryInfo.boundingBox = box;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingBox );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the bounding sphere for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding sphere for.\n\t * @param {Sphere} target - The target object that is used to store the method's result.\n\t * @return {?Sphere} The geometry's bounding sphere. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingSphereAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding sphere\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingSphere === null ) {\n\n\t\t\tconst sphere = new Sphere();\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 );\n\t\t\t_box$1.getCenter( sphere.center );\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet maxRadiusSq = 0;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\t_vector$5.fromBufferAttribute( position, iv );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, sphere.center.distanceToSquared( _vector$5 ) );\n\n\t\t\t}\n\n\t\t\tsphere.radius = Math.sqrt( maxRadiusSq );\n\t\t\tgeometryInfo.boundingSphere = sphere;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingSphere );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance.\n\t * Negatively scaled matrices are not supported.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the matrix of.\n\t * @param {Matrix4} matrix - A 4x4 matrix representing the local transformation of a single instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst matricesArray = this._matricesTexture.image.data;\n\t\tmatrix.toArray( matricesArray, instanceId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the matrix of.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t * @return {Matrix4} The instance's local transformation matrix.\n\t */\n\tgetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn matrix.fromArray( this._matricesTexture.image.data, instanceId * 16 );\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the color of.\n\t * @param {Color} color - The color to set the instance to.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._colorsTexture === null ) {\n\n\t\t\tthis._initColorsTexture();\n\n\t\t}\n\n\t\tcolor.toArray( this._colorsTexture.image.data, instanceId * 4 );\n\t\tthis._colorsTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the color of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the color of.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t * @return {Color} The instance's color.\n\t */\n\tgetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn color.fromArray( this._colorsTexture.image.data, instanceId * 4 );\n\n\t}\n\n\t/**\n\t * Sets the visibility of the instance.\n\t *\n\t * @param {number} instanceId - The id of the instance to set the visibility of.\n\t * @param {boolean} visible - Whether the instance is visible or not.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetVisibleAt( instanceId, visible ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._instanceInfo[ instanceId ].visible === visible ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis._instanceInfo[ instanceId ].visible = visible;\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the visibility state of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the visibility state of.\n\t * @return {boolean} Whether the instance is visible or not.\n\t */\n\tgetVisibleAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].visible;\n\n\t}\n\n\t/**\n\t * Sets the geometry ID of the instance at the given index.\n\t *\n\t * @param {number} instanceId - The ID of the instance to set the geometry ID of.\n\t * @param {number} geometryId - The geometry ID to be use by the instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetGeometryIdAt( instanceId, geometryId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tthis._instanceInfo[ instanceId ].geometryIndex = geometryId;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the geometry ID of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the geometry ID of.\n\t * @return {number} The instance's geometry ID.\n\t */\n\tgetGeometryIdAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].geometryIndex;\n\n\t}\n\n\t/**\n\t * Get the range representing the subset of triangles related to the attached geometry,\n\t * indicating the starting offset and count, or `null` if invalid.\n\t *\n\t * @param {number} geometryId - The id of the geometry to get the range of.\n\t * @param {Object} [target] - The target object that is used to store the method's result.\n\t * @return {{\n\t * \tvertexStart:number,vertexCount:number,reservedVertexCount:number,\n\t * \tindexStart:number,indexCount:number,reservedIndexCount:number,\n\t * \tstart:number,count:number\n\t * }} The result object with range data.\n\t */\n\tgetGeometryRangeAt( geometryId, target = {} ) {\n\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\ttarget.vertexStart = geometryInfo.vertexStart;\n\t\ttarget.vertexCount = geometryInfo.vertexCount;\n\t\ttarget.reservedVertexCount = geometryInfo.reservedVertexCount;\n\n\t\ttarget.indexStart = geometryInfo.indexStart;\n\t\ttarget.indexCount = geometryInfo.indexCount;\n\t\ttarget.reservedIndexCount = geometryInfo.reservedIndexCount;\n\n\t\ttarget.start = geometryInfo.start;\n\t\ttarget.count = geometryInfo.count;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Resizes the necessary buffers to support the provided number of instances.\n\t * If the provided arguments shrink the number of instances but there are not enough\n\t * unused Ids at the end of the list then an error is thrown.\n\t *\n\t * @param {number} maxInstanceCount - The max number of individual instances that can be added and rendered by the batch.\n\t*/\n\tsetInstanceCount( maxInstanceCount ) {\n\n\t\t// shrink the available instances as much as possible\n\t\tconst availableInstanceIds = this._availableInstanceIds;\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tavailableInstanceIds.sort( ascIdSort );\n\t\twhile ( availableInstanceIds[ availableInstanceIds.length - 1 ] === instanceInfo.length - 1 ) {\n\n\t\t\tinstanceInfo.pop();\n\t\t\tavailableInstanceIds.pop();\n\n\t\t}\n\n\t\t// throw an error if it can't be shrunk to the desired size\n\t\tif ( maxInstanceCount < instanceInfo.length ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Instance ids outside the range ${ maxInstanceCount } are being used. Cannot shrink instance count.` );\n\n\t\t}\n\n\t\t// copy the multi draw counts\n\t\tconst multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tconst multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tcopyArrayContents( this._multiDrawCounts, multiDrawCounts );\n\t\tcopyArrayContents( this._multiDrawStarts, multiDrawStarts );\n\n\t\tthis._multiDrawCounts = multiDrawCounts;\n\t\tthis._multiDrawStarts = multiDrawStarts;\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\n\t\t// update texture data for instance sampling\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst colorsTexture = this._colorsTexture;\n\n\t\tindirectTexture.dispose();\n\t\tthis._initIndirectTexture();\n\t\tcopyArrayContents( indirectTexture.image.data, this._indirectTexture.image.data );\n\n\t\tmatricesTexture.dispose();\n\t\tthis._initMatricesTexture();\n\t\tcopyArrayContents( matricesTexture.image.data, this._matricesTexture.image.data );\n\n\t\tif ( colorsTexture ) {\n\n\t\t\tcolorsTexture.dispose();\n\t\t\tthis._initColorsTexture();\n\t\t\tcopyArrayContents( colorsTexture.image.data, this._colorsTexture.image.data );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resizes the available space in the batch's vertex and index buffer attributes to the provided sizes.\n\t * If the provided arguments shrink the geometry buffers but there is not enough unused space at the\n\t * end of the geometry attributes then an error is thrown.\n\t *\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries to resize to.\n\t * @param {number} maxIndexCount - The maximum number of indices to be used by all unique geometries to resize to.\n\t*/\n\tsetGeometrySize( maxVertexCount, maxIndexCount ) {\n\n\t\t// Check if we can shrink to the requested vertex attribute size\n\t\tconst validRanges = [ ...this._geometryInfo ].filter( info => info.active );\n\t\tconst requiredVertexLength = Math.max( ...validRanges.map( range => range.vertexStart + range.reservedVertexCount ) );\n\t\tif ( requiredVertexLength > maxVertexCount ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Geometry vertex values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t}\n\n\t\t// Check if we can shrink to the requested index attribute size\n\t\tif ( this.geometry.index ) {\n\n\t\t\tconst requiredIndexLength = Math.max( ...validRanges.map( range => range.indexStart + range.reservedIndexCount ) );\n\t\t\tif ( requiredIndexLength > maxIndexCount ) {\n\n\t\t\t\tthrow new Error( `BatchedMesh: Geometry index values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\t// dispose of the previous geometry\n\t\tconst oldGeometry = this.geometry;\n\t\toldGeometry.dispose();\n\n\t\t// recreate the geometry needed based on the previous variant\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\tif ( this._geometryInitialized ) {\n\n\t\t\tthis._geometryInitialized = false;\n\t\t\tthis.geometry = new BufferGeometry();\n\t\t\tthis._initializeGeometry( oldGeometry );\n\n\t\t}\n\n\t\t// copy data from the previous geometry\n\t\tconst geometry = this.geometry;\n\t\tif ( oldGeometry.index ) {\n\n\t\t\tcopyArrayContents( oldGeometry.index.array, geometry.index.array );\n\n\t\t}\n\n\t\tfor ( const key in oldGeometry.attributes ) {\n\n\t\t\tcopyArrayContents( oldGeometry.attributes[ key ].array, geometry.attributes[ key ].array );\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst batchGeometry = this.geometry;\n\n\t\t// iterate over each geometry\n\t\t_mesh.material = this.material;\n\t\t_mesh.geometry.index = batchGeometry.index;\n\t\t_mesh.geometry.attributes = batchGeometry.attributes;\n\t\tif ( _mesh.geometry.boundingBox === null ) {\n\n\t\t\t_mesh.geometry.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( _mesh.geometry.boundingSphere === null ) {\n\n\t\t\t_mesh.geometry.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( ! instanceInfo[ i ].visible || ! instanceInfo[ i ].active ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t_mesh.geometry.setDrawRange( geometryInfo.start, geometryInfo.count );\n\n\t\t\t// get the intersects\n\t\t\tthis.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );\n\t\t\tthis.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );\n\t\t\tthis.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );\n\t\t\t_mesh.raycast( raycaster, _batchIntersects );\n\n\t\t\t// add batch id to the intersects\n\t\t\tfor ( let j = 0, l = _batchIntersects.length; j < l; j ++ ) {\n\n\t\t\t\tconst intersect = _batchIntersects[ j ];\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersect.batchId = i;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_batchIntersects.length = 0;\n\n\t\t}\n\n\t\t_mesh.material = null;\n\t\t_mesh.geometry.index = null;\n\t\t_mesh.geometry.attributes = {};\n\t\t_mesh.geometry.setDrawRange( 0, Infinity );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.geometry = source.geometry.clone();\n\t\tthis.perObjectFrustumCulled = source.perObjectFrustumCulled;\n\t\tthis.sortObjects = source.sortObjects;\n\t\tthis.boundingBox = source.boundingBox !== null ? source.boundingBox.clone() : null;\n\t\tthis.boundingSphere = source.boundingSphere !== null ? source.boundingSphere.clone() : null;\n\n\t\tthis._geometryInfo = source._geometryInfo.map( info => ( {\n\t\t\t...info,\n\n\t\t\tboundingBox: info.boundingBox !== null ? info.boundingBox.clone() : null,\n\t\t\tboundingSphere: info.boundingSphere !== null ? info.boundingSphere.clone() : null,\n\t\t} ) );\n\t\tthis._instanceInfo = source._instanceInfo.map( info => ( { ...info } ) );\n\n\t\tthis._availableInstanceIds = source._availableInstanceIds.slice();\n\t\tthis._availableGeometryIds = source._availableGeometryIds.slice();\n\n\t\tthis._nextIndexStart = source._nextIndexStart;\n\t\tthis._nextVertexStart = source._nextVertexStart;\n\t\tthis._geometryCount = source._geometryCount;\n\n\t\tthis._maxInstanceCount = source._maxInstanceCount;\n\t\tthis._maxVertexCount = source._maxVertexCount;\n\t\tthis._maxIndexCount = source._maxIndexCount;\n\n\t\tthis._geometryInitialized = source._geometryInitialized;\n\t\tthis._multiDrawCounts = source._multiDrawCounts.slice();\n\t\tthis._multiDrawStarts = source._multiDrawStarts.slice();\n\n\t\tthis._indirectTexture = source._indirectTexture.clone();\n\t\tthis._indirectTexture.image.data = this._indirectTexture.image.data.slice();\n\n\t\tthis._matricesTexture = source._matricesTexture.clone();\n\t\tthis._matricesTexture.image.data = this._matricesTexture.image.data.slice();\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture = source._colorsTexture.clone();\n\t\t\tthis._colorsTexture.image.data = this._colorsTexture.image.data.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// Assuming the geometry is not shared with other meshes\n\t\tthis.geometry.dispose();\n\n\t\tthis._matricesTexture.dispose();\n\t\tthis._matricesTexture = null;\n\n\t\tthis._indirectTexture.dispose();\n\t\tthis._indirectTexture = null;\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture.dispose();\n\t\t\tthis._colorsTexture = null;\n\n\t\t}\n\n\t}\n\n\tonBeforeRender( renderer, scene, camera, geometry, material/*, _group*/ ) {\n\n\t\t// if visibility has not changed and frustum culling and object sorting is not required\n\t\t// then skip iterating over all items\n\t\tif ( ! this._visibilityChanged && ! this.perObjectFrustumCulled && ! this.sortObjects ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// the indexed version of the multi draw function requires specifying the start\n\t\t// offset in bytes.\n\t\tconst index = geometry.getIndex();\n\t\tconst bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst multiDrawStarts = this._multiDrawStarts;\n\t\tconst multiDrawCounts = this._multiDrawCounts;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst indirectArray = indirectTexture.image.data;\n\n\t\tconst frustum = camera.isArrayCamera ? _frustumArray : _frustum;\n\t\t// prepare the frustum in the local frame\n\t\tif ( perObjectFrustumCulled && ! camera.isArrayCamera ) {\n\n\t\t\t_matrix$1\n\t\t\t\t.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse )\n\t\t\t\t.multiply( this.matrixWorld );\n\n\t\t\t_frustum.setFromProjectionMatrix(\n\t\t\t\t_matrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t}\n\n\t\tlet multiDrawCount = 0;\n\t\tif ( this.sortObjects ) {\n\n\t\t\t// get the camera position in the local frame\n\t\t\t_matrix$1.copy( this.matrixWorld ).invert();\n\t\t\t_vector$5.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _matrix$1 );\n\t\t\t_forward$1.set( 0, 0, -1 ).transformDirection( camera.matrixWorld ).transformDirection( _matrix$1 );\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\tculled = ! frustum.intersectsSphere( _sphere$2, camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\t// get the distance from camera used for sorting\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tconst z = _temp.subVectors( _sphere$2.center, _vector$5 ).dot( _forward$1 );\n\t\t\t\t\t\t_renderList.push( geometryInfo.start, geometryInfo.count, z, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Sort the draw ranges and prep for rendering\n\t\t\tconst list = _renderList.list;\n\t\t\tconst customSort = this.customSort;\n\t\t\tif ( customSort === null ) {\n\n\t\t\t\tlist.sort( material.transparent ? sortTransparent : sortOpaque );\n\n\t\t\t} else {\n\n\t\t\t\tcustomSort.call( this, list, camera );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = list.length; i < l; i ++ ) {\n\n\t\t\t\tconst item = list[ i ];\n\t\t\t\tmultiDrawStarts[ multiDrawCount ] = item.start * bytesPerElement;\n\t\t\t\tmultiDrawCounts[ multiDrawCount ] = item.count;\n\t\t\t\tindirectArray[ multiDrawCount ] = item.index;\n\t\t\t\tmultiDrawCount ++;\n\n\t\t\t}\n\n\t\t\t_renderList.reset();\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\t\t\t\tculled = ! frustum.intersectsSphere( _sphere$2, camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tmultiDrawStarts[ multiDrawCount ] = geometryInfo.start * bytesPerElement;\n\t\t\t\t\t\tmultiDrawCounts[ multiDrawCount ] = geometryInfo.count;\n\t\t\t\t\t\tindirectArray[ multiDrawCount ] = i;\n\t\t\t\t\t\tmultiDrawCount ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tindirectTexture.needsUpdate = true;\n\t\tthis._multiDrawCount = multiDrawCount;\n\t\tthis._visibilityChanged = false;\n\n\t}\n\n\tonBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial/* , group */ ) {\n\n\t\tthis.onBeforeRender( renderer, null, shadowCamera, geometry, depthMaterial );\n\n\t}\n\n}\n\n/**\n * A material for rendering line primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n * ```\n *\n * @augments Material\n */\nclass LineBasicMaterial extends Material {\n\n\t/**\n\t * Constructs a new line basic material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineBasicMaterial = true;\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * Sets the color of the lines using data from a texture. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * Controls line thickness or lines.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}. WebGL and WebGPU\n\t\t * ignore this setting and always render line primitives with a\n\t\t * width of one pixel.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.linewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of line ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('butt'|'round'|'square')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.linecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of line joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.linejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vStart = /*@__PURE__*/ new Vector3();\nconst _vEnd = /*@__PURE__*/ new Vector3();\n\nconst _inverseMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _ray$1 = /*@__PURE__*/ new Ray();\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\n\nconst _intersectPointOnRay = /*@__PURE__*/ new Vector3();\nconst _intersectPointOnSegment = /*@__PURE__*/ new Vector3();\n\n/**\n * A continuous line. The line are rendered by connecting consecutive\n * vertices with straight lines.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0x0000ff } );\n *\n * const points = [];\n * points.push( new THREE.Vector3( - 10, 0, 0 ) );\n * points.push( new THREE.Vector3( 0, 10, 0 ) );\n * points.push( new THREE.Vector3( 10, 0, 0 ) );\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments Object3D\n */\nclass Line extends Object3D {\n\n\t/**\n\t * Constructs a new line.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLine = true;\n\n\t\tthis.type = 'Line';\n\n\t\t/**\n\t\t * The line geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default LineBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes an array of distance values which are necessary for rendering dashed lines.\n\t * For each vertex in the geometry, the method calculates the cumulative length from the\n\t * current point to the very beginning of the line.\n\t *\n\t * @return {Line} A reference to this line.\n\t */\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t_vStart.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t_vEnd.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i ] += _vStart.distanceTo( _vEnd );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\twarn( 'Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere );\n\t\t_sphere$1.applyMatrix4( matrixWorld );\n\t\t_sphere$1.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst a = index.getX( i );\n\t\t\t\tconst b = index.getX( i + 1 );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst a = index.getX( end - 1 );\n\t\t\t\tconst b = index.getX( start );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, i, i + 1, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, end - 1, start, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Line#morphTargetDictionary} and {@link Line#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection( object, raycaster, ray, thresholdSq, a, b, i ) {\n\n\tconst positionAttribute = object.geometry.attributes.position;\n\n\t_vStart.fromBufferAttribute( positionAttribute, a );\n\t_vEnd.fromBufferAttribute( positionAttribute, b );\n\n\tconst distSq = ray.distanceSqToSegment( _vStart, _vEnd, _intersectPointOnRay, _intersectPointOnSegment );\n\n\tif ( distSq > thresholdSq ) return;\n\n\t_intersectPointOnRay.applyMatrix4( object.matrixWorld ); // Move back to world space for distance calculation\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectPointOnRay );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\treturn {\n\n\t\tdistance: distance,\n\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t// point: raycaster.ray.at( distance ),\n\t\tpoint: _intersectPointOnSegment.clone().applyMatrix4( object.matrixWorld ),\n\t\tindex: i,\n\t\tface: null,\n\t\tfaceIndex: null,\n\t\tbarycoord: null,\n\t\tobject: object\n\n\t};\n\n}\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\n/**\n * A series of lines drawn between pairs of vertices.\n *\n * @augments Line\n */\nclass LineSegments extends Line {\n\n\t/**\n\t * Constructs a new line segments.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineSegments = true;\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [];\n\n\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t_start.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t_end.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\twarn( 'LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A continuous line. This is nearly the same as {@link Line} the only difference\n * is that the last vertex is connected with the first vertex in order to close\n * the line to form a loop.\n *\n * @augments Line\n */\nclass LineLoop extends Line {\n\n\t/**\n\t * Constructs a new line loop.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineLoop = true;\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n}\n\n/**\n * A material for rendering point primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const vertices = [];\n *\n * for ( let i = 0; i < 10000; i ++ ) {\n * \tconst x = THREE.MathUtils.randFloatSpread( 2000 );\n * \tconst y = THREE.MathUtils.randFloatSpread( 2000 );\n * \tconst z = THREE.MathUtils.randFloatSpread( 2000 );\n *\n * \tvertices.push( x, y, z );\n * }\n *\n * const geometry = new THREE.BufferGeometry();\n * geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) );\n * const material = new THREE.PointsMaterial( { color: 0x888888 } );\n * const points = new THREE.Points( geometry, material );\n * scene.add( points );\n * ```\n *\n * @augments Material\n */\nclass PointsMaterial extends Material {\n\n\t/**\n\t * Constructs a new points material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointsMaterial = true;\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Defines the size of the points in pixels.\n\t\t *\n\t\t * Might be capped if the value exceeds hardware dependent parameters like [gl.ALIASED_POINT_SIZE_RANGE](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParamete).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = 1;\n\n\t\t/**\n\t\t * Specifies whether size of individual points is attenuated by the camera depth (perspective camera only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position$2 = /*@__PURE__*/ new Vector3();\n\n/**\n * A class for displaying points or point clouds.\n *\n * @augments Object3D\n */\nclass Points extends Object3D {\n\n\t/**\n\t * Constructs a new point cloud.\n\t *\n\t * @param {BufferGeometry} [geometry] - The points geometry.\n\t * @param {Material|Array} [material] - The points material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPoints = true;\n\n\t\tthis.type = 'Points';\n\n\t\t/**\n\t\t * The points geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default PointsMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this point cloud.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\t\t_sphere.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\tconst a = index.getX( i );\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\ttestPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\ttestPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Points#morphTargetDictionary} and {@link Points#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tfaceIndex: null,\n\t\t\tbarycoord: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * A texture for use with a video.\n *\n * ```js\n * // assuming you have created a HTML video element with id=\"video\"\n * const video = document.getElementById( 'video' );\n * const texture = new THREE.VideoTexture( video );\n * ```\n *\n * Note: When using video textures with {@link WebGPURenderer}, {@link Texture#colorSpace} must be\n * set to THREE.SRGBColorSpace.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments Texture\n */\nclass VideoTexture extends Texture {\n\n\t/**\n\t * Constructs a new video texture.\n\t *\n\t * @param {HTMLVideoElement} video - The video element to use as a data source for the texture.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( video, mapping, wrapS, wrapT, magFilter = LinearFilter, minFilter = LinearFilter, format, type, anisotropy ) {\n\n\t\tsuper( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVideoTexture = true;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * The video frame request callback identifier, which is a positive integer.\n\t\t *\n\t\t * Value of 0 represents no scheduled rVFC.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t */\n\t\tthis._requestVideoFrameCallbackId = 0;\n\n\t\tconst scope = this;\n\n\t\tfunction updateVideo() {\n\n\t\t\tscope.needsUpdate = true;\n\t\t\tscope._requestVideoFrameCallbackId = video.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\t\tthis._requestVideoFrameCallbackId = video.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t}\n\n\t/**\n\t * This method is called automatically by the renderer and sets {@link Texture#needsUpdate}\n\t * to `true` every time a new frame is available.\n\t *\n\t * Only relevant if `requestVideoFrameCallback` is not supported in the browser.\n\t */\n\tupdate() {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this._requestVideoFrameCallbackId !== 0 ) {\n\n\t\t\tthis.source.data.cancelVideoFrameCallback( this._requestVideoFrameCallbackId );\n\n\t\t\tthis._requestVideoFrameCallbackId = 0;\n\n\t\t}\n\n\t\tsuper.dispose();\n\n\t}\n\n}\n\n/**\n * This class can be used as an alternative way to define video data. Instead of using\n * an instance of `HTMLVideoElement` like with `VideoTexture`, `VideoFrameTexture` expects each frame is\n * defined manually via {@link VideoFrameTexture#setFrame}. A typical use case for this module is when\n * video frames are decoded with the WebCodecs API.\n *\n * ```js\n * const texture = new THREE.VideoFrameTexture();\n * texture.setFrame( frame );\n * ```\n *\n * @augments VideoTexture\n */\nclass VideoFrameTexture extends VideoTexture {\n\n\t/**\n\t * Constructs a new video frame texture.\n\t *\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( {}, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVideoFrameTexture = true;\n\n\t}\n\n\t/**\n\t * This method overwritten with an empty implementation since\n\t * this type of texture is updated via `setFrame()`.\n\t */\n\tupdate() {}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this ); // restoring Texture.clone()\n\n\t}\n\n\t/**\n\t * Sets the current frame of the video. This will automatically update the texture\n\t * so the data can be used for rendering.\n\t *\n\t * @param {VideoFrame} frame - The video frame.\n\t */\n\tsetFrame( frame ) {\n\n\t\tthis.image = frame;\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * This class can only be used in combination with `copyFramebufferToTexture()` methods\n * of renderers. It extracts the contents of the current bound framebuffer and provides it\n * as a texture for further usage.\n *\n * ```js\n * const pixelRatio = window.devicePixelRatio;\n * const textureSize = 128 * pixelRatio;\n *\n * const frameTexture = new FramebufferTexture( textureSize, textureSize );\n *\n * // calculate start position for copying part of the frame data\n * const vector = new Vector2();\n * vector.x = ( window.innerWidth * pixelRatio / 2 ) - ( textureSize / 2 );\n * vector.y = ( window.innerHeight * pixelRatio / 2 ) - ( textureSize / 2 );\n *\n * renderer.render( scene, camera );\n *\n * // copy part of the rendered frame into the framebuffer texture\n * renderer.copyFramebufferToTexture( frameTexture, vector );\n * ```\n *\n * @augments Texture\n */\nclass FramebufferTexture extends Texture {\n\n\t/**\n\t * Constructs a new framebuffer texture.\n\t *\n\t * @param {number} [width] - The width of the texture.\n\t * @param {number} [height] - The height of the texture.\n\t */\n\tconstructor( width, height ) {\n\n\t\tsuper( { width, height } );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFramebufferTexture = true;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default to disable filtering.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default to disable filtering.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * Creates a texture based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments Texture\n */\nclass CompressedTexture extends Texture {\n\n\t/**\n\t * Constructs a new compressed texture.\n\t *\n\t * @param {Array} mipmaps - This array holds for all mipmaps (including the bases mip)\n\t * the data and dimensions.\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedTexture = true;\n\n\t\t/**\n\t\t * The image property of a compressed texture just defines its dimensions.\n\t\t *\n\t\t * @type {{width:number,height:number}}\n\t\t */\n\t\tthis.image = { width: width, height: height };\n\n\t\t/**\n\t\t * This array holds for all mipmaps (including the bases mip) the data and dimensions.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.mipmaps = mipmaps;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default since it is not possible to\n\t\t * flip compressed textures.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default since it is not\n\t\t * possible to generate mipmaps for compressed data. Mipmaps\n\t\t * must be embedded in the compressed texture file.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n}\n\n/**\n * Creates a texture 2D array based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments CompressedTexture\n */\nclass CompressedArrayTexture extends CompressedTexture {\n\n\t/**\n\t * Constructs a new compressed array texture.\n\t *\n\t * @param {Array} mipmaps - This array holds for all mipmaps (including the bases mip)\n\t * the data and dimensions.\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} depth - The depth of the texture.\n\t * @param {number} [format=RGBAFormat] - The min filter value.\n\t * @param {number} [type=UnsignedByteType] - The min filter value.\n\t */\n\tconstructor( mipmaps, width, height, depth, format, type ) {\n\n\t\tsuper( mipmaps, width, height, format, type );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedArrayTexture = true;\n\n\t\t/**\n\t\t * The image property of a compressed texture just defines its dimensions.\n\t\t *\n\t\t * @name CompressedArrayTexture#image\n\t\t * @type {{width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image.depth = depth;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t *\n\t\t * @type {Set}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\t/**\n\t * Describes that a specific layer of the texture needs to be updated.\n\t * Normally when {@link Texture#needsUpdate} is set to `true`, the\n\t * entire compressed texture array is sent to the GPU. Marking specific\n\t * layers will only transmit subsets of all mipmaps associated with a\n\t * specific depth in the array which is often much more performant.\n\t *\n\t * @param {number} layerIndex - The layer index that should be updated.\n\t */\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\t/**\n\t * Resets the layer updates registry.\n\t */\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\n/**\n * Creates a cube texture based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments CompressedTexture\n */\nclass CompressedCubeTexture extends CompressedTexture {\n\n\t/**\n\t * Constructs a new compressed texture.\n\t *\n\t * @param {Array} images - An array of compressed textures.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t */\n\tconstructor( images, format, type ) {\n\n\t\tsuper( undefined, images[ 0 ].width, images[ 0 ].height, format, type, CubeReflectionMapping );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedCubeTexture = true;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.image = images;\n\n\t}\n\n}\n\n/**\n * Creates a texture from a canvas element.\n *\n * This is almost the same as the base texture class, except that it sets {@link Texture#needsUpdate}\n * to `true` immediately since a canvas can directly be used for rendering.\n *\n * @augments Texture\n */\nclass CanvasTexture extends Texture {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {HTMLCanvasElement} [canvas] - The HTML canvas element.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCanvasTexture = true;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * This class can be used to automatically save the depth information of a\n * rendering into a texture.\n *\n * @augments Texture\n */\nclass DepthTexture extends Texture {\n\n\t/**\n\t * Constructs a new depth texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} [type=UnsignedIntType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {number} [format=DepthFormat] - The texture format.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( width, height, type = UnsignedIntType, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, format = DepthFormat, depth = 1 ) {\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tconst image = { width: width, height: height, depth: depth };\n\n\t\tsuper( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDepthTexture = true;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * Code corresponding to the depth compare function.\n\t\t *\n\t\t * @type {?(NeverCompare|LessCompare|EqualCompare|LessEqualCompare|GreaterCompare|NotEqualCompare|GreaterEqualCompare|AlwaysCompare)}\n\t\t * @default null\n\t\t */\n\t\tthis.compareFunction = null;\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.source = new Source( Object.assign( {}, source.image ) ); // see #30540\n\t\tthis.compareFunction = source.compareFunction;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.compareFunction !== null ) data.compareFunction = this.compareFunction;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents a texture created externally with the same renderer context.\n *\n * This may be a texture from a protected media stream, device camera feed,\n * or other data feeds like a depth sensor.\n *\n * Note that this class is only supported in {@link WebGLRenderer}, and in\n * the {@link WebGPURenderer} WebGPU backend.\n *\n * @augments Texture\n */\nclass ExternalTexture extends Texture {\n\n\t/**\n\t * Creates a new raw texture.\n\t *\n\t * @param {?(WebGLTexture|GPUTexture)} [sourceTexture=null] - The external texture.\n\t */\n\tconstructor( sourceTexture = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The external source texture.\n\t\t *\n\t\t * @type {?(WebGLTexture|GPUTexture)}\n\t\t * @default null\n\t\t */\n\t\tthis.sourceTexture = sourceTexture;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isExternalTexture = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sourceTexture = source.sourceTexture;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a capsule.\n *\n * ```js\n * const geometry = new THREE.CapsuleGeometry( 1, 1, 4, 8, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const capsule = new THREE.Mesh( geometry, material );\n * scene.add( capsule );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CapsuleGeometry\n */\nclass CapsuleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new capsule geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the capsule.\n\t * @param {number} [height=1] - Height of the middle section.\n\t * @param {number} [capSegments=4] - Number of curve segments used to build each cap.\n\t * @param {number} [radialSegments=8] - Number of segmented faces around the circumference of the capsule. Must be an integer >= 3.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the middle section. Must be an integer >= 1.\n\t */\n\tconstructor( radius = 1, height = 1, capSegments = 4, radialSegments = 8, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t};\n\n\t\theight = Math.max( 0, height );\n\t\tcapSegments = Math.max( 1, Math.floor( capSegments ) );\n\t\tradialSegments = Math.max( 3, Math.floor( radialSegments ) );\n\t\theightSegments = Math.max( 1, Math.floor( heightSegments ) );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst halfHeight = height / 2;\n\t\tconst capArcLength = ( Math.PI / 2 ) * radius;\n\t\tconst cylinderPartLength = height;\n\t\tconst totalArcLength = 2 * capArcLength + cylinderPartLength;\n\n\t\tconst numVerticalSegments = capSegments * 2 + heightSegments;\n\t\tconst verticesPerRow = radialSegments + 1;\n\n\t\tconst normal = new Vector3();\n\t\tconst vertex = new Vector3();\n\n\t\t// generate vertices, normals, and uvs\n\n\t\tfor ( let iy = 0; iy <= numVerticalSegments; iy ++ ) {\n\n\t\t\tlet currentArcLength = 0;\n\t\t\tlet profileY = 0;\n\t\t\tlet profileRadius = 0;\n\t\t\tlet normalYComponent = 0;\n\n\t\t\tif ( iy <= capSegments ) {\n\n\t\t\t\t// bottom cap\n\t\t\t\tconst segmentProgress = iy / capSegments;\n\t\t\t\tconst angle = ( segmentProgress * Math.PI ) / 2;\n\t\t\t\tprofileY = - halfHeight - radius * Math.cos( angle );\n\t\t\t\tprofileRadius = radius * Math.sin( angle );\n\t\t\t\tnormalYComponent = - radius * Math.cos( angle );\n\t\t\t\tcurrentArcLength = segmentProgress * capArcLength;\n\n\t\t\t} else if ( iy <= capSegments + heightSegments ) {\n\n\t\t\t\t// middle section\n\t\t\t\tconst segmentProgress = ( iy - capSegments ) / heightSegments;\n\t\t\t\tprofileY = - halfHeight + segmentProgress * height;\n\t\t\t\tprofileRadius = radius;\n\t\t\t\tnormalYComponent = 0;\n\t\t\t\tcurrentArcLength = capArcLength + segmentProgress * cylinderPartLength;\n\n\t\t\t} else {\n\n\t\t\t\t// top cap\n\t\t\t\tconst segmentProgress =\n\t\t\t\t\t( iy - capSegments - heightSegments ) / capSegments;\n\t\t\t\tconst angle = ( segmentProgress * Math.PI ) / 2;\n\t\t\t\tprofileY = halfHeight + radius * Math.sin( angle );\n\t\t\t\tprofileRadius = radius * Math.cos( angle );\n\t\t\t\tnormalYComponent = radius * Math.sin( angle );\n\t\t\t\tcurrentArcLength =\n\t\t\t\t\tcapArcLength + cylinderPartLength + segmentProgress * capArcLength;\n\n\t\t\t}\n\n\t\t\tconst v = Math.max( 0, Math.min( 1, currentArcLength / totalArcLength ) );\n\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / radialSegments;\n\n\t\t\t} else if ( iy === numVerticalSegments ) {\n\n\t\t\t\tuOffset = -0.5 / radialSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= radialSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / radialSegments;\n\t\t\t\tconst theta = u * Math.PI * 2;\n\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - profileRadius * cosTheta;\n\t\t\t\tvertex.y = profileY;\n\t\t\t\tvertex.z = profileRadius * sinTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set(\n\t\t\t\t\t- profileRadius * cosTheta,\n\t\t\t\t\tnormalYComponent,\n\t\t\t\t\tprofileRadius * sinTheta\n\t\t\t\t);\n\t\t\t\tnormal.normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, v );\n\n\t\t\t}\n\n\t\t\tif ( iy > 0 ) {\n\n\t\t\t\tconst prevIndexRow = ( iy - 1 ) * verticesPerRow;\n\t\t\t\tfor ( let ix = 0; ix < radialSegments; ix ++ ) {\n\n\t\t\t\t\tconst i1 = prevIndexRow + ix;\n\t\t\t\t\tconst i2 = prevIndexRow + ix + 1;\n\t\t\t\t\tconst i3 = iy * verticesPerRow + ix;\n\t\t\t\t\tconst i4 = iy * verticesPerRow + ix + 1;\n\n\t\t\t\t\tindices.push( i1, i2, i3 );\n\t\t\t\t\tindices.push( i2, i4, i3 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CapsuleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.height, data.capSegments, data.radialSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A simple shape of Euclidean geometry. It is constructed from a\n * number of triangular segments that are oriented around a central point and\n * extend as far out as a given radius. It is built counter-clockwise from a\n * start angle and a given central angle. It can also be used to create\n * regular polygons, where the number of segments determines the number of\n * sides.\n *\n * ```js\n * const geometry = new THREE.CircleGeometry( 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const circle = new THREE.Mesh( geometry, material );\n * scene.add( circle )\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CircleGeometry\n */\nclass CircleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new circle geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the circle.\n\t * @param {number} [segments=32] - Number of segments (triangles), minimum = `3`.\n\t * @param {number} [thetaStart=0] - Start angle for first segment in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta,\n\t * of the circular sector in radians. The default value results in a complete circle.\n\t */\n\tconstructor( radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CircleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cylinder.\n *\n * ```js\n * const geometry = new THREE.CylinderGeometry( 5, 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cylinder = new THREE.Mesh( geometry, material );\n * scene.add( cylinder );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CylinderGeometry\n */\nclass CylinderGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new cylinder geometry.\n\t *\n\t * @param {number} [radiusTop=1] - Radius of the cylinder at the top.\n\t * @param {number} [radiusBottom=1] - Radius of the cylinder at the bottom.\n\t * @param {number} [height=1] - Height of the cylinder.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cylinder.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cylinder.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cylinder is open or capped.\n\t * @param {number} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cylinder.\n\t */\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tif ( radiusTop > 0 || y !== 0 ) {\n\n\t\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( radiusBottom > 0 || y !== heightSegments - 1 ) {\n\n\t\t\t\t\t\tindices.push( b, c, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : -1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CylinderGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cone.\n *\n * ```js\n * const geometry = new THREE.ConeGeometry( 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cone = new THREE.Mesh(geometry, material );\n * scene.add( cone );\n * ```\n *\n * @augments CylinderGeometry\n * @demo scenes/geometry-browser.html#ConeGeometry\n */\nclass ConeGeometry extends CylinderGeometry {\n\n\t/**\n\t * Constructs a new cone geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the cone base.\n\t * @param {number} [height=1] - Height of the cone.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cone.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cone.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cone is open or capped.\n\t * @param {number} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cone.\n\t */\n\tconstructor( radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {ConeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A polyhedron is a solid in three dimensions with flat faces. This class\n * will take an array of vertices, project them onto a sphere, and then\n * divide them up to the desired level of detail.\n *\n * @augments BufferGeometry\n */\nclass PolyhedronGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new polyhedron geometry.\n\t *\n\t * @param {Array} [vertices] - A flat array of vertices describing the base shape.\n\t * @param {Array} [indices] - A flat array of indices describing the base shape.\n\t * @param {number} [radius=1] - The radius of the shape.\n\t * @param {number} [detail=0] - How many levels to subdivide the geometry. The more detail, the smoother the shape.\n\t */\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivision with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PolyhedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a dodecahedron.\n *\n * ```js\n * const geometry = new THREE.DodecahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const dodecahedron = new THREE.Mesh( geometry, material );\n * scene.add( dodecahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#DodecahedronGeometry\n */\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new dodecahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the dodecahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a dodecahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t-1, -1, -1,\t-1, -1, 1,\n\t\t\t-1, 1, -1, -1, 1, 1,\n\t\t\t1, -1, -1, 1, -1, 1,\n\t\t\t1, 1, -1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {DodecahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1$1 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\nconst _triangle = /*@__PURE__*/ new Triangle();\n\n/**\n * Can be used as a helper object to view the edges of a geometry.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry();\n * const edges = new THREE.EdgesGeometry( geometry );\n * const line = new THREE.LineSegments( edges );\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass EdgesGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new edges geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t * @param {number} [thresholdAngle=1] - An edge is only rendered if the angle (in degrees)\n\t * between the face normals of the adjoining faces exceeds this value.\n\t */\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1$1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0.x, _v0.y, _v0.z );\n\t\t\t\t\tvertices.push( _v1$1.x, _v1$1.y, _v1$1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An abstract base class for creating an analytic curve object that contains methods\n * for interpolation.\n *\n * @abstract\n */\nclass Curve {\n\n\t/**\n\t * Constructs a new curve.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Curve';\n\n\t\t/**\n\t\t * This value determines the amount of divisions when calculating the\n\t\t * cumulative segment lengths of a curve via {@link Curve#getLengths}. To ensure\n\t\t * precision when using methods like {@link Curve#getSpacedPoints}, it is\n\t\t * recommended to increase the value of this property if the curve is very large.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 200\n\t\t */\n\t\tthis.arcLengthDivisions = 200;\n\n\t\t/**\n\t\t * Must be set to `true` if the curve parameters have changed.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\t/**\n\t\t * An internal cache that holds precomputed curve length values.\n\t\t *\n\t\t * @private\n\t\t * @type {?Array}\n\t\t * @default null\n\t\t */\n\t\tthis.cacheArcLengths = null;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor.\n\t *\n\t * @abstract\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( /* t, optionalTarget */ ) {\n\n\t\twarn( 'Curve: .getPoint() not implemented.' );\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor. Unlike {@link Curve#getPoint}, this method honors the length\n\t * of the curve which equidistant samples.\n\t *\n\t * @param {number} u - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPointAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPoint} and returns an array of points representing\n\t * the curve shape.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get sequence of points using getPointAt( u )\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPointAt} and returns an array of points representing\n\t * the curve shape. Unlike {@link Curve#getPoints}, this method returns equi-spaced points across the entire\n\t * curve.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetSpacedPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t/**\n\t * Returns the total arc length of the curve.\n\t *\n\t * @return {number} The length of the curve.\n\t */\n\tgetLength() {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t}\n\n\t/**\n\t * Returns an array of cumulative segment lengths of the curve.\n\t *\n\t * @param {number} [divisions=this.arcLengthDivisions] - The number of divisions.\n\t * @return {Array} An array holding the cumulative segment lengths.\n\t */\n\tgetLengths( divisions = this.arcLengthDivisions ) {\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t}\n\n\t/**\n\t * Update the cumulative segment distance cache. The method must be called\n\t * every time curve parameters are changed. If an updated curve is part of a\n\t * composed curve like {@link CurvePath}, this method must be called on the\n\t * composed curve, too.\n\t */\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t}\n\n\t/**\n\t * Given an interpolation factor in the range `[0,1]`, this method returns an updated\n\t * interpolation factor in the same range that can be ued to sample equidistant points\n\t * from a curve.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {?number} distance - An optional distance on the curve.\n\t * @return {number} The updated interpolation factor.\n\t */\n\tgetUtoTmapping( u, distance = null ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns a unit vector tangent for the given interpolation factor.\n\t * If the derived curve does not implement its tangent derivation,\n\t * two points a small delta apart will be used to find its gradient\n\t * which seems to give a reasonable approximation.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t */\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\t/**\n\t * Same as {@link Curve#getTangent} but with equidistant samples.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t * @see {@link Curve#getPointAt}\n\t */\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * Generates the Frenet Frames. Requires a curve definition in 3D space. Used\n\t * in geometries like {@link TubeGeometry} or {@link ExtrudeGeometry}.\n\t *\n\t * @param {number} segments - The number of segments.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @return {{tangents: Array, normals: Array, binormals: Array}} The Frenet Frames.\n\t */\n\tcomputeFrenetFrames( segments, closed = false ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), -1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), -1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a new curve with copied values from this instance.\n\t *\n\t * @return {Curve} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given curve to this instance.\n\t *\n\t * @param {Curve} source - The curve to copy.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the curve into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized curve.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Deserializes the curve from the given JSON.\n\t *\n\t * @param {Object} json - The JSON holding the serialized curve.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an ellipse.\n *\n * ```js\n * const curve = new THREE.EllipseCurve(\n * \t0, 0,\n * \t10, 10,\n * \t0, 2 * Math.PI,\n * \tfalse,\n * \t0\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const ellipse = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass EllipseCurve extends Curve {\n\n\t/**\n\t * Constructs a new ellipse curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t */\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEllipseCurve = true;\n\n\t\tthis.type = 'EllipseCurve';\n\n\t\t/**\n\t\t * The X center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aX = aX;\n\n\t\t/**\n\t\t * The Y center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aY = aY;\n\n\t\t/**\n\t\t * The radius of the ellipse in the x direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#yRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.xRadius = xRadius;\n\n\t\t/**\n\t\t * The radius of the ellipse in the y direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#xRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.yRadius = yRadius;\n\n\t\t/**\n\t\t * The start angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aStartAngle = aStartAngle;\n\n\t\t/**\n\t\t * The end angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI*2\n\t\t */\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\t/**\n\t\t * Whether the ellipse is drawn clockwise or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.aClockwise = aClockwise;\n\n\t\t/**\n\t\t * The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aRotation = aRotation;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an arc.\n *\n * @augments EllipseCurve\n */\nclass ArcCurve extends EllipseCurve {\n\n\t/**\n\t * Constructs a new arc curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [aRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t */\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArcCurve = true;\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\nfunction CubicPoly() {\n\n\t/**\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t* cusps and self-intersections in non-uniform catmull rom curves.\n\t* http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t*\n\t* curve.type accepts centripetal(default), chordal and catmullrom\n\t* curve.tension is used for catmullrom which defaults to 0.5\n\t*/\n\n\t/*\n\tBased on an optimized c++ solution in\n\t- http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t- http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t * p(0) = x0, p(1) = x1\n\t * and\n\t * p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = -3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = /*@__PURE__*/ new Vector3();\nconst px = /*@__PURE__*/ new CubicPoly();\nconst py = /*@__PURE__*/ new CubicPoly();\nconst pz = /*@__PURE__*/ new CubicPoly();\n\n/**\n * A curve representing a Catmull-Rom spline.\n *\n * ```js\n * //Create a closed wavey loop\n * const curve = new THREE.CatmullRomCurve3( [\n * \tnew THREE.Vector3( -10, 0, 10 ),\n * \tnew THREE.Vector3( -5, 5, 5 ),\n * \tnew THREE.Vector3( 0, 0, 0 ),\n * \tnew THREE.Vector3( 5, -5, 5 ),\n * \tnew THREE.Vector3( 10, 0, 10 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CatmullRomCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Catmull-Rom curve.\n\t *\n\t * @param {Array} [points] - An array of 3D points defining the curve.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @param {('centripetal'|'chordal'|'catmullrom')} [curveType='centripetal'] - The curve type.\n\t * @param {number} [tension=0.5] - Tension of the curve.\n\t */\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCatmullRomCurve3 = true;\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\t/**\n\t\t * An array of 3D points defining the curve.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.points = points;\n\n\t\t/**\n\t\t * Whether the curve is closed or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.closed = closed;\n\n\t\t/**\n\t\t * The curve type.\n\t\t *\n\t\t * @type {('centripetal'|'chordal'|'catmullrom')}\n\t\t * @default 'centripetal'\n\t\t */\n\t\tthis.curveType = curveType;\n\n\t\t/**\n\t\t * Tension of the curve.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.tension = tension;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Interpolations contains spline and Bézier functions internally used by concrete curve classes.\n *\n * Bezier Curves formulas obtained from: https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n *\n * @module Interpolations\n */\n\n/**\n * Computes a point on a Catmull-Rom spline.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Catmull-Rom spline.\n */\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( -3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\n/**\n * Computes a point on a Quadratic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @return {number} The calculated point on a Quadratic Bezier curve.\n */\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\n/**\n * Computes a point on a Cubic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Cubic Bezier curve.\n */\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\n/**\n * A curve representing a 2D Cubic Bezier curve.\n *\n * ```js\n * const curve = new THREE.CubicBezierCurve(\n * \tnew THREE.Vector2( - 0, 0 ),\n * \tnew THREE.Vector2( - 5, 15 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CubicBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The first control point.\n\t * @param {Vector2} [v2] - The second control point.\n\t * @param {Vector2} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve = true;\n\n\t\tthis.type = 'CubicBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Cubic Bezier curve.\n *\n * @augments Curve\n */\nclass CubicBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The first control point.\n\t * @param {Vector3} [v2] - The second control point.\n\t * @param {Vector3} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve3 = true;\n\n\t\tthis.type = 'CubicBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D line segment.\n *\n * @augments Curve\n */\nclass LineCurve extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector2} [v1] - The start point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve = true;\n\n\t\tthis.type = 'LineCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector2() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D line segment.\n *\n * @augments Curve\n */\nclass LineCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector3} [v1] - The start point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.type = 'LineCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D Quadratic Bezier curve.\n *\n * ```js\n * const curve = new THREE.QuadraticBezierCurve(\n * \tnew THREE.Vector2( - 10, 0 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * )\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The control point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve = true;\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Quadratic Bezier curve.\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The control point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve3 = true;\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D spline curve.\n *\n * ```js\n * // Create a sine-like wave\n * const curve = new THREE.SplineCurve( [\n * \tnew THREE.Vector2( -10, 0 ),\n * \tnew THREE.Vector2( -5, 5 ),\n * \tnew THREE.Vector2( 0, 0 ),\n * \tnew THREE.Vector2( 5, -5 ),\n * \tnew THREE.Vector2( 10, 0 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const splineObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass SplineCurve extends Curve {\n\n\t/**\n\t * Constructs a new 2D spline curve.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the curve.\n\t */\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSplineCurve = true;\n\n\t\tthis.type = 'SplineCurve';\n\n\t\t/**\n\t\t * An array of 2D points defining the curve.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.points = points;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**\n * A base class extending {@link Curve}. `CurvePath` is simply an\n * array of connected curves, but retains the API of a curve.\n *\n * @augments Curve\n */\nclass CurvePath extends Curve {\n\n\t/**\n\t * Constructs a new curve path.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\t/**\n\t\t * An array of curves defining the\n\t\t * path.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.curves = [];\n\n\t\t/**\n\t\t * Whether the path should automatically be closed\n\t\t * by a line curve.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoClose = false;\n\n\t}\n\n\t/**\n\t * Adds a curve to this curve path.\n\t *\n\t * @param {Curve} curve - The curve to add.\n\t */\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\t/**\n\t * Adds a line curve to close the path.\n\t *\n\t * @return {CurvePath} A reference to this curve path.\n\t */\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tconst lineType = ( startPoint.isVector2 === true ) ? 'LineCurve' : 'LineCurve3';\n\t\t\tthis.curves.push( new Curves[ lineType ]( endPoint, startPoint ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definitions)\n\t * for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {?(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( t, optionalTarget ) {\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 } The curve lengths.\n\t */\n\tgetCurveLengths() {\n\n\t\t// Compute lengths and cache them\n\t\t// We cannot overwrite getLengths() because UtoT mapping uses it.\n\t\t// We use cache values if curves and cache array are same length\n\n\t\tif ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {\n\n\t\t\treturn this.cacheLengths;\n\n\t\t}\n\n\t\t// Get length of sub-curve\n\t\t// Push sums into cached array\n\n\t\tconst lengths = [];\n\t\tlet sums = 0;\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tsums += this.curves[ i ].getLength();\n\t\t\tlengths.push( sums );\n\n\t\t}\n\n\t\tthis.cacheLengths = lengths;\n\n\t\treturn lengths;\n\n\t}\n\n\tgetSpacedPoints( divisions = 40 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let i = 0; i <= divisions; i ++ ) {\n\n\t\t\tpoints.push( this.getPoint( i / divisions ) );\n\n\t\t}\n\n\t\tif ( this.autoClose ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tgetPoints( divisions = 12 ) {\n\n\t\tconst points = [];\n\t\tlet last;\n\n\t\tfor ( let i = 0, curves = this.curves; i < curves.length; i ++ ) {\n\n\t\t\tconst curve = curves[ i ];\n\t\t\tconst resolution = curve.isEllipseCurve ? divisions * 2\n\t\t\t\t: ( curve.isLineCurve || curve.isLineCurve3 ) ? 1\n\t\t\t\t\t: curve.isSplineCurve ? divisions * curve.points.length\n\t\t\t\t\t\t: divisions;\n\n\t\t\tconst pts = curve.getPoints( resolution );\n\n\t\t\tfor ( let j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\tconst point = pts[ j ];\n\n\t\t\t\tif ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates\n\n\t\t\t\tpoints.push( point );\n\t\t\t\tlast = point;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A 2D path representation. The class provides methods for creating paths\n * and contours of 2D shapes similar to the 2D Canvas API.\n *\n * ```js\n * const path = new THREE.Path();\n *\n * path.lineTo( 0, 0.8 );\n * path.quadraticCurveTo( 0, 1, 0.2, 1 );\n * path.lineTo( 1, 1 );\n *\n * const points = path.getPoints();\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments CurvePath\n */\nclass Path extends CurvePath {\n\n\t/**\n\t * Constructs a new path.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the path.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Path';\n\n\t\t/**\n\t\t * The current offset of the path. Any new curve added will start here.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a path from the given list of points. The points are added\n\t * to the path as instances of {@link LineCurve}.\n\t *\n\t * @param {Array} points - An array of 2D points.\n\t * @return {Path} A reference to this path.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Moves {@link Path#currentPoint} to the given point.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {Path} A reference to this path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array} pts - An array of points in 2D space.\n\t * @return {Path} A reference to this path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an arc as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} [aY=0] - The y coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} [aRadius=1] - The radius of the arc.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned arc as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the arc.\n\t * @param {number} [aY=0] - The y coordinate of the center of the arc.\n\t * @param {number} [aRadius=1] - The radius of the arc.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an ellipse as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} [aY=0] - The y coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x axis.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y axis.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned ellipse as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the absolute center of the ellipse.\n\t * @param {number} [aY=0] - The y coordinate of the absolute center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x axis.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y axis.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Defines an arbitrary 2d shape plane using paths with optional holes. It\n * can be used with {@link ExtrudeGeometry}, {@link ShapeGeometry}, to get\n * points, or to get triangulated faces.\n *\n * ```js\n * const heartShape = new THREE.Shape();\n *\n * heartShape.moveTo( 25, 25 );\n * heartShape.bezierCurveTo( 25, 25, 20, 0, 0, 0 );\n * heartShape.bezierCurveTo( - 30, 0, - 30, 35, - 30, 35 );\n * heartShape.bezierCurveTo( - 30, 55, - 10, 77, 25, 95 );\n * heartShape.bezierCurveTo( 60, 77, 80, 55, 80, 35 );\n * heartShape.bezierCurveTo( 80, 35, 80, 0, 50, 0 );\n * heartShape.bezierCurveTo( 35, 0, 25, 25, 25, 25 );\n *\n * const extrudeSettings = {\n * \tdepth: 8,\n * \tbevelEnabled: true,\n * \tbevelSegments: 2,\n * \tsteps: 2,\n * \tbevelSize: 1,\n * \tbevelThickness: 1\n * };\n *\n * const geometry = new THREE.ExtrudeGeometry( heartShape, extrudeSettings );\n * const mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial() );\n * ```\n *\n * @augments Path\n */\nclass Shape extends Path {\n\n\t/**\n\t * Constructs a new shape.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the shape.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\t/**\n\t\t * The UUID of the shape.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\t/**\n\t\t * Defines the holes in the shape. Hole definitions must use the\n\t\t * opposite winding order (CW/CCW) than the outer shape.\n\t\t *\n\t\t * @type {Array}\n\t\t * @readonly\n\t\t */\n\t\tthis.holes = [];\n\n\t}\n\n\t/**\n\t * Returns an array representing each contour of the holes\n\t * as a list of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {Array>} The holes as a series of 2D points.\n\t */\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t}\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\t/**\n\t * Returns an object that holds contour data for the shape and its holes as\n\t * arrays of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {{shape:Array,holes:Array>}} An object with contour data.\n\t */\n\textractPoints( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* eslint-disable */\n// copy of mapbox/earcut version 3.0.2\n// https://github.com/mapbox/earcut/tree/v3.0.2\n\nfunction earcut(data, holeIndices, dim = 2) {\n\n const hasHoles = holeIndices && holeIndices.length;\n const outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n let outerNode = linkedList(data, 0, outerLen, dim, true);\n const triangles = [];\n\n if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n let minX, minY, invSize;\n\n if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n if (data.length > 80 * dim) {\n minX = data[0];\n minY = data[1];\n let maxX = minX;\n let maxY = minY;\n\n for (let i = dim; i < outerLen; i += dim) {\n const x = data[i];\n const y = data[i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n\n // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n invSize = Math.max(maxX - minX, maxY - minY);\n invSize = invSize !== 0 ? 32767 / invSize : 0;\n }\n\n earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);\n\n return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n let last;\n\n if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n for (let i = start; i < end; i += dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n } else {\n for (let i = end - dim; i >= start; i -= dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n }\n\n if (last && equals(last, last.next)) {\n removeNode(last);\n last = last.next;\n }\n\n return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n if (!start) return start;\n if (!end) end = start;\n\n let p = start,\n again;\n do {\n again = false;\n\n if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n removeNode(p);\n p = end = p.prev;\n if (p === p.next) break;\n again = true;\n\n } else {\n p = p.next;\n }\n } while (again || p !== end);\n\n return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n if (!ear) return;\n\n // interlink polygon nodes in z-order\n if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n let stop = ear;\n\n // iterate through ears, slicing them one by one\n while (ear.prev !== ear.next) {\n const prev = ear.prev;\n const next = ear.next;\n\n if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n triangles.push(prev.i, ear.i, next.i); // cut off the triangle\n\n removeNode(ear);\n\n // skipping the next vertex leads to less sliver triangles\n ear = next.next;\n stop = next.next;\n\n continue;\n }\n\n ear = next;\n\n // if we looped through the whole remaining polygon and can't find any more ears\n if (ear === stop) {\n // try filtering points and slicing again\n if (!pass) {\n earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n // if this didn't work, try curing all small self-intersections locally\n } else if (pass === 1) {\n ear = cureLocalIntersections(filterPoints(ear), triangles);\n earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n // as a last resort, try splitting the remaining polygon into two\n } else if (pass === 2) {\n splitEarcut(ear, triangles, dim, minX, minY, invSize);\n }\n\n break;\n }\n }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n const a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // now make sure we don't have other points inside the potential ear\n const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n // triangle bbox\n const x0 = Math.min(ax, bx, cx),\n y0 = Math.min(ay, by, cy),\n x1 = Math.max(ax, bx, cx),\n y1 = Math.max(ay, by, cy);\n\n let p = c.next;\n while (p !== a) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.next;\n }\n\n return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n const a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n // triangle bbox\n const x0 = Math.min(ax, bx, cx),\n y0 = Math.min(ay, by, cy),\n x1 = Math.max(ax, bx, cx),\n y1 = Math.max(ay, by, cy);\n\n // z-order range for the current triangle bbox;\n const minZ = zOrder(x0, y0, minX, minY, invSize),\n maxZ = zOrder(x1, y1, minX, minY, invSize);\n\n let p = ear.prevZ,\n n = ear.nextZ;\n\n // look for points inside the triangle in both directions\n while (p && p.z >= minZ && n && n.z <= maxZ) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n\n if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n\n // look for remaining points in decreasing z-order\n while (p && p.z >= minZ) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n }\n\n // look for remaining points in increasing z-order\n while (n && n.z <= maxZ) {\n if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n\n return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles) {\n let p = start;\n do {\n const a = p.prev,\n b = p.next.next;\n\n if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n triangles.push(a.i, p.i, b.i);\n\n // remove two nodes involved\n removeNode(p);\n removeNode(p.next);\n\n p = start = b;\n }\n p = p.next;\n } while (p !== start);\n\n return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n // look for a valid diagonal that divides the polygon into two\n let a = start;\n do {\n let b = a.next.next;\n while (b !== a.prev) {\n if (a.i !== b.i && isValidDiagonal(a, b)) {\n // split the polygon in two by the diagonal\n let c = splitPolygon(a, b);\n\n // filter colinear points around the cuts\n a = filterPoints(a, a.next);\n c = filterPoints(c, c.next);\n\n // run earcut on each half\n earcutLinked(a, triangles, dim, minX, minY, invSize, 0);\n earcutLinked(c, triangles, dim, minX, minY, invSize, 0);\n return;\n }\n b = b.next;\n }\n a = a.next;\n } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n const queue = [];\n\n for (let i = 0, len = holeIndices.length; i < len; i++) {\n const start = holeIndices[i] * dim;\n const end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n const list = linkedList(data, start, end, dim, false);\n if (list === list.next) list.steiner = true;\n queue.push(getLeftmost(list));\n }\n\n queue.sort(compareXYSlope);\n\n // process holes from left to right\n for (let i = 0; i < queue.length; i++) {\n outerNode = eliminateHole(queue[i], outerNode);\n }\n\n return outerNode;\n}\n\nfunction compareXYSlope(a, b) {\n let result = a.x - b.x;\n // when the left-most point of 2 holes meet at a vertex, sort the holes counterclockwise so that when we find\n // the bridge to the outer shell is always the point that they meet at.\n if (result === 0) {\n result = a.y - b.y;\n if (result === 0) {\n const aSlope = (a.next.y - a.y) / (a.next.x - a.x);\n const bSlope = (b.next.y - b.y) / (b.next.x - b.x);\n result = aSlope - bSlope;\n }\n }\n return result;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole(hole, outerNode) {\n const bridge = findHoleBridge(hole, outerNode);\n if (!bridge) {\n return outerNode;\n }\n\n const bridgeReverse = splitPolygon(bridge, hole);\n\n // filter collinear points around the cuts\n filterPoints(bridgeReverse, bridgeReverse.next);\n return filterPoints(bridge, bridge.next);\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n let p = outerNode;\n const hx = hole.x;\n const hy = hole.y;\n let qx = -Infinity;\n let m;\n\n // find a segment intersected by a ray from the hole's leftmost point to the left;\n // segment's endpoint with lesser x will be potential connection point\n // unless they intersect at a vertex, then choose the vertex\n if (equals(hole, p)) return p;\n do {\n if (equals(hole, p.next)) return p.next;\n else if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n if (x <= hx && x > qx) {\n qx = x;\n m = p.x < p.next.x ? p : p.next;\n if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint\n }\n }\n p = p.next;\n } while (p !== outerNode);\n\n if (!m) return null;\n\n // look for points inside the triangle of hole point, segment intersection and endpoint;\n // if there are no points found, we have a valid connection;\n // otherwise choose the point of the minimum angle with the ray as connection point\n\n const stop = m;\n const mx = m.x;\n const my = m.y;\n let tanMin = Infinity;\n\n p = m;\n\n do {\n if (hx >= p.x && p.x >= mx && hx !== p.x &&\n pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n const tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n if (locallyInside(p, hole) &&\n (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n m = p;\n tanMin = tan;\n }\n }\n\n p = p.next;\n } while (p !== stop);\n\n return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n let p = start;\n do {\n if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n p.prevZ = p.prev;\n p.nextZ = p.next;\n p = p.next;\n } while (p !== start);\n\n p.prevZ.nextZ = null;\n p.prevZ = null;\n\n sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n let numMerges;\n let inSize = 1;\n\n do {\n let p = list;\n let e;\n list = null;\n let tail = null;\n numMerges = 0;\n\n while (p) {\n numMerges++;\n let q = p;\n let pSize = 0;\n for (let i = 0; i < inSize; i++) {\n pSize++;\n q = q.nextZ;\n if (!q) break;\n }\n let qSize = inSize;\n\n while (pSize > 0 || (qSize > 0 && q)) {\n\n if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else {\n e = q;\n q = q.nextZ;\n qSize--;\n }\n\n if (tail) tail.nextZ = e;\n else list = e;\n\n e.prevZ = tail;\n tail = e;\n }\n\n p = q;\n }\n\n tail.nextZ = null;\n inSize *= 2;\n\n } while (numMerges > 1);\n\n return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n // coords are transformed into non-negative 15-bit integer range\n x = (x - minX) * invSize | 0;\n y = (y - minY) * invSize | 0;\n\n x = (x | (x << 8)) & 0x00FF00FF;\n x = (x | (x << 4)) & 0x0F0F0F0F;\n x = (x | (x << 2)) & 0x33333333;\n x = (x | (x << 1)) & 0x55555555;\n\n y = (y | (y << 8)) & 0x00FF00FF;\n y = (y | (y << 4)) & 0x0F0F0F0F;\n y = (y | (y << 2)) & 0x33333333;\n y = (y | (y << 1)) & 0x55555555;\n\n return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n let p = start,\n leftmost = start;\n do {\n if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n p = p.next;\n } while (p !== start);\n\n return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n return (cx - px) * (ay - py) >= (ax - px) * (cy - py) &&\n (ax - px) * (by - py) >= (bx - px) * (ay - py) &&\n (bx - px) * (cy - py) >= (cx - px) * (by - py);\n}\n\n// check if a point lies within a convex triangle but false if its equal to the first point of the triangle\nfunction pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, px, py) {\n return !(ax === px && ay === py) && pointInTriangle(ax, ay, bx, by, cx, cy, px, py);\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // doesn't intersect other edges\n (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n const o1 = sign(area(p1, q1, p2));\n const o2 = sign(area(p1, q1, q2));\n const o3 = sign(area(p2, q2, p1));\n const o4 = sign(area(p2, q2, q1));\n\n if (o1 !== o2 && o3 !== o4) return true; // general case\n\n if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n let p = a;\n do {\n if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n intersects(p, p.next, a, b)) return true;\n p = p.next;\n } while (p !== a);\n\n return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n return area(a.prev, a, a.next) < 0 ?\n area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n let p = a;\n let inside = false;\n const px = (a.x + b.x) / 2;\n const py = (a.y + b.y) / 2;\n do {\n if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n inside = !inside;\n p = p.next;\n } while (p !== a);\n\n return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n const a2 = createNode(a.i, a.x, a.y),\n b2 = createNode(b.i, b.x, b.y),\n an = a.next,\n bp = b.prev;\n\n a.next = b;\n b.prev = a;\n\n a2.next = an;\n an.prev = a2;\n\n b2.next = a2;\n a2.prev = b2;\n\n bp.next = b2;\n b2.prev = bp;\n\n return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n const p = createNode(i, x, y);\n\n if (!last) {\n p.prev = p;\n p.next = p;\n\n } else {\n p.next = last.next;\n p.prev = last;\n last.next.prev = p;\n last.next = p;\n }\n return p;\n}\n\nfunction removeNode(p) {\n p.next.prev = p.prev;\n p.prev.next = p.next;\n\n if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction createNode(i, x, y) {\n return {\n i, // vertex index in coordinates array\n x, y, // vertex coordinates\n prev: null, // previous and next vertex nodes in a polygon ring\n next: null,\n z: 0, // z-order curve value\n prevZ: null, // previous and next nodes in z-order\n nextZ: null,\n steiner: false // indicates whether this is a steiner point\n };\n}\n\nfunction signedArea(data, start, end, dim) {\n let sum = 0;\n for (let i = start, j = end - dim; i < end; i += dim) {\n sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n j = i;\n }\n return sum;\n}\n\n/**\n * An implementation of the earcut polygon triangulation algorithm.\n * The code is a port of [mapbox/earcut](https://github.com/mapbox/earcut).\n *\n * @see https://github.com/mapbox/earcut\n */\nclass Earcut {\n\n\t/**\n\t * Triangulates the given shape definition by returning an array of triangles.\n\t *\n\t * @param {Array} data - An array with 2D points.\n\t * @param {Array} holeIndices - An array with indices defining holes.\n\t * @param {number} [dim=2] - The number of coordinates per vertex in the input array.\n\t * @return {Array} An array representing the triangulated faces. Each face is defined by three consecutive numbers\n\t * representing vertex indices.\n\t */\n\tstatic triangulate( data, holeIndices, dim = 2 ) {\n\n\t\treturn earcut( data, holeIndices, dim );\n\n\t}\n\n}\n\n/**\n * A class containing utility functions for shapes.\n *\n * @hideconstructor\n */\nclass ShapeUtils {\n\n\t/**\n\t * Calculate area of a ( 2D ) contour polygon.\n\t *\n\t * @param {Array} contour - An array of 2D points.\n\t * @return {number} The area.\n\t */\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given contour uses a clockwise winding order.\n\t *\n\t * @param {Array} pts - An array of 2D points defining a polygon.\n\t * @return {boolean} Whether the given contour uses a clockwise winding order or not.\n\t */\n\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\t/**\n\t * Triangulates the given shape definition.\n\t *\n\t * @param {Array} contour - An array of 2D points defining the contour.\n\t * @param {Array>} holes - An array that holds arrays of 2D points defining the holes.\n\t * @return {Array>} An array that holds for each face definition an array with three indices.\n\t */\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n}\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * ```js\n * const length = 12, width = 8;\n *\n * const shape = new THREE.Shape();\n * shape.moveTo( 0,0 );\n * shape.lineTo( 0, width );\n * shape.lineTo( length, width );\n * shape.lineTo( length, 0 );\n * shape.lineTo( 0, 0 );\n *\n * const geometry = new THREE.ExtrudeGeometry( shape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#ExtrudeGeometry\n */\nclass ExtrudeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new extrude geometry.\n\t *\n\t * @param {Shape|Array} [shapes] - A shape or an array of shapes.\n\t * @param {ExtrudeGeometry~Options} [options] - The extrude settings.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( -0.5, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tconst depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t\t// log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/**Merges index-adjacent points that are within a threshold distance of each other. Array is modified in-place. Threshold distance is empirical, and scaled based on the magnitude of point coordinates.\n\t\t\t * @param {Array} points\n\t\t\t*/\n\t\t\tfunction mergeOverlappingPoints( points ) {\n\n\t\t\t\tconst THRESHOLD = 1e-10;\n\t\t\t\tconst THRESHOLD_SQ = THRESHOLD * THRESHOLD;\n\t\t\t\tlet prevPos = points[ 0 ];\n\t\t\t\tfor ( let i = 1; i <= points.length; i ++ ) {\n\n\t\t\t\t\tconst currentIndex = i % points.length;\n\t\t\t\t\tconst currentPos = points[ currentIndex ];\n\t\t\t\t\tconst dx = currentPos.x - prevPos.x;\n\t\t\t\t\tconst dy = currentPos.y - prevPos.y;\n\t\t\t\t\tconst distSq = dx * dx + dy * dy;\n\n\t\t\t\t\tconst scalingFactorSqrt = Math.max(\n\t\t\t\t\t\tMath.abs( currentPos.x ),\n\t\t\t\t\t\tMath.abs( currentPos.y ),\n\t\t\t\t\t\tMath.abs( prevPos.x ),\n\t\t\t\t\t\tMath.abs( prevPos.y )\n\t\t\t\t\t);\n\t\t\t\t\tconst thresholdSqScaled = THRESHOLD_SQ * scalingFactorSqrt * scalingFactorSqrt;\n\t\t\t\t\tif ( distSq <= thresholdSqScaled ) {\n\n\t\t\t\t\t\tpoints.splice( currentIndex, 1 );\n\t\t\t\t\t\ti --;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tprevPos = currentPos;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmergeOverlappingPoints( vertices );\n\t\t\tholes.forEach( mergeOverlappingPoints );\n\n\t\t\tconst numHoles = holes.length;\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0; h < numHoles; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) error( 'ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn pt.clone().addScaledVector( vec, size );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t// but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t// log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = numHoles; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\t\t\tlet faces;\n\n\t\t\tif ( bevelSegments === 0 ) {\n\n\t\t\t\tfaces = ShapeUtils.triangulateShape( contour, holes );\n\n\t\t\t} else {\n\n\t\t\t\tconst contractedContourVertices = [];\n\t\t\t\tconst expandedHoleVertices = [];\n\n\t\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t\t// contract shape\n\n\t\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\t\t\t\t\t\tif ( t === 0 ) contractedContourVertices.push( vert );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// expand holes\n\n\t\t\t\t\tfor ( let h = 0, hl = numHoles; h < hl; h ++ ) {\n\n\t\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\t\t\t\t\t\tconst oneHoleVertices = [];\n\t\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\t\t\t\t\t\t\tif ( t === 0 ) oneHoleVertices.push( vert );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( t === 0 ) expandedHoleVertices.push( oneHoleVertices );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfaces = ShapeUtils.triangulateShape( contractedContourVertices, expandedHoleVertices );\n\n\t\t\t}\n\n\t\t\tconst flen = faces.length;\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t///// Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array} shapes - An array of shapes.\n\t * @return {ExtrudeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tdata.options = Object.assign( {}, options );\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\n/**\n * A geometry class for representing an icosahedron.\n *\n * ```js\n * const geometry = new THREE.IcosahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const icosahedron = new THREE.Mesh( geometry, material );\n * scene.add( icosahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#IcosahedronGeometry\n */\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new icosahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the icosahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a icosahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t-1, t, 0, \t1, t, 0, \t-1, - t, 0, \t1, - t, 0,\n\t\t\t0, -1, t, \t0, 1, t,\t0, -1, - t, \t0, 1, - t,\n\t\t\tt, 0, -1, \tt, 0, 1, \t- t, 0, -1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {IcosahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * Creates meshes with axial symmetry like vases. The lathe rotates around the Y axis.\n *\n * ```js\n * const points = [];\n * for ( let i = 0; i < 10; i ++ ) {\n * \tpoints.push( new THREE.Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );\n * }\n * const geometry = new THREE.LatheGeometry( points );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const lathe = new THREE.Mesh( geometry, material );\n * scene.add( lathe );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#LatheGeometry\n */\nclass LatheGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new lathe geometry.\n\t *\n\t * @param {Array} [points] - An array of points in 2D space. The x-coordinate of each point\n\t * must be greater than zero.\n\t * @param {number} [segments=12] - The number of circumference segments to generate.\n\t * @param {number} [phiStart=0] - The starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The radian (0 to 2PI) range of the lathed section 2PI is a\n\t * closed lathe, less than 2PI is a portion.\n\t */\n\tconstructor( points = [ new Vector2( 0, -0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {LatheGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an octahedron.\n *\n * ```js\n * const geometry = new THREE.OctahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const octahedron = new THREE.Mesh( geometry, material );\n * scene.add( octahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#OctahedronGeometry\n */\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new octahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the octahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a octahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t-1, 0, 0,\t0, 1, 0,\n\t\t\t0, -1, 0, \t0, 0, 1,\t0, 0, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {OctahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a plane.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const plane = new THREE.Mesh( geometry, material );\n * scene.add( plane );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#PlaneGeometry\n */\nclass PlaneGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new plane geometry.\n\t *\n\t * @param {number} [width=1] - The width along the X axis.\n\t * @param {number} [height=1] - The height along the Y axis\n\t * @param {number} [widthSegments=1] - The number of segments along the X axis.\n\t * @param {number} [heightSegments=1] - The number of segments along the Y axis.\n\t */\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PlaneGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A class for generating a two-dimensional ring geometry.\n *\n * ```js\n * const geometry = new THREE.RingGeometry( 1, 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#RingGeometry\n */\nclass RingGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new ring geometry.\n\t *\n\t * @param {number} [innerRadius=0.5] - The inner radius of the ring.\n\t * @param {number} [outerRadius=1] - The outer radius of the ring.\n\t * @param {number} [thetaSegments=32] - Number of segments. A higher number means the ring will be more round. Minimum is `3`.\n\t * @param {number} [phiSegments=1] - Number of segments per ring segment. Minimum is `1`.\n\t * @param {number} [thetaStart=0] - Starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {RingGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * Creates an one-sided polygonal geometry from one or more path shapes.\n *\n * ```js\n * const arcShape = new THREE.Shape()\n *\t.moveTo( 5, 1 )\n *\t.absarc( 1, 1, 4, 0, Math.PI * 2, false );\n *\n * const geometry = new THREE.ShapeGeometry( arcShape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#ShapeGeometry\n */\nclass ShapeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new shape geometry.\n\t *\n\t * @param {Shape|Array} [shapes] - A shape or an array of shapes.\n\t * @param {number} [curveSegments=12] - Number of segments per shape.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array} shapes - An array of shapes.\n\t * @return {ShapeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\n/**\n * A class for generating a sphere geometry.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry( 15, 32, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const sphere = new THREE.Mesh( geometry, material );\n * scene.add( sphere );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#SphereGeometry\n */\nclass SphereGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new sphere geometry.\n\t *\n\t * @param {number} [radius=1] - The sphere radius.\n\t * @param {number} [widthSegments=32] - The number of horizontal segments. Minimum value is `3`.\n\t * @param {number} [heightSegments=16] - The number of vertical segments. Minimum value is `2`.\n\t * @param {number} [phiStart=0] - The horizontal starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The horizontal sweep angle size.\n\t * @param {number} [thetaStart=0] - The vertical starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI] - The vertical sweep angle size.\n\t */\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 && thetaStart === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy === heightSegments && thetaEnd === Math.PI ) {\n\n\t\t\t\tuOffset = -0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {SphereGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an tetrahedron.\n *\n * ```js\n * const geometry = new THREE.TetrahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const tetrahedron = new THREE.Mesh( geometry, material );\n * scene.add( tetrahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#TetrahedronGeometry\n */\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new tetrahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the tetrahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a tetrahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t-1, -1, 1, \t-1, 1, -1, \t1, -1, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TetrahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an torus.\n *\n * ```js\n * const geometry = new THREE.TorusGeometry( 10, 3, 16, 100 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torus = new THREE.Mesh( geometry, material );\n * scene.add( torus );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TorusGeometry\n */\nclass TorusGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus, from the center of the torus to the center of the tube.\n\t * @param {number} [tube=0.4] - Radius of the tube. Must be smaller than `radius`.\n\t * @param {number} [radialSegments=12] - The number of radial segments.\n\t * @param {number} [tubularSegments=48] - The number of tubular segments.\n\t * @param {number} [arc=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\n/**\n * Creates a torus knot, the particular shape of which is defined by a pair\n * of coprime integers, p and q. If p and q are not coprime, the result will\n * be a torus link.\n *\n * ```js\n * const geometry = new THREE.TorusKnotGeometry( 10, 3, 100, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torusKnot = new THREE.Mesh( geometry, material );\n * scene.add( torusKnot );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TorusKnotGeometry\n */\nclass TorusKnotGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus knot geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus knot.\n\t * @param {number} [tube=0.4] - Radius of the tube.\n\t * @param {number} [tubularSegments=64] - The number of tubular segments.\n\t * @param {number} [radialSegments=8] - The number of radial segments.\n\t * @param {number} [p=2] - This value determines, how many times the geometry winds around its axis of rotational symmetry.\n\t * @param {number} [q=3] - This value determines, how many times the geometry winds around a circle in the interior of the torus.\n\t */\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusKnotGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\n/**\n * Creates a tube that extrudes along a 3D curve.\n *\n * ```js\n * class CustomSinCurve extends THREE.Curve {\n *\n * \tgetPoint( t, optionalTarget = new THREE.Vector3() ) {\n *\n * \t\tconst tx = t * 3 - 1.5;\n * \t\tconst ty = Math.sin( 2 * Math.PI * t );\n * \t\tconst tz = 0;\n *\n * \t\treturn optionalTarget.set( tx, ty, tz );\n * \t}\n *\n * }\n *\n * const path = new CustomSinCurve( 10 );\n * const geometry = new THREE.TubeGeometry( path, 20, 2, 8, false );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TubeGeometry\n */\nclass TubeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new tube geometry.\n\t *\n\t * @param {Curve} [path=QuadraticBezierCurve3] - A 3D curve defining the path of the tube.\n\t * @param {number} [tubularSegments=64] - The number of segments that make up the tube.\n\t * @param {number} [radius=1] -The radius of the tube.\n\t * @param {number} [radialSegments=8] - The number of segments that make up the cross-section.\n\t * @param {boolean} [closed=false] - Whether the tube is closed or not.\n\t */\n\tconstructor( path = new QuadraticBezierCurve3( new Vector3( -1, -1, 0 ), new Vector3( -1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TubeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\n/**\n * Can be used as a helper object to visualize a geometry as a wireframe.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry();\n *\n * const wireframe = new THREE.WireframeGeometry( geometry );\n *\n * const line = new THREE.LineSegments( wireframe );\n * line.material.depthWrite = false;\n * line.material.opacity = 0.25;\n * line.material.transparent = true;\n *\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass WireframeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new wireframe geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t */\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tCapsuleGeometry: CapsuleGeometry,\n\tCircleGeometry: CircleGeometry,\n\tConeGeometry: ConeGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tLatheGeometry: LatheGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tRingGeometry: RingGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tSphereGeometry: SphereGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTubeGeometry: TubeGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\n/**\n * This material can receive shadows, but otherwise is completely transparent.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 2000, 2000 );\n * geometry.rotateX( - Math.PI / 2 );\n *\n * const material = new THREE.ShadowMaterial();\n * material.opacity = 0.2;\n *\n * const plane = new THREE.Mesh( geometry, material );\n * plane.position.y = -200;\n * plane.receiveShadow = true;\n * scene.add( plane );\n * ```\n *\n * @augments Material\n */\nclass ShadowMaterial extends Material {\n\n\t/**\n\t * Constructs a new shadow material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShadowMaterial = true;\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.color = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Overwritten since shadow materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This class works just like {@link ShaderMaterial}, except that definitions\n * of built-in uniforms and attributes are not automatically prepended to the\n * GLSL shader code.\n *\n * `RawShaderMaterial` can only be used with {@link WebGLRenderer}.\n *\n * @augments ShaderMaterial\n */\nclass RawShaderMaterial extends ShaderMaterial {\n\n\t/**\n\t * Constructs a new raw shader material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRawShaderMaterial = true;\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\n/**\n * A standard physically based material, using Metallic-Roughness workflow.\n *\n * Physically based rendering (PBR) has recently become the standard in many\n * 3D applications, such as [Unity](https://blogs.unity3d.com/2014/10/29/physically-based-shading-in-unity-5-a-primer/),\n * [Unreal](https://docs.unrealengine.com/latest/INT/Engine/Rendering/Materials/PhysicallyBased/) and\n * [3D Studio Max](http://area.autodesk.com/blogs/the-3ds-max-blog/what039s-new-for-rendering-in-3ds-max-2017).\n *\n * This approach differs from older approaches in that instead of using\n * approximations for the way in which light interacts with a surface, a\n * physically correct model is used. The idea is that, instead of tweaking\n * materials to look good under specific lighting, a material can be created\n * that will react 'correctly' under all lighting scenarios.\n *\n * In practice this gives a more accurate and realistic looking result than\n * the {@link MeshLambertMaterial} or {@link MeshPhongMaterial}, at the cost of\n * being somewhat more computationally expensive. `MeshStandardMaterial` uses per-fragment\n * shading.\n *\n * Note that for best results you should always specify an environment map when using this material.\n *\n * For a non-technical introduction to the concept of PBR and how to set up a\n * PBR material, check out these articles by the people at [marmoset](https://www.marmoset.co):\n *\n * - [Basic Theory of Physically Based Rendering](https://www.marmoset.co/posts/basic-theory-of-physically-based-rendering/)\n * - [Physically Based Rendering and You Can Too](https://www.marmoset.co/posts/physically-based-rendering-and-you-can-too/)\n *\n * Technical details of the approach used in three.js (and most other PBR systems) can be found is this\n * [paper from Disney](https://media.disneyanimation.com/uploads/production/publication_asset/48/asset/s2012_pbs_disney_brdf_notes_v3.pdf)\n * (pdf), by Brent Burley.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshStandardMaterial\n */\nclass MeshStandardMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh standard material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshStandardMaterial = true;\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * How rough the material appears. `0.0` means a smooth mirror reflection, `1.0`\n\t\t * means fully diffuse. If `roughnessMap` is also provided,\n\t\t * both values are multiplied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.roughness = 1.0;\n\n\t\t/**\n\t\t * How much the material is like a metal. Non-metallic materials such as wood\n\t\t * or stone use `0.0`, metallic use `1.0`, with nothing (usually) in between.\n\t\t * A value between `0.0` and `1.0` could be used for a rusty metal look.\n\t\t * If `metalnessMap` is also provided, both values are multiplied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.metalness = 0.0;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The green channel of this texture is used to alter the roughness of the\n\t\t * material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.roughnessMap = null;\n\n\t\t/**\n\t\t * The blue channel of this texture is used to alter the metalness of the\n\t\t * material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.metalnessMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map. To ensure a physically correct rendering, environment maps\n\t\t * are internally pre-processed with {@link PMREMGenerator}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * Scales the effect of the environment map by multiplying its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.envMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An extension of the {@link MeshStandardMaterial}, providing more advanced\n * physically-based rendering properties:\n *\n * - Anisotropy: Ability to represent the anisotropic property of materials\n * as observable with brushed metals.\n * - Clearcoat: Some materials — like car paints, carbon fiber, and wet surfaces — require\n * a clear, reflective layer on top of another layer that may be irregular or rough.\n * Clearcoat approximates this effect, without the need for a separate transparent surface.\n * - Iridescence: Allows to render the effect where hue varies depending on the viewing\n * angle and illumination angle. This can be seen on soap bubbles, oil films, or on the\n * wings of many insects.\n * - Physically-based transparency: One limitation of {@link Material#opacity} is that highly\n * transparent materials are less reflective. Physically-based transmission provides a more\n * realistic option for thin, transparent surfaces like glass.\n * - Advanced reflectivity: More flexible reflectivity for non-metallic materials.\n * - Sheen: Can be used for representing cloth and fabric materials.\n *\n * As a result of these complex shading features, `MeshPhysicalMaterial` has a\n * higher performance cost, per pixel, than other three.js materials. Most\n * effects are disabled by default, and add cost as they are enabled. For\n * best results, always specify an environment map when using this material.\n *\n * @augments MeshStandardMaterial\n * @demo scenes/material-browser.html#MeshPhysicalMaterial\n */\nclass MeshPhysicalMaterial extends MeshStandardMaterial {\n\n\t/**\n\t * Constructs a new mesh physical material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhysicalMaterial = true;\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\t/**\n\t\t * The rotation of the anisotropy in tangent, bitangent space, measured in radians\n\t\t * counter-clockwise from the tangent. When `anisotropyMap` is present, this\n\t\t * property provides additional rotation to the vectors in the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.anisotropyRotation = 0;\n\n\t\t/**\n\t\t * Red and green channels represent the anisotropy direction in `[-1, 1]` tangent,\n\t\t * bitangent space, to be rotated by `anisotropyRotation`. The blue channel\n\t\t * contains strength as `[0, 1]` to be multiplied by `anisotropy`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.anisotropyMap = null;\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `clearcoat`,\n\t\t * for per-pixel control over a coating's intensity.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatMap = null;\n\n\t\t/**\n\t\t * Roughness of the clear coat layer, from `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.clearcoatRoughness = 0.0;\n\n\t\t/**\n\t\t * The green channel of this texture is multiplied against\n\t\t * `clearcoatRoughness`, for per-pixel control over a coating's roughness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatRoughnessMap = null;\n\n\t\t/**\n\t\t * How much `clearcoatNormalMap` affects the clear coat layer, from\n\t\t * `(0,0)` to `(1,1)`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * Can be used to enable independent normals for the clear coat layer.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatNormalMap = null;\n\n\t\t/**\n\t\t * Index-of-refraction for non-metallic materials, from `1.0` to `2.333`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.5\n\t\t */\n\t\tthis.ior = 1.5;\n\n\t\t/**\n\t\t * Degree of reflectivity, from `0.0` to `1.0`. Default is `0.5`, which\n\t\t * corresponds to an index-of-refraction of `1.5`.\n\t\t *\n\t\t * This models the reflectivity of non-metallic materials. It has no effect\n\t\t * when `metalness` is `1.0`\n\t\t *\n\t\t * @name MeshPhysicalMaterial#reflectivity\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tObject.defineProperty( this, 'reflectivity', {\n\t\t\tget: function () {\n\n\t\t\t\treturn ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) );\n\n\t\t\t},\n\t\t\tset: function ( reflectivity ) {\n\n\t\t\t\tthis.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity );\n\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `iridescence`, for per-pixel\n\t\t * control over iridescence.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceMap = null;\n\n\t\t/**\n\t\t * Strength of the iridescence RGB color shift effect, represented by an index-of-refraction.\n\t\t * Between `1.0` to `2.333`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.3\n\t\t */\n\t\tthis.iridescenceIOR = 1.3;\n\n\t\t/**\n\t\t *Array of exactly 2 elements, specifying minimum and maximum thickness of the iridescence layer.\n\t\t Thickness of iridescence layer has an equivalent effect of the one `thickness` has on `ior`.\n\t\t *\n\t\t * @type {Array}\n\t\t * @default [100,400]\n\t\t */\n\t\tthis.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t/**\n\t\t * A texture that defines the thickness of the iridescence layer, stored in the green channel.\n\t\t * Minimum and maximum values of thickness are defined by `iridescenceThicknessRange` array:\n\t\t * - `0.0` in the green channel will result in thickness equal to first element of the array.\n\t\t * - `1.0` in the green channel will result in thickness equal to second element of the array.\n\t\t * - Values in-between will linearly interpolate between the elements of the array.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceThicknessMap = null;\n\n\t\t/**\n\t\t * The sheen tint.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.sheenColor = new Color( 0x000000 );\n\n\t\t/**\n\t\t * The RGB channels of this texture are multiplied against `sheenColor`, for per-pixel control\n\t\t * over sheen tint.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenColorMap = null;\n\n\t\t/**\n\t\t * Roughness of the sheen layer, from `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.sheenRoughness = 1.0;\n\n\t\t/**\n\t\t * The alpha channel of this texture is multiplied against `sheenRoughness`, for per-pixel control\n\t\t * over sheen roughness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenRoughnessMap = null;\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `transmission`, for per-pixel control over\n\t\t * optical transparency.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.transmissionMap = null;\n\n\t\t/**\n\t\t * The thickness of the volume beneath the surface. The value is given in the\n\t\t * coordinate space of the mesh. If the value is `0` the material is\n\t\t * thin-walled. Otherwise the material is a volume boundary.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.thickness = 0;\n\n\t\t/**\n\t\t * A texture that defines the thickness, stored in the green channel. This will\n\t\t * be multiplied by `thickness`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.thicknessMap = null;\n\n\t\t/**\n\t\t * Density of the medium given as the average distance that light travels in\n\t\t * the medium before interacting with a particle. The value is given in world\n\t\t * space units, and must be greater than zero.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.attenuationDistance = Infinity;\n\n\t\t/**\n\t\t * The color that white light turns into due to absorption when reaching the\n\t\t * attenuation distance.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.attenuationColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * A float that scales the amount of specular reflection for non-metals only.\n\t\t * When set to zero, the model is effectively Lambertian. From `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.specularIntensity = 1.0;\n\n\t\t/**\n\t\t * The alpha channel of this texture is multiplied against `specularIntensity`,\n\t\t * for per-pixel control over specular intensity.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularIntensityMap = null;\n\n\t\t/**\n\t\t * Tints the specular reflection at normal incidence for non-metals only.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.specularColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * The RGB channels of this texture are multiplied against `specularColor`,\n\t\t * for per-pixel control over specular color.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularColorMap = null;\n\n\t\tthis._anisotropy = 0;\n\t\tthis._clearcoat = 0;\n\t\tthis._dispersion = 0;\n\t\tthis._iridescence = 0;\n\t\tthis._sheen = 0.0;\n\t\tthis._transmission = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * The anisotropy strength, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget anisotropy() {\n\n\t\treturn this._anisotropy;\n\n\t}\n\n\tset anisotropy( value ) {\n\n\t\tif ( this._anisotropy > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._anisotropy = value;\n\n\t}\n\n\t/**\n\t * Represents the intensity of the clear coat layer, from `0.0` to `1.0`. Use\n\t * clear coat related properties to enable multilayer materials that have a\n\t * thin translucent layer over the base layer.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget clearcoat() {\n\n\t\treturn this._clearcoat;\n\n\t}\n\n\tset clearcoat( value ) {\n\n\t\tif ( this._clearcoat > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._clearcoat = value;\n\n\t}\n\t/**\n\t * The intensity of the iridescence layer, simulating RGB color shift based on the angle between\n\t * the surface and the viewer, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget iridescence() {\n\n\t\treturn this._iridescence;\n\n\t}\n\n\tset iridescence( value ) {\n\n\t\tif ( this._iridescence > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._iridescence = value;\n\n\t}\n\n\t/**\n\t * Defines the strength of the angular separation of colors (chromatic aberration) transmitting\n\t * through a relatively clear volume. Any value zero or larger is valid, the typical range of\n\t * realistic values is `[0, 1]`. This property can be only be used with transmissive objects.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget dispersion() {\n\n\t\treturn this._dispersion;\n\n\t}\n\n\tset dispersion( value ) {\n\n\t\tif ( this._dispersion > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._dispersion = value;\n\n\t}\n\n\t/**\n\t * The intensity of the sheen layer, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget sheen() {\n\n\t\treturn this._sheen;\n\n\t}\n\n\tset sheen( value ) {\n\n\t\tif ( this._sheen > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._sheen = value;\n\n\t}\n\n\t/**\n\t * Degree of transmission (or optical transparency), from `0.0` to `1.0`.\n\t *\n\t * Thin, transparent or semitransparent, plastic or glass materials remain\n\t * largely reflective even if they are fully transmissive. The transmission\n\t * property can be used to model these materials.\n\t *\n\t * When transmission is non-zero, `opacity` should be set to `1`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget transmission() {\n\n\t\treturn this._transmission;\n\n\t}\n\n\tset transmission( value ) {\n\n\t\tif ( this._transmission > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._transmission = value;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.anisotropy = source.anisotropy;\n\t\tthis.anisotropyRotation = source.anisotropyRotation;\n\t\tthis.anisotropyMap = source.anisotropyMap;\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\t\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\t\tthis.dispersion = source.dispersion;\n\t\tthis.ior = source.ior;\n\n\t\tthis.iridescence = source.iridescence;\n\t\tthis.iridescenceMap = source.iridescenceMap;\n\t\tthis.iridescenceIOR = source.iridescenceIOR;\n\t\tthis.iridescenceThicknessRange = [ ...source.iridescenceThicknessRange ];\n\t\tthis.iridescenceThicknessMap = source.iridescenceThicknessMap;\n\n\t\tthis.sheen = source.sheen;\n\t\tthis.sheenColor.copy( source.sheenColor );\n\t\tthis.sheenColorMap = source.sheenColorMap;\n\t\tthis.sheenRoughness = source.sheenRoughness;\n\t\tthis.sheenRoughnessMap = source.sheenRoughnessMap;\n\n\t\tthis.transmission = source.transmission;\n\t\tthis.transmissionMap = source.transmissionMap;\n\n\t\tthis.thickness = source.thickness;\n\t\tthis.thicknessMap = source.thicknessMap;\n\t\tthis.attenuationDistance = source.attenuationDistance;\n\t\tthis.attenuationColor.copy( source.attenuationColor );\n\n\t\tthis.specularIntensity = source.specularIntensity;\n\t\tthis.specularIntensityMap = source.specularIntensityMap;\n\t\tthis.specularColor.copy( source.specularColor );\n\t\tthis.specularColorMap = source.specularColorMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for shiny surfaces with specular highlights.\n *\n * The material uses a non-physically based [Blinn-Phong](https://en.wikipedia.org/wiki/Blinn-Phong_shading_model)\n * model for calculating reflectance. Unlike the Lambertian model used in the\n * {@link MeshLambertMaterial} this can simulate shiny surfaces with specular\n * highlights (such as varnished wood). `MeshPhongMaterial` uses per-fragment shading.\n *\n * Performance will generally be greater when using this material over the\n * {@link MeshStandardMaterial} or {@link MeshPhysicalMaterial}, at the cost of\n * some graphical accuracy.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshPhongMaterial\n */\nclass MeshPhongMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh phong material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhongMaterial = true;\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * Specular color of the material. The default color is set to `0x111111` (very dark grey)\n\t\t *\n\t\t * This defines how shiny the material is and the color of its shine.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.specular = new Color( 0x111111 );\n\n\t\t/**\n\t\t * How shiny the specular highlight is; a higher value gives a sharper highlight.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 30\n\t\t */\n\t\tthis.shininess = 30;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The specular map value affects both how much the specular surface\n\t\t * highlight contributes and how much of the environment map affects the\n\t\t * surface.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material implementing toon shading.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshToonMaterial\n */\nclass MeshToonMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh toon material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshToonMaterial = true;\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * Gradient map for toon shading. It's required to set\n\t\t * {@link Texture#minFilter} and {@link Texture#magFilter} to {@linkNearestFilter}\n\t\t * when using this type of texture.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.gradientMap = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material that maps the normal vectors to RGB colors.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshNormalMaterial\n */\nclass MeshNormalMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh normal material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshNormalMaterial = true;\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for non-shiny surfaces, without specular highlights.\n *\n * The material uses a non-physically based [Lambertian](https://en.wikipedia.org/wiki/Lambertian_reflectance)\n * model for calculating reflectance. This can simulate some surfaces (such\n * as untreated wood or stone) well, but cannot simulate shiny surfaces with\n * specular highlights (such as varnished wood). `MeshLambertMaterial` uses per-fragment\n * shading.\n *\n * Due to the simplicity of the reflectance and illumination models,\n * performance will be greater when using this material over the\n * {@link MeshPhongMaterial}, {@link MeshStandardMaterial} or\n * {@link MeshPhysicalMaterial}, at the cost of some graphical accuracy.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshLambertMaterial\n */\nclass MeshLambertMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh lambert material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshLambertMaterial = true;\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Specular map used by the material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for drawing geometry by depth. Depth is based off of the camera\n * near and far plane. White is nearest, black is farthest.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshDepthMaterial\n */\nclass MeshDepthMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh depth material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshDepthMaterial = true;\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\t/**\n\t\t * Type for depth packing.\n\t\t *\n\t\t * @type {(BasicDepthPacking|RGBADepthPacking|RGBDepthPacking|RGDepthPacking)}\n\t\t * @default BasicDepthPacking\n\t\t */\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material used internally for implementing shadow mapping with\n * point lights.\n *\n * Can also be used to customize the shadow casting of an object by assigning\n * an instance of `MeshDistanceMaterial` to {@link Object3D#customDistanceMaterial}.\n * The following examples demonstrates this approach in order to ensure\n * transparent parts of objects do not cast shadows.\n *\n * @augments Material\n */\nclass MeshDistanceMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh distance material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshDistanceMaterial = true;\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This material is defined by a MatCap (or Lit Sphere) texture, which encodes the\n * material color and shading.\n *\n * `MeshMatcapMaterial` does not respond to lights since the matcap image file encodes\n * baked lighting. It will cast a shadow onto an object that receives shadows\n * (and shadow clipping works), but it will not self-shadow or receive\n * shadows.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshMatcapMaterial\n */\nclass MeshMatcapMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh matcap material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshMatcapMaterial = true;\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.type = 'MeshMatcapMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The matcap map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.matcap = null;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.matcap = source.matcap;\n\n\t\tthis.map = source.map;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for rendering line primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const material = new THREE.LineDashedMaterial( {\n * \tcolor: 0xffffff,\n * \tscale: 1,\n * \tdashSize: 3,\n * \tgapSize: 1,\n * } );\n * ```\n *\n * @augments LineBasicMaterial\n */\nclass LineDashedMaterial extends LineBasicMaterial {\n\n\t/**\n\t * Constructs a new line dashed material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineDashedMaterial = true;\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\t/**\n\t\t * The scale of the dashed part of a line.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.scale = 1;\n\n\t\t/**\n\t\t * The size of the dash. This is both the gap with the stroke.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 3\n\t\t */\n\t\tthis.dashSize = 3;\n\n\t\t/**\n\t\t * The size of the gap.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Converts an array to a specific type.\n *\n * @param {TypedArray|Array} array - The array to convert.\n * @param {TypedArray.constructor} type - The constructor of a typed array that defines the new type.\n * @return {TypedArray} The converted array.\n */\nfunction convertArray( array, type ) {\n\n\tif ( ! array || array.constructor === type ) return array;\n\n\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\treturn new type( array ); // create typed array\n\n\t}\n\n\treturn Array.prototype.slice.call( array ); // create Array\n\n}\n\n/**\n * Returns `true` if the given object is a typed array.\n *\n * @param {any} object - The object to check.\n * @return {boolean} Whether the given object is a typed array.\n */\nfunction isTypedArray( object ) {\n\n\treturn ArrayBuffer.isView( object ) && ! ( object instanceof DataView );\n\n}\n\n/**\n * Returns an array by which times and values can be sorted.\n *\n * @param {Array} times - The keyframe time values.\n * @return {Array} The array.\n */\nfunction getKeyframeOrder( times ) {\n\n\tfunction compareTime( i, j ) {\n\n\t\treturn times[ i ] - times[ j ];\n\n\t}\n\n\tconst n = times.length;\n\tconst result = new Array( n );\n\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\tresult.sort( compareTime );\n\n\treturn result;\n\n}\n\n/**\n * Sorts the given array by the previously computed order via `getKeyframeOrder()`.\n *\n * @param {Array} values - The values to sort.\n * @param {number} stride - The stride.\n * @param {Array} order - The sort order.\n * @return {Array} The sorted values.\n */\nfunction sortedArray( values, stride, order ) {\n\n\tconst nValues = values.length;\n\tconst result = new values.constructor( nValues );\n\n\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\tconst srcOffset = order[ i ] * stride;\n\n\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * Used for parsing AOS keyframe formats.\n *\n * @param {Array} jsonKeys - A list of JSON keyframes.\n * @param {Array} times - This array will be filled with keyframe times by this function.\n * @param {Array} values - This array will be filled with keyframe values by this function.\n * @param {string} valuePropertyName - The name of the property to use.\n */\nfunction flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\tlet i = 1, key = jsonKeys[ 0 ];\n\n\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\tkey = jsonKeys[ i ++ ];\n\n\t}\n\n\tif ( key === undefined ) return; // no data\n\n\tlet value = key[ valuePropertyName ];\n\tif ( value === undefined ) return; // no data\n\n\tif ( Array.isArray( value ) ) {\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( ...value ); // push all elements\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else if ( value.toArray !== undefined ) {\n\n\t\t// ...assume THREE.Math-ish\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else {\n\n\t\t// otherwise push as-is\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( value );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t}\n\n}\n\n/**\n * Creates a new clip, containing only the segment of the original clip between the given frames.\n *\n * @param {AnimationClip} sourceClip - The values to sort.\n * @param {string} name - The name of the clip.\n * @param {number} startFrame - The start frame.\n * @param {number} endFrame - The end frame.\n * @param {number} [fps=30] - The FPS.\n * @return {AnimationClip} The new sub clip.\n */\nfunction subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\tconst clip = sourceClip.clone();\n\n\tclip.name = name;\n\n\tconst tracks = [];\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tconst track = clip.tracks[ i ];\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( times.length === 0 ) continue;\n\n\t\ttrack.times = convertArray( times, track.times.constructor );\n\t\ttrack.values = convertArray( values, track.values.constructor );\n\n\t\ttracks.push( track );\n\n\t}\n\n\tclip.tracks = tracks;\n\n\t// find minimum .times value across all tracks in the trimmed clip\n\n\tlet minStartTime = Infinity;\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t}\n\n\t}\n\n\t// shift all tracks such that clip begins at t=0\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tclip.tracks[ i ].shift( -1 * minStartTime );\n\n\t}\n\n\tclip.resetDuration();\n\n\treturn clip;\n\n}\n\n/**\n * Converts the keyframes of the given animation clip to an additive format.\n *\n * @param {AnimationClip} targetClip - The clip to make additive.\n * @param {number} [referenceFrame=0] - The reference frame.\n * @param {AnimationClip} [referenceClip=targetClip] - The reference clip.\n * @param {number} [fps=30] - The FPS.\n * @return {AnimationClip} The updated clip which is now additive.\n */\nfunction makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\tif ( fps <= 0 ) fps = 30;\n\n\tconst numTracks = referenceClip.tracks.length;\n\tconst referenceTime = referenceFrame / fps;\n\n\t// Make each track's values relative to the values at the reference frame\n\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t// Skip this track if it's non-numeric\n\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t} );\n\n\t\tif ( targetTrack === undefined ) continue;\n\n\t\tlet referenceOffset = 0;\n\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t}\n\n\t\tlet targetOffset = 0;\n\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t}\n\n\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\tlet referenceValue;\n\n\t\t// Find the value to subtract out of the track\n\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else {\n\n\t\t\t// Interpolate to the reference value\n\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\treferenceValue = interpolant.resultBuffer.slice( startIndex, endIndex );\n\n\t\t}\n\n\t\t// Conjugate the quaternion\n\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t}\n\n\t\t// Subtract the reference value from all of the track values\n\n\t\tconst numTimes = targetTrack.times.length;\n\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart,\n\t\t\t\t\treferenceValue,\n\t\t\t\t\t0,\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\treturn targetClip;\n\n}\n\n/**\n * A class with various methods to assist with animations.\n *\n * @hideconstructor\n */\nclass AnimationUtils {\n\n\t/**\n\t * Converts an array to a specific type\n\t *\n\t * @static\n\t * @param {TypedArray|Array} array - The array to convert.\n\t * @param {TypedArray.constructor} type - The constructor of a type array.\n\t * @return {TypedArray} The converted array\n\t */\n\tstatic convertArray( array, type ) {\n\n\t\treturn convertArray( array, type );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given object is a typed array.\n\t *\n\t * @static\n\t * @param {any} object - The object to check.\n\t * @return {boolean} Whether the given object is a typed array.\n\t */\n\tstatic isTypedArray( object ) {\n\n\t\treturn isTypedArray( object );\n\n\t}\n\n\t/**\n\t * Returns an array by which times and values can be sorted.\n\t *\n\t * @static\n\t * @param {Array} times - The keyframe time values.\n\t * @return {Array} The array.\n\t */\n\tstatic getKeyframeOrder( times ) {\n\n\t\treturn getKeyframeOrder( times );\n\n\t}\n\n\t/**\n\t * Sorts the given array by the previously computed order via `getKeyframeOrder()`.\n\t *\n\t * @static\n\t * @param {Array} values - The values to sort.\n\t * @param {number} stride - The stride.\n\t * @param {Array} order - The sort order.\n\t * @return {Array} The sorted values.\n\t */\n\tstatic sortedArray( values, stride, order ) {\n\n\t\treturn sortedArray( values, stride, order );\n\n\t}\n\n\t/**\n\t * Used for parsing AOS keyframe formats.\n\t *\n\t * @static\n\t * @param {Array} jsonKeys - A list of JSON keyframes.\n\t * @param {Array} times - This array will be filled with keyframe times by this method.\n\t * @param {Array} values - This array will be filled with keyframe values by this method.\n\t * @param {string} valuePropertyName - The name of the property to use.\n\t */\n\tstatic flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\t\tflattenJSON( jsonKeys, times, values, valuePropertyName );\n\n\t}\n\n\t/**\n\t * Creates a new clip, containing only the segment of the original clip between the given frames.\n\t *\n\t * @static\n\t * @param {AnimationClip} sourceClip - The values to sort.\n\t * @param {string} name - The name of the clip.\n\t * @param {number} startFrame - The start frame.\n\t * @param {number} endFrame - The end frame.\n\t * @param {number} [fps=30] - The FPS.\n\t * @return {AnimationClip} The new sub clip.\n\t */\n\tstatic subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\t\treturn subclip( sourceClip, name, startFrame, endFrame, fps );\n\n\t}\n\n\t/**\n\t * Converts the keyframes of the given animation clip to an additive format.\n\t *\n\t * @static\n\t * @param {AnimationClip} targetClip - The clip to make additive.\n\t * @param {number} [referenceFrame=0] - The reference frame.\n\t * @param {AnimationClip} [referenceClip=targetClip] - The reference clip.\n\t * @param {number} [fps=30] - The FPS.\n\t * @return {AnimationClip} The updated clip which is now additive.\n\t */\n\tstatic makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\t\treturn makeClipAdditive( targetClip, referenceFrame, referenceClip, fps );\n\n\t}\n\n}\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References: {@link http://www.oodesign.com/template-method-pattern.html}\n *\n * @abstract\n */\nclass Interpolant {\n\n\t/**\n\t * Constructs a new interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\t/**\n\t\t * The parameter positions.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.parameterPositions = parameterPositions;\n\n\t\t/**\n\t\t * A cache index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._cachedIndex = 0;\n\n\t\t/**\n\t\t * The result buffer.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.resultBuffer = resultBuffer !== undefined ? resultBuffer : new sampleValues.constructor( sampleSize );\n\n\t\t/**\n\t\t * The sample values.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.sampleValues = sampleValues;\n\n\t\t/**\n\t\t * The value size.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.valueSize = sampleSize;\n\n\t\t/**\n\t\t * The interpolation settings.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.settings = null;\n\n\t\t/**\n\t\t * The default settings object.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.DefaultSettings_ = {};\n\n\t}\n\n\t/**\n\t * Evaluate the interpolant at position `t`.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tevaluate( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t}\n\n\t/**\n\t * Returns the interpolation settings.\n\t *\n\t * @return {Object} The interpolation settings.\n\t */\n\tgetSettings_() {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @param {number} index - An index into the sample value buffer.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tcopySampleValue_( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @abstract\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t * @param {number} t1 - The next interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tinterpolate_( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t}\n\n\t/**\n\t * Optional method that is executed when the interval has changed.\n\t *\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t */\n\tintervalChanged_( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n}\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n *\n * @augments Interpolant\n */\nclass CubicInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new cubic interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t\tthis.DefaultSettings_ = {\n\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\n\t\t};\n\n\t}\n\n\tintervalChanged_( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( -1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\tconst s1 = ( -1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A basic linear interpolant.\n *\n * @augments Interpolant\n */\nclass LinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new linear interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * Interpolant that evaluates to the sample value at the position preceding\n * the parameter.\n *\n * @augments Interpolant\n */\nclass DiscreteInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new discrete interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n}\n\n/**\n * Represents s a timed sequence of keyframes, which are composed of lists of\n * times and related values, and which are used to animate a specific property\n * of an object.\n */\nclass KeyframeTrack {\n\n\t/**\n\t * Constructs a new keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\t\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\t\t/**\n\t\t * The track's name can refer to morph targets or bones or\n\t\t * possibly other values within an animated object. See {@link PropertyBinding#parseTrackName}\n\t\t * for the forms of strings that can be parsed for property binding.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * The keyframe times.\n\t\t *\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.times = convertArray( times, this.TimeBufferType );\n\n\t\t/**\n\t\t * The keyframe values.\n\t\t *\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.values = convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t}\n\n\t/**\n\t * Converts the keyframe track to JSON.\n\t *\n\t * @static\n\t * @param {KeyframeTrack} track - The keyframe track to serialize.\n\t * @return {Object} The serialized keyframe track as JSON.\n\t */\n\tstatic toJSON( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== this.toJSON ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': convertArray( track.times, Array ),\n\t\t\t\t'values': convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n\t/**\n\t * Factory method for creating a new discrete interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {DiscreteInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodDiscrete( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Factory method for creating a new linear interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {LinearInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Factory method for creating a new smooth interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {CubicInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodSmooth( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Defines the interpolation factor method for this keyframe track.\n\t *\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} interpolation - The interpolation type.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tsetInterpolation( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = 'unsupported interpolation for ' +\n\t\t\t\tthis.ValueTypeName + ' keyframe track named ' + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\twarn( 'KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current interpolation type.\n\t *\n\t * @return {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} The interpolation type.\n\t */\n\tgetInterpolation() {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the value size.\n\t *\n\t * @return {number} The value size.\n\t */\n\tgetValueSize() {\n\n\t\treturn this.values.length / this.times.length;\n\n\t}\n\n\t/**\n\t * Moves all keyframes either forward or backward in time.\n\t *\n\t * @param {number} timeOffset - The offset to move the time values.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tshift( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scale all keyframe times by a factor (useful for frame - seconds conversions).\n\t *\n\t * @param {number} timeScale - The time scale.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tscale( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes keyframes before and after animation without changing any values within the defined time range.\n\t *\n\t * Note: The method does not shift around keys to the start of the track time, because for interpolated\n\t * keys this will change their values\n\t *\n\t * @param {number} startTime - The start time.\n\t * @param {number} endTime - The end time.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\ttrim( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== -1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = times.slice( from, to );\n\t\t\tthis.values = this.values.slice( from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs minimal validation on the keyframe track. Returns `true` if the values\n\t * are valid.\n\t *\n\t * @return {boolean} Whether the keyframes are valid or not.\n\t */\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\terror( 'KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\terror( 'KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\terror( 'KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\terror( 'KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\terror( 'KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t/**\n\t * Optimizes this keyframe track by removing equivalent sequential keys (which are\n\t * common in morph target sequences).\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\toptimize() {\n\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = this.times.slice(),\n\t\t\tvalues = this.values.slice(),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = times.slice( 0, writeIndex );\n\t\t\tthis.values = values.slice( 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new keyframe track with copied values from this instance.\n\t *\n\t * @return {KeyframeTrack} A clone of this instance.\n\t */\n\tclone() {\n\n\t\tconst times = this.times.slice();\n\t\tconst values = this.values.slice();\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default ''\n */\nKeyframeTrack.prototype.ValueTypeName = '';\n\n/**\n * The time buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Float32Array.constructor\n */\nKeyframeTrack.prototype.TimeBufferType = Float32Array;\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Float32Array.constructor\n */\nKeyframeTrack.prototype.ValueBufferType = Float32Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateLinear\n */\nKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\n\n/**\n * A track for boolean keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new boolean keyframe track.\n\t *\n\t * This keyframe track type has no `interpolation` parameter because the\n\t * interpolation is always discrete.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t */\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'bool'\n */\nBooleanKeyframeTrack.prototype.ValueTypeName = 'bool';\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Array.constructor\n */\nBooleanKeyframeTrack.prototype.ValueBufferType = Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateDiscrete\n */\nBooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for color keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass ColorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new color keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'color'\n */\nColorKeyframeTrack.prototype.ValueTypeName = 'color';\n\n/**\n * A track for numeric keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass NumberKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new number keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'number'\n */\nNumberKeyframeTrack.prototype.ValueTypeName = 'number';\n\n/**\n * Spherical linear unit quaternion interpolant.\n *\n * @augments Interpolant\n */\nclass QuaternionLinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new SLERP interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A track for Quaternion keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new Quaternion keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n\t/**\n\t * Overwritten so the method returns Quaternion based interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {QuaternionLinearInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'quaternion'\n */\nQuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';\n// ValueBufferType is inherited\n// DefaultInterpolation is inherited;\nQuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for string keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass StringKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new string keyframe track.\n\t *\n\t * This keyframe track type has no `interpolation` parameter because the\n\t * interpolation is always discrete.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t */\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'string'\n */\nStringKeyframeTrack.prototype.ValueTypeName = 'string';\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Array.constructor\n */\nStringKeyframeTrack.prototype.ValueBufferType = Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateDiscrete\n */\nStringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for vector keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass VectorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new vector keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'vector'\n */\nVectorKeyframeTrack.prototype.ValueTypeName = 'vector';\n\n/**\n * A reusable set of keyframe tracks which represent an animation.\n */\nclass AnimationClip {\n\n\t/**\n\t * Constructs a new animation clip.\n\t *\n\t * Note: Instead of instantiating an AnimationClip directly with the constructor, you can\n\t * use the static interface of this class for creating clips. In most cases though, animation clips\n\t * will automatically be created by loaders when importing animated 3D assets.\n\t *\n\t * @param {string} [name=''] - The clip's name.\n\t * @param {number} [duration=-1] - The clip's duration in seconds. If a negative value is passed,\n\t * the duration will be calculated from the passed keyframes.\n\t * @param {Array} tracks - An array of keyframe tracks.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode=NormalAnimationBlendMode] - Defines how the animation\n\t * is blended/combined when two or more animations are simultaneously played.\n\t */\n\tconstructor( name = '', duration = -1, tracks = [], blendMode = NormalAnimationBlendMode ) {\n\n\t\t/**\n\t\t * The clip's name.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * An array of keyframe tracks.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.tracks = tracks;\n\n\t\t/**\n\t\t * The clip's duration in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.duration = duration;\n\n\t\t/**\n\t\t * Defines how the animation is blended/combined when two or more animations\n\t\t * are simultaneously played.\n\t\t *\n\t\t * @type {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)}\n\t\t */\n\t\tthis.blendMode = blendMode;\n\n\t\t/**\n\t\t * The UUID of the animation clip.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the animation clip.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Factory method for creating an animation clip from the given JSON.\n\t *\n\t * @static\n\t * @param {Object} json - The serialized animation clip.\n\t * @return {AnimationClip} The new animation clip.\n\t */\n\tstatic parse( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new this( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\tclip.userData = JSON.parse( json.userData || '{}' );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Serializes the given animation clip into JSON.\n\t *\n\t * @static\n\t * @param {AnimationClip} clip - The animation clip to serialize.\n\t * @return {Object} The JSON object.\n\t */\n\tstatic toJSON( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode,\n\t\t\t'userData': JSON.stringify( clip.userData ),\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t}\n\n\t/**\n\t * Returns a new animation clip from the passed morph targets array of a\n\t * geometry, taking a name and the number of frames per second.\n\t *\n\t * Note: The fps parameter is required, but the animation speed can be\n\t * overridden via {@link AnimationAction#setDuration}.\n\t *\n\t * @static\n\t * @param {string} name - The name of the animation clip.\n\t * @param {Array} morphTargetSequence - A sequence of morph targets.\n\t * @param {number} fps - The Frames-Per-Second value.\n\t * @param {boolean} noLoop - Whether the clip should be no loop or not.\n\t * @return {AnimationClip} The new animation clip.\n\t */\n\tstatic CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = getKeyframeOrder( times );\n\t\t\ttimes = sortedArray( times, 1, order );\n\t\t\tvalues = sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new this( name, -1, tracks );\n\n\t}\n\n\t/**\n\t * Searches for an animation clip by name, taking as its first parameter\n\t * either an array of clips, or a mesh or geometry that contains an\n\t * array named \"animations\" property.\n\t *\n\t * @static\n\t * @param {(Array|Object3D)} objectOrClipArray - The array or object to search through.\n\t * @param {string} name - The name to search for.\n\t * @return {?AnimationClip} The found animation clip. Returns `null` if no clip has been found.\n\t */\n\tstatic findByName( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Returns an array of new AnimationClips created from the morph target\n\t * sequences of a geometry, trying to sort morph target names into\n\t * animation-group-based patterns like \"Walk_001, Walk_002, Run_001, Run_002...\".\n\t *\n\t * See {@link MD2Loader#parse} as an example for how the method should be used.\n\t *\n\t * @static\n\t * @param {Array} morphTargets - A sequence of morph targets.\n\t * @param {number} fps - The Frames-Per-Second value.\n\t * @param {boolean} noLoop - Whether the clip should be no loop or not.\n\t * @return {Array} An array of new animation clips.\n\t */\n\tstatic CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t}\n\n\t/**\n\t * Parses the `animation.hierarchy` format and returns a new animation clip.\n\t *\n\t * @static\n\t * @deprecated since r175.\n\t * @param {Object} animation - A serialized animation clip as JSON.\n\t * @param {Array} bones - An array of bones.\n\t * @return {?AnimationClip} The new animation clip.\n\t */\n\tstatic parseAnimation( animation, bones ) {\n\n\t\twarn( 'AnimationClip: parseAnimation() is deprecated and will be removed with r185' );\n\n\t\tif ( ! animation ) {\n\n\t\t\terror( 'AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tflattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || -1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = -1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * fps;\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new this( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Sets the duration of this clip to the duration of its longest keyframe track.\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\tresetDuration() {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Trims all tracks to the clip's duration.\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\ttrim() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs minimal validation on each track in the clip. Returns `true` if all\n\t * tracks are valid.\n\t *\n\t * @return {boolean} Whether the clip's keyframes are valid or not.\n\t */\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t/**\n\t * Optimizes each track by removing equivalent sequential keys (which are\n\t * common in morph target sequences).\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\toptimize() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new animation clip with copied values from this instance.\n\t *\n\t * @return {AnimationClip} A clone of this instance.\n\t */\n\tclone() {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\tconst clip = new this.constructor( this.name, this.duration, tracks, this.blendMode );\n\n\t\tclip.userData = JSON.parse( JSON.stringify( this.userData ) );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Serializes this animation clip into JSON.\n\t *\n\t * @return {Object} The JSON object.\n\t */\n\ttoJSON() {\n\n\t\treturn this.constructor.toJSON( this );\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tflattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\n/**\n * @class\n * @classdesc A simple caching system, used internally by {@link FileLoader}.\n * To enable caching across all loaders that use {@link FileLoader}, add `THREE.Cache.enabled = true.` once in your app.\n * @hideconstructor\n */\nconst Cache = {\n\n\t/**\n\t * Whether caching is enabled or not.\n\t *\n\t * @static\n\t * @type {boolean}\n\t * @default false\n\t */\n\tenabled: false,\n\n\t/**\n\t * A dictionary that holds cached files.\n\t *\n\t * @static\n\t * @type {Object}\n\t */\n\tfiles: {},\n\n\t/**\n\t * Adds a cache entry with a key to reference the file. If this key already\n\t * holds a file, it is overwritten.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t * @param {Object} file - The file to be cached.\n\t */\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// log( 'Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\t/**\n\t * Gets the cached value for the given key.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t * @return {Object|undefined} The cached file. If the key does not exist `undefined` is returned.\n\t */\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// log( 'Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\t/**\n\t * Removes the cached file associated with the given key.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t */\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\t/**\n\t * Remove all values from the cache.\n\t *\n\t * @static\n\t */\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\n/**\n * Handles and keeps track of loaded and pending data. A default global\n * instance of this class is created and used by loaders if not supplied\n * manually.\n *\n * In general that should be sufficient, however there are times when it can\n * be useful to have separate loaders - for example if you want to show\n * separate loading bars for objects and textures.\n *\n * ```js\n * const manager = new THREE.LoadingManager();\n * manager.onLoad = () => console.log( 'Loading complete!' );\n *\n * const loader1 = new OBJLoader( manager );\n * const loader2 = new ColladaLoader( manager );\n * ```\n */\nclass LoadingManager {\n\n\t/**\n\t * Constructs a new loading manager.\n\t *\n\t * @param {Function} [onLoad] - Executes when all items have been loaded.\n\t * @param {Function} [onProgress] - Executes when single items have been loaded.\n\t * @param {Function} [onError] - Executes when an error occurs.\n\t */\n\tconstructor( onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet isLoading = false;\n\t\tlet itemsLoaded = 0;\n\t\tlet itemsTotal = 0;\n\t\tlet urlModifier = undefined;\n\t\tconst handlers = [];\n\n\t\t// Refer to #5689 for the reason why we don't set .onStart\n\t\t// in the constructor\n\n\t\t/**\n\t\t * Executes when an item starts loading.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onStart = undefined;\n\n\t\t/**\n\t\t * Executes when all items have been loaded.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onLoad = onLoad;\n\n\t\t/**\n\t\t * Executes when single items have been loaded.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onProgress = onProgress;\n\n\t\t/**\n\t\t * Executes when an error occurs.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onError = onError;\n\n\t\t/**\n\t\t * Used for aborting ongoing requests in loaders using this manager.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController | null}\n\t\t */\n\t\tthis._abortController = null;\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * starts loading an item.\n\t\t *\n\t\t * @param {string} url - The URL to load.\n\t\t */\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * ended loading an item.\n\t\t *\n\t\t * @param {string} url - The URL of the loaded item.\n\t\t */\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * encounters an error when loading an item.\n\t\t *\n\t\t * @param {string} url - The URL of the item that produces an error.\n\t\t */\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Given a URL, uses the URL modifier callback (if any) and returns a\n\t\t * resolved URL. If no URL modifier is set, returns the original URL.\n\t\t *\n\t\t * @param {string} url - The URL to load.\n\t\t * @return {string} The resolved URL.\n\t\t */\n\t\tthis.resolveURL = function ( url ) {\n\n\t\t\tif ( urlModifier ) {\n\n\t\t\t\treturn urlModifier( url );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t};\n\n\t\t/**\n\t\t * If provided, the callback will be passed each resource URL before a\n\t\t * request is sent. The callback may return the original URL, or a new URL to\n\t\t * override loading behavior. This behavior can be used to load assets from\n\t\t * .ZIP files, drag-and-drop APIs, and Data URIs.\n\t\t *\n\t\t * ```js\n\t\t * const blobs = {'fish.gltf': blob1, 'diffuse.png': blob2, 'normal.png': blob3};\n\t\t *\n\t\t * const manager = new THREE.LoadingManager();\n\t\t *\n\t\t * // Initialize loading manager with URL callback.\n\t\t * const objectURLs = [];\n\t\t * manager.setURLModifier( ( url ) => {\n\t\t *\n\t\t * \turl = URL.createObjectURL( blobs[ url ] );\n\t\t * \tobjectURLs.push( url );\n\t\t * \treturn url;\n\t\t *\n\t\t * } );\n\t\t *\n\t\t * // Load as usual, then revoke the blob URLs.\n\t\t * const loader = new GLTFLoader( manager );\n\t\t * loader.load( 'fish.gltf', (gltf) => {\n\t\t *\n\t\t * \tscene.add( gltf.scene );\n\t\t * \tobjectURLs.forEach( ( url ) => URL.revokeObjectURL( url ) );\n\t\t *\n\t\t * } );\n\t\t * ```\n\t\t *\n\t\t * @param {function(string):string} transform - URL modifier callback. Called with an URL and must return a resolved URL.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.setURLModifier = function ( transform ) {\n\n\t\t\turlModifier = transform;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Registers a loader with the given regular expression. Can be used to\n\t\t * define what loader should be used in order to load specific files. A\n\t\t * typical use case is to overwrite the default loader for textures.\n\t\t *\n\t\t * ```js\n\t\t * // add handler for TGA textures\n\t\t * manager.addHandler( /\\.tga$/i, new TGALoader() );\n\t\t * ```\n\t\t *\n\t\t * @param {string} regex - A regular expression.\n\t\t * @param {Loader} loader - A loader that should handle matched cases.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.addHandler = function ( regex, loader ) {\n\n\t\t\thandlers.push( regex, loader );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Removes the loader for the given regular expression.\n\t\t *\n\t\t * @param {string} regex - A regular expression.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.removeHandler = function ( regex ) {\n\n\t\t\tconst index = handlers.indexOf( regex );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\thandlers.splice( index, 2 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to retrieve the registered loader for the given file path.\n\t\t *\n\t\t * @param {string} file - The file path.\n\t\t * @return {?Loader} The registered loader. Returns `null` if no loader was found.\n\t\t */\n\t\tthis.getHandler = function ( file ) {\n\n\t\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tconst regex = handlers[ i ];\n\t\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to abort ongoing loading requests in loaders using this manager.\n\t\t * The abort only works if the loaders implement {@link Loader#abort} and `AbortSignal.any()`\n\t\t * is supported in the browser.\n\t\t *\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.abort = function () {\n\n\n\t\t\tthis.abortController.abort();\n\t\t\tthis._abortController = null;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}\n\n\t// TODO: Revert this back to a single member variable once this issue has been fixed\n\t// https://github.com/cloudflare/workerd/issues/3657\n\n\t/**\n\t * Used for aborting ongoing requests in loaders using this manager.\n\t *\n\t * @type {AbortController}\n\t */\n\tget abortController() {\n\n\t\tif ( ! this._abortController ) {\n\n\t\t\tthis._abortController = new AbortController();\n\n\t\t}\n\n\t\treturn this._abortController;\n\n\t}\n\n}\n\n/**\n * The global default loading manager.\n *\n * @constant\n * @type {LoadingManager}\n */\nconst DefaultLoadingManager = /*@__PURE__*/ new LoadingManager();\n\n/**\n * Abstract base class for loaders.\n *\n * @abstract\n */\nclass Loader {\n\n\t/**\n\t * Constructs a new loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\t/**\n\t\t * The loading manager.\n\t\t *\n\t\t * @type {LoadingManager}\n\t\t * @default DefaultLoadingManager\n\t\t */\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t/**\n\t\t * The crossOrigin string to implement CORS for loading the url from a\n\t\t * different domain that allows CORS.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'anonymous'\n\t\t */\n\t\tthis.crossOrigin = 'anonymous';\n\n\t\t/**\n\t\t * Whether the XMLHttpRequest uses credentials.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.withCredentials = false;\n\n\t\t/**\n\t\t * The base path from which the asset will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = '';\n\n\t\t/**\n\t\t * The base path from which additional resources like textures will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.resourcePath = '';\n\n\t\t/**\n\t\t * The [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header)\n\t\t * used in HTTP request.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.requestHeader = {};\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for loading assets from the backend.\n\t *\n\t * @abstract\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {Function} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t */\n\tload( /* url, onLoad, onProgress, onError */ ) {}\n\n\t/**\n\t * A async version of {@link Loader#load}.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @return {Promise} A Promise that resolves when the asset has been loaded.\n\t */\n\tloadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for parsing the asset into three.js entities.\n\t *\n\t * @abstract\n\t * @param {any} data - The data to parse.\n\t */\n\tparse( /* data */ ) {}\n\n\t/**\n\t * Sets the `crossOrigin` String to implement CORS for loading the URL\n\t * from a different domain that allows CORS.\n\t *\n\t * @param {string} crossOrigin - The `crossOrigin` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetCrossOrigin( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Whether the XMLHttpRequest uses credentials such as cookies, authorization\n\t * headers or TLS client certificates, see [XMLHttpRequest.withCredentials](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials).\n\t *\n\t * Note: This setting has no effect if you are loading files locally or from the same domain.\n\t *\n\t * @param {boolean} value - The `withCredentials` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetWithCredentials( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for the asset.\n\t *\n\t * @param {string} path - The base path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for dependent resources like textures.\n\t *\n\t * @param {string} resourcePath - The resource path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetResourcePath( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given request header.\n\t *\n\t * @param {Object} requestHeader - A [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header)\n\t * for configuring the HTTP request.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetRequestHeader( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method can be implemented in loaders for aborting ongoing requests.\n\t *\n\t * @abstract\n\t * @return {Loader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Callback for onProgress in loaders.\n *\n * @callback onProgressCallback\n * @param {ProgressEvent} event - An instance of `ProgressEvent` that represents the current loading status.\n */\n\n/**\n * Callback for onError in loaders.\n *\n * @callback onErrorCallback\n * @param {Error} error - The error which occurred during the loading process.\n */\n\n/**\n * The default material name that is used by loaders\n * when creating materials for loaded 3D objects.\n *\n * Note: Not all loaders might honor this setting.\n *\n * @static\n * @type {string}\n * @default '__DEFAULT'\n */\nLoader.DEFAULT_MATERIAL_NAME = '__DEFAULT';\n\nconst loading = {};\n\nclass HttpError extends Error {\n\n\tconstructor( message, response ) {\n\n\t\tsuper( message );\n\t\tthis.response = response;\n\n\t}\n\n}\n\n/**\n * A low level class for loading resources with the Fetch API, used internally by\n * most loaders. It can also be used directly to load any file type that does\n * not have a loader.\n *\n * This loader supports caching. If you want to use it, add `THREE.Cache.enabled = true;`\n * once to your application.\n *\n * ```js\n * const loader = new THREE.FileLoader();\n * const data = await loader.loadAsync( 'example.txt' );\n * ```\n *\n * @augments Loader\n */\nclass FileLoader extends Loader {\n\n\t/**\n\t * Constructs a new file loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * The expected mime type. Valid values can be found\n\t\t * [here](hhttps://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#mimetype)\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.mimeType = '';\n\n\t\t/**\n\t\t * The expected response type.\n\t\t *\n\t\t * @type {('arraybuffer'|'blob'|'document'|'json'|'')}\n\t\t * @default ''\n\t\t */\n\t\tthis.responseType = '';\n\n\t\t/**\n\t\t * Used for aborting requests.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController}\n\t\t */\n\t\tthis._abortController = new AbortController();\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded response to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(any)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t * @return {any|undefined} The cached resource if available.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst cached = Cache.get( `file:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tsetTimeout( () => {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Initialise array for duplicate requests\n\t\tloading[ url ] = [];\n\n\t\tloading[ url ].push( {\n\t\t\tonLoad: onLoad,\n\t\t\tonProgress: onProgress,\n\t\t\tonError: onError,\n\t\t} );\n\n\t\t// create request\n\t\tconst req = new Request( url, {\n\t\t\theaders: new Headers( this.requestHeader ),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin',\n\t\t\tsignal: ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal\n\t\t} );\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch( req )\n\t\t\t.then( response => {\n\n\t\t\t\tif ( response.status === 200 || response.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( response.status === 0 ) {\n\n\t\t\t\t\t\twarn( 'FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {\n\n\t\t\t\t\t\treturn response;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\t\tconst reader = response.body.getReader();\n\n\t\t\t\t\t// Nginx needs X-File-Size check\n\t\t\t\t\t// https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n\t\t\t\t\tconst contentLength = response.headers.get( 'X-File-Size' ) || response.headers.get( 'Content-Length' );\n\t\t\t\t\tconst total = contentLength ? parseInt( contentLength ) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream( {\n\t\t\t\t\t\tstart( controller ) {\n\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\n\t\t\t\t\t\t\t\treader.read().then( ( { done, value } ) => {\n\n\t\t\t\t\t\t\t\t\tif ( done ) {\n\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\t\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue( value );\n\t\t\t\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}, ( e ) => {\n\n\t\t\t\t\t\t\t\t\tcontroller.error( e );\n\n\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn new Response( stream );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new HttpError( `fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( response => {\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\treturn response.blob();\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then( text => {\n\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString( text, mimeType );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( mimeType === '' ) {\n\n\t\t\t\t\t\t\treturn response.text();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec( mimeType );\n\t\t\t\t\t\t\tconst label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder( label );\n\t\t\t\t\t\t\treturn response.arrayBuffer().then( ab => decoder.decode( ab ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( data => {\n\n\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\tCache.add( `file:${url}`, data );\n\n\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( data );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( err => {\n\n\t\t\t\t// Abort errors and other errors are handled the same\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tif ( callbacks === undefined ) {\n\n\t\t\t\t\t// When onLoad was called and url was deleted in `loading`\n\t\t\t\t\tthis.manager.itemError( url );\n\t\t\t\t\tthrow err;\n\n\t\t\t\t}\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t} )\n\t\t\t.finally( () => {\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\tthis.manager.itemStart( url );\n\n\t}\n\n\t/**\n\t * Sets the expected response type.\n\t *\n\t * @param {('arraybuffer'|'blob'|'document'|'json'|'')} value - The response type.\n\t * @return {FileLoader} A reference to this file loader.\n\t */\n\tsetResponseType( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the expected mime type of the loaded file.\n\t *\n\t * @param {string} value - The mime type.\n\t * @return {FileLoader} A reference to this file loader.\n\t */\n\tsetMimeType( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Aborts ongoing fetch requests.\n\t *\n\t * @return {FileLoader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\tthis._abortController.abort();\n\t\tthis._abortController = new AbortController();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Class for loading animation clips in the JSON format. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.AnimationLoader();\n * const animations = await loader.loadAsync( 'animations/animation.js' );\n * ```\n *\n * @augments Loader\n */\nclass AnimationLoader extends Loader {\n\n\t/**\n\t * Constructs a new animation loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded animations as an array\n\t * holding instances of {@link AnimationClip} to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Array)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns an array of animation clips.\n\t *\n\t * @param {Object} json - The serialized animation clips.\n\t * @return {Array} The parsed animation clips.\n\t */\n\tparse( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n}\n\n/**\n * Abstract base class for loading compressed texture formats S3TC, ASTC or ETC.\n * Textures are internally loaded via {@link FileLoader}.\n *\n * Derived classes have to implement the `parse()` method which holds the parsing\n * for the respective format.\n *\n * @abstract\n * @augments Loader\n */\nclass CompressedTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new compressed texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded compressed texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(CompressedTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CompressedTexture} The compressed texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.image = images;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\nconst _loading = new WeakMap();\n\n/**\n * A loader for loading images. The class loads images with the HTML `Image` API.\n *\n * ```js\n * const loader = new THREE.ImageLoader();\n * const image = await loader.loadAsync( 'image.png' );\n * ```\n * Please note that `ImageLoader` has dropped support for progress\n * events in `r84`. For an `ImageLoader` that supports progress events, see\n * [this thread](https://github.com/mrdoob/three.js/issues/10439#issuecomment-275785639).\n *\n * @augments Loader\n */\nclass ImageLoader extends Loader {\n\n\t/**\n\t * Constructs a new image loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded image\n\t * to the `onLoad()` callback. The method also returns a new `Image` object which can\n\t * directly be used for texture creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Image)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {Image} The image.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( `image:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tif ( cached.complete === true ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tlet arr = _loading.get( cached );\n\n\t\t\t\tif ( arr === undefined ) {\n\n\t\t\t\t\tarr = [];\n\t\t\t\t\t_loading.set( cached, arr );\n\n\t\t\t\t}\n\n\t\t\t\tarr.push( { onLoad, onError } );\n\n\t\t\t}\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = createElementNS( 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\t//\n\n\t\t\tconst callbacks = _loading.get( this ) || [];\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i ++ ) {\n\n\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\tif ( callback.onLoad ) callback.onLoad( this );\n\n\t\t\t}\n\n\t\t\t_loading.delete( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tCache.remove( `image:${url}` );\n\n\t\t\t//\n\n\t\t\tconst callbacks = _loading.get( this ) || [];\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i ++ ) {\n\n\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t}\n\n\t\t\t_loading.delete( this );\n\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.slice( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tCache.add( `image:${url}`, image );\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t}\n\n}\n\n/**\n * Class for loading cube textures. Images are internally loaded via {@link ImageLoader}.\n *\n * The loader returns an instance of {@link CubeTexture} and expects the cube map to\n * be defined as six separate images representing the sides of a cube. Other cube map definitions\n * like vertical and horizontal cross, column and row layouts are not supported.\n *\n * Note that, by convention, cube maps are specified in a coordinate system\n * in which positive-x is to the right when looking up the positive-z axis --\n * in other words, using a left-handed coordinate system. Since three.js uses\n * a right-handed coordinate system, environment maps used in three.js will\n * have pos-x and neg-x swapped.\n *\n * The loaded cube texture is in sRGB color space. Meaning {@link Texture#colorSpace}\n * is set to `SRGBColorSpace` by default.\n *\n * ```js\n * const loader = new THREE.CubeTextureLoader().setPath( 'textures/cubeMaps/' );\n * const cubeTexture = await loader.loadAsync( [\n * \t'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'\n * ] );\n * scene.background = cubeTexture;\n * ```\n *\n * @augments Loader\n */\nclass CubeTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new cube texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the fully loaded cube texture\n\t * to the `onLoad()` callback. The method also returns a new cube texture object which can\n\t * directly be used for material creation. If you do it this way, the cube texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {Array} urls - Array of 6 URLs to images, one for each side of the\n\t * cube texture. The urls should be specified in the following order: pos-x,\n\t * neg-x, pos-y, neg-y, pos-z, neg-z. An array of data URIs are allowed as well.\n\t * @param {function(CubeTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CubeTexture} The cube texture.\n\t */\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\t\ttexture.colorSpace = SRGBColorSpace;\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for loading binary texture formats RGBE, EXR or TGA.\n * Textures are internally loaded via {@link FileLoader}.\n *\n * Derived classes have to implement the `parse()` method which holds the parsing\n * for the respective format.\n *\n * @abstract\n * @augments Loader\n */\nclass DataTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new data texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded data texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(DataTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {DataTexture} The data texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tlet texData;\n\n\t\t\ttry {\n\n\t\t\t\ttexData = scope.parse( buffer );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) {\n\n\t\t\t\t\tonError( error );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = texData.colorSpace;\n\n\t\t\t}\n\n\t\t\tif ( texData.flipY !== undefined ) {\n\n\t\t\t\ttexture.flipY = texData.flipY;\n\n\t\t\t}\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\tif ( texData.generateMipmaps !== undefined ) {\n\n\t\t\t\ttexture.generateMipmaps = texData.generateMipmaps;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Class for loading textures. Images are internally\n * loaded via {@link ImageLoader}.\n *\n * ```js\n * const loader = new THREE.TextureLoader();\n * const texture = await loader.loadAsync( 'textures/land_ocean_ice_cloud_2048.jpg' );\n *\n * const material = new THREE.MeshBasicMaterial( { map:texture } );\n * ```\n * Please note that `TextureLoader` has dropped support for progress\n * events in `r84`. For a `TextureLoader` that supports progress events, see\n * [this thread](https://github.com/mrdoob/three.js/issues/10439#issuecomment-293260145).\n *\n * @augments Loader\n */\nclass TextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the fully loaded texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Texture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {Texture} The texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for lights - all other light types inherit the\n * properties and methods described here.\n *\n * @abstract\n * @augments Object3D\n */\nclass Light extends Object3D {\n\n\t/**\n\t * Constructs a new light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLight = true;\n\n\t\tthis.type = 'Light';\n\n\t\t/**\n\t\t * The light's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The light's intensity.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = intensity;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// Empty here in base class; some subclasses override.\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\t\tif ( this.target !== undefined ) data.object.target = this.target.uuid;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * A light source positioned directly above the scene, with color fading from\n * the sky color to the ground color.\n *\n * This light cannot be used to cast shadows.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass HemisphereLight extends Light {\n\n\t/**\n\t * Constructs a new hemisphere light.\n\t *\n\t * @param {(number|Color|string)} [skyColor=0xffffff] - The light's sky color.\n\t * @param {(number|Color|string)} [groundColor=0xffffff] - The light's ground color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( skyColor, groundColor, intensity ) {\n\n\t\tsuper( skyColor, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isHemisphereLight = true;\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The light's ground color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();\nconst _lookTarget$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * Abstract base class for light shadow classes. These classes\n * represent the shadow configuration for different light types.\n *\n * @abstract\n */\nclass LightShadow {\n\n\t/**\n\t * Constructs a new light shadow.\n\t *\n\t * @param {Camera} camera - The light's view of the world.\n\t */\n\tconstructor( camera ) {\n\n\t\t/**\n\t\t * The light's view of the world.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The intensity of the shadow. The default is `1`.\n\t\t * Valid values are in the range `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = 1;\n\n\t\t/**\n\t\t * Shadow map bias, how much to add or subtract from the normalized depth\n\t\t * when deciding whether a surface is in shadow.\n\t\t *\n\t\t * The default is `0`. Very tiny adjustments here (in the order of `0.0001`)\n\t\t * may help reduce artifacts in shadows.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.bias = 0;\n\n\t\t/**\n\t\t * Defines how much the position used to query the shadow map is offset along\n\t\t * the object normal. The default is `0`. Increasing this value can be used to\n\t\t * reduce shadow acne especially in large scenes where light shines onto\n\t\t * geometry at a shallow angle. The cost is that shadows may appear distorted.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.normalBias = 0;\n\n\t\t/**\n\t\t * Setting this to values greater than 1 will blur the edges of the shadow.\n\t\t * High values will cause unwanted banding effects in the shadows - a greater\n\t\t * map size will allow for a higher value to be used here before these effects\n\t\t * become visible.\n\t\t *\n\t\t * The property has no effect when the shadow map type is `PCFSoftShadowMap` and\n\t\t * and it is recommended to increase softness by decreasing the shadow map size instead.\n\t\t *\n\t\t * The property has no effect when the shadow map type is `BasicShadowMap`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = 1;\n\n\t\t/**\n\t\t * The amount of samples to use when blurring a VSM shadow map.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 8\n\t\t */\n\t\tthis.blurSamples = 8;\n\n\t\t/**\n\t\t * Defines the width and height of the shadow map. Higher values give better quality\n\t\t * shadows at the cost of computation time. Values must be powers of two.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (512,512)\n\t\t */\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\t/**\n\t\t * The type of shadow texture. The default is `UnsignedByteType`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.mapType = UnsignedByteType;\n\n\t\t/**\n\t\t * The depth map generated using the internal camera; a location beyond a\n\t\t * pixel's depth is in shadow. Computed internally during rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The distribution map generated using the internal camera; an occlusion is\n\t\t * calculated based on the distribution of depths. Computed internally during\n\t\t * rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.mapPass = null;\n\n\t\t/**\n\t\t * Model to shadow camera space, to compute location and depth in shadow map.\n\t\t * This is computed internally during rendering.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Enables automatic updates of the light's shadow. If you do not require dynamic\n\t\t * lighting / shadows, you may set this to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t\t/**\n\t\t * When set to `true`, shadow maps will be updated in the next `render` call.\n\t\t * If you have set {@link LightShadow#autoUpdate} to `false`, you will need to\n\t\t * set this property to `true` and then make a render call to update the light's shadow.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\t/**\n\t * Used internally by the renderer to get the number of viewports that need\n\t * to be rendered for this shadow.\n\t *\n\t * @return {number} The viewport count.\n\t */\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\t/**\n\t * Gets the shadow cameras frustum. Used internally by the renderer to cull objects.\n\t *\n\t * @return {Frustum} The shadow camera frustum.\n\t */\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\t/**\n\t * Update the matrices for the camera and shadow, used internally by the renderer.\n\t *\n\t * @param {Light} light - The light for which the shadow is being rendered.\n\t */\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld$1 );\n\n\t\t_lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget$1 );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix$1, shadowCamera.coordinateSystem, shadowCamera.reversedDepth );\n\n\t\tif ( shadowCamera.reversedDepth ) {\n\n\t\t\tshadowMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 1.0, 0.0,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tshadowMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t}\n\n\t\tshadowMatrix.multiply( _projScreenMatrix$1 );\n\n\t}\n\n\t/**\n\t * Returns a viewport definition for the given viewport index.\n\t *\n\t * @param {number} viewportIndex - The viewport index.\n\t * @return {Vector4} The viewport.\n\t */\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\t/**\n\t * Returns the frame extends.\n\t *\n\t * @return {Vector2} The frame extends.\n\t */\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Copies the values of the given light shadow instance to this instance.\n\t *\n\t * @param {LightShadow} source - The light shadow to copy.\n\t * @return {LightShadow} A reference to this light shadow instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.intensity = source.intensity;\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.needsUpdate = source.needsUpdate;\n\t\tthis.normalBias = source.normalBias;\n\t\tthis.blurSamples = source.blurSamples;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new light shadow instance with copied values from this instance.\n\t *\n\t * @return {LightShadow} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the light shadow into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized light shadow.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.intensity !== 1 ) object.intensity = this.intensity;\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass SpotLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new spot light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLightShadow = true;\n\n\t\t/**\n\t\t * Used to focus the shadow camera. The camera's field of view is set as a\n\t\t * percentage of the spotlight's field-of-view. Range is `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.focus = 1;\n\n\t\t/**\n\t\t * Texture aspect ratio.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = ( this.mapSize.width / this.mapSize.height ) * this.aspect;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tsuper.updateMatrices( light );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.focus = source.focus;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This light gets emitted from a single point in one direction, along a cone\n * that increases in size the further from the light it gets.\n *\n * This light can cast shadows - see the {@link SpotLightShadow} for details.\n *\n * ```js\n * // white spotlight shining from the side, modulated by a texture\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 100, 1000, 100 );\n * spotLight.map = new THREE.TextureLoader().load( url );\n *\n * spotLight.castShadow = true;\n * spotLight.shadow.mapSize.width = 1024;\n * spotLight.shadow.mapSize.height = 1024;\n * spotLight.shadow.camera.near = 500;\n * spotLight.shadow.camera.far = 4000;\n * spotLight.shadow.camera.fov = 30;s\n * ```\n *\n * @augments Light\n */\nclass SpotLight extends Light {\n\n\t/**\n\t * Constructs a new spot light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [angle=Math.PI/3] - Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t * @param {number} [penumbra=0] - Percent of the spotlight cone that is attenuated due to penumbra. Value range is `[0,1]`.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLight = true;\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The spot light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * Maximum range of the light. `0` means no limit.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI/3\n\t\t */\n\t\tthis.angle = angle;\n\n\t\t/**\n\t\t * Percent of the spotlight cone that is attenuated due to penumbra.\n\t\t * Value range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.penumbra = penumbra;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * A texture used to modulate the color of the light. The spot light\n\t\t * color is mixed with the RGB value of this texture, with a ratio\n\t\t * corresponding to its alpha value. The cookie-like masking effect is\n\t\t * reproduced using pixel values (0, 0, 0, 1-cookie_value).\n\t\t *\n\t\t * *Warning*: This property is disabled if {@link Object3D#castShadow} is set to `false`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {SpotLightShadow}\n\t\t */\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)\n\t\treturn this.intensity * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / Math.PI;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\n/**\n * Represents the shadow configuration of point lights.\n *\n * @augments LightShadow\n */\nclass PointLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new point light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLightShadow = true;\n\n\t\tthis._frameExtents = new Vector2( 4, 2 );\n\n\t\tthis._viewportCount = 6;\n\n\t\tthis._viewports = [\n\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t// following orientation:\n\t\t\t//\n\t\t\t// xzXZ\n\t\t\t// y Y\n\t\t\t//\n\t\t\t// X - Positive x direction\n\t\t\t// x - Negative x direction\n\t\t\t// Y - Positive y direction\n\t\t\t// y - Negative y direction\n\t\t\t// Z - Positive z direction\n\t\t\t// z - Negative z direction\n\n\t\t\t// positive X\n\t\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t\t// negative X\n\t\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t\t// positive Z\n\t\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t\t// negative Z\n\t\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t\t// positive Y\n\t\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t\t// negative Y\n\t\t\tnew Vector4( 1, 0, 1, 1 )\n\t\t];\n\n\t\tthis._cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( -1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, -1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, -1, 0 )\n\t\t];\n\n\t\tthis._cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, -1 )\n\t\t];\n\n\t}\n\n\t/**\n\t * Update the matrices for the camera and shadow, used internally by the renderer.\n\t *\n\t * @param {Light} light - The light for which the shadow is being rendered.\n\t * @param {number} [viewportIndex=0] - The viewport index.\n\t */\n\tupdateMatrices( light, viewportIndex = 0 ) {\n\n\t\tconst camera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( far !== camera.far ) {\n\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.copy( camera.position );\n\t\t_lookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( _lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );\n\n\t}\n\n}\n\n/**\n * A light that gets emitted from a single point in all directions. A common\n * use case for this is to replicate the light emitted from a bare\n * lightbulb.\n *\n * This light can cast shadows - see the {@link PointLightShadow} for details.\n *\n * ```js\n * const light = new THREE.PointLight( 0xff0000, 1, 100 );\n * light.position.set( 50, 50, 50 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass PointLight extends Light {\n\n\t/**\n\t * Constructs a new point light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLight = true;\n\n\t\tthis.type = 'PointLight';\n\n\t\t/**\n\t\t * When distance is zero, light will attenuate according to inverse-square\n\t\t * law to infinite distance. When distance is non-zero, light will attenuate\n\t\t * according to inverse-square law until near the distance cutoff, where it\n\t\t * will then attenuate quickly and smoothly to 0. Inherently, cutoffs are not\n\t\t * physically correct.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {PointLightShadow}\n\t\t */\n\t\tthis.shadow = new PointLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)\n\t\treturn this.intensity * 4 * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Camera that uses [orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection).\n *\n * In this projection mode, an object's size in the rendered image stays\n * constant regardless of its distance from the camera. This can be useful\n * for rendering 2D scenes and UI elements, amongst other things.\n *\n * ```js\n * const camera = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass OrthographicCamera extends Camera {\n\n\t/**\n\t * Constructs a new orthographic camera.\n\t *\n\t * @param {number} [left=-1] - The left plane of the camera's frustum.\n\t * @param {number} [right=1] - The right plane of the camera's frustum.\n\t * @param {number} [top=1] - The top plane of the camera's frustum.\n\t * @param {number} [bottom=-1] - The bottom plane of the camera's frustum.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isOrthographicCamera = true;\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * The left plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.left = left;\n\n\t\t/**\n\t\t * The right plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.right = right;\n\n\t\t/**\n\t\t * The top plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.top = top;\n\n\t\t/**\n\t\t * The bottom plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.bottom = bottom;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link OrthographicCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link PerspectiveCamera}, `0` is a\n\t\t * valid value for an orthographic camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link OrthographicCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t * @see {@link PerspectiveCamera#setViewOffset}\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far, this.coordinateSystem, this.reversedDepth );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass DirectionalLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new directional light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new OrthographicCamera( -5, 5, 5, -5, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLightShadow = true;\n\n\t}\n\n}\n\n/**\n * A light that gets emitted in a specific direction. This light will behave\n * as though it is infinitely far away and the rays produced from it are all\n * parallel. The common use case for this is to simulate daylight; the sun is\n * far enough away that its position can be considered to be infinite, and\n * all light rays coming from it are parallel.\n *\n * A common point of confusion for directional lights is that setting the\n * rotation has no effect. This is because three.js's DirectionalLight is the\n * equivalent to what is often called a 'Target Direct Light' in other\n * applications.\n *\n * This means that its direction is calculated as pointing from the light's\n * {@link Object3D#position} to the {@link DirectionalLight#target} position\n * (as opposed to a 'Free Direct Light' that just has a rotation\n * component).\n *\n * This light can cast shadows - see the {@link DirectionalLightShadow} for details.\n *\n * ```js\n * // White directional light at half intensity shining from the top.\n * const directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );\n * scene.add( directionalLight );\n * ```\n *\n * @augments Light\n */\nclass DirectionalLight extends Light {\n\n\t/**\n\t * Constructs a new directional light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLight = true;\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The directional light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {DirectionalLightShadow}\n\t\t */\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.target = source.target.clone();\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This light globally illuminates all objects in the scene equally.\n *\n * It cannot be used to cast shadows as it does not have a direction.\n *\n * ```js\n * const light = new THREE.AmbientLight( 0x404040 ); // soft white light\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass AmbientLight extends Light {\n\n\t/**\n\t * Constructs a new ambient light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAmbientLight = true;\n\n\t\tthis.type = 'AmbientLight';\n\n\t}\n\n}\n\n/**\n * This class emits light uniformly across the face a rectangular plane.\n * This light type can be used to simulate light sources such as bright\n * windows or strip lighting.\n *\n * Important Notes:\n *\n * - There is no shadow support.\n * - Only PBR materials are supported.\n * - You have to include `RectAreaLightUniformsLib` (`WebGLRenderer`) or `RectAreaLightTexturesLib` (`WebGPURenderer`)\n * into your app and init the uniforms/textures.\n *\n * ```js\n * RectAreaLightUniformsLib.init(); // only relevant for WebGLRenderer\n * THREE.RectAreaLightNode.setLTC( RectAreaLightTexturesLib.init() ); // only relevant for WebGPURenderer\n *\n * const intensity = 1; const width = 10; const height = 10;\n * const rectLight = new THREE.RectAreaLight( 0xffffff, intensity, width, height );\n * rectLight.position.set( 5, 5, 0 );\n * rectLight.lookAt( 0, 0, 0 );\n * scene.add( rectLight )\n * ```\n *\n * @augments Light\n */\nclass RectAreaLight extends Light {\n\n\t/**\n\t * Constructs a new area light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t * @param {number} [width=10] - The width of the light.\n\t * @param {number} [height=10] - The height of the light.\n\t */\n\tconstructor( color, intensity, width = 10, height = 10 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRectAreaLight = true;\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\t/**\n\t\t * The width of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.height = height;\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( this.width * this.height * Math.PI );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents a third-order spherical harmonics (SH). Light probes use this class\n * to encode lighting information.\n *\n * - Primary reference: {@link https://graphics.stanford.edu/papers/envmap/envmap.pdf}\n * - Secondary reference: {@link https://www.ppsloan.org/publications/StupidSH36.pdf}\n */\nclass SphericalHarmonics3 {\n\n\t/**\n\t * Constructs a new spherical harmonics.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphericalHarmonics3 = true;\n\n\t\t/**\n\t\t * An array holding the (9) SH coefficients.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given SH coefficients to this instance by copying\n\t * the values.\n\t *\n\t * @param {Array} coefficients - The SH coefficients.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets all SH coefficients to `0`.\n\t *\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the radiance in the direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The radiance.\n\t */\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the irradiance (radiance convolved with cosine lobe) in the\n\t * direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The irradiance.\n\t */\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Adds the given SH to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * A convenience method for performing {@link SphericalHarmonics3#add} and\n\t * {@link SphericalHarmonics3#scale} at once.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this SH by the given scale factor.\n\t *\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linear interpolates between the given SH and this instance by the given\n\t * alpha factor.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to interpolate with.\n\t * @param {number} alpha - The alpha factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this spherical harmonics is equal with the given one.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to test for equality.\n\t * @return {boolean} Whether this spherical harmonics is equal with the given one.\n\t */\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical harmonics to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to copy.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\t/**\n\t * Returns a new spherical harmonics with copied values from this instance.\n\t *\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Sets the SH coefficients of this instance from the given array.\n\t *\n\t * @param {Array} array - An array holding the SH coefficients.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns an array with the SH coefficients, or copies them into the provided\n\t * array. The coefficients are represented as numbers.\n\t *\n\t * @param {Array} [array=[]] - The target array.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {Array} An array with flat SH coefficients.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Computes the SH basis for the given normal vector.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Array} shBasis - The target array holding the SH basis.\n\t */\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\n/**\n * Light probes are an alternative way of adding light to a 3D scene. Unlike\n * classical light sources (e.g. directional, point or spot lights), light\n * probes do not emit light. Instead they store information about light\n * passing through 3D space. During rendering, the light that hits a 3D\n * object is approximated by using the data from the light probe.\n *\n * Light probes are usually created from (radiance) environment maps. The\n * class {@link LightProbeGenerator} can be used to create light probes from\n * cube textures or render targets. However, light estimation data could also\n * be provided in other forms e.g. by WebXR. This enables the rendering of\n * augmented reality content that reacts to real world lighting.\n *\n * The current probe implementation in three.js supports so-called diffuse\n * light probes. This type of light probe is functionally equivalent to an\n * irradiance environment map.\n *\n * @augments Light\n */\nclass LightProbe extends Light {\n\n\t/**\n\t * Constructs a new light probe.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics which represents encoded lighting information.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( sh = new SphericalHarmonics3(), intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLightProbe = true;\n\n\t\t/**\n\t\t * A light probe uses spherical harmonics to encode lighting information.\n\t\t *\n\t\t * @type {SphericalHarmonics3}\n\t\t */\n\t\tthis.sh = sh;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deserializes the light prove from the given JSON.\n\t *\n\t * @param {Object} json - The JSON holding the serialized light probe.\n\t * @return {LightProbe} A reference to this light probe.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();\n\t\tthis.sh.fromArray( json.sh );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Class for loading geometries. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.MaterialLoader();\n * const material = await loader.loadAsync( 'material.json' );\n * ```\n * This loader does not support node materials. Use {@link NodeMaterialLoader} instead.\n *\n * @augments Loader\n */\nclass MaterialLoader extends Loader {\n\n\t/**\n\t * Constructs a new material loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * A dictionary holding textures used by the material.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.textures = {};\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded material to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Material)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns a material.\n\t *\n\t * @param {Object} json - The serialized material.\n\t * @return {Material} The parsed material.\n\t */\n\tparse( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\twarn( 'MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tconst material = this.createMaterialFromType( json.type );\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = json.sheen;\n\t\tif ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );\n\t\tif ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;\n\t\tif ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.dispersion !== undefined ) material.dispersion = json.dispersion;\n\t\tif ( json.iridescence !== undefined ) material.iridescence = json.iridescence;\n\t\tif ( json.iridescenceIOR !== undefined ) material.iridescenceIOR = json.iridescenceIOR;\n\t\tif ( json.iridescenceThicknessRange !== undefined ) material.iridescenceThicknessRange = json.iridescenceThicknessRange;\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.thickness !== undefined ) material.thickness = json.thickness;\n\t\tif ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;\n\t\tif ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );\n\t\tif ( json.anisotropy !== undefined ) material.anisotropy = json.anisotropy;\n\t\tif ( json.anisotropyRotation !== undefined ) material.anisotropyRotation = json.anisotropyRotation;\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.alphaHash !== undefined ) material.alphaHash = json.alphaHash;\n\t\tif ( json.depthFunc !== undefined ) material.depthFunc = json.depthFunc;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\tif ( json.blendSrc !== undefined ) material.blendSrc = json.blendSrc;\n\t\tif ( json.blendDst !== undefined ) material.blendDst = json.blendDst;\n\t\tif ( json.blendEquation !== undefined ) material.blendEquation = json.blendEquation;\n\t\tif ( json.blendSrcAlpha !== undefined ) material.blendSrcAlpha = json.blendSrcAlpha;\n\t\tif ( json.blendDstAlpha !== undefined ) material.blendDstAlpha = json.blendDstAlpha;\n\t\tif ( json.blendEquationAlpha !== undefined ) material.blendEquationAlpha = json.blendEquationAlpha;\n\t\tif ( json.blendColor !== undefined && material.blendColor !== undefined ) material.blendColor.setHex( json.blendColor );\n\t\tif ( json.blendAlpha !== undefined ) material.blendAlpha = json.blendAlpha;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== undefined ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;\n\t\tif ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;\n\t\tif ( json.forceSinglePass !== undefined ) material.forceSinglePass = json.forceSinglePass;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\tif ( json.glslVersion !== undefined ) material.glslVersion = json.glslVersion;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.lights !== undefined ) material.lights = json.lights;\n\t\tif ( json.clipping !== undefined ) material.clipping = json.clipping;\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\t\tif ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );\n\t\tif ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapRotation !== undefined ) material.envMapRotation.fromArray( json.envMapRotation );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.iridescenceMap !== undefined ) material.iridescenceMap = getTexture( json.iridescenceMap );\n\t\tif ( json.iridescenceThicknessMap !== undefined ) material.iridescenceThicknessMap = getTexture( json.iridescenceThicknessMap );\n\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\t\tif ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );\n\n\t\tif ( json.anisotropyMap !== undefined ) material.anisotropyMap = getTexture( json.anisotropyMap );\n\n\t\tif ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );\n\t\tif ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );\n\n\t\treturn material;\n\n\t}\n\n\t/**\n\t * Textures are not embedded in the material JSON so they have\n\t * to be injected before the loading process starts.\n\t *\n\t * @param {Object} value - A dictionary holding textures for material properties.\n\t * @return {MaterialLoader} A reference to this material loader.\n\t */\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a material for the given type.\n\t *\n\t * @param {string} type - The material type.\n\t * @return {Material} The new material.\n\t */\n\tcreateMaterialFromType( type ) {\n\n\t\treturn MaterialLoader.createMaterialFromType( type );\n\n\t}\n\n\t/**\n\t * Creates a material for the given type.\n\t *\n\t * @static\n\t * @param {string} type - The material type.\n\t * @return {Material} The new material.\n\t */\n\tstatic createMaterialFromType( type ) {\n\n\t\tconst materialLib = {\n\t\t\tShadowMaterial,\n\t\t\tSpriteMaterial,\n\t\t\tRawShaderMaterial,\n\t\t\tShaderMaterial,\n\t\t\tPointsMaterial,\n\t\t\tMeshPhysicalMaterial,\n\t\t\tMeshStandardMaterial,\n\t\t\tMeshPhongMaterial,\n\t\t\tMeshToonMaterial,\n\t\t\tMeshNormalMaterial,\n\t\t\tMeshLambertMaterial,\n\t\t\tMeshDepthMaterial,\n\t\t\tMeshDistanceMaterial,\n\t\t\tMeshBasicMaterial,\n\t\t\tMeshMatcapMaterial,\n\t\t\tLineDashedMaterial,\n\t\t\tLineBasicMaterial,\n\t\t\tMaterial\n\t\t};\n\n\t\treturn new materialLib[ type ]();\n\n\t}\n\n}\n\n/**\n * A class with loader utility functions.\n */\nclass LoaderUtils {\n\n\t/**\n\t * Extracts the base URL from the given URL.\n\t *\n\t * @param {string} url -The URL to extract the base URL from.\n\t * @return {string} The extracted base URL.\n\t */\n\tstatic extractUrlBase( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === -1 ) return './';\n\n\t\treturn url.slice( 0, index + 1 );\n\n\t}\n\n\t/**\n\t * Resolves relative URLs against the given path. Absolute paths, data urls,\n\t * and blob URLs will be returned as is. Invalid URLs will return an empty\n\t * string.\n\t *\n\t * @param {string} url -The URL to resolve.\n\t * @param {string} path - The base path for relative URLs to be resolved against.\n\t * @return {string} The resolved URL.\n\t */\n\tstatic resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n}\n\n/**\n * An instanced version of a geometry.\n */\nclass InstancedBufferGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new instanced buffer geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedBufferGeometry = true;\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\n\t\t/**\n\t\t * The instance count.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.instanceCount = Infinity;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Class for loading geometries. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.BufferGeometryLoader();\n * const geometry = await loader.loadAsync( 'models/json/pressure.json' );\n *\n * const material = new THREE.MeshBasicMaterial( { color: 0xF5F5F5 } );\n * const object = new THREE.Mesh( geometry, material );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n */\nclass BufferGeometryLoader extends Loader {\n\n\t/**\n\t * Constructs a new geometry loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded geometry to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns a geometry.\n\t *\n\t * @param {Object} json - The serialized geometry.\n\t * @return {BufferGeometry} The parsed geometry.\n\t */\n\tparse( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tif ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );\n\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tgeometry.boundingSphere = new Sphere().fromJSON( boundingSphere );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * A loader for loading a JSON resource in the [JSON Object/Scene format](https://github.com/mrdoob/three.js/wiki/JSON-Object-Scene-format-4).\n * The files are internally loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.ObjectLoader();\n * const obj = await loader.loadAsync( 'models/json/example.json' );\n * scene.add( obj );\n *\n * // Alternatively, to parse a previously loaded JSON structure\n * const object = await loader.parseAsync( a_json_object );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n */\nclass ObjectLoader extends Loader {\n\n\t/**\n\t * Constructs a new object loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded 3D object to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Object3D)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\terror( 'ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( new Error( 'THREE.ObjectLoader: Can\\'t load ' + url ) );\n\n\t\t\t\terror( 'ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Async version of {@link ObjectLoader#load}.\n\t *\n\t * @async\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @return {Promise} A Promise that resolves with the loaded 3D object.\n\t */\n\tasync loadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await loader.loadAsync( url, onProgress );\n\n\t\tconst json = JSON.parse( text );\n\n\t\tconst metadata = json.metadata;\n\n\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\tthrow new Error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\n\t\t}\n\n\t\treturn await scope.parseAsync( json );\n\n\t}\n\n\t/**\n\t * Parses the given JSON. This is used internally by {@link ObjectLoader#load}\n\t * but can also be used directly to parse a previously loaded JSON structure.\n\t *\n\t * @param {Object} json - The serialized 3D object.\n\t * @param {onLoad} onLoad - Executed when all resources (e.g. textures) have been fully loaded.\n\t * @return {Object3D} The parsed 3D object.\n\t */\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ].data instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\t/**\n\t * Async version of {@link ObjectLoader#parse}.\n\t *\n\t * @param {Object} json - The serialized 3D object.\n\t * @return {Promise} A Promise that resolves with the parsed 3D object.\n\t */\n\tasync parseAsync( json ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = await this.parseImagesAsync( json.images );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\treturn object;\n\n\t}\n\n\t// internals\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( data.type in Geometries ) {\n\n\t\t\t\t\t\t\tgeometry = Geometries[ data.type ].fromJSON( data, shapes );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\twarn( `ObjectLoader: Unsupported geometry type \"${ data.type }\"` );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t}\n\n\tparseMaterials( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tasync parseImagesAsync( json ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tloader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\twarn( 'ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tconst source = images[ data.image ];\n\t\t\t\tconst image = source.data;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\t\t\t\tif ( data.channel !== undefined ) texture.channel = data.channel;\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.internalFormat !== undefined ) texture.internalFormat = data.internalFormat;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.colorSpace !== undefined ) texture.colorSpace = data.colorSpace;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.generateMipmaps !== undefined ) texture.generateMipmaps = data.generateMipmaps;\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\t\t\t\tif ( data.compareFunction !== undefined ) texture.compareFunction = data.compareFunction;\n\n\t\t\t\tif ( data.userData !== undefined ) texture.userData = data.userData;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tparseObject( data, geometries, materials, textures, animations ) {\n\n\t\tlet object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\twarn( 'ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tfunction getTexture( uuid ) {\n\n\t\t\tif ( textures[ uuid ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined texture', uuid );\n\n\t\t\t}\n\n\t\t\treturn textures[ uuid ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.background = getTexture( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.environment !== undefined ) {\n\n\t\t\t\t\tobject.environment = getTexture( data.environment );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.fog.name !== '' ) {\n\n\t\t\t\t\t\tobject.fog.name = data.fog.name;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.backgroundBlurriness !== undefined ) object.backgroundBlurriness = data.backgroundBlurriness;\n\t\t\t\tif ( data.backgroundIntensity !== undefined ) object.backgroundIntensity = data.backgroundIntensity;\n\t\t\t\tif ( data.backgroundRotation !== undefined ) object.backgroundRotation.fromArray( data.backgroundRotation );\n\n\t\t\t\tif ( data.environmentIntensity !== undefined ) object.environmentIntensity = data.environmentIntensity;\n\t\t\t\tif ( data.environmentRotation !== undefined ) object.environmentRotation.fromArray( data.environmentRotation );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tobject = new LightProbe().fromJSON( data );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\t\t\t\tif ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'BatchedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new BatchedMesh( data.maxInstanceCount, data.maxVertexCount, data.maxIndexCount, material );\n\t\t\t\tobject.geometry = geometry;\n\t\t\t\tobject.perObjectFrustumCulled = data.perObjectFrustumCulled;\n\t\t\t\tobject.sortObjects = data.sortObjects;\n\n\t\t\t\tobject._drawRanges = data.drawRanges;\n\t\t\t\tobject._reservedRanges = data.reservedRanges;\n\n\t\t\t\tobject._geometryInfo = data.geometryInfo.map( info => {\n\n\t\t\t\t\tlet box = null;\n\t\t\t\t\tlet sphere = null;\n\t\t\t\t\tif ( info.boundingBox !== undefined ) {\n\n\t\t\t\t\t\tbox = new Box3().fromJSON( info.boundingBox );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( info.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\tsphere = new Sphere().fromJSON( info.boundingSphere );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...info,\n\t\t\t\t\t\tboundingBox: box,\n\t\t\t\t\t\tboundingSphere: sphere\n\t\t\t\t\t};\n\n\t\t\t\t} );\n\t\t\t\tobject._instanceInfo = data.instanceInfo;\n\n\t\t\t\tobject._availableInstanceIds = data._availableInstanceIds;\n\t\t\t\tobject._availableGeometryIds = data._availableGeometryIds;\n\n\t\t\t\tobject._nextIndexStart = data.nextIndexStart;\n\t\t\t\tobject._nextVertexStart = data.nextVertexStart;\n\t\t\t\tobject._geometryCount = data.geometryCount;\n\n\t\t\t\tobject._maxInstanceCount = data.maxInstanceCount;\n\t\t\t\tobject._maxVertexCount = data.maxVertexCount;\n\t\t\t\tobject._maxIndexCount = data.maxIndexCount;\n\n\t\t\t\tobject._geometryInitialized = data.geometryInitialized;\n\n\t\t\t\tobject._matricesTexture = getTexture( data.matricesTexture.uuid );\n\n\t\t\t\tobject._indirectTexture = getTexture( data.indirectTexture.uuid );\n\n\t\t\t\tif ( data.colorsTexture !== undefined ) {\n\n\t\t\t\t\tobject._colorsTexture = getTexture( data.colorsTexture.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.boundingSphere !== undefined ) {\n\n\t\t\t\t\tobject.boundingSphere = new Sphere().fromJSON( data.boundingSphere );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.boundingBox !== undefined ) {\n\n\t\t\t\t\tobject.boundingBox = new Box3().fromJSON( data.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.up !== undefined ) object.up.fromArray( data.up );\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.intensity !== undefined ) object.shadow.intensity = data.shadow.intensity;\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance, level.hysteresis );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tbindLightTargets( object ) {\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isDirectionalLight || child.isSpotLight ) {\n\n\t\t\t\tconst uuid = child.target;\n\n\t\t\t\tconst target = object.getObjectByProperty( 'uuid', uuid );\n\n\t\t\t\tif ( target !== undefined ) {\n\n\t\t\t\t\tchild.target = target;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.target = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nconst _errorMap = new WeakMap();\n\n/**\n * A loader for loading images as an [ImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap).\n * An `ImageBitmap` provides an asynchronous and resource efficient pathway to prepare\n * textures for rendering.\n *\n * Note that {@link Texture#flipY} and {@link Texture#premultiplyAlpha} are ignored with image bitmaps.\n * They needs these configuration on bitmap creation unlike regular images need them on uploading to GPU.\n *\n * You need to set the equivalent options via {@link ImageBitmapLoader#setOptions} instead.\n *\n * Also note that unlike {@link FileLoader}, this loader avoids multiple concurrent requests to the same URL only if `Cache` is enabled.\n *\n * ```js\n * const loader = new THREE.ImageBitmapLoader();\n * loader.setOptions( { imageOrientation: 'flipY' } ); // set options if needed\n * const imageBitmap = await loader.loadAsync( 'image.png' );\n *\n * const texture = new THREE.Texture( imageBitmap );\n * texture.needsUpdate = true;\n * ```\n *\n * @augments Loader\n */\nclass ImageBitmapLoader extends Loader {\n\n\t/**\n\t * Constructs a new image bitmap loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isImageBitmapLoader = true;\n\n\t\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\t\twarn( 'ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t\t}\n\n\t\tif ( typeof fetch === 'undefined' ) {\n\n\t\t\twarn( 'ImageBitmapLoader: fetch() not supported.' );\n\n\t\t}\n\n\t\t/**\n\t\t * Represents the loader options.\n\t\t *\n\t\t * @type {Object}\n\t\t * @default {premultiplyAlpha:'none'}\n\t\t */\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\n\t\t/**\n\t\t * Used for aborting requests.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController}\n\t\t */\n\t\tthis._abortController = new AbortController();\n\n\t}\n\n\t/**\n\t * Sets the given loader options. The structure of the object must match the `options` parameter of\n\t * [createImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/Window/createImageBitmap).\n\t *\n\t * @param {Object} options - The loader options to set.\n\t * @return {ImageBitmapLoader} A reference to this image bitmap loader.\n\t */\n\tsetOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded image bitmap to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(ImageBitmap)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {ImageBitmap|undefined} The image bitmap.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( `image-bitmap:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\t// If cached is a promise, wait for it to resolve\n\t\t\tif ( cached.then ) {\n\n\t\t\t\tcached.then( imageBitmap => {\n\n\t\t\t\t\t// check if there is an error for the cached promise\n\n\t\t\t\t\tif ( _errorMap.has( cached ) === true ) {\n\n\t\t\t\t\t\tif ( onError ) onError( _errorMap.get( cached ) );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t\treturn imageBitmap;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// If cached is not a promise (i.e., it's already an imageBitmap)\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\t\tfetchOptions.signal = ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal;\n\n\t\tconst promise = fetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( `image-bitmap:${url}`, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t\treturn imageBitmap;\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\t_errorMap.set( promise, e );\n\n\t\t\tCache.remove( `image-bitmap:${url}` );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tCache.add( `image-bitmap:${url}`, promise );\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n\t/**\n\t * Aborts ongoing fetch requests.\n\t *\n\t * @return {ImageBitmapLoader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\tthis._abortController.abort();\n\t\tthis._abortController = new AbortController();\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _context;\n\n/**\n * Manages the global audio context in the engine.\n *\n * @hideconstructor\n */\nclass AudioContext {\n\n\t/**\n\t * Returns the global native audio context.\n\t *\n\t * @return {AudioContext} The native audio context.\n\t */\n\tstatic getContext() {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t}\n\n\t/**\n\t * Allows to set the global native audio context from outside.\n\t *\n\t * @param {AudioContext} value - The native context to set.\n\t */\n\tstatic setContext( value ) {\n\n\t\t_context = value;\n\n\t}\n\n}\n\n/**\n * Class for loading audio buffers. Audios are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const audioListener = new THREE.AudioListener();\n * const ambientSound = new THREE.Audio( audioListener );\n *\n * const loader = new THREE.AudioLoader();\n * const audioBuffer = await loader.loadAsync( 'audio/ambient_ocean.ogg' );\n *\n * ambientSound.setBuffer( audioBuffer );\n * ambientSound.play();\n * ```\n *\n * @augments Loader\n */\nclass AudioLoader extends Loader {\n\n\t/**\n\t * Constructs a new audio loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded audio buffer\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(AudioBuffer)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} ).catch( handleError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\thandleError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\tfunction handleError( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\terror( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\n\t\t}\n\n\t}\n\n}\n\nconst _eyeRight = /*@__PURE__*/ new Matrix4();\nconst _eyeLeft = /*@__PURE__*/ new Matrix4();\nconst _projectionMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * A special type of camera that uses two perspective cameras with\n * stereoscopic projection. Can be used for rendering stereo effects\n * like [3D Anaglyph](https://en.wikipedia.org/wiki/Anaglyph_3D) or\n * [Parallax Barrier](https://en.wikipedia.org/wiki/parallax_barrier).\n */\nclass StereoCamera {\n\n\t/**\n\t * Constructs a new stereo camera.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'StereoCamera';\n\n\t\t/**\n\t\t * The aspect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t\t/**\n\t\t * The eye separation which represents the distance\n\t\t * between the left and right camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.064\n\t\t */\n\t\tthis.eyeSep = 0.064;\n\n\t\t/**\n\t\t * The camera representing the left eye. This is added to layer `1` so objects to be\n\t\t * rendered by the left camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The camera representing the right eye. This is added to layer `2` so objects to be\n\t\t * rendered by the right camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t\tthis._cache = {\n\t\t\tfocus: null,\n\t\t\tfov: null,\n\t\t\taspect: null,\n\t\t\tnear: null,\n\t\t\tfar: null,\n\t\t\tzoom: null,\n\t\t\teyeSep: null\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the stereo camera based on the given perspective camera.\n\t *\n\t * @param {PerspectiveCamera} camera - The perspective camera.\n\t */\n\tupdate( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy( camera.projectionMatrix );\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( _projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( _projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n}\n\n/**\n * This type of camera can be used in order to efficiently render a scene with a\n * predefined set of cameras. This is an important performance aspect for\n * rendering VR scenes.\n *\n * An instance of `ArrayCamera` always has an array of sub cameras. It's mandatory\n * to define for each sub camera the `viewport` property which determines the\n * part of the viewport that is rendered with this camera.\n *\n * @augments PerspectiveCamera\n */\nclass ArrayCamera extends PerspectiveCamera {\n\n\t/**\n\t * Constructs a new array camera.\n\t *\n\t * @param {Array} [array=[]] - An array of perspective sub cameras.\n\t */\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArrayCamera = true;\n\n\t\t/**\n\t\t * Whether this camera is used with multiview rendering or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isMultiViewCamera = false;\n\n\t\t/**\n\t\t * An array of perspective sub cameras.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\n/**\n * Class for keeping track of time.\n */\nclass Clock {\n\n\t/**\n\t * Constructs a new clock.\n\t *\n\t * @param {boolean} [autoStart=true] - Whether to automatically start the clock when\n\t * `getDelta()` is called for the first time.\n\t */\n\tconstructor( autoStart = true ) {\n\n\t\t/**\n\t\t * If set to `true`, the clock starts automatically when `getDelta()` is called\n\t\t * for the first time.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoStart = autoStart;\n\n\t\t/**\n\t\t * Holds the time at which the clock's `start()` method was last called.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.startTime = 0;\n\n\t\t/**\n\t\t * Holds the time at which the clock's `start()`, `getElapsedTime()` or\n\t\t * `getDelta()` methods were last called.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.oldTime = 0;\n\n\t\t/**\n\t\t * Keeps track of the total time that the clock has been running.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.elapsedTime = 0;\n\n\t\t/**\n\t\t * Whether the clock is running or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.running = false;\n\n\t}\n\n\t/**\n\t * Starts the clock. When `autoStart` is set to `true`, the method is automatically\n\t * called by the class.\n\t */\n\tstart() {\n\n\t\tthis.startTime = performance.now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\t/**\n\t * Stops the clock.\n\t */\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time.\n\t */\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\t/**\n\t * Returns the delta time in seconds.\n\t *\n\t * @return {number} The delta time.\n\t */\n\tgetDelta() {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = performance.now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n}\n\nconst _position$1 = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\n\nconst _forward = /*@__PURE__*/ new Vector3();\nconst _up = /*@__PURE__*/ new Vector3();\n\n/**\n * The class represents a virtual listener of the all positional and non-positional audio effects\n * in the scene. A three.js application usually creates a single listener. It is a mandatory\n * constructor parameter for audios entities like {@link Audio} and {@link PositionalAudio}.\n *\n * In most cases, the listener object is a child of the camera. So the 3D transformation of the\n * camera represents the 3D transformation of the listener.\n *\n * @augments Object3D\n */\nclass AudioListener extends Object3D {\n\n\t/**\n\t * Constructs a new audio listener.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\t/**\n\t\t * The native audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = AudioContext.getContext();\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\t/**\n\t\t * An optional filter.\n\t\t *\n\t\t * Defined via {@link AudioListener#setFilter}.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.filter = null;\n\n\t\t/**\n\t\t * Time delta values required for `linearRampToValueAtTime()` usage.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\t/**\n\t * Returns the listener's input node.\n\t *\n\t * This method is used by other audio nodes to connect to this listener.\n\t *\n\t * @return {GainNode} The input node.\n\t */\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Removes the current filter from this listener.\n\t *\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tremoveFilter() {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filter.\n\t *\n\t * @return {?AudioNode} The filter.\n\t */\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\t/**\n\t * Sets the given filter to this listener.\n\t *\n\t * @param {AudioNode} value - The filter to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetFilter( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the applications master volume.\n\t *\n\t * @return {number} The master volume.\n\t */\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the applications master volume. This volume setting affects\n\t * all audio nodes in the scene.\n\t *\n\t * @param {number} value - The master volume to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );\n\n\t\t// the initial forward and up directions must be orthogonal\n\t\t_forward.set( 0, 0, -1 ).applyQuaternion( _quaternion$1 );\n\t\t_up.set( 0, 1, 0 ).applyQuaternion( _quaternion$1 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$1.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$1.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _forward.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _forward.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _forward.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( _up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( _up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( _up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$1.x, _position$1.y, _position$1.z );\n\t\t\tlistener.setOrientation( _forward.x, _forward.y, _forward.z, _up.x, _up.y, _up.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a non-positional ( global ) audio object.\n *\n * This and related audio modules make use of the [Web Audio API](https://www.w3.org/TR/webaudio-1.1/).\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create a global audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop( true );\n * \tsound.setVolume( 0.5 );\n * \tsound.play();\n * });\n * ```\n *\n * @augments Object3D\n */\nclass Audio extends Object3D {\n\n\t/**\n\t * Constructs a new audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AudioListener}\n\t\t * @readonly\n\t\t */\n\t\tthis.listener = listener;\n\n\t\t/**\n\t\t * The audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = listener.context;\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\t/**\n\t\t * Whether to start playback automatically or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoplay = false;\n\n\t\t/**\n\t\t * A reference to an audio buffer.\n\t\t *\n\t\t * Defined via {@link Audio#setBuffer}.\n\t\t *\n\t\t * @type {?AudioBuffer}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.buffer = null;\n\n\t\t/**\n\t\t * Modify pitch, measured in cents. +/- 100 is a semitone.\n\t\t * +/- 1200 is an octave.\n\t\t *\n\t\t * Defined via {@link Audio#setDetune}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.detune = 0;\n\n\t\t/**\n\t\t * Whether the audio should loop or not.\n\t\t *\n\t\t * Defined via {@link Audio#setLoop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.loop = false;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * start, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopStart = 0;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * stop, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopEnd = 0;\n\n\t\t/**\n\t\t * An offset to the time within the audio buffer the playback\n\t\t * should begin, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.offset = 0;\n\n\t\t/**\n\t\t * Overrides the default duration of the audio.\n\t\t *\n\t\t * @type {undefined|number}\n\t\t * @default undefined\n\t\t */\n\t\tthis.duration = undefined;\n\n\t\t/**\n\t\t * The playback speed.\n\t\t *\n\t\t * Defined via {@link Audio#setPlaybackRate}.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 1\n\t\t */\n\t\tthis.playbackRate = 1;\n\n\t\t/**\n\t\t * Indicates whether the audio is playing or not.\n\t\t *\n\t\t * This flag will be automatically set when using {@link Audio#play},\n\t\t * {@link Audio#pause}, {@link Audio#stop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPlaying = false;\n\n\t\t/**\n\t\t * Indicates whether the audio playback can be controlled\n\t\t * with method like {@link Audio#play} or {@link Audio#pause}.\n\t\t *\n\t\t * This flag will be automatically set when audio sources are\n\t\t * defined.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.hasPlaybackControl = true;\n\n\t\t/**\n\t\t * Holds a reference to the current audio source.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @readonly\n\t\t * @default null\n\t\t */\n\t\tthis.source = null;\n\n\t\t/**\n\t\t * Defines the source type.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {('empty'|'audioNode'|'mediaNode'|'mediaStreamNode'|'buffer')}\n\t\t * @readonly\n\t\t * @default 'empty'\n\t\t */\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\t/**\n\t\t * Can be used to apply a variety of low-order filters to create\n\t\t * more complex sound effects e.g. via `BiquadFilterNode`.\n\t\t *\n\t\t * The property is automatically set by {@link Audio#setFilters}.\n\t\t *\n\t\t * @type {Array}\n\t\t * @readonly\n\t\t */\n\t\tthis.filters = [];\n\n\t}\n\n\t/**\n\t * Returns the output audio node.\n\t *\n\t * @return {GainNode} The output node.\n\t */\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Sets the given audio node as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `audioNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {AudioNode} audioNode - The audio node like an instance of `OscillatorNode`.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetNodeSource( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media element as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {HTMLMediaElement} mediaElement - The media element.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media stream as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaStreamNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {MediaStream} mediaStream - The media stream.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given audio buffer as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `buffer` and {@link Audio#hasPlaybackControl} to `true`.\n\t *\n\t * @param {AudioBuffer} audioBuffer - The audio buffer.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetBuffer( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should start playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tplay( delay = 0 ) {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\twarn( 'Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\t/**\n\t * Pauses the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tpause() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should stop playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tstop( delay = 0 ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tif ( this.source !== null ) {\n\n\t\t\tthis.source.stop( this.context.currentTime + delay );\n\t\t\tthis.source.onended = null;\n\n\t\t}\n\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio} A reference to this instance.\n\t */\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._connected === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filters.\n\t *\n\t * @return {Array} The list of filters.\n\t */\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\t/**\n\t * Sets an array of filters and connects them with the audio source.\n\t *\n\t * @param {Array} [value] - A list of filters.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines the detuning of oscillation in cents.\n\t *\n\t * @param {number} value - The detuning of oscillation in cents.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.isPlaying === true && this.source.detune !== undefined ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the detuning of oscillation in cents.\n\t *\n\t * @return {number} The detuning of oscillation in cents.\n\t */\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\t/**\n\t * Returns the first filter in the list of filters.\n\t *\n\t * @return {AudioNode|undefined} The first filter in the list of filters.\n\t */\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\t/**\n\t * Applies a single filter node to the audio.\n\t *\n\t * @param {AudioNode} [filter] - The filter to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\t/**\n\t * Sets the playback rate.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [value] - The playback rate to set.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetPlaybackRate( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current playback rate.\n\n\t * @return {number} The playback rate.\n\t */\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\t/**\n\t * Automatically called when playback finished.\n\t */\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\t\tthis._progress = 0;\n\n\t}\n\n\t/**\n\t * Returns the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {boolean} Whether the audio should loop or not.\n\t */\n\tgetLoop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t}\n\n\t/**\n\t * Sets the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {boolean} value - Whether the audio should loop or not.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetLoop( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop start value which defines where in the audio buffer the replay should\n\t * start, in seconds.\n\t *\n\t * @param {number} value - The loop start value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop end value which defines where in the audio buffer the replay should\n\t * stop, in seconds.\n\t *\n\t * @param {number} value - The loop end value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the volume.\n\t *\n\t * @return {number} The volume.\n\t */\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the volume.\n\t *\n\t * @param {number} value - The volume to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.sourceType !== 'buffer' ) {\n\n\t\t\twarn( 'Audio: Audio source type cannot be copied.' );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.autoplay = source.autoplay;\n\n\t\tthis.buffer = source.buffer;\n\t\tthis.detune = source.detune;\n\t\tthis.loop = source.loop;\n\t\tthis.loopStart = source.loopStart;\n\t\tthis.loopEnd = source.loopEnd;\n\t\tthis.offset = source.offset;\n\t\tthis.duration = source.duration;\n\t\tthis.playbackRate = source.playbackRate;\n\t\tthis.hasPlaybackControl = source.hasPlaybackControl;\n\t\tthis.sourceType = source.sourceType;\n\n\t\tthis.filters = source.filters.slice();\n\n\t\treturn this;\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor( this.listener ).copy( this, recursive );\n\n\t}\n\n}\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\n/**\n * Represents a positional audio object.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create the PositionalAudio object (passing in the listener)\n * const sound = new THREE.PositionalAudio( listener );\n *\n * // load a sound and set it as the PositionalAudio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/song.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setRefDistance( 20 );\n * \tsound.play();\n * });\n *\n * // create an object for the sound to play from\n * const sphere = new THREE.SphereGeometry( 20, 32, 16 );\n * const material = new THREE.MeshPhongMaterial( { color: 0xff2200 } );\n * const mesh = new THREE.Mesh( sphere, material );\n * scene.add( mesh );\n *\n * // finally add the sound to the mesh\n * mesh.add( sound );\n *\n * @augments Audio\n */\nclass PositionalAudio extends Audio {\n\n\t/**\n\t * Constructs a positional audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\t/**\n\t\t * The panner node represents the location, direction, and behavior of an audio\n\t\t * source in 3D space.\n\t\t *\n\t\t * @type {PannerNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tconnect() {\n\n\t\tsuper.connect();\n\n\t\tthis.panner.connect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tsuper.disconnect();\n\n\t\tthis.panner.disconnect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\t/**\n\t * Returns the current reference distance.\n\t *\n\t * @return {number} The reference distance.\n\t */\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\t/**\n\t * Defines the reference distance for reducing volume as the audio source moves\n\t * further from the listener – i.e. the distance at which the volume reduction\n\t * starts taking effect.\n\t *\n\t * @param {number} value - The reference distance to set.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current rolloff factor.\n\t *\n\t * @return {number} The rolloff factor.\n\t */\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\t/**\n\t * Defines how quickly the volume is reduced as the source moves away from the listener.\n\t *\n\t * @param {number} value - The rolloff factor.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current distance model.\n\t *\n\t * @return {('linear'|'inverse'|'exponential')} The distance model.\n\t */\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\t/**\n\t * Defines which algorithm to use to reduce the volume of the audio source\n\t * as it moves away from the listener.\n\t *\n\t * Read [the spec](https://www.w3.org/TR/webaudio-1.1/#enumdef-distancemodeltype)\n\t * for more details.\n\t *\n\t * @param {('linear'|'inverse'|'exponential')} value - The distance model to set.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current max distance.\n\t *\n\t * @return {number} The max distance.\n\t */\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\t/**\n\t * Defines the maximum distance between the audio source and the listener,\n\t * after which the volume is not reduced any further.\n\t *\n\t * This value is used only by the `linear` distance model.\n\t *\n\t * @param {number} value - The max distance.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the directional cone in which the audio can be listened.\n\t *\n\t * @param {number} coneInnerAngle - An angle, in degrees, of a cone inside of which there will be no volume reduction.\n\t * @param {number} coneOuterAngle - An angle, in degrees, of a cone outside of which the volume will be reduced by a constant value, defined by the `coneOuterGain` parameter.\n\t * @param {number} coneOuterGain - The amount of volume reduction outside the cone defined by the `coneOuterAngle`. When set to `0`, no sound can be heard.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position.x, _position.y, _position.z );\n\t\t\tpanner.setOrientation( _orientation.x, _orientation.y, _orientation.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class can be used to analyse audio data.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create an Audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop(true);\n * \tsound.setVolume(0.5);\n * \tsound.play();\n * });\n *\n * // create an AudioAnalyser, passing in the sound and desired fftSize\n * const analyser = new THREE.AudioAnalyser( sound, 32 );\n *\n * // get the average frequency of the sound\n * const data = analyser.getAverageFrequency();\n * ```\n */\nclass AudioAnalyser {\n\n\t/**\n\t * Constructs a new audio analyzer.\n\t *\n\t * @param {Audio} audio - The audio to analyze.\n\t * @param {number} [fftSize=2048] - The window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data.\n\t */\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AnalyserNode}\n\t\t */\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\t/**\n\t\t * Holds the analyzed data.\n\t\t *\n\t\t * @type {Uint8Array}\n\t\t */\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\t/**\n\t * Returns an array with frequency data of the audio.\n\t *\n\t * Each item in the array represents the decibel value for a specific frequency.\n\t * The frequencies are spread linearly from 0 to 1/2 of the sample rate.\n\t * For example, for 48000 sample rate, the last item of the array will represent\n\t * the decibel value for 24000 Hz.\n\t *\n\t * @return {Uint8Array} The frequency data.\n\t */\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\t/**\n\t * Returns the average of the frequencies returned by {@link AudioAnalyser#getFrequencyData}.\n\t *\n\t * @return {number} The average frequency.\n\t */\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n}\n\n/**\n * Buffered scene graph property that allows weighted accumulation; used internally.\n */\nclass PropertyMixer {\n\n\t/**\n\t * Constructs a new property mixer.\n\t *\n\t * @param {PropertyBinding} binding - The property binding.\n\t * @param {string} typeName - The keyframe track type name.\n\t * @param {number} valueSize - The keyframe track value size.\n\t */\n\tconstructor( binding, typeName, valueSize ) {\n\n\t\t/**\n\t\t * The property binding.\n\t\t *\n\t\t * @type {PropertyBinding}\n\t\t */\n\t\tthis.binding = binding;\n\n\t\t/**\n\t\t * The keyframe track value size.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.valueSize = valueSize;\n\n\t\tlet mixFunction,\n\t\t\tmixFunctionAdditive,\n\t\t\tsetIdentity;\n\n\t\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\t\t//\n\t\t// 'add' is used for additive cumulative results\n\t\t//\n\t\t// 'work' is optional and is only present for quaternion types. It is used\n\t\t// to store intermediate quaternion multiplication results\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\t\tthis._workIndex = 5;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tmixFunction = this._select;\n\n\t\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t\t// additive is not relevant for non-numeric types\n\t\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\t\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t\t}\n\n\t\tthis._mixBufferRegion = mixFunction;\n\t\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\t\tthis._origIndex = 3;\n\t\tthis._addIndex = 4;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.cumulativeWeight = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.useCount = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\t/**\n\t * Accumulates data in the `incoming` region into `accu`.\n\t *\n\t * @param {number} accuIndex - The accumulation index.\n\t * @param {number} weight - The weight.\n\t */\n\taccumulate( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t}\n\n\t/**\n\t * Accumulates data in the `incoming` region into `add`.\n\t *\n\t * @param {number} weight - The weight.\n\t */\n\taccumulateAdditive( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t}\n\n\t/**\n\t * Applies the state of `accu` to the binding when accus differ.\n\t *\n\t * @param {number} accuIndex - The accumulation index.\n\t */\n\tapply( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Remembers the state of the bound property and copy it to both accus.\n\t */\n\tsaveOriginalState() {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t}\n\n\t/**\n\t * Applies the state previously taken via {@link PropertyMixer#saveOriginalState} to the binding.\n\t */\n\trestoreOriginalState() {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t}\n\n\t// internals\n\n\t_setAdditiveIdentityNumeric() {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\t_setAdditiveIdentityQuaternion() {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t}\n\n\t_setAdditiveIdentityOther() {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t}\n\n\n\t// mix functions\n\n\t_select( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_slerp( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t}\n\n\t_slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t}\n\n\t_lerp( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n\t_lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n}\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /*@__PURE__*/ /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /*@__PURE__*/ /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /*@__PURE__*/ /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /*@__PURE__*/ /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones', 'map' ];\n\nclass Composite {\n\n\tconstructor( targetGroup, path, optionalParsedPath ) {\n\n\t\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tgetValue( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t}\n\n\tsetValue( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n}\n\n// Note: This class uses a State pattern on a per-method basis:\n// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n// prototype version of these methods with one that represents\n// the bound state. When the property is not found, the methods\n// become no-ops.\n\n\n/**\n * This holds a reference to a real property in the scene graph; used internally.\n */\nclass PropertyBinding {\n\n\t/**\n\t * Constructs a new property binding.\n\t *\n\t * @param {Object} rootNode - The root node.\n\t * @param {string} path - The path.\n\t * @param {?Object} [parsedPath] - The parsed path.\n\t */\n\tconstructor( rootNode, path, parsedPath ) {\n\n\t\t/**\n\t\t * The object path to the animated property.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = path;\n\n\t\t/**\n\t\t * An object holding information about the path.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\t/**\n\t\t * The object owns the animated property.\n\t\t *\n\t\t * @type {?Object}\n\t\t */\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName );\n\n\t\t/**\n\t\t * The root node.\n\t\t *\n\t\t * @type {Object3D|Skeleton}\n\t\t */\n\t\tthis.rootNode = rootNode;\n\n\t\t// initial state of these methods that calls 'bind'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n\n\t/**\n\t * Factory method for creating a property binding from the given parameters.\n\t *\n\t * @static\n\t * @param {Object} root - The root node.\n\t * @param {string} path - The path.\n\t * @param {?Object} [parsedPath] - The parsed path.\n\t * @return {PropertyBinding|Composite} The created property binding or composite.\n\t */\n\tstatic create( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name - Node name to be sanitized.\n\t * @return {string} The sanitized node name.\n\t */\n\tstatic sanitizeNodeName( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t}\n\n\t/**\n\t * Parses the given track name (an object path to an animated property) and\n\t * returns an object with information about the path. Matches strings in the following forms:\n\t *\n\t * - nodeName.property\n\t * - nodeName.property[accessor]\n\t * - nodeName.material.property[accessor]\n\t * - uuid.property[accessor]\n\t * - uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t * - parentName/nodeName.property\n\t * - parentName/parentName/nodeName.property[index]\n\t * - .bone[Armature.DEF_cog].position\n\t * - scene:helium_balloon_model:helium_balloon_model.position\n\t *\n\t * @static\n\t * @param {string} trackName - The track name to parse.\n\t * @return {Object} The parsed track name as an object.\n\t */\n\tstatic parseTrackName( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( matches === null ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== -1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== -1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t}\n\n\t/**\n\t * Searches for a node in the hierarchy of the given root object by the given\n\t * node name.\n\t *\n\t * @static\n\t * @param {Object} root - The root object.\n\t * @param {string|number} nodeName - The name of the node.\n\t * @return {?Object} The found node. Returns `null` if no object was found.\n\t */\n\tstatic findNode( root, nodeName ) {\n\n\t\tif ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tconst subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable() {}\n\t_setValue_unavailable() {}\n\n\t// Getters\n\n\t_getValue_direct( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.targetObject[ this.propertyName ];\n\n\t}\n\n\t_getValue_array( buffer, offset ) {\n\n\t\tconst source = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t}\n\n\t}\n\n\t_getValue_arrayElement( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t}\n\n\t_getValue_toArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t}\n\n\t// Direct\n\n\t_setValue_direct( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// EntireArray\n\n\t_setValue_array( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t}\n\n\t_setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// ArrayElement\n\n\t_setValue_arrayElement( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// HasToFromArray\n\n\t_setValue_fromArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t}\n\n\t_setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t_getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t}\n\n\t_setValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t}\n\n\t/**\n\t * Creates a getter / setter pair for the property tracked by this binding.\n\t */\n\tbind() {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName );\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\twarn( 'PropertyBinding: No target node found for track: ' + this.path + '.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map':\n\n\t\t\t\t\tif ( 'map' in targetObject ) {\n\n\t\t\t\t\t\ttargetObject = targetObject.map;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.map ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material.map as node.material does not have a map.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.map;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\terror( 'PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.isMaterial === true ) {\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.isObject3D === true ) {\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === 'morphTargetInfluences' ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t}\n\n\t/**\n\t * Unbinds the property.\n\t */\n\tunbind() {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n}\n\nPropertyBinding.Composite = Composite;\n\nPropertyBinding.prototype.BindingType = {\n\tDirect: 0,\n\tEntireArray: 1,\n\tArrayElement: 2,\n\tHasFromToArray: 3\n};\n\nPropertyBinding.prototype.Versioning = {\n\tNone: 0,\n\tNeedsUpdate: 1,\n\tMatrixWorldNeedsUpdate: 2\n};\n\nPropertyBinding.prototype.GetterByBindingType = [\n\n\tPropertyBinding.prototype._getValue_direct,\n\tPropertyBinding.prototype._getValue_array,\n\tPropertyBinding.prototype._getValue_arrayElement,\n\tPropertyBinding.prototype._getValue_toArray,\n\n];\n\nPropertyBinding.prototype.SetterByBindingTypeAndVersioning = [\n\n\t[\n\t\t// Direct\n\t\tPropertyBinding.prototype._setValue_direct,\n\t\tPropertyBinding.prototype._setValue_direct_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// EntireArray\n\n\t\tPropertyBinding.prototype._setValue_array,\n\t\tPropertyBinding.prototype._setValue_array_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// ArrayElement\n\t\tPropertyBinding.prototype._setValue_arrayElement,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// HasToFromArray\n\t\tPropertyBinding.prototype._setValue_fromArray,\n\t\tPropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,\n\n\t]\n\n];\n\n/**\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n * - Instead pass this object as 'root'.\n * - You can also add and remove objects later when the mixer is running.\n *\n * Note:\n *\n * - Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the all objects in the group.\n * - A single property can either be controlled through a target group or directly, but not both.\n */\nclass AnimationObjectGroup {\n\n\t/**\n\t * Constructs a new animation group.\n\t *\n\t * @param {...Object3D} arguments - An arbitrary number of 3D objects that share the same animation state.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAnimationObjectGroup = true;\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0; // threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tconst indices = {};\n\t\tthis._indicesByUUID = indices; // for bookkeeping\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = []; // inside: string\n\t\tthis._parsedPaths = []; // inside: { we don't care, here }\n\t\tthis._bindings = []; // inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._objects.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tget bindingsPerObject() {\n\n\t\t\t\treturn scope._bindings.length;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * Adds an arbitrary number of objects to this animation group.\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to add.\n\t */\n\tadd() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\terror( 'AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t/**\n\t * Removes an arbitrary number of objects to this animation group\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to remove.\n\t */\n\tremove() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for the passed 3D objects of this animation group.\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to uncache.\n\t */\n\tuncache() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t}\n\n\tunsubscribe_( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * An instance of `AnimationAction` schedules the playback of an animation which is\n * stored in {@link AnimationClip}.\n */\nclass AnimationAction {\n\n\t/**\n\t * Constructs a new animation action.\n\t *\n\t * @param {AnimationMixer} mixer - The mixer that is controlled by this action.\n\t * @param {AnimationClip} clip - The animation clip that holds the actual keyframes.\n\t * @param {?Object3D} [localRoot=null] - The root object on which this action is performed.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode.\n\t */\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\n\t\t/**\n\t\t * Defines how the animation is blended/combined when two or more animations\n\t\t * are simultaneously played.\n\t\t *\n\t\t * @type {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)}\n\t\t */\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants; // bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\t/**\n\t\t * The loop mode, set via {@link AnimationAction#setLoop}.\n\t\t *\n\t\t * @type {(LoopRepeat|LoopOnce|LoopPingPong)}\n\t\t * @default LoopRepeat\n\t\t */\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t/**\n\t\t * The local time of this action (in seconds, starting with `0`).\n\t\t *\n\t\t * The value gets clamped or wrapped to `[0,clip.duration]` (according to the\n\t\t * loop state).\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * Scaling factor for the {@link AnimationAction#time}. A value of `0` causes the\n\t\t * animation to pause. Negative values cause the animation to play backwards.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\t/**\n\t\t * The degree of influence of this action (in the interval `[0, 1]`). Values\n\t\t * between `0` (no impact) and `1` (full impact) can be used to blend between\n\t\t * several actions.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\t/**\n\t\t * The number of repetitions of the performed clip over the course of this action.\n\t\t * Can be set via {@link AnimationAction#setLoop}.\n\t\t *\n\t\t * Setting this number has no effect if {@link AnimationAction#loop} is set to\n\t\t * `THREE:LoopOnce`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.repetitions = Infinity;\n\n\t\t/**\n\t\t * If set to `true`, the playback of the action is paused.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.paused = false;\n\n\t\t/**\n\t\t * If set to `false`, the action is disabled so it has no impact.\n\t\t *\n\t\t * When the action is re-enabled, the animation continues from its current\n\t\t * time (setting `enabled` to `false` doesn't reset the action).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * If set to true the animation will automatically be paused on its last frame.\n\t\t *\n\t\t * If set to false, {@link AnimationAction#enabled} will automatically be switched\n\t\t * to `false` when the last loop of the action has finished, so that this action has\n\t\t * no further impact.\n\t\t *\n\t\t * Note: This member has no impact if the action is interrupted (it\n\t\t * has only an effect if its last loop has really finished).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clampWhenFinished = false;\n\n\t\t/**\n\t\t * Enables smooth interpolation without separate clips for start, loop and end.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.zeroSlopeAtStart = true;\n\n\t\t/**\n\t\t * Enables smooth interpolation without separate clips for start, loop and end.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.zeroSlopeAtEnd = true;\n\n\t}\n\n\t/**\n\t * Starts the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\t/**\n\t * Resets the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = -1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\t/**\n\t * Returns `true` if the animation is running.\n\t *\n\t * @return {boolean} Whether the animation is running or not.\n\t */\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t/**\n\t * Returns `true` when {@link AnimationAction#play} has been called.\n\t *\n\t * @return {boolean} Whether the animation is scheduled or not.\n\t */\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\t/**\n\t * Defines the time when the animation should start.\n\t *\n\t * @param {number} time - The start time in seconds.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Configures the loop settings for this action.\n\t *\n\t * @param {(LoopRepeat|LoopOnce|LoopPingPong)} mode - The loop mode.\n\t * @param {number} repetitions - The number of repetitions.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetLoop( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the effective weight of this action.\n\t *\n\t * An action has no effect and thus an effective weight of zero when the\n\t * action is disabled.\n\t *\n\t * @param {number} weight - The weight to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetEffectiveWeight( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t}\n\n\t/**\n\t * Returns the effective weight of this action.\n\t *\n\t * @return {number} The effective weight.\n\t */\n\tgetEffectiveWeight() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\t/**\n\t * Fades the animation in by increasing its weight gradually from `0` to `1`,\n\t * within the passed time interval.\n\t *\n\t * @param {number} duration - The duration of the fade.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\t/**\n\t * Fades the animation out by decreasing its weight gradually from `1` to `0`,\n\t * within the passed time interval.\n\t *\n\t * @param {number} duration - The duration of the fade.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\t/**\n\t * Causes this action to fade in and the given action to fade out,\n\t * within the passed time interval.\n\t *\n\t * @param {AnimationAction} fadeOutAction - The animation action to fade out.\n\t * @param {number} duration - The duration of the fade.\n\t * @param {boolean} [warp=false] - Whether warping should be used or not.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tcrossFadeFrom( fadeOutAction, duration, warp = false ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp === true ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Causes this action to fade out and the given action to fade in,\n\t * within the passed time interval.\n\t *\n\t * @param {AnimationAction} fadeInAction - The animation action to fade in.\n\t * @param {number} duration - The duration of the fade.\n\t * @param {boolean} [warp=false] - Whether warping should be used or not.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tcrossFadeTo( fadeInAction, duration, warp = false ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\t/**\n\t * Stops any fading which is applied to this action.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstopFading() {\n\n\t\tconst weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the effective time scale of this action.\n\t *\n\t * An action has no effect and thus an effective time scale of zero when the\n\t * action is paused.\n\t *\n\t * @param {number} timeScale - The time scale to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetEffectiveTimeScale( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Returns the effective time scale of this action.\n\t *\n\t * @return {number} The effective time scale.\n\t */\n\tgetEffectiveTimeScale() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\t/**\n\t * Sets the duration for a single loop of this action.\n\t *\n\t * @param {number} duration - The duration to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Synchronizes this action with the passed other action.\n\t *\n\t * @param {AnimationAction} action - The action to sync with.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsyncWith( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Decelerates this animation's speed to `0` within the passed time interval.\n\t *\n\t * @param {number} duration - The duration.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\thalt( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\t/**\n\t * Changes the playback speed, within the passed time interval, by modifying\n\t * {@link AnimationAction#timeScale} gradually from `startTimeScale` to\n\t * `endTimeScale`.\n\t *\n\t * @param {number} startTimeScale - The start time scale.\n\t * @param {number} endTimeScale - The end time scale.\n\t * @param {number} duration - The duration.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops any scheduled warping which is applied to this action.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstopWarping() {\n\n\t\tconst timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the animation mixer of this animation action.\n\t *\n\t * @return {AnimationMixer} The animation mixer.\n\t */\n\tgetMixer() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\t/**\n\t * Returns the animation clip of this animation action.\n\t *\n\t * @return {AnimationClip} The animation clip.\n\t */\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\t/**\n\t * Returns the root object of this animation action.\n\t *\n\t * @return {Object3D} The root object.\n\t */\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\tdeltaTime = 0;\n\n\t\t\t} else {\n\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t}\n\n\t_updateTimeScale( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t}\n\n\t_updateTime( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === -1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_scheduleFading( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _controlInterpolantsResultBuffer = new Float32Array( 1 );\n\n/**\n * `AnimationMixer` is a player for animations on a particular object in\n * the scene. When multiple objects in the scene are animated independently,\n * one `AnimationMixer` may be used for each object.\n */\nclass AnimationMixer extends EventDispatcher {\n\n\t/**\n\t * Constructs a new animation mixer.\n\t *\n\t * @param {Object3D} root - The object whose animations shall be played by this mixer.\n\t */\n\tconstructor( root ) {\n\n\t\tsuper();\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\t/**\n\t\t * The global mixer time (in seconds; starting with `0` on the mixer's creation).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * A scaling factor for the global time.\n\t\t *\n\t\t * Note: Setting this member to `0` and later back to `1` is a\n\t\t * possibility to pause/unpause all actions that are controlled by this\n\t\t * mixer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\t_bindAction( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t}\n\n\t_activateAction( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t}\n\n\t_deactivateAction( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t}\n\n\t// Memory manager\n\n\t_initMemoryManager() {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t}\n\n\t_addInactiveAction( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t}\n\n\t_removeInactiveAction( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t}\n\n\t_removeInactiveBindingsForAction( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_lendAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions >| inactive actions ]\n\t\t// s a\n\t\t// <-swap->\n\t\t// a s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t}\n\n\t_takeBackAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions |< inactive actions ]\n\t\t// a s\n\t\t// <-swap->\n\t\t// s a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t}\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t}\n\n\t_removeInactiveBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t}\n\n\t_lendBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t}\n\n\t_takeBackBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t}\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant() {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, _controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t}\n\n\t_takeBackControlInterpolant( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t}\n\n\t/**\n\t * Returns an instance of {@link AnimationAction} for the passed clip.\n\t *\n\t * If an action fitting the clip and root parameters doesn't yet exist, it\n\t * will be created by this method. Calling this method several times with the\n\t * same clip and root parameters always returns the same action.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode.\n\t * @return {?AnimationAction} The animation action.\n\t */\n\tclipAction( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t}\n\n\t/**\n\t * Returns an existing animation action for the passed clip.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t * @return {?AnimationAction} The animation action. Returns `null` if no action was found.\n\t */\n\texistingAction( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Deactivates all previously scheduled actions on this mixer.\n\t *\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tstopAllAction() {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Advances the global mixer time and updates the animation.\n\t *\n\t * This is usually done in the render loop by passing the delta\n\t * time from {@link Clock} or {@link Timer}.\n\t *\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tupdate( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the global mixer to a specific time and updates the animation accordingly.\n\t *\n\t * This is useful when you need to jump to an exact time in an animation. The\n\t * input parameter will be scaled by {@link AnimationMixer#timeScale}\n\t *\n\t * @param {number} time - The time to set in seconds.\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tsetTime( time ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( time ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t}\n\n\t/**\n\t * Returns this mixer's root object.\n\t *\n\t * @return {Object3D} The mixer's root object.\n\t */\n\tgetRoot() {\n\n\t\treturn this._root;\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for a clip. Before using this method make\n\t * sure to call {@link AnimationAction#stop} for all related actions.\n\t *\n\t * @param {AnimationClip} clip - The clip to uncache.\n\t */\n\tuncacheClip( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for a root object. Before using this\n\t * method make sure to call {@link AnimationAction#stop} for all related\n\t * actions or alternatively {@link AnimationMixer#stopAllAction} when the\n\t * mixer operates on a single root.\n\t *\n\t * @param {Object3D} root - The root object to uncache.\n\t */\n\tuncacheRoot( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for an action. The action is identified by the\n\t * given clip and an optional root object. Before using this method make\n\t * sure to call {@link AnimationAction#stop} to deactivate the action.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t */\n\tuncacheAction( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a 3D render target.\n *\n * @augments RenderTarget\n */\nclass RenderTarget3D extends RenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderTarget3D = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {Data3DTexture}\n\t\t */\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Represents a uniform which is a global shader variable. They are passed to shader programs.\n *\n * When declaring a uniform of a {@link ShaderMaterial}, it is declared by value or by object.\n * ```js\n * uniforms: {\n * \ttime: { value: 1.0 },\n * \tresolution: new Uniform( new Vector2() )\n * };\n * ```\n * Since this class can only be used in context of {@link ShaderMaterial}, it is only supported\n * in {@link WebGLRenderer}.\n */\nclass Uniform {\n\n\t/**\n\t * Constructs a new uniform.\n\t *\n\t * @param {any} value - The uniform value.\n\t */\n\tconstructor( value ) {\n\n\t\t/**\n\t\t * The uniform value.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.value = value;\n\n\t}\n\n\t/**\n\t * Returns a new uniform with copied values from this instance.\n\t * If the value has a `clone()` method, the value is cloned as well.\n\t *\n\t * @return {Uniform} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nlet _id = 0;\n\n/**\n * A class for managing multiple uniforms in a single group. The renderer will process\n * such a definition as a single UBO.\n *\n * Since this class can only be used in context of {@link ShaderMaterial}, it is only supported\n * in {@link WebGLRenderer}.\n *\n * @augments EventDispatcher\n */\nclass UniformsGroup extends EventDispatcher {\n\n\t/**\n\t * Constructs a new uniforms group.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isUniformsGroup = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name UniformsGroup#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id ++ } );\n\n\t\t/**\n\t\t * The name of the uniforms group.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The buffer usage.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * An array holding the uniforms.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.uniforms = [];\n\n\t}\n\n\t/**\n\t * Adds the given uniform to this uniforms group.\n\t *\n\t * @param {Uniform} uniform - The uniform to add.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tadd( uniform ) {\n\n\t\tthis.uniforms.push( uniform );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given uniform from this uniforms group.\n\t *\n\t * @param {Uniform} uniform - The uniform to remove.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tremove( uniform ) {\n\n\t\tconst index = this.uniforms.indexOf( uniform );\n\n\t\tif ( index !== -1 ) this.uniforms.splice( index, 1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the name of this uniforms group.\n\t *\n\t * @param {string} name - The name to set.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the usage of this uniforms group.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Copies the values of the given uniforms group to this instance.\n\t *\n\t * @param {UniformsGroup} source - The uniforms group to copy.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.usage = source.usage;\n\n\t\tconst uniformsSource = source.uniforms;\n\n\t\tthis.uniforms.length = 0;\n\n\t\tfor ( let i = 0, l = uniformsSource.length; i < l; i ++ ) {\n\n\t\t\tconst uniforms = Array.isArray( uniformsSource[ i ] ) ? uniformsSource[ i ] : [ uniformsSource[ i ] ];\n\n\t\t\tfor ( let j = 0; j < uniforms.length; j ++ ) {\n\n\t\t\t\tthis.uniforms.push( uniforms[ j ].clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new uniforms group with copied values from this instance.\n\t *\n\t * @return {UniformsGroup} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * An instanced version of an interleaved buffer.\n *\n * @augments InterleavedBuffer\n */\nclass InstancedInterleavedBuffer extends InterleavedBuffer {\n\n\t/**\n\t * Constructs a new instanced interleaved buffer.\n\t *\n\t * @param {TypedArray} array - A typed array with a shared buffer storing attribute data.\n\t * @param {number} stride - The number of typed-array elements per vertex.\n\t * @param {number} [meshPerAttribute=1] - Defines how often a value of this interleaved buffer should be repeated.\n\t */\n\tconstructor( array, stride, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, stride );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedInterleavedBuffer = true;\n\n\t\t/**\n\t\t * Defines how often a value of this buffer attribute should be repeated,\n\t\t * see {@link InstancedBufferAttribute#meshPerAttribute}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tconst ib = super.clone( data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tconst json = super.toJSON( data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n}\n\n/**\n * An alternative version of a buffer attribute with more control over the VBO.\n *\n * The renderer does not construct a VBO for this kind of attribute. Instead, it uses\n * whatever VBO is passed in constructor and can later be altered via the `buffer` property.\n *\n * The most common use case for this class is when some kind of GPGPU calculation interferes\n * or even produces the VBOs in question.\n *\n * Notice that this class can only be used with {@link WebGLRenderer}.\n */\nclass GLBufferAttribute {\n\n\t/**\n\t * Constructs a new GL buffer attribute.\n\t *\n\t * @param {WebGLBuffer} buffer - The native WebGL buffer.\n\t * @param {number} type - The native data type (e.g. `gl.FLOAT`).\n\t * @param {number} itemSize - The item size.\n\t * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter.\n\t * @param {number} count - The expected number of vertices in VBO.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( buffer, type, itemSize, elementSize, count, normalized = false ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGLBufferAttribute = true;\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The native WebGL buffer.\n\t\t *\n\t\t * @type {WebGLBuffer}\n\t\t */\n\t\tthis.buffer = buffer;\n\n\t\t/**\n\t\t * The native data type.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * The item size, see {@link BufferAttribute#itemSize}.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * The corresponding size (in bytes) for the given `type` parameter.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.elementSize = elementSize;\n\n\t\t/**\n\t\t * The expected number of vertices in VBO.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * Applies to integer data only. Indicates how the underlying data in the buffer maps to\n\t\t * the values in the GLSL code. For instance, if `buffer` contains data of `gl.UNSIGNED_SHORT`,\n\t\t * and `normalized` is `true`, the values `0 - +65535` in the buffer data will be mapped to\n\t\t * `0.0f - +1.0f` in the GLSL attribute. If `normalized` is `false`, the values will be converted\n\t\t * to floats unmodified, i.e. `65535` becomes `65535.0f`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the given native WebGL buffer.\n\t *\n\t * @param {WebGLBuffer} buffer - The buffer to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetBuffer( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given native data type and element size.\n\t *\n\t * @param {number} type - The native data type (e.g. `gl.FLOAT`).\n\t * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetType( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the item size.\n\t *\n\t * @param {number} itemSize - The item size.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetItemSize( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the count (the expected number of vertices in VBO).\n\t *\n\t * @param {number} count - The count.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * This class is designed to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3d space the mouse is over)\n * amongst other things.\n */\nclass Raycaster {\n\n\t/**\n\t * Constructs a new raycaster.\n\t *\n\t * @param {Vector3} origin - The origin vector where the ray casts from.\n\t * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray.\n\t * @param {number} [near=0] - All results returned are further away than near. Near can't be negative.\n\t * @param {number} [far=Infinity] - All results returned are closer than far. Far can't be lower than near.\n\t */\n\tconstructor( origin, direction, near = 0, far = Infinity ) {\n\n\t\t/**\n\t\t * The ray used for raycasting.\n\t\t *\n\t\t * @type {Ray}\n\t\t */\n\t\tthis.ray = new Ray( origin, direction );\n\n\t\t/**\n\t\t * All results returned are further away than near. Near can't be negative.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * All results returned are further away than near. Near can't be negative.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * The camera to use when raycasting against view-dependent objects such as\n\t\t * billboarded objects like sprites. This field can be set manually or\n\t\t * is set when calling `setFromCamera()`.\n\t\t *\n\t\t * @type {?Camera}\n\t\t * @default null\n\t\t */\n\t\tthis.camera = null;\n\n\t\t/**\n\t\t * Allows to selectively ignore 3D objects when performing intersection tests.\n\t\t * The following code example ensures that only 3D objects on layer `1` will be\n\t\t * honored by raycaster.\n\t\t * ```js\n\t\t * raycaster.layers.set( 1 );\n\t\t * object.layers.enable( 1 );\n\t\t * ```\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\n\t\t/**\n\t\t * A parameter object that configures the raycasting. It has the structure:\n\t\t *\n\t\t * ```\n\t\t * {\n\t\t * \tMesh: {},\n\t\t * \tLine: { threshold: 1 },\n\t\t * \tLOD: {},\n\t\t * \tPoints: { threshold: 1 },\n\t\t * \tSprite: {}\n\t\t * }\n\t\t * ```\n\t\t * Where `threshold` is the precision of the raycaster when intersecting objects, in world units.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: { threshold: 1 },\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the ray with a new origin and direction by copying the values from the arguments.\n\t *\n\t * @param {Vector3} origin - The origin vector where the ray casts from.\n\t * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray.\n\t */\n\tset( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t}\n\n\t/**\n\t * Uses the given coordinates and camera to compute a new origin and direction for the internal ray.\n\t *\n\t * @param {Vector2} coords - 2D coordinates of the mouse, in normalized device coordinates (NDC).\n\t * X and Y components should be between `-1` and `1`.\n\t * @param {Camera} camera - The camera from which the ray should originate.\n\t */\n\tsetFromCamera( coords, camera ) {\n\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( camera.isOrthographicCamera ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, -1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\terror( 'Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Uses the given WebXR controller to compute a new origin and direction for the internal ray.\n\t *\n\t * @param {WebXRController} controller - The controller to copy the position and direction from.\n\t * @return {Raycaster} A reference to this raycaster.\n\t */\n\tsetFromXRController( controller ) {\n\n\t\t_matrix.identity().extractRotation( controller.matrixWorld );\n\n\t\tthis.ray.origin.setFromMatrixPosition( controller.matrixWorld );\n\t\tthis.ray.direction.set( 0, 0, -1 ).applyMatrix4( _matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The intersection point of a raycaster intersection test.\n\t * @typedef {Object} Raycaster~Intersection\n\t * @property {number} distance - The distance from the ray's origin to the intersection point.\n\t * @property {number} distanceToRay - Some 3D objects e.g. {@link Points} provide the distance of the\n\t * intersection to the nearest point on the ray. For other objects it will be `undefined`.\n\t * @property {Vector3} point - The intersection point, in world coordinates.\n\t * @property {Object} face - The face that has been intersected.\n\t * @property {number} faceIndex - The face index.\n\t * @property {Object3D} object - The 3D object that has been intersected.\n\t * @property {Vector2} uv - U,V coordinates at point of intersection.\n\t * @property {Vector2} uv1 - Second set of U,V coordinates at point of intersection.\n\t * @property {Vector3} uv1 - Interpolated normal vector at point of intersection.\n\t * @property {number} instanceId - The index number of the instance where the ray\n\t * intersects the {@link InstancedMesh}.\n\t */\n\n\t/**\n\t * Checks all intersection between the ray and the object with or without the\n\t * descendants. Intersections are returned sorted by distance, closest first.\n\t *\n\t * `Raycaster` delegates to the `raycast()` method of the passed 3D object, when\n\t * evaluating whether the ray intersects the object or not. This allows meshes to respond\n\t * differently to ray casting than lines or points.\n\t *\n\t * Note that for meshes, faces must be pointed towards the origin of the ray in order\n\t * to be detected; intersections of the ray passing through the back of a face will not\n\t * be detected. To raycast against both faces of an object, you'll want to set {@link Material#side}\n\t * to `THREE.DoubleSide`.\n\t *\n\t * @param {Object3D} object - The 3D object to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {Array} [intersects=[]] The target array that holds the result of the method.\n\t * @return {Array} An array holding the intersection points.\n\t */\n\tintersectObject( object, recursive = true, intersects = [] ) {\n\n\t\tintersect( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n\t/**\n\t * Checks all intersection between the ray and the objects with or without\n\t * the descendants. Intersections are returned sorted by distance, closest first.\n\t *\n\t * @param {Array} objects - The 3D objects to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {Array} [intersects=[]] The target array that holds the result of the method.\n\t * @return {Array} An array holding the intersection points.\n\t */\n\tintersectObjects( objects, recursive = true, intersects = [] ) {\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersect( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersect( object, raycaster, intersects, recursive ) {\n\n\tlet propagate = true;\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tconst result = object.raycast( raycaster, intersects );\n\n\t\tif ( result === false ) propagate = false;\n\n\t}\n\n\tif ( propagate === true && recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersect( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class is an alternative to {@link Clock} with a different API design and behavior.\n * The goal is to avoid the conceptual flaws that became apparent in `Clock` over time.\n *\n * - `Timer` has an `update()` method that updates its internal state. That makes it possible to\n * call `getDelta()` and `getElapsed()` multiple times per simulation step without getting different values.\n * - The class can make use of the Page Visibility API to avoid large time delta values when the app\n * is inactive (e.g. tab switched or browser hidden).\n *\n * ```js\n * const timer = new Timer();\n * timer.connect( document ); // use Page Visibility API\n * ```\n */\nclass Timer {\n\n\t/**\n\t * Constructs a new timer.\n\t */\n\tconstructor() {\n\n\t\tthis._previousTime = 0;\n\t\tthis._currentTime = 0;\n\t\tthis._startTime = performance.now();\n\n\t\tthis._delta = 0;\n\t\tthis._elapsed = 0;\n\n\t\tthis._timescale = 1;\n\n\t\tthis._document = null;\n\t\tthis._pageVisibilityHandler = null;\n\n\t}\n\n\t/**\n\t * Connect the timer to the given document.Calling this method is not mandatory to\n\t * use the timer but enables the usage of the Page Visibility API to avoid large time\n\t * delta values.\n\t *\n\t * @param {Document} document - The document.\n\t */\n\tconnect( document ) {\n\n\t\tthis._document = document;\n\n\t\t// use Page Visibility API to avoid large time delta values\n\n\t\tif ( document.hidden !== undefined ) {\n\n\t\t\tthis._pageVisibilityHandler = handleVisibilityChange.bind( this );\n\n\t\t\tdocument.addEventListener( 'visibilitychange', this._pageVisibilityHandler, false );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disconnects the timer from the DOM and also disables the usage of the Page Visibility API.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._pageVisibilityHandler !== null ) {\n\n\t\t\tthis._document.removeEventListener( 'visibilitychange', this._pageVisibilityHandler );\n\t\t\tthis._pageVisibilityHandler = null;\n\n\t\t}\n\n\t\tthis._document = null;\n\n\t}\n\n\t/**\n\t * Returns the time delta in seconds.\n\t *\n\t * @return {number} The time delta in second.\n\t */\n\tgetDelta() {\n\n\t\treturn this._delta / 1000;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time in second.\n\t */\n\tgetElapsed() {\n\n\t\treturn this._elapsed / 1000;\n\n\t}\n\n\t/**\n\t * Returns the timescale.\n\t *\n\t * @return {number} The timescale.\n\t */\n\tgetTimescale() {\n\n\t\treturn this._timescale;\n\n\t}\n\n\t/**\n\t * Sets the given timescale which scale the time delta computation\n\t * in `update()`.\n\t *\n\t * @param {number} timescale - The timescale to set.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tsetTimescale( timescale ) {\n\n\t\tthis._timescale = timescale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Resets the time computation for the current simulation step.\n\t *\n\t * @return {Timer} A reference to this timer.\n\t */\n\treset() {\n\n\t\tthis._currentTime = performance.now() - this._startTime;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Can be used to free all internal resources. Usually called when\n\t * the timer instance isn't required anymore.\n\t */\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t/**\n\t * Updates the internal state of the timer. This method should be called\n\t * once per simulation step and before you perform queries against the timer\n\t * (e.g. via `getDelta()`).\n\t *\n\t * @param {number} timestamp - The current time in milliseconds. Can be obtained\n\t * from the `requestAnimationFrame` callback argument. If not provided, the current\n\t * time will be determined with `performance.now`.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tupdate( timestamp ) {\n\n\t\tif ( this._pageVisibilityHandler !== null && this._document.hidden === true ) {\n\n\t\t\tthis._delta = 0;\n\n\t\t} else {\n\n\t\t\tthis._previousTime = this._currentTime;\n\t\t\tthis._currentTime = ( timestamp !== undefined ? timestamp : performance.now() ) - this._startTime;\n\n\t\t\tthis._delta = ( this._currentTime - this._previousTime ) * this._timescale;\n\t\t\tthis._elapsed += this._delta; // _elapsed is the accumulation of all previous deltas\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction handleVisibilityChange() {\n\n\tif ( this._document.hidden === false ) this.reset();\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Spherical coordinates](https://en.wikipedia.org/wiki/Spherical_coordinate_system).\n */\nclass Spherical {\n\n\t/**\n\t * Constructs a new spherical.\n\t *\n\t * @param {number} [radius=1] - The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t * @param {number} [phi=0] - The polar angle in radians from the y (up) axis.\n\t * @param {number} [theta=0] - The equator/azimuthal angle in radians around the y (up) axis.\n\t */\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\t/**\n\t\t * The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * The polar angle in radians from the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.phi = phi;\n\n\t\t/**\n\t\t * The equator/azimuthal angle in radians around the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t}\n\n\t/**\n\t * Sets the spherical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The polar angle.\n\t * @param {number} theta - The azimuthal angle.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical to this instance.\n\t *\n\t * @param {Spherical} other - The spherical to copy.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Restricts the polar angle [page:.phi phi] to be between `0.000001` and pi -\n\t * `0.000001`.\n\t *\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = clamp( this.phi, EPS, Math.PI - EPS );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The y value.\n\t * @param {number} z - The z value.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( clamp( y / this.radius, -1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new spherical with copied values from this instance.\n\t *\n\t * @return {Spherical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Cylindrical coordinates](https://en.wikipedia.org/wiki/Cylindrical_coordinate_system).\n */\nclass Cylindrical {\n\n\t/**\n\t * Constructs a new cylindrical.\n\t *\n\t * @param {number} [radius=1] - The distance from the origin to a point in the x-z plane.\n\t * @param {number} [theta=0] - A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t * @param {number} [y=0] - The height above the x-z plane.\n\t */\n\tconstructor( radius = 1, theta = 0, y = 0 ) {\n\n\t\t/**\n\t\t * The distance from the origin to a point in the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t\t/**\n\t\t * The height above the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle.\n\t * @param {number} y - The height value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tset( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given cylindrical to this instance.\n\t *\n\t * @param {Cylindrical} other - The cylindrical to copy.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The x value.\n\t * @param {number} z - The x value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new cylindrical with copied values from this instance.\n\t *\n\t * @return {Cylindrical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 2x2 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix2#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix2#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix2();\n * m.set( 11, 12,\n * 21, 22 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21,\n * 12, 22 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix2 {\n\n\t/**\n\t * Constructs a new 2x2 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t */\n\tconstructor( n11, n12, n21, n22 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix2.prototype.isMatrix2 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n21, n22 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 2x2 identity matrix.\n\t *\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} n11 - 1-1 matrix element.\n\t * @param {number} n12 - 1-2 matrix element.\n\t * @param {number} n21 - 2-1 matrix element.\n\t * @param {number} n22 - 2-2 matrix element.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tset( n11, n12, n21, n22 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 2 ] = n12;\n\t\tte[ 1 ] = n21; te[ 3 ] = n22;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$4 = /*@__PURE__*/ new Vector2();\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 2D space.\n */\nclass Box2 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector2} [min=(Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector2} [max=(-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox2 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector2} min - The lower boundary of the box.\n\t * @param {Vector2} max - The upper boundary of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} points - An array holding 2D position data as instances of {@link Vector2}.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector2} center - The center of the box.\n\t * @param {Vector2} size - The x and y dimensions of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box2} box - The box to copy.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 2D.\n\t *\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector2} point - The point that should be included by the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions.\n\t *\n\t * @param {Vector2} vector - The vector that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector2} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width and height.\n\t *\n\t * @param {Vector2} point - A point in 2D space.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} A point as a proportion of this box's width and height.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector2} point - The point to clamp.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector2} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$4 ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box2} box - The bounding box to intersect with.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box2} box - The bounding box that will be unioned with this instance.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 2D space.\n\t *\n\t * @param {Vector2} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box2} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\nconst _d1 = /*@__PURE__*/ new Vector3();\nconst _d2 = /*@__PURE__*/ new Vector3();\nconst _r = /*@__PURE__*/ new Vector3();\nconst _c1 = /*@__PURE__*/ new Vector3();\nconst _c2 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical line segment in 3D space represented by a start and end point.\n */\nclass Line3 {\n\n\t/**\n\t * Constructs a new line segment.\n\t *\n\t * @param {Vector3} [start=(0,0,0)] - Start of the line segment.\n\t * @param {Vector3} [end=(0,0,0)] - End of the line segment.\n\t */\n\tconstructor( start = new Vector3(), end = new Vector3() ) {\n\n\t\t/**\n\t\t * Start of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.start = start;\n\n\t\t/**\n\t\t * End of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.end = end;\n\n\t}\n\n\t/**\n\t * Sets the start and end values by copying the given vectors.\n\t *\n\t * @param {Vector3} start - The start point.\n\t * @param {Vector3} end - The end point.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tset( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given line segment to this instance.\n\t *\n\t * @param {Line3} line - The line segment to copy.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tcopy( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the center of the line segment.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the delta vector of the line segment's start and end point.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tdelta( target ) {\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\t/**\n\t * Returns the squared Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The squared Euclidean distance.\n\t */\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\t/**\n\t * Returns the Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The Euclidean distance.\n\t */\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\t/**\n\t * Returns a vector at a certain position along the line segment.\n\t *\n\t * @param {number} t - A value between `[0,1]` to represent a position along the line segment.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tat( t, target ) {\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns a point parameter based on the closest point as projected on the line segment.\n\t *\n\t * @param {Vector3} point - The point for which to return a point parameter.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @return {number} The point parameter.\n\t */\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns the closest point on the line for a given point.\n\t *\n\t * @param {Vector3} point - The point to compute the closest point on the line for.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the line.\n\t */\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns the closest squared distance between this line segment and the given one.\n\t *\n\t * @param {Line3} line - The line segment to compute the closest squared distance to.\n\t * @param {Vector3} [c1] - The closest point on this line segment.\n\t * @param {Vector3} [c2] - The closest point on the given line segment.\n\t * @return {number} The squared distance between this line segment and the given one.\n\t */\n\tdistanceSqToLine3( line, c1 = _c1, c2 = _c2 ) {\n\n\t\t// from Real-Time Collision Detection by Christer Ericson, chapter 5.1.9\n\n\t\t// Computes closest points C1 and C2 of S1(s)=P1+s*(Q1-P1) and\n\t\t// S2(t)=P2+t*(Q2-P2), returning s and t. Function result is squared\n\t\t// distance between between S1(s) and S2(t)\n\n\t\tconst EPSILON = 1e-8 * 1e-8; // must be squared since we compare squared length\n\t\tlet s, t;\n\n\t\tconst p1 = this.start;\n\t\tconst p2 = line.start;\n\t\tconst q1 = this.end;\n\t\tconst q2 = line.end;\n\n\t\t_d1.subVectors( q1, p1 ); // Direction vector of segment S1\n\t\t_d2.subVectors( q2, p2 ); // Direction vector of segment S2\n\t\t_r.subVectors( p1, p2 );\n\n\t\tconst a = _d1.dot( _d1 ); // Squared length of segment S1, always nonnegative\n\t\tconst e = _d2.dot( _d2 ); // Squared length of segment S2, always nonnegative\n\t\tconst f = _d2.dot( _r );\n\n\t\t// Check if either or both segments degenerate into points\n\n\t\tif ( a <= EPSILON && e <= EPSILON ) {\n\n\t\t\t// Both segments degenerate into points\n\n\t\t\tc1.copy( p1 );\n\t\t\tc2.copy( p2 );\n\n\t\t\tc1.sub( c2 );\n\n\t\t\treturn c1.dot( c1 );\n\n\t\t}\n\n\t\tif ( a <= EPSILON ) {\n\n\t\t\t// First segment degenerates into a point\n\n\t\t\ts = 0;\n\t\t\tt = f / e; // s = 0 => t = (b*s + f) / e = f / e\n\t\t\tt = clamp( t, 0, 1 );\n\n\n\t\t} else {\n\n\t\t\tconst c = _d1.dot( _r );\n\n\t\t\tif ( e <= EPSILON ) {\n\n\t\t\t\t// Second segment degenerates into a point\n\n\t\t\t\tt = 0;\n\t\t\t\ts = clamp( - c / a, 0, 1 ); // t = 0 => s = (b*t - c) / a = -c / a\n\n\t\t\t} else {\n\n\t\t\t\t// The general nondegenerate case starts here\n\n\t\t\t\tconst b = _d1.dot( _d2 );\n\t\t\t\tconst denom = a * e - b * b; // Always nonnegative\n\n\t\t\t\t// If segments not parallel, compute closest point on L1 to L2 and\n\t\t\t\t// clamp to segment S1. Else pick arbitrary s (here 0)\n\n\t\t\t\tif ( denom !== 0 ) {\n\n\t\t\t\t\ts = clamp( ( b * f - c * e ) / denom, 0, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ts = 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Compute point on L2 closest to S1(s) using\n\t\t\t\t// t = Dot((P1 + D1*s) - P2,D2) / Dot(D2,D2) = (b*s + f) / e\n\n\t\t\t\tt = ( b * s + f ) / e;\n\n\t\t\t\t// If t in [0,1] done. Else clamp t, recompute s for the new value\n\t\t\t\t// of t using s = Dot((P2 + D2*t) - P1,D1) / Dot(D1,D1)= (t*b - c) / a\n\t\t\t\t// and clamp s to [0, 1]\n\n\t\t\t\tif ( t < 0 ) {\n\n\t\t\t\t\tt = 0.;\n\t\t\t\t\ts = clamp( - c / a, 0, 1 );\n\n\t\t\t\t} else if ( t > 1 ) {\n\n\t\t\t\t\tt = 1;\n\t\t\t\t\ts = clamp( ( b - c ) / a, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tc1.copy( p1 ).add( _d1.multiplyScalar( s ) );\n\t\tc2.copy( p2 ).add( _d2.multiplyScalar( t ) );\n\n\t\tc1.sub( c2 );\n\n\t\treturn c1.dot( c1 );\n\n\t}\n\n\t/**\n\t * Applies a 4x4 transformation matrix to this line segment.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this line segment is equal with the given one.\n\t *\n\t * @param {Line3} line - The line segment to test for equality.\n\t * @return {boolean} Whether this line segment is equal with the given one.\n\t */\n\tequals( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n\t/**\n\t * Returns a new line segment with copied values from this instance.\n\t *\n\t * @return {Line3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * This displays a cone shaped helper object for a {@link SpotLight}.\n *\n * ```js\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 10, 10, 10 );\n * scene.add( spotLight );\n *\n * const spotLightHelper = new THREE.SpotLightHelper( spotLight );\n * scene.add( spotLightHelper );\n * ```\n *\n * @augments Object3D\n */\nclass SpotLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new spot light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {SpotLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'SpotLightHelper';\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t-1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, -1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t// update the local matrix based on the parent and light target transforms\n\t\tif ( this.parent ) {\n\n\t\t\tthis.parent.updateWorldMatrix( true );\n\n\t\t\tthis.matrix\n\t\t\t\t.copy( this.parent.matrixWorld )\n\t\t\t\t.invert()\n\t\t\t\t.multiply( this.light.matrixWorld );\n\n\t\t} else {\n\n\t\t\tthis.matrix.copy( this.light.matrixWorld );\n\n\t\t}\n\n\t\tthis.matrixWorld.copy( this.light.matrixWorld );\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n/**\n * A helper object to assist with visualizing a {@link Skeleton}.\n *\n * ```js\n * const helper = new THREE.SkeletonHelper( skinnedMesh );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass SkeletonHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new skeleton helper.\n\t *\n\t * @param {Object3D} object - Usually an instance of {@link SkinnedMesh}. However, any 3D object\n\t * can be used if it represents a hierarchy of bones (see {@link Bone}).\n\t */\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( 0, 0, 0 );\n\t\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.type = 'SkeletonHelper';\n\n\t\t/**\n\t\t * The object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.root = object;\n\n\t\t/**\n\t\t * The list of bones that the helper visualizes.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t// colors\n\n\t\tconst color1 = new Color( 0x0000ff );\n\t\tconst color2 = new Color( 0x00ff00 );\n\n\t\tthis.setColors( color1, color2 );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} color1 - The first line color for each bone.\n\t * @param {Color} color2 - The second line color for each bone.\n\t * @return {SkeletonHelper} A reference to this helper.\n\t */\n\tsetColors( color1, color2 ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\tfor ( let i = 0; i < colorAttribute.count; i += 2 ) {\n\n\t\t\tcolorAttribute.setXYZ( i, color1.r, color1.g, color1.b );\n\t\t\tcolorAttribute.setXYZ( i + 1, color2.r, color2.g, color2.b );\n\n\t\t}\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object.isBone === true ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push( ...getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\n/**\n * This displays a helper object consisting of a spherical mesh for\n * visualizing an instance of {@link PointLight}.\n *\n * ```js\n * const pointLight = new THREE.PointLight( 0xff0000, 1, 100 );\n * pointLight.position.set( 10, 10, 10 );\n * scene.add( pointLight );\n *\n * const sphereSize = 1;\n * const pointLightHelper = new THREE.PointLightHelper( pointLight, sphereSize );\n * scene.add( pointLightHelper );\n * ```\n *\n * @augments Mesh\n */\nclass PointLightHelper extends Mesh {\n\n\t/**\n\t * Constructs a new point light helper.\n\t *\n\t * @param {PointLight} light - The light to be visualized.\n\t * @param {number} [sphereSize=1] - The size of the sphere helper.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {HemisphereLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t}\n\n}\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\n/**\n * Creates a visual aid consisting of a spherical mesh for a\n * given {@link HemisphereLight}.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * const helper = new THREE.HemisphereLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass HemisphereLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new hemisphere light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The size of the mesh used to visualize the light.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {HemisphereLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'HemisphereLightHelper';\n\n\t\tconst geometry = new OctahedronGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tconst mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tmesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\n/**\n * The helper is an object to define grids. Grids are two-dimensional\n * arrays of lines.\n *\n * ```js\n * const size = 10;\n * const divisions = 10;\n *\n * const gridHelper = new THREE.GridHelper( size, divisions );\n * scene.add( gridHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass GridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new grid helper.\n\t *\n\t * @param {number} [size=10] - The size of the grid.\n\t * @param {number} [divisions=10] - The number of divisions across the grid.\n\t * @param {number|Color|string} [color1=0x444444] - The color of the center line.\n\t * @param {number|Color|string} [color2=0x888888] - The color of the lines of the grid.\n\t */\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This helper is an object to define polar grids. Grids are\n * two-dimensional arrays of lines.\n *\n * ```js\n * const radius = 10;\n * const sectors = 16;\n * const rings = 8;\n * const divisions = 64;\n *\n * const helper = new THREE.PolarGridHelper( radius, sectors, rings, divisions );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass PolarGridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new polar grid helper.\n\t *\n\t * @param {number} [radius=10] - The radius of the polar grid. This can be any positive number.\n\t * @param {number} [sectors=16] - The number of sectors the grid will be divided into. This can be any positive integer.\n\t * @param {number} [rings=16] - The number of rings. This can be any positive integer.\n\t * @param {number} [divisions=64] - The number of line segments used for each circle. This can be any positive integer.\n\t * @param {number|Color|string} [color1=0x444444] - The first color used for grid elements.\n\t * @param {number|Color|string} [color2=0x888888] - The second color used for grid elements.\n\t */\n\tconstructor( radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the sectors\n\n\t\tif ( sectors > 1 ) {\n\n\t\t\tfor ( let i = 0; i < sectors; i ++ ) {\n\n\t\t\t\tconst v = ( i / sectors ) * ( Math.PI * 2 );\n\n\t\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( x, 0, z );\n\n\t\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// create the rings\n\n\t\tfor ( let i = 0; i < rings; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / rings * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Helper object to assist with visualizing a {@link DirectionalLight}'s\n * effect on the scene. This consists of plane and a line representing the\n * light's position and direction.\n *\n * ```js\n * const light = new THREE.DirectionalLight( 0xFFFFFF );\n * scene.add( light );\n *\n * const helper = new THREE.DirectionalLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass DirectionalLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new directional light helper.\n\t *\n\t * @param {DirectionalLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The dimensions of the plane.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {DirectionalLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'DirectionalLightHelper';\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\t/**\n\t\t * Contains the line showing the location of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\t/**\n\t\t * Represents the target line of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t_v1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3.subVectors( _v2, _v1 );\n\n\t\tthis.lightPlane.lookAt( _v2 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( _v2 );\n\t\tthis.targetLine.scale.z = _v3.length();\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\n/**\n * This helps with visualizing what a camera contains in its frustum. It\n * visualizes the frustum of a camera using a line segments.\n *\n * Based on frustum visualization in [lightgl.js shadowmap example](https://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html).\n *\n * `CameraHelper` must be a child of the scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );\n * const helper = new THREE.CameraHelper( camera );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass CameraHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Camera} camera - The camera to visualize.\n\t */\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2' );\n\t\taddLine( 'n2', 'n4' );\n\t\taddLine( 'n4', 'n3' );\n\t\taddLine( 'n3', 'n1' );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2' );\n\t\taddLine( 'f2', 'f4' );\n\t\taddLine( 'f4', 'f3' );\n\t\taddLine( 'f3', 'f1' );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1' );\n\t\taddLine( 'n2', 'f2' );\n\t\taddLine( 'n3', 'f3' );\n\t\taddLine( 'n4', 'f4' );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1' );\n\t\taddLine( 'p', 'n2' );\n\t\taddLine( 'p', 'n3' );\n\t\taddLine( 'p', 'n4' );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2' );\n\t\taddLine( 'u2', 'u3' );\n\t\taddLine( 'u3', 'u1' );\n\n\t\t// target\n\n\t\taddLine( 'c', 't' );\n\t\taddLine( 'p', 'c' );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2' );\n\t\taddLine( 'cn3', 'cn4' );\n\n\t\taddLine( 'cf1', 'cf2' );\n\t\taddLine( 'cf3', 'cf4' );\n\n\t\tfunction addLine( a, b ) {\n\n\t\t\taddPoint( a );\n\t\t\taddPoint( b );\n\n\t\t}\n\n\t\tfunction addPoint( id ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\n\n\t\t/**\n\t\t * The camera being visualized.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * This contains the points used to visualize the camera.\n\t\t *\n\t\t * @type {Object>}\n\t\t */\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\tthis.setColors( colorFrustum, colorCone, colorUp, colorTarget, colorCross );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} frustum - The frustum line color.\n\t * @param {Color} cone - The cone line color.\n\t * @param {Color} up - The up line color.\n\t * @param {Color} target - The target line color.\n\t * @param {Color} cross - The cross line color.\n\t * @return {CameraHelper} A reference to this helper.\n\t */\n\tsetColors( frustum, cone, up, target, cross ) {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\t// near\n\n\t\tcolorAttribute.setXYZ( 0, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 1, frustum.r, frustum.g, frustum.b ); // n1, n2\n\t\tcolorAttribute.setXYZ( 2, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 3, frustum.r, frustum.g, frustum.b ); // n2, n4\n\t\tcolorAttribute.setXYZ( 4, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 5, frustum.r, frustum.g, frustum.b ); // n4, n3\n\t\tcolorAttribute.setXYZ( 6, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 7, frustum.r, frustum.g, frustum.b ); // n3, n1\n\n\t\t// far\n\n\t\tcolorAttribute.setXYZ( 8, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 9, frustum.r, frustum.g, frustum.b ); // f1, f2\n\t\tcolorAttribute.setXYZ( 10, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 11, frustum.r, frustum.g, frustum.b ); // f2, f4\n\t\tcolorAttribute.setXYZ( 12, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 13, frustum.r, frustum.g, frustum.b ); // f4, f3\n\t\tcolorAttribute.setXYZ( 14, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 15, frustum.r, frustum.g, frustum.b ); // f3, f1\n\n\t\t// sides\n\n\t\tcolorAttribute.setXYZ( 16, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 17, frustum.r, frustum.g, frustum.b ); // n1, f1\n\t\tcolorAttribute.setXYZ( 18, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 19, frustum.r, frustum.g, frustum.b ); // n2, f2\n\t\tcolorAttribute.setXYZ( 20, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 21, frustum.r, frustum.g, frustum.b ); // n3, f3\n\t\tcolorAttribute.setXYZ( 22, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 23, frustum.r, frustum.g, frustum.b ); // n4, f4\n\n\t\t// cone\n\n\t\tcolorAttribute.setXYZ( 24, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 25, cone.r, cone.g, cone.b ); // p, n1\n\t\tcolorAttribute.setXYZ( 26, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 27, cone.r, cone.g, cone.b ); // p, n2\n\t\tcolorAttribute.setXYZ( 28, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 29, cone.r, cone.g, cone.b ); // p, n3\n\t\tcolorAttribute.setXYZ( 30, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 31, cone.r, cone.g, cone.b ); // p, n4\n\n\t\t// up\n\n\t\tcolorAttribute.setXYZ( 32, up.r, up.g, up.b ); colorAttribute.setXYZ( 33, up.r, up.g, up.b ); // u1, u2\n\t\tcolorAttribute.setXYZ( 34, up.r, up.g, up.b ); colorAttribute.setXYZ( 35, up.r, up.g, up.b ); // u2, u3\n\t\tcolorAttribute.setXYZ( 36, up.r, up.g, up.b ); colorAttribute.setXYZ( 37, up.r, up.g, up.b ); // u3, u1\n\n\t\t// target\n\n\t\tcolorAttribute.setXYZ( 38, target.r, target.g, target.b ); colorAttribute.setXYZ( 39, target.r, target.g, target.b ); // c, t\n\t\tcolorAttribute.setXYZ( 40, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 41, cross.r, cross.g, cross.b ); // p, c\n\n\t\t// cross\n\n\t\tcolorAttribute.setXYZ( 42, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 43, cross.r, cross.g, cross.b ); // cn1, cn2\n\t\tcolorAttribute.setXYZ( 44, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 45, cross.r, cross.g, cross.b ); // cn3, cn4\n\n\t\tcolorAttribute.setXYZ( 46, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 47, cross.r, cross.g, cross.b ); // cf1, cf2\n\t\tcolorAttribute.setXYZ( 48, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 49, cross.r, cross.g, cross.b ); // cf3, cf4\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the helper based on the projection matrix of the camera.\n\t */\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\tlet nearZ, farZ;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// Adjust z values based on coordinate system\n\n\t\tif ( this.camera.reversedDepth === true ) {\n\n\t\t\tnearZ = 1;\n\t\t\tfarZ = 0;\n\n\t\t} else {\n\n\t\t\tif ( this.camera.coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tnearZ = -1;\n\t\t\t\tfarZ = 1;\n\n\t\t\t} else if ( this.camera.coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tnearZ = 0;\n\t\t\t\tfarZ = 1;\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.CameraHelper.update(): Invalid coordinate system: ' + this.camera.coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// center / target\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, nearZ );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, farZ );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, nearZ );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, nearZ );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, nearZ );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, nearZ );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, farZ );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, farZ );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, farZ );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, farZ );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, nearZ );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, farZ );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, farZ );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, farZ );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, farZ );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, nearZ );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, nearZ );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, nearZ );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, nearZ );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box = /*@__PURE__*/ new Box3();\n\n/**\n * Helper object to graphically show the world-axis-aligned bounding box\n * around an object. The actual bounding box is handled with {@link Box3},\n * this is just a visual helper for debugging. It can be automatically\n * resized with {@link BoxHelper#update} when the object it's created from\n * is transformed. Note that the object must have a geometry for this to work,\n * so it won't work with sprites.\n *\n * ```js\n * const sphere = new THREE.SphereGeometry();\n * const object = new THREE.Mesh( sphere, new THREE.MeshBasicMaterial( 0xff0000 ) );\n * const box = new THREE.BoxHelper( object, 0xffff00 );\n * scene.add( box );\n * ```\n *\n * @augments LineSegments\n */\nclass BoxHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new box helper.\n\t *\n\t * @param {Object3D} [object] - The 3D object to show the world-axis-aligned bounding box.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The 3D object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Updates the helper's geometry to match the dimensions of the object,\n\t * including any children.\n\t */\n\tupdate() {\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\t_box.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box.isEmpty() ) return;\n\n\t\tconst min = _box.min;\n\t\tconst max = _box.max;\n\n\t\t/*\n\t\t\t5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tconst position = this.geometry.attributes.position;\n\t\tconst array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\t/**\n\t * Updates the wireframe box for the passed object.\n\t *\n\t * @param {Object3D} object - The 3D object to create the helper for.\n\t * @return {BoxHelper} A reference to this instance.\n\t */\n\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Box3}.\n *\n * ```js\n * const box = new THREE.Box3();\n * box.setFromCenterAndSize( new THREE.Vector3( 1, 1, 1 ), new THREE.Vector3( 2, 1, 3 ) );\n *\n * const helper = new THREE.Box3Helper( box, 0xffff00 );\n * scene.add( helper )\n * ```\n *\n * @augments LineSegments\n */\nclass Box3Helper extends LineSegments {\n\n\t/**\n\t * Constructs a new box3 helper.\n\t *\n\t * @param {Box3} box - The box to visualize.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\t\tconst positions = [ 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1 ];\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The box being visualized.\n\t\t *\n\t\t * @type {Box3}\n\t\t */\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Plane}.\n *\n * ```js\n * const plane = new THREE.Plane( new THREE.Vector3( 1, 1, 0.2 ), 3 );\n * const helper = new THREE.PlaneHelper( plane, 1, 0xffff00 );\n * scene.add( helper );\n * ```\n *\n * @augments Line\n */\nclass PlaneHelper extends Line {\n\n\t/**\n\t * Constructs a new plane helper.\n\t *\n\t * @param {Plane} plane - The plane to be visualized.\n\t * @param {number} [size=1] - The side length of plane helper.\n\t * @param {number|Color|string} [hex=0xffff00] - The helper's color.\n\t */\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\t/**\n\t\t * The plane being visualized.\n\t\t *\n\t\t * @type {Plane}\n\t\t */\n\t\tthis.plane = plane;\n\n\t\t/**\n\t\t * The side length of plane helper.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tthis.position.set( 0, 0, 0 );\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, 1 );\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tthis.translateZ( - this.plane.constant );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\n/**\n * An 3D arrow object for visualizing directions.\n *\n * ```js\n * const dir = new THREE.Vector3( 1, 2, 0 );\n *\n * //normalize the direction vector (convert to vector of length 1)\n * dir.normalize();\n *\n * const origin = new THREE.Vector3( 0, 0, 0 );\n * const length = 1;\n * const hex = 0xffff00;\n *\n * const arrowHelper = new THREE.ArrowHelper( dir, origin, length, hex );\n * scene.add( arrowHelper );\n * ```\n *\n * @augments Object3D\n */\nclass ArrowHelper extends Object3D {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Vector3} [dir=(0, 0, 1)] - The (normalized) direction vector.\n\t * @param {Vector3} [origin=(0, 0, 0)] - Point at which the arrow starts.\n\t * @param {number} [length=1] - Length of the arrow in world units.\n\t * @param {(number|Color|string)} [color=0xffff00] - Color of the arrow.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tconstructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new ConeGeometry( 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, -0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\t/**\n\t\t * The line part of the arrow helper.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\t/**\n\t\t * The cone part of the arrow helper.\n\t\t *\n\t\t * @type {Mesh}\n\t\t */\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\t/**\n\t * Sets the direction of the helper.\n\t *\n\t * @param {Vector3} dir - The normalized direction vector.\n\t */\n\tsetDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < -0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the length of the helper.\n\t *\n\t * @param {number} length - Length of the arrow in world units.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tsetLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t}\n\n\t/**\n\t * Sets the color of the helper.\n\t *\n\t * @param {number|Color|string} color - The color to set.\n\t */\n\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.line.geometry.dispose();\n\t\tthis.line.material.dispose();\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n}\n\n/**\n * An axis object to visualize the 3 axes in a simple way.\n * The X axis is red. The Y axis is green. The Z axis is blue.\n *\n * ```js\n * const axesHelper = new THREE.AxesHelper( 5 );\n * scene.add( axesHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass AxesHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new axes helper.\n\t *\n\t * @param {number} [size=1] - Size of the lines representing the axes.\n\t */\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n\t/**\n\t * Defines the colors of the axes helper.\n\t *\n\t * @param {number|Color|string} xAxisColor - The color for the x axis.\n\t * @param {number|Color|string} yAxisColor - The color for the y axis.\n\t * @param {number|Color|string} zAxisColor - The color for the z axis.\n\t * @return {AxesHelper} A reference to this axes helper.\n\t */\n\tsetColors( xAxisColor, yAxisColor, zAxisColor ) {\n\n\t\tconst color = new Color();\n\t\tconst array = this.geometry.attributes.color.array;\n\n\t\tcolor.set( xAxisColor );\n\t\tcolor.toArray( array, 0 );\n\t\tcolor.toArray( array, 3 );\n\n\t\tcolor.set( yAxisColor );\n\t\tcolor.toArray( array, 6 );\n\t\tcolor.toArray( array, 9 );\n\n\t\tcolor.set( zAxisColor );\n\t\tcolor.toArray( array, 12 );\n\t\tcolor.toArray( array, 15 );\n\n\t\tthis.geometry.attributes.color.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This class is used to convert a series of paths to an array of\n * shapes. It is specifically used in context of fonts and SVG.\n */\nclass ShapePath {\n\n\t/**\n\t * Constructs a new shape path.\n\t */\n\tconstructor() {\n\n\t\tthis.type = 'ShapePath';\n\n\t\t/**\n\t\t * The color of the shape.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color();\n\n\t\t/**\n\t\t * The paths that have been generated for this shape.\n\t\t *\n\t\t * @type {Array}\n\t\t * @default null\n\t\t */\n\t\tthis.subPaths = [];\n\n\t\t/**\n\t\t * The current path that is being generated.\n\t\t *\n\t\t * @type {?Path}\n\t\t * @default null\n\t\t */\n\t\tthis.currentPath = null;\n\n\t}\n\n\t/**\n\t * Creates a new path and moves it current point to the given one.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array} pts - An array of points in 2D space.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts the paths into an array of shapes.\n\t *\n\t * @param {boolean} isCCW - By default solid shapes are defined clockwise (CW) and holes are defined counterclockwise (CCW).\n\t * If this flag is set to `true`, then those are flipped.\n\t * @return {Array} An array of shapes.\n\t */\n\ttoShapes( isCCW ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tlet toChange = 0;\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange ++;\n\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( toChange > 0 && ambiguous === false ) {\n\n\t\t\t\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n}\n\n/**\n * Abstract base class for controls.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Controls extends EventDispatcher {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Object3D} object - The object that is managed by the controls.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The object that is managed by the controls.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * The HTML element used for event listeners.\n\t\t *\n\t\t * @type {?HTMLElement}\n\t\t * @default null\n\t\t */\n\t\tthis.domElement = domElement;\n\n\t\t/**\n\t\t * Whether the controls responds to user input or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * The internal state of the controls.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.state = -1;\n\n\t\t/**\n\t\t * This object defines the keyboard input of the controls.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.keys = {};\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to the available mouse buttons.\n\t\t * It depends on the control implementation what kind of mouse buttons and actions are supported.\n\t\t *\n\t\t * @type {{LEFT: ?number, MIDDLE: ?number, RIGHT: ?number}}\n\t\t */\n\t\tthis.mouseButtons = { LEFT: null, MIDDLE: null, RIGHT: null };\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to what kind of touch interaction.\n\t\t * It depends on the control implementation what kind of touch interaction and actions are supported.\n\t\t *\n\t\t * @type {{ONE: ?number, TWO: ?number}}\n\t\t */\n\t\tthis.touches = { ONE: null, TWO: null };\n\n\t}\n\n\t/**\n\t * Connects the controls to the DOM. This method has so called \"side effects\" since\n\t * it adds the module's event listeners to the DOM.\n\t *\n\t * @param {HTMLElement} element - The DOM element to connect to.\n\t */\n\tconnect( element ) {\n\n\t\tif ( element === undefined ) {\n\n\t\t\twarn( 'Controls: connect() now requires an element.' ); // @deprecated, the warning can be removed with r185\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.domElement !== null ) this.disconnect();\n\n\t\tthis.domElement = element;\n\n\t}\n\n\t/**\n\t * Disconnects the controls from the DOM.\n\t */\n\tdisconnect() {}\n\n\t/**\n\t * Call this method if you no longer want use to the controls. It frees all internal\n\t * resources and removes all event listeners.\n\t */\n\tdispose() {}\n\n\t/**\n\t * Controls should implement this method if they have to update their internal state\n\t * per simulation step.\n\t *\n\t * @param {number} [delta] - The time delta in seconds.\n\t */\n\tupdate( /* delta */ ) {}\n\n}\n\n/**\n * Scales the texture as large as possible within its surface without cropping\n * or stretching the texture. The method preserves the original aspect ratio of\n * the texture. Akin to CSS `object-fit: contain`\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction contain( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t} else {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Scales the texture to the smallest possible size to fill the surface, leaving\n * no empty space. The method preserves the original aspect ratio of the texture.\n * Akin to CSS `object-fit: cover`.\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction cover( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t} else {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n *\n * @param {Texture} texture - The texture.\n * @return {Texture} The updated texture.\n */\nfunction fill( texture ) {\n\n\ttexture.repeat.x = 1;\n\ttexture.repeat.y = 1;\n\n\ttexture.offset.x = 0;\n\ttexture.offset.y = 0;\n\n\treturn texture;\n\n}\n\n/**\n * Determines how many bytes must be used to represent the texture.\n *\n * @param {number} width - The width of the texture.\n * @param {number} height - The height of the texture.\n * @param {number} format - The texture's format.\n * @param {number} type - The texture's type.\n * @return {number} The byte length.\n */\nfunction getByteLength( width, height, format, type ) {\n\n\tconst typeByteLength = getTextureTypeByteLength( type );\n\n\tswitch ( format ) {\n\n\t\t// https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml\n\t\tcase AlphaFormat:\n\t\t\treturn width * height;\n\t\tcase RedFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RedIntegerFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGIntegerFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBFormat:\n\t\t\treturn ( ( width * height * 3 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAIntegerFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/\n\t\tcase RGB_S3TC_DXT1_Format:\n\t\tcase RGBA_S3TC_DXT1_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_S3TC_DXT3_Format:\n\t\tcase RGBA_S3TC_DXT5_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/\n\t\tcase RGB_PVRTC_2BPPV1_Format:\n\t\tcase RGBA_PVRTC_2BPPV1_Format:\n\t\t\treturn ( Math.max( width, 16 ) * Math.max( height, 8 ) ) / 4;\n\t\tcase RGB_PVRTC_4BPPV1_Format:\n\t\tcase RGBA_PVRTC_4BPPV1_Format:\n\t\t\treturn ( Math.max( width, 8 ) * Math.max( height, 8 ) ) / 2;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/\n\t\tcase RGB_ETC1_Format:\n\t\tcase RGB_ETC2_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_ETC2_EAC_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/\n\t\tcase RGBA_ASTC_4x4_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x4_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x5_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x5_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x6_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x5_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_8x6_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x8_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x5_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_10x6_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_10x8_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x10_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x10_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x12_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 11 ) / 12 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/\n\t\tcase RGBA_BPTC_Format:\n\t\tcase RGB_BPTC_SIGNED_Format:\n\t\tcase RGB_BPTC_UNSIGNED_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_rgtc/\n\t\tcase RED_RGTC1_Format:\n\t\tcase SIGNED_RED_RGTC1_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 8;\n\t\tcase RED_GREEN_RGTC2_Format:\n\t\tcase SIGNED_RED_GREEN_RGTC2_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t}\n\n\tthrow new Error(\n\t\t`Unable to determine texture byte length for ${format} format.`,\n\t);\n\n}\n\nfunction getTextureTypeByteLength( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase UnsignedByteType:\n\t\tcase ByteType:\n\t\t\treturn { byteLength: 1, components: 1 };\n\t\tcase UnsignedShortType:\n\t\tcase ShortType:\n\t\tcase HalfFloatType:\n\t\t\treturn { byteLength: 2, components: 1 };\n\t\tcase UnsignedShort4444Type:\n\t\tcase UnsignedShort5551Type:\n\t\t\treturn { byteLength: 2, components: 4 };\n\t\tcase UnsignedIntType:\n\t\tcase IntType:\n\t\tcase FloatType:\n\t\t\treturn { byteLength: 4, components: 1 };\n\t\tcase UnsignedInt5999Type:\n\t\tcase UnsignedInt101111Type:\n\t\t\treturn { byteLength: 4, components: 3 };\n\n\t}\n\n\tthrow new Error( `Unknown texture type ${type}.` );\n\n}\n\n/**\n * A class containing utility functions for textures.\n *\n * @hideconstructor\n */\nclass TextureUtils {\n\n\t/**\n\t * Scales the texture as large as possible within its surface without cropping\n\t * or stretching the texture. The method preserves the original aspect ratio of\n\t * the texture. Akin to CSS `object-fit: contain`\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic contain( texture, aspect ) {\n\n\t\treturn contain( texture, aspect );\n\n\t}\n\n\t/**\n\t * Scales the texture to the smallest possible size to fill the surface, leaving\n\t * no empty space. The method preserves the original aspect ratio of the texture.\n\t * Akin to CSS `object-fit: cover`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic cover( texture, aspect ) {\n\n\t\treturn cover( texture, aspect );\n\n\t}\n\n\t/**\n\t * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic fill( texture ) {\n\n\t\treturn fill( texture );\n\n\t}\n\n\t/**\n\t * Determines how many bytes must be used to represent the texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} format - The texture's format.\n\t * @param {number} type - The texture's type.\n\t * @return {number} The byte length.\n\t */\n\tstatic getByteLength( width, height, format, type ) {\n\n\t\treturn getByteLength( width, height, format, type );\n\n\t}\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\n}\n\nif ( typeof window !== 'undefined' ) {\n\n\tif ( window.__THREE__ ) {\n\n\t\twarn( 'WARNING: Multiple instances of Three.js being imported.' );\n\n\t} else {\n\n\t\twindow.__THREE__ = REVISION;\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, ConstantAlphaFactor, ConstantColorFactor, Controls, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExternalTexture, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, FrustumArray, GLBufferAttribute, GLSL1, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, Path, PerspectiveCamera, Plane, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RAD2DEG, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBDepthPacking, RGBFormat, RGBIntegerFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGDepthPacking, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RenderTarget, RenderTarget3D, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry, Texture, TextureLoader, TextureUtils, Timer, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsUtils, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGPUCoordinateSystem, WebXRController, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, arrayNeedsUint32, cloneUniforms, createCanvasElement, createElementNS, error, getByteLength, getConsoleFunction, getUnlitUniformColorSpace, log, mergeUniforms, probeAsync, setConsoleFunction, warn, warnOnce };\n","/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nimport { Matrix3, Vector2, Color, mergeUniforms, Vector3, CubeUVReflectionMapping, Mesh, BoxGeometry, ShaderMaterial, BackSide, cloneUniforms, Euler, Matrix4, ColorManagement, SRGBTransfer, PlaneGeometry, FrontSide, getUnlitUniformColorSpace, IntType, warn, HalfFloatType, UnsignedByteType, FloatType, RGBAFormat, Plane, EquirectangularReflectionMapping, EquirectangularRefractionMapping, WebGLCubeRenderTarget, CubeReflectionMapping, CubeRefractionMapping, BufferGeometry, OrthographicCamera, PerspectiveCamera, NoToneMapping, MeshBasicMaterial, error, NoBlending, WebGLRenderTarget, BufferAttribute, LinearSRGBColorSpace, LinearFilter, warnOnce, Uint32BufferAttribute, Uint16BufferAttribute, arrayNeedsUint32, Vector4, DataArrayTexture, CubeTexture, Data3DTexture, LessEqualCompare, DepthTexture, Texture, GLSL3, PCFShadowMap, PCFSoftShadowMap, VSMShadowMap, CustomToneMapping, NeutralToneMapping, AgXToneMapping, ACESFilmicToneMapping, CineonToneMapping, ReinhardToneMapping, LinearToneMapping, LinearTransfer, AddOperation, MixOperation, MultiplyOperation, UniformsUtils, DoubleSide, NormalBlending, TangentSpaceNormalMap, ObjectSpaceNormalMap, Layers, Frustum, MeshDepthMaterial, RGBADepthPacking, MeshDistanceMaterial, NearestFilter, LessEqualDepth, ReverseSubtractEquation, SubtractEquation, AddEquation, OneMinusConstantAlphaFactor, ConstantAlphaFactor, OneMinusConstantColorFactor, ConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, DstAlphaFactor, DstColorFactor, SrcAlphaSaturateFactor, SrcAlphaFactor, SrcColorFactor, OneFactor, ZeroFactor, NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceNone, CullFaceBack, CullFaceFront, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, MinEquation, MaxEquation, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NotEqualCompare, GreaterCompare, GreaterEqualCompare, EqualCompare, LessCompare, AlwaysCompare, NeverCompare, NoColorSpace, DepthStencilFormat, getByteLength, DepthFormat, UnsignedIntType, UnsignedInt248Type, UnsignedShortType, createElementNS, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt5999Type, UnsignedInt101111Type, ByteType, ShortType, AlphaFormat, RGBFormat, RedFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, ExternalTexture, EventDispatcher, ArrayCamera, WebXRController, RAD2DEG, DataTexture, createCanvasElement, SRGBColorSpace, REVISION, log, WebGLCoordinateSystem, probeAsync } from './three.core.js';\nexport { AdditiveAnimationBlendMode, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxHelper, BufferGeometryLoader, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CircleGeometry, Clock, ColorKeyframeTrack, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, Controls, CubeCamera, CubeTextureLoader, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceFrontBack, Curve, CurvePath, CylinderGeometry, Cylindrical, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualStencilFunc, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, Fog, FogExp2, FramebufferTexture, FrustumArray, GLBufferAttribute, GLSL1, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NeverStencilFunc, NormalAnimationBlendMode, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, OctahedronGeometry, Path, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RGBDepthPacking, RGBIntegerFormat, RGDepthPacking, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RenderTarget, RenderTarget3D, ReplaceStencilOp, RingGeometry, Scene, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, TOUCH, TetrahedronGeometry, TextureLoader, TextureUtils, Timer, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGPUCoordinateSystem, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroSlopeEnding, ZeroStencilOp, getConsoleFunction, setConsoleFunction } from './three.core.js';\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl ) {\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\t\tconst size = array.byteLength;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( typeof Float16Array !== 'undefined' && array instanceof Float16Array ) {\n\n\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version,\n\t\t\tsize: size\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRanges = attribute.updateRanges;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\t// Not using update ranges\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.bufferSubData`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif ( range.start <= previousRange.start + previousRange.count + 1 ) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tgl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, range.start, range.count );\n\n\t\t\t}\n\n\t\t\tattribute.clearUpdateRanges();\n\n\t\t}\n\n\t\tattribute.onUploadCallback();\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tif ( data.size !== attribute.array.byteLength ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLAttributes: The size of the buffer attribute\\'s array buffer does not match the original size. Resizing buffer attributes is not supported.' );\n\n\t\t\t}\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\nvar alphahash_fragment = \"#ifdef USE_ALPHAHASH\\n\\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\\n#endif\";\n\nvar alphahash_pars_fragment = \"#ifdef USE_ALPHAHASH\\n\\tconst float ALPHA_HASH_SCALE = 0.05;\\n\\tfloat hash2D( vec2 value ) {\\n\\t\\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\\n\\t}\\n\\tfloat hash3D( vec3 value ) {\\n\\t\\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\\n\\t}\\n\\tfloat getAlphaHashThreshold( vec3 position ) {\\n\\t\\tfloat maxDeriv = max(\\n\\t\\t\\tlength( dFdx( position.xyz ) ),\\n\\t\\t\\tlength( dFdy( position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\\n\\t\\tvec2 pixScales = vec2(\\n\\t\\t\\texp2( floor( log2( pixScale ) ) ),\\n\\t\\t\\texp2( ceil( log2( pixScale ) ) )\\n\\t\\t);\\n\\t\\tvec2 alpha = vec2(\\n\\t\\t\\thash3D( floor( pixScales.x * position.xyz ) ),\\n\\t\\t\\thash3D( floor( pixScales.y * position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat lerpFactor = fract( log2( pixScale ) );\\n\\t\\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\\n\\t\\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\\n\\t\\tvec3 cases = vec3(\\n\\t\\t\\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\\n\\t\\t\\t( x - 0.5 * a ) / ( 1.0 - a ),\\n\\t\\t\\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\\n\\t\\t);\\n\\t\\tfloat threshold = ( x < ( 1.0 - a ) )\\n\\t\\t\\t? ( ( x < a ) ? cases.x : cases.y )\\n\\t\\t\\t: cases.z;\\n\\t\\treturn clamp( threshold , 1.0e-6, 1.0 );\\n\\t}\\n#endif\";\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef USE_ALPHATEST\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\tdiffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\\n\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\tif ( diffuseColor.a < alphaTest ) discard;\\n\\t#endif\\n#endif\";\n\nvar alphatest_pars_fragment = \"#ifdef USE_ALPHATEST\\n\\tuniform float alphaTest;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_CLEARCOAT ) \\n\\t\\tclearcoatSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_SHEEN ) \\n\\t\\tsheenSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar batching_pars_vertex = \"#ifdef USE_BATCHING\\n\\t#if ! defined( GL_ANGLE_multi_draw )\\n\\t#define gl_DrawID _gl_DrawID\\n\\tuniform int _gl_DrawID;\\n\\t#endif\\n\\tuniform highp sampler2D batchingTexture;\\n\\tuniform highp usampler2D batchingIdTexture;\\n\\tmat4 getBatchingMatrix( const in float i ) {\\n\\t\\tint size = textureSize( batchingTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n\\tfloat getIndirectIndex( const in int i ) {\\n\\t\\tint size = textureSize( batchingIdTexture, 0 ).x;\\n\\t\\tint x = i % size;\\n\\t\\tint y = i / size;\\n\\t\\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\\n\\t}\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tuniform sampler2D batchingColorTexture;\\n\\tvec3 getBatchingColor( const in float i ) {\\n\\t\\tint size = textureSize( batchingColorTexture, 0 ).x;\\n\\t\\tint j = int( i );\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\\n\\t}\\n#endif\";\n\nvar batching_vertex = \"#ifdef USE_BATCHING\\n\\tmat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\\n#ifdef USE_ALPHAHASH\\n\\tvPosition = vec3( position );\\n#endif\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"float G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n} // validated\";\n\nvar iridescence_fragment = \"#ifdef USE_IRIDESCENCE\\n\\tconst mat3 XYZ_TO_REC709 = mat3(\\n\\t\\t 3.2404542, -0.9692660, 0.0556434,\\n\\t\\t-1.5371385, 1.8760108, -0.2040259,\\n\\t\\t-0.4985314, 0.0415560, 1.0572252\\n\\t);\\n\\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\\n\\t\\tvec3 sqrtF0 = sqrt( fresnel0 );\\n\\t\\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\\n\\t}\\n\\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\\n\\t}\\n\\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\\n\\t}\\n\\tvec3 evalSensitivity( float OPD, vec3 shift ) {\\n\\t\\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\\n\\t\\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\\n\\t\\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\\n\\t\\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\\n\\t\\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\\n\\t\\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\\n\\t\\txyz /= 1.0685e-7;\\n\\t\\tvec3 rgb = XYZ_TO_REC709 * xyz;\\n\\t\\treturn rgb;\\n\\t}\\n\\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\\n\\t\\tvec3 I;\\n\\t\\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\\n\\t\\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\\n\\t\\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\\n\\t\\tif ( cosTheta2Sq < 0.0 ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t}\\n\\t\\tfloat cosTheta2 = sqrt( cosTheta2Sq );\\n\\t\\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\\n\\t\\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\\n\\t\\tfloat T121 = 1.0 - R12;\\n\\t\\tfloat phi12 = 0.0;\\n\\t\\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\\n\\t\\tfloat phi21 = PI - phi12;\\n\\t\\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\\t\\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\\n\\t\\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\\n\\t\\tvec3 phi23 = vec3( 0.0 );\\n\\t\\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\\n\\t\\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\\n\\t\\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\\n\\t\\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\\n\\t\\tvec3 phi = vec3( phi21 ) + phi23;\\n\\t\\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\\n\\t\\tvec3 r123 = sqrt( R123 );\\n\\t\\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\\n\\t\\tvec3 C0 = R12 + Rs;\\n\\t\\tI = C0;\\n\\t\\tvec3 Cm = Rs - T121;\\n\\t\\tfor ( int m = 1; m <= 2; ++ m ) {\\n\\t\\t\\tCm *= r123;\\n\\t\\t\\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\\n\\t\\t\\tI += Cm * Sm;\\n\\t\\t}\\n\\t\\treturn max( I, vec3( 0.0 ) );\\n\\t}\\n#endif\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vBumpMapUv );\\n\\t\\tvec2 dSTdy = dFdy( vBumpMapUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\\n\\t\\tvec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\\n\\t\\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\t\\tfloat distanceToPlane, distanceGradient;\\n\\t\\tfloat clipOpacity = 1.0;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\tif ( clipOpacity == 0.0 ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tfloat unionClipOpacity = 1.0;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\t\\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tclipOpacity *= 1.0 - unionClipOpacity;\\n\\t\\t#endif\\n\\t\\tdiffuseColor.a *= clipOpacity;\\n\\t\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tbool clipped = true;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tif ( clipped ) discard;\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tdiffuseColor *= vColor;\\n#elif defined( USE_COLOR )\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvColor = vec4( 1.0 );\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvColor = vec3( 1.0 );\\n#endif\\n#ifdef USE_COLOR\\n\\tvColor *= color;\\n#endif\\n#ifdef USE_INSTANCING_COLOR\\n\\tvColor.xyz *= instanceColor.xyz;\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\\n\\tvColor.xyz *= batchingColor.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nvec3 pow2( const in vec3 x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract( sin( sn ) * c );\\n}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\n#ifdef USE_ALPHAHASH\\n\\tvarying vec3 vPosition;\\n#endif\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n} // validated\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_minMipLevel 4.0\\n\\t#define cubeUV_minTileSize 16.0\\n\\tfloat getFace( vec3 direction ) {\\n\\t\\tvec3 absDirection = abs( direction );\\n\\t\\tfloat face = - 1.0;\\n\\t\\tif ( absDirection.x > absDirection.z ) {\\n\\t\\t\\tif ( absDirection.x > absDirection.y )\\n\\t\\t\\t\\tface = direction.x > 0.0 ? 0.0 : 3.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t} else {\\n\\t\\t\\tif ( absDirection.z > absDirection.y )\\n\\t\\t\\t\\tface = direction.z > 0.0 ? 2.0 : 5.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t}\\n\\t\\treturn face;\\n\\t}\\n\\tvec2 getUV( vec3 direction, float face ) {\\n\\t\\tvec2 uv;\\n\\t\\tif ( face == 0.0 ) {\\n\\t\\t\\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 1.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\\n\\t\\t} else if ( face == 2.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\\n\\t\\t} else if ( face == 3.0 ) {\\n\\t\\t\\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 4.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\\n\\t\\t} else {\\n\\t\\t\\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\\n\\t\\t}\\n\\t\\treturn 0.5 * ( uv + 1.0 );\\n\\t}\\n\\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\\n\\t\\tfloat face = getFace( direction );\\n\\t\\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\\n\\t\\tmipInt = max( mipInt, cubeUV_minMipLevel );\\n\\t\\tfloat faceSize = exp2( mipInt );\\n\\t\\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\\n\\t\\tif ( face > 2.0 ) {\\n\\t\\t\\tuv.y += faceSize;\\n\\t\\t\\tface -= 3.0;\\n\\t\\t}\\n\\t\\tuv.x += face * faceSize;\\n\\t\\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\\n\\t\\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\\n\\t\\tuv.x *= CUBEUV_TEXEL_WIDTH;\\n\\t\\tuv.y *= CUBEUV_TEXEL_HEIGHT;\\n\\t\\t#ifdef texture2DGradEXT\\n\\t\\t\\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( envMap, uv ).rgb;\\n\\t\\t#endif\\n\\t}\\n\\t#define cubeUV_r0 1.0\\n\\t#define cubeUV_m0 - 2.0\\n\\t#define cubeUV_r1 0.8\\n\\t#define cubeUV_m1 - 1.0\\n\\t#define cubeUV_r4 0.4\\n\\t#define cubeUV_m4 2.0\\n\\t#define cubeUV_r5 0.305\\n\\t#define cubeUV_m5 3.0\\n\\t#define cubeUV_r6 0.21\\n\\t#define cubeUV_m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= cubeUV_r1 ) {\\n\\t\\t\\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\\n\\t\\t} else if ( roughness >= cubeUV_r4 ) {\\n\\t\\t\\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\\n\\t\\t} else if ( roughness >= cubeUV_r5 ) {\\n\\t\\t\\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\\n\\t\\t} else if ( roughness >= cubeUV_r6 ) {\\n\\t\\t\\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\\n\\t\\t} else {\\n\\t\\t\\tmip = - 2.0 * log2( 1.16 * roughness );\\t\\t}\\n\\t\\treturn mip;\\n\\t}\\n\\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\\n\\t\\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\\n\\t\\tfloat mipF = fract( mip );\\n\\t\\tfloat mipInt = floor( mip );\\n\\t\\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\\n\\t\\tif ( mipF == 0.0 ) {\\n\\t\\t\\treturn vec4( color0, 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\\n\\t\\t\\treturn vec4( mix( color0, color1, mipF ), 1.0 );\\n\\t\\t}\\n\\t}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = objectTangent;\\n#endif\\n#ifdef USE_BATCHING\\n\\tmat3 bm = mat3( batchingMatrix );\\n\\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\\n\\ttransformedNormal = bm * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = bm * transformedTangent;\\n\\t#endif\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmat3 im = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\\n\\ttransformedNormal = im * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = im * transformedTangent;\\n\\t#endif\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\\n\\t\\temissiveColor = sRGBTransferEOTF( emissiveColor );\\n\\t#endif\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar colorspace_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar colorspace_pars_fragment = \"vec4 LinearTransferOETF( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 sRGBTransferEOTF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\\n}\\nvec4 sRGBTransferOETF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\";\n\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\tuniform mat3 envMapRotation;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tvFogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float vFogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float vFogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn vec3( texture2D( gradientMap, coord ).r );\\n\\t#else\\n\\t\\tvec2 fw = fwidth( coord ) * 0.5;\\n\\t\\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\\n\\t#endif\\n}\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_fragment = \"LambertMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_lambert_pars_fragment = \"varying vec3 vViewPosition;\\nstruct LambertMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Lambert\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Lambert\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\n#if defined( USE_LIGHT_PROBES )\\n\\tuniform vec3 lightProbe[ 9 ];\\n#endif\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\\n\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\treturn irradiance;\\n}\\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\tif ( cutoffDistance > 0.0 ) {\\n\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t}\\n\\treturn distanceFalloff;\\n}\\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\\n\\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\\n\\t\\tlight.color = directionalLight.color;\\n\\t\\tlight.direction = directionalLight.direction;\\n\\t\\tlight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = pointLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tlight.color = pointLight.color;\\n\\t\\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = spotLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat angleCos = dot( light.direction, spotLight.direction );\\n\\t\\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\tif ( spotAttenuation > 0.0 ) {\\n\\t\\t\\tfloat lightDistance = length( lVector );\\n\\t\\t\\tlight.color = spotLight.color * spotAttenuation;\\n\\t\\t\\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t\\t} else {\\n\\t\\t\\tlight.color = vec3( 0.0 );\\n\\t\\t\\tlight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\\n\\t\\tfloat dotNL = dot( normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tvec3 getIBLIrradiance( const in vec3 normal ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\\n\\t\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 reflectVec = reflect( - viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, pow4( roughness ) ) );\\n\\t\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\\n\\t\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\\n\\t\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\t\\tvec3 bentNormal = cross( bitangent, viewDir );\\n\\t\\t\\t\\tbentNormal = normalize( cross( bentNormal, bitangent ) );\\n\\t\\t\\t\\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\\n\\t\\t\\t\\treturn getIBLRadiance( viewDir, bentNormal, roughness );\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\\nmaterial.roughness = min( material.roughness, 1.0 );\\n#ifdef IOR\\n\\tmaterial.ior = ior;\\n\\t#ifdef USE_SPECULAR\\n\\t\\tfloat specularIntensityFactor = specularIntensity;\\n\\t\\tvec3 specularColorFactor = specularColor;\\n\\t\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\t\\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\\n\\t\\t#endif\\n\\t\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\t\\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\\n\\t\\t#endif\\n\\t\\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\\n\\t#else\\n\\t\\tfloat specularIntensityFactor = 1.0;\\n\\t\\tvec3 specularColorFactor = vec3( 1.0 );\\n\\t\\tmaterial.specularF90 = 1.0;\\n\\t#endif\\n\\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.specularF90 = 1.0;\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\tmaterial.clearcoatF0 = vec3( 0.04 );\\n\\tmaterial.clearcoatF90 = 1.0;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_DISPERSION\\n\\tmaterial.dispersion = dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tmaterial.iridescence = iridescence;\\n\\tmaterial.iridescenceIOR = iridescenceIOR;\\n\\t#ifdef USE_IRIDESCENCEMAP\\n\\t\\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\t\\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\\n\\t#else\\n\\t\\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\\n\\t#endif\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheenColor;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\\n\\t#endif\\n\\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\\n\\t\\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\\n\\t\\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\\n\\t#else\\n\\t\\tvec2 anisotropyV = anisotropyVector;\\n\\t#endif\\n\\tmaterial.anisotropy = length( anisotropyV );\\n\\tif( material.anisotropy == 0.0 ) {\\n\\t\\tanisotropyV = vec2( 1.0, 0.0 );\\n\\t} else {\\n\\t\\tanisotropyV /= material.anisotropy;\\n\\t\\tmaterial.anisotropy = saturate( material.anisotropy );\\n\\t}\\n\\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\\n\\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\\n\\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\\n#endif\";\n\nvar lights_physical_pars_fragment = \"uniform sampler2D dfgLUT;\\nstruct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat roughness;\\n\\tvec3 specularColor;\\n\\tfloat specularF90;\\n\\tfloat dispersion;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat clearcoat;\\n\\t\\tfloat clearcoatRoughness;\\n\\t\\tvec3 clearcoatF0;\\n\\t\\tfloat clearcoatF90;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tfloat iridescence;\\n\\t\\tfloat iridescenceIOR;\\n\\t\\tfloat iridescenceThickness;\\n\\t\\tvec3 iridescenceFresnel;\\n\\t\\tvec3 iridescenceF0;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tvec3 sheenColor;\\n\\t\\tfloat sheenRoughness;\\n\\t#endif\\n\\t#ifdef IOR\\n\\t\\tfloat ior;\\n\\t#endif\\n\\t#ifdef USE_TRANSMISSION\\n\\t\\tfloat transmission;\\n\\t\\tfloat transmissionAlpha;\\n\\t\\tfloat thickness;\\n\\t\\tfloat attenuationDistance;\\n\\t\\tvec3 attenuationColor;\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat anisotropy;\\n\\t\\tfloat alphaT;\\n\\t\\tvec3 anisotropyT;\\n\\t\\tvec3 anisotropyB;\\n\\t#endif\\n};\\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\\nvec3 sheenSpecularDirect = vec3( 0.0 );\\nvec3 sheenSpecularIndirect = vec3(0.0 );\\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\\n float x2 = x * x;\\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\\n}\\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\n#ifdef USE_ANISOTROPY\\n\\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\\n\\t\\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\\n\\t\\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\\n\\t\\tfloat v = 0.5 / ( gv + gl );\\n\\t\\treturn saturate(v);\\n\\t}\\n\\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\\n\\t\\tfloat a2 = alphaT * alphaB;\\n\\t\\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\\n\\t\\thighp float v2 = dot( v, v );\\n\\t\\tfloat w2 = a2 / v2;\\n\\t\\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\\n\\t}\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\\n\\t\\tvec3 f0 = material.clearcoatF0;\\n\\t\\tfloat f90 = material.clearcoatF90;\\n\\t\\tfloat roughness = material.clearcoatRoughness;\\n\\t\\tfloat alpha = pow2( roughness );\\n\\t\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\t\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\t\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\t\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\t\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\t\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t\\treturn F * ( V * D );\\n\\t}\\n#endif\\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 f0 = material.specularColor;\\n\\tfloat f90 = material.specularF90;\\n\\tfloat roughness = material.roughness;\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tF = mix( F, material.iridescenceFresnel, material.iridescence );\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat dotTL = dot( material.anisotropyT, lightDir );\\n\\t\\tfloat dotTV = dot( material.anisotropyT, viewDir );\\n\\t\\tfloat dotTH = dot( material.anisotropyT, halfDir );\\n\\t\\tfloat dotBL = dot( material.anisotropyB, lightDir );\\n\\t\\tfloat dotBV = dot( material.anisotropyB, viewDir );\\n\\t\\tfloat dotBH = dot( material.anisotropyB, halfDir );\\n\\t\\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\\n\\t\\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\\n\\t#else\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t#endif\\n\\treturn F * ( V * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie( float roughness, float dotNH ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tfloat invAlpha = 1.0 / alpha;\\n\\tfloat cos2h = dotNH * dotNH;\\n\\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\\n\\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\\n}\\nfloat V_Neubelt( float dotNV, float dotNL ) {\\n\\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\\n}\\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat D = D_Charlie( sheenRoughness, dotNH );\\n\\tfloat V = V_Neubelt( dotNV, dotNL );\\n\\treturn sheenColor * ( D * V );\\n}\\n#endif\\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat r2 = roughness * roughness;\\n\\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\\n\\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\\n\\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\\n\\treturn saturate( DG * RECIPROCAL_PI );\\n}\\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 uv = vec2( roughness, dotNV );\\n\\treturn texture2D( dfgLUT, uv ).rg;\\n}\\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\treturn specularColor * fab.x + specularF90 * fab.y;\\n}\\n#ifdef USE_IRIDESCENCE\\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#else\\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#endif\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\\n\\t#else\\n\\t\\tvec3 Fr = specularColor;\\n\\t#endif\\n\\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\\n\\tfloat Ess = fab.x + fab.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 dfgV = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNV * dotNV), 0.0, dotNV), material.roughness );\\n\\tvec2 dfgL = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNL * dotNL), 0.0, dotNL), material.roughness );\\n\\tvec3 FssEss_V = material.specularColor * dfgV.x + material.specularF90 * dfgV.y;\\n\\tvec3 FssEss_L = material.specularColor * dfgL.x + material.specularF90 * dfgL.y;\\n\\tfloat Ess_V = dfgV.x + dfgV.y;\\n\\tfloat Ess_L = dfgL.x + dfgL.y;\\n\\tfloat Ems_V = 1.0 - Ess_V;\\n\\tfloat Ems_L = 1.0 - Ess_L;\\n\\tvec3 Favg = material.specularColor + ( 1.0 - material.specularColor ) * 0.047619;\\n\\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg * Favg + EPSILON );\\n\\tfloat compensationFactor = Ems_V * Ems_L;\\n\\tvec3 multiScatter = Fms * compensationFactor;\\n\\treturn singleScatter + multiScatter;\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometryNormal;\\n\\t\\tvec3 viewDir = geometryViewDir;\\n\\t\\tvec3 position = geometryPosition;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.roughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3( 0, 1, 0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = dotNLcc * directLight.color;\\n\\t\\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\\n\\t#endif\\n\\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\\n\\t#endif\\n\\tvec3 singleScattering = vec3( 0.0 );\\n\\tvec3 multiScattering = vec3( 0.0 );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\\n\\t#else\\n\\t\\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\\n\\t#endif\\n\\tvec3 totalScattering = singleScattering + multiScattering;\\n\\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\\n\\treflectedLight.indirectSpecular += radiance * singleScattering;\\n\\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\";\n\nvar lights_fragment_begin = \"\\nvec3 geometryPosition = - vViewPosition;\\nvec3 geometryNormal = normal;\\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\nvec3 geometryClearcoatNormal = vec3( 0.0 );\\n#ifdef USE_CLEARCOAT\\n\\tgeometryClearcoatNormal = clearcoatNormal;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\\n\\tif ( material.iridescenceThickness == 0.0 ) {\\n\\t\\tmaterial.iridescence = 0.0;\\n\\t} else {\\n\\t\\tmaterial.iridescence = saturate( material.iridescence );\\n\\t}\\n\\tif ( material.iridescence > 0.0 ) {\\n\\t\\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\\n\\t\\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\\n\\t}\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointLightInfo( pointLight, geometryPosition, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tvec4 spotColor;\\n\\tvec3 spotLightCoord;\\n\\tbool inSpotLightMap;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\\n\\t\\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\\n\\t\\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\\n\\t\\t#else\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#endif\\n\\t\\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\\n\\t\\t\\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\\n\\t\\t\\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\\n\\t\\t\\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\\n\\t\\t\\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\\n\\t\\t#endif\\n\\t\\t#undef SPOT_LIGHT_MAP_INDEX\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalLightInfo( directionalLight, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#if defined( USE_LIGHT_PROBES )\\n\\t\\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearcoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getIBLIrradiance( geometryNormal );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\\n\\t#else\\n\\t\\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\\n\\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\\n\\tvFragDepth = 1.0 + gl_Position.w;\\n\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\\n\\t#endif\\n\\tdiffuseColor *= sampledDiffuseColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t#if defined( USE_POINTS_UV )\\n\\t\\tvec2 uv = vUv;\\n\\t#else\\n\\t\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tdiffuseColor *= texture2D( map, uv );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_POINTS_UV )\\n\\tvarying vec2 vUv;\\n#else\\n\\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t\\tuniform mat3 uvTransform;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphinstance_vertex = \"#ifdef USE_INSTANCING_MORPH\\n\\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\\n\\t}\\n#endif\";\n\nvar morphcolor_vertex = \"#if defined( USE_MORPHCOLORS )\\n\\tvColor *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\\n\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_INSTANCING_MORPH\\n\\t\\tuniform float morphTargetBaseInfluence;\\n\\t\\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\t#endif\\n\\tuniform sampler2DArray morphTargetsTexture;\\n\\tuniform ivec2 morphTargetsTextureSize;\\n\\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\\n\\t\\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\\n\\t\\tint y = texelIndex / morphTargetsTextureSize.x;\\n\\t\\tint x = texelIndex - y * morphTargetsTextureSize.x;\\n\\t\\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\\n\\t\\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\\n\\t}\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar normal_fragment_begin = \"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\\n#ifdef FLAT_SHADED\\n\\tvec3 fdx = dFdx( vViewPosition );\\n\\tvec3 fdy = dFdy( vViewPosition );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal *= faceDirection;\\n\\t#endif\\n#endif\\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\\n\\t\\t#if defined( USE_NORMALMAP )\\n\\t\\t\\tvNormalMapUv\\n\\t\\t#elif defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tvClearcoatNormalMapUv\\n\\t\\t#else\\n\\t\\t\\tvUv\\n\\t\\t#endif\\n\\t\\t);\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn[0] *= faceDirection;\\n\\t\\ttbn[1] *= faceDirection;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn2[0] *= faceDirection;\\n\\t\\ttbn2[1] *= faceDirection;\\n\\t#endif\\n#endif\\nvec3 nonPerturbedNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\tnormal = normalize( tbn * mapN );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\\n#endif\";\n\nvar normal_pars_fragment = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_pars_vertex = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_vertex = \"#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\\n\\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( uv.st );\\n\\t\\tvec2 st1 = dFdy( uv.st );\\n\\t\\tvec3 N = surf_norm;\\n\\t\\tvec3 q1perp = cross( q1, N );\\n\\t\\tvec3 q0perp = cross( N, q0 );\\n\\t\\tvec3 T = q1perp * st0.x + q0perp * st1.x;\\n\\t\\tvec3 B = q1perp * st0.y + q0perp * st1.y;\\n\\t\\tfloat det = max( dot( T, T ), dot( B, B ) );\\n\\t\\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\\n\\t\\treturn mat3( T * scale, B * scale, N );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = nonPerturbedNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\";\n\nvar iridescence_pars_fragment = \"#ifdef USE_IRIDESCENCEMAP\\n\\tuniform sampler2D iridescenceMap;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform sampler2D iridescenceThicknessMap;\\n#endif\";\n\nvar opaque_fragment = \"#ifdef OPAQUE\\ndiffuseColor.a = 1.0;\\n#endif\\n#ifdef USE_TRANSMISSION\\ndiffuseColor.a *= material.transmissionAlpha;\\n#endif\\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\\nconst float Inv255 = 1. / 255.;\\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec4( 0., 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec4( 1., 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat af = modf( v * PackFactors.a, vuf );\\n\\tfloat bf = modf( vuf * ShiftRight8, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\\n}\\nvec3 packDepthToRGB( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec3( 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec3( 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat bf = modf( v * PackFactors.b, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\\n}\\nvec2 packDepthToRG( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec2( 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec2( 1., 1. );\\n\\tfloat vuf;\\n\\tfloat gf = modf( v * 256., vuf );\\n\\treturn vec2( vuf * Inv255, gf );\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors4 );\\n}\\nfloat unpackRGBToDepth( const in vec3 v ) {\\n\\treturn dot( v, UnpackFactors3 );\\n}\\nfloat unpackRGToDepth( const in vec2 v ) {\\n\\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\\n}\\nvec4 pack2HalfToRGBA( const in vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\\n}\\nvec2 unpackRGBATo2Half( const in vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn depth * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * depth - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_BATCHING\\n\\tmvPosition = batchingMatrix * mvPosition;\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef DITHERING\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#if NUM_SPOT_LIGHT_MAPS > 0\\n\\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\tfloat depth = unpackRGBAToDepth( texture2D( depths, uv ) );\\n\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\treturn step( depth, compare );\\n\\t\\t#else\\n\\t\\t\\treturn step( compare, depth );\\n\\t\\t#endif\\n\\t}\\n\\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\\n\\t\\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\\n\\t}\\n\\tfloat VSMShadow( sampler2D shadow, vec2 uv, float compare ) {\\n\\t\\tfloat occlusion = 1.0;\\n\\t\\tvec2 distribution = texture2DDistribution( shadow, uv );\\n\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\tfloat hard_shadow = step( distribution.x, compare );\\n\\t\\t#else\\n\\t\\t\\tfloat hard_shadow = step( compare, distribution.x );\\n\\t\\t#endif\\n\\t\\tif ( hard_shadow != 1.0 ) {\\n\\t\\t\\tfloat distance = compare - distribution.x;\\n\\t\\t\\tfloat variance = max( 0.00000, distribution.y * distribution.y );\\n\\t\\t\\tfloat softness_probability = variance / (variance + distance * distance );\\t\\t\\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\\t\\t\\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\\n\\t\\t}\\n\\t\\treturn occlusion;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx = texelSize.x;\\n\\t\\t\\tfloat dy = texelSize.y;\\n\\t\\t\\tvec2 uv = shadowCoord.xy;\\n\\t\\t\\tvec2 f = fract( uv * shadowMapSize + 0.5 );\\n\\t\\t\\tuv -= f * texelSize;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t f.y )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\t\\n\\t\\tfloat lightToPositionLength = length( lightToPosition );\\n\\t\\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\\n\\t\\t\\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\t\\tdp += shadowBias;\\n\\t\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\t\\tshadow = (\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\\n\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\tvec4 shadowWorldPosition;\\n#endif\\n#if defined( USE_SHADOWMAP )\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if NUM_SPOT_LIGHT_COORDS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition;\\n\\t\\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t\\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\\n\\t\\t#endif\\n\\t\\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\tuniform highp sampler2D boneTexture;\\n\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\tint size = textureSize( boneTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn saturate( toneMappingExposure * color );\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 CineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3( 1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108, 1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605, 1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\\n\\tvec3( 1.6605, - 0.1246, - 0.0182 ),\\n\\tvec3( - 0.5876, 1.1329, - 0.1006 ),\\n\\tvec3( - 0.0728, - 0.0083, 1.1187 )\\n);\\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\\n\\tvec3( 0.6274, 0.0691, 0.0164 ),\\n\\tvec3( 0.3293, 0.9195, 0.0880 ),\\n\\tvec3( 0.0433, 0.0113, 0.8956 )\\n);\\nvec3 agxDefaultContrastApprox( vec3 x ) {\\n\\tvec3 x2 = x * x;\\n\\tvec3 x4 = x2 * x2;\\n\\treturn + 15.5 * x4 * x2\\n\\t\\t- 40.14 * x4 * x\\n\\t\\t+ 31.96 * x4\\n\\t\\t- 6.868 * x2 * x\\n\\t\\t+ 0.4298 * x2\\n\\t\\t+ 0.1191 * x\\n\\t\\t- 0.00232;\\n}\\nvec3 AgXToneMapping( vec3 color ) {\\n\\tconst mat3 AgXInsetMatrix = mat3(\\n\\t\\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\\n\\t\\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\\n\\t\\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\\n\\t);\\n\\tconst mat3 AgXOutsetMatrix = mat3(\\n\\t\\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\\n\\t\\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\\n\\t\\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\\n\\t);\\n\\tconst float AgxMinEv = - 12.47393;\\tconst float AgxMaxEv = 4.026069;\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\\n\\tcolor = AgXInsetMatrix * color;\\n\\tcolor = max( color, 1e-10 );\\tcolor = log2( color );\\n\\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\tcolor = agxDefaultContrastApprox( color );\\n\\tcolor = AgXOutsetMatrix * color;\\n\\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\\n\\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\treturn color;\\n}\\nvec3 NeutralToneMapping( vec3 color ) {\\n\\tconst float StartCompression = 0.8 - 0.04;\\n\\tconst float Desaturation = 0.15;\\n\\tcolor *= toneMappingExposure;\\n\\tfloat x = min( color.r, min( color.g, color.b ) );\\n\\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\\n\\tcolor -= offset;\\n\\tfloat peak = max( color.r, max( color.g, color.b ) );\\n\\tif ( peak < StartCompression ) return color;\\n\\tfloat d = 1. - StartCompression;\\n\\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\\n\\tcolor *= newPeak / peak;\\n\\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\\n\\treturn mix( color, vec3( newPeak ), g );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmission_fragment = \"#ifdef USE_TRANSMISSION\\n\\tmaterial.transmission = transmission;\\n\\tmaterial.transmissionAlpha = 1.0;\\n\\tmaterial.thickness = thickness;\\n\\tmaterial.attenuationDistance = attenuationDistance;\\n\\tmaterial.attenuationColor = attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\\n\\t#endif\\n\\tvec3 pos = vWorldPosition;\\n\\tvec3 v = normalize( cameraPosition - pos );\\n\\tvec3 n = inverseTransformDirection( normal, viewMatrix );\\n\\tvec4 transmitted = getIBLVolumeRefraction(\\n\\t\\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\\n\\t\\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\\n\\t\\tmaterial.attenuationColor, material.attenuationDistance );\\n\\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\\n\\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\\n#endif\";\n\nvar transmission_pars_fragment = \"#ifdef USE_TRANSMISSION\\n\\tuniform float transmission;\\n\\tuniform float thickness;\\n\\tuniform float attenuationDistance;\\n\\tuniform vec3 attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tuniform sampler2D transmissionMap;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tuniform sampler2D thicknessMap;\\n\\t#endif\\n\\tuniform vec2 transmissionSamplerSize;\\n\\tuniform sampler2D transmissionSamplerMap;\\n\\tuniform mat4 modelMatrix;\\n\\tuniform mat4 projectionMatrix;\\n\\tvarying vec3 vWorldPosition;\\n\\tfloat w0( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w1( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\\n\\t}\\n\\tfloat w2( float a ){\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w3( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * a );\\n\\t}\\n\\tfloat g0( float a ) {\\n\\t\\treturn w0( a ) + w1( a );\\n\\t}\\n\\tfloat g1( float a ) {\\n\\t\\treturn w2( a ) + w3( a );\\n\\t}\\n\\tfloat h0( float a ) {\\n\\t\\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\\n\\t}\\n\\tfloat h1( float a ) {\\n\\t\\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\\n\\t}\\n\\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\\n\\t\\tuv = uv * texelSize.zw + 0.5;\\n\\t\\tvec2 iuv = floor( uv );\\n\\t\\tvec2 fuv = fract( uv );\\n\\t\\tfloat g0x = g0( fuv.x );\\n\\t\\tfloat g1x = g1( fuv.x );\\n\\t\\tfloat h0x = h0( fuv.x );\\n\\t\\tfloat h1x = h1( fuv.x );\\n\\t\\tfloat h0y = h0( fuv.y );\\n\\t\\tfloat h1y = h1( fuv.y );\\n\\t\\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\\n\\t\\t\\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\\n\\t}\\n\\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\\n\\t\\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\\n\\t\\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\\n\\t\\tvec2 fLodSizeInv = 1.0 / fLodSize;\\n\\t\\tvec2 cLodSizeInv = 1.0 / cLodSize;\\n\\t\\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\\n\\t\\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\\n\\t\\treturn mix( fSample, cSample, fract( lod ) );\\n\\t}\\n\\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\\n\\t\\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\\n\\t\\tvec3 modelScale;\\n\\t\\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\\n\\t\\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\\n\\t\\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\\n\\t\\treturn normalize( refractionVector ) * thickness * modelScale;\\n\\t}\\n\\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\\n\\t\\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\\n\\t}\\n\\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\\n\\t\\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\\n\\t\\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\\n\\t}\\n\\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tif ( isinf( attenuationDistance ) ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\\n\\t\\t\\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\\t\\t\\treturn transmittance;\\n\\t\\t}\\n\\t}\\n\\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\\n\\t\\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\\n\\t\\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\\n\\t\\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tvec4 transmittedLight;\\n\\t\\tvec3 transmittance;\\n\\t\\t#ifdef USE_DISPERSION\\n\\t\\t\\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\\n\\t\\t\\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\\n\\t\\t\\tfor ( int i = 0; i < 3; i ++ ) {\\n\\t\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\\n\\t\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\t\\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\\n\\t\\t\\t\\ttransmittedLight[ i ] = transmissionSample[ i ];\\n\\t\\t\\t\\ttransmittedLight.a += transmissionSample.a;\\n\\t\\t\\t\\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\\n\\t\\t\\t}\\n\\t\\t\\ttransmittedLight.a /= 3.0;\\n\\t\\t#else\\n\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\\n\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\\n\\t\\t\\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\\n\\t\\t#endif\\n\\t\\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\\n\\t\\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\\n\\t\\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\\n\\t\\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\\n\\t}\\n#endif\";\n\nvar uv_pars_fragment = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform mat3 mapTransform;\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform mat3 alphaMapTransform;\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tuniform mat3 lightMapTransform;\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tuniform mat3 aoMapTransform;\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tuniform mat3 bumpMapTransform;\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tuniform mat3 normalMapTransform;\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tuniform mat3 displacementMapTransform;\\n\\tvarying vec2 vDisplacementMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tuniform mat3 emissiveMapTransform;\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tuniform mat3 metalnessMapTransform;\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tuniform mat3 roughnessMapTransform;\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tuniform mat3 anisotropyMapTransform;\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tuniform mat3 clearcoatMapTransform;\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform mat3 clearcoatNormalMapTransform;\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform mat3 clearcoatRoughnessMapTransform;\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tuniform mat3 sheenColorMapTransform;\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tuniform mat3 sheenRoughnessMapTransform;\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tuniform mat3 iridescenceMapTransform;\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform mat3 iridescenceThicknessMapTransform;\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tuniform mat3 specularMapTransform;\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tuniform mat3 specularColorMapTransform;\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tuniform mat3 specularIntensityMapTransform;\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvUv = vec3( uv, 1 ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_BATCHING\\n\\t\\tworldPosition = batchingMatrix * worldPosition;\\n\\t#endif\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nconst vertex$h = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nconst fragment$h = \"uniform sampler2D t2D;\\nuniform float backgroundIntensity;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tvec4 texColor = texture2D( t2D, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$g = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$g = \"#ifdef ENVMAP_TYPE_CUBE\\n\\tuniform samplerCube envMap;\\n#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\tuniform sampler2D envMap;\\n#endif\\nuniform float flipEnvMap;\\nuniform float backgroundBlurriness;\\nuniform float backgroundIntensity;\\nuniform mat3 backgroundRotation;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\\n\\t#else\\n\\t\\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$f = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$f = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\nvoid main() {\\n\\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\\n\\tgl_FragColor = texColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$e = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nconst fragment$e = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\tfloat fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\\n\\t#else\\n\\t\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\\n\\t#endif\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#elif DEPTH_PACKING == 3202\\n\\t\\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\\n\\t#elif DEPTH_PACKING == 3203\\n\\t\\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\\n\\t#endif\\n}\";\n\nconst vertex$d = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nconst fragment$d = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main () {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nconst vertex$c = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$c = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$b = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$b = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$a = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$a = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$9 = \"#define LAMBERT\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$9 = \"#define LAMBERT\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$8 = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nconst fragment$8 = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$7 = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$7 = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\";\n\nconst vertex$6 = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$6 = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$5 = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifdef USE_TRANSMISSION\\n\\tvarying vec3 vWorldPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n#ifdef USE_TRANSMISSION\\n\\tvWorldPosition = worldPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$5 = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define IOR\\n\\t#define USE_SPECULAR\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef IOR\\n\\tuniform float ior;\\n#endif\\n#ifdef USE_SPECULAR\\n\\tuniform float specularIntensity;\\n\\tuniform vec3 specularColor;\\n\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\tuniform sampler2D specularColorMap;\\n\\t#endif\\n\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\tuniform sampler2D specularIntensityMap;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_DISPERSION\\n\\tuniform float dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tuniform float iridescence;\\n\\tuniform float iridescenceIOR;\\n\\tuniform float iridescenceThicknessMinimum;\\n\\tuniform float iridescenceThicknessMaximum;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheenColor;\\n\\tuniform float sheenRoughness;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tuniform sampler2D sheenColorMap;\\n\\t#endif\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tuniform sampler2D sheenRoughnessMap;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\tuniform vec2 anisotropyVector;\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tuniform sampler2D anisotropyMap;\\n\\t#endif\\n#endif\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\t#include \\n\\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\t\\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\\n\\t\\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\t\\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$4 = \"#define TOON\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$4 = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$3 = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#ifdef USE_POINTS_UV\\n\\tvarying vec2 vUv;\\n\\tuniform mat3 uvTransform;\\n#endif\\nvoid main() {\\n\\t#ifdef USE_POINTS_UV\\n\\t\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$3 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$2 = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$2 = \"uniform vec3 color;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$1 = \"uniform float rotation;\\nuniform vec2 center;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 mvPosition = modelViewMatrix[ 3 ];\\n\\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$1 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst ShaderChunk = {\n\talphahash_fragment: alphahash_fragment,\n\talphahash_pars_fragment: alphahash_pars_fragment,\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbatching_pars_vertex: batching_pars_vertex,\n\tbatching_vertex: batching_vertex,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tiridescence_fragment: iridescence_fragment,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tcolorspace_fragment: colorspace_fragment,\n\tcolorspace_pars_fragment: colorspace_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_fragment: lights_lambert_fragment,\n\tlights_lambert_pars_fragment: lights_lambert_pars_fragment,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphinstance_vertex: morphinstance_vertex,\n\tmorphcolor_vertex: morphcolor_vertex,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\tiridescence_pars_fragment: iridescence_pars_fragment,\n\topaque_fragment: opaque_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: vertex$h,\n\tbackground_frag: fragment$h,\n\tbackgroundCube_vert: vertex$g,\n\tbackgroundCube_frag: fragment$g,\n\tcube_vert: vertex$f,\n\tcube_frag: fragment$f,\n\tdepth_vert: vertex$e,\n\tdepth_frag: fragment$e,\n\tdistanceRGBA_vert: vertex$d,\n\tdistanceRGBA_frag: fragment$d,\n\tequirect_vert: vertex$c,\n\tequirect_frag: fragment$c,\n\tlinedashed_vert: vertex$b,\n\tlinedashed_frag: fragment$b,\n\tmeshbasic_vert: vertex$a,\n\tmeshbasic_frag: fragment$a,\n\tmeshlambert_vert: vertex$9,\n\tmeshlambert_frag: fragment$9,\n\tmeshmatcap_vert: vertex$8,\n\tmeshmatcap_frag: fragment$8,\n\tmeshnormal_vert: vertex$7,\n\tmeshnormal_frag: fragment$7,\n\tmeshphong_vert: vertex$6,\n\tmeshphong_frag: fragment$6,\n\tmeshphysical_vert: vertex$5,\n\tmeshphysical_frag: fragment$5,\n\tmeshtoon_vert: vertex$4,\n\tmeshtoon_frag: fragment$4,\n\tpoints_vert: vertex$3,\n\tpoints_frag: fragment$3,\n\tshadow_vert: vertex$2,\n\tshadow_frag: fragment$2,\n\tsprite_vert: vertex$1,\n\tsprite_frag: fragment$1\n};\n\n// Uniforms library for shared webgl shaders\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\t\tspecularMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tenvMapRotation: { value: /*@__PURE__*/ new Matrix3() },\n\t\tflipEnvMap: { value: -1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // physical\n\t\trefractionRatio: { value: 0.98 }, // basic, lambert, phong\n\t\tdfgLUT: { value: null } // DFG LUT for physically-based rendering\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 },\n\t\taoMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 },\n\t\tlightMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tnormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null },\n\t\temissiveMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null },\n\t\tmetalnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null },\n\t\troughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: /*@__PURE__*/ new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotLightMap: { value: [] },\n\t\tspotShadowMap: { value: [] },\n\t\tspotLightMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: /*@__PURE__*/ new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t\tbackgroundIntensity: { value: 1 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\n\tbackgroundCube: {\n\n\t\tuniforms: {\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: -1 },\n\t\t\tbackgroundBlurriness: { value: 0 },\n\t\t\tbackgroundIntensity: { value: 1 },\n\t\t\tbackgroundRotation: { value: /*@__PURE__*/ new Matrix3() }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.backgroundCube_vert,\n\t\tfragmentShader: ShaderChunk.backgroundCube_frag\n\n\t},\n\n\tcube: {\n\n\t\tuniforms: {\n\t\t\ttCube: { value: null },\n\t\t\ttFlip: { value: -1 },\n\t\t\topacity: { value: 1.0 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: /*@__PURE__*/ new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: /*@__PURE__*/ new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tclearcoatNormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tdispersion: { value: 0 },\n\t\t\tiridescence: { value: 0 },\n\t\t\tiridescenceMap: { value: null },\n\t\t\tiridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tiridescenceIOR: { value: 1.3 },\n\t\t\tiridescenceThicknessMinimum: { value: 100 },\n\t\t\tiridescenceThicknessMaximum: { value: 400 },\n\t\t\tiridescenceThicknessMap: { value: null },\n\t\t\tiridescenceThicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\tsheenRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tthicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tspecularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t\tspecularColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularIntensityMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tanisotropyVector: { value: /*@__PURE__*/ new Vector2() },\n\t\t\tanisotropyMap: { value: null },\n\t\t\tanisotropyMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nconst _rgb = { r: 0, b: 0, g: 0 };\nconst _e1$1 = /*@__PURE__*/ new Euler();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction getBackground( scene ) {\n\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tconst usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background\n\t\t\tbackground = ( usePMREM ? cubeuvmaps : cubemaps ).get( background );\n\n\t\t}\n\n\t\treturn background;\n\n\t}\n\n\tfunction render( scene ) {\n\n\t\tlet forceClear = false;\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tconst environmentBlendMode = renderer.xr.getEnvironmentBlendMode();\n\n\t\tif ( environmentBlendMode === 'additive' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 1, premultipliedAlpha );\n\n\t\t} else if ( environmentBlendMode === 'alpha-blend' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 0, premultipliedAlpha );\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\t// buffers might not be writable which is required to ensure a correct clear\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t}\n\n\tfunction addToRenderList( renderList, scene ) {\n\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.backgroundCube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.backgroundCube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// add \"envMap\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\t_e1$1.copy( scene.backgroundRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1$1.x *= -1; _e1$1.y *= -1; _e1$1.z *= -1;\n\n\t\t\tif ( background.isCubeTexture && background.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1$1.y *= -1;\n\t\t\t\t_e1$1.z *= -1;\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? -1 : 1;\n\t\t\tboxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness;\n\t\t\tboxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tboxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4( _m1$1.makeRotationFromEuler( _e1$1 ) );\n\t\t\tboxMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tboxMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// add \"map\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\t\t\tplaneMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tplaneMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tplaneMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tcolor.getRGB( _rgb, getUnlitUniformColorSpace( renderer ) );\n\n\t\tstate.buffers.color.setClear( _rgb.r, _rgb.g, _rgb.b, alpha, premultipliedAlpha );\n\n\t}\n\n\tfunction dispose() {\n\n\t\tif ( boxMesh !== undefined ) {\n\n\t\t\tboxMesh.geometry.dispose();\n\t\t\tboxMesh.material.dispose();\n\n\t\t\tboxMesh = undefined;\n\n\t\t}\n\n\t\tif ( planeMesh !== undefined ) {\n\n\t\t\tplaneMesh.geometry.dispose();\n\t\t\tplaneMesh.material.dispose();\n\n\t\t\tplaneMesh = undefined;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render,\n\t\taddToRenderList: addToRenderList,\n\t\tdispose: dispose\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, attributes ) {\n\n\tconst maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\tlet forceUpdate = false;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tconst state = getBindingState( geometry, program, material );\n\n\t\tif ( currentState !== state ) {\n\n\t\t\tcurrentState = state;\n\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t}\n\n\t\tupdateBuffers = needsUpdate( object, geometry, program, index );\n\n\t\tif ( updateBuffers ) saveCache( object, geometry, program, index );\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tif ( updateBuffers || forceUpdate ) {\n\n\t\t\tforceUpdate = false;\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\treturn gl.createVertexArray();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\treturn gl.bindVertexArray( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\treturn gl.deleteVertexArray( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( object, geometry, program, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tconst cachedAttribute = cachedAttributes[ name ];\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\t\tif ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( object, geometry, program, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet attribute = attributes[ name ];\n\n\t\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tconst data = {};\n\t\t\t\tdata.attribute = attribute;\n\n\t\t\t\tif ( attribute && attribute.data ) {\n\n\t\t\t\t\tdata.data = attribute.data;\n\n\t\t\t\t}\n\n\t\t\t\tcache[ name ] = data;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tgl.vertexAttribDivisor( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset, integer ) {\n\n\t\tif ( integer === true ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\t// check for integer attributes\n\n\t\t\t\t\tconst integer = ( type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType );\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\t\tforceUpdate = true;\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatibility\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawArraysInstanced( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ], counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters, utils ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction textureFormatReadable( textureFormat ) {\n\n\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction textureTypeReadable( textureType ) {\n\n\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );\n\n\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\ttextureType !== FloatType && ! halfFloatSupportedByExt ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\twarn( 'WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\tconst reversedDepthBuffer = parameters.reversedDepthBuffer === true && extensions.has( 'EXT_clip_control' );\n\n\tconst maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tconst maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tconst maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tconst maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tconst maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tconst maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tconst maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tconst maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\n\tconst maxSamples = gl.getParameter( gl.MAX_SAMPLES );\n\n\treturn {\n\n\t\tisWebGL2: true, // keeping this for backwards compatibility\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\ttextureFormatReadable: textureFormatReadable,\n\t\ttextureTypeReadable: textureTypeReadable,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\treversedDepthBuffer: reversedDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\n\t};\n\n\tthis.setGlobalState = function ( planes, camera ) {\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips.\n// Used for scene blur in fromScene() method.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\n// Used for scene blur in fromScene() method.\nconst MAX_SAMPLES = 20;\n\n// GGX VNDF importance sampling configuration\nconst GGX_SAMPLES = 256;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\nlet _oldActiveCubeFace = 0;\nlet _oldActiveMipmapLevel = 0;\nlet _oldXrEnabled = false;\n\nconst _origin = /*@__PURE__*/ new Vector3();\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * The prefiltering uses GGX VNDF (Visible Normal Distribution Function)\n * importance sampling based on \"Sampling the GGX Distribution of Visible Normals\"\n * (Heitz, 2018) to generate environment maps that accurately match the GGX BRDF\n * used in material rendering for physically-based image-based lighting.\n */\nclass PMREMGenerator {\n\n\t/**\n\t * Constructs a new PMREM generator.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t */\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\t\tthis._lodMeshes = [];\n\n\t\tthis._backgroundBox = null;\n\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\n\t\tthis._blurMaterial = null;\n\t\tthis._ggxMaterial = null;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety.\n\t *\n\t * @param {Scene} scene - The scene to be captured.\n\t * @param {number} [sigma=0] - The blur radius in radians.\n\t * @param {number} [near=0.1] - The near plane distance.\n\t * @param {number} [far=100] - The far plane distance.\n\t * @param {Object} [options={}] - The configuration options.\n\t * @param {number} [options.size=256] - The texture size of the PMREM.\n\t * @param {Vector3} [options.renderTarget=origin] - The position of the internal cube camera that renders the scene.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100, options = {} ) {\n\n\t\tconst {\n\t\t\tsize = 256,\n\t\t\tposition = _origin,\n\t\t} = options;\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tthis._setSize( size );\n\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} equirectangular - The equirectangular texture to be converted.\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} cubemap - The cubemap texture to be converted.\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tthis._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tthis._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\n\t\tif ( this._backgroundBox !== null ) {\n\n\t\t\tthis._backgroundBox.geometry.dispose();\n\t\t\tthis._backgroundBox.material.dispose();\n\n\t\t}\n\n\t}\n\n\t// private interface\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\t\tif ( this._ggxMaterial !== null ) this._ggxMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodMeshes.length; i ++ ) {\n\n\t\t\tthis._lodMeshes[ i ].geometry.dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel );\n\t\tthis._renderer.xr.enabled = _oldXrEnabled;\n\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets();\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height, params );\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( width, height, params );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, width, height );\n\t\t\tthis._ggxMaterial = _getGGXShader( _lodMax, width, height );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst mesh = new Mesh( new BufferGeometry(), material );\n\t\tthis._renderer.compile( mesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, -1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, -1, -1, -1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\t// https://github.com/mrdoob/three.js/issues/31413#issuecomment-3095966812\n\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tif ( reversedDepthBuffer ) {\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\t\trenderer.clearDepth();\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t}\n\n\t\tif ( this._backgroundBox === null ) {\n\n\t\t\tthis._backgroundBox = new Mesh(\n\t\t\t\tnew BoxGeometry(),\n\t\t\t\tnew MeshBasicMaterial( {\n\t\t\t\t\tname: 'PMREM.Background',\n\t\t\t\t\tside: BackSide,\n\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\tdepthTest: false,\n\t\t\t\t} )\n\t\t\t);\n\n\t\t}\n\n\t\tconst backgroundBox = this._backgroundBox;\n\t\tconst backgroundMaterial = backgroundBox.material;\n\n\t\tlet useSolidColor = false;\n\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x + forwardSign[ i ], position.y, position.z );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y + forwardSign[ i ], position.z );\n\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y, position.z + forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\n\t\t\t}\n\n\t\t\tthis._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\n\t\tconst mesh = this._lodMeshes[ 0 ];\n\t\tmesh.material = material;\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tconst n = this._lodMeshes.length;\n\n\t\t// Use GGX VNDF importance sampling\n\t\tfor ( let i = 1; i < n; i ++ ) {\n\n\t\t\tthis._applyGGXFilter( cubeUVRenderTarget, i - 1, i );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * Applies GGX VNDF importance sampling filter to generate a prefiltered environment map.\n\t * Uses Monte Carlo integration with VNDF importance sampling to accurately represent the\n\t * GGX BRDF for physically-based rendering. Reads from the previous LOD level and\n\t * applies incremental roughness filtering to avoid over-blurring.\n\t *\n\t * @private\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn - Source LOD level to read from\n\t * @param {number} lodOut - Target LOD level to write to\n\t */\n\t_applyGGXFilter( cubeUVRenderTarget, lodIn, lodOut ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tconst ggxMaterial = this._ggxMaterial;\n\t\tconst ggxMesh = this._lodMeshes[ lodOut ];\n\t\tggxMesh.material = ggxMaterial;\n\n\t\tconst ggxUniforms = ggxMaterial.uniforms;\n\n\t\t// Calculate incremental roughness between LOD levels\n\t\tconst targetRoughness = lodOut / ( this._lodMeshes.length - 1 );\n\t\tconst sourceRoughness = lodIn / ( this._lodMeshes.length - 1 );\n\t\tconst incrementalRoughness = Math.sqrt( targetRoughness * targetRoughness - sourceRoughness * sourceRoughness );\n\n\t\t// Apply blur strength mapping for better quality across the roughness range\n\t\tconst blurStrength = 0.05 + targetRoughness * 0.95;\n\t\tconst adjustedRoughness = incrementalRoughness * blurStrength;\n\n\t\t// Calculate viewport position based on output LOD level\n\t\tconst { _lodMax } = this;\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t// Read from previous LOD with incremental roughness\n\t\tggxUniforms[ 'envMap' ].value = cubeUVRenderTarget.texture;\n\t\tggxUniforms[ 'roughness' ].value = adjustedRoughness;\n\t\tggxUniforms[ 'mipInt' ].value = _lodMax - lodIn; // Sample from input LOD\n\n\t\t_setViewport( pingPongRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( pingPongRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t\t// Copy from pingPong back to cubeUV (simple direct copy)\n\t\tggxUniforms[ 'envMap' ].value = pingPongRenderTarget.texture;\n\t\tggxUniforms[ 'roughness' ].value = 0.0; // Direct copy\n\t\tggxUniforms[ 'mipInt' ].value = _lodMax - lodOut; // Read from the level we just wrote\n\n\t\t_setViewport( cubeUVRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t *\n\t * Used for initial scene blur in fromScene() method when sigma > 0.\n\t *\n\t * @private\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn\n\t * @param {number} lodOut\n\t * @param {number} sigma\n\t * @param {Vector3} [poleAxis]\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\terror(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = this._lodMeshes[ lodOut ];\n\t\tblurMesh.material = blurMaterial;\n\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\twarn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\n\n\nfunction _createPlanes( lodMax ) {\n\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\tconst lodMeshes = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : -1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodMeshes.push( new Mesh( planes, null ) );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodMeshes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height, params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getGGXShader( lodMax, width, height ) {\n\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'PMREMGGXConvolution',\n\n\t\tdefines: {\n\t\t\t'GGX_SAMPLES': GGX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'roughness': { value: 0.0 },\n\t\t\t'mipInt': { value: 0 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// \"Sampling the GGX Distribution of Visible Normals\"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 3.2: Transform view direction to hemisphere configuration\n\t\t\t\tvec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z));\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tfloat lensq = Vh.x * Vh.x + Vh.y * Vh.y;\n\t\t\t\tvec3 T1 = lensq > 0.0 ? vec3(-Vh.y, Vh.x, 0.0) / sqrt(lensq) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(Vh, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + Vh.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * Vh;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = new Float32Array( MAX_SAMPLES );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: {\n\t\t\t'n': MAX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCubemapMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: -1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\tconst currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0;\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) {\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( renderTarget !== undefined ) {\n\n\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tconst extension = gl.getExtension( name );\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function () {\n\n\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\t\t\tgetExtension( 'WEBGL_clip_cull_distance' );\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\t\t\tgetExtension( 'WEBGL_render_shared_exponent' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\twarnOnce( 'WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else if ( geometryPosition !== undefined ) {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawElementsInstanced( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawElementsWEBGL( mode, counts, 0, type, starts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ] / bytesPerElement, counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawElementsInstancedWEBGL( mode, counts, 0, type, starts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase gl.TRIANGLES:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINES:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_STRIP:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_LOOP:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase gl.POINTS:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\terror( 'WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector4();\n\n\tfunction update( object, geometry, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\t// the following encodes morph targets into an array of data textures. Each layer represents a single morph target.\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet entry = morphTextures.get( geometry );\n\n\t\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\t\t\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\t\tlet vertexDataCount = 0;\n\n\t\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\t\tlet height = 1;\n\n\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t}\n\n\t\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\t\tconst texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\t\ttexture.type = FloatType;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\t// fill buffer\n\n\t\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 8 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 9 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 10 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tentry = {\n\t\t\t\tcount: morphTargetsCount,\n\t\t\t\ttexture: texture,\n\t\t\t\tsize: new Vector2( width, height )\n\t\t\t};\n\n\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\tfunction disposeTexture() {\n\n\t\t\t\ttexture.dispose();\n\n\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t}\n\n\t\t//\n\t\tif ( object.isInstancedMesh === true && object.morphTexture !== null ) {\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTexture', object.morphTexture, textures );\n\n\t\t} else {\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t}\n\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tif ( updateMap.get( object ) !== frame ) {\n\n\t\t\t\tattributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );\n\n\t\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\t\tattributes.update( object.instanceColor, gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t\tupdateMap.set( object, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( updateMap.get( skeleton ) !== frame ) {\n\n\t\t\t\tskeleton.update();\n\n\t\t\t\tupdateMap.set( skeleton, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\n\nconst emptyTexture = /*@__PURE__*/ new Texture();\n\nconst emptyShadowTexture = /*@__PURE__*/ new DepthTexture( 1, 1 );\n\nconst emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture();\nconst empty3dTexture = /*@__PURE__*/ new Data3DTexture();\nconst emptyCubeTexture = /*@__PURE__*/ new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array or THREE.VectorN)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2i( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3i( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4i( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array or THREE.VectorN)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2ui( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3ui( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4ui( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\tlet emptyTexture2D;\n\n\tif ( this.type === gl.SAMPLER_2D_SHADOW ) {\n\n\t\temptyShadowTexture.compareFunction = LessEqualCompare; // #28670\n\t\temptyTexture2D = emptyShadowTexture;\n\n\t} else {\n\n\t\temptyTexture2D = emptyTexture;\n\n\t}\n\n\ttextures.setTexture2D( v || emptyTexture2D, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || empty3dTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyArrayTexture, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nclass SingleUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass PureArrayUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass StructuredUniform {\n\n\tconstructor( id ) {\n\n\t\tthis.id = id;\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\tsetValue( gl, value, textures ) {\n\n\t\tconst seq = this.seq;\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t\t}\n\n\t}\n\n}\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n// - followed by an optional right bracket (found when array index)\n// - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nclass WebGLUniforms {\n\n\tconstructor( gl, program ) {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t\tconst n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tsetValue( gl, name, value, textures ) {\n\n\t\tconst u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n\t}\n\n\tsetOptional( gl, object, name ) {\n\n\t\tconst v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t}\n\n\tstatic upload( gl, seq, values, textures ) {\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tstatic seqWithValue( seq, values ) {\n\n\t\tconst r = [];\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n}\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\n// From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/\nconst COMPLETION_STATUS_KHR = 0x91B1;\n\nlet programIdCount = 0;\n\nfunction handleSource( string, errorLine ) {\n\n\tconst lines = string.split( '\\n' );\n\tconst lines2 = [];\n\n\tconst from = Math.max( errorLine - 6, 0 );\n\tconst to = Math.min( errorLine + 6, lines.length );\n\n\tfor ( let i = from; i < to; i ++ ) {\n\n\t\tconst line = i + 1;\n\t\tlines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` );\n\n\t}\n\n\treturn lines2.join( '\\n' );\n\n}\n\nconst _m0 = /*@__PURE__*/ new Matrix3();\n\nfunction getEncodingComponents( colorSpace ) {\n\n\tColorManagement._getMatrix( _m0, ColorManagement.workingColorSpace, colorSpace );\n\n\tconst encodingMatrix = `mat3( ${ _m0.elements.map( ( v ) => v.toFixed( 4 ) ) } )`;\n\n\tswitch ( ColorManagement.getTransfer( colorSpace ) ) {\n\n\t\tcase LinearTransfer:\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t\tcase SRGBTransfer:\n\t\t\treturn [ encodingMatrix, 'sRGBTransferOETF' ];\n\n\t\tdefault:\n\t\t\twarn( 'WebGLProgram: Unsupported color space: ', colorSpace );\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );\n\n\tconst shaderInfoLog = gl.getShaderInfoLog( shader ) || '';\n\tconst errors = shaderInfoLog.trim();\n\n\tif ( status && errors === '' ) return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\tif ( errorMatches ) {\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt( errorMatches[ 1 ] );\n\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t} else {\n\n\t\treturn errors;\n\n\t}\n\n}\n\nfunction getTexelEncodingFunction( functionName, colorSpace ) {\n\n\tconst components = getEncodingComponents( colorSpace );\n\n\treturn [\n\n\t\t`vec4 ${functionName}( vec4 value ) {`,\n\n\t\t`\treturn ${components[ 1 ]}( vec4( value.rgb * ${components[ 0 ]}, value.a ) );`,\n\n\t\t'}',\n\n\t].join( '\\n' );\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'Cineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase AgXToneMapping:\n\t\t\ttoneMappingName = 'AgX';\n\t\t\tbreak;\n\n\t\tcase NeutralToneMapping:\n\t\t\ttoneMappingName = 'Neutral';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\twarn( 'WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\n\nfunction getLuminanceFunction() {\n\n\tColorManagement.getLuminanceCoefficients( _v0 );\n\n\tconst r = _v0.x.toFixed( 4 );\n\tconst g = _v0.y.toFixed( 4 );\n\tconst b = _v0.z.toFixed( 4 );\n\n\treturn [\n\n\t\t'float luminance( const in vec3 rgb ) {',\n\n\t\t`\tconst vec3 weights = vec3( ${ r }, ${ g }, ${ b } );`,\n\n\t\t'\treturn dot( weights, rgb );',\n\n\t\t'}'\n\n\t].join( '\\n' );\n\n}\n\nfunction generateVertexExtensions( parameters ) {\n\n\tconst chunks = [\n\t\tparameters.extensionClipCullDistance ? '#extension GL_ANGLE_clip_cull_distance : require' : '',\n\t\tparameters.extensionMultiDraw ? '#extension GL_ANGLE_multi_draw : require' : '',\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === gl.FLOAT_MAT2 ) locationSize = 2;\n\t\tif ( info.type === gl.FLOAT_MAT3 ) locationSize = 3;\n\t\tif ( info.type === gl.FLOAT_MAT4 ) locationSize = 4;\n\n\t\t// log( 'WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\tconst numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps;\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nconst shaderChunkMap = new Map();\n\nfunction includeReplacer( match, include ) {\n\n\tlet string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tconst newInclude = shaderChunkMap.get( include );\n\n\t\tif ( newInclude !== undefined ) {\n\n\t\t\tstring = ShaderChunk[ newInclude ];\n\t\t\twarn( 'WebGLRenderer: Shader chunk \"%s\" has been deprecated. Use \"%s\" instead.', include, newInclude );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t}\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string.replace( unrollLoopPattern, loopReplacer );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = `precision ${parameters.precision} float;\n\tprecision ${parameters.precision} int;\n\tprecision ${parameters.precision} sampler2D;\n\tprecision ${parameters.precision} samplerCube;\n\tprecision ${parameters.precision} sampler3D;\n\tprecision ${parameters.precision} sampler2DArray;\n\tprecision ${parameters.precision} sampler2DShadow;\n\tprecision ${parameters.precision} samplerCubeShadow;\n\tprecision ${parameters.precision} sampler2DArrayShadow;\n\tprecision ${parameters.precision} isampler2D;\n\tprecision ${parameters.precision} isampler3D;\n\tprecision ${parameters.precision} isamplerCube;\n\tprecision ${parameters.precision} isampler2DArray;\n\tprecision ${parameters.precision} usampler2D;\n\tprecision ${parameters.precision} usampler3D;\n\tprecision ${parameters.precision} usamplerCube;\n\tprecision ${parameters.precision} usampler2DArray;\n\t`;\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction generateCubeUVSize( parameters ) {\n\n\tconst imageHeight = parameters.envMapCubeUVHeight;\n\n\tif ( imageHeight === null ) return null;\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\tconst envMapCubeUVSize = generateCubeUVSize( parameters );\n\n\tconst customVertexExtensions = generateVertexExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.extensionClipCullDistance ? '#define USE_CLIP_DISTANCE' : '',\n\t\t\tparameters.batching ? '#define USE_BATCHING' : '',\n\t\t\tparameters.batchingColor ? '#define USE_BATCHING_COLOR' : '',\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\t\t\tparameters.instancingMorph ? '#define USE_INSTANCING_MORPH' : '',\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.displacementMap ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\t//\n\n\t\t\tparameters.mapUv ? '#define MAP_UV ' + parameters.mapUv : '',\n\t\t\tparameters.alphaMapUv ? '#define ALPHAMAP_UV ' + parameters.alphaMapUv : '',\n\t\t\tparameters.lightMapUv ? '#define LIGHTMAP_UV ' + parameters.lightMapUv : '',\n\t\t\tparameters.aoMapUv ? '#define AOMAP_UV ' + parameters.aoMapUv : '',\n\t\t\tparameters.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + parameters.emissiveMapUv : '',\n\t\t\tparameters.bumpMapUv ? '#define BUMPMAP_UV ' + parameters.bumpMapUv : '',\n\t\t\tparameters.normalMapUv ? '#define NORMALMAP_UV ' + parameters.normalMapUv : '',\n\t\t\tparameters.displacementMapUv ? '#define DISPLACEMENTMAP_UV ' + parameters.displacementMapUv : '',\n\n\t\t\tparameters.metalnessMapUv ? '#define METALNESSMAP_UV ' + parameters.metalnessMapUv : '',\n\t\t\tparameters.roughnessMapUv ? '#define ROUGHNESSMAP_UV ' + parameters.roughnessMapUv : '',\n\n\t\t\tparameters.anisotropyMapUv ? '#define ANISOTROPYMAP_UV ' + parameters.anisotropyMapUv : '',\n\n\t\t\tparameters.clearcoatMapUv ? '#define CLEARCOATMAP_UV ' + parameters.clearcoatMapUv : '',\n\t\t\tparameters.clearcoatNormalMapUv ? '#define CLEARCOAT_NORMALMAP_UV ' + parameters.clearcoatNormalMapUv : '',\n\t\t\tparameters.clearcoatRoughnessMapUv ? '#define CLEARCOAT_ROUGHNESSMAP_UV ' + parameters.clearcoatRoughnessMapUv : '',\n\n\t\t\tparameters.iridescenceMapUv ? '#define IRIDESCENCEMAP_UV ' + parameters.iridescenceMapUv : '',\n\t\t\tparameters.iridescenceThicknessMapUv ? '#define IRIDESCENCE_THICKNESSMAP_UV ' + parameters.iridescenceThicknessMapUv : '',\n\n\t\t\tparameters.sheenColorMapUv ? '#define SHEEN_COLORMAP_UV ' + parameters.sheenColorMapUv : '',\n\t\t\tparameters.sheenRoughnessMapUv ? '#define SHEEN_ROUGHNESSMAP_UV ' + parameters.sheenRoughnessMapUv : '',\n\n\t\t\tparameters.specularMapUv ? '#define SPECULARMAP_UV ' + parameters.specularMapUv : '',\n\t\t\tparameters.specularColorMapUv ? '#define SPECULAR_COLORMAP_UV ' + parameters.specularColorMapUv : '',\n\t\t\tparameters.specularIntensityMapUv ? '#define SPECULAR_INTENSITYMAP_UV ' + parameters.specularIntensityMapUv : '',\n\n\t\t\tparameters.transmissionMapUv ? '#define TRANSMISSIONMAP_UV ' + parameters.transmissionMapUv : '',\n\t\t\tparameters.thicknessMapUv ? '#define THICKNESSMAP_UV ' + parameters.thicknessMapUv : '',\n\n\t\t\t//\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphColors ) ? '#define USE_MORPHCOLORS' : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGARITHMIC_DEPTH_BUFFER' : '',\n\t\t\tparameters.reversedDepthBuffer ? '#define USE_REVERSED_DEPTH_BUFFER' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_MORPH',\n\n\t\t\t'\tuniform sampler2D morphTexture;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_UV1',\n\n\t\t\t'\tattribute vec2 uv1;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV2',\n\n\t\t\t'\tattribute vec2 uv2;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV3',\n\n\t\t\t'\tattribute vec2 uv3;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.alphaToCoverage ? '#define ALPHA_TO_COVERAGE' : '',\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.dispersion ? '#define USE_DISPERSION' : '',\n\n\t\t\tparameters.iridescence ? '#define USE_IRIDESCENCE' : '',\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\t\t\tparameters.decodeVideoTextureEmissive ? '#define DECODE_VIDEO_TEXTURE_EMISSIVE' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGARITHMIC_DEPTH_BUFFER' : '',\n\t\t\tparameters.reversedDepthBuffer ? '#define USE_REVERSED_DEPTH_BUFFER' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.opaque ? '#define OPAQUE' : '',\n\n\t\t\tShaderChunk[ 'colorspace_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputColorSpace ),\n\t\t\tgetLuminanceFunction(),\n\n\t\t\tparameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\tcustomVertexExtensions,\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// log( '*VERTEX*', vertexGlsl );\n\t// log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\tfunction onFirstUse( self ) {\n\n\t\t// check for link errors\n\t\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\t\tconst programInfoLog = gl.getProgramInfoLog( program ) || '';\n\t\t\tconst vertexShaderInfoLog = gl.getShaderInfoLog( glVertexShader ) || '';\n\t\t\tconst fragmentShaderInfoLog = gl.getShaderInfoLog( glFragmentShader ) || '';\n\n\t\t\tconst programLog = programInfoLog.trim();\n\t\t\tconst vertexLog = vertexShaderInfoLog.trim();\n\t\t\tconst fragmentLog = fragmentShaderInfoLog.trim();\n\n\t\t\tlet runnable = true;\n\t\t\tlet haveDiagnostics = true;\n\n\t\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\t\trunnable = false;\n\n\t\t\t\tif ( typeof renderer.debug.onShaderError === 'function' ) {\n\n\t\t\t\t\trenderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// default error reporting\n\n\t\t\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\t\t\terror(\n\t\t\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\\n\\n' +\n\t\t\t\t\t\t'Material Name: ' + self.name + '\\n' +\n\t\t\t\t\t\t'Material Type: ' + self.type + '\\n\\n' +\n\t\t\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\t\t\tfragmentErrors\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( programLog !== '' ) {\n\n\t\t\t\twarn( 'WebGLProgram: Program Info Log:', programLog );\n\n\t\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\t\thaveDiagnostics = false;\n\n\t\t\t}\n\n\t\t\tif ( haveDiagnostics ) {\n\n\t\t\t\tself.diagnostics = {\n\n\t\t\t\t\trunnable: runnable,\n\n\t\t\t\t\tprogramLog: programLog,\n\n\t\t\t\t\tvertexShader: {\n\n\t\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t\t},\n\n\t\t\t\t\tfragmentShader: {\n\n\t\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Clean up\n\n\t\t// Crashes in iOS9 and iOS10. #18402\n\t\t// gl.detachShader( program, glVertexShader );\n\t\t// gl.detachShader( program, glFragmentShader );\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t}\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t// Populates cachedUniforms and cachedAttributes\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t// Populates cachedAttributes and cachedUniforms\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// indicate when the program is ready to be used. if the KHR_parallel_shader_compile extension isn't supported,\n\t// flag the program as ready immediately. It may cause a stall when it's first used.\n\n\tlet programReady = ( parameters.rendererExtensionParallelShaderCompile === false );\n\n\tthis.isReady = function () {\n\n\t\tif ( programReady === false ) {\n\n\t\t\tprogramReady = gl.getProgramParameter( program, COMPLETION_STATUS_KHR );\n\n\t\t}\n\n\t\treturn programReady;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.type = parameters.shaderType;\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nlet _id = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\t\tlet set = cache.get( material );\n\n\t\tif ( set === undefined ) {\n\n\t\t\tset = new Set();\n\t\t\tcache.set( material, set );\n\n\t\t}\n\n\t\treturn set;\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\t\tlet stage = cache.get( code );\n\n\t\tif ( stage === undefined ) {\n\n\t\t\tstage = new WebGLShaderStage( code );\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn stage;\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor( code ) {\n\n\t\tthis.id = _id ++;\n\n\t\tthis.code = code;\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst _activeChannels = new Set();\n\tconst programs = [];\n\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;\n\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getChannel( value ) {\n\n\t\t_activeChannels.add( value );\n\n\t\tif ( value === 0 ) return 'uv';\n\n\t\treturn `uv${ value }`;\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst geometry = object.geometry;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\twarn( 'WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet morphTextureStride = 0;\n\n\t\tif ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1;\n\t\tif ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2;\n\t\tif ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3;\n\n\t\t//\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tconst IS_INSTANCEDMESH = object.isInstancedMesh === true;\n\t\tconst IS_BATCHEDMESH = object.isBatchedMesh === true;\n\n\t\tconst HAS_MAP = !! material.map;\n\t\tconst HAS_MATCAP = !! material.matcap;\n\t\tconst HAS_ENVMAP = !! envMap;\n\t\tconst HAS_AOMAP = !! material.aoMap;\n\t\tconst HAS_LIGHTMAP = !! material.lightMap;\n\t\tconst HAS_BUMPMAP = !! material.bumpMap;\n\t\tconst HAS_NORMALMAP = !! material.normalMap;\n\t\tconst HAS_DISPLACEMENTMAP = !! material.displacementMap;\n\t\tconst HAS_EMISSIVEMAP = !! material.emissiveMap;\n\n\t\tconst HAS_METALNESSMAP = !! material.metalnessMap;\n\t\tconst HAS_ROUGHNESSMAP = !! material.roughnessMap;\n\n\t\tconst HAS_ANISOTROPY = material.anisotropy > 0;\n\t\tconst HAS_CLEARCOAT = material.clearcoat > 0;\n\t\tconst HAS_DISPERSION = material.dispersion > 0;\n\t\tconst HAS_IRIDESCENCE = material.iridescence > 0;\n\t\tconst HAS_SHEEN = material.sheen > 0;\n\t\tconst HAS_TRANSMISSION = material.transmission > 0;\n\n\t\tconst HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !! material.anisotropyMap;\n\n\t\tconst HAS_CLEARCOATMAP = HAS_CLEARCOAT && !! material.clearcoatMap;\n\t\tconst HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !! material.clearcoatNormalMap;\n\t\tconst HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !! material.clearcoatRoughnessMap;\n\n\t\tconst HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !! material.iridescenceMap;\n\t\tconst HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !! material.iridescenceThicknessMap;\n\n\t\tconst HAS_SHEEN_COLORMAP = HAS_SHEEN && !! material.sheenColorMap;\n\t\tconst HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !! material.sheenRoughnessMap;\n\n\t\tconst HAS_SPECULARMAP = !! material.specularMap;\n\t\tconst HAS_SPECULAR_COLORMAP = !! material.specularColorMap;\n\t\tconst HAS_SPECULAR_INTENSITYMAP = !! material.specularIntensityMap;\n\n\t\tconst HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !! material.transmissionMap;\n\t\tconst HAS_THICKNESSMAP = HAS_TRANSMISSION && !! material.thicknessMap;\n\n\t\tconst HAS_GRADIENTMAP = !! material.gradientMap;\n\n\t\tconst HAS_ALPHAMAP = !! material.alphaMap;\n\n\t\tconst HAS_ALPHATEST = material.alphaTest > 0;\n\n\t\tconst HAS_ALPHAHASH = !! material.alphaHash;\n\n\t\tconst HAS_EXTENSIONS = !! material.extensions;\n\n\t\tlet toneMapping = NoToneMapping;\n\n\t\tif ( material.toneMapped ) {\n\n\t\t\tif ( currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\ttoneMapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst parameters = {\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderType: material.type,\n\t\t\tshaderName: material.name,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tbatching: IS_BATCHEDMESH,\n\t\t\tbatchingColor: IS_BATCHEDMESH && object._colorsTexture !== null,\n\t\t\tinstancing: IS_INSTANCEDMESH,\n\t\t\tinstancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,\n\t\t\tinstancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null,\n\n\t\t\tsupportsVertexTextures: SUPPORTS_VERTEX_TEXTURES,\n\t\t\toutputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ),\n\t\t\talphaToCoverage: !! material.alphaToCoverage,\n\n\t\t\tmap: HAS_MAP,\n\t\t\tmatcap: HAS_MATCAP,\n\t\t\tenvMap: HAS_ENVMAP,\n\t\t\tenvMapMode: HAS_ENVMAP && envMap.mapping,\n\t\t\tenvMapCubeUVHeight: envMapCubeUVHeight,\n\t\t\taoMap: HAS_AOMAP,\n\t\t\tlightMap: HAS_LIGHTMAP,\n\t\t\tbumpMap: HAS_BUMPMAP,\n\t\t\tnormalMap: HAS_NORMALMAP,\n\t\t\tdisplacementMap: SUPPORTS_VERTEX_TEXTURES && HAS_DISPLACEMENTMAP,\n\t\t\temissiveMap: HAS_EMISSIVEMAP,\n\n\t\t\tnormalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap,\n\t\t\tnormalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tmetalnessMap: HAS_METALNESSMAP,\n\t\t\troughnessMap: HAS_ROUGHNESSMAP,\n\n\t\t\tanisotropy: HAS_ANISOTROPY,\n\t\t\tanisotropyMap: HAS_ANISOTROPYMAP,\n\n\t\t\tclearcoat: HAS_CLEARCOAT,\n\t\t\tclearcoatMap: HAS_CLEARCOATMAP,\n\t\t\tclearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP,\n\t\t\tclearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP,\n\n\t\t\tdispersion: HAS_DISPERSION,\n\n\t\t\tiridescence: HAS_IRIDESCENCE,\n\t\t\tiridescenceMap: HAS_IRIDESCENCEMAP,\n\t\t\tiridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP,\n\n\t\t\tsheen: HAS_SHEEN,\n\t\t\tsheenColorMap: HAS_SHEEN_COLORMAP,\n\t\t\tsheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP,\n\n\t\t\tspecularMap: HAS_SPECULARMAP,\n\t\t\tspecularColorMap: HAS_SPECULAR_COLORMAP,\n\t\t\tspecularIntensityMap: HAS_SPECULAR_INTENSITYMAP,\n\n\t\t\ttransmission: HAS_TRANSMISSION,\n\t\t\ttransmissionMap: HAS_TRANSMISSIONMAP,\n\t\t\tthicknessMap: HAS_THICKNESSMAP,\n\n\t\t\tgradientMap: HAS_GRADIENTMAP,\n\n\t\t\topaque: material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false,\n\n\t\t\talphaMap: HAS_ALPHAMAP,\n\t\t\talphaTest: HAS_ALPHATEST,\n\t\t\talphaHash: HAS_ALPHAHASH,\n\n\t\t\tcombine: material.combine,\n\n\t\t\t//\n\n\t\t\tmapUv: HAS_MAP && getChannel( material.map.channel ),\n\t\t\taoMapUv: HAS_AOMAP && getChannel( material.aoMap.channel ),\n\t\t\tlightMapUv: HAS_LIGHTMAP && getChannel( material.lightMap.channel ),\n\t\t\tbumpMapUv: HAS_BUMPMAP && getChannel( material.bumpMap.channel ),\n\t\t\tnormalMapUv: HAS_NORMALMAP && getChannel( material.normalMap.channel ),\n\t\t\tdisplacementMapUv: HAS_DISPLACEMENTMAP && getChannel( material.displacementMap.channel ),\n\t\t\temissiveMapUv: HAS_EMISSIVEMAP && getChannel( material.emissiveMap.channel ),\n\n\t\t\tmetalnessMapUv: HAS_METALNESSMAP && getChannel( material.metalnessMap.channel ),\n\t\t\troughnessMapUv: HAS_ROUGHNESSMAP && getChannel( material.roughnessMap.channel ),\n\n\t\t\tanisotropyMapUv: HAS_ANISOTROPYMAP && getChannel( material.anisotropyMap.channel ),\n\n\t\t\tclearcoatMapUv: HAS_CLEARCOATMAP && getChannel( material.clearcoatMap.channel ),\n\t\t\tclearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel( material.clearcoatNormalMap.channel ),\n\t\t\tclearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel( material.clearcoatRoughnessMap.channel ),\n\n\t\t\tiridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel( material.iridescenceMap.channel ),\n\t\t\tiridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel( material.iridescenceThicknessMap.channel ),\n\n\t\t\tsheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel( material.sheenColorMap.channel ),\n\t\t\tsheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel( material.sheenRoughnessMap.channel ),\n\n\t\t\tspecularMapUv: HAS_SPECULARMAP && getChannel( material.specularMap.channel ),\n\t\t\tspecularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel( material.specularColorMap.channel ),\n\t\t\tspecularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel( material.specularIntensityMap.channel ),\n\n\t\t\ttransmissionMapUv: HAS_TRANSMISSIONMAP && getChannel( material.transmissionMap.channel ),\n\t\t\tthicknessMapUv: HAS_THICKNESSMAP && getChannel( material.thicknessMap.channel ),\n\n\t\t\talphaMapUv: HAS_ALPHAMAP && getChannel( material.alphaMap.channel ),\n\n\t\t\t//\n\n\t\t\tvertexTangents: !! geometry.attributes.tangent && ( HAS_NORMALMAP || HAS_ANISOTROPY ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,\n\n\t\t\tpointsUvs: object.isPoints === true && !! geometry.attributes.uv && ( HAS_MAP || HAS_ALPHAMAP ),\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog === true,\n\t\t\tfogExp2: ( !! fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: ( material.flatShading === true && material.wireframe === false ),\n\n\t\t\tsizeAttenuation: material.sizeAttenuation === true,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\t\treversedDepthBuffer: reversedDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true,\n\n\t\t\tmorphTargets: geometry.morphAttributes.position !== undefined,\n\t\t\tmorphNormals: geometry.morphAttributes.normal !== undefined,\n\t\t\tmorphColors: geometry.morphAttributes.color !== undefined,\n\t\t\tmorphTargetsCount: morphTargetsCount,\n\t\t\tmorphTextureStride: morphTextureStride,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumSpotLightMaps: lights.spotLightMap.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\t\t\tnumSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps,\n\n\t\t\tnumLightProbes: lights.numLightProbes,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: toneMapping,\n\n\t\t\tdecodeVideoTexture: HAS_MAP && ( material.map.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.map.colorSpace ) === SRGBTransfer ),\n\t\t\tdecodeVideoTextureEmissive: HAS_EMISSIVEMAP && ( material.emissiveMap.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.emissiveMap.colorSpace ) === SRGBTransfer ),\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tuseDepthPacking: material.depthPacking >= 0,\n\t\t\tdepthPacking: material.depthPacking || 0,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has( 'WEBGL_clip_cull_distance' ),\n\t\t\textensionMultiDraw: ( HAS_EXTENSIONS && material.extensions.multiDraw === true || IS_BATCHEDMESH ) && extensions.has( 'WEBGL_multi_draw' ),\n\n\t\t\trendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\t// the usage of getChannel() determines the active texture channels for this shader\n\n\t\tparameters.vertexUv1s = _activeChannels.has( 1 );\n\t\tparameters.vertexUv2s = _activeChannels.has( 2 );\n\t\tparameters.vertexUv3s = _activeChannels.has( 3 );\n\n\t\t_activeChannels.clear();\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputColorSpace );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputColorSpace );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.envMapCubeUVHeight );\n\t\tarray.push( parameters.mapUv );\n\t\tarray.push( parameters.alphaMapUv );\n\t\tarray.push( parameters.lightMapUv );\n\t\tarray.push( parameters.aoMapUv );\n\t\tarray.push( parameters.bumpMapUv );\n\t\tarray.push( parameters.normalMapUv );\n\t\tarray.push( parameters.displacementMapUv );\n\t\tarray.push( parameters.emissiveMapUv );\n\t\tarray.push( parameters.metalnessMapUv );\n\t\tarray.push( parameters.roughnessMapUv );\n\t\tarray.push( parameters.anisotropyMapUv );\n\t\tarray.push( parameters.clearcoatMapUv );\n\t\tarray.push( parameters.clearcoatNormalMapUv );\n\t\tarray.push( parameters.clearcoatRoughnessMapUv );\n\t\tarray.push( parameters.iridescenceMapUv );\n\t\tarray.push( parameters.iridescenceThicknessMapUv );\n\t\tarray.push( parameters.sheenColorMapUv );\n\t\tarray.push( parameters.sheenRoughnessMapUv );\n\t\tarray.push( parameters.specularMapUv );\n\t\tarray.push( parameters.specularColorMapUv );\n\t\tarray.push( parameters.specularIntensityMapUv );\n\t\tarray.push( parameters.transmissionMapUv );\n\t\tarray.push( parameters.thicknessMapUv );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.morphAttributeCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numSpotLightMaps );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.numSpotLightShadowsWithMaps );\n\t\tarray.push( parameters.numLightProbes );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\t\tarray.push( parameters.depthPacking );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingMorph )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.normalMapObjectSpace )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.normalMapTangentSpace )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.iridescence )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.vertexUv1s )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.vertexUv2s )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.vertexUv3s )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.anisotropy )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.alphaHash )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.batching )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.dispersion )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.batchingColor )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.gradientMap )\n\t\t\t_programLayers.enable( 22 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.reversedDepthBuffer )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.morphColors )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.useDepthPacking )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.opaque )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.pointsUvs )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.decodeVideoTextureEmissive )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.alphaToCoverage )\n\t\t\t_programLayers.enable( 21 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction has( object ) {\n\n\t\treturn properties.has( object );\n\n\t}\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\thas: has,\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tconst listArray = lists.get( scene );\n\t\tlet list;\n\n\t\tif ( listArray === undefined ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= listArray.length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlistArray.push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = listArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingAndTexturingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 2 : 0 ) - ( lightA.castShadow ? 2 : 0 ) + ( lightB.map ? 1 : 0 ) - ( lightA.map ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: -1,\n\t\t\tpointLength: -1,\n\t\t\tspotLength: -1,\n\t\t\trectAreaLength: -1,\n\t\t\themiLength: -1,\n\n\t\t\tnumDirectionalShadows: -1,\n\t\t\tnumPointShadows: -1,\n\t\t\tnumSpotShadows: -1,\n\t\t\tnumSpotMaps: -1,\n\n\t\t\tnumLightProbes: -1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotLightMap: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotLightMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: [],\n\t\tnumSpotLightShadowsWithMaps: 0,\n\t\tnumLightProbes: 0\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\t\tlet numSpotMaps = 0;\n\t\tlet numSpotShadowsWithMaps = 0;\n\n\t\tlet numLightProbes = 0;\n\n\t\t// ordering : [shadow casting + map texturing, map texturing, shadow casting, none ]\n\t\tlights.sort( shadowCastingAndTexturingLightsFirst );\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity;\n\t\t\t\tg += color.g * intensity;\n\t\t\t\tb += color.b * intensity;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t\tnumLightProbes ++;\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\tif ( light.map ) {\n\n\t\t\t\t\tstate.spotLightMap[ numSpotMaps ] = light.map;\n\t\t\t\t\tnumSpotMaps ++;\n\n\t\t\t\t\t// make sure the lightMatrix is up to date\n\t\t\t\t\t// TODO : do it if required only\n\t\t\t\t\tshadow.updateMatrices( light );\n\n\t\t\t\t\tif ( light.castShadow ) numSpotShadowsWithMaps ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spotLightMatrix[ spotLength ] = shadow.matrix;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ||\n\t\t\thash.numSpotMaps !== numSpotMaps ||\n\t\t\thash.numLightProbes !== numLightProbes ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps;\n\t\t\tstate.spotLightMap.length = numSpotMaps;\n\t\t\tstate.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps;\n\t\t\tstate.numLightProbes = numLightProbes;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\t\t\thash.numSpotMaps = numSpotMaps;\n\n\t\t\thash.numLightProbes = numLightProbes;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions ) {\n\n\tconst lights = new WebGLLights( extensions );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init( camera ) {\n\n\t\tstate.camera = camera;\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights() {\n\n\t\tlights.setup( lightsArray );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tcamera: null,\n\n\t\tlights: lights,\n\n\t\ttransmissionRenderTarget: {}\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tconst renderStateArray = renderStates.get( scene );\n\t\tlet renderState;\n\n\t\tif ( renderStateArray === undefined ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStateArray.length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\t\trenderStateArray.push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStateArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst vertex = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nconst fragment = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\n#include \\nvoid main() {\\n\\tconst float samples = float( VSM_SAMPLES );\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\\n\\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\\n\\tfor ( float i = 0.0; i < samples; i ++ ) {\\n\\t\\tfloat uvOffset = uvStart + i * uvStride;\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\\n\\t\\t\\tmean += distribution.x;\\n\\t\\t\\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n\\t\\t#else\\n\\t\\t\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean / samples;\\n\\tsquared_mean = squared_mean / samples;\\n\\tfloat std_dev = sqrt( squared_mean - mean * mean );\\n\\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\\n}\";\n\nfunction WebGLShadowMap( renderer, objects, capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = capabilities.maxTextureSize;\n\n\tconst shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vertex,\n\t\tfragmentShader: fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ -1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\tlet _previousType = this.type;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst activeCubeFace = renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst _state = renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\n\t\tif ( _state.buffers.depth.getReversed() === true ) {\n\n\t\t\t_state.buffers.color.setClear( 0, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\n\t\t}\n\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// check for shadow map type changes\n\n\t\tconst toVSM = ( _previousType !== VSMShadowMap && this.type === VSMShadowMap );\n\t\tconst fromVSM = ( _previousType === VSMShadowMap && this.type !== VSMShadowMap );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\twarn( 'WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null || toVSM === true || fromVSM === true ) {\n\n\t\t\t\tconst pars = ( this.type !== VSMShadowMap ) ? { minFilter: NearestFilter, magFilter: NearestFilter } : {};\n\n\t\t\t\tif ( shadow.map !== null ) {\n\n\t\t\t\t\tshadow.map.dispose();\n\n\t\t\t\t}\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\trenderer.setRenderTarget( shadow.map );\n\t\t\trenderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( shadow.isPointLightShadow !== true && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\t_previousType = this.type;\n\n\t\tscope.needsUpdate = false;\n\n\t\trenderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( shadow.mapPass === null ) {\n\n\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.mapPass );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.map );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, material, light, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t\tif ( ( renderer.localClippingEnabled && material.clipShadows === true && Array.isArray( material.clippingPlanes ) && material.clippingPlanes.length !== 0 ) ||\n\t\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t\t( material.alphaMap && material.alphaTest > 0 ) ||\n\t\t\t\t( material.map && material.alphaTest > 0 ) ||\n\t\t\t\t( material.alphaToCoverage === true ) ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\t\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = ( material.alphaToCoverage === true ) ? 0.5 : material.alphaTest; // approximate alphaToCoverage by using a fixed alphaTest value\n\t\tresult.map = material.map;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tconst materialProperties = renderer.properties.get( result );\n\t\t\tmaterialProperties.light = light;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, groupMaterial, light, type );\n\n\t\t\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, material, light, type );\n\n\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t// make sure to remove the unique distance/depth materials used for shadow map rendering\n\n\t\tfor ( const id in _materialCache ) {\n\n\t\t\tconst cache = _materialCache[ id ];\n\n\t\t\tconst uuid = event.target.uuid;\n\n\t\t\tif ( uuid in cache ) {\n\n\t\t\t\tconst shadowMaterial = cache[ uuid ];\n\t\t\t\tshadowMaterial.dispose();\n\t\t\t\tdelete cache[ uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nconst reversedFuncs = {\n\t[ NeverDepth ]: AlwaysDepth,\n\t[ LessDepth ]: GreaterDepth,\n\t[ EqualDepth ]: NotEqualDepth,\n\t[ LessEqualDepth ]: GreaterEqualDepth,\n\n\t[ AlwaysDepth ]: NeverDepth,\n\t[ GreaterDepth ]: LessDepth,\n\t[ NotEqualDepth ]: EqualDepth,\n\t[ GreaterEqualDepth ]: LessEqualDepth,\n};\n\nfunction WebGLState( gl, extensions ) {\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( -1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentReversed = false;\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetReversed: function ( reversed ) {\n\n\t\t\t\tif ( currentReversed !== reversed ) {\n\n\t\t\t\t\tconst ext = extensions.get( 'EXT_clip_control' );\n\n\t\t\t\t\tif ( reversed ) {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.ZERO_TO_ONE_EXT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.NEGATIVE_ONE_TO_ONE_EXT );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentReversed = reversed;\n\n\t\t\t\t\tconst oldDepth = currentDepthClear;\n\t\t\t\t\tcurrentDepthClear = null;\n\t\t\t\t\tthis.setClear( oldDepth );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tgetReversed: function () {\n\n\t\t\t\treturn currentReversed;\n\n\t\t\t},\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentReversed ) depthFunc = reversedFuncs[ depthFunc ];\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tif ( currentReversed ) {\n\n\t\t\t\t\t\tdepth = 1 - depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\t\t\t\tcurrentReversed = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t currentStencilRef !== stencilRef ||\n\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tconst uboBindings = new WeakMap();\n\tconst uboProgramMap = new WeakMap();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentBlendColor = new Color( 0, 0, 0 );\n\tlet currentBlendAlpha = 0;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( gl.SCISSOR_BOX );\n\tconst viewportParam = gl.getParameter( gl.VIEWPORT );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count, dimensions ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tif ( type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tgl.texImage3D( target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t} else {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\temptyTextures[ gl.TEXTURE_2D_ARRAY ] = createTexture( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1 );\n\temptyTextures[ gl.TEXTURE_3D ] = createTexture( gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( gl.DEPTH_TEST );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( gl.CULL_FACE );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\t// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER\n\n\t\t\tif ( target === gl.DRAW_FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\tif ( target === gl.FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tdrawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t}\n\n\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== gl.BACK ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = gl.BACK;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t}\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: gl.FUNC_ADD,\n\t\t[ SubtractEquation ]: gl.FUNC_SUBTRACT,\n\t\t[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT\n\t};\n\n\tequationToGL[ MinEquation ] = gl.MIN;\n\tequationToGL[ MaxEquation ] = gl.MAX;\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: gl.ZERO,\n\t\t[ OneFactor ]: gl.ONE,\n\t\t[ SrcColorFactor ]: gl.SRC_COLOR,\n\t\t[ SrcAlphaFactor ]: gl.SRC_ALPHA,\n\t\t[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,\n\t\t[ DstColorFactor ]: gl.DST_COLOR,\n\t\t[ DstAlphaFactor ]: gl.DST_ALPHA,\n\t\t[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,\n\t\t[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,\n\t\t[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA,\n\t\t[ ConstantColorFactor ]: gl.CONSTANT_COLOR,\n\t\t[ OneMinusConstantColorFactor ]: gl.ONE_MINUS_CONSTANT_COLOR,\n\t\t[ ConstantAlphaFactor ]: gl.CONSTANT_ALPHA,\n\t\t[ OneMinusConstantAlphaFactor ]: gl.ONE_MINUS_CONSTANT_ALPHA\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( gl.BLEND );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( gl.BLEND );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE, gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: SubtractiveBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: MultiplyBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\t\t\t\tcurrentBlendColor.set( 0, 0, 0 );\n\t\t\t\tcurrentBlendAlpha = 0;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tif ( blendColor.equals( currentBlendColor ) === false || blendAlpha !== currentBlendAlpha ) {\n\n\t\t\tgl.blendColor( blendColor.r, blendColor.g, blendColor.b, blendAlpha );\n\n\t\t\tcurrentBlendColor.copy( blendColor );\n\t\t\tcurrentBlendAlpha = blendAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = false;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( gl.CULL_FACE )\n\t\t\t: enable( gl.CULL_FACE );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( gl.SAMPLE_ALPHA_TO_COVERAGE )\n\t\t\t: disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture, webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\twebglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\t} else {\n\n\t\t\t\twebglSlot = currentTextureSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ webglSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ webglSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\tfunction updateUBOMapping( uniformsGroup, program ) {\n\n\t\tlet mapping = uboProgramMap.get( program );\n\n\t\tif ( mapping === undefined ) {\n\n\t\t\tmapping = new WeakMap();\n\n\t\t\tuboProgramMap.set( program, mapping );\n\n\t\t}\n\n\t\tlet blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( blockIndex === undefined ) {\n\n\t\t\tblockIndex = gl.getUniformBlockIndex( program, uniformsGroup.name );\n\n\t\t\tmapping.set( uniformsGroup, blockIndex );\n\n\t\t}\n\n\t}\n\n\tfunction uniformBlockBinding( uniformsGroup, program ) {\n\n\t\tconst mapping = uboProgramMap.get( program );\n\t\tconst blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( uboBindings.get( program ) !== blockIndex ) {\n\n\t\t\t// bind shader specific block index to global block point\n\t\t\tgl.uniformBlockBinding( program, blockIndex, uniformsGroup.__bindingPointIndex );\n\n\t\t\tuboBindings.set( program, blockIndex );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( gl.BLEND );\n\t\tgl.disable( gl.CULL_FACE );\n\t\tgl.disable( gl.DEPTH_TEST );\n\t\tgl.disable( gl.POLYGON_OFFSET_FILL );\n\t\tgl.disable( gl.SCISSOR_TEST );\n\t\tgl.disable( gl.STENCIL_TEST );\n\t\tgl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\tgl.blendFunc( gl.ONE, gl.ZERO );\n\t\tgl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );\n\t\tgl.blendColor( 0, 0, 0, 0 );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( gl.LESS );\n\n\t\tdepthBuffer.setReversed( false );\n\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( gl.ALWAYS, 0, 0xffffffff );\n\t\tgl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( gl.BACK );\n\t\tgl.frontFace( gl.CCW );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( gl.TEXTURE0 );\n\n\t\tgl.bindFramebuffer( gl.FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentBlendColor = new Color( 0, 0, 0 );\n\t\tcurrentBlendAlpha = 0;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\tcompressedTexImage3D: compressedTexImage3D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tupdateUBOMapping: updateUBOMapping,\n\t\tuniformBlockBinding: uniformBlockBinding,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\t\tcompressedTexSubImage3D: compressedTexSubImage3D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;\n\tconst supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );\n\n\tconst _imageDimensions = new Vector2();\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\tconst _sources = new WeakMap(); // maps WebglTexture objects to instances of Source\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\tconst dimensions = getDimensions( image );\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( dimensions.width > maxSize || dimensions.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( dimensions.width, dimensions.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ||\n\t\t\t\t( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) ) {\n\n\t\t\t\tconst width = Math.floor( scale * dimensions.width );\n\t\t\t\tconst height = Math.floor( scale * dimensions.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\twarn( 'WebGLRenderer: Texture has been resized from (' + dimensions.width + 'x' + dimensions.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\twarn( 'WebGLRenderer: Image in DataTexture is too big (' + dimensions.width + 'x' + dimensions.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture ) {\n\n\t\treturn texture.generateMipmaps;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getTargetType( texture ) {\n\n\t\tif ( texture.isWebGLCubeRenderTarget ) return _gl.TEXTURE_CUBE_MAP;\n\t\tif ( texture.isWebGL3DRenderTarget ) return _gl.TEXTURE_3D;\n\t\tif ( texture.isWebGLArrayRenderTarget || texture.isCompressedArrayTexture ) return _gl.TEXTURE_2D_ARRAY;\n\t\treturn _gl.TEXTURE_2D;\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false ) {\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\twarn( 'WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === _gl.RED ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.R32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RED_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.R8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.R16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.R32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RG16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RG32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RG8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RG16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RG32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGB8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGB16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGB32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGB8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGB16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGB32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGBA8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGBA16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGBA32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGBA8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGBA16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGBA32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_INT_5_9_9_9_REV ) internalFormat = _gl.RGB9_E5;\n\t\t\tif ( glType === _gl.UNSIGNED_INT_10F_11F_11F_REV ) internalFormat = _gl.R11F_G11F_B10F;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA ) {\n\n\t\t\tconst transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer( colorSpace );\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( transfer === SRGBTransfer ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1;\n\n\t\t}\n\n\t\tif ( internalFormat === _gl.R16F || internalFormat === _gl.R32F ||\n\t\t\tinternalFormat === _gl.RG16F || internalFormat === _gl.RG32F ||\n\t\t\tinternalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getInternalDepthFormat( useStencil, depthType ) {\n\n\t\tlet glInternalFormat;\n\t\tif ( useStencil ) {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH32F_STENCIL8;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\t\t\t\twarn( 'DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.' );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn glInternalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t// check if it's necessary to remove the WebGLTexture object\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures ) {\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\t\t\twebglTexture.usedTimes --;\n\n\t\t\t// the WebGLTexture object is not used anymore, remove it\n\n\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\tdeleteTexture( texture );\n\n\t\t\t}\n\n\t\t\t// remove the weak map entry if no WebGLTexture uses the source anymore\n\n\t\t\tif ( Object.keys( webglTextures ).length === 0 ) {\n\n\t\t\t\t_sources.delete( source );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deleteTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\t\tdelete webglTextures[ textureProperties.__cacheKey ];\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\tproperties.remove( renderTarget.depthTexture );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) {\n\n\t\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) {\n\n\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) {\n\n\t\t\t\tfor ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\tinfo.memory.textures --;\n\n\t\t\t}\n\n\t\t\tproperties.remove( textures[ i ] );\n\n\t\t}\n\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\twarn( 'WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tfunction getTextureCacheKey( texture ) {\n\n\t\tconst array = [];\n\n\t\tarray.push( texture.wrapS );\n\t\tarray.push( texture.wrapT );\n\t\tarray.push( texture.wrapR || 0 );\n\t\tarray.push( texture.magFilter );\n\t\tarray.push( texture.minFilter );\n\t\tarray.push( texture.anisotropy );\n\t\tarray.push( texture.internalFormat );\n\t\tarray.push( texture.format );\n\t\tarray.push( texture.type );\n\t\tarray.push( texture.generateMipmaps );\n\t\tarray.push( texture.premultiplyAlpha );\n\t\tarray.push( texture.flipY );\n\t\tarray.push( texture.unpackAlignment );\n\t\tarray.push( texture.colorSpace );\n\n\t\treturn array.join();\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.isExternalTexture !== true && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === null ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Texture marked for update but no image data found.' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t} else if ( texture.isExternalTexture ) {\n\n\t\t\ttextureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t} else if ( texture.isExternalTexture ) {\n\n\t\t\ttextureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: _gl.REPEAT,\n\t\t[ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE,\n\t\t[ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: _gl.NEAREST,\n\t\t[ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST,\n\t\t[ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR,\n\n\t\t[ LinearFilter ]: _gl.LINEAR,\n\t\t[ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST,\n\t\t[ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR\n\t};\n\n\tconst compareToGL = {\n\t\t[ NeverCompare ]: _gl.NEVER,\n\t\t[ AlwaysCompare ]: _gl.ALWAYS,\n\t\t[ LessCompare ]: _gl.LESS,\n\t\t[ LessEqualCompare ]: _gl.LEQUAL,\n\t\t[ EqualCompare ]: _gl.EQUAL,\n\t\t[ GreaterEqualCompare ]: _gl.GEQUAL,\n\t\t[ GreaterCompare ]: _gl.GREATER,\n\t\t[ NotEqualCompare ]: _gl.NOTEQUAL\n\t};\n\n\tfunction setTextureParameters( textureType, texture ) {\n\n\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false &&\n\t\t\t( texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter ||\n\t\t\ttexture.minFilter === LinearFilter || texture.minFilter === LinearMipmapNearestFilter || texture.minFilter === NearestMipmapLinearFilter || texture.minFilter === LinearMipmapLinearFilter ) ) {\n\n\t\t\twarn( 'WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device.' );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );\n\n\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] );\n\n\t\tif ( texture.compareFunction ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[ texture.compareFunction ] );\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tif ( texture.magFilter === NearestFilter ) return;\n\t\t\tif ( texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter ) return;\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tlet forceUpload = false;\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t}\n\n\t\t// create Source <-> WebGLTextures mapping if necessary\n\n\t\tconst source = texture.source;\n\t\tlet webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures === undefined ) {\n\n\t\t\twebglTextures = {};\n\t\t\t_sources.set( source, webglTextures );\n\n\t\t}\n\n\t\t// check if there is already a WebGLTexture object for the given texture parameters\n\n\t\tconst textureCacheKey = getTextureCacheKey( texture );\n\n\t\tif ( textureCacheKey !== textureProperties.__cacheKey ) {\n\n\t\t\t// if not, create a new instance of WebGLTexture\n\n\t\t\tif ( webglTextures[ textureCacheKey ] === undefined ) {\n\n\t\t\t\t// create new entry\n\n\t\t\t\twebglTextures[ textureCacheKey ] = {\n\t\t\t\t\ttexture: _gl.createTexture(),\n\t\t\t\t\tusedTimes: 0\n\t\t\t\t};\n\n\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t// when a new instance of WebGLTexture was created, a texture upload is required\n\t\t\t\t// even if the image contents are identical\n\n\t\t\t\tforceUpload = true;\n\n\t\t\t}\n\n\t\t\twebglTextures[ textureCacheKey ].usedTimes ++;\n\n\t\t\t// every time the texture cache key changes, it's necessary to check if an instance of\n\t\t\t// WebGLTexture can be deleted in order to avoid a memory leak.\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\n\t\t\tif ( webglTexture !== undefined ) {\n\n\t\t\t\twebglTextures[ textureProperties.__cacheKey ].usedTimes --;\n\n\t\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\t\tdeleteTexture( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// store references to cache key and WebGLTexture object\n\n\t\t\ttextureProperties.__cacheKey = textureCacheKey;\n\t\t\ttextureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;\n\n\t\t}\n\n\t\treturn forceUpload;\n\n\t}\n\n\tfunction getRow( index, rowLength, componentStride ) {\n\n\t\treturn Math.floor( Math.floor( index / componentStride ) / rowLength );\n\n\t}\n\n\tfunction updateTexture( texture, image, glFormat, glType ) {\n\n\t\tconst componentStride = 4; // only RGBA supported\n\n\t\tconst updateRanges = texture.updateRanges;\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.texSubImage2D`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// Only merge if in the same row and overlapping/adjacent\n\t\t\t\tconst previousEnd = previousRange.start + previousRange.count;\n\t\t\t\tconst currentRow = getRow( range.start, image.width, componentStride );\n\t\t\t\tconst previousRow = getRow( previousRange.start, image.width, componentStride );\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif (\n\t\t\t\t\trange.start <= previousEnd + 1 &&\n\t\t\t\t\tcurrentRow === previousRow &&\n\t\t\t\t\tgetRow( range.start + range.count - 1, image.width, componentStride ) === currentRow // ensure range doesn't spill\n\t\t\t\t) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tconst pixelStart = Math.floor( range.start / componentStride );\n\t\t\t\tconst pixelCount = Math.ceil( range.count / componentStride );\n\n\t\t\t\tconst x = pixelStart % image.width;\n\t\t\t\tconst y = Math.floor( pixelStart / image.width );\n\n\t\t\t\t// Assumes update ranges refer to contiguous memory\n\t\t\t\tconst width = pixelCount;\n\t\t\t\tconst height = 1;\n\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, x );\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, y );\n\n\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, x, y, width, height, glFormat, glType, image.data );\n\n\t\t\t}\n\n\t\t\ttexture.clearUpdateRanges();\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\n\t\t}\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = _gl.TEXTURE_2D;\n\n\t\tif ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) textureType = _gl.TEXTURE_2D_ARRAY;\n\t\tif ( texture.isData3DTexture ) textureType = _gl.TEXTURE_3D;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tlet image = resizeImage( texture.image, false, capabilities.maxTextureSize );\n\t\t\timage = verifyColorSpace( texture, image );\n\n\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\n\t\t\tconst glType = utils.convert( texture.type );\n\t\t\tlet glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture );\n\n\t\t\tsetTextureParameters( textureType, texture );\n\n\t\t\tlet mipmap;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tconst levels = getMipLevels( texture, image );\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\tglInternalFormat = getInternalDepthFormat( texture.format === DepthStencilFormat, texture.type );\n\n\t\t\t\t//\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tupdateTexture( texture, image, glFormat, glType );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tif ( texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst layerByteLength = getByteLength( mipmap.width, mipmap.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tconst layerData = mipmap.data.subarray(\n\t\t\t\t\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData );\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataArrayTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\tconst layerByteLength = getByteLength( image.width, image.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\tconst layerData = image.data.subarray(\n\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / image.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlet width = image.width, height = image.height;\n\n\t\t\t\t\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t\t\t\t\twidth >>= 1;\n\t\t\t\t\t\t\theight >>= 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tconst dimensions = getDimensions( mipmaps[ 0 ] );\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tconst dimensions = getDimensions( image );\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( textureType );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tconst isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], true, capabilities.maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tglFormat = utils.convert( texture.format, texture.colorSpace ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tlet levels = getMipLevels( texture, image );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\t\tconst dimensions = getDimensions( cubeImage[ 0 ] );\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget, level ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tconst width = Math.max( 1, renderTarget.width >> level );\n\t\t\tconst height = Math.max( 1, renderTarget.height >> level );\n\n\t\t\tif ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, level );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t// retrieve the depth attachment types\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tconst depthType = depthTexture && depthTexture.isDepthTexture ? depthTexture.type : null;\n\t\t\tconst glInternalFormat = getInternalDepthFormat( renderTarget.stencilBuffer, depthType );\n\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t// set up the attachment\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\tconst isUseMultisampledRTT = useMultisampledRTT( renderTarget );\n\t\t\tif ( isUseMultisampledRTT ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( isMultisample ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\tconst textureProperties = properties.get( renderTarget.depthTexture );\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! textureProperties.__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = textureProperties.__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\t// if the bound depth texture has changed\n\t\tif ( renderTargetProperties.__boundDepthTexture !== renderTarget.depthTexture ) {\n\n\t\t\t// fire the dispose event to get rid of stored state associated with the previously bound depth buffer\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tif ( renderTargetProperties.__depthDisposeCallback ) {\n\n\t\t\t\trenderTargetProperties.__depthDisposeCallback();\n\n\t\t\t}\n\n\t\t\t// set up dispose listeners to track when the currently attached buffer is implicitly unbound\n\t\t\tif ( depthTexture ) {\n\n\t\t\t\tconst disposeEvent = () => {\n\n\t\t\t\t\tdelete renderTargetProperties.__boundDepthTexture;\n\t\t\t\t\tdelete renderTargetProperties.__depthDisposeCallback;\n\t\t\t\t\tdepthTexture.removeEventListener( 'dispose', disposeEvent );\n\n\t\t\t\t};\n\n\t\t\t\tdepthTexture.addEventListener( 'dispose', disposeEvent );\n\t\t\t\trenderTargetProperties.__depthDisposeCallback = disposeEvent;\n\n\t\t\t}\n\n\t\t\trenderTargetProperties.__boundDepthTexture = depthTexture;\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer[ 0 ], renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer[ i ] === undefined ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer[ i ];\n\t\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ 0 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer === undefined ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer;\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\tif ( ! isMultipleRenderTargets ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = [];\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = [];\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tconst texture = textures[ i ];\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, renderTarget.isXRRenderTarget === true );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindTexture( glTextureType, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( glTextureType, attachment );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, glTextureType, 0 );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment ) ) {\n\n\t\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture );\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tconst targetType = getTargetType( renderTarget );\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( targetType, webglTexture );\n\t\t\t\tgenerateMipmap( targetType );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst invalidationArrayRead = [];\n\tconst invalidationArrayDraw = [];\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( renderTarget.samples > 0 ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tconst textures = renderTarget.textures;\n\t\t\t\tconst width = renderTarget.width;\n\t\t\t\tconst height = renderTarget.height;\n\t\t\t\tlet mask = _gl.COLOR_BUFFER_BIT;\n\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\t\t\t// If MRT we need to remove FBO attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null );\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ 0 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTarget.resolveDepthBuffer ) {\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t\t\t\t// resolving stencil is slow with a D3D backend. disable it for all transmission render targets (see #27799)\n\n\t\t\t\t\t\tif ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );\n\n\t\t\t\t\tif ( supportsInvalidateFramebuffer === true ) {\n\n\t\t\t\t\t\tinvalidationArrayRead.length = 0;\n\t\t\t\t\t\tinvalidationArrayDraw.length = 0;\n\n\t\t\t\t\t\tinvalidationArrayRead.push( _gl.COLOR_ATTACHMENT0 + i );\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false ) {\n\n\t\t\t\t\t\t\tinvalidationArrayRead.push( depthStyle );\n\t\t\t\t\t\t\tinvalidationArrayDraw.push( depthStyle );\n\n\t\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, invalidationArrayDraw );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArrayRead );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t\t// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t} else {\n\n\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false && supportsInvalidateFramebuffer ) {\n\n\t\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn Math.min( capabilities.maxSamples, renderTarget.samples );\n\n\t}\n\n\tfunction useMultisampledRTT( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\treturn renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst colorSpace = texture.colorSpace;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true ) return image;\n\n\t\tif ( colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( ColorManagement.getTransfer( colorSpace ) === SRGBTransfer ) {\n\n\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\twarn( 'WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\terror( 'WebGLTextures: Unsupported texture color space:', colorSpace );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction getDimensions( image ) {\n\n\t\tif ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) {\n\n\t\t\t// if intrinsic data are not available, fallback to width/height\n\n\t\t\t_imageDimensions.width = image.naturalWidth || image.width;\n\t\t\t_imageDimensions.height = image.naturalHeight || image.height;\n\n\t\t} else if ( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) {\n\n\t\t\t_imageDimensions.width = image.displayWidth;\n\t\t\t_imageDimensions.height = image.displayHeight;\n\n\t\t} else {\n\n\t\t\t_imageDimensions.width = image.width;\n\t\t\t_imageDimensions.height = image.height;\n\n\t\t}\n\n\t\treturn _imageDimensions;\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\tthis.useMultisampledRTT = useMultisampledRTT;\n\n}\n\nfunction WebGLUtils( gl, extensions ) {\n\n\tfunction convert( p, colorSpace = NoColorSpace ) {\n\n\t\tlet extension;\n\n\t\tconst transfer = ColorManagement.getTransfer( colorSpace );\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\t\tif ( p === UnsignedInt5999Type ) return gl.UNSIGNED_INT_5_9_9_9_REV;\n\t\tif ( p === UnsignedInt101111Type ) return gl.UNSIGNED_INT_10F_11F_11F_REV;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\t\tif ( p === HalfFloatType ) return gl.HALF_FLOAT;\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBFormat ) return gl.RGB;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedFormat ) return gl.RED;\n\t\tif ( p === RedIntegerFormat ) return gl.RED_INTEGER;\n\t\tif ( p === RGFormat ) return gl.RG;\n\t\tif ( p === RGIntegerFormat ) return gl.RG_INTEGER;\n\t\tif ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( transfer === SRGBTransfer ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC\n\n\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\t\t\t\tif ( p === RGB_BPTC_SIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;\n\t\t\t\tif ( p === RGB_BPTC_UNSIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// RGTC\n\n\t\tif ( p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_rgtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RED_RGTC1_Format ) return extension.COMPRESSED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT;\n\t\t\t\tif ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) return gl.UNSIGNED_INT_24_8;\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nconst _occlusion_vertex = `\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}`;\n\nconst _occlusion_fragment = `\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}`;\n\n/**\n * A XR module that manages the access to the Depth Sensing API.\n */\nclass WebXRDepthSensing {\n\n\t/**\n\t * Constructs a new depth sensing module.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * An opaque texture representing the depth of the user's environment.\n\t\t *\n\t\t * @type {?ExternalTexture}\n\t\t */\n\t\tthis.texture = null;\n\n\t\t/**\n\t\t * A plane mesh for visualizing the depth texture.\n\t\t *\n\t\t * @type {?Mesh}\n\t\t */\n\t\tthis.mesh = null;\n\n\t\t/**\n\t\t * The depth near value.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.depthNear = 0;\n\n\t\t/**\n\t\t * The depth near far.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.depthFar = 0;\n\n\t}\n\n\t/**\n\t * Inits the depth sensing module\n\t *\n\t * @param {XRWebGLDepthInformation} depthData - The XR depth data.\n\t * @param {XRRenderState} renderState - The XR render state.\n\t */\n\tinit( depthData, renderState ) {\n\n\t\tif ( this.texture === null ) {\n\n\t\t\tconst texture = new ExternalTexture( depthData.texture );\n\n\t\t\tif ( ( depthData.depthNear !== renderState.depthNear ) || ( depthData.depthFar !== renderState.depthFar ) ) {\n\n\t\t\t\tthis.depthNear = depthData.depthNear;\n\t\t\t\tthis.depthFar = depthData.depthFar;\n\n\t\t\t}\n\n\t\t\tthis.texture = texture;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a plane mesh that visualizes the depth texture.\n\t *\n\t * @param {ArrayCamera} cameraXR - The XR camera.\n\t * @return {?Mesh} The plane mesh.\n\t */\n\tgetMesh( cameraXR ) {\n\n\t\tif ( this.texture !== null ) {\n\n\t\t\tif ( this.mesh === null ) {\n\n\t\t\t\tconst viewport = cameraXR.cameras[ 0 ].viewport;\n\t\t\t\tconst material = new ShaderMaterial( {\n\t\t\t\t\tvertexShader: _occlusion_vertex,\n\t\t\t\t\tfragmentShader: _occlusion_fragment,\n\t\t\t\t\tuniforms: {\n\t\t\t\t\t\tdepthColor: { value: this.texture },\n\t\t\t\t\t\tdepthWidth: { value: viewport.z },\n\t\t\t\t\t\tdepthHeight: { value: viewport.w }\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tthis.mesh = new Mesh( new PlaneGeometry( 20, 20 ), material );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this.mesh;\n\n\t}\n\n\t/**\n\t * Resets the module\n\t */\n\treset() {\n\n\t\tthis.texture = null;\n\t\tthis.mesh = null;\n\n\t}\n\n\t/**\n\t * Returns a texture representing the depth of the user's environment.\n\t *\n\t * @return {?ExternalTexture} The depth texture.\n\t */\n\tgetDepthTexture() {\n\n\t\treturn this.texture;\n\n\t}\n\n}\n\n/**\n * This class represents an abstraction of the WebXR Device API and is\n * internally used by {@link WebGLRenderer}. `WebXRManager` also provides a public\n * interface that allows users to enable/disable XR and perform XR related\n * tasks like for instance retrieving controllers.\n *\n * @augments EventDispatcher\n * @hideconstructor\n */\nclass WebXRManager extends EventDispatcher {\n\n\t/**\n\t * Constructs a new WebGL renderer.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGL2RenderingContext} gl - The rendering context.\n\t */\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\t// Set default foveation to maximum.\n\t\tlet foveation = 1.0;\n\t\tlet customReferenceSpace = null;\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet xrFrame = null;\n\n\t\tconst supportsGlBinding = typeof XRWebGLBinding !== 'undefined';\n\n\t\tconst depthSensing = new WebXRDepthSensing();\n\t\tconst cameraAccessTextures = {};\n\t\tconst attributes = gl.getContextAttributes();\n\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst controllerInputSources = [];\n\n\t\tconst currentSize = new Vector2();\n\t\tlet currentPixelRatio = null;\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraXR = new ArrayCamera();\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\t/**\n\t\t * Whether the manager's XR camera should be automatically updated or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.cameraAutoUpdate = true;\n\n\t\t/**\n\t\t * This flag notifies the renderer to be ready for XR rendering. Set it to `true`\n\t\t * if you are going to use XR in your app.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.enabled = false;\n\n\t\t/**\n\t\t * Whether XR presentation is active or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPresenting = false;\n\n\t\t/**\n\t\t * Returns a group representing the `target ray` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `target ray` space.\n\t\t */\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns a group representing the `grip` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * Note: If you want to show something in the user's hand AND offer a\n\t\t * pointing ray at the same time, you'll want to attached the handheld object\n\t\t * to the group returned by `getControllerGrip()` and the ray to the\n\t\t * group returned by `getController()`. The idea is to have two\n\t\t * different groups in two different coordinate spaces for the same WebXR\n\t\t * controller.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `grip` space.\n\t\t */\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns a group representing the `hand` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `hand` space.\n\t\t */\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controllerIndex = controllerInputSources.indexOf( event.inputSource );\n\n\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\tif ( controller !== undefined ) {\n\n\t\t\t\tcontroller.update( event.inputSource, event.frame, customReferenceSpace || referenceSpace );\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tsession.removeEventListener( 'select', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeeze', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezestart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezeend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'end', onSessionEnd );\n\t\t\tsession.removeEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\n\t\t\t\tif ( inputSource === null ) continue;\n\n\t\t\t\tcontrollerInputSources[ i ] = null;\n\n\t\t\t\tcontrollers[ i ].disconnect( inputSource );\n\n\t\t\t}\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\tdepthSensing.reset();\n\t\t\tfor ( const key in cameraAccessTextures ) {\n\n\t\t\t\tdelete cameraAccessTextures[ key ];\n\n\t\t\t}\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\trenderer.setPixelRatio( currentPixelRatio );\n\t\t\trenderer.setSize( currentSize.width, currentSize.height, false );\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\t/**\n\t\t * Sets the framebuffer scale factor.\n\t\t *\n\t\t * This method can not be used during a XR session.\n\t\t *\n\t\t * @param {number} value - The framebuffer scale factor.\n\t\t */\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\twarn( 'WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the reference space type. Can be used to configure a spatial relationship with the user's physical\n\t\t * environment. Depending on how the user moves in 3D space, setting an appropriate reference space can\n\t\t * improve tracking. Default is `local-floor`. Valid values can be found here\n\t\t * https://developer.mozilla.org/en-US/docs/Web/API/XRReferenceSpace#reference_space_types.\n\t\t *\n\t\t * This method can not be used during a XR session.\n\t\t *\n\t\t * @param {string} value - The reference space type.\n\t\t */\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\twarn( 'WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the XR reference space.\n\t\t *\n\t\t * @return {XRReferenceSpace} The XR reference space.\n\t\t */\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn customReferenceSpace || referenceSpace;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom XR reference space.\n\t\t *\n\t\t * @param {XRReferenceSpace} space - The XR reference space.\n\t\t */\n\t\tthis.setReferenceSpace = function ( space ) {\n\n\t\t\tcustomReferenceSpace = space;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current base layer.\n\t\t *\n\t\t * This is an `XRProjectionLayer` when the targeted XR device supports the\n\t\t * WebXR Layers API, or an `XRWebGLLayer` otherwise.\n\t\t *\n\t\t * @return {?(XRWebGLLayer|XRProjectionLayer)} The XR base layer.\n\t\t */\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR binding.\n\t\t *\n\t\t * Creates a new binding if needed and the browser is\n\t\t * capable of doing so.\n\t\t *\n\t\t * @return {?XRWebGLBinding} The XR binding. Returns `null` if one cannot be created.\n\t\t */\n\t\tthis.getBinding = function () {\n\n\t\t\tif ( glBinding === null && supportsGlBinding ) {\n\n\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t}\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR frame.\n\t\t *\n\t\t * @return {?XRFrame} The XR frame. Returns `null` when used outside a XR session.\n\t\t */\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR session.\n\t\t *\n\t\t * @return {?XRSession} The XR session. Returns `null` when used outside a XR session.\n\t\t */\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\t/**\n\t\t * After a XR session has been requested usually with one of the `*Button` modules, it\n\t\t * is injected into the renderer with this method. This method triggers the start of\n\t\t * the actual XR rendering.\n\t\t *\n\t\t * @async\n\t\t * @param {XRSession} value - The XR session to set.\n\t\t * @return {Promise} A Promise that resolves when the session has been set.\n\t\t */\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tcurrentPixelRatio = renderer.getPixelRatio();\n\t\t\t\trenderer.getSize( currentSize );\n\n\n\t\t\t\t// Check that the browser implements the necessary APIs to use an\n\t\t\t\t// XRProjectionLayer rather than an XRWebGLLayer\n\t\t\t\tconst supportsLayers = supportsGlBinding && 'createProjectionLayer' in XRWebGLBinding.prototype;\n\n\t\t\t\tif ( ! supportsLayers ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: attributes.antialias,\n\t\t\t\t\t\talpha: true,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glBaseLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glBaseLayer.ignoreDepthValues === false )\n\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: gl.RGBA8,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = this.getBinding();\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glProjLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glProjLayer.ignoreDepthValues === false )\n\t\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\tthis.setFoveation( foveation );\n\n\t\t\t\tcustomReferenceSpace = null;\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the environment blend mode from the current XR session.\n\t\t *\n\t\t * @return {'opaque'|'additive'|'alpha-blend'|undefined} The environment blend mode. Returns `undefined` when used outside of a XR session.\n\t\t */\n\t\tthis.getEnvironmentBlendMode = function () {\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\treturn session.environmentBlendMode;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current depth texture computed via depth sensing.\n\t\t *\n\t\t * See {@link WebXRDepthSensing#getDepthTexture}.\n\t\t *\n\t\t * @return {?Texture} The depth texture.\n\t\t */\n\t\tthis.getDepthTexture = function () {\n\n\t\t\treturn depthSensing.getDepthTexture();\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst index = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( index >= 0 ) {\n\n\t\t\t\t\tcontrollerInputSources[ index ] = null;\n\t\t\t\t\tcontrollers[ index ].disconnect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\n\t\t\t\tlet controllerIndex = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\t\t// Assign input source a controller that currently has no input source\n\n\t\t\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\t\t\tif ( i >= controllerInputSources.length ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources.push( inputSource );\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t} else if ( controllerInputSources[ i ] === null ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources[ i ] = inputSource;\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// If all controllers do currently receive input we ignore new ones\n\n\t\t\t\t\tif ( controllerIndex === -1 ) break;\n\n\t\t\t\t}\n\n\t\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.connect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t *\n\t\t * @param {ArrayCamera} camera - The camera to update.\n\t\t * @param {PerspectiveCamera} cameraL - The left camera.\n\t\t * @param {PerspectiveCamera} cameraR - The right camera.\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Check if the projection uses an infinite far plane.\n\t\t\tif ( projL[ 10 ] === -1 ) {\n\n\t\t\t\t// Use the projection matrix from the left eye.\n\t\t\t\t// The camera offset is sufficient to include the view volumes\n\t\t\t\t// of both eyes (assuming symmetric projections).\n\t\t\t\tcamera.projectionMatrix.copy( cameraL.projectionMatrix );\n\t\t\t\tcamera.projectionMatrixInverse.copy( cameraL.projectionMatrixInverse );\n\n\t\t\t} else {\n\n\t\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t\t// although must now be relative to the new union camera.\n\t\t\t\tconst near2 = near + zOffset;\n\t\t\t\tconst far2 = far + zOffset;\n\t\t\t\tconst left2 = left - xOffset;\n\t\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\t/**\n\t\t * Updates the state of the XR camera. Use this method on app level if you\n\t\t * set `cameraAutoUpdate` to `false`. The method requires the non-XR\n\t\t * camera of the scene as a parameter. The passed in camera's transformation\n\t\t * is automatically adjusted to the position of the XR camera when calling\n\t\t * this method.\n\t\t *\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tlet depthNear = camera.near;\n\t\t\tlet depthFar = camera.far;\n\n\t\t\tif ( depthSensing.texture !== null ) {\n\n\t\t\t\tif ( depthSensing.depthNear > 0 ) depthNear = depthSensing.depthNear;\n\t\t\t\tif ( depthSensing.depthFar > 0 ) depthFar = depthSensing.depthFar;\n\n\t\t\t}\n\n\t\t\tcameraXR.near = cameraR.near = cameraL.near = depthNear;\n\t\t\tcameraXR.far = cameraR.far = cameraL.far = depthFar;\n\n\t\t\tif ( _currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraXR.near,\n\t\t\t\t\tdepthFar: cameraXR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraXR.near;\n\t\t\t\t_currentDepthFar = cameraXR.far;\n\n\t\t\t}\n\n\t\t\t// inherit camera layers and enable eye layers (1 = left, 2 = right)\n\t\t\tcameraXR.layers.mask = camera.layers.mask | 0b110;\n\t\t\tcameraL.layers.mask = cameraXR.layers.mask & 0b011;\n\t\t\tcameraR.layers.mask = cameraXR.layers.mask & 0b101;\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraXR.cameras;\n\n\t\t\tupdateCamera( cameraXR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraXR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraXR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t\t// update user camera and its children\n\n\t\t\tupdateUserCamera( camera, cameraXR, parent );\n\n\t\t};\n\n\t\tfunction updateUserCamera( camera, cameraXR, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrix.copy( cameraXR.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrix.copy( parent.matrixWorld );\n\t\t\t\tcamera.matrix.invert();\n\t\t\t\tcamera.matrix.multiply( cameraXR.matrixWorld );\n\n\t\t\t}\n\n\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.updateMatrixWorld( true );\n\n\t\t\tcamera.projectionMatrix.copy( cameraXR.projectionMatrix );\n\t\t\tcamera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse );\n\n\t\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t\tcamera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] );\n\t\t\t\tcamera.zoom = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Returns an instance of {@link ArrayCamera} which represents the XR camera\n\t\t * of the active XR session. For each view it holds a separate camera object.\n\t\t *\n\t\t * The camera's `fov` is currently not used and does not reflect the fov of\n\t\t * the XR camera. If you need the fov on app level, you have to compute in\n\t\t * manually from the XR camera's projection matrices.\n\t\t *\n\t\t * @return {ArrayCamera} The XR camera.\n\t\t */\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraXR;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the amount of foveation used by the XR compositor for the projection layer.\n\t\t *\n\t\t * @return {number|undefined} The amount of foveation.\n\t\t */\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer === null && glBaseLayer === null ) {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\treturn foveation;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the foveation value.\n\t\t *\n\t\t * @param {number} value - A number in the range `[0,1]` where `0` means no foveation (full resolution)\n\t\t * and `1` means maximum foveation (the edges render at lower resolution).\n\t\t */\n\t\tthis.setFoveation = function ( value ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tfoveation = value;\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns `true` if depth sensing is supported.\n\t\t *\n\t\t * @return {boolean} Whether depth sensing is supported or not.\n\t\t */\n\t\tthis.hasDepthSensing = function () {\n\n\t\t\treturn depthSensing.texture !== null;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the depth sensing mesh.\n\t\t *\n\t\t * See {@link WebXRDepthSensing#getMesh}.\n\t\t *\n\t\t * @return {Mesh} The depth sensing mesh.\n\t\t */\n\t\tthis.getDepthSensingMesh = function () {\n\n\t\t\treturn depthSensing.getMesh( cameraXR );\n\n\t\t};\n\n\t\t/**\n\t\t * Retrieves an opaque texture from the view-aligned {@link XRCamera}.\n\t\t * Only available during the current animation loop.\n\t\t *\n\t\t * @param {XRCamera} xrCamera - The camera to query.\n\t\t * @return {?Texture} An opaque texture representing the current raw camera frame.\n\t\t */\n\t\tthis.getCameraTexture = function ( xrCamera ) {\n\n\t\t\treturn cameraAccessTextures[ xrCamera ];\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( customReferenceSpace || referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraXRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraXR's camera list\n\n\t\t\t\tif ( views.length !== cameraXR.cameras.length ) {\n\n\t\t\t\t\tcameraXR.cameras.length = 0;\n\t\t\t\t\tcameraXRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet camera = cameras[ i ];\n\n\t\t\t\t\tif ( camera === undefined ) {\n\n\t\t\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\t\t\tcamera.layers.enable( i );\n\t\t\t\t\t\tcamera.viewport = new Vector4();\n\t\t\t\t\t\tcameras[ i ] = camera;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraXR.matrix.copy( camera.matrix );\n\t\t\t\t\t\tcameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraXRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraXR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tconst enabledFeatures = session.enabledFeatures;\n\t\t\t\tconst gpuDepthSensingEnabled = enabledFeatures &&\n\t\t\t\t\tenabledFeatures.includes( 'depth-sensing' ) &&\n\t\t\t\t\tsession.depthUsage == 'gpu-optimized';\n\n\t\t\t\tif ( gpuDepthSensingEnabled && supportsGlBinding ) {\n\n\t\t\t\t\tglBinding = scope.getBinding();\n\n\t\t\t\t\tconst depthData = glBinding.getDepthInformation( views[ 0 ] );\n\n\t\t\t\t\tif ( depthData && depthData.isValid && depthData.texture ) {\n\n\t\t\t\t\t\tdepthSensing.init( depthData, session.renderState );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst cameraAccessEnabled = enabledFeatures &&\n\t\t\t\t enabledFeatures.includes( 'camera-access' );\n\n\t\t\t\tif ( cameraAccessEnabled && supportsGlBinding ) {\n\n\t\t\t\t\trenderer.state.unbindTexture();\n\n\t\t\t\t\tglBinding = scope.getBinding();\n\n\t\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\t\tconst camera = views[ i ].camera;\n\n\t\t\t\t\t\tif ( camera ) {\n\n\t\t\t\t\t\t\tlet cameraTex = cameraAccessTextures[ camera ];\n\n\t\t\t\t\t\t\tif ( ! cameraTex ) {\n\n\t\t\t\t\t\t\t\tcameraTex = new ExternalTexture();\n\t\t\t\t\t\t\t\tcameraAccessTextures[ camera ] = cameraTex;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst glTexture = glBinding.getCameraImage( camera );\n\t\t\t\t\t\t\tcameraTex.sourceTexture = glTexture;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\t\t\t\tconst controller = controllers[ i ];\n\n\t\t\t\tif ( inputSource !== null && controller !== undefined ) {\n\n\t\t\t\t\tcontroller.update( inputSource, frame, customReferenceSpace || referenceSpace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\tif ( frame.detectedPlanes ) {\n\n\t\t\t\tscope.dispatchEvent( { type: 'planesdetected', data: frame } );\n\n\t\t\t}\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nconst _e1 = /*@__PURE__*/ new Euler();\nconst _m1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLMaterials( renderer, properties ) {\n\n\tfunction refreshTransformUniform( map, uniform ) {\n\n\t\tif ( map.matrixAutoUpdate === true ) {\n\n\t\t\tmap.updateMatrix();\n\n\t\t}\n\n\t\tuniform.value.copy( map.matrix );\n\n\t}\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tfog.color.getRGB( uniforms.fogColor.value, getUnlitUniformColorSpace( renderer ) );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\n\t\t\trefreshTransformUniform( material.bumpMap, uniforms.bumpMapTransform );\n\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.bumpScale.value *= -1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\n\t\t\trefreshTransformUniform( material.normalMap, uniforms.normalMapTransform );\n\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.normalScale.value.negate();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\n\t\t\trefreshTransformUniform( material.displacementMap, uniforms.displacementMapTransform );\n\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\trefreshTransformUniform( material.emissiveMap, uniforms.emissiveMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t\trefreshTransformUniform( material.specularMap, uniforms.specularMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst envMap = materialProperties.envMap;\n\t\tconst envMapRotation = materialProperties.envMapRotation;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\t_e1.copy( envMapRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1.x *= -1; _e1.y *= -1; _e1.z *= -1;\n\n\t\t\tif ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1.y *= -1;\n\t\t\t\t_e1.z *= -1;\n\n\t\t\t}\n\n\t\t\tuniforms.envMapRotation.value.setFromMatrix4( _m1.makeRotationFromEuler( _e1 ) );\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\trefreshTransformUniform( material.lightMap, uniforms.lightMapTransform );\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\trefreshTransformUniform( material.aoMap, uniforms.aoMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.uvTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\trefreshTransformUniform( material.metalnessMap, uniforms.metalnessMapTransform );\n\n\t\t}\n\n\t\tuniforms.roughness.value = material.roughness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\trefreshTransformUniform( material.roughnessMap, uniforms.roughnessMapTransform );\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenColorMap, uniforms.sheenColorMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatMap, uniforms.clearcoatMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform );\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.dispersion > 0 ) {\n\n\t\t\tuniforms.dispersion.value = material.dispersion;\n\n\t\t}\n\n\t\tif ( material.iridescence > 0 ) {\n\n\t\t\tuniforms.iridescence.value = material.iridescence;\n\t\t\tuniforms.iridescenceIOR.value = material.iridescenceIOR;\n\t\t\tuniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[ 0 ];\n\t\t\tuniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[ 1 ];\n\n\t\t\tif ( material.iridescenceMap ) {\n\n\t\t\t\tuniforms.iridescenceMap.value = material.iridescenceMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceMap, uniforms.iridescenceMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\t\tuniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t\trefreshTransformUniform( material.transmissionMap, uniforms.transmissionMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.thicknessMap, uniforms.thicknessMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tif ( material.anisotropy > 0 ) {\n\n\t\t\tuniforms.anisotropyVector.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) );\n\n\t\t\tif ( material.anisotropyMap ) {\n\n\t\t\t\tuniforms.anisotropyMap.value = material.anisotropyMap;\n\n\t\t\t\trefreshTransformUniform( material.anisotropyMap, uniforms.anisotropyMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t\trefreshTransformUniform( material.specularColorMap, uniforms.specularColorMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t\trefreshTransformUniform( material.specularIntensityMap, uniforms.specularIntensityMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tconst light = properties.get( material ).light;\n\n\t\tuniforms.referencePosition.value.setFromMatrixPosition( light.matrixWorld );\n\t\tuniforms.nearDistance.value = light.shadow.camera.near;\n\t\tuniforms.farDistance.value = light.shadow.camera.far;\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction WebGLUniformsGroups( gl, info, capabilities, state ) {\n\n\tlet buffers = {};\n\tlet updateList = {};\n\tlet allocatedBindingPoints = [];\n\n\tconst maxBindingPoints = gl.getParameter( gl.MAX_UNIFORM_BUFFER_BINDINGS ); // binding points are global whereas block indices are per shader program\n\n\tfunction bind( uniformsGroup, program ) {\n\n\t\tconst webglProgram = program.program;\n\t\tstate.uniformBlockBinding( uniformsGroup, webglProgram );\n\n\t}\n\n\tfunction update( uniformsGroup, program ) {\n\n\t\tlet buffer = buffers[ uniformsGroup.id ];\n\n\t\tif ( buffer === undefined ) {\n\n\t\t\tprepareUniformsGroup( uniformsGroup );\n\n\t\t\tbuffer = createBuffer( uniformsGroup );\n\t\t\tbuffers[ uniformsGroup.id ] = buffer;\n\n\t\t\tuniformsGroup.addEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\t}\n\n\t\t// ensure to update the binding points/block indices mapping for this program\n\n\t\tconst webglProgram = program.program;\n\t\tstate.updateUBOMapping( uniformsGroup, webglProgram );\n\n\t\t// update UBO once per frame\n\n\t\tconst frame = info.render.frame;\n\n\t\tif ( updateList[ uniformsGroup.id ] !== frame ) {\n\n\t\t\tupdateBufferData( uniformsGroup );\n\n\t\t\tupdateList[ uniformsGroup.id ] = frame;\n\n\t\t}\n\n\t}\n\n\tfunction createBuffer( uniformsGroup ) {\n\n\t\t// the setup of an UBO is independent of a particular shader program but global\n\n\t\tconst bindingPointIndex = allocateBindingPointIndex();\n\t\tuniformsGroup.__bindingPointIndex = bindingPointIndex;\n\n\t\tconst buffer = gl.createBuffer();\n\t\tconst size = uniformsGroup.__size;\n\t\tconst usage = uniformsGroup.usage;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\t\tgl.bufferData( gl.UNIFORM_BUFFER, size, usage );\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\t\tgl.bindBufferBase( gl.UNIFORM_BUFFER, bindingPointIndex, buffer );\n\n\t\treturn buffer;\n\n\t}\n\n\tfunction allocateBindingPointIndex() {\n\n\t\tfor ( let i = 0; i < maxBindingPoints; i ++ ) {\n\n\t\t\tif ( allocatedBindingPoints.indexOf( i ) === -1 ) {\n\n\t\t\t\tallocatedBindingPoints.push( i );\n\t\t\t\treturn i;\n\n\t\t\t}\n\n\t\t}\n\n\t\terror( 'WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.' );\n\n\t\treturn 0;\n\n\t}\n\n\tfunction updateBufferData( uniformsGroup ) {\n\n\t\tconst buffer = buffers[ uniformsGroup.id ];\n\t\tconst uniforms = uniformsGroup.uniforms;\n\t\tconst cache = uniformsGroup.__cache;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\n\t\tfor ( let i = 0, il = uniforms.length; i < il; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tif ( hasUniformChanged( uniform, i, j, cache ) === true ) {\n\n\t\t\t\t\tconst offset = uniform.__offset;\n\n\t\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\t\tlet arrayOffset = 0;\n\n\t\t\t\t\tfor ( let k = 0; k < values.length; k ++ ) {\n\n\t\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\t\t// TODO add integer and struct support\n\t\t\t\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value;\n\t\t\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data );\n\n\t\t\t\t\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t\t\t\t\t// manually converting 3x3 to 3x4\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value.elements[ 0 ];\n\t\t\t\t\t\t\tuniform.__data[ 1 ] = value.elements[ 1 ];\n\t\t\t\t\t\t\tuniform.__data[ 2 ] = value.elements[ 2 ];\n\t\t\t\t\t\t\tuniform.__data[ 3 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 4 ] = value.elements[ 3 ];\n\t\t\t\t\t\t\tuniform.__data[ 5 ] = value.elements[ 4 ];\n\t\t\t\t\t\t\tuniform.__data[ 6 ] = value.elements[ 5 ];\n\t\t\t\t\t\t\tuniform.__data[ 7 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 8 ] = value.elements[ 6 ];\n\t\t\t\t\t\t\tuniform.__data[ 9 ] = value.elements[ 7 ];\n\t\t\t\t\t\t\tuniform.__data[ 10 ] = value.elements[ 8 ];\n\t\t\t\t\t\t\tuniform.__data[ 11 ] = 0;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvalue.toArray( uniform.__data, arrayOffset );\n\n\t\t\t\t\t\t\tarrayOffset += info.storage / Float32Array.BYTES_PER_ELEMENT;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\n\t}\n\n\tfunction hasUniformChanged( uniform, index, indexArray, cache ) {\n\n\t\tconst value = uniform.value;\n\t\tconst indexString = index + '_' + indexArray;\n\n\t\tif ( cache[ indexString ] === undefined ) {\n\n\t\t\t// cache entry does not exist so far\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tcache[ indexString ] = value;\n\n\t\t\t} else {\n\n\t\t\t\tcache[ indexString ] = value.clone();\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\tconst cachedObject = cache[ indexString ];\n\n\t\t\t// compare current value with cached entry\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tif ( cachedObject !== value ) {\n\n\t\t\t\t\tcache[ indexString ] = value;\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( cachedObject.equals( value ) === false ) {\n\n\t\t\t\t\tcachedObject.copy( value );\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction prepareUniformsGroup( uniformsGroup ) {\n\n\t\t// determine total buffer size according to the STD140 layout\n\t\t// Hint: STD140 is the only supported layout in WebGL 2\n\n\t\tconst uniforms = uniformsGroup.uniforms;\n\n\t\tlet offset = 0; // global buffer offset in bytes\n\t\tconst chunkSize = 16; // size of a chunk in bytes\n\n\t\tfor ( let i = 0, l = uniforms.length; i < l; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\tfor ( let k = 0, kl = values.length; k < kl; k ++ ) {\n\n\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\tconst chunkOffset = offset % chunkSize; // offset in the current chunk\n\t\t\t\t\tconst chunkPadding = chunkOffset % info.boundary; // required padding to match boundary\n\t\t\t\t\tconst chunkStart = chunkOffset + chunkPadding; // the start position in the current chunk for the data\n\n\t\t\t\t\toffset += chunkPadding;\n\n\t\t\t\t\t// Check for chunk overflow\n\t\t\t\t\tif ( chunkStart !== 0 && ( chunkSize - chunkStart ) < info.storage ) {\n\n\t\t\t\t\t\t// Add padding and adjust offset\n\t\t\t\t\t\toffset += ( chunkSize - chunkStart );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following two properties will be used for partial buffer updates\n\t\t\t\t\tuniform.__data = new Float32Array( info.storage / Float32Array.BYTES_PER_ELEMENT );\n\t\t\t\t\tuniform.__offset = offset;\n\n\t\t\t\t\t// Update the global offset\n\t\t\t\t\toffset += info.storage;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ensure correct final padding\n\n\t\tconst chunkOffset = offset % chunkSize;\n\n\t\tif ( chunkOffset > 0 ) offset += ( chunkSize - chunkOffset );\n\n\t\t//\n\n\t\tuniformsGroup.__size = offset;\n\t\tuniformsGroup.__cache = {};\n\n\t\treturn this;\n\n\t}\n\n\tfunction getUniformSize( value ) {\n\n\t\tconst info = {\n\t\t\tboundary: 0, // bytes\n\t\t\tstorage: 0 // bytes\n\t\t};\n\n\t\t// determine sizes according to STD140\n\n\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t// float/int/bool\n\n\t\t\tinfo.boundary = 4;\n\t\t\tinfo.storage = 4;\n\n\t\t} else if ( value.isVector2 ) {\n\n\t\t\t// vec2\n\n\t\t\tinfo.boundary = 8;\n\t\t\tinfo.storage = 8;\n\n\t\t} else if ( value.isVector3 || value.isColor ) {\n\n\t\t\t// vec3\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 12; // evil: vec3 must start on a 16-byte boundary but it only consumes 12 bytes\n\n\t\t} else if ( value.isVector4 ) {\n\n\t\t\t// vec4\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 16;\n\n\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t// mat3 (in STD140 a 3x3 matrix is represented as 3x4)\n\n\t\t\tinfo.boundary = 48;\n\t\t\tinfo.storage = 48;\n\n\t\t} else if ( value.isMatrix4 ) {\n\n\t\t\t// mat4\n\n\t\t\tinfo.boundary = 64;\n\t\t\tinfo.storage = 64;\n\n\t\t} else if ( value.isTexture ) {\n\n\t\t\twarn( 'WebGLRenderer: Texture samplers can not be part of an uniforms group.' );\n\n\t\t} else {\n\n\t\t\twarn( 'WebGLRenderer: Unsupported uniform value type.', value );\n\n\t\t}\n\n\t\treturn info;\n\n\t}\n\n\tfunction onUniformsGroupsDispose( event ) {\n\n\t\tconst uniformsGroup = event.target;\n\n\t\tuniformsGroup.removeEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\tconst index = allocatedBindingPoints.indexOf( uniformsGroup.__bindingPointIndex );\n\t\tallocatedBindingPoints.splice( index, 1 );\n\n\t\tgl.deleteBuffer( buffers[ uniformsGroup.id ] );\n\n\t\tdelete buffers[ uniformsGroup.id ];\n\t\tdelete updateList[ uniformsGroup.id ];\n\n\t}\n\n\tfunction dispose() {\n\n\t\tfor ( const id in buffers ) {\n\n\t\t\tgl.deleteBuffer( buffers[ id ] );\n\n\t\t}\n\n\t\tallocatedBindingPoints = [];\n\t\tbuffers = {};\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tbind: bind,\n\t\tupdate: update,\n\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Precomputed DFG LUT for Image-Based Lighting\n * Resolution: 32x32\n * Samples: 4096 per texel\n * Format: RG16F (2 half floats per texel: scale, bias)\n */\n\n\nconst DATA = new Uint16Array( [\n\t0x2cd9, 0x3b64, 0x2d0e, 0x3b43, 0x2e20, 0x3aa7, 0x3061, 0x39fb, 0x325e, 0x397c, 0x3454, 0x3908, 0x357d, 0x3893, 0x3698, 0x381e, 0x379d, 0x375b, 0x3845, 0x3689, 0x38af, 0x35ca, 0x390d, 0x351e, 0x395f, 0x3484, 0x39a8, 0x33f9, 0x39e6, 0x330a, 0x3a1c, 0x3239, 0x3a4b, 0x3183, 0x3a73, 0x30e5, 0x3a95, 0x305b, 0x3ab1, 0x2fc6, 0x3ac9, 0x2ef7, 0x3ade, 0x2e43, 0x3aee, 0x2da7, 0x3afc, 0x2d1f, 0x3b07, 0x2ca9, 0x3b10, 0x2c42, 0x3b17, 0x2bd1, 0x3b1c, 0x2b34, 0x3b1f, 0x2aaa, 0x3b22, 0x2a31, 0x3b23, 0x29c7, 0x3b23, 0x2968,\n\t0x32d4, 0x3a4b, 0x32dc, 0x3a45, 0x3308, 0x3a26, 0x3378, 0x39d0, 0x3425, 0x394a, 0x34c9, 0x38be, 0x359c, 0x383e, 0x3688, 0x3796, 0x3778, 0x36c4, 0x382f, 0x3603, 0x3898, 0x3553, 0x38f7, 0x34b3, 0x394b, 0x3424, 0x3994, 0x334c, 0x39d3, 0x326c, 0x3a08, 0x31a9, 0x3a35, 0x30fe, 0x3a5a, 0x306a, 0x3a78, 0x2fd1, 0x3a90, 0x2ef1, 0x3aa2, 0x2e2e, 0x3ab0, 0x2d86, 0x3aba, 0x2cf3, 0x3ac1, 0x2c74, 0x3ac4, 0x2c05, 0x3ac4, 0x2b49, 0x3ac2, 0x2aa1, 0x3abd, 0x2a0c, 0x3ab7, 0x298b, 0x3aaf, 0x2918, 0x3aa6, 0x28b3, 0x3a9b, 0x285a,\n\t0x3559, 0x3954, 0x355a, 0x3951, 0x3566, 0x3944, 0x3582, 0x391e, 0x35b6, 0x38d3, 0x360a, 0x386a, 0x3684, 0x37ed, 0x3720, 0x370d, 0x37d3, 0x3641, 0x3847, 0x3588, 0x38a3, 0x34e2, 0x38fa, 0x344d, 0x3948, 0x3391, 0x398d, 0x32a6, 0x39c8, 0x31d6, 0x39fa, 0x3121, 0x3a22, 0x3082, 0x3a43, 0x2ff0, 0x3a5c, 0x2f01, 0x3a6f, 0x2e32, 0x3a7c, 0x2d7e, 0x3a84, 0x2ce2, 0x3a87, 0x2c5b, 0x3a87, 0x2bcc, 0x3a83, 0x2b00, 0x3a7b, 0x2a4e, 0x3a71, 0x29b3, 0x3a66, 0x292c, 0x3a58, 0x28b4, 0x3a4b, 0x284b, 0x3a3d, 0x27dc, 0x3a2e, 0x2739,\n\t0x3709, 0x387c, 0x370a, 0x387b, 0x3710, 0x3874, 0x3720, 0x385f, 0x373d, 0x3834, 0x376a, 0x37e1, 0x37ac, 0x3732, 0x3805, 0x3675, 0x383f, 0x35bc, 0x3883, 0x3511, 0x38cb, 0x3476, 0x3912, 0x33d8, 0x3955, 0x32e2, 0x3991, 0x3208, 0x39c6, 0x3149, 0x39f1, 0x30a1, 0x3a15, 0x300f, 0x3a30, 0x2f21, 0x3a44, 0x2e45, 0x3a51, 0x2d87, 0x3a59, 0x2ce2, 0x3a5b, 0x2c53, 0x3a58, 0x2bb0, 0x3a52, 0x2ada, 0x3a49, 0x2a1f, 0x3a40, 0x297d, 0x3a34, 0x28f0, 0x3a25, 0x2874, 0x3a13, 0x2807, 0x3a00, 0x274e, 0x39eb, 0x26a6, 0x39d5, 0x2611,\n\t0x3840, 0x3780, 0x3840, 0x377e, 0x3842, 0x3776, 0x3846, 0x375e, 0x384f, 0x372a, 0x385b, 0x36d3, 0x386c, 0x3659, 0x3885, 0x35c7, 0x38a8, 0x352d, 0x38d4, 0x3497, 0x3906, 0x340c, 0x393b, 0x331a, 0x3970, 0x323a, 0x39a0, 0x3172, 0x39cb, 0x30c3, 0x39ef, 0x302a, 0x3a0c, 0x2f4a, 0x3a21, 0x2e63, 0x3a2f, 0x2d9b, 0x3a37, 0x2ced, 0x3a39, 0x2c57, 0x3a37, 0x2baa, 0x3a34, 0x2ac9, 0x3a2c, 0x2a05, 0x3a20, 0x295d, 0x3a11, 0x28ca, 0x39ff, 0x2849, 0x39eb, 0x27b2, 0x39d5, 0x26ed, 0x39be, 0x2640, 0x39a5, 0x25aa, 0x398b, 0x2523,\n\t0x38e2, 0x363b, 0x38e2, 0x363b, 0x38e3, 0x3635, 0x38e6, 0x3626, 0x38ea, 0x3606, 0x38f0, 0x35cd, 0x38f8, 0x3579, 0x3903, 0x350e, 0x3915, 0x3495, 0x392d, 0x3418, 0x394c, 0x3340, 0x3970, 0x3261, 0x3995, 0x3197, 0x39b8, 0x30e4, 0x39d8, 0x3046, 0x39f3, 0x2f76, 0x3a08, 0x2e86, 0x3a16, 0x2db5, 0x3a1e, 0x2cff, 0x3a22, 0x2c61, 0x3a24, 0x2bb3, 0x3a20, 0x2ac7, 0x3a17, 0x29fc, 0x3a0a, 0x294c, 0x39fa, 0x28b2, 0x39e7, 0x282e, 0x39d1, 0x2773, 0x39b9, 0x26a9, 0x399f, 0x25fa, 0x3985, 0x255f, 0x3968, 0x24d6, 0x394a, 0x245d,\n\t0x396e, 0x3524, 0x396e, 0x3524, 0x396e, 0x3520, 0x396f, 0x3517, 0x3971, 0x3502, 0x3973, 0x34dd, 0x3975, 0x34a5, 0x3978, 0x3458, 0x397e, 0x33f9, 0x3987, 0x3332, 0x3997, 0x326b, 0x39aa, 0x31ac, 0x39c0, 0x30fb, 0x39d7, 0x305c, 0x39eb, 0x2f9e, 0x39fc, 0x2ea7, 0x3a07, 0x2dcf, 0x3a0f, 0x2d13, 0x3a16, 0x2c70, 0x3a17, 0x2bc4, 0x3a14, 0x2ad0, 0x3a0a, 0x29fc, 0x39fd, 0x2945, 0x39ed, 0x28a6, 0x39d9, 0x281d, 0x39c2, 0x274a, 0x39a9, 0x267c, 0x398e, 0x25c7, 0x3971, 0x2528, 0x3952, 0x249e, 0x3931, 0x2425, 0x3910, 0x2374,\n\t0x39e5, 0x3436, 0x39e5, 0x3435, 0x39e5, 0x3434, 0x39e5, 0x342e, 0x39e5, 0x3420, 0x39e5, 0x3408, 0x39e3, 0x33c4, 0x39e1, 0x3359, 0x39df, 0x32d3, 0x39de, 0x323a, 0x39e1, 0x319a, 0x39e7, 0x30fb, 0x39f0, 0x3065, 0x39f9, 0x2fb6, 0x3a02, 0x2ec0, 0x3a08, 0x2de6, 0x3a0d, 0x2d26, 0x3a12, 0x2c7e, 0x3a13, 0x2bda, 0x3a0e, 0x2adc, 0x3a05, 0x2a02, 0x39f8, 0x2945, 0x39e7, 0x28a1, 0x39d3, 0x2813, 0x39bc, 0x2730, 0x39a2, 0x265c, 0x3985, 0x25a3, 0x3966, 0x2501, 0x3945, 0x2475, 0x3923, 0x23f3, 0x3901, 0x231c, 0x38dd, 0x225e,\n\t0x3a4b, 0x32d6, 0x3a4a, 0x32d6, 0x3a4a, 0x32d4, 0x3a4a, 0x32cc, 0x3a48, 0x32bb, 0x3a47, 0x329d, 0x3a43, 0x326b, 0x3a3d, 0x3222, 0x3a36, 0x31c2, 0x3a2e, 0x314f, 0x3a28, 0x30d2, 0x3a23, 0x3052, 0x3a20, 0x2fab, 0x3a1e, 0x2ec2, 0x3a1b, 0x2def, 0x3a19, 0x2d31, 0x3a1a, 0x2c89, 0x3a18, 0x2beb, 0x3a11, 0x2aea, 0x3a07, 0x2a0a, 0x39fa, 0x2948, 0x39e9, 0x28a1, 0x39d4, 0x280f, 0x39bd, 0x2721, 0x39a2, 0x2647, 0x3985, 0x258b, 0x3964, 0x24e5, 0x3942, 0x2455, 0x391f, 0x23b3, 0x38fb, 0x22d8, 0x38d4, 0x2219, 0x38ad, 0x2172,\n\t0x3aa0, 0x3180, 0x3aa0, 0x3180, 0x3aa0, 0x317f, 0x3a9f, 0x317b, 0x3a9d, 0x3170, 0x3a99, 0x315d, 0x3a95, 0x313d, 0x3a8d, 0x310c, 0x3a82, 0x30ca, 0x3a76, 0x3077, 0x3a69, 0x3019, 0x3a5c, 0x2f68, 0x3a4f, 0x2e9e, 0x3a42, 0x2dde, 0x3a37, 0x2d2b, 0x3a30, 0x2c89, 0x3a29, 0x2bef, 0x3a1f, 0x2af0, 0x3a12, 0x2a0f, 0x3a03, 0x294a, 0x39f1, 0x28a0, 0x39dc, 0x280c, 0x39c5, 0x2717, 0x39a9, 0x2638, 0x398b, 0x2578, 0x396a, 0x24d0, 0x3947, 0x243f, 0x3923, 0x2380, 0x38fc, 0x22a4, 0x38d4, 0x21e4, 0x38ac, 0x213c, 0x3883, 0x20a8,\n\t0x3ae8, 0x3062, 0x3ae8, 0x3062, 0x3ae7, 0x3061, 0x3ae6, 0x305f, 0x3ae4, 0x305a, 0x3ae0, 0x304f, 0x3ada, 0x303b, 0x3ad1, 0x301b, 0x3ac5, 0x2fdd, 0x3ab6, 0x2f6a, 0x3aa4, 0x2ede, 0x3a91, 0x2e45, 0x3a7c, 0x2da5, 0x3a67, 0x2d0a, 0x3a57, 0x2c77, 0x3a48, 0x2bdc, 0x3a38, 0x2ae5, 0x3a27, 0x2a0a, 0x3a16, 0x2947, 0x3a02, 0x289d, 0x39eb, 0x2808, 0x39d3, 0x270d, 0x39b6, 0x262b, 0x3997, 0x256a, 0x3976, 0x24bf, 0x3952, 0x242b, 0x392d, 0x2358, 0x3904, 0x227a, 0x38db, 0x21b8, 0x38b2, 0x2110, 0x3887, 0x207d, 0x385b, 0x1ff6,\n\t0x3b23, 0x2ee8, 0x3b23, 0x2ee8, 0x3b22, 0x2ee8, 0x3b21, 0x2ee7, 0x3b1f, 0x2ee3, 0x3b1a, 0x2ed6, 0x3b14, 0x2ec1, 0x3b0b, 0x2e99, 0x3afe, 0x2e60, 0x3aee, 0x2e12, 0x3ad8, 0x2dad, 0x3ac1, 0x2d3d, 0x3aa5, 0x2cc3, 0x3a8b, 0x2c48, 0x3a76, 0x2ba2, 0x3a60, 0x2ac0, 0x3a49, 0x29f2, 0x3a32, 0x2938, 0x3a1b, 0x2893, 0x3a02, 0x27ff, 0x39e8, 0x26ff, 0x39ca, 0x261e, 0x39aa, 0x255b, 0x3988, 0x24b0, 0x3964, 0x241c, 0x393d, 0x2336, 0x3913, 0x2257, 0x38e9, 0x2195, 0x38be, 0x20eb, 0x3891, 0x2059, 0x3864, 0x1fae, 0x3837, 0x1ecd,\n\t0x3b54, 0x2d61, 0x3b54, 0x2d61, 0x3b53, 0x2d61, 0x3b52, 0x2d62, 0x3b4f, 0x2d61, 0x3b4b, 0x2d5c, 0x3b45, 0x2d51, 0x3b3b, 0x2d3d, 0x3b2e, 0x2d1a, 0x3b1d, 0x2ce7, 0x3b06, 0x2ca3, 0x3aeb, 0x2c52, 0x3acb, 0x2bee, 0x3ab0, 0x2b31, 0x3a94, 0x2a74, 0x3a77, 0x29bf, 0x3a5a, 0x2915, 0x3a3f, 0x287a, 0x3a22, 0x27de, 0x3a05, 0x26e4, 0x39e5, 0x2609, 0x39c3, 0x2547, 0x39a0, 0x249f, 0x397b, 0x240c, 0x3953, 0x2314, 0x3928, 0x2238, 0x38fd, 0x2175, 0x38d0, 0x20cb, 0x38a2, 0x2038, 0x3873, 0x1f71, 0x3844, 0x1e90, 0x3815, 0x1dce,\n\t0x3b7c, 0x2c22, 0x3b7c, 0x2c22, 0x3b7b, 0x2c23, 0x3b7a, 0x2c25, 0x3b77, 0x2c27, 0x3b73, 0x2c26, 0x3b6d, 0x2c23, 0x3b64, 0x2c1a, 0x3b57, 0x2c07, 0x3b46, 0x2bd1, 0x3b2e, 0x2b79, 0x3b0f, 0x2b07, 0x3aef, 0x2a86, 0x3ad1, 0x29f8, 0x3ab0, 0x2967, 0x3a8e, 0x28d7, 0x3a6d, 0x284e, 0x3a4c, 0x279f, 0x3a2b, 0x26b7, 0x3a08, 0x25e5, 0x39e4, 0x252c, 0x39be, 0x2488, 0x3998, 0x23f0, 0x396f, 0x22f2, 0x3943, 0x2215, 0x3917, 0x2155, 0x38e8, 0x20ae, 0x38b9, 0x201c, 0x3888, 0x1f38, 0x3857, 0x1e5a, 0x3826, 0x1d9a, 0x37eb, 0x1cf0,\n\t0x3b9c, 0x2a43, 0x3b9c, 0x2a43, 0x3b9b, 0x2a46, 0x3b9a, 0x2a4a, 0x3b98, 0x2a50, 0x3b93, 0x2a54, 0x3b8e, 0x2a59, 0x3b85, 0x2a56, 0x3b79, 0x2a45, 0x3b67, 0x2a24, 0x3b4f, 0x29ee, 0x3b2f, 0x29a4, 0x3b10, 0x294b, 0x3aef, 0x28e5, 0x3ac9, 0x2877, 0x3aa4, 0x2809, 0x3a7e, 0x2739, 0x3a59, 0x266d, 0x3a34, 0x25af, 0x3a0c, 0x2503, 0x39e4, 0x2468, 0x39bb, 0x23bb, 0x3990, 0x22c6, 0x3963, 0x21f0, 0x3936, 0x2133, 0x3906, 0x208f, 0x38d5, 0x1ffd, 0x38a3, 0x1f04, 0x3870, 0x1e28, 0x383d, 0x1d69, 0x380b, 0x1cc3, 0x37b0, 0x1c32,\n\t0x3bb5, 0x28aa, 0x3bb5, 0x28ab, 0x3bb5, 0x28ad, 0x3bb4, 0x28b2, 0x3bb2, 0x28b9, 0x3bae, 0x28c2, 0x3ba8, 0x28ca, 0x3ba0, 0x28d1, 0x3b94, 0x28cd, 0x3b83, 0x28c1, 0x3b6a, 0x28a3, 0x3b4b, 0x2876, 0x3b2d, 0x283d, 0x3b09, 0x27ea, 0x3ae1, 0x274b, 0x3ab9, 0x26a6, 0x3a8f, 0x25fe, 0x3a67, 0x255d, 0x3a3d, 0x24c5, 0x3a11, 0x2439, 0x39e6, 0x2371, 0x39b9, 0x228d, 0x398a, 0x21c1, 0x395a, 0x210b, 0x3929, 0x206c, 0x38f7, 0x1fc1, 0x38c3, 0x1ecb, 0x388f, 0x1df6, 0x385a, 0x1d3a, 0x3825, 0x1c99, 0x37e1, 0x1c08, 0x3779, 0x1b1b,\n\t0x3bc9, 0x26d3, 0x3bc9, 0x26d4, 0x3bc9, 0x26d9, 0x3bc8, 0x26e3, 0x3bc6, 0x26ef, 0x3bc2, 0x2705, 0x3bbd, 0x271a, 0x3bb6, 0x2731, 0x3baa, 0x273c, 0x3b9a, 0x273d, 0x3b81, 0x2726, 0x3b65, 0x26f7, 0x3b46, 0x26af, 0x3b20, 0x2650, 0x3af7, 0x25e1, 0x3acd, 0x256a, 0x3aa1, 0x24eb, 0x3a75, 0x246f, 0x3a46, 0x23ee, 0x3a17, 0x230d, 0x39e9, 0x223e, 0x39b7, 0x2183, 0x3985, 0x20d8, 0x3953, 0x2043, 0x391e, 0x1f7a, 0x38e9, 0x1e8d, 0x38b3, 0x1dbf, 0x387c, 0x1d0b, 0x3845, 0x1c6c, 0x380e, 0x1bc4, 0x37b0, 0x1ad2, 0x3745, 0x19fd,\n\t0x3bd9, 0x24e4, 0x3bd9, 0x24e5, 0x3bd9, 0x24e8, 0x3bd8, 0x24f2, 0x3bd5, 0x24fe, 0x3bd2, 0x2512, 0x3bce, 0x252b, 0x3bc6, 0x2544, 0x3bbc, 0x255a, 0x3bac, 0x256b, 0x3b93, 0x2569, 0x3b7a, 0x2557, 0x3b5b, 0x252f, 0x3b34, 0x24f7, 0x3b0c, 0x24ad, 0x3adf, 0x2458, 0x3ab1, 0x23f8, 0x3a82, 0x233f, 0x3a4f, 0x2286, 0x3a1e, 0x21d5, 0x39eb, 0x2130, 0x39b6, 0x2098, 0x3982, 0x200e, 0x394b, 0x1f25, 0x3914, 0x1e45, 0x38dc, 0x1d83, 0x38a3, 0x1cd6, 0x386b, 0x1c3d, 0x3831, 0x1b71, 0x37f2, 0x1a87, 0x3782, 0x19bc, 0x3714, 0x1909,\n\t0x3be5, 0x22d8, 0x3be5, 0x22d9, 0x3be4, 0x22df, 0x3be4, 0x22ef, 0x3be1, 0x2305, 0x3bde, 0x232a, 0x3bda, 0x2358, 0x3bd4, 0x2392, 0x3bcb, 0x23ca, 0x3bbb, 0x23f4, 0x3ba3, 0x2405, 0x3b8c, 0x2405, 0x3b6c, 0x23ec, 0x3b47, 0x23ae, 0x3b1d, 0x2353, 0x3af0, 0x22e2, 0x3ac0, 0x2261, 0x3a8e, 0x21d9, 0x3a5a, 0x214e, 0x3a26, 0x20c7, 0x39ee, 0x2045, 0x39b7, 0x1f97, 0x397f, 0x1eba, 0x3945, 0x1df0, 0x390b, 0x1d3a, 0x38d0, 0x1c9a, 0x3895, 0x1c0a, 0x385a, 0x1b18, 0x381f, 0x1a39, 0x37c9, 0x1975, 0x3756, 0x18cc, 0x36e6, 0x1836,\n\t0x3bed, 0x20a8, 0x3bed, 0x20a9, 0x3bed, 0x20ae, 0x3bed, 0x20bb, 0x3beb, 0x20cf, 0x3be8, 0x20ef, 0x3be4, 0x2119, 0x3bde, 0x214f, 0x3bd6, 0x2189, 0x3bc6, 0x21b8, 0x3bb1, 0x21de, 0x3b9a, 0x21f2, 0x3b7b, 0x21f2, 0x3b57, 0x21d8, 0x3b2d, 0x21a4, 0x3b00, 0x215f, 0x3acf, 0x2108, 0x3a99, 0x20a8, 0x3a64, 0x2043, 0x3a2c, 0x1fba, 0x39f2, 0x1ef3, 0x39b8, 0x1e36, 0x397c, 0x1d86, 0x3940, 0x1ce5, 0x3903, 0x1c52, 0x38c6, 0x1b9e, 0x3888, 0x1ab3, 0x384a, 0x19e4, 0x380e, 0x192b, 0x37a3, 0x188b, 0x372d, 0x17f7, 0x36ba, 0x1701,\n\t0x3bf4, 0x1e23, 0x3bf4, 0x1e25, 0x3bf4, 0x1e2d, 0x3bf3, 0x1e41, 0x3bf1, 0x1e64, 0x3bef, 0x1e9c, 0x3beb, 0x1ee1, 0x3be6, 0x1f40, 0x3bde, 0x1fa7, 0x3bce, 0x2001, 0x3bbd, 0x202f, 0x3ba6, 0x204e, 0x3b88, 0x205f, 0x3b64, 0x205b, 0x3b3b, 0x2044, 0x3b0e, 0x201f, 0x3adb, 0x1fcf, 0x3aa6, 0x1f4e, 0x3a6e, 0x1ec1, 0x3a33, 0x1e2b, 0x39f7, 0x1d95, 0x39ba, 0x1d06, 0x397b, 0x1c7d, 0x393c, 0x1bfc, 0x38fc, 0x1b13, 0x38bc, 0x1a40, 0x387c, 0x1983, 0x383c, 0x18da, 0x37fa, 0x1842, 0x377f, 0x177f, 0x3706, 0x1695, 0x3691, 0x15c8,\n\t0x3bf8, 0x1bca, 0x3bf8, 0x1bcc, 0x3bf8, 0x1bd8, 0x3bf8, 0x1bf7, 0x3bf6, 0x1c1b, 0x3bf4, 0x1c45, 0x3bf1, 0x1c83, 0x3bec, 0x1cce, 0x3be4, 0x1d21, 0x3bd5, 0x1d78, 0x3bc5, 0x1dd1, 0x3bb0, 0x1e17, 0x3b93, 0x1e4a, 0x3b70, 0x1e5f, 0x3b48, 0x1e57, 0x3b1b, 0x1e35, 0x3ae7, 0x1df6, 0x3ab2, 0x1da4, 0x3a77, 0x1d44, 0x3a3a, 0x1cdb, 0x39fc, 0x1c6e, 0x39bb, 0x1c03, 0x397a, 0x1b35, 0x3938, 0x1a72, 0x38f5, 0x19bb, 0x38b3, 0x1914, 0x3870, 0x187d, 0x382e, 0x17eb, 0x37db, 0x16f9, 0x375c, 0x1621, 0x36e1, 0x1565, 0x3669, 0x14be,\n\t0x3bfb, 0x18b9, 0x3bfb, 0x18ba, 0x3bfb, 0x18c3, 0x3bfb, 0x18da, 0x3bf9, 0x190a, 0x3bf7, 0x1948, 0x3bf5, 0x19ac, 0x3bf0, 0x1a20, 0x3be9, 0x1ab3, 0x3bdb, 0x1b49, 0x3bcd, 0x1be6, 0x3bb7, 0x1c34, 0x3b9c, 0x1c6d, 0x3b7a, 0x1c8e, 0x3b54, 0x1c9e, 0x3b26, 0x1c96, 0x3af2, 0x1c75, 0x3abc, 0x1c47, 0x3a80, 0x1c09, 0x3a42, 0x1b85, 0x3a01, 0x1aec, 0x39be, 0x1a50, 0x397a, 0x19b5, 0x3935, 0x1921, 0x38f0, 0x1895, 0x38aa, 0x1814, 0x3866, 0x173a, 0x3821, 0x1665, 0x37be, 0x15a4, 0x373c, 0x14f9, 0x36be, 0x1460, 0x3644, 0x13b3,\n\t0x3bfd, 0x156b, 0x3bfd, 0x156c, 0x3bfd, 0x1578, 0x3bfd, 0x1598, 0x3bfc, 0x15dd, 0x3bfa, 0x163c, 0x3bf7, 0x16cb, 0x3bf3, 0x177b, 0x3beb, 0x1833, 0x3be0, 0x18ad, 0x3bd2, 0x192e, 0x3bbd, 0x19a6, 0x3ba4, 0x1a0c, 0x3b83, 0x1a5a, 0x3b5d, 0x1a8c, 0x3b30, 0x1a9b, 0x3afd, 0x1a86, 0x3ac6, 0x1a5c, 0x3a89, 0x1a11, 0x3a49, 0x19b7, 0x3a06, 0x194f, 0x39c1, 0x18e3, 0x397a, 0x1873, 0x3933, 0x1805, 0x38eb, 0x173a, 0x38a3, 0x1676, 0x385c, 0x15bf, 0x3816, 0x1519, 0x37a2, 0x1482, 0x371d, 0x13f7, 0x369c, 0x1306, 0x3620, 0x1231,\n\t0x3bff, 0x11cb, 0x3bff, 0x11cd, 0x3bfe, 0x11dd, 0x3bfe, 0x1219, 0x3bfd, 0x126b, 0x3bfb, 0x12e9, 0x3bf9, 0x13c5, 0x3bf5, 0x1460, 0x3bee, 0x150f, 0x3be3, 0x15c9, 0x3bd6, 0x168a, 0x3bc3, 0x174f, 0x3baa, 0x1806, 0x3b8b, 0x184f, 0x3b66, 0x1888, 0x3b39, 0x18a6, 0x3b07, 0x18ad, 0x3acf, 0x189c, 0x3a92, 0x1876, 0x3a50, 0x1840, 0x3a0c, 0x17fd, 0x39c4, 0x176a, 0x397b, 0x16ce, 0x3931, 0x1634, 0x38e6, 0x1599, 0x389c, 0x1508, 0x3852, 0x147f, 0x380a, 0x1401, 0x3788, 0x131c, 0x36ff, 0x124a, 0x367c, 0x1190, 0x35fe, 0x10ea,\n\t0x3bff, 0x0daa, 0x3bff, 0x0dad, 0x3bff, 0x0dc0, 0x3bff, 0x0e0e, 0x3bfe, 0x0e87, 0x3bfc, 0x0f14, 0x3bfb, 0x1029, 0x3bf7, 0x10d1, 0x3bf0, 0x11d3, 0x3be6, 0x12c9, 0x3bd9, 0x13fc, 0x3bc7, 0x1499, 0x3bb0, 0x152a, 0x3b92, 0x15ab, 0x3b6e, 0x1615, 0x3b42, 0x165a, 0x3b10, 0x1681, 0x3ad8, 0x1683, 0x3a9a, 0x1665, 0x3a57, 0x1629, 0x3a11, 0x15dd, 0x39c8, 0x1580, 0x397c, 0x1518, 0x3930, 0x14ae, 0x38e3, 0x1441, 0x3896, 0x13b1, 0x384a, 0x12e9, 0x37ff, 0x122f, 0x376f, 0x1182, 0x36e3, 0x10e5, 0x365e, 0x1057, 0x35de, 0x0fac,\n\t0x3c00, 0x08ea, 0x3c00, 0x08ed, 0x3c00, 0x0902, 0x3c00, 0x0961, 0x3bff, 0x09f3, 0x3bfd, 0x0abc, 0x3bfb, 0x0c1f, 0x3bf8, 0x0d15, 0x3bf1, 0x0e5b, 0x3be8, 0x0fb4, 0x3bdc, 0x10b0, 0x3bcb, 0x1190, 0x3bb5, 0x126c, 0x3b97, 0x132c, 0x3b74, 0x13de, 0x3b4a, 0x1432, 0x3b18, 0x145e, 0x3ae0, 0x1472, 0x3aa2, 0x146f, 0x3a5f, 0x1456, 0x3a17, 0x142e, 0x39cc, 0x13ee, 0x397e, 0x136b, 0x392f, 0x12e1, 0x38df, 0x124f, 0x3890, 0x11bd, 0x3842, 0x1131, 0x37eb, 0x10ac, 0x3757, 0x102e, 0x36c9, 0x0f76, 0x3640, 0x0ea3, 0x35bf, 0x0de4,\n\t0x3c00, 0x039b, 0x3c00, 0x039d, 0x3c00, 0x03b2, 0x3c00, 0x041c, 0x3bff, 0x04be, 0x3bfd, 0x05d6, 0x3bfc, 0x0764, 0x3bf8, 0x08e2, 0x3bf2, 0x0a67, 0x3bea, 0x0c1b, 0x3bde, 0x0d41, 0x3bcd, 0x0e5f, 0x3bb8, 0x0f8c, 0x3b9c, 0x1057, 0x3b7a, 0x10e5, 0x3b51, 0x1155, 0x3b20, 0x11a5, 0x3ae8, 0x11da, 0x3aaa, 0x11ef, 0x3a66, 0x11e5, 0x3a1d, 0x11c1, 0x39d0, 0x1185, 0x3980, 0x113b, 0x392e, 0x10e5, 0x38dc, 0x1087, 0x388b, 0x1028, 0x383b, 0x0f94, 0x37d9, 0x0edb, 0x3741, 0x0e2c, 0x36af, 0x0d89, 0x3625, 0x0cf2, 0x35a1, 0x0c69,\n\t0x3c00, 0x0107, 0x3c00, 0x0108, 0x3c00, 0x0110, 0x3c00, 0x0145, 0x3bff, 0x0197, 0x3bfe, 0x0224, 0x3bfc, 0x030c, 0x3bf8, 0x0478, 0x3bf3, 0x062c, 0x3beb, 0x0833, 0x3be0, 0x0979, 0x3bd0, 0x0aeb, 0x3bbc, 0x0c3d, 0x3ba0, 0x0d01, 0x3b80, 0x0dbd, 0x3b57, 0x0e69, 0x3b27, 0x0eeb, 0x3af0, 0x0f53, 0x3ab1, 0x0f8a, 0x3a6c, 0x0f9f, 0x3a22, 0x0f8b, 0x39d4, 0x0f5b, 0x3982, 0x0f0f, 0x392f, 0x0eac, 0x38da, 0x0e3d, 0x3886, 0x0dc9, 0x3834, 0x0d51, 0x37c7, 0x0cd9, 0x372c, 0x0c65, 0x3697, 0x0bef, 0x360a, 0x0b20, 0x3585, 0x0a62,\n\t0x3c00, 0x0031, 0x3c00, 0x0031, 0x3c00, 0x0034, 0x3c00, 0x004b, 0x3bff, 0x006f, 0x3bfe, 0x00c9, 0x3bfc, 0x011b, 0x3bf9, 0x0207, 0x3bf4, 0x02d6, 0x3bec, 0x0415, 0x3be1, 0x0587, 0x3bd2, 0x0703, 0x3bbf, 0x087d, 0x3ba5, 0x096a, 0x3b85, 0x0a59, 0x3b5d, 0x0b32, 0x3b2e, 0x0bee, 0x3af7, 0x0c44, 0x3ab8, 0x0c7c, 0x3a73, 0x0c9c, 0x3a28, 0x0ca4, 0x39d8, 0x0c98, 0x3985, 0x0c77, 0x392f, 0x0c4a, 0x38d9, 0x0c10, 0x3882, 0x0ba0, 0x382e, 0x0b14, 0x37b6, 0x0a84, 0x3717, 0x09f5, 0x3680, 0x0969, 0x35f0, 0x08e6, 0x356a, 0x086a,\n\t0x3c00, 0x0004, 0x3c00, 0x0004, 0x3c00, 0x0004, 0x3c00, 0x000d, 0x3bff, 0x0021, 0x3bfe, 0x003b, 0x3bfd, 0x0070, 0x3bf9, 0x00c7, 0x3bf4, 0x012e, 0x3bed, 0x01c8, 0x3be3, 0x0274, 0x3bd4, 0x033b, 0x3bc1, 0x043a, 0x3ba8, 0x0534, 0x3b89, 0x0641, 0x3b62, 0x073b, 0x3b34, 0x0815, 0x3afd, 0x087c, 0x3abf, 0x08d0, 0x3a7a, 0x090a, 0x3a2e, 0x092c, 0x39dd, 0x0936, 0x3988, 0x0928, 0x3930, 0x0907, 0x38d7, 0x08d7, 0x387f, 0x089b, 0x3828, 0x0855, 0x37a7, 0x080b, 0x3704, 0x077b, 0x366a, 0x06e1, 0x35d8, 0x0649, 0x3550, 0x05b8,\n\t0x3c00, 0x0000, 0x3c00, 0x0000, 0x3c00, 0x0000, 0x3c00, 0x0003, 0x3bff, 0x0012, 0x3bfe, 0x001a, 0x3bfd, 0x0035, 0x3bfa, 0x0050, 0x3bf4, 0x0061, 0x3bed, 0x00a5, 0x3be4, 0x00ee, 0x3bd6, 0x0146, 0x3bc3, 0x01ab, 0x3bab, 0x0211, 0x3b8d, 0x028e, 0x3b67, 0x0303, 0x3b39, 0x0375, 0x3b04, 0x03e2, 0x3ac6, 0x0441, 0x3a80, 0x0492, 0x3a34, 0x04cd, 0x39e1, 0x04f2, 0x398b, 0x0504, 0x3931, 0x0502, 0x38d6, 0x04ec, 0x387c, 0x04c7, 0x3822, 0x0496, 0x3798, 0x045c, 0x36f2, 0x041a, 0x3655, 0x03d5, 0x35c1, 0x038e, 0x3537, 0x0347\n] );\n\nlet lut = null;\n\nfunction getDFGLUT() {\n\n\tif ( lut === null ) {\n\n\t\tlut = new DataTexture( DATA, 32, 32, RGFormat, HalfFloatType );\n\t\tlut.minFilter = LinearFilter;\n\t\tlut.magFilter = LinearFilter;\n\t\tlut.wrapS = ClampToEdgeWrapping;\n\t\tlut.wrapT = ClampToEdgeWrapping;\n\t\tlut.generateMipmaps = false;\n\t\tlut.needsUpdate = true;\n\n\t}\n\n\treturn lut;\n\n}\n\n/**\n * This renderer uses WebGL 2 to display scenes.\n *\n * WebGL 1 is not supported since `r163`.\n */\nclass WebGLRenderer {\n\n\t/**\n\t * Constructs a new WebGL renderer.\n\t *\n\t * @param {WebGLRenderer~Options} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tconst {\n\t\t\tcanvas = createCanvasElement(),\n\t\t\tcontext = null,\n\t\t\tdepth = true,\n\t\t\tstencil = false,\n\t\t\talpha = false,\n\t\t\tantialias = false,\n\t\t\tpremultipliedAlpha = true,\n\t\t\tpreserveDrawingBuffer = false,\n\t\t\tpowerPreference = 'default',\n\t\t\tfailIfMajorPerformanceCaveat = false,\n\t\t\treversedDepthBuffer = false,\n\t\t} = parameters;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLRenderer = true;\n\n\t\tlet _alpha;\n\n\t\tif ( context !== null ) {\n\n\t\t\tif ( typeof WebGLRenderingContext !== 'undefined' && context instanceof WebGLRenderingContext ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer: WebGL 1 is not supported since r163.' );\n\n\t\t\t}\n\n\t\t\t_alpha = context.getContextAttributes().alpha;\n\n\t\t} else {\n\n\t\t\t_alpha = alpha;\n\n\t\t}\n\n\t\tconst INTEGER_FORMATS = new Set( [\n\t\t\tRGBAIntegerFormat,\n\t\t\tRGIntegerFormat,\n\t\t\tRedIntegerFormat\n\t\t] );\n\n\t\tconst UNSIGNED_TYPES = new Set( [\n\t\t\tUnsignedByteType,\n\t\t\tUnsignedIntType,\n\t\t\tUnsignedShortType,\n\t\t\tUnsignedInt248Type,\n\t\t\tUnsignedShort4444Type,\n\t\t\tUnsignedShort5551Type\n\t\t] );\n\n\t\tconst uintClearColor = new Uint32Array( 4 );\n\t\tconst intClearColor = new Int32Array( 4 );\n\n\t\tlet currentRenderList = null;\n\t\tlet currentRenderState = null;\n\n\t\t// render() can be called from within a callback triggered by another render.\n\t\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\t\tconst renderListStack = [];\n\t\tconst renderStateStack = [];\n\n\t\t// public properties\n\n\t\t/**\n\t\t * A canvas where the renderer draws its output.This is automatically created by the renderer\n\t\t * in the constructor (if not provided already); you just need to add it to your page like so:\n\t\t * ```js\n\t\t * document.body.appendChild( renderer.domElement );\n\t\t * ```\n\t\t *\n\t\t * @type {HTMLCanvasElement|OffscreenCanvas}\n\t\t */\n\t\tthis.domElement = canvas;\n\n\t\t/**\n\t\t * A object with debug configuration settings.\n\t\t *\n\t\t * - `checkShaderErrors`: If it is `true`, defines whether material shader programs are\n\t\t * checked for errors during compilation and linkage process. It may be useful to disable\n\t\t * this check in production for performance gain. It is strongly recommended to keep these\n\t\t * checks enabled during development. If the shader does not compile and link - it will not\n\t\t * work and associated material will not render.\n\t\t * - `onShaderError(gl, program, glVertexShader,glFragmentShader)`: A callback function that\n\t\t * can be used for custom error reporting. The callback receives the WebGL context, an instance\n\t\t * of WebGLProgram as well two instances of WebGLShader representing the vertex and fragment shader.\n\t\t * Assigning a custom function disables the default error reporting.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.debug = {\n\n\t\t\t/**\n\t\t\t * Enables error checking and reporting when shader programs are being compiled.\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tcheckShaderErrors: true,\n\t\t\t/**\n\t\t\t * Callback for custom error reporting.\n\t\t\t * @type {?Function}\n\t\t\t */\n\t\t\tonShaderError: null\n\t\t};\n\n\t\t// clearing\n\n\t\t/**\n\t\t * Whether the renderer should automatically clear its output before rendering a frame or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClear = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the color buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearColor = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearDepth = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\t/**\n\t\t * Whether the renderer should sort objects or not.\n\t\t *\n\t\t * Note: Sorting is used to attempt to properly render objects that have some\n\t\t * degree of transparency. By definition, sorting objects may not work in all\n\t\t * cases. Depending on the needs of application, it may be necessary to turn\n\t\t * off sorting and use other methods to deal with transparency rendering e.g.\n\t\t * manually determining each object's rendering order.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\t/**\n\t\t * User-defined clipping planes specified in world space. These planes apply globally.\n\t\t * Points in space whose dot product with the plane is negative are cut away.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.clippingPlanes = [];\n\n\t\t/**\n\t\t * Whether the renderer respects object-level clipping planes or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.localClippingEnabled = false;\n\n\t\t// tone mapping\n\n\t\t/**\n\t\t * The tone mapping technique of the renderer.\n\t\t *\n\t\t * @type {(NoToneMapping|LinearToneMapping|ReinhardToneMapping|CineonToneMapping|ACESFilmicToneMapping|CustomToneMapping|AgXToneMapping|NeutralToneMapping)}\n\t\t * @default NoToneMapping\n\t\t */\n\t\tthis.toneMapping = NoToneMapping;\n\n\t\t/**\n\t\t * Exposure level of tone mapping.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.toneMappingExposure = 1.0;\n\n\t\t// transmission\n\n\t\t/**\n\t\t * The normalized resolution scale for the transmission render target, measured in percentage\n\t\t * of viewport dimensions. Lowering this value can result in significant performance improvements\n\t\t * when using {@link MeshPhysicalMaterial#transmission}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.transmissionResolutionScale = 1.0;\n\n\t\t// internal properties\n\n\t\tconst _this = this;\n\n\t\tlet _isContextLost = false;\n\n\t\t// internal state cache\n\n\t\tthis._outputColorSpace = SRGBColorSpace;\n\n\t\tlet _currentActiveCubeFace = 0;\n\t\tlet _currentActiveMipmapLevel = 0;\n\t\tlet _currentRenderTarget = null;\n\t\tlet _currentMaterialId = -1;\n\n\t\tlet _currentCamera = null;\n\n\t\tconst _currentViewport = new Vector4();\n\t\tconst _currentScissor = new Vector4();\n\t\tlet _currentScissorTest = null;\n\n\t\tconst _currentClearColor = new Color( 0x000000 );\n\t\tlet _currentClearAlpha = 0;\n\n\t\t//\n\n\t\tlet _width = canvas.width;\n\t\tlet _height = canvas.height;\n\n\t\tlet _pixelRatio = 1;\n\t\tlet _opaqueSort = null;\n\t\tlet _transparentSort = null;\n\n\t\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\t\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\t\tlet _scissorTest = false;\n\n\t\t// frustum\n\n\t\tconst _frustum = new Frustum();\n\n\t\t// clipping\n\n\t\tlet _clippingEnabled = false;\n\t\tlet _localClippingEnabled = false;\n\n\t\t// camera matrices cache\n\n\t\tconst _projScreenMatrix = new Matrix4();\n\n\t\tconst _vector3 = new Vector3();\n\n\t\tconst _vector4 = new Vector4();\n\n\t\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\t\tlet _renderBackground = false;\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\t// initialize\n\n\t\tlet _gl = context;\n\n\t\tfunction getContext( contextName, contextAttributes ) {\n\n\t\t\treturn canvas.getContext( contextName, contextAttributes );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\tconst contextAttributes = {\n\t\t\t\talpha: true,\n\t\t\t\tdepth,\n\t\t\t\tstencil,\n\t\t\t\tantialias,\n\t\t\t\tpremultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer,\n\t\t\t\tpowerPreference,\n\t\t\t\tfailIfMajorPerformanceCaveat,\n\t\t\t};\n\n\t\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\t\tif ( 'setAttribute' in canvas ) canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t\tcanvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tconst contextName = 'webgl2';\n\n\t\t\t\t_gl = getContext( contextName, contextAttributes );\n\n\t\t\t\tif ( _gl === null ) {\n\n\t\t\t\t\tif ( getContext( contextName ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLRenderer: ' + error.message );\n\t\t\tthrow error;\n\n\t\t}\n\n\t\tlet extensions, capabilities, state, info;\n\t\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\t\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\t\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\t\tlet utils, bindingStates, uniformsGroups;\n\n\t\tfunction initGLContext() {\n\n\t\t\textensions = new WebGLExtensions( _gl );\n\t\t\textensions.init();\n\n\t\t\tutils = new WebGLUtils( _gl, extensions );\n\n\t\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters, utils );\n\n\t\t\tstate = new WebGLState( _gl, extensions );\n\n\t\t\tif ( capabilities.reversedDepthBuffer && reversedDepthBuffer ) {\n\n\t\t\t\tstate.buffers.depth.setReversed( true );\n\n\t\t\t}\n\n\t\t\tinfo = new WebGLInfo( _gl );\n\t\t\tproperties = new WebGLProperties();\n\t\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\t\tattributes = new WebGLAttributes( _gl );\n\t\t\tbindingStates = new WebGLBindingStates( _gl, attributes );\n\t\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\t\tclipping = new WebGLClipping( properties );\n\t\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\t\tmaterials = new WebGLMaterials( _this, properties );\n\t\t\trenderLists = new WebGLRenderLists();\n\t\t\trenderStates = new WebGLRenderStates( extensions );\n\t\t\tbackground = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha );\n\t\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\t\t\tuniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );\n\n\t\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info );\n\t\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info );\n\n\t\t\tinfo.programs = programCache.programs;\n\n\t\t\t/**\n\t\t\t * Holds details about the capabilities of the current rendering context.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#capabilities\n\t\t\t * @type {WebGLRenderer~Capabilities}\n\t\t\t */\n\t\t\t_this.capabilities = capabilities;\n\n\t\t\t/**\n\t\t\t * Provides methods for retrieving and testing WebGL extensions.\n\t\t\t *\n\t\t\t * - `get(extensionName:string)`: Used to check whether a WebGL extension is supported\n\t\t\t * and return the extension object if available.\n\t\t\t * - `has(extensionName:string)`: returns `true` if the extension is supported.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#extensions\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.extensions = extensions;\n\n\t\t\t/**\n\t\t\t * Used to track properties of other objects like native WebGL objects.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#properties\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.properties = properties;\n\n\t\t\t/**\n\t\t\t * Manages the render lists of the renderer.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#renderLists\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.renderLists = renderLists;\n\n\n\n\t\t\t/**\n\t\t\t * Interface for managing shadows.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#shadowMap\n\t\t\t * @type {WebGLRenderer~ShadowMap}\n\t\t\t */\n\t\t\t_this.shadowMap = shadowMap;\n\n\t\t\t/**\n\t\t\t * Interface for managing the WebGL state.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#state\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.state = state;\n\n\t\t\t/**\n\t\t\t * Holds a series of statistical information about the GPU memory\n\t\t\t * and the rendering process. Useful for debugging and monitoring.\n\t\t\t *\n\t\t\t * By default these data are reset at each render call but when having\n\t\t\t * multiple render passes per frame (e.g. when using post processing) it can\n\t\t\t * be preferred to reset with a custom pattern. First, set `autoReset` to\n\t\t\t * `false`.\n\t\t\t * ```js\n\t\t\t * renderer.info.autoReset = false;\n\t\t\t * ```\n\t\t\t * Call `reset()` whenever you have finished to render a single frame.\n\t\t\t * ```js\n\t\t\t * renderer.info.reset();\n\t\t\t * ```\n\t\t\t *\n\t\t\t * @name WebGLRenderer#info\n\t\t\t * @type {WebGLRenderer~Info}\n\t\t\t */\n\t\t\t_this.info = info;\n\n\t\t}\n\n\t\tinitGLContext();\n\n\t\t// xr\n\n\t\tconst xr = new WebXRManager( _this, _gl );\n\n\t\t/**\n\t\t * A reference to the XR manager.\n\t\t *\n\t\t * @type {WebXRManager}\n\t\t */\n\t\tthis.xr = xr;\n\n\t\t/**\n\t\t * Returns the rendering context.\n\t\t *\n\t\t * @return {WebGL2RenderingContext} The rendering context.\n\t\t */\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the rendering context attributes.\n\t\t *\n\t\t * @return {WebGLContextAttributes} The rendering context attributes.\n\t\t */\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\t/**\n\t\t * Simulates a loss of the WebGL context. This requires support for the `WEBGL_lose_context` extension.\n\t\t */\n\t\tthis.forceContextLoss = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.loseContext();\n\n\t\t};\n\n\t\t/**\n\t\t * Simulates a restore of the WebGL context. This requires support for the `WEBGL_lose_context` extension.\n\t\t */\n\t\tthis.forceContextRestore = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.restoreContext();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the pixel ratio.\n\t\t *\n\t\t * @return {number} The pixel ratio.\n\t\t */\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the given pixel ratio and resizes the canvas if necessary.\n\t\t *\n\t\t * @param {number} value - The pixel ratio.\n\t\t */\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _width, _height, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the renderer's size in logical pixels. This method does not honor the pixel ratio.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The renderer's size in logical pixels.\n\t\t */\n\t\tthis.getSize = function ( target ) {\n\n\t\t\treturn target.set( _width, _height );\n\n\t\t};\n\n\t\t/**\n\t\t * Resizes the output canvas to (width, height) with device pixel ratio taken\n\t\t * into account, and also sets the viewport to fit that size, starting in (0,\n\t\t * 0). Setting `updateStyle` to false prevents any style changes to the output canvas.\n\t\t *\n\t\t * @param {number} width - The width in logical pixels.\n\t\t * @param {number} height - The height in logical pixels.\n\t\t * @param {boolean} [updateStyle=true] - Whether to update the `style` attribute of the canvas or not.\n\t\t */\n\t\tthis.setSize = function ( width, height, updateStyle = true ) {\n\n\t\t\tif ( xr.isPresenting ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\tcanvas.width = Math.floor( width * _pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * _pixelRatio );\n\n\t\t\tif ( updateStyle === true ) {\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the drawing buffer size in physical pixels. This method honors the pixel ratio.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The drawing buffer size.\n\t\t */\n\t\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t\t};\n\n\t\t/**\n\t\t * This method allows to define the drawing buffer size by specifying\n\t\t * width, height and pixel ratio all at once. The size of the drawing\n\t\t * buffer is computed with this formula:\n\t\t * ```js\n\t\t * size.x = width * pixelRatio;\n\t\t * size.y = height * pixelRatio;\n\t\t * ```\n\t\t *\n\t\t * @param {number} width - The width in logical pixels.\n\t\t * @param {number} height - The height in logical pixels.\n\t\t * @param {number} pixelRatio - The pixel ratio.\n\t\t */\n\t\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_pixelRatio = pixelRatio;\n\n\t\t\tcanvas.width = Math.floor( width * pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * pixelRatio );\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current viewport definition.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The current viewport definition.\n\t\t */\n\t\tthis.getCurrentViewport = function ( target ) {\n\n\t\t\treturn target.copy( _currentViewport );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the viewport definition.\n\t\t *\n\t\t * @param {Vector4} target - The method writes the result in this target object.\n\t\t * @return {Vector4} The viewport definition.\n\t\t */\n\t\tthis.getViewport = function ( target ) {\n\n\t\t\treturn target.copy( _viewport );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the viewport to render from `(x, y)` to `(x + width, y + height)`.\n\t\t *\n\t\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the viewport origin in logical pixel unit.\n\t\t * Or alternatively a four-component vector specifying all the parameters of the viewport.\n\t\t * @param {number} y - The vertical coordinate for the lower left corner of the viewport origin in logical pixel unit.\n\t\t * @param {number} width - The width of the viewport in logical pixel unit.\n\t\t * @param {number} height - The height of the viewport in logical pixel unit.\n\t\t */\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_viewport.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the scissor region.\n\t\t *\n\t\t * @param {Vector4} target - The method writes the result in this target object.\n\t\t * @return {Vector4} The scissor region.\n\t\t */\n\t\tthis.getScissor = function ( target ) {\n\n\t\t\treturn target.copy( _scissor );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the scissor region to render from `(x, y)` to `(x + width, y + height)`.\n\t\t *\n\t\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the scissor region origin in logical pixel unit.\n\t\t * Or alternatively a four-component vector specifying all the parameters of the scissor region.\n\t\t * @param {number} y - The vertical coordinate for the lower left corner of the scissor region origin in logical pixel unit.\n\t\t * @param {number} width - The width of the scissor region in logical pixel unit.\n\t\t * @param {number} height - The height of the scissor region in logical pixel unit.\n\t\t */\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_scissor.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns `true` if the scissor test is enabled.\n\t\t *\n\t\t * @return {boolean} Whether the scissor test is enabled or not.\n\t\t */\n\t\tthis.getScissorTest = function () {\n\n\t\t\treturn _scissorTest;\n\n\t\t};\n\n\t\t/**\n\t\t * Enable or disable the scissor test. When this is enabled, only the pixels\n\t\t * within the defined scissor area will be affected by further renderer\n\t\t * actions.\n\t\t *\n\t\t * @param {boolean} boolean - Whether the scissor test is enabled or not.\n\t\t */\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom opaque sort function for the render lists. Pass `null`\n\t\t * to use the default `painterSortStable` function.\n\t\t *\n\t\t * @param {?Function} method - The opaque sort function.\n\t\t */\n\t\tthis.setOpaqueSort = function ( method ) {\n\n\t\t\t_opaqueSort = method;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom transparent sort function for the render lists. Pass `null`\n\t\t * to use the default `reversePainterSortStable` function.\n\t\t *\n\t\t * @param {?Function} method - The opaque sort function.\n\t\t */\n\t\tthis.setTransparentSort = function ( method ) {\n\n\t\t\t_transparentSort = method;\n\n\t\t};\n\n\t\t// Clearing\n\n\t\t/**\n\t\t * Returns the clear color.\n\t\t *\n\t\t * @param {Color} target - The method writes the result in this target object.\n\t\t * @return {Color} The clear color.\n\t\t */\n\t\tthis.getClearColor = function ( target ) {\n\n\t\t\treturn target.copy( background.getClearColor() );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear color and alpha.\n\t\t *\n\t\t * @param {Color} color - The clear color.\n\t\t * @param {number} [alpha=1] - The clear alpha.\n\t\t */\n\t\tthis.setClearColor = function () {\n\n\t\t\tbackground.setClearColor( ...arguments );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the clear alpha. Ranges within `[0,1]`.\n\t\t *\n\t\t * @return {number} The clear alpha.\n\t\t */\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn background.getClearAlpha();\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear alpha.\n\t\t *\n\t\t * @param {number} alpha - The clear alpha.\n\t\t */\n\t\tthis.setClearAlpha = function () {\n\n\t\t\tbackground.setClearAlpha( ...arguments );\n\n\t\t};\n\n\t\t/**\n\t\t * Tells the renderer to clear its color, depth or stencil drawing buffer(s).\n\t\t * This method initializes the buffers to the current clear color values.\n\t\t *\n\t\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t\t */\n\t\tthis.clear = function ( color = true, depth = true, stencil = true ) {\n\n\t\t\tlet bits = 0;\n\n\t\t\tif ( color ) {\n\n\t\t\t\t// check if we're trying to clear an integer target\n\t\t\t\tlet isIntegerFormat = false;\n\t\t\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t\t\tconst targetFormat = _currentRenderTarget.texture.format;\n\t\t\t\t\tisIntegerFormat = INTEGER_FORMATS.has( targetFormat );\n\n\t\t\t\t}\n\n\t\t\t\t// use the appropriate clear functions to clear the target if it's a signed\n\t\t\t\t// or unsigned integer target\n\t\t\t\tif ( isIntegerFormat ) {\n\n\t\t\t\t\tconst targetType = _currentRenderTarget.texture.type;\n\t\t\t\t\tconst isUnsignedType = UNSIGNED_TYPES.has( targetType );\n\n\t\t\t\t\tconst clearColor = background.getClearColor();\n\t\t\t\t\tconst a = background.getClearAlpha();\n\t\t\t\t\tconst r = clearColor.r;\n\t\t\t\t\tconst g = clearColor.g;\n\t\t\t\t\tconst b = clearColor.b;\n\n\t\t\t\t\tif ( isUnsignedType ) {\n\n\t\t\t\t\t\tuintClearColor[ 0 ] = r;\n\t\t\t\t\t\tuintClearColor[ 1 ] = g;\n\t\t\t\t\t\tuintClearColor[ 2 ] = b;\n\t\t\t\t\t\tuintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferuiv( _gl.COLOR, 0, uintClearColor );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tintClearColor[ 0 ] = r;\n\t\t\t\t\t\tintClearColor[ 1 ] = g;\n\t\t\t\t\t\tintClearColor[ 2 ] = b;\n\t\t\t\t\t\tintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferiv( _gl.COLOR, 0, intClearColor );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbits |= _gl.COLOR_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( depth ) {\n\n\t\t\t\tbits |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t}\n\n\t\t\tif ( stencil ) {\n\n\t\t\t\tbits |= _gl.STENCIL_BUFFER_BIT;\n\t\t\t\tthis.state.buffers.stencil.setMask( 0xffffffff );\n\n\t\t\t}\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the color buffer. Equivalent to calling `renderer.clear( true, false, false )`.\n\t\t */\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the depth buffer. Equivalent to calling `renderer.clear( false, true, false )`.\n\t\t */\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the stencil buffer. Equivalent to calling `renderer.clear( false, false, true )`.\n\t\t */\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\t/**\n\t\t * Frees the GPU-related resources allocated by this instance. Call this\n\t\t * method whenever this instance is no longer used in your app.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\tcanvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tbackground.dispose();\n\t\t\trenderLists.dispose();\n\t\t\trenderStates.dispose();\n\t\t\tproperties.dispose();\n\t\t\tcubemaps.dispose();\n\t\t\tcubeuvmaps.dispose();\n\t\t\tobjects.dispose();\n\t\t\tbindingStates.dispose();\n\t\t\tuniformsGroups.dispose();\n\t\t\tprogramCache.dispose();\n\n\t\t\txr.dispose();\n\n\t\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t\tanimation.stop();\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tlog( 'WebGLRenderer: Context Lost.' );\n\n\t\t\t_isContextLost = true;\n\n\t\t}\n\n\t\tfunction onContextRestore( /* event */ ) {\n\n\t\t\tlog( 'WebGLRenderer: Context Restored.' );\n\n\t\t\t_isContextLost = false;\n\n\t\t\tconst infoAutoReset = info.autoReset;\n\t\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\t\tconst shadowMapType = shadowMap.type;\n\n\t\t\tinitGLContext();\n\n\t\t\tinfo.autoReset = infoAutoReset;\n\t\t\tshadowMap.enabled = shadowMapEnabled;\n\t\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\t\tshadowMap.type = shadowMapType;\n\n\t\t}\n\n\t\tfunction onContextCreationError( event ) {\n\n\t\t\terror( 'WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage );\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tconst material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReferences( material );\n\n\t\t\tproperties.remove( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\t\tconst programs = properties.get( material ).programs;\n\n\t\t\tif ( programs !== undefined ) {\n\n\t\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t\t//\n\n\t\t\tlet index = geometry.index;\n\t\t\tlet rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\n\t\t\t\tif ( index === undefined ) return;\n\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst drawRange = geometry.drawRange;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet drawStart = drawRange.start * rangeFactor;\n\t\t\tlet drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor;\n\n\t\t\tif ( group !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, group.start * rangeFactor );\n\t\t\t\tdrawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor );\n\n\t\t\t}\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, index.count );\n\n\t\t\t} else if ( position !== undefined && position !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, position.count );\n\n\t\t\t}\n\n\t\t\tconst drawCount = drawEnd - drawStart;\n\n\t\t\tif ( drawCount < 0 || drawCount === Infinity ) return;\n\n\t\t\t//\n\n\t\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\t\tlet attribute;\n\t\t\tlet renderer = bufferRenderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tattribute = attributes.get( index );\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( attribute );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tif ( object._multiDrawInstances !== null ) {\n\n\t\t\t\t\t// @deprecated, r174\n\t\t\t\t\twarnOnce( 'WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );\n\t\t\t\t\trenderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( ! extensions.get( 'WEBGL_multi_draw' ) ) {\n\n\t\t\t\t\t\tconst starts = object._multiDrawStarts;\n\t\t\t\t\t\tconst counts = object._multiDrawCounts;\n\t\t\t\t\t\tconst drawCount = object._multiDrawCount;\n\t\t\t\t\t\tconst bytesPerElement = index ? attributes.get( index ).bytesPerElement : 1;\n\t\t\t\t\t\tconst uniforms = properties.get( material ).currentProgram.getUniforms();\n\t\t\t\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\t\t\t\tuniforms.setValue( _gl, '_gl_DrawID', i );\n\t\t\t\t\t\t\trenderer.render( starts[ i ] / bytesPerElement, counts[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\trenderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isInstancedMesh ) {\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tconst maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity;\n\t\t\t\tconst instanceCount = Math.min( geometry.instanceCount, maxInstanceCount );\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Compile\n\n\t\tfunction prepareMaterial( material, scene, object ) {\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Compiles all materials in the scene with the camera. This is useful to precompile shaders\n\t\t * before the first rendering. If you want to add a 3D object to an existing scene, use the third\n\t\t * optional parameter for applying the target scene.\n\t\t *\n\t\t * Note that the (target) scene's lighting and environment must be configured before calling this method.\n\t\t *\n\t\t * @param {Object3D} scene - The scene or another type of 3D object to precompile.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {?Scene} [targetScene=null] - The target scene.\n\t\t * @return {Set} The precompiled materials.\n\t\t */\n\t\tthis.compile = function ( scene, camera, targetScene = null ) {\n\n\t\t\tif ( targetScene === null ) targetScene = scene;\n\n\t\t\tcurrentRenderState = renderStates.get( targetScene );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t// gather lights from both the target scene and the new object that will be added to the scene.\n\n\t\t\ttargetScene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( scene !== targetScene ) {\n\n\t\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tcurrentRenderState.setupLights();\n\n\t\t\t// Only initialize materials in the new scene, not the targetScene.\n\n\t\t\tconst materials = new Set();\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tif ( ! ( object.isMesh || object.isPoints || object.isLine || object.isSprite ) ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( material ) {\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\t\tprepareMaterial( material2, targetScene, object );\n\t\t\t\t\t\t\tmaterials.add( material2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tprepareMaterial( material, targetScene, object );\n\t\t\t\t\t\tmaterials.add( material );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tcurrentRenderState = renderStateStack.pop();\n\n\t\t\treturn materials;\n\n\t\t};\n\n\t\t// compileAsync\n\n\t\t/**\n\t\t * Asynchronous version of {@link WebGLRenderer#compile}.\n\t\t *\n\t\t * This method makes use of the `KHR_parallel_shader_compile` WebGL extension. Hence,\n\t\t * it is recommended to use this version of `compile()` whenever possible.\n\t\t *\n\t\t * @async\n\t\t * @param {Object3D} scene - The scene or another type of 3D object to precompile.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {?Scene} [targetScene=null] - The target scene.\n\t\t * @return {Promise} A Promise that resolves when the given scene can be rendered without unnecessary stalling due to shader compilation.\n\t\t */\n\t\tthis.compileAsync = function ( scene, camera, targetScene = null ) {\n\n\t\t\tconst materials = this.compile( scene, camera, targetScene );\n\n\t\t\t// Wait for all the materials in the new object to indicate that they're\n\t\t\t// ready to be used before resolving the promise.\n\n\t\t\treturn new Promise( ( resolve ) => {\n\n\t\t\t\tfunction checkMaterialsReady() {\n\n\t\t\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\t\t\tconst materialProperties = properties.get( material );\n\t\t\t\t\t\tconst program = materialProperties.currentProgram;\n\n\t\t\t\t\t\tif ( program.isReady() ) {\n\n\t\t\t\t\t\t\t// remove any programs that report they're ready to use from the list\n\t\t\t\t\t\t\tmaterials.delete( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\t// once the list of compiling materials is empty, call the callback\n\n\t\t\t\t\tif ( materials.size === 0 ) {\n\n\t\t\t\t\t\tresolve( scene );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// if some materials are still not ready, wait a bit and check again\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extensions.get( 'KHR_parallel_shader_compile' ) !== null ) {\n\n\t\t\t\t\t// If we can check the compilation status of the materials without\n\t\t\t\t\t// blocking then do so right away.\n\n\t\t\t\t\tcheckMaterialsReady();\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise start by waiting a bit to give the materials we just\n\t\t\t\t\t// initialized a chance to finish.\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time ) {\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t\t}\n\n\t\tfunction onXRSessionStart() {\n\n\t\t\tanimation.stop();\n\n\t\t}\n\n\t\tfunction onXRSessionEnd() {\n\n\t\t\tanimation.start();\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tif ( typeof self !== 'undefined' ) animation.setContext( self );\n\n\t\t/**\n\t\t * Applications are advised to always define the animation loop\n\t\t * with this method and not manually with `requestAnimationFrame()`\n\t\t * for best compatibility.\n\t\t *\n\t\t * @param {?onAnimationCallback} callback - The application's animation loop.\n\t\t */\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\t\t\txr.setAnimationLoop( callback );\n\n\t\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t\t};\n\n\t\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t// Rendering\n\n\t\t/**\n\t\t * Renders the given scene (or other type of 3D object) using the given camera.\n\t\t *\n\t\t * The render is done to a previously specified render target set by calling {@link WebGLRenderer#setRenderTarget}\n\t\t * or to the canvas as usual.\n\t\t *\n\t\t * By default render buffers are cleared before rendering but you can prevent\n\t\t * this by setting the property `autoClear` to `false`. If you want to prevent\n\t\t * only certain buffers being cleared you can `autoClearColor`, `autoClearDepth`\n\t\t * or `autoClearStencil` to `false`. To force a clear, use {@link WebGLRenderer#clear}.\n\t\t *\n\t\t * @param {Object3D} scene - The scene to render.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\terror( 'WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( _isContextLost === true ) return;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix, WebGLCoordinateSystem, camera.reversedDepth );\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled );\n\n\t\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\t\tcurrentRenderList.init();\n\n\t\t\trenderListStack.push( currentRenderList );\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tconst depthSensingMesh = _this.xr.getDepthSensingMesh();\n\n\t\t\t\tif ( depthSensingMesh !== null ) {\n\n\t\t\t\t\tprojectObject( depthSensingMesh, camera, - Infinity, _this.sortObjects );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\t\tcurrentRenderList.finish();\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t\t}\n\n\t\t\t_renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false;\n\t\t\tif ( _renderBackground ) {\n\n\t\t\t\tbackground.addToRenderList( currentRenderList, scene );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tthis.info.render.frame ++;\n\n\t\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t\t//\n\n\t\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t\t// render scene\n\n\t\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\n\t\t\tcurrentRenderState.setupLights();\n\n\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\tconst cameras = camera.cameras;\n\n\t\t\t\tif ( transmissiveObjects.length > 0 ) {\n\n\t\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\t\trenderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );\n\n\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _currentRenderTarget !== null && _currentActiveMipmapLevel === 0 ) {\n\n\t\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t\t// _gl.finish();\n\n\t\t\tbindingStates.resetDefaultState();\n\t\t\t_currentMaterialId = -1;\n\t\t\t_currentCamera = null;\n\n\t\t\trenderStateStack.pop();\n\n\t\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, currentRenderState.state.camera );\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderState = null;\n\n\t\t\t}\n\n\t\t\trenderListStack.pop();\n\n\t\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderList = null;\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tconst visible = object.layers.test( camera.layers );\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isGroup ) {\n\n\t\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\t_vector4.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( object.boundingSphere.center );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( geometry.boundingSphere.center );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_vector4\n\t\t\t\t\t\t\t\t.applyMatrix4( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst children = object.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\t\tconst { opaque: opaqueObjects, transmissive: transmissiveObjects, transparent: transparentObjects } = currentRenderList;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\tstate.setPolygonOffset( false );\n\n\t\t}\n\n\t\tfunction renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tif ( overrideMaterial !== null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( currentRenderState.state.transmissionRenderTarget[ camera.id ] === undefined ) {\n\n\t\t\t\tcurrentRenderState.state.transmissionRenderTarget[ camera.id ] = new WebGLRenderTarget( 1, 1, {\n\t\t\t\t\tgenerateMipmaps: true,\n\t\t\t\t\ttype: ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ) ? HalfFloatType : UnsignedByteType,\n\t\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\t\tsamples: 4,\n\t\t\t\t\tstencilBuffer: stencil,\n\t\t\t\t\tresolveDepthBuffer: false,\n\t\t\t\t\tresolveStencilBuffer: false,\n\t\t\t\t\tcolorSpace: ColorManagement.workingColorSpace,\n\t\t\t\t} );\n\n\t\t\t\t// debug\n\n\t\t\t\t/*\n\t\t\t\tconst geometry = new PlaneGeometry();\n\t\t\t\tconst material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } );\n\n\t\t\t\tconst mesh = new Mesh( geometry, material );\n\t\t\t\tscene.add( mesh );\n\t\t\t\t*/\n\n\t\t\t}\n\n\t\t\tconst transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[ camera.id ];\n\n\t\t\tconst activeViewport = camera.viewport || _currentViewport;\n\t\t\ttransmissionRenderTarget.setSize( activeViewport.z * _this.transmissionResolutionScale, activeViewport.w * _this.transmissionResolutionScale );\n\n\t\t\t//\n\n\t\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t\tconst currentActiveCubeFace = _this.getActiveCubeFace();\n\t\t\tconst currentActiveMipmapLevel = _this.getActiveMipmapLevel();\n\n\t\t\t_this.setRenderTarget( transmissionRenderTarget );\n\n\t\t\t_this.getClearColor( _currentClearColor );\n\t\t\t_currentClearAlpha = _this.getClearAlpha();\n\t\t\tif ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 );\n\n\t\t\t_this.clear();\n\n\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\t\tconst currentToneMapping = _this.toneMapping;\n\t\t\t_this.toneMapping = NoToneMapping;\n\n\t\t\t// Remove viewport from camera to avoid nested render calls resetting viewport to it (e.g Reflector).\n\t\t\t// Transmission render pass requires viewport to match the transmissionRenderTarget.\n\t\t\tconst currentCameraViewport = camera.viewport;\n\t\t\tif ( camera.viewport !== undefined ) camera.viewport = undefined;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === false ) { // see #28131\n\n\t\t\t\tlet renderTargetNeedsUpdate = false;\n\n\t\t\t\tfor ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst renderItem = transmissiveObjects[ i ];\n\n\t\t\t\t\tconst { object, geometry, material, group } = renderItem;\n\n\t\t\t\t\tif ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tconst currentSide = material.side;\n\n\t\t\t\t\t\tmaterial.side = BackSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t\t\tmaterial.side = currentSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderTargetNeedsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetNeedsUpdate === true ) {\n\n\t\t\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_this.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\t\t_this.setClearColor( _currentClearColor, _currentClearAlpha );\n\n\t\t\tif ( currentCameraViewport !== undefined ) camera.viewport = currentCameraViewport;\n\n\t\t\t_this.toneMapping = currentToneMapping;\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\t\tconst { object, geometry, group } = renderItem;\n\t\t\t\tlet material = renderItem.material;\n\n\t\t\t\tif ( material.allowOverride === true && overrideMaterial !== null ) {\n\n\t\t\t\t\tmaterial = overrideMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t}\n\n\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t\t}\n\n\t\tfunction getProgram( material, scene, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tconst lights = currentRenderState.state.lights;\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tconst lightsStateVersion = lights.state.version;\n\n\t\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\t\tlet programs = materialProperties.programs;\n\n\t\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tmaterialProperties.fog = scene.fog;\n\t\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\t\t\tmaterialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation;\n\n\t\t\tif ( programs === undefined ) {\n\n\t\t\t\t// new material\n\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\tprograms = new Map();\n\t\t\t\tmaterialProperties.programs = programs;\n\n\t\t\t}\n\n\t\t\tlet program = programs.get( programCacheKey );\n\n\t\t\tif ( program !== undefined ) {\n\n\t\t\t\t// early out if program and light state is identical\n\n\t\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\t\treturn program;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t\t}\n\n\t\t\tconst uniforms = materialProperties.uniforms;\n\n\t\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t\t}\n\n\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\t\tuniforms.spotLightMatrix.value = lights.state.spotLightMatrix;\n\t\t\t\tuniforms.spotLightMap.value = lights.state.spotLightMap;\n\t\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tmaterialProperties.currentProgram = program;\n\t\t\tmaterialProperties.uniformsList = null;\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction getUniformList( materialProperties ) {\n\n\t\t\tif ( materialProperties.uniformsList === null ) {\n\n\t\t\t\tconst progUniforms = materialProperties.currentProgram.getUniforms();\n\t\t\t\tmaterialProperties.uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, materialProperties.uniforms );\n\n\t\t\t}\n\n\t\t\treturn materialProperties.uniformsList;\n\n\t\t}\n\n\t\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tmaterialProperties.outputColorSpace = parameters.outputColorSpace;\n\t\t\tmaterialProperties.batching = parameters.batching;\n\t\t\tmaterialProperties.batchingColor = parameters.batchingColor;\n\t\t\tmaterialProperties.instancing = parameters.instancing;\n\t\t\tmaterialProperties.instancingColor = parameters.instancingColor;\n\t\t\tmaterialProperties.instancingMorph = parameters.instancingMorph;\n\t\t\tmaterialProperties.skinning = parameters.skinning;\n\t\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\t\tmaterialProperties.morphColors = parameters.morphColors;\n\t\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t\t}\n\n\t\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\ttextures.resetTextureUnits();\n\n\t\t\tconst fog = scene.fog;\n\t\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tconst colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace );\n\t\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\t\tconst vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 );\n\t\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\t\tconst morphColors = !! geometry.morphAttributes.color;\n\n\t\t\tlet toneMapping = NoToneMapping;\n\n\t\t\tif ( material.toneMapped ) {\n\n\t\t\t\tif ( _currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\t\ttoneMapping = _this.toneMapping;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tconst materialProperties = properties.get( material );\n\t\t\tconst lights = currentRenderState.state.lights;\n\n\t\t\tif ( _clippingEnabled === true ) {\n\n\t\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\t\tconst useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet needsProgramChange = false;\n\n\t\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.outputColorSpace !== colorSpace ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batching === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isBatchedMesh && materialProperties.batching === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === true && object.colorTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === false && object.colorTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === true && object.morphTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === false && object.morphTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( material.fog === true && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphColors !== morphColors ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tneedsProgramChange = true;\n\t\t\t\tmaterialProperties.__version = material.version;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet program = materialProperties.currentProgram;\n\n\t\t\tif ( needsProgramChange === true ) {\n\n\t\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t\tlet refreshProgram = false;\n\t\t\tlet refreshMaterial = false;\n\t\t\tlet refreshLights = false;\n\n\t\t\tconst p_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\t\t// common camera uniforms\n\n\t\t\t\tconst reversedDepthBuffer = state.buffers.depth.getReversed();\n\n\t\t\t\tif ( reversedDepthBuffer && camera.reversedDepth !== true ) {\n\n\t\t\t\t\tcamera._reversedDepth = true;\n\t\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl, _vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// consider moving isOrthographic to UniformLib and WebGLMaterials, see https://github.com/mrdoob/three.js/pull/26467#issuecomment-1645185067\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t\t}\n\n\t\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tconst skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingTexture', object._matricesTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingIdTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingIdTexture', object._indirectTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingColorTexture' );\n\t\t\t\tif ( object._colorsTexture !== null ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'batchingColorTexture', object._colorsTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\t\tif ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined ) ) {\n\n\t\t\t\tmorphtargets.update( object, geometry, program );\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t\t}\n\n\t\t\t// https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512\n\n\t\t\tif ( material.isMeshGouraudMaterial && material.envMap !== null ) {\n\n\t\t\t\tm_uniforms.envMap.value = envMap;\n\n\t\t\t\tm_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) {\n\n\t\t\t\tm_uniforms.envMapIntensity.value = scene.environmentIntensity;\n\n\t\t\t}\n\n\t\t\t// Set DFG LUT for physically-based materials\n\t\t\tif ( m_uniforms.dfgLUT !== undefined ) {\n\n\t\t\t\tm_uniforms.dfgLUT.value = getDFGLUT();\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog === true ) {\n\n\t\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[ camera.id ] );\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\n\t\t\t}\n\n\t\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\t\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t\t}\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\t// UBOs\n\n\t\t\tif ( material.isShaderMaterial || material.isRawShaderMaterial ) {\n\n\t\t\t\tconst groups = material.uniformsGroups;\n\n\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\t\tuniformsGroups.update( group, program );\n\t\t\t\t\tuniformsGroups.bind( group, program );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\tfunction materialNeedsLights( material ) {\n\n\t\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t\t}\n\n\t\t/**\n\t\t * Returns the active cube face.\n\t\t *\n\t\t * @return {number} The active cube face.\n\t\t */\n\t\tthis.getActiveCubeFace = function () {\n\n\t\t\treturn _currentActiveCubeFace;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the active mipmap level.\n\t\t *\n\t\t * @return {number} The active mipmap level.\n\t\t */\n\t\tthis.getActiveMipmapLevel = function () {\n\n\t\t\treturn _currentActiveMipmapLevel;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the active render target.\n\t\t *\n\t\t * @return {?WebGLRenderTarget} The active render target. Returns `null` if no render target\n\t\t * is currently set.\n\t\t */\n\t\tthis.getRenderTarget = function () {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = renderTarget.resolveDepthBuffer === false;\n\t\t\tif ( renderTargetProperties.__autoAllocateDepthBuffer === false ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\trenderTargetProperties.__useRenderToTexture = false;\n\n\t\t\t}\n\n\t\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = renderTargetProperties.__autoAllocateDepthBuffer ? undefined : depthTexture;\n\n\t\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\t};\n\n\t\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t\t};\n\n\t\tconst _scratchFrameBuffer = _gl.createFramebuffer();\n\n\t\t/**\n\t\t * Sets the active rendertarget.\n\t\t *\n\t\t * @param {?WebGLRenderTarget} renderTarget - The render target to set. When `null` is given,\n\t\t * the canvas is set as the active render target instead.\n\t\t * @param {number} [activeCubeFace=0] - The active cube face when using a cube render target.\n\t\t * Indicates the z layer to render in to when using 3D or array render targets.\n\t\t * @param {number} [activeMipmapLevel=0] - The active mipmap level.\n\t\t */\n\t\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\t\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\t\tlet useDefaultFramebuffer = true;\n\t\t\tlet framebuffer = null;\n\t\t\tlet isCube = false;\n\t\t\tlet isRenderTarget3D = false;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\t\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t\t} else if ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\t// check if the depth texture is already bound to the frame buffer and that it's been initialized\n\t\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\t\t\tif ( renderTargetProperties.__boundDepthTexture !== depthTexture ) {\n\n\t\t\t\t\t\t// check if the depth texture is compatible\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tdepthTexture !== null &&\n\t\t\t\t\t\t\tproperties.has( depthTexture ) &&\n\t\t\t\t\t\t\t( renderTarget.width !== depthTexture.image.width || renderTarget.height !== depthTexture.image.height )\n\t\t\t\t\t\t) {\n\n\t\t\t\t\t\t\tthrow new Error( 'WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Swap the depth buffer to the currently attached one\n\t\t\t\t\t\ttextures.setupDepthRenderbuffer( renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst texture = renderTarget.texture;\n\n\t\t\t\tif ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer[ activeCubeFace ] ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ][ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tisCube = true;\n\n\t\t\t\t} else if ( ( renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t} else {\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t}\n\n\t\t\t// Use a scratch frame buffer if rendering to a mip level to avoid depth buffers\n\t\t\t// being bound that are different sizes.\n\t\t\tif ( activeMipmapLevel !== 0 ) {\n\n\t\t\t\tframebuffer = _scratchFrameBuffer;\n\n\t\t\t}\n\n\t\t\tconst framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( framebufferBound && useDefaultFramebuffer ) {\n\n\t\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport );\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\t\tconst layer = activeCubeFace;\n\n\t\t\t\tfor ( let i = 0; i < renderTarget.textures.length; i ++ ) {\n\n\t\t\t\t\tconst textureProperties = properties.get( renderTarget.textures[ i ] );\n\n\t\t\t\t\t_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, textureProperties.__webglTexture, activeMipmapLevel, layer );\n\n\t\t\t\t}\n\n\t\t\t} else if ( renderTarget !== null && activeMipmapLevel !== 0 ) {\n\n\t\t\t\t// Only bind the frame buffer if we are using a scratch frame buffer to render to a mipmap.\n\t\t\t\t// If we rebind the texture when using a multi sample buffer then an error about inconsistent samples will be thrown.\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t}\n\n\t\t\t_currentMaterialId = -1; // reset current material to ensure correct uniform bindings\n\n\t\t};\n\n\t\t/**\n\t\t * Reads the pixel data from the given render target into the given buffer.\n\t\t *\n\t\t * @param {WebGLRenderTarget} renderTarget - The render target to read from.\n\t\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t\t * @param {number} width - The width of the copy region.\n\t\t * @param {number} height - The height of the copy region.\n\t\t * @param {TypedArray} buffer - The result buffer.\n\t\t * @param {number} [activeCubeFaceIndex] - The active cube face index.\n\t\t * @param {number} [textureIndex=0] - The texture index of an MRT render target.\n\t\t */\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tconst texture = renderTarget.textures[ textureIndex ];\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t// when using MRT, select the correct color buffer for the subsequent read command\n\n\t\t\t\t\t\tif ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Asynchronous, non-blocking version of {@link WebGLRenderer#readRenderTargetPixels}.\n\t\t *\n\t\t * It is recommended to use this version of `readRenderTargetPixels()` whenever possible.\n\t\t *\n\t\t * @async\n\t\t * @param {WebGLRenderTarget} renderTarget - The render target to read from.\n\t\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t\t * @param {number} width - The width of the copy region.\n\t\t * @param {number} height - The height of the copy region.\n\t\t * @param {TypedArray} buffer - The result buffer.\n\t\t * @param {number} [activeCubeFaceIndex] - The active cube face index.\n\t\t * @param {number} [textureIndex=0] - The texture index of an MRT render target.\n\t\t * @return {Promise} A Promise that resolves when the read has been finished. The resolve provides the read data as a typed array.\n\t\t */\n\t\tthis.readRenderTargetPixelsAsync = async function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t// set the active frame buffer to the one we want to read\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\tconst texture = renderTarget.textures[ textureIndex ];\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst glBuffer = _gl.createBuffer();\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.bufferData( _gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ );\n\n\t\t\t\t\t// when using MRT, select the correct color buffer for the subsequent read command\n\n\t\t\t\t\tif ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );\n\n\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), 0 );\n\n\t\t\t\t\t// reset the frame buffer to the currently set buffer before waiting\n\t\t\t\t\tconst currFramebuffer = _currentRenderTarget !== null ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, currFramebuffer );\n\n\t\t\t\t\t// check if the commands have finished every 8 ms\n\t\t\t\t\tconst sync = _gl.fenceSync( _gl.SYNC_GPU_COMMANDS_COMPLETE, 0 );\n\n\t\t\t\t\t_gl.flush();\n\n\t\t\t\t\tawait probeAsync( _gl, sync, 4 );\n\n\t\t\t\t\t// read the data and delete the buffer\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.getBufferSubData( _gl.PIXEL_PACK_BUFFER, 0, buffer );\n\t\t\t\t\t_gl.deleteBuffer( glBuffer );\n\t\t\t\t\t_gl.deleteSync( sync );\n\n\t\t\t\t\treturn buffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Copies pixels from the current bound framebuffer into the given texture.\n\t\t *\n\t\t * @param {FramebufferTexture} texture - The texture.\n\t\t * @param {?Vector2} [position=null] - The start position of the copy operation.\n\t\t * @param {number} [level=0] - The mip level. The default represents the base mip.\n\t\t */\n\t\tthis.copyFramebufferToTexture = function ( texture, position = null, level = 0 ) {\n\n\t\t\tconst levelScale = Math.pow( 2, - level );\n\t\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\t\tconst x = position !== null ? position.x : 0;\n\t\t\tconst y = position !== null ? position.y : 0;\n\n\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t_gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, x, y, width, height );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tconst _srcFramebuffer = _gl.createFramebuffer();\n\t\tconst _dstFramebuffer = _gl.createFramebuffer();\n\n\t\t/**\n\t\t * Copies data of the given source texture into a destination texture.\n\t\t *\n\t\t * When using render target textures as `srcTexture` and `dstTexture`, you must make sure both render targets are initialized\n\t\t * {@link WebGLRenderer#initRenderTarget}.\n\t\t *\n\t\t * @param {Texture} srcTexture - The source texture.\n\t\t * @param {Texture} dstTexture - The destination texture.\n\t\t * @param {?(Box2|Box3)} [srcRegion=null] - A bounding box which describes the source region. Can be two or three-dimensional.\n\t\t * @param {?(Vector2|Vector3)} [dstPosition=null] - A vector that represents the origin of the destination region. Can be two or three-dimensional.\n\t\t * @param {number} [srcLevel=0] - The source mipmap level to copy.\n\t\t * @param {?number} [dstLevel=null] - The destination mipmap level.\n\t\t */\n\t\tthis.copyTextureToTexture = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = null ) {\n\n\t\t\t// support the previous signature with just a single dst mipmap level\n\t\t\tif ( dstLevel === null ) {\n\n\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t// @deprecated, r171\n\t\t\t\t\twarnOnce( 'WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels.' );\n\t\t\t\t\tdstLevel = srcLevel;\n\t\t\t\t\tsrcLevel = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdstLevel = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// gather the necessary dimensions to copy\n\t\t\tlet width, height, depth, minX, minY, minZ;\n\t\t\tlet dstX, dstY, dstZ;\n\t\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ dstLevel ] : srcTexture.image;\n\t\t\tif ( srcRegion !== null ) {\n\n\t\t\t\twidth = srcRegion.max.x - srcRegion.min.x;\n\t\t\t\theight = srcRegion.max.y - srcRegion.min.y;\n\t\t\t\tdepth = srcRegion.isBox3 ? srcRegion.max.z - srcRegion.min.z : 1;\n\t\t\t\tminX = srcRegion.min.x;\n\t\t\t\tminY = srcRegion.min.y;\n\t\t\t\tminZ = srcRegion.isBox3 ? srcRegion.min.z : 0;\n\n\t\t\t} else {\n\n\t\t\t\tconst levelScale = Math.pow( 2, - srcLevel );\n\t\t\t\twidth = Math.floor( image.width * levelScale );\n\t\t\t\theight = Math.floor( image.height * levelScale );\n\t\t\t\tif ( srcTexture.isDataArrayTexture ) {\n\n\t\t\t\t\tdepth = image.depth;\n\n\t\t\t\t} else if ( srcTexture.isData3DTexture ) {\n\n\t\t\t\t\tdepth = Math.floor( image.depth * levelScale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdepth = 1;\n\n\t\t\t\t}\n\n\t\t\t\tminX = 0;\n\t\t\t\tminY = 0;\n\t\t\t\tminZ = 0;\n\n\t\t\t}\n\n\t\t\tif ( dstPosition !== null ) {\n\n\t\t\t\tdstX = dstPosition.x;\n\t\t\t\tdstY = dstPosition.y;\n\t\t\t\tdstZ = dstPosition.z;\n\n\t\t\t} else {\n\n\t\t\t\tdstX = 0;\n\t\t\t\tdstY = 0;\n\t\t\t\tdstZ = 0;\n\n\t\t\t}\n\n\t\t\t// Set up the destination target\n\t\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\t\tconst glType = utils.convert( dstTexture.type );\n\t\t\tlet glTarget;\n\n\t\t\tif ( dstTexture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_3D;\n\n\t\t\t} else if ( dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D;\n\n\t\t\t}\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\t\t// used for copying data from cpu\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\t\t\tconst currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ );\n\n\t\t\t// set up the src texture\n\t\t\tconst isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture;\n\t\t\tconst isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture;\n\t\t\tif ( srcTexture.isDepthTexture ) {\n\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\t\t\t\tconst srcRenderTargetProperties = properties.get( srcTextureProperties.__renderTarget );\n\t\t\t\tconst dstRenderTargetProperties = properties.get( dstTextureProperties.__renderTarget );\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, srcRenderTargetProperties.__webglFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, dstRenderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// if the source or destination are a 3d target then a layer needs to be bound\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( srcTexture ).__webglTexture, srcLevel, minZ + i );\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( dstTexture ).__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.DEPTH_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else if ( srcLevel !== 0 || srcTexture.isRenderTargetTexture || properties.has( srcTexture ) ) {\n\n\t\t\t\t// get the appropriate frame buffers\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\n\t\t\t\t// bind the frame buffer targets\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, _srcFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, _dstFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// assign the correct layers and mip maps to the frame buffers\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, srcTextureProperties.__webglTexture, srcLevel, minZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, srcTextureProperties.__webglTexture, srcLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, dstTextureProperties.__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, dstTextureProperties.__webglTexture, dstLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// copy the data using the fastest function that can achieve the copy\n\t\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.COLOR_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t\t} else if ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.copyTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ + i, minX, minY, width, height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.copyTexSubImage2D( glTarget, dstLevel, dstX, dstY, minX, minY, width, height );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// unbind read, draw buffers\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t// copy data into the 3d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// copy data into the 2d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, image.width, image.height, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// reset values\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );\n\n\t\t\t// Generate mipmaps only when copying level 0\n\t\t\tif ( dstLevel === 0 && dstTexture.generateMipmaps ) {\n\n\t\t\t\t_gl.generateMipmap( glTarget );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the given WebGLRenderTarget memory. Useful for initializing a render target so data\n\t\t * can be copied into it using {@link WebGLRenderer#copyTextureToTexture} before it has been\n\t\t * rendered to.\n\t\t *\n\t\t * @param {WebGLRenderTarget} target - The render target.\n\t\t */\n\t\tthis.initRenderTarget = function ( target ) {\n\n\t\t\tif ( properties.get( target ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( target );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the given texture. Useful for preloading a texture rather than waiting until first\n\t\t * render (which can cause noticeable lags due to decode and GPU upload overhead).\n\t\t *\n\t\t * @param {Texture} texture - The texture.\n\t\t */\n\t\tthis.initTexture = function ( texture ) {\n\n\t\t\tif ( texture.isCubeTexture ) {\n\n\t\t\t\ttextures.setTextureCube( texture, 0 );\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( texture, 0 );\n\n\t\t\t} else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( texture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to reset the internal WebGL state. This method is mostly\n\t\t * relevant for applications which share a single WebGL context across\n\t\t * multiple WebGL libraries.\n\t\t */\n\t\tthis.resetState = function () {\n\n\t\t\t_currentActiveCubeFace = 0;\n\t\t\t_currentActiveMipmapLevel = 0;\n\t\t\t_currentRenderTarget = null;\n\n\t\t\tstate.reset();\n\t\t\tbindingStates.reset();\n\n\t\t};\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Defines the coordinate system of the renderer.\n\t *\n\t * In `WebGLRenderer`, the value is always `WebGLCoordinateSystem`.\n\t *\n\t * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}\n\t * @default WebGLCoordinateSystem\n\t * @readonly\n\t */\n\tget coordinateSystem() {\n\n\t\treturn WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * Defines the output color space of the renderer.\n\t *\n\t * @type {SRGBColorSpace|LinearSRGBColorSpace}\n\t * @default SRGBColorSpace\n\t */\n\tget outputColorSpace() {\n\n\t\treturn this._outputColorSpace;\n\n\t}\n\n\tset outputColorSpace( colorSpace ) {\n\n\t\tthis._outputColorSpace = colorSpace;\n\n\t\tconst gl = this.getContext();\n\t\tgl.drawingBufferColorSpace = ColorManagement._getDrawingBufferColorSpace( colorSpace );\n\t\tgl.unpackColorSpace = ColorManagement._getUnpackColorSpace();\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, ArrayCamera, BackSide, BoxGeometry, BufferAttribute, BufferGeometry, ByteType, CineonToneMapping, ClampToEdgeWrapping, Color, ColorManagement, ConstantAlphaFactor, ConstantColorFactor, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CustomToneMapping, Data3DTexture, DataArrayTexture, DataTexture, DepthFormat, DepthStencilFormat, DepthTexture, DoubleSide, DstAlphaFactor, DstColorFactor, EqualCompare, EqualDepth, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExternalTexture, FloatType, FrontSide, Frustum, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, HalfFloatType, IntType, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NoBlending, NoColorSpace, NoToneMapping, NormalBlending, NotEqualCompare, NotEqualDepth, ObjectSpaceNormalMap, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PerspectiveCamera, Plane, PlaneGeometry, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReverseSubtractEquation, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, ShaderChunk, ShaderLib, ShaderMaterial, ShortType, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, SubtractEquation, SubtractiveBlending, TangentSpaceNormalMap, Texture, Uint16BufferAttribute, Uint32BufferAttribute, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WebXRController, ZeroFactor, createCanvasElement, error, log, warn, warnOnce };\n","import * as E from \"three\";\nimport { Controls as Na, Vector3 as Z, MOUSE as fn, TOUCH as cn, Quaternion as Ri, Spherical as fr, Vector2 as ce, Ray as Js, Plane as Ui, MathUtils as Lo, Mesh as Qs, OrthographicCamera as Bo, BufferGeometry as Fi, Float32BufferAttribute as dr, ShaderMaterial as et, UniformsUtils as yt, WebGLRenderTarget as dn, HalfFloatType as pn, NoBlending as pt, Clock as Oa, Color as je, Matrix4 as Ae, DataTexture as Io, RepeatWrapping as Zt, MeshNormalMaterial as Ua, AddEquation as Hn, ZeroFactor as Gn, DstAlphaFactor as pr, DstColorFactor as mr, CustomBlending as Fa, DepthTexture as Va, DepthStencilFormat as ja, UnsignedInt248Type as Ha, NearestFilter as Di, RGBAFormat as Ga, UnsignedByteType as Wa, AdditiveBlending as Xa, MeshBasicMaterial as hn, RawShaderMaterial as qa, ColorManagement as Li, SRGBTransfer as Ka, LinearToneMapping as Za, ReinhardToneMapping as Ya, CineonToneMapping as $a, ACESFilmicToneMapping as Ja, AgXToneMapping as Qa, NeutralToneMapping as el, CustomToneMapping as tl, Loader as zo, FileLoader as Bi, SRGBColorSpace as Rt, LinearSRGBColorSpace as lt, BufferAttribute as at, InterleavedBuffer as No, InterleavedBufferAttribute as Oo, TrianglesDrawMode as nl, TriangleFanDrawMode as Rs, TriangleStripDrawMode as Uo, LoaderUtils as In, MeshPhysicalMaterial as ht, SpotLight as il, PointLight as sl, DirectionalLight as rl, InstancedMesh as ol, InstancedBufferAttribute as al, Object3D as Fo, TextureLoader as ll, ImageBitmapLoader as cl, LinearMipmapLinearFilter as Vo, NearestMipmapLinearFilter as hl, LinearMipmapNearestFilter as ul, NearestMipmapNearestFilter as fl, LinearFilter as Ds, MirroredRepeatWrapping as dl, ClampToEdgeWrapping as pl, PointsMaterial as ml, Material as Zi, LineBasicMaterial as gl, MeshStandardMaterial as jo, DoubleSide as Vi, PropertyBinding as yl, SkinnedMesh as wl, LineSegments as _l, Line as xl, LineLoop as bl, Points as vl, Group as Yi, PerspectiveCamera as Sl, Skeleton as Tl, AnimationClip as El, Bone as Ml, InterpolateDiscrete as Al, InterpolateLinear as Ho, Texture as gr, VectorKeyframeTrack as yr, NumberKeyframeTrack as wr, QuaternionKeyframeTrack as _r, FrontSide as Ls, Interpolant as Cl, Box3 as nt, Sphere as Pl, Line3 as Ze, Triangle as Oe, BackSide as kl, REVISION as Go, Vector4 as $t, Matrix3 as Rl } from \"three\";\nclass Dl {\n engine;\n scene;\n constructor(e) {\n this.engine = e, this.scene = new E.Scene();\n let t = new E.Group();\n t.name = \"groupEdge\", this.scene.add(t);\n }\n}\nclass Ll {\n engine;\n // 透视相机\n perspectiveCamera;\n // 正交相机\n orthographicCamera;\n constructor(e) {\n this.engine = e, this.perspectiveCamera = new E.PerspectiveCamera(\n 60,\n this.engine.container.clientWidth / this.engine.container.clientHeight,\n 0.1,\n 1e3\n ), this.perspectiveCamera.position.set(2, 2, 2), this.perspectiveCamera.lookAt(0, 0, 0);\n const t = 50, n = this.engine.container.clientWidth / this.engine.container.clientHeight;\n this.orthographicCamera = new E.OrthographicCamera(t * n / -2, t * n / 2, t / 2, t / -2, 0.1, 1e3);\n }\n // 切换当前相机\n switchCurrentCamera() {\n this.engine.camera === this.perspectiveCamera ? this.switchToOrthographicCamera() : this.switchToPerspectiveCamera();\n }\n // 透视相机\n switchToPerspectiveCamera() {\n const e = this.engine.camera.position.clone(), t = this.engine.controls.target.clone();\n this.engine.camera = this.perspectiveCamera, this.engine.scene.camera = this.perspectiveCamera, this.perspectiveCamera.position.copy(e), this.perspectiveCamera.lookAt(t), this.engine.controlModule.orbitControls.object = this.perspectiveCamera, this.engine.controlModule.firstPersonControls.camera = this.perspectiveCamera, this.engine.composerModule.init();\n }\n // 正交相机\n switchToOrthographicCamera() {\n const e = this.engine.camera.position.clone(), t = this.engine.controls.target.clone();\n this.engine.camera = this.orthographicCamera, this.engine.scene.camera = this.orthographicCamera, this.orthographicCamera.position.copy(e), this.orthographicCamera.lookAt(t), this.engine.controlModule.orbitControls.object = this.orthographicCamera, this.engine.controlModule.firstPersonControls.camera = this.orthographicCamera, this.engine.composerModule.init();\n }\n // 获取当前相机类型\n getCameraType() {\n return this.engine.camera === this.perspectiveCamera ? \"perspective\" : this.engine.camera === this.orthographicCamera ? \"orthographic\" : \"perspective\";\n }\n // 获取当前相机姿态\n getCameraPose() {\n const e = this.engine.camera, t = this.getCameraType(), n = {\n type: t,\n position: {\n x: e.position.x,\n y: e.position.y,\n z: e.position.z\n },\n rotation: {\n x: e.rotation.x,\n y: e.rotation.y,\n z: e.rotation.z\n },\n quaternion: {\n x: e.quaternion.x,\n y: e.quaternion.y,\n z: e.quaternion.z,\n w: e.quaternion.w\n }\n };\n return this.engine.controls && this.engine.controls.target && (n.target = {\n x: this.engine.controls.target.x,\n y: this.engine.controls.target.y,\n z: this.engine.controls.target.z\n }), t === \"orthographic\" && (n.zoom = e.zoom), n;\n }\n // 通过相机姿态还原相机位置\n restoreCameraPose(e) {\n this.getCameraType() !== e.type && (e.type === \"perspective\" ? this.switchToPerspectiveCamera() : this.switchToOrthographicCamera());\n const n = this.engine.camera;\n n.position.set(e.position.x, e.position.y, e.position.z), e.quaternion ? n.quaternion.set(\n e.quaternion.x,\n e.quaternion.y,\n e.quaternion.z,\n e.quaternion.w\n ) : e.rotation && n.rotation.set(e.rotation.x, e.rotation.y, e.rotation.z), e.target && this.engine.controls && this.engine.controls.target && this.engine.controls.target.set(\n e.target.x,\n e.target.y,\n e.target.z\n ), e.type === \"orthographic\" && e.zoom !== void 0 && (n.zoom = e.zoom, n.updateProjectionMatrix()), n.updateMatrix(), n.updateMatrixWorld(!0), this.engine.controls && this.engine.controls.update && this.engine.controls.update();\n }\n}\nclass Bl {\n engine;\n deviceType;\n constructor(e) {\n this.engine = e, this.deviceType = \"PC\";\n }\n // 获取设备类型\n getDeviceType() {\n return this.deviceType;\n }\n // 获取容器尺寸\n getContainerSize() {\n return {\n width: this.engine.container.clientWidth,\n height: this.engine.container.clientHeight\n };\n }\n}\nclass Il {\n engine;\n renderer;\n constructor(e) {\n this.engine = e, this.renderer = null;\n }\n createRenderer() {\n const { width: e, height: t } = this.engine.deviceModule.getContainerSize();\n return this.renderer = new E.WebGLRenderer({\n antialias: this.engine.options.antialias ?? !0,\n alpha: !0,\n premultipliedAlpha: !1,\n stencil: !0\n }), this.renderer.setClearColor(0, 0), this.renderer.setSize(e, t), this.renderer.setPixelRatio(window.devicePixelRatio), this.renderer.shadowMap.enabled = !0, this.renderer.shadowMap.type = E.PCFSoftShadowMap, this.renderer.localClippingEnabled = !0, this.renderer.outputColorSpace = E.SRGBColorSpace, this.renderer.toneMapping = E.ACESFilmicToneMapping, this.renderer.toneMappingExposure = 1.5, this.engine.container.appendChild(this.renderer.domElement), this.renderer;\n }\n disposeRenderer() {\n this.renderer?.dispose();\n }\n}\nconst xr = { type: \"change\" }, er = { type: \"start\" }, Wo = { type: \"end\" }, Wn = new Js(), br = new Ui(), zl = Math.cos(70 * Lo.DEG2RAD), be = new Z(), ze = 2 * Math.PI, de = {\n NONE: -1,\n ROTATE: 0,\n DOLLY: 1,\n PAN: 2,\n TOUCH_ROTATE: 3,\n TOUCH_PAN: 4,\n TOUCH_DOLLY_PAN: 5,\n TOUCH_DOLLY_ROTATE: 6\n}, $i = 1e-6;\nclass Nl extends Na {\n /**\n * Constructs a new controls instance.\n *\n * @param {Object3D} object - The object that is managed by the controls.\n * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n */\n constructor(e, t, n = null) {\n super(t, n), this.engine = e, this.state = de.NONE, this.target = new Z(), this.cursor = new Z(), this.origin = new Z(0, 0, 0), this.showOriginIcon = !0, this.originPosition = {\n x: 0,\n y: 0\n }, this.minDistance = 0, this.maxDistance = 1 / 0, this.minZoom = 0, this.maxZoom = 1 / 0, this.minTargetRadius = 0, this.maxTargetRadius = 1 / 0, this.minPolarAngle = 0, this.maxPolarAngle = Math.PI, this.minAzimuthAngle = -1 / 0, this.maxAzimuthAngle = 1 / 0, this.enableDamping = !1, this.dampingFactor = 0.05, this.enableZoom = !0, this.zoomSpeed = 1, this.enableRotate = !0, this.rotateSpeed = 1, this.keyRotateSpeed = 1, this.enablePan = !0, this.panSpeed = 1, this.screenSpacePanning = !0, this.keyPanSpeed = 7, this.zoomToCursor = !1, this.autoRotate = !1, this.autoRotateSpeed = 2, this.keys = { LEFT: \"ArrowLeft\", UP: \"ArrowUp\", RIGHT: \"ArrowRight\", BOTTOM: \"ArrowDown\" }, this.mouseButtons = { LEFT: fn.ROTATE, MIDDLE: fn.DOLLY, RIGHT: fn.PAN }, this.touches = { ONE: cn.ROTATE, TWO: cn.DOLLY_PAN }, this.target0 = this.target.clone(), this.position0 = this.object.position.clone(), this.zoom0 = this.object.zoom, this._domElementKeyEvents = null, this._lastPosition = new Z(), this._lastQuaternion = new Ri(), this._lastTargetPosition = new Z(), this._quat = new Ri().setFromUnitVectors(t.up, new Z(0, 1, 0)), this._quatInverse = this._quat.clone().invert(), this._spherical = new fr(), this._sphericalDelta = new fr(), this._scale = 1, this._panOffset = new Z(), this._rotateStart = new ce(), this._rotateEnd = new ce(), this._rotateDelta = new ce(), this._panStart = new ce(), this._panEnd = new ce(), this._panDelta = new ce(), this._dollyStart = new ce(), this._dollyEnd = new ce(), this._dollyDelta = new ce(), this._dollyDirection = new Z(), this._mouse = new ce(), this._performCursorZoom = !1, this._pointers = [], this._pointerPositions = {}, this._controlActive = !1, this._onPointerMove = Ul.bind(this), this._onPointerDown = Ol.bind(this), this._onPointerUp = Fl.bind(this), this._onContextMenu = ql.bind(this), this._onMouseWheel = Hl.bind(this), this._onKeyDown = Gl.bind(this), this._onTouchStart = Wl.bind(this), this._onTouchMove = Xl.bind(this), this._onMouseDown = Vl.bind(this), this._onMouseMove = jl.bind(this), this._interceptControlDown = Kl.bind(this), this._interceptControlUp = Zl.bind(this), this.domElement !== null && this.connect(this.domElement), this.update();\n }\n connect(e) {\n super.connect(e), this.domElement.addEventListener(\"pointerdown\", this._onPointerDown), this.domElement.addEventListener(\"pointercancel\", this._onPointerUp), this.domElement.addEventListener(\"contextmenu\", this._onContextMenu), this.domElement.addEventListener(\"wheel\", this._onMouseWheel, { passive: !1 }), this.domElement.getRootNode().addEventListener(\"keydown\", this._interceptControlDown, { passive: !0, capture: !0 }), this.domElement.style.touchAction = \"none\";\n }\n disconnect() {\n this.domElement.removeEventListener(\"pointerdown\", this._onPointerDown), this.domElement.removeEventListener(\"pointermove\", this._onPointerMove), this.domElement.removeEventListener(\"pointerup\", this._onPointerUp), this.domElement.removeEventListener(\"pointercancel\", this._onPointerUp), this.domElement.removeEventListener(\"wheel\", this._onMouseWheel), this.domElement.removeEventListener(\"contextmenu\", this._onContextMenu), this.stopListenToKeyEvents(), this.domElement.getRootNode().removeEventListener(\"keydown\", this._interceptControlDown, { capture: !0 }), this.domElement.style.touchAction = \"auto\";\n }\n dispose() {\n this.disconnect();\n }\n /**\n * Get the current vertical rotation, in radians.\n *\n * @return {number} The current vertical rotation, in radians.\n */\n getPolarAngle() {\n return this._spherical.phi;\n }\n /**\n * Get the current horizontal rotation, in radians.\n *\n * @return {number} The current horizontal rotation, in radians.\n */\n getAzimuthalAngle() {\n return this._spherical.theta;\n }\n /**\n * Returns the distance from the camera to the target.\n *\n * @return {number} The distance from the camera to the target.\n */\n getDistance() {\n return this.object.position.distanceTo(this.target);\n }\n /**\n * Adds key event listeners to the given DOM element.\n * `window` is a recommended argument for using this method.\n *\n * @param {HTMLElement} domElement - The DOM element\n */\n listenToKeyEvents(e) {\n e.addEventListener(\"keydown\", this._onKeyDown), this._domElementKeyEvents = e;\n }\n /**\n * Removes the key event listener previously defined with `listenToKeyEvents()`.\n */\n stopListenToKeyEvents() {\n this._domElementKeyEvents !== null && (this._domElementKeyEvents.removeEventListener(\"keydown\", this._onKeyDown), this._domElementKeyEvents = null);\n }\n /**\n * Save the current state of the controls. This can later be recovered with `reset()`.\n */\n saveState() {\n this.target0.copy(this.target), this.position0.copy(this.object.position), this.zoom0 = this.object.zoom;\n }\n /**\n * Reset the controls to their state from either the last time the `saveState()`\n * was called, or the initial state.\n */\n reset() {\n this.target.copy(this.target0), this.object.position.copy(this.position0), this.object.zoom = this.zoom0, this.object.updateProjectionMatrix(), this.dispatchEvent(xr), this.update(), this.state = de.NONE;\n }\n update(e = null) {\n this.engine && this.engine.interactionManager && this.engine.interactionManager.origin && this.origin.copy(this.engine.interactionManager.origin);\n const t = this.object.position;\n be.copy(t).sub(this.target), be.applyQuaternion(this._quat), this._spherical.setFromVector3(be), this.autoRotate && this.state === de.NONE && this._rotateLeft(this._getAutoRotationAngle(e)), this.enableDamping ? (this._spherical.theta += this._sphericalDelta.theta * this.dampingFactor, this._spherical.phi += this._sphericalDelta.phi * this.dampingFactor) : (this._spherical.theta += this._sphericalDelta.theta, this._spherical.phi += this._sphericalDelta.phi);\n let n = this.minAzimuthAngle, i = this.maxAzimuthAngle;\n isFinite(n) && isFinite(i) && (n < -Math.PI ? n += ze : n > Math.PI && (n -= ze), i < -Math.PI ? i += ze : i > Math.PI && (i -= ze), n <= i ? this._spherical.theta = Math.max(n, Math.min(i, this._spherical.theta)) : this._spherical.theta = this._spherical.theta > (n + i) / 2 ? Math.max(n, this._spherical.theta) : Math.min(i, this._spherical.theta)), this._spherical.phi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, this._spherical.phi)), this._spherical.makeSafe(), this.enableDamping === !0 ? this.target.addScaledVector(this._panOffset, this.dampingFactor) : this.target.add(this._panOffset), this.target.sub(this.cursor), this.target.clampLength(this.minTargetRadius, this.maxTargetRadius), this.target.add(this.cursor);\n let o = !1;\n if (this.zoomToCursor && this._performCursorZoom || this.object.isOrthographicCamera)\n this._spherical.radius = this._clampDistance(this._spherical.radius);\n else {\n const r = this._spherical.radius;\n this._spherical.radius = this._clampDistance(this._spherical.radius * this._scale), o = r != this._spherical.radius;\n }\n if (be.setFromSpherical(this._spherical), be.applyQuaternion(this._quatInverse), this.engine && this.engine.DeviceType === \"PC\") {\n const r = new Z();\n if (r.copy(this.origin).sub(this.target), r.lengthSq() > 1e-4 && (this._sphericalDelta.theta !== 0 || this._sphericalDelta.phi !== 0)) {\n const l = this.enableDamping ? this.dampingFactor * 3 : 1, h = new Z(0, 1, 0), c = new Z();\n this.object.getWorldDirection(c);\n const u = c.clone().cross(h).normalize(), d = new Z().copy(this.object.position).sub(this.origin);\n d.applyAxisAngle(h, Math.PI * this._sphericalDelta.theta * l), d.applyAxisAngle(u, Math.PI * this._sphericalDelta.phi * l), t.copy(this.origin).add(d);\n const p = new Z().copy(this.target).sub(this.origin);\n p.applyAxisAngle(h, Math.PI * this._sphericalDelta.theta * l), p.applyAxisAngle(u, Math.PI * this._sphericalDelta.phi * l), this.target.copy(this.origin).add(p);\n } else if (this._panOffset.lengthSq() === 0 && this._sphericalDelta.phi === 0 && this._sphericalDelta.theta === 0) {\n if (this._scale !== 1) {\n const l = new Z();\n this.object.getWorldDirection(l);\n const h = this._spherical.radius * 0.05 * (this._scale - 1);\n t.add(l.multiplyScalar(h));\n }\n } else\n t.copy(this.target).add(be);\n this.object.lookAt(this.target);\n } else\n t.copy(this.target).add(be), this.object.lookAt(this.target);\n if (this.enableDamping === !0 ? (this._sphericalDelta.theta *= 1 - this.dampingFactor, this._sphericalDelta.phi *= 1 - this.dampingFactor, this._panOffset.multiplyScalar(1 - this.dampingFactor)) : (this._sphericalDelta.set(0, 0, 0), this._panOffset.set(0, 0, 0)), this.zoomToCursor && this._performCursorZoom) {\n let r = null;\n if (this.object.isPerspectiveCamera) {\n const a = be.length();\n r = this._clampDistance(a * this._scale);\n const l = a - r;\n this.object.position.addScaledVector(this._dollyDirection, l), this.object.updateMatrixWorld(), o = !!l;\n } else if (this.object.isOrthographicCamera) {\n const a = new Z(this._mouse.x, this._mouse.y, 0);\n a.unproject(this.object);\n const l = this.object.zoom;\n this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / this._scale)), this.object.updateProjectionMatrix(), o = l !== this.object.zoom;\n const h = new Z(this._mouse.x, this._mouse.y, 0);\n h.unproject(this.object), this.object.position.sub(h).add(a), this.object.updateMatrixWorld(), r = be.length();\n } else\n console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.\"), this.zoomToCursor = !1;\n r !== null && (this.screenSpacePanning ? this.target.set(0, 0, -1).transformDirection(this.object.matrix).multiplyScalar(r).add(this.object.position) : (Wn.origin.copy(this.object.position), Wn.direction.set(0, 0, -1).transformDirection(this.object.matrix), Math.abs(this.object.up.dot(Wn.direction)) < zl ? this.object.lookAt(this.target) : (br.setFromNormalAndCoplanarPoint(this.object.up, this.target), Wn.intersectPlane(br, this.target))));\n } else if (this.object.isOrthographicCamera) {\n const r = this.object.zoom;\n this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / this._scale)), r !== this.object.zoom && (this.object.updateProjectionMatrix(), o = !0);\n }\n return this._scale = 1, this._performCursorZoom = !1, o || this._lastPosition.distanceToSquared(this.object.position) > $i || 8 * (1 - this._lastQuaternion.dot(this.object.quaternion)) > $i || this._lastTargetPosition.distanceToSquared(this.target) > $i ? (this.dispatchEvent(xr), this._lastPosition.copy(this.object.position), this._lastQuaternion.copy(this.object.quaternion), this._lastTargetPosition.copy(this.target), !0) : !1;\n }\n _getAutoRotationAngle(e) {\n return e !== null ? ze / 60 * this.autoRotateSpeed * e : ze / 60 / 60 * this.autoRotateSpeed;\n }\n _getZoomScale(e) {\n const t = Math.abs(e * 0.01);\n return Math.pow(0.95, this.zoomSpeed * t);\n }\n _rotateLeft(e) {\n this._sphericalDelta.theta -= e;\n }\n _rotateUp(e) {\n this._sphericalDelta.phi -= e;\n }\n _panLeft(e, t) {\n be.setFromMatrixColumn(t, 0), be.multiplyScalar(-e), this._panOffset.add(be);\n }\n _panUp(e, t) {\n this.screenSpacePanning === !0 ? be.setFromMatrixColumn(t, 1) : (be.setFromMatrixColumn(t, 0), be.crossVectors(this.object.up, be)), be.multiplyScalar(e), this._panOffset.add(be);\n }\n // deltaX and deltaY are in pixels; right and down are positive\n _pan(e, t) {\n const n = this.domElement;\n if (this.object.isPerspectiveCamera) {\n const i = this.object.position;\n be.copy(i).sub(this.target);\n let o = be.length();\n o *= Math.tan(this.object.fov / 2 * Math.PI / 180), this._panLeft(2 * e * o / n.clientHeight, this.object.matrix), this._panUp(2 * t * o / n.clientHeight, this.object.matrix);\n } else this.object.isOrthographicCamera ? (this._panLeft(e * (this.object.right - this.object.left) / this.object.zoom / n.clientWidth, this.object.matrix), this._panUp(t * (this.object.top - this.object.bottom) / this.object.zoom / n.clientHeight, this.object.matrix)) : (console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\"), this.enablePan = !1);\n }\n _dollyOut(e) {\n this.object.isPerspectiveCamera || this.object.isOrthographicCamera ? this._scale /= e : (console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\"), this.enableZoom = !1);\n }\n _dollyIn(e) {\n this.object.isPerspectiveCamera || this.object.isOrthographicCamera ? this._scale *= e : (console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\"), this.enableZoom = !1);\n }\n _updateZoomParameters(e, t) {\n if (!this.zoomToCursor)\n return;\n this._performCursorZoom = !0;\n const n = this.domElement.getBoundingClientRect(), i = e - n.left, o = t - n.top, r = n.width, a = n.height;\n this._mouse.x = i / r * 2 - 1, this._mouse.y = -(o / a) * 2 + 1, this._dollyDirection.set(this._mouse.x, this._mouse.y, 1).unproject(this.object).sub(this.object.position).normalize();\n }\n _clampDistance(e) {\n return Math.max(this.minDistance, Math.min(this.maxDistance, e));\n }\n //\n // event callbacks - update the object state\n //\n _handleMouseDownRotate(e) {\n this._rotateStart.set(e.clientX, e.clientY);\n }\n _handleMouseDownDolly(e) {\n this._updateZoomParameters(e.clientX, e.clientX), this._dollyStart.set(e.clientX, e.clientY);\n }\n _handleMouseDownPan(e) {\n this._panStart.set(e.clientX, e.clientY);\n }\n _handleMouseMoveRotate(e) {\n this._rotateEnd.set(e.clientX, e.clientY), this._rotateDelta.subVectors(this._rotateEnd, this._rotateStart).multiplyScalar(this.rotateSpeed);\n const t = this.domElement;\n this._rotateLeft(ze * this._rotateDelta.x / t.clientHeight), this._rotateUp(ze * this._rotateDelta.y / t.clientHeight), this._rotateStart.copy(this._rotateEnd), this.update();\n }\n _handleMouseMoveDolly(e) {\n this._dollyEnd.set(e.clientX, e.clientY), this._dollyDelta.subVectors(this._dollyEnd, this._dollyStart), this._dollyDelta.y > 0 ? this._dollyOut(this._getZoomScale(this._dollyDelta.y)) : this._dollyDelta.y < 0 && this._dollyIn(this._getZoomScale(this._dollyDelta.y)), this._dollyStart.copy(this._dollyEnd), this.update();\n }\n _handleMouseMovePan(e) {\n this._panEnd.set(e.clientX, e.clientY), this._panDelta.subVectors(this._panEnd, this._panStart).multiplyScalar(this.panSpeed), this._pan(this._panDelta.x, this._panDelta.y), this._panStart.copy(this._panEnd), this.update();\n }\n _handleMouseWheel(e) {\n this._updateZoomParameters(e.clientX, e.clientY), e.deltaY < 0 ? this._dollyIn(this._getZoomScale(e.deltaY)) : e.deltaY > 0 && this._dollyOut(this._getZoomScale(e.deltaY)), this.update();\n }\n _handleKeyDown(e) {\n let t = !1;\n switch (e.code) {\n case this.keys.UP:\n e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateUp(ze * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(0, this.keyPanSpeed), t = !0;\n break;\n case this.keys.BOTTOM:\n e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateUp(-ze * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(0, -this.keyPanSpeed), t = !0;\n break;\n case this.keys.LEFT:\n e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateLeft(ze * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(this.keyPanSpeed, 0), t = !0;\n break;\n case this.keys.RIGHT:\n e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateLeft(-ze * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(-this.keyPanSpeed, 0), t = !0;\n break;\n }\n t && (e.preventDefault(), this.update());\n }\n _handleTouchStartRotate(e) {\n if (this._pointers.length === 1)\n this._rotateStart.set(e.pageX, e.pageY);\n else {\n const t = this._getSecondPointerPosition(e), n = 0.5 * (e.pageX + t.x), i = 0.5 * (e.pageY + t.y);\n this._rotateStart.set(n, i);\n }\n }\n _handleTouchStartPan(e) {\n if (this._pointers.length === 1)\n this._panStart.set(e.pageX, e.pageY);\n else {\n const t = this._getSecondPointerPosition(e), n = 0.5 * (e.pageX + t.x), i = 0.5 * (e.pageY + t.y);\n this._panStart.set(n, i);\n }\n }\n _handleTouchStartDolly(e) {\n const t = this._getSecondPointerPosition(e), n = e.pageX - t.x, i = e.pageY - t.y, o = Math.sqrt(n * n + i * i);\n this._dollyStart.set(0, o);\n }\n _handleTouchStartDollyPan(e) {\n this.enableZoom && this._handleTouchStartDolly(e), this.enablePan && this._handleTouchStartPan(e);\n }\n _handleTouchStartDollyRotate(e) {\n this.enableZoom && this._handleTouchStartDolly(e), this.enableRotate && this._handleTouchStartRotate(e);\n }\n _handleTouchMoveRotate(e) {\n if (this._pointers.length == 1)\n this._rotateEnd.set(e.pageX, e.pageY);\n else {\n const n = this._getSecondPointerPosition(e), i = 0.5 * (e.pageX + n.x), o = 0.5 * (e.pageY + n.y);\n this._rotateEnd.set(i, o);\n }\n this._rotateDelta.subVectors(this._rotateEnd, this._rotateStart).multiplyScalar(this.rotateSpeed);\n const t = this.domElement;\n this._rotateLeft(ze * this._rotateDelta.x / t.clientHeight), this._rotateUp(ze * this._rotateDelta.y / t.clientHeight), this._rotateStart.copy(this._rotateEnd);\n }\n _handleTouchMovePan(e) {\n if (this._pointers.length === 1)\n this._panEnd.set(e.pageX, e.pageY);\n else {\n const t = this._getSecondPointerPosition(e), n = 0.5 * (e.pageX + t.x), i = 0.5 * (e.pageY + t.y);\n this._panEnd.set(n, i);\n }\n this._panDelta.subVectors(this._panEnd, this._panStart).multiplyScalar(this.panSpeed), this._pan(this._panDelta.x, this._panDelta.y), this._panStart.copy(this._panEnd);\n }\n _handleTouchMoveDolly(e) {\n const t = this._getSecondPointerPosition(e), n = e.pageX - t.x, i = e.pageY - t.y, o = Math.sqrt(n * n + i * i);\n this._dollyEnd.set(0, o), this._dollyDelta.set(0, Math.pow(this._dollyEnd.y / this._dollyStart.y, this.zoomSpeed)), this._dollyOut(this._dollyDelta.y), this._dollyStart.copy(this._dollyEnd);\n const r = (e.pageX + t.x) * 0.5, a = (e.pageY + t.y) * 0.5;\n this._updateZoomParameters(r, a);\n }\n _handleTouchMoveDollyPan(e) {\n this.enableZoom && this._handleTouchMoveDolly(e), this.enablePan && this._handleTouchMovePan(e);\n }\n _handleTouchMoveDollyRotate(e) {\n this.enableZoom && this._handleTouchMoveDolly(e), this.enableRotate && this._handleTouchMoveRotate(e);\n }\n // pointers\n _addPointer(e) {\n this._pointers.push(e.pointerId);\n }\n _removePointer(e) {\n delete this._pointerPositions[e.pointerId];\n for (let t = 0; t < this._pointers.length; t++)\n if (this._pointers[t] == e.pointerId) {\n this._pointers.splice(t, 1);\n return;\n }\n }\n _isTrackingPointer(e) {\n for (let t = 0; t < this._pointers.length; t++)\n if (this._pointers[t] == e.pointerId) return !0;\n return !1;\n }\n _trackPointer(e) {\n let t = this._pointerPositions[e.pointerId];\n t === void 0 && (t = new ce(), this._pointerPositions[e.pointerId] = t), t.set(e.pageX, e.pageY);\n }\n _getSecondPointerPosition(e) {\n const t = e.pointerId === this._pointers[0] ? this._pointers[1] : this._pointers[0];\n return this._pointerPositions[t];\n }\n //\n _customWheelEvent(e) {\n const t = e.deltaMode, n = {\n clientX: e.clientX,\n clientY: e.clientY,\n deltaY: e.deltaY\n };\n switch (t) {\n case 1:\n n.deltaY *= 16;\n break;\n case 2:\n n.deltaY *= 100;\n break;\n }\n return e.ctrlKey && !this._controlActive && (n.deltaY *= 10), n;\n }\n}\nfunction Ol(s) {\n this.enabled !== !1 && (this._pointers.length === 0 && (this.domElement.setPointerCapture(s.pointerId), this.domElement.addEventListener(\"pointermove\", this._onPointerMove), this.domElement.addEventListener(\"pointerup\", this._onPointerUp)), !this._isTrackingPointer(s) && (this._addPointer(s), s.pointerType === \"touch\" ? this._onTouchStart(s) : this._onMouseDown(s)));\n}\nfunction Ul(s) {\n this.enabled !== !1 && (s.pointerType === \"touch\" ? this._onTouchMove(s) : this._onMouseMove(s));\n}\nfunction Fl(s) {\n switch (this._removePointer(s), this._pointers.length) {\n case 0:\n this.domElement.releasePointerCapture(s.pointerId), this.domElement.removeEventListener(\"pointermove\", this._onPointerMove), this.domElement.removeEventListener(\"pointerup\", this._onPointerUp), this.dispatchEvent(Wo), this.state = de.NONE;\n break;\n case 1:\n const e = this._pointers[0], t = this._pointerPositions[e];\n this._onTouchStart({ pointerId: e, pageX: t.x, pageY: t.y });\n break;\n }\n}\nfunction Vl(s) {\n if (this.showOriginIcon && this.engine && this.engine.ToolUntils) {\n const t = this.engine.scene?.camera || this.object;\n this.originPosition = this.engine.ToolUntils.WorldPointToScreenPoint(this.origin.clone(), t), console.log(\"Origin position:\", this.originPosition, \"Origin:\", this.origin);\n }\n let e;\n switch (s.button) {\n case 0:\n e = this.mouseButtons.LEFT;\n break;\n case 1:\n e = this.mouseButtons.MIDDLE;\n break;\n case 2:\n e = this.mouseButtons.RIGHT;\n break;\n default:\n e = -1;\n }\n switch (e) {\n case fn.DOLLY:\n if (this.enableZoom === !1) return;\n this._handleMouseDownDolly(s), this.state = de.DOLLY;\n break;\n case fn.ROTATE:\n if (s.ctrlKey || s.metaKey || s.shiftKey) {\n if (this.enablePan === !1) return;\n this._handleMouseDownPan(s), this.state = de.PAN;\n } else {\n if (this.enableRotate === !1) return;\n this._handleMouseDownRotate(s), this.state = de.ROTATE;\n }\n break;\n case fn.PAN:\n if (s.ctrlKey || s.metaKey || s.shiftKey) {\n if (this.enableRotate === !1) return;\n this._handleMouseDownRotate(s), this.state = de.ROTATE;\n } else {\n if (this.enablePan === !1) return;\n this._handleMouseDownPan(s), this.state = de.PAN;\n }\n break;\n default:\n this.state = de.NONE;\n }\n this.state !== de.NONE && this.dispatchEvent(er);\n}\nfunction jl(s) {\n switch (this.state) {\n case de.ROTATE:\n if (this.enableRotate === !1) return;\n this._handleMouseMoveRotate(s);\n break;\n case de.DOLLY:\n if (this.enableZoom === !1) return;\n this._handleMouseMoveDolly(s);\n break;\n case de.PAN:\n if (this.enablePan === !1) return;\n this._handleMouseMovePan(s);\n break;\n }\n}\nfunction Hl(s) {\n this.enabled === !1 || this.enableZoom === !1 || this.state !== de.NONE || (s.preventDefault(), this.dispatchEvent(er), this._handleMouseWheel(this._customWheelEvent(s)), this.dispatchEvent(Wo));\n}\nfunction Gl(s) {\n this.enabled !== !1 && this._handleKeyDown(s);\n}\nfunction Wl(s) {\n switch (this._trackPointer(s), this._pointers.length) {\n case 1:\n switch (this.touches.ONE) {\n case cn.ROTATE:\n if (this.enableRotate === !1) return;\n this._handleTouchStartRotate(s), this.state = de.TOUCH_ROTATE;\n break;\n case cn.PAN:\n if (this.enablePan === !1) return;\n this._handleTouchStartPan(s), this.state = de.TOUCH_PAN;\n break;\n default:\n this.state = de.NONE;\n }\n break;\n case 2:\n switch (this.touches.TWO) {\n case cn.DOLLY_PAN:\n if (this.enableZoom === !1 && this.enablePan === !1) return;\n this._handleTouchStartDollyPan(s), this.state = de.TOUCH_DOLLY_PAN;\n break;\n case cn.DOLLY_ROTATE:\n if (this.enableZoom === !1 && this.enableRotate === !1) return;\n this._handleTouchStartDollyRotate(s), this.state = de.TOUCH_DOLLY_ROTATE;\n break;\n default:\n this.state = de.NONE;\n }\n break;\n default:\n this.state = de.NONE;\n }\n this.state !== de.NONE && this.dispatchEvent(er);\n}\nfunction Xl(s) {\n switch (this._trackPointer(s), this.state) {\n case de.TOUCH_ROTATE:\n if (this.enableRotate === !1) return;\n this._handleTouchMoveRotate(s), this.update();\n break;\n case de.TOUCH_PAN:\n if (this.enablePan === !1) return;\n this._handleTouchMovePan(s), this.update();\n break;\n case de.TOUCH_DOLLY_PAN:\n if (this.enableZoom === !1 && this.enablePan === !1) return;\n this._handleTouchMoveDollyPan(s), this.update();\n break;\n case de.TOUCH_DOLLY_ROTATE:\n if (this.enableZoom === !1 && this.enableRotate === !1) return;\n this._handleTouchMoveDollyRotate(s), this.update();\n break;\n default:\n this.state = de.NONE;\n }\n}\nfunction ql(s) {\n this.enabled !== !1 && s.preventDefault();\n}\nfunction Kl(s) {\n s.key === \"Control\" && (this._controlActive = !0, this.domElement.getRootNode().addEventListener(\"keyup\", this._interceptControlUp, { passive: !0, capture: !0 }));\n}\nfunction Zl(s) {\n s.key === \"Control\" && (this._controlActive = !1, this.domElement.getRootNode().removeEventListener(\"keyup\", this._interceptControlUp, { passive: !0, capture: !0 }));\n}\nclass vr {\n constructor(e, t, n, i) {\n this._Engine = e, this.camera = t, this.domElement = n, this._isEnabled = !1, this._rayOriginOffset = new E.Vector3(0, -1, 0), this._camerLocalDirection = new E.Vector3(), this._tmpVector = new E.Vector3(), this._rayCaster = new E.Raycaster(), this._fallingTime = 0, this._euler = new E.Euler(0, 0, 0, \"YZX\"), this._prevMouseX = 0, this._prevMouseY = 0, this.applyGravity = !1, this.gravityMinHeight = !0, this.applyCollision = !0, this.positionEasing = !0, this.lookflag = 1, this.lookSpeed = 8e-3, this.moveSpeed = 0.02, this.playerHeight = 1.4, this.maxRotateX = 0.8, this.g = 9.8, this.bindmousedown = this._Engine && this._Engine.DeviceType !== \"PC\" ? this.onTouchStart.bind(this) : this.onMouseDown.bind(this), this.bindmouseup = this._Engine && this._Engine.DeviceType !== \"PC\" ? this.onTouchEnd.bind(this) : this.onMouseUp.bind(this), this.bindmousemove = this._Engine && this._Engine.DeviceType !== \"PC\" ? this.onTouchMove.bind(this) : this.onMouseMove.bind(this), this.bindonKeyDown = this.onKeyDown.bind(this), this.bindonKeyUp = this.onKeyUp.bind(this), this.bindMousewheel = this.onMousewheel.bind(this), this.needMousewheel = !1, this.moveWheelRun = !0, this.moveWheelStop = !1, this.wheelClock, this.keydown = !1, this.GetEngine = () => e;\n }\n /**\n * @param {Object} colliders set objects for collision detection\n */\n set colliders(e) {\n this._rayCastObjects = e;\n }\n /**\n * @param {boolean} isEnabled set if this camera control is enabled\n */\n set enabled(e) {\n this._isEnabled !== e && (this._isEnabled = e, this._euler.setFromQuaternion(this.camera.quaternion), e ? this.addEvents() : this.removeEvents());\n }\n /**\n * @description: getter if current camera control is enabled.\n */\n get enabled() {\n return this._isEnabled;\n }\n addEvents() {\n const e = this._Engine?.DeviceType, t = e === \"PC\" || !e;\n console.log(\"[FirstPersonCameraControl] addEvents - DeviceType:\", e, \"isPC:\", t), t ? (console.log(\"[FirstPersonCameraControl] 添加鼠标事件监听器 - mousedown, mouseup\"), this.domElement.addEventListener(\"mousedown\", this.bindmousedown, !1), this.domElement.addEventListener(\"mouseup\", this.bindmouseup, !1)) : (console.log(\"[FirstPersonCameraControl] 添加触摸事件监听器\"), this.domElement.addEventListener(\"touchstart\", this.bindmousedown, !1), this.domElement.addEventListener(\"touchend\", this.bindmouseup, !1)), window.addEventListener(\"keydown\", this.bindonKeyDown, !1), window.addEventListener(\"keyup\", this.bindonKeyUp, !1), this.needMousewheel && (document.addEventListener && document.addEventListener(\"DOMMouseScroll\", this.bindMousewheel, !1), window.addEventListener(\"mousewheel\", this.bindMousewheel, !1));\n }\n removeEvents() {\n this._Engine && this._Engine.DeviceType !== \"PC\" ? (this.domElement.removeEventListener(\"touchstart\", this.bindmousedown), this.domElement.removeEventListener(\"touchend\", this.bindmouseup), this.domElement.removeEventListener(\"touchmove\", this.bindmousemove)) : (this.domElement.removeEventListener(\"mousedown\", this.bindmousedown), this.domElement.removeEventListener(\"mouseup\", this.bindmouseup), this.domElement.removeEventListener(\"mousemove\", this.bindmousemove)), window.removeEventListener(\"keydown\", this.bindonKeyDown), window.removeEventListener(\"keyup\", this.bindonKeyUp), this.needMousewheel && (document.addEventListener && document.removeEventListener(\"DOMMouseScroll\", this.bindMousewheel), window.removeEventListener(\"mousewheel\", this.bindMousewheel));\n }\n onMousewheel(e) {\n debugger;\n let t;\n switch (e.wheelDelta ? (e.wheelDelta > 0 && (t = \"up\"), e.wheelDelta < 0 && (t = \"down\")) : e.detail && (e.detail < 0 && (t = \"up\"), e.detail > 0 && (t = \"down\")), t) {\n case \"up\":\n this._camerLocalDirection.z = 1;\n break;\n case \"down\":\n this._camerLocalDirection.z = -1;\n break;\n }\n this.moveWheelRun == !0 ? (this.moveWheelRun = !1, this.moveWheelStop = !0, this.wheelClock = setTimeout(() => {\n this.moveWheelStop == !0 && (this.moveWheelStop = !1, this.moveWheelRun = !0, this._camerLocalDirection.z = 0);\n }, 200)) : (clearTimeout(this.wheelClock), this.wheelClock = setTimeout(() => {\n this.moveWheelStop == !0 && (this.moveWheelStop = !1, this.moveWheelRun = !0, this._camerLocalDirection.z = 0);\n }, 150));\n }\n onMouseDown(e) {\n console.log(\"[FirstPersonCameraControl] onMouseDown 被调用\", e), this.domElement.addEventListener(\"mousemove\", this.bindmousemove, !1), this._prevMouseX = e.screenX, this._prevMouseY = e.screenY;\n }\n onMouseMove(e) {\n if (this._isEnabled == !1)\n return;\n let t = this._prevMouseX ? e.screenX - this._prevMouseX : 0, n = this._prevMouseY ? e.screenY - this._prevMouseY : 0, i = this._euler.x - n * this.lookflag * this.lookSpeed;\n i >= 0 ? i < this.maxRotateX ? this._euler.x = i : this._euler.x = this.maxRotateX : i > -this.maxRotateX ? this._euler.x = i : this._euler.x = -this.maxRotateX, this._euler.y -= t * this.lookSpeed, this.camera.quaternion.setFromEuler(this._euler), this._prevMouseX = e.screenX, this._prevMouseY = e.screenY;\n let o = this.GetEngine();\n o.movefirst = !0;\n var r = new CustomEvent(\"bimengine:camerachange\", {\n detail: \"\"\n });\n window.dispatchEvent(r);\n }\n onMouseUp(e) {\n let t = this.GetEngine();\n t.movefirst = !1, this.domElement.removeEventListener(\"mousemove\", this.bindmousemove);\n }\n onTouchStart(e) {\n this.domElement.addEventListener(\"touchmove\", this.bindmousemove, !1), this._prevMouseX = e.targetTouches[0].clientX, this._prevMouseY = e.targetTouches[0].clientY;\n }\n onTouchMove(e) {\n if (this._isEnabled == !1)\n return;\n let t = this._prevMouseX ? e.targetTouches[0].clientX - this._prevMouseX : 0, n = this._prevMouseY ? e.targetTouches[0].clientY - this._prevMouseY : 0, i = this._euler.x - n * this.lookflag * this.lookSpeed;\n i >= 0 ? i < this.maxRotateX ? this._euler.x = i : this._euler.x = this.maxRotateX : i > -this.maxRotateX ? this._euler.x = i : this._euler.x = -this.maxRotateX, this._euler.y -= t * this.lookSpeed, this.camera.quaternion.setFromEuler(this._euler), this._prevMouseX = e.targetTouches[0].clientX, this._prevMouseY = e.targetTouches[0].clientY;\n let o = this.GetEngine();\n o.movefirst = !0;\n var r = new CustomEvent(\"bimengine:camerachange\", {\n detail: \"\"\n });\n window.dispatchEvent(r);\n }\n onTouchEnd(e) {\n let t = this.GetEngine();\n t.movefirst = !1, this.domElement.removeEventListener(\"touchmove\", this.bindmousemove);\n }\n onKeyDown(e) {\n var t = new CustomEvent(\"bimengine:camerachange\", {\n detail: \"\"\n });\n let n = this.GetEngine();\n switch (n.movefirst = !0, window.dispatchEvent(t), e.keyCode) {\n case 38:\n this.rotateY(-1);\n break;\n case 81:\n this.keydown = !0, this._camerLocalDirection.y = 1;\n break;\n case 69:\n this._camerLocalDirection.y = -1;\n break;\n case 87:\n this._camerLocalDirection.z = 1;\n break;\n case 37:\n this.rotateX(-1);\n break;\n case 65:\n this._camerLocalDirection.x = -1;\n break;\n case 40:\n this.rotateY(1);\n break;\n case 83:\n this._camerLocalDirection.z = -1;\n break;\n case 39:\n this.rotateX(1);\n break;\n case 68:\n this._camerLocalDirection.x = 1;\n break;\n }\n }\n onKeyUp(e) {\n let t = this.GetEngine();\n switch (t.movefirst = !1, e.keyCode) {\n case 38:\n // up\n case 87:\n this._camerLocalDirection.z = 0;\n break;\n case 37:\n // left\n case 65:\n this._camerLocalDirection.x = 0;\n break;\n case 40:\n // down\n case 83:\n this._camerLocalDirection.z = 0;\n break;\n case 39:\n // right\n case 68:\n this._camerLocalDirection.x = 0;\n break;\n case 81:\n case 69:\n this.keydown = !1, this._camerLocalDirection.y = 0;\n break;\n }\n }\n /**\n * @description: rotate camera by left/right\n * @param {Number} value\n * @return: null\n */\n rotateX(e) {\n this._euler.y -= e * this.lookSpeed, this.camera.quaternion.setFromEuler(this._euler);\n }\n /**\n * @description: rotate camera by up/down\n * @param {Number} value\n * @return: null\n */\n rotateY(e) {\n let t = this._euler.x - e * this.lookflag * 0.5 * this.lookSpeed;\n t >= 0 ? t < this.maxRotateX ? this._euler.x = t : this._euler.x = this.maxRotateX : t > -this.maxRotateX ? this._euler.x = t : this._euler.x = -this.maxRotateX, this.camera.quaternion.setFromEuler(this._euler);\n }\n /**\n * @description: update current calcuate each frame.\n */\n update() {\n this.keydown || this.gravityTest(), this.collisionTest();\n }\n gravityTest() {\n if (this.applyGravity) {\n let e = !0;\n this._fallingTime += 0.01, this._tmpVector.set(0, -1, 0);\n const t = this.hitTest();\n if (t) {\n const n = t.point.add(new E.Vector3(0, this.playerHeight, 0));\n if (this.positionEasing) {\n if (n.y >= this.camera.position.y || n.y - this.camera.position.y < 0.2) {\n this.setCameraHeight(this.camera.position.y + (n.y - this.camera.position.y) * 0.08), this._fallingTime = 0, e = !1;\n return;\n }\n } else t.distance < this.playerHeight && (this.setCameraHeight(n.y), this._fallingTime = 0, e = !1);\n }\n e && this.setCameraHeight(this.camera.position.y - this.g * Math.pow(this._fallingTime, 2));\n } else\n this.setCameraHeight(this.camera.position.y);\n }\n collisionTest() {\n this._camerLocalDirection.x !== 0 && this.collisionTestX(), this._camerLocalDirection.z !== 0 && this.collisionTestZ(), this._camerLocalDirection.y !== 0 && this.collisionTestY();\n }\n collisionTestX() {\n let e = this.GetEngine();\n if (e.movefirst = !0, this._tmpVector.setFromMatrixColumn(this.camera.matrix, 0), this._tmpVector.multiplyScalar(this._camerLocalDirection.x), this.applyCollision) {\n const t = this.hitTest();\n if (t && t.distance < 0.3)\n return;\n }\n this.camera.position.addScaledVector(this._tmpVector, this.moveSpeed);\n }\n collisionTestZ() {\n let e = this.GetEngine();\n if (e.movefirst = !0, this._tmpVector.setFromMatrixColumn(this.camera.matrix, 0), this._tmpVector.crossVectors(this.camera.up, this._tmpVector), this._tmpVector.multiplyScalar(this._camerLocalDirection.z), this.applyCollision) {\n const t = this.hitTest();\n if (t && t.distance < 0.3)\n return;\n }\n this.camera.position.addScaledVector(this._tmpVector, this.moveSpeed);\n }\n collisionTestY() {\n let e = this.GetEngine();\n if (e.movefirst = !0, this._tmpVector.setFromMatrixColumn(this.camera.matrix, 0), this._tmpVector = new E.Vector3(0, 1, 0), this._tmpVector.multiplyScalar(this._camerLocalDirection.y), this.applyCollision) {\n const n = this.hitTest();\n if (n && n.distance < 0.3)\n return;\n }\n let t = this.camera.position.clone().addScaledVector(this._tmpVector, this.moveSpeed);\n this.setCameraHeight(t.y);\n }\n // 设置相机Y方向位置\n setCameraHeight(e) {\n let t = this.getMinHeight();\n this.gravityMinHeight && t !== void 0 && e < t ? this.camera.position.y = t : this.camera.position.y = e;\n }\n // 获得所有模型最低点\n getMinHeight() {\n let e, t = this.GetEngine(), n = t.ToolUntils ? t.ToolUntils.GetBoundingBox(t) : null;\n return t && n && (e = n.min.y), e;\n }\n hitTest() {\n const e = this.camera.position.clone().add(this._rayOriginOffset);\n this._rayCaster.ray.origin = e, this._rayCaster.ray.direction = this._tmpVector;\n var n = this.GetEngine().scene.ground;\n return n && n.material.type, null;\n }\n}\nfunction tr(s) {\n const e = {\n self: null,\n // 当前激活的行为对象\n options: null,\n // 行为配置选项\n mouseDownTime: 0,\n // 鼠标按下时的时间戳\n lastClickTime: 0\n // 上次点击时间\n };\n e.init = function(u, d) {\n e.self != null && e.self.disActive != null && e.self.disActive(), e.self = u, d == null && (d = {\n showCatch: !1\n }), e.options = d;\n }, e.render = function() {\n e.self && e.self.render != null && e.self.render();\n }, e.active = function() {\n s.container.addEventListener(\"mousedown\", a), s.container.addEventListener(\"mouseup\", h), s.container.addEventListener(\"mousemove\", l), window.addEventListener(\"keydown\", t), window.addEventListener(\"keyup\", n);\n }, e.disActive = function() {\n s.container.removeEventListener(\"mousedown\", a), s.container.removeEventListener(\"mouseup\", h), s.container.removeEventListener(\"mousemove\", l), window.removeEventListener(\"keydown\", t), window.removeEventListener(\"keyup\", n);\n };\n function t(u) {\n (u.keyCode === 8 || u.keyCode === 46) && e.self && e.self.handelKeyDeleteDown != null && e.self.handelKeyDeleteDown(), u.keyCode === 27 && e.self && e.self.handelKeyEscDown != null && e.self.handelKeyEscDown(), u.keyCode === 13 && e.self && e.self.handelKeyEnterDown != null && e.self.handelKeyEnterDown(), u.keyCode === 32 && e.self && e.self.handelKeySpaceDown != null && e.self.handelKeySpaceDown(), u.key === \"Control\" && e.self && e.self.handelKeyCtrlDown != null && e.self.handelKeyCtrlDown(), u.key === \"Delete\" && e.self && e.self.handelKeyDeleteDown != null && e.self.handelKeyDeleteDown(), u.key === \"Shift\" && e.self && e.self.handelKeyShiftDown != null && e.self.handelKeyShiftDown(), u.key === \"Meta\" && e.self && e.self.handelKeyMetaDown != null && e.self.handelKeyMetaDown();\n }\n function n(u) {\n u.key === \"Alt\" && e.self && e.self.handelKeyAltUp != null && e.self.handelKeyAltUp(), u.key === \"Tab\" && e.self && e.self.handelKeyTabUp != null && e.self.handelKeyTabUp(), u.key === \"Control\" && e.self && e.self.handelKeyCtrlUp != null && e.self.handelKeyCtrlUp(), u.key === \"Shift\" && e.self && e.self.handelKeyShiftUp != null && e.self.handelKeyShiftUp(), u.key === \"Meta\" && e.self && e.self.handelKeyMetaUp != null && e.self.handelKeyMetaUp(), u.key === \"Command\" && e.self && e.self.handelKeyCommandUp != null && e.self.handelKeyCommandUp(), u.key === \"Windows\" && e.self && e.self.handelKeyWindowsUp != null && e.self.handelKeyWindowsUp();\n }\n function i(u) {\n const d = new E.Vector2(), p = s.renderer.domElement.clientWidth, f = s.renderer.domElement.clientHeight;\n return d.x = u.offsetX / p * 2 - 1, d.y = -(u.offsetY / f) * 2 + 1, d;\n }\n function o(u) {\n const d = new E.Raycaster(), p = i(u);\n return d.setFromCamera(p, s.camera), d;\n }\n function r(u, d = !1) {\n const p = o(u);\n if (u.raycaster = p, d) {\n const f = c(p, u);\n u.catch = f;\n }\n }\n function a(u) {\n u.button === 0 && (e.mouseDownTime = Date.now(), e.self && e.self.handleMouseDown != null && (r(u, !0), e.self.handleMouseDown(u)));\n }\n function l(u) {\n e.self && e.self.handleMouseMove != null && (r(u, !0), e.self.handleMouseMove(u));\n }\n function h(u) {\n if (u.button !== 0)\n return;\n const d = Date.now(), p = d - e.mouseDownTime;\n if (e.self && e.self.handleMouseUp != null && (r(u, !1), e.self.handleMouseUp(u)), p < 100 && e.self && e.self.handleMouseClick != null) {\n r(u, !0);\n const f = d - e.lastClickTime;\n console.log(f), f < 200 ? e.self.handleMouseDoubleClick(u) : e.self.handleMouseClick(u), e.lastClickTime = Date.now();\n }\n }\n function c(u, d) {\n s.catchSvg.innerHTML = \"\";\n const p = s.octreeBox.rayInterationModel(u);\n if (p.length === 0)\n return;\n let f = p[0].object.url, m = p[0].object.name, g = s.modelEdge.getModelEdge(f, m);\n g || (g = [0, 0, []]);\n let y = \"face\", w = [], _ = [], x = 5;\n if (g[2].map((C) => C[0]).forEach((C) => {\n let P = new E.Vector3(C.X, C.Z, -C.Y), k = s.worldToScreen.worldToScreen(P), B = Math.sqrt(Math.pow(k.x - d.offsetX, 2) + Math.pow(k.y - d.offsetY, 2));\n B < x && (x = B, w.push({\n point: P,\n distance: B,\n pointxy: k\n }));\n }), w.length > 0 ? (w.sort((C, P) => C.distance - P.distance), y = \"point\") : (g[2].forEach((C) => {\n let P = new E.Vector3(C[0].X, C[0].Z, -C[0].Y), k = new E.Vector3(C[1].X, C[1].Z, -C[1].Y), B = s.worldToScreen.worldToScreen(P), T = s.worldToScreen.worldToScreen(k), D = b(new E.Vector2(d.offsetX, d.offsetY), B, T);\n if (D < x) {\n let v = A(new E.Vector2(d.offsetX, d.offsetY), B, T), I = M(v, P, k);\n _.push({\n distance: D,\n point: I,\n pointxy: s.worldToScreen.worldToScreen(I),\n start: B,\n end: T\n });\n }\n }), _.length > 0 && (_.sort((C, P) => C.distance - P.distance), y = \"line\")), y == \"point\" && e.options.showCatch) {\n const C = s.worldToScreen.worldToScreen(w[0].point);\n console.log(\"捕捉点屏幕坐标:\", C.x, C.y), console.log(\"Canvas尺寸:\", s.renderer.domElement.width, s.renderer.domElement.height), console.log(\"SVG尺寸:\", s.catchSvg.clientWidth, s.catchSvg.clientHeight), s.catchSvg.innerHTML = \"\";\n const P = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n P.setAttribute(\"class\", \"catchPoint\"), P.setAttribute(\"cx\", (C.x + s.reactBoundingClientRect.left).toString()), P.setAttribute(\"cy\", (C.y + s.reactBoundingClientRect.top).toString()), P.setAttribute(\"r\", \"5\"), P.setAttribute(\"fill\", \"rgb(0, 255, 247)\"), s.catchSvg.appendChild(P);\n } else if (y == \"line\" && e.options.showCatch) {\n const C = s.worldToScreen.worldToScreen(_[0].point), P = _[0].start, k = _[0].end;\n console.log(\"捕捉点屏幕坐标:\", C.x, C.y), console.log(\"Canvas尺寸:\", s.renderer.domElement.width, s.renderer.domElement.height), console.log(\"SVG尺寸:\", s.catchSvg.clientWidth, s.catchSvg.clientHeight), s.catchSvg.innerHTML = \"\";\n const B = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n B.setAttribute(\"class\", \"catchLine\"), B.setAttribute(\"x1\", (P.x + s.reactBoundingClientRect.left).toString()), B.setAttribute(\"y1\", (P.y + s.reactBoundingClientRect.top).toString()), B.setAttribute(\"x2\", (k.x + s.reactBoundingClientRect.left).toString()), B.setAttribute(\"y2\", (k.y + s.reactBoundingClientRect.top).toString()), B.setAttribute(\"stroke\", \"rgb(0, 255, 247)\"), B.setAttribute(\"stroke-width\", \"2\"), s.catchSvg.appendChild(B);\n } else if (y == \"face\" && e.options.showCatch) {\n let C = p[0].point.clone(), P = p[0].normal || (p[0].face ? p[0].face.normal : null);\n const k = (P ? P.clone() : new E.Vector3(0, 0, 1)).normalize(), B = Math.abs(k.y) < 0.9 ? new E.Vector3(0, 1, 0) : new E.Vector3(1, 0, 0), T = new E.Vector3().crossVectors(k, B).normalize(), D = new E.Vector3().crossVectors(k, T).normalize(), v = 0.05, H = [\n new E.Vector3().copy(T).add(D).multiplyScalar(v),\n new E.Vector3().copy(T).sub(D).multiplyScalar(v),\n new E.Vector3().copy(T).multiplyScalar(-1).sub(D).multiplyScalar(v),\n new E.Vector3().copy(T).multiplyScalar(-1).add(D).multiplyScalar(v)\n ].map((j) => new E.Vector3().copy(C).add(j)).map((j) => s.worldToScreen.worldToScreen(j));\n s.catchSvg.innerHTML = \"\";\n const ee = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polygon\");\n ee.setAttribute(\"class\", \"catchFace\"), ee.setAttribute(\"points\", H.map((j) => `${j.x + s.reactBoundingClientRect.left},${j.y + s.reactBoundingClientRect.top}`).join(\" \")), ee.setAttribute(\"fill\", \"rgba(1, 238, 255, 0.2)\"), ee.setAttribute(\"stroke\", \"rgb(0, 255, 247)\"), ee.setAttribute(\"stroke-width\", \"1\"), s.catchSvg.appendChild(ee);\n }\n return p[0];\n function b(C, P, k) {\n const B = new E.Vector2().subVectors(k, P), T = B.lengthSq();\n if (T < 1e-10)\n return C.distanceTo(P);\n const D = new E.Vector2().subVectors(C, P), v = E.MathUtils.clamp(D.dot(B) / T, 0, 1), I = new E.Vector2().copy(B).multiplyScalar(v).add(P);\n return C.distanceTo(I);\n }\n function A(C, P, k) {\n const B = new E.Vector2().subVectors(k, P), T = B.lengthSq();\n if (T < 1e-10)\n return 0;\n const D = new E.Vector2().subVectors(C, P);\n return E.MathUtils.clamp(D.dot(B) / T, 0, 1);\n }\n function M(C, P, k) {\n const B = E.MathUtils.clamp(C, 0, 1);\n return new E.Vector3().lerpVectors(P, k, B);\n }\n }\n return e;\n}\nclass Yl {\n engine;\n orbitControls;\n firstPersonControls;\n isActive = !0;\n originDiv = null;\n handelBehaved;\n isDragging = !1;\n isDown = !1;\n containerOffset = { left: 0, top: 0 };\n constructor(e) {\n this.engine = e, this.init(), this.handelBehaved = tr(this.engine), this.handelBehaved.init(this, null), this.handelBehaved.active();\n }\n init() {\n this.orbitControls = new Nl(this.engine, this.engine.camera, this.engine.renderer.domElement), this.orbitControls.showOriginIcon = !0, this.firstPersonControls = new vr(this.engine, this.engine.camera, this.engine.renderer.domElement);\n const e = document.createElement(\"div\");\n this.originDiv = e, e.className = \"originDiv\", e.style.position = \"absolute\", e.style.top = \"0px\", e.style.left = \"0px\", e.style.width = \"30px\", e.style.height = \"30px\", e.style.borderRadius = \"50%\", e.style.pointerEvents = \"none\", e.style.backgroundImage = \"url(./assets/svg/rotate-orbit.svg)\", this.engine.container.appendChild(this.originDiv);\n }\n active() {\n this.isActive = !0, this.orbitControls.enabled = !0;\n }\n disActive() {\n this.isActive = !1, this.orbitControls.enabled = !1;\n }\n // 切换第一人称漫游模式\n switchFirstPersonMode() {\n this.firstPersonControls = new vr(\n this.engine,\n this.engine.camera,\n this.engine.renderer.domElement,\n []\n ), this.orbitControls.enabled = !1, this.firstPersonControls.enabled = !0, this.firstPersonControls.isActive = !0;\n }\n // 切换默认模式\n switchDefaultMode() {\n this.firstPersonControls && (this.firstPersonControls.enabled = !1), this.orbitControls.enabled = !0;\n }\n // 控制鼠标交互\n handleMouseUp(e) {\n this.isDragging = !1, this.isDown = !1;\n }\n handleMouseMove(e) {\n this.isDown ? this.isDragging = !0 : this.isDragging = !1;\n }\n handleMouseDown(e) {\n this.isDown = !0;\n }\n handleMouseClick(e) {\n this.isDragging = !1, this.isDown = !1;\n }\n // 渲染控制器\n update() {\n if (this.firstPersonControls.enabled && this.firstPersonControls.update(), this.orbitControls.enabled) {\n const e = this.engine.controlModule.orbitControls.origin, n = this.engine.worldToScreen.worldToScreen(e);\n this.originDiv && this.isDragging ? (this.originDiv.style.left = n.x - 15 + this.engine.reactBoundingClientRect.left + \"px\", this.originDiv.style.top = n.y - 15 + this.engine.reactBoundingClientRect.top + \"px\", this.originDiv.style.display = \"block\") : this.originDiv && (this.originDiv.style.display = \"none\");\n }\n }\n}\nconst Xt = {\n name: \"CopyShader\",\n uniforms: {\n tDiffuse: { value: null },\n opacity: { value: 1 }\n },\n vertexShader: (\n /* glsl */\n `\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 fragmentShader: (\n /* glsl */\n `\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};\nclass Jt {\n /**\n * Constructs a new pass.\n */\n constructor() {\n this.isPass = !0, this.enabled = !0, this.needsSwap = !0, this.clear = !1, this.renderToScreen = !1;\n }\n /**\n * Sets the size of the pass.\n *\n * @abstract\n * @param {number} width - The width to set.\n * @param {number} height - The height to set.\n */\n setSize() {\n }\n /**\n * This method holds the render logic of a pass. It must be implemented in all derived classes.\n *\n * @abstract\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render() {\n console.error(\"THREE.Pass: .render() must be implemented in derived pass.\");\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n *\n * @abstract\n */\n dispose() {\n }\n}\nconst $l = new Bo(-1, 1, 1, -1, 0, 1);\nclass Jl extends Fi {\n constructor() {\n super(), this.setAttribute(\"position\", new dr([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3)), this.setAttribute(\"uv\", new dr([0, 2, 0, 0, 2, 0], 2));\n }\n}\nconst Ql = new Jl();\nclass ji {\n /**\n * Constructs a new full screen quad.\n *\n * @param {?Material} material - The material to render te full screen quad with.\n */\n constructor(e) {\n this._mesh = new Qs(Ql, e);\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the instance is no longer used in your app.\n */\n dispose() {\n this._mesh.geometry.dispose();\n }\n /**\n * Renders the full screen quad.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n */\n render(e) {\n e.render(this._mesh, $l);\n }\n /**\n * The quad's material.\n *\n * @type {?Material}\n */\n get material() {\n return this._mesh.material;\n }\n set material(e) {\n this._mesh.material = e;\n }\n}\nclass vi extends Jt {\n /**\n * Constructs a new shader pass.\n *\n * @param {Object|ShaderMaterial} [shader] - A shader object holding vertex and fragment shader as well as\n * defines and uniforms. It's also valid to pass a custom shader material.\n * @param {string} [textureID='tDiffuse'] - The name of the texture uniform that should sample\n * the read buffer.\n */\n constructor(e, t = \"tDiffuse\") {\n super(), this.textureID = t, this.uniforms = null, this.material = null, e instanceof et ? (this.uniforms = e.uniforms, this.material = e) : e && (this.uniforms = yt.clone(e.uniforms), this.material = new et({\n name: e.name !== void 0 ? e.name : \"unspecified\",\n defines: Object.assign({}, e.defines),\n uniforms: this.uniforms,\n vertexShader: e.vertexShader,\n fragmentShader: e.fragmentShader\n })), this._fsQuad = new ji(this.material);\n }\n /**\n * Performs the shader pass.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n this.uniforms[this.textureID] && (this.uniforms[this.textureID].value = n.texture), this._fsQuad.material = this.material, this.renderToScreen ? (e.setRenderTarget(null), this._fsQuad.render(e)) : (e.setRenderTarget(t), this.clear && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil), this._fsQuad.render(e));\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n */\n dispose() {\n this.material.dispose(), this._fsQuad.dispose();\n }\n}\nclass Sr extends Jt {\n /**\n * Constructs a new mask pass.\n *\n * @param {Scene} scene - The 3D objects in this scene will define the mask.\n * @param {Camera} camera - The camera.\n */\n constructor(e, t) {\n super(), this.scene = e, this.camera = t, this.clear = !0, this.needsSwap = !1, this.inverse = !1;\n }\n /**\n * Performs a mask pass with the configured scene and camera.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n const i = e.getContext(), o = e.state;\n o.buffers.color.setMask(!1), o.buffers.depth.setMask(!1), o.buffers.color.setLocked(!0), o.buffers.depth.setLocked(!0);\n let r, a;\n this.inverse ? (r = 0, a = 1) : (r = 1, a = 0), o.buffers.stencil.setTest(!0), o.buffers.stencil.setOp(i.REPLACE, i.REPLACE, i.REPLACE), o.buffers.stencil.setFunc(i.ALWAYS, r, 4294967295), o.buffers.stencil.setClear(a), o.buffers.stencil.setLocked(!0), e.setRenderTarget(n), this.clear && e.clear(), e.render(this.scene, this.camera), e.setRenderTarget(t), this.clear && e.clear(), e.render(this.scene, this.camera), o.buffers.color.setLocked(!1), o.buffers.depth.setLocked(!1), o.buffers.color.setMask(!0), o.buffers.depth.setMask(!0), o.buffers.stencil.setLocked(!1), o.buffers.stencil.setFunc(i.EQUAL, 1, 4294967295), o.buffers.stencil.setOp(i.KEEP, i.KEEP, i.KEEP), o.buffers.stencil.setLocked(!0);\n }\n}\nclass ec extends Jt {\n /**\n * Constructs a new clear mask pass.\n */\n constructor() {\n super(), this.needsSwap = !1;\n }\n /**\n * Performs the clear of the currently defined mask.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e) {\n e.state.buffers.stencil.setLocked(!1), e.state.buffers.stencil.setTest(!1);\n }\n}\nclass tc {\n /**\n * Constructs a new effect composer.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} [renderTarget] - This render target and a clone will\n * be used as the internal read and write buffers. If not given, the composer creates\n * the buffers automatically.\n */\n constructor(e, t) {\n if (this.renderer = e, this._pixelRatio = e.getPixelRatio(), t === void 0) {\n const n = e.getSize(new ce());\n this._width = n.width, this._height = n.height, t = new dn(this._width * this._pixelRatio, this._height * this._pixelRatio, { type: pn }), t.texture.name = \"EffectComposer.rt1\";\n } else\n this._width = t.width, this._height = t.height;\n this.renderTarget1 = t, this.renderTarget2 = t.clone(), this.renderTarget2.texture.name = \"EffectComposer.rt2\", this.writeBuffer = this.renderTarget1, this.readBuffer = this.renderTarget2, this.renderToScreen = !0, this.passes = [], this.copyPass = new vi(Xt), this.copyPass.material.blending = pt, this.clock = new Oa();\n }\n /**\n * Swaps the internal read/write buffers.\n */\n swapBuffers() {\n const e = this.readBuffer;\n this.readBuffer = this.writeBuffer, this.writeBuffer = e;\n }\n /**\n * Adds the given pass to the pass chain.\n *\n * @param {Pass} pass - The pass to add.\n */\n addPass(e) {\n this.passes.push(e), e.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio);\n }\n /**\n * Inserts the given pass at a given index.\n *\n * @param {Pass} pass - The pass to insert.\n * @param {number} index - The index into the pass chain.\n */\n insertPass(e, t) {\n this.passes.splice(t, 0, e), e.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio);\n }\n /**\n * Removes the given pass from the pass chain.\n *\n * @param {Pass} pass - The pass to remove.\n */\n removePass(e) {\n const t = this.passes.indexOf(e);\n t !== -1 && this.passes.splice(t, 1);\n }\n /**\n * Returns `true` if the pass for the given index is the last enabled pass in the pass chain.\n *\n * @param {number} passIndex - The pass index.\n * @return {boolean} Whether the pass for the given index is the last pass in the pass chain.\n */\n isLastEnabledPass(e) {\n for (let t = e + 1; t < this.passes.length; t++)\n if (this.passes[t].enabled)\n return !1;\n return !0;\n }\n /**\n * Executes all enabled post-processing passes in order to produce the final frame.\n *\n * @param {number} deltaTime - The delta time in seconds. If not given, the composer computes\n * its own time delta value.\n */\n render(e) {\n e === void 0 && (e = this.clock.getDelta());\n const t = this.renderer.getRenderTarget();\n let n = !1;\n for (let i = 0, o = this.passes.length; i < o; i++) {\n const r = this.passes[i];\n if (r.enabled !== !1) {\n if (r.renderToScreen = this.renderToScreen && this.isLastEnabledPass(i), r.render(this.renderer, this.writeBuffer, this.readBuffer, e, n), r.needsSwap) {\n if (n) {\n const a = this.renderer.getContext(), l = this.renderer.state.buffers.stencil;\n l.setFunc(a.NOTEQUAL, 1, 4294967295), this.copyPass.render(this.renderer, this.writeBuffer, this.readBuffer, e), l.setFunc(a.EQUAL, 1, 4294967295);\n }\n this.swapBuffers();\n }\n Sr !== void 0 && (r instanceof Sr ? n = !0 : r instanceof ec && (n = !1));\n }\n }\n this.renderer.setRenderTarget(t);\n }\n /**\n * Resets the internal state of the EffectComposer.\n *\n * @param {WebGLRenderTarget} [renderTarget] - This render target has the same purpose like\n * the one from the constructor. If set, it is used to setup the read and write buffers.\n */\n reset(e) {\n if (e === void 0) {\n const t = this.renderer.getSize(new ce());\n this._pixelRatio = this.renderer.getPixelRatio(), this._width = t.width, this._height = t.height, e = this.renderTarget1.clone(), e.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio);\n }\n this.renderTarget1.dispose(), this.renderTarget2.dispose(), this.renderTarget1 = e, this.renderTarget2 = e.clone(), this.writeBuffer = this.renderTarget1, this.readBuffer = this.renderTarget2;\n }\n /**\n * Resizes the internal read and write buffers as well as all passes. Similar to {@link WebGLRenderer#setSize},\n * this method honors the current pixel ration.\n *\n * @param {number} width - The width in logical pixels.\n * @param {number} height - The height in logical pixels.\n */\n setSize(e, t) {\n this._width = e, this._height = t;\n const n = this._width * this._pixelRatio, i = this._height * this._pixelRatio;\n this.renderTarget1.setSize(n, i), this.renderTarget2.setSize(n, i);\n for (let o = 0; o < this.passes.length; o++)\n this.passes[o].setSize(n, i);\n }\n /**\n * Sets device pixel ratio. This is usually used for HiDPI device to prevent blurring output.\n * Setting the pixel ratio will automatically resize the composer.\n *\n * @param {number} pixelRatio - The pixel ratio to set.\n */\n setPixelRatio(e) {\n this._pixelRatio = e, this.setSize(this._width, this._height);\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the composer is no longer used in your app.\n */\n dispose() {\n this.renderTarget1.dispose(), this.renderTarget2.dispose(), this.copyPass.dispose();\n }\n}\nclass nc extends Jt {\n /**\n * Constructs a new render pass.\n *\n * @param {Scene} scene - The scene to render.\n * @param {Camera} camera - The camera.\n * @param {?Material} [overrideMaterial=null] - The override material. If set, this material is used\n * for all objects in the scene.\n * @param {?(number|Color|string)} [clearColor=null] - The clear color of the render pass.\n * @param {?number} [clearAlpha=null] - The clear alpha of the render pass.\n */\n constructor(e, t, n = null, i = null, o = null) {\n super(), this.scene = e, this.camera = t, this.overrideMaterial = n, this.clearColor = i, this.clearAlpha = o, this.clear = !0, this.clearDepth = !1, this.needsSwap = !1, this._oldClearColor = new je();\n }\n /**\n * Performs a beauty pass with the configured scene and camera.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n const i = e.autoClear;\n e.autoClear = !1;\n let o, r;\n this.overrideMaterial !== null && (r = this.scene.overrideMaterial, this.scene.overrideMaterial = this.overrideMaterial), this.clearColor !== null && (e.getClearColor(this._oldClearColor), e.setClearColor(this.clearColor, e.getClearAlpha())), this.clearAlpha !== null && (o = e.getClearAlpha(), e.setClearAlpha(this.clearAlpha)), this.clearDepth == !0 && e.clearDepth(), e.setRenderTarget(this.renderToScreen ? null : n), this.clear === !0 && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil), e.render(this.scene, this.camera), this.clearColor !== null && e.setClearColor(this._oldClearColor), this.clearAlpha !== null && e.setClearAlpha(o), this.overrideMaterial !== null && (this.scene.overrideMaterial = r), e.autoClear = i;\n }\n}\nconst Xn = {\n defines: {\n PERSPECTIVE_CAMERA: 1,\n SAMPLES: 16,\n NORMAL_VECTOR_TYPE: 1,\n DEPTH_SWIZZLING: \"x\",\n SCREEN_SPACE_RADIUS: 0,\n SCREEN_SPACE_RADIUS_SCALE: 100,\n SCENE_CLIP_BOX: 0\n },\n uniforms: {\n tNormal: { value: null },\n tDepth: { value: null },\n tNoise: { value: null },\n resolution: { value: new ce() },\n cameraNear: { value: null },\n cameraFar: { value: null },\n cameraProjectionMatrix: { value: new Ae() },\n cameraProjectionMatrixInverse: { value: new Ae() },\n cameraWorldMatrix: { value: new Ae() },\n radius: { value: 0.25 },\n distanceExponent: { value: 1 },\n thickness: { value: 1 },\n distanceFallOff: { value: 1 },\n scale: { value: 1 },\n sceneBoxMin: { value: new Z(-1, -1, -1) },\n sceneBoxMax: { value: new Z(1, 1, 1) }\n },\n vertexShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\t\tvarying vec2 vUv;\n\t\tuniform highp sampler2D tNormal;\n\t\tuniform highp sampler2D tDepth;\n\t\tuniform sampler2D tNoise;\n\t\tuniform vec2 resolution;\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tuniform mat4 cameraProjectionMatrix;\n\t\tuniform mat4 cameraProjectionMatrixInverse;\n\t\tuniform mat4 cameraWorldMatrix;\n\t\tuniform float radius;\n\t\tuniform float distanceExponent;\n\t\tuniform float thickness;\n\t\tuniform float distanceFallOff;\n\t\tuniform float scale;\n\t\t#if SCENE_CLIP_BOX == 1\n\t\t\tuniform vec3 sceneBoxMin;\n\t\t\tuniform vec3 sceneBoxMax;\n\t\t#endif\n\n\t\t#include \n\t\t#include \n\n\t\t#ifndef FRAGMENT_OUTPUT\n\t\t#define FRAGMENT_OUTPUT vec4(vec3(ao), 1.)\n\t\t#endif\n\n\t\tvec3 getViewPosition(const in vec2 screenPosition, const in float depth) {\n\t\t\tvec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);\n\t\t\tvec4 viewSpacePosition = cameraProjectionMatrixInverse * clipSpacePosition;\n\t\t\treturn viewSpacePosition.xyz / viewSpacePosition.w;\n\t\t}\n\n\t\tfloat getDepth(const vec2 uv) {\n\t\t\treturn textureLod(tDepth, uv.xy, 0.0).DEPTH_SWIZZLING;\n\t\t}\n\n\t\tfloat fetchDepth(const ivec2 uv) {\n\t\t\treturn texelFetch(tDepth, uv.xy, 0).DEPTH_SWIZZLING;\n\t\t}\n\n\t\tfloat getViewZ(const in float depth) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\t\treturn perspectiveDepthToViewZ(depth, cameraNear, cameraFar);\n\t\t\t#else\n\t\t\t\treturn orthographicDepthToViewZ(depth, cameraNear, cameraFar);\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 computeNormalFromDepth(const vec2 uv) {\n\t\t\tvec2 size = vec2(textureSize(tDepth, 0));\n\t\t\tivec2 p = ivec2(uv * size);\n\t\t\tfloat c0 = fetchDepth(p);\n\t\t\tfloat l2 = fetchDepth(p - ivec2(2, 0));\n\t\t\tfloat l1 = fetchDepth(p - ivec2(1, 0));\n\t\t\tfloat r1 = fetchDepth(p + ivec2(1, 0));\n\t\t\tfloat r2 = fetchDepth(p + ivec2(2, 0));\n\t\t\tfloat b2 = fetchDepth(p - ivec2(0, 2));\n\t\t\tfloat b1 = fetchDepth(p - ivec2(0, 1));\n\t\t\tfloat t1 = fetchDepth(p + ivec2(0, 1));\n\t\t\tfloat t2 = fetchDepth(p + ivec2(0, 2));\n\t\t\tfloat dl = abs((2.0 * l1 - l2) - c0);\n\t\t\tfloat dr = abs((2.0 * r1 - r2) - c0);\n\t\t\tfloat db = abs((2.0 * b1 - b2) - c0);\n\t\t\tfloat dt = abs((2.0 * t1 - t2) - c0);\n\t\t\tvec3 ce = getViewPosition(uv, c0).xyz;\n\t\t\tvec3 dpdx = (dl < dr) ? ce - getViewPosition((uv - vec2(1.0 / size.x, 0.0)), l1).xyz : -ce + getViewPosition((uv + vec2(1.0 / size.x, 0.0)), r1).xyz;\n\t\t\tvec3 dpdy = (db < dt) ? ce - getViewPosition((uv - vec2(0.0, 1.0 / size.y)), b1).xyz : -ce + getViewPosition((uv + vec2(0.0, 1.0 / size.y)), t1).xyz;\n\t\t\treturn normalize(cross(dpdx, dpdy));\n\t\t}\n\n\t\tvec3 getViewNormal(const vec2 uv) {\n\t\t\t#if NORMAL_VECTOR_TYPE == 2\n\t\t\t\treturn normalize(textureLod(tNormal, uv, 0.).rgb);\n\t\t\t#elif NORMAL_VECTOR_TYPE == 1\n\t\t\t\treturn unpackRGBToNormal(textureLod(tNormal, uv, 0.).rgb);\n\t\t\t#else\n\t\t\t\treturn computeNormalFromDepth(uv);\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 getSceneUvAndDepth(vec3 sampleViewPos) {\n\t\t\tvec4 sampleClipPos = cameraProjectionMatrix * vec4(sampleViewPos, 1.);\n\t\t\tvec2 sampleUv = sampleClipPos.xy / sampleClipPos.w * 0.5 + 0.5;\n\t\t\tfloat sampleSceneDepth = getDepth(sampleUv);\n\t\t\treturn vec3(sampleUv, sampleSceneDepth);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getDepth(vUv.xy);\n\t\t\tif (depth >= 1.0) {\n\t\t\t\tdiscard;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvec3 viewPos = getViewPosition(vUv, depth);\n\t\t\tvec3 viewNormal = getViewNormal(vUv);\n\n\t\t\tfloat radiusToUse = radius;\n\t\t\tfloat distanceFalloffToUse = thickness;\n\t\t\t#if SCREEN_SPACE_RADIUS == 1\n\t\t\t\tfloat radiusScale = getViewPosition(vec2(0.5 + float(SCREEN_SPACE_RADIUS_SCALE) / resolution.x, 0.0), depth).x;\n\t\t\t\tradiusToUse *= radiusScale;\n\t\t\t\tdistanceFalloffToUse *= radiusScale;\n\t\t\t#endif\n\n\t\t\t#if SCENE_CLIP_BOX == 1\n\t\t\t\tvec3 worldPos = (cameraWorldMatrix * vec4(viewPos, 1.0)).xyz;\n\t\t\t\tfloat boxDistance = length(max(vec3(0.0), max(sceneBoxMin - worldPos, worldPos - sceneBoxMax)));\n\t\t\t\tif (boxDistance > radiusToUse) {\n\t\t\t\t\tdiscard;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t#endif\n\n\t\t\tvec2 noiseResolution = vec2(textureSize(tNoise, 0));\n\t\t\tvec2 noiseUv = vUv * resolution / noiseResolution;\n\t\t\tvec4 noiseTexel = textureLod(tNoise, noiseUv, 0.0);\n\t\t\tvec3 randomVec = noiseTexel.xyz * 2.0 - 1.0;\n\t\t\tvec3 tangent = normalize(vec3(randomVec.xy, 0.));\n\t\t\tvec3 bitangent = vec3(-tangent.y, tangent.x, 0.);\n\t\t\tmat3 kernelMatrix = mat3(tangent, bitangent, vec3(0., 0., 1.));\n\n\t\t\tconst int DIRECTIONS = SAMPLES < 30 ? 3 : 5;\n\t\t\tconst int STEPS = (SAMPLES + DIRECTIONS - 1) / DIRECTIONS;\n\t\t\tfloat ao = 0.0;\n\t\t\tfor (int i = 0; i < DIRECTIONS; ++i) {\n\n\t\t\t\tfloat angle = float(i) / float(DIRECTIONS) * PI;\n\t\t\t\tvec4 sampleDir = vec4(cos(angle), sin(angle), 0., 0.5 + 0.5 * noiseTexel.w);\n\t\t\t\tsampleDir.xyz = normalize(kernelMatrix * sampleDir.xyz);\n\n\t\t\t\tvec3 viewDir = normalize(-viewPos.xyz);\n\t\t\t\tvec3 sliceBitangent = normalize(cross(sampleDir.xyz, viewDir));\n\t\t\t\tvec3 sliceTangent = cross(sliceBitangent, viewDir);\n\t\t\t\tvec3 normalInSlice = normalize(viewNormal - sliceBitangent * dot(viewNormal, sliceBitangent));\n\n\t\t\t\tvec3 tangentToNormalInSlice = cross(normalInSlice, sliceBitangent);\n\t\t\t\tvec2 cosHorizons = vec2(dot(viewDir, tangentToNormalInSlice), dot(viewDir, -tangentToNormalInSlice));\n\n\t\t\t\tfor (int j = 0; j < STEPS; ++j) {\n\t\t\t\t\tvec3 sampleViewOffset = sampleDir.xyz * radiusToUse * sampleDir.w * pow(float(j + 1) / float(STEPS), distanceExponent);\n\n\t\t\t\t\tvec3 sampleSceneUvDepth = getSceneUvAndDepth(viewPos + sampleViewOffset);\n\t\t\t\t\tvec3 sampleSceneViewPos = getViewPosition(sampleSceneUvDepth.xy, sampleSceneUvDepth.z);\n\t\t\t\t\tvec3 viewDelta = sampleSceneViewPos - viewPos;\n\t\t\t\t\tif (abs(viewDelta.z) < thickness) {\n\t\t\t\t\t\tfloat sampleCosHorizon = dot(viewDir, normalize(viewDelta));\n\t\t\t\t\t\tcosHorizons.x += max(0., (sampleCosHorizon - cosHorizons.x) * mix(1., 2. / float(j + 2), distanceFallOff));\n\t\t\t\t\t}\n\n\t\t\t\t\tsampleSceneUvDepth = getSceneUvAndDepth(viewPos - sampleViewOffset);\n\t\t\t\t\tsampleSceneViewPos = getViewPosition(sampleSceneUvDepth.xy, sampleSceneUvDepth.z);\n\t\t\t\t\tviewDelta = sampleSceneViewPos - viewPos;\n\t\t\t\t\tif (abs(viewDelta.z) < thickness) {\n\t\t\t\t\t\tfloat sampleCosHorizon = dot(viewDir, normalize(viewDelta));\n\t\t\t\t\t\tcosHorizons.y += max(0., (sampleCosHorizon - cosHorizons.y) * mix(1., 2. / float(j + 2), distanceFallOff));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvec2 sinHorizons = sqrt(1. - cosHorizons * cosHorizons);\n\t\t\t\tfloat nx = dot(normalInSlice, sliceTangent);\n\t\t\t\tfloat ny = dot(normalInSlice, viewDir);\n\t\t\t\tfloat nxb = 1. / 2. * (acos(cosHorizons.y) - acos(cosHorizons.x) + sinHorizons.x * cosHorizons.x - sinHorizons.y * cosHorizons.y);\n\t\t\t\tfloat nyb = 1. / 2. * (2. - cosHorizons.x * cosHorizons.x - cosHorizons.y * cosHorizons.y);\n\t\t\t\tfloat occlusion = nx * nxb + ny * nyb;\n\t\t\t\tao += occlusion;\n\t\t\t}\n\n\t\t\tao = clamp(ao / float(DIRECTIONS), 0., 1.);\n\t\t#if SCENE_CLIP_BOX == 1\n\t\t\tao = mix(ao, 1., smoothstep(0., radiusToUse, boxDistance));\n\t\t#endif\n\t\t\tao = pow(ao, scale);\n\n\t\t\tgl_FragColor = FRAGMENT_OUTPUT;\n\t\t}`\n )\n}, qn = {\n defines: {\n PERSPECTIVE_CAMERA: 1\n },\n uniforms: {\n tDepth: { value: null },\n cameraNear: { value: null },\n cameraFar: { value: null }\n },\n vertexShader: (\n /* glsl */\n `\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\t\tuniform sampler2D tDepth;\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tvarying vec2 vUv;\n\n\t\t#include \n\n\t\tfloat getLinearDepth( const in vec2 screenPosition ) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\t\tfloat fragCoordZ = texture2D( tDepth, screenPosition ).x;\n\t\t\t\tfloat viewZ = perspectiveDepthToViewZ( fragCoordZ, cameraNear, cameraFar );\n\t\t\t\treturn viewZToOrthographicDepth( viewZ, cameraNear, cameraFar );\n\t\t\t#else\n\t\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\t\t\t#endif\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getLinearDepth( vUv );\n\t\t\tgl_FragColor = vec4( vec3( 1.0 - depth ), 1.0 );\n\n\t\t}`\n )\n}, Ji = {\n uniforms: {\n tDiffuse: { value: null },\n intensity: { value: 1 }\n },\n vertexShader: (\n /* glsl */\n `\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\t\tuniform float intensity;\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4(mix(vec3(1.), texel.rgb, intensity), texel.a);\n\t\t}`\n )\n};\nfunction ic(s = 5) {\n const e = Math.floor(s) % 2 === 0 ? Math.floor(s) + 1 : Math.floor(s), t = sc(e), n = t.length, i = new Uint8Array(n * 4);\n for (let r = 0; r < n; ++r) {\n const a = t[r], l = 2 * Math.PI * a / n, h = new Z(\n Math.cos(l),\n Math.sin(l),\n 0\n ).normalize();\n i[r * 4] = (h.x * 0.5 + 0.5) * 255, i[r * 4 + 1] = (h.y * 0.5 + 0.5) * 255, i[r * 4 + 2] = 127, i[r * 4 + 3] = 255;\n }\n const o = new Io(i, e, e);\n return o.wrapS = Zt, o.wrapT = Zt, o.needsUpdate = !0, o;\n}\nfunction sc(s) {\n const e = Math.floor(s) % 2 === 0 ? Math.floor(s) + 1 : Math.floor(s), t = e * e, n = Array(t).fill(0);\n let i = Math.floor(e / 2), o = e - 1;\n for (let r = 1; r <= t; ) {\n if (i === -1 && o === e ? (o = e - 2, i = 0) : (o === e && (o = 0), i < 0 && (i = e - 1)), n[i * e + o] !== 0) {\n o -= 2, i++;\n continue;\n } else\n n[i * e + o] = r++;\n o++, i--;\n }\n return n;\n}\nconst Kn = {\n defines: {\n SAMPLES: 16,\n SAMPLE_VECTORS: Xo(16, 2, 1),\n NORMAL_VECTOR_TYPE: 1,\n DEPTH_VALUE_SOURCE: 0\n },\n uniforms: {\n tDiffuse: { value: null },\n tNormal: { value: null },\n tDepth: { value: null },\n tNoise: { value: null },\n resolution: { value: new ce() },\n cameraProjectionMatrixInverse: { value: new Ae() },\n lumaPhi: { value: 5 },\n depthPhi: { value: 5 },\n normalPhi: { value: 5 },\n radius: { value: 4 },\n index: { value: 0 }\n },\n vertexShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tNormal;\n\t\tuniform sampler2D tDepth;\n\t\tuniform sampler2D tNoise;\n\t\tuniform vec2 resolution;\n\t\tuniform mat4 cameraProjectionMatrixInverse;\n\t\tuniform float lumaPhi;\n\t\tuniform float depthPhi;\n\t\tuniform float normalPhi;\n\t\tuniform float radius;\n\t\tuniform int index;\n\n\t\t#include \n\t\t#include \n\n\t\t#ifndef SAMPLE_LUMINANCE\n\t\t#define SAMPLE_LUMINANCE dot(vec3(0.2125, 0.7154, 0.0721), a)\n\t\t#endif\n\n\t\t#ifndef FRAGMENT_OUTPUT\n\t\t#define FRAGMENT_OUTPUT vec4(denoised, 1.)\n\t\t#endif\n\n\t\tfloat getLuminance(const in vec3 a) {\n\t\t\treturn SAMPLE_LUMINANCE;\n\t\t}\n\n\t\tconst vec3 poissonDisk[SAMPLES] = SAMPLE_VECTORS;\n\n\t\tvec3 getViewPosition(const in vec2 screenPosition, const in float depth) {\n\t\t\tvec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);\n\t\t\tvec4 viewSpacePosition = cameraProjectionMatrixInverse * clipSpacePosition;\n\t\t\treturn viewSpacePosition.xyz / viewSpacePosition.w;\n\t\t}\n\n\t\tfloat getDepth(const vec2 uv) {\n\t\t#if DEPTH_VALUE_SOURCE == 1\n\t\t\treturn textureLod(tDepth, uv.xy, 0.0).a;\n\t\t#else\n\t\t\treturn textureLod(tDepth, uv.xy, 0.0).r;\n\t\t#endif\n\t\t}\n\n\t\tfloat fetchDepth(const ivec2 uv) {\n\t\t\t#if DEPTH_VALUE_SOURCE == 1\n\t\t\t\treturn texelFetch(tDepth, uv.xy, 0).a;\n\t\t\t#else\n\t\t\t\treturn texelFetch(tDepth, uv.xy, 0).r;\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 computeNormalFromDepth(const vec2 uv) {\n\t\t\tvec2 size = vec2(textureSize(tDepth, 0));\n\t\t\tivec2 p = ivec2(uv * size);\n\t\t\tfloat c0 = fetchDepth(p);\n\t\t\tfloat l2 = fetchDepth(p - ivec2(2, 0));\n\t\t\tfloat l1 = fetchDepth(p - ivec2(1, 0));\n\t\t\tfloat r1 = fetchDepth(p + ivec2(1, 0));\n\t\t\tfloat r2 = fetchDepth(p + ivec2(2, 0));\n\t\t\tfloat b2 = fetchDepth(p - ivec2(0, 2));\n\t\t\tfloat b1 = fetchDepth(p - ivec2(0, 1));\n\t\t\tfloat t1 = fetchDepth(p + ivec2(0, 1));\n\t\t\tfloat t2 = fetchDepth(p + ivec2(0, 2));\n\t\t\tfloat dl = abs((2.0 * l1 - l2) - c0);\n\t\t\tfloat dr = abs((2.0 * r1 - r2) - c0);\n\t\t\tfloat db = abs((2.0 * b1 - b2) - c0);\n\t\t\tfloat dt = abs((2.0 * t1 - t2) - c0);\n\t\t\tvec3 ce = getViewPosition(uv, c0).xyz;\n\t\t\tvec3 dpdx = (dl < dr) ? ce - getViewPosition((uv - vec2(1.0 / size.x, 0.0)), l1).xyz\n\t\t\t\t\t\t\t\t\t: -ce + getViewPosition((uv + vec2(1.0 / size.x, 0.0)), r1).xyz;\n\t\t\tvec3 dpdy = (db < dt) ? ce - getViewPosition((uv - vec2(0.0, 1.0 / size.y)), b1).xyz\n\t\t\t\t\t\t\t\t\t: -ce + getViewPosition((uv + vec2(0.0, 1.0 / size.y)), t1).xyz;\n\t\t\treturn normalize(cross(dpdx, dpdy));\n\t\t}\n\n\t\tvec3 getViewNormal(const vec2 uv) {\n\t\t#if NORMAL_VECTOR_TYPE == 2\n\t\t\treturn normalize(textureLod(tNormal, uv, 0.).rgb);\n\t\t#elif NORMAL_VECTOR_TYPE == 1\n\t\t\treturn unpackRGBToNormal(textureLod(tNormal, uv, 0.).rgb);\n\t\t#else\n\t\t\treturn computeNormalFromDepth(uv);\n\t\t#endif\n\t\t}\n\n\t\tvoid denoiseSample(in vec3 center, in vec3 viewNormal, in vec3 viewPos, in vec2 sampleUv, inout vec3 denoised, inout float totalWeight) {\n\t\t\tvec4 sampleTexel = textureLod(tDiffuse, sampleUv, 0.0);\n\t\t\tfloat sampleDepth = getDepth(sampleUv);\n\t\t\tvec3 sampleNormal = getViewNormal(sampleUv);\n\t\t\tvec3 neighborColor = sampleTexel.rgb;\n\t\t\tvec3 viewPosSample = getViewPosition(sampleUv, sampleDepth);\n\n\t\t\tfloat normalDiff = dot(viewNormal, sampleNormal);\n\t\t\tfloat normalSimilarity = pow(max(normalDiff, 0.), normalPhi);\n\t\t\tfloat lumaDiff = abs(getLuminance(neighborColor) - getLuminance(center));\n\t\t\tfloat lumaSimilarity = max(1.0 - lumaDiff / lumaPhi, 0.0);\n\t\t\tfloat depthDiff = abs(dot(viewPos - viewPosSample, viewNormal));\n\t\t\tfloat depthSimilarity = max(1. - depthDiff / depthPhi, 0.);\n\t\t\tfloat w = lumaSimilarity * depthSimilarity * normalSimilarity;\n\n\t\t\tdenoised += w * neighborColor;\n\t\t\ttotalWeight += w;\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getDepth(vUv.xy);\n\t\t\tvec3 viewNormal = getViewNormal(vUv);\n\t\t\tif (depth == 1. || dot(viewNormal, viewNormal) == 0.) {\n\t\t\t\tdiscard;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvec4 texel = textureLod(tDiffuse, vUv, 0.0);\n\t\t\tvec3 center = texel.rgb;\n\t\t\tvec3 viewPos = getViewPosition(vUv, depth);\n\n\t\t\tvec2 noiseResolution = vec2(textureSize(tNoise, 0));\n\t\t\tvec2 noiseUv = vUv * resolution / noiseResolution;\n\t\t\tvec4 noiseTexel = textureLod(tNoise, noiseUv, 0.0);\n \t\tvec2 noiseVec = vec2(sin(noiseTexel[index % 4] * 2. * PI), cos(noiseTexel[index % 4] * 2. * PI));\n \t\tmat2 rotationMatrix = mat2(noiseVec.x, -noiseVec.y, noiseVec.x, noiseVec.y);\n\n\t\t\tfloat totalWeight = 1.0;\n\t\t\tvec3 denoised = texel.rgb;\n\t\t\tfor (int i = 0; i < SAMPLES; i++) {\n\t\t\t\tvec3 sampleDir = poissonDisk[i];\n\t\t\t\tvec2 offset = rotationMatrix * (sampleDir.xy * (1. + sampleDir.z * (radius - 1.)) / resolution);\n\t\t\t\tvec2 sampleUv = vUv + offset;\n\t\t\t\tdenoiseSample(center, viewNormal, viewPos, sampleUv, denoised, totalWeight);\n\t\t\t}\n\n\t\t\tif (totalWeight > 0.) {\n\t\t\t\tdenoised /= totalWeight;\n\t\t\t}\n\t\t\tgl_FragColor = FRAGMENT_OUTPUT;\n\t\t}`\n )\n};\nfunction Xo(s, e, t) {\n const n = rc(\n s,\n e,\n t\n );\n let i = \"vec3[SAMPLES](\";\n for (let o = 0; o < s; o++) {\n const r = n[o];\n i += `vec3(${r.x}, ${r.y}, ${r.z})${o < s - 1 ? \",\" : \")\"}`;\n }\n return i;\n}\nfunction rc(s, e, t) {\n const n = [];\n for (let i = 0; i < s; i++) {\n const o = 2 * Math.PI * e * i / s, r = Math.pow(i / (s - 1), t);\n n.push(new Z(Math.cos(o), Math.sin(o), r));\n }\n return n;\n}\nclass oc {\n /**\n * Constructs a new simplex noise object.\n *\n * @param {Object} [r=Math] - A math utility class that holds a `random()` method. This makes it\n * possible to pass in custom random number generator.\n */\n constructor(e = Math) {\n this.grad3 = [\n [1, 1, 0],\n [-1, 1, 0],\n [1, -1, 0],\n [-1, -1, 0],\n [1, 0, 1],\n [-1, 0, 1],\n [1, 0, -1],\n [-1, 0, -1],\n [0, 1, 1],\n [0, -1, 1],\n [0, 1, -1],\n [0, -1, -1]\n ], this.grad4 = [\n [0, 1, 1, 1],\n [0, 1, 1, -1],\n [0, 1, -1, 1],\n [0, 1, -1, -1],\n [0, -1, 1, 1],\n [0, -1, 1, -1],\n [0, -1, -1, 1],\n [0, -1, -1, -1],\n [1, 0, 1, 1],\n [1, 0, 1, -1],\n [1, 0, -1, 1],\n [1, 0, -1, -1],\n [-1, 0, 1, 1],\n [-1, 0, 1, -1],\n [-1, 0, -1, 1],\n [-1, 0, -1, -1],\n [1, 1, 0, 1],\n [1, 1, 0, -1],\n [1, -1, 0, 1],\n [1, -1, 0, -1],\n [-1, 1, 0, 1],\n [-1, 1, 0, -1],\n [-1, -1, 0, 1],\n [-1, -1, 0, -1],\n [1, 1, 1, 0],\n [1, 1, -1, 0],\n [1, -1, 1, 0],\n [1, -1, -1, 0],\n [-1, 1, 1, 0],\n [-1, 1, -1, 0],\n [-1, -1, 1, 0],\n [-1, -1, -1, 0]\n ], this.p = [];\n for (let t = 0; t < 256; t++)\n this.p[t] = Math.floor(e.random() * 256);\n this.perm = [];\n for (let t = 0; t < 512; t++)\n this.perm[t] = this.p[t & 255];\n this.simplex = [\n [0, 1, 2, 3],\n [0, 1, 3, 2],\n [0, 0, 0, 0],\n [0, 2, 3, 1],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [1, 2, 3, 0],\n [0, 2, 1, 3],\n [0, 0, 0, 0],\n [0, 3, 1, 2],\n [0, 3, 2, 1],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [1, 3, 2, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [1, 2, 0, 3],\n [0, 0, 0, 0],\n [1, 3, 0, 2],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [2, 3, 0, 1],\n [2, 3, 1, 0],\n [1, 0, 2, 3],\n [1, 0, 3, 2],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [2, 0, 3, 1],\n [0, 0, 0, 0],\n [2, 1, 3, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [2, 0, 1, 3],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [3, 0, 1, 2],\n [3, 0, 2, 1],\n [0, 0, 0, 0],\n [3, 1, 2, 0],\n [2, 1, 0, 3],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [3, 1, 0, 2],\n [0, 0, 0, 0],\n [3, 2, 0, 1],\n [3, 2, 1, 0]\n ];\n }\n /**\n * A 2D simplex noise method.\n *\n * @param {number} xin - The x coordinate.\n * @param {number} yin - The y coordinate.\n * @return {number} The noise value.\n */\n noise(e, t) {\n let n, i, o;\n const r = 0.5 * (Math.sqrt(3) - 1), a = (e + t) * r, l = Math.floor(e + a), h = Math.floor(t + a), c = (3 - Math.sqrt(3)) / 6, u = (l + h) * c, d = l - u, p = h - u, f = e - d, m = t - p;\n let g, y;\n f > m ? (g = 1, y = 0) : (g = 0, y = 1);\n const w = f - g + c, _ = m - y + c, x = f - 1 + 2 * c, b = m - 1 + 2 * c, A = l & 255, M = h & 255, C = this.perm[A + this.perm[M]] % 12, P = this.perm[A + g + this.perm[M + y]] % 12, k = this.perm[A + 1 + this.perm[M + 1]] % 12;\n let B = 0.5 - f * f - m * m;\n B < 0 ? n = 0 : (B *= B, n = B * B * this._dot(this.grad3[C], f, m));\n let T = 0.5 - w * w - _ * _;\n T < 0 ? i = 0 : (T *= T, i = T * T * this._dot(this.grad3[P], w, _));\n let D = 0.5 - x * x - b * b;\n return D < 0 ? o = 0 : (D *= D, o = D * D * this._dot(this.grad3[k], x, b)), 70 * (n + i + o);\n }\n /**\n * A 3D simplex noise method.\n *\n * @param {number} xin - The x coordinate.\n * @param {number} yin - The y coordinate.\n * @param {number} zin - The z coordinate.\n * @return {number} The noise value.\n */\n noise3d(e, t, n) {\n let i, o, r, a;\n const h = (e + t + n) * 0.3333333333333333, c = Math.floor(e + h), u = Math.floor(t + h), d = Math.floor(n + h), p = 1 / 6, f = (c + u + d) * p, m = c - f, g = u - f, y = d - f, w = e - m, _ = t - g, x = n - y;\n let b, A, M, C, P, k;\n w >= _ ? _ >= x ? (b = 1, A = 0, M = 0, C = 1, P = 1, k = 0) : w >= x ? (b = 1, A = 0, M = 0, C = 1, P = 0, k = 1) : (b = 0, A = 0, M = 1, C = 1, P = 0, k = 1) : _ < x ? (b = 0, A = 0, M = 1, C = 0, P = 1, k = 1) : w < x ? (b = 0, A = 1, M = 0, C = 0, P = 1, k = 1) : (b = 0, A = 1, M = 0, C = 1, P = 1, k = 0);\n const B = w - b + p, T = _ - A + p, D = x - M + p, v = w - C + 2 * p, I = _ - P + 2 * p, q = x - k + 2 * p, H = w - 1 + 3 * p, ee = _ - 1 + 3 * p, j = x - 1 + 3 * p, ne = c & 255, O = u & 255, N = d & 255, te = this.perm[ne + this.perm[O + this.perm[N]]] % 12, J = this.perm[ne + b + this.perm[O + A + this.perm[N + M]]] % 12, K = this.perm[ne + C + this.perm[O + P + this.perm[N + k]]] % 12, fe = this.perm[ne + 1 + this.perm[O + 1 + this.perm[N + 1]]] % 12;\n let pe = 0.6 - w * w - _ * _ - x * x;\n pe < 0 ? i = 0 : (pe *= pe, i = pe * pe * this._dot3(this.grad3[te], w, _, x));\n let se = 0.6 - B * B - T * T - D * D;\n se < 0 ? o = 0 : (se *= se, o = se * se * this._dot3(this.grad3[J], B, T, D));\n let oe = 0.6 - v * v - I * I - q * q;\n oe < 0 ? r = 0 : (oe *= oe, r = oe * oe * this._dot3(this.grad3[K], v, I, q));\n let ue = 0.6 - H * H - ee * ee - j * j;\n return ue < 0 ? a = 0 : (ue *= ue, a = ue * ue * this._dot3(this.grad3[fe], H, ee, j)), 32 * (i + o + r + a);\n }\n /**\n * A 4D simplex noise method.\n *\n * @param {number} x - The x coordinate.\n * @param {number} y - The y coordinate.\n * @param {number} z - The z coordinate.\n * @param {number} w - The w coordinate.\n * @return {number} The noise value.\n */\n noise4d(e, t, n, i) {\n const o = this.grad4, r = this.simplex, a = this.perm, l = (Math.sqrt(5) - 1) / 4, h = (5 - Math.sqrt(5)) / 20;\n let c, u, d, p, f;\n const m = (e + t + n + i) * l, g = Math.floor(e + m), y = Math.floor(t + m), w = Math.floor(n + m), _ = Math.floor(i + m), x = (g + y + w + _) * h, b = g - x, A = y - x, M = w - x, C = _ - x, P = e - b, k = t - A, B = n - M, T = i - C, D = P > k ? 32 : 0, v = P > B ? 16 : 0, I = k > B ? 8 : 0, q = P > T ? 4 : 0, H = k > T ? 2 : 0, ee = B > T ? 1 : 0, j = D + v + I + q + H + ee, ne = r[j][0] >= 3 ? 1 : 0, O = r[j][1] >= 3 ? 1 : 0, N = r[j][2] >= 3 ? 1 : 0, te = r[j][3] >= 3 ? 1 : 0, J = r[j][0] >= 2 ? 1 : 0, K = r[j][1] >= 2 ? 1 : 0, fe = r[j][2] >= 2 ? 1 : 0, pe = r[j][3] >= 2 ? 1 : 0, se = r[j][0] >= 1 ? 1 : 0, oe = r[j][1] >= 1 ? 1 : 0, ue = r[j][2] >= 1 ? 1 : 0, me = r[j][3] >= 1 ? 1 : 0, Se = P - ne + h, De = k - O + h, S = B - N + h, G = T - te + h, V = P - J + 2 * h, L = k - K + 2 * h, R = B - fe + 2 * h, z = T - pe + 2 * h, W = P - se + 3 * h, X = k - oe + 3 * h, U = B - ue + 3 * h, Y = T - me + 3 * h, Q = P - 1 + 4 * h, $ = k - 1 + 4 * h, ie = B - 1 + 4 * h, he = T - 1 + 4 * h, ae = g & 255, Te = y & 255, $e = w & 255, ke = _ & 255, Lt = a[ae + a[Te + a[$e + a[ke]]]] % 32, ye = a[ae + ne + a[Te + O + a[$e + N + a[ke + te]]]] % 32, en = a[ae + J + a[Te + K + a[$e + fe + a[ke + pe]]]] % 32, vn = a[ae + se + a[Te + oe + a[$e + ue + a[ke + me]]]] % 32, Je = a[ae + 1 + a[Te + 1 + a[$e + 1 + a[ke + 1]]]] % 32;\n let vt = 0.6 - P * P - k * k - B * B - T * T;\n vt < 0 ? c = 0 : (vt *= vt, c = vt * vt * this._dot4(o[Lt], P, k, B, T));\n let Bt = 0.6 - Se * Se - De * De - S * S - G * G;\n Bt < 0 ? u = 0 : (Bt *= Bt, u = Bt * Bt * this._dot4(o[ye], Se, De, S, G));\n let It = 0.6 - V * V - L * L - R * R - z * z;\n It < 0 ? d = 0 : (It *= It, d = It * It * this._dot4(o[en], V, L, R, z));\n let zt = 0.6 - W * W - X * X - U * U - Y * Y;\n zt < 0 ? p = 0 : (zt *= zt, p = zt * zt * this._dot4(o[vn], W, X, U, Y));\n let St = 0.6 - Q * Q - $ * $ - ie * ie - he * he;\n return St < 0 ? f = 0 : (St *= St, f = St * St * this._dot4(o[Je], Q, $, ie, he)), 27 * (c + u + d + p + f);\n }\n // private\n _dot(e, t, n) {\n return e[0] * t + e[1] * n;\n }\n _dot3(e, t, n, i) {\n return e[0] * t + e[1] * n + e[2] * i;\n }\n _dot4(e, t, n, i, o) {\n return e[0] * t + e[1] * n + e[2] * i + e[3] * o;\n }\n}\nclass Ne extends Jt {\n /**\n * Constructs a new GTAO pass.\n *\n * @param {Scene} scene - The scene to compute the AO for.\n * @param {Camera} camera - The camera.\n * @param {number} [width=512] - The width of the effect.\n * @param {number} [height=512] - The height of the effect.\n * @param {Object} [parameters] - The pass parameters.\n * @param {Object} [aoParameters] - The AO parameters.\n * @param {Object} [pdParameters] - The denoise parameters.\n */\n constructor(e, t, n = 512, i = 512, o, r, a) {\n super(), this.width = n, this.height = i, this.clear = !0, this.camera = t, this.scene = e, this.output = 0, this._renderGBuffer = !0, this._visibilityCache = [], this.blendIntensity = 1, this.pdRings = 2, this.pdRadiusExponent = 2, this.pdSamples = 16, this.gtaoNoiseTexture = ic(), this.pdNoiseTexture = this._generateNoise(), this.gtaoRenderTarget = new dn(this.width, this.height, { type: pn }), this.pdRenderTarget = this.gtaoRenderTarget.clone(), this.gtaoMaterial = new et({\n defines: Object.assign({}, Xn.defines),\n uniforms: yt.clone(Xn.uniforms),\n vertexShader: Xn.vertexShader,\n fragmentShader: Xn.fragmentShader,\n blending: pt,\n depthTest: !1,\n depthWrite: !1\n }), this.gtaoMaterial.defines.PERSPECTIVE_CAMERA = this.camera.isPerspectiveCamera ? 1 : 0, this.gtaoMaterial.uniforms.tNoise.value = this.gtaoNoiseTexture, this.gtaoMaterial.uniforms.resolution.value.set(this.width, this.height), this.gtaoMaterial.uniforms.cameraNear.value = this.camera.near, this.gtaoMaterial.uniforms.cameraFar.value = this.camera.far, this.normalMaterial = new Ua(), this.normalMaterial.blending = pt, this.pdMaterial = new et({\n defines: Object.assign({}, Kn.defines),\n uniforms: yt.clone(Kn.uniforms),\n vertexShader: Kn.vertexShader,\n fragmentShader: Kn.fragmentShader,\n depthTest: !1,\n depthWrite: !1\n }), this.pdMaterial.uniforms.tDiffuse.value = this.gtaoRenderTarget.texture, this.pdMaterial.uniforms.tNoise.value = this.pdNoiseTexture, this.pdMaterial.uniforms.resolution.value.set(this.width, this.height), this.pdMaterial.uniforms.lumaPhi.value = 10, this.pdMaterial.uniforms.depthPhi.value = 2, this.pdMaterial.uniforms.normalPhi.value = 3, this.pdMaterial.uniforms.radius.value = 8, this.depthRenderMaterial = new et({\n defines: Object.assign({}, qn.defines),\n uniforms: yt.clone(qn.uniforms),\n vertexShader: qn.vertexShader,\n fragmentShader: qn.fragmentShader,\n blending: pt\n }), this.depthRenderMaterial.uniforms.cameraNear.value = this.camera.near, this.depthRenderMaterial.uniforms.cameraFar.value = this.camera.far, this.copyMaterial = new et({\n uniforms: yt.clone(Xt.uniforms),\n vertexShader: Xt.vertexShader,\n fragmentShader: Xt.fragmentShader,\n transparent: !0,\n depthTest: !1,\n depthWrite: !1,\n blendSrc: mr,\n blendDst: Gn,\n blendEquation: Hn,\n blendSrcAlpha: pr,\n blendDstAlpha: Gn,\n blendEquationAlpha: Hn\n }), this.blendMaterial = new et({\n uniforms: yt.clone(Ji.uniforms),\n vertexShader: Ji.vertexShader,\n fragmentShader: Ji.fragmentShader,\n transparent: !0,\n depthTest: !1,\n depthWrite: !1,\n blending: Fa,\n blendSrc: mr,\n blendDst: Gn,\n blendEquation: Hn,\n blendSrcAlpha: pr,\n blendDstAlpha: Gn,\n blendEquationAlpha: Hn\n }), this._fsQuad = new ji(null), this._originalClearColor = new je(), this.setGBuffer(o ? o.depthTexture : void 0, o ? o.normalTexture : void 0), r !== void 0 && this.updateGtaoMaterial(r), a !== void 0 && this.updatePdMaterial(a);\n }\n /**\n * Sets the size of the pass.\n *\n * @param {number} width - The width to set.\n * @param {number} height - The height to set.\n */\n setSize(e, t) {\n this.width = e, this.height = t, this.gtaoRenderTarget.setSize(e, t), this.normalRenderTarget.setSize(e, t), this.pdRenderTarget.setSize(e, t), this.gtaoMaterial.uniforms.resolution.value.set(e, t), this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix), this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse), this.pdMaterial.uniforms.resolution.value.set(e, t), this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse);\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n */\n dispose() {\n this.gtaoNoiseTexture.dispose(), this.pdNoiseTexture.dispose(), this.normalRenderTarget.dispose(), this.gtaoRenderTarget.dispose(), this.pdRenderTarget.dispose(), this.normalMaterial.dispose(), this.pdMaterial.dispose(), this.copyMaterial.dispose(), this.depthRenderMaterial.dispose(), this._fsQuad.dispose();\n }\n /**\n * A texture holding the computed AO.\n *\n * @type {Texture}\n * @readonly\n */\n get gtaoMap() {\n return this.pdRenderTarget.texture;\n }\n /**\n * Configures the GBuffer of this pass. If no arguments are passed,\n * the pass creates an internal render target for holding depth\n * and normal data.\n *\n * @param {DepthTexture} [depthTexture] - The depth texture.\n * @param {DepthTexture} [normalTexture] - The normal texture.\n */\n setGBuffer(e, t) {\n e !== void 0 ? (this.depthTexture = e, this.normalTexture = t, this._renderGBuffer = !1) : (this.depthTexture = new Va(), this.depthTexture.format = ja, this.depthTexture.type = Ha, this.normalRenderTarget = new dn(this.width, this.height, {\n minFilter: Di,\n magFilter: Di,\n type: pn,\n depthTexture: this.depthTexture\n }), this.normalTexture = this.normalRenderTarget.texture, this._renderGBuffer = !0);\n const n = this.normalTexture ? 1 : 0, i = this.depthTexture === this.normalTexture ? \"w\" : \"x\";\n this.gtaoMaterial.defines.NORMAL_VECTOR_TYPE = n, this.gtaoMaterial.defines.DEPTH_SWIZZLING = i, this.gtaoMaterial.uniforms.tNormal.value = this.normalTexture, this.gtaoMaterial.uniforms.tDepth.value = this.depthTexture, this.pdMaterial.defines.NORMAL_VECTOR_TYPE = n, this.pdMaterial.defines.DEPTH_SWIZZLING = i, this.pdMaterial.uniforms.tNormal.value = this.normalTexture, this.pdMaterial.uniforms.tDepth.value = this.depthTexture, this.depthRenderMaterial.uniforms.tDepth.value = this.normalRenderTarget.depthTexture;\n }\n /**\n * Configures the clip box of the GTAO shader with the given AABB.\n *\n * @param {?Box3} box - The AABB enclosing the scene that should receive AO. When passing\n * `null`, to clip box is used.\n */\n setSceneClipBox(e) {\n e ? (this.gtaoMaterial.needsUpdate = this.gtaoMaterial.defines.SCENE_CLIP_BOX !== 1, this.gtaoMaterial.defines.SCENE_CLIP_BOX = 1, this.gtaoMaterial.uniforms.sceneBoxMin.value.copy(e.min), this.gtaoMaterial.uniforms.sceneBoxMax.value.copy(e.max)) : (this.gtaoMaterial.needsUpdate = this.gtaoMaterial.defines.SCENE_CLIP_BOX === 0, this.gtaoMaterial.defines.SCENE_CLIP_BOX = 0);\n }\n /**\n * Updates the GTAO material from the given parameter object.\n *\n * @param {Object} parameters - The GTAO material parameters.\n */\n updateGtaoMaterial(e) {\n e.radius !== void 0 && (this.gtaoMaterial.uniforms.radius.value = e.radius), e.distanceExponent !== void 0 && (this.gtaoMaterial.uniforms.distanceExponent.value = e.distanceExponent), e.thickness !== void 0 && (this.gtaoMaterial.uniforms.thickness.value = e.thickness), e.distanceFallOff !== void 0 && (this.gtaoMaterial.uniforms.distanceFallOff.value = e.distanceFallOff, this.gtaoMaterial.needsUpdate = !0), e.scale !== void 0 && (this.gtaoMaterial.uniforms.scale.value = e.scale), e.samples !== void 0 && e.samples !== this.gtaoMaterial.defines.SAMPLES && (this.gtaoMaterial.defines.SAMPLES = e.samples, this.gtaoMaterial.needsUpdate = !0), e.screenSpaceRadius !== void 0 && (e.screenSpaceRadius ? 1 : 0) !== this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS && (this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS = e.screenSpaceRadius ? 1 : 0, this.gtaoMaterial.needsUpdate = !0);\n }\n /**\n * Updates the Denoise material from the given parameter object.\n *\n * @param {Object} parameters - The denoise parameters.\n */\n updatePdMaterial(e) {\n let t = !1;\n e.lumaPhi !== void 0 && (this.pdMaterial.uniforms.lumaPhi.value = e.lumaPhi), e.depthPhi !== void 0 && (this.pdMaterial.uniforms.depthPhi.value = e.depthPhi), e.normalPhi !== void 0 && (this.pdMaterial.uniforms.normalPhi.value = e.normalPhi), e.radius !== void 0 && e.radius !== this.radius && (this.pdMaterial.uniforms.radius.value = e.radius), e.radiusExponent !== void 0 && e.radiusExponent !== this.pdRadiusExponent && (this.pdRadiusExponent = e.radiusExponent, t = !0), e.rings !== void 0 && e.rings !== this.pdRings && (this.pdRings = e.rings, t = !0), e.samples !== void 0 && e.samples !== this.pdSamples && (this.pdSamples = e.samples, t = !0), t && (this.pdMaterial.defines.SAMPLES = this.pdSamples, this.pdMaterial.defines.SAMPLE_VECTORS = Xo(this.pdSamples, this.pdRings, this.pdRadiusExponent), this.pdMaterial.needsUpdate = !0);\n }\n /**\n * Performs the GTAO pass.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n switch (this._renderGBuffer && (this._overrideVisibility(), this._renderOverride(e, this.normalMaterial, this.normalRenderTarget, 7829503, 1), this._restoreVisibility()), this.gtaoMaterial.uniforms.cameraNear.value = this.camera.near, this.gtaoMaterial.uniforms.cameraFar.value = this.camera.far, this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix), this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse), this.gtaoMaterial.uniforms.cameraWorldMatrix.value.copy(this.camera.matrixWorld), this._renderPass(e, this.gtaoMaterial, this.gtaoRenderTarget, 16777215, 1), this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse), this._renderPass(e, this.pdMaterial, this.pdRenderTarget, 16777215, 1), this.output) {\n case Ne.OUTPUT.Off:\n break;\n case Ne.OUTPUT.Diffuse:\n this.copyMaterial.uniforms.tDiffuse.value = n.texture, this.copyMaterial.blending = pt, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t);\n break;\n case Ne.OUTPUT.AO:\n this.copyMaterial.uniforms.tDiffuse.value = this.gtaoRenderTarget.texture, this.copyMaterial.blending = pt, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t);\n break;\n case Ne.OUTPUT.Denoise:\n this.copyMaterial.uniforms.tDiffuse.value = this.pdRenderTarget.texture, this.copyMaterial.blending = pt, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t);\n break;\n case Ne.OUTPUT.Depth:\n this.depthRenderMaterial.uniforms.cameraNear.value = this.camera.near, this.depthRenderMaterial.uniforms.cameraFar.value = this.camera.far, this._renderPass(e, this.depthRenderMaterial, this.renderToScreen ? null : t);\n break;\n case Ne.OUTPUT.Normal:\n this.copyMaterial.uniforms.tDiffuse.value = this.normalRenderTarget.texture, this.copyMaterial.blending = pt, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t);\n break;\n case Ne.OUTPUT.Default:\n this.copyMaterial.uniforms.tDiffuse.value = n.texture, this.copyMaterial.blending = pt, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t), this.blendMaterial.uniforms.intensity.value = this.blendIntensity, this.blendMaterial.uniforms.tDiffuse.value = this.pdRenderTarget.texture, this._renderPass(e, this.blendMaterial, this.renderToScreen ? null : t);\n break;\n default:\n console.warn(\"THREE.GTAOPass: Unknown output type.\");\n }\n }\n // internals\n _renderPass(e, t, n, i, o) {\n e.getClearColor(this._originalClearColor);\n const r = e.getClearAlpha(), a = e.autoClear;\n e.setRenderTarget(n), e.autoClear = !1, i != null && (e.setClearColor(i), e.setClearAlpha(o || 0), e.clear()), this._fsQuad.material = t, this._fsQuad.render(e), e.autoClear = a, e.setClearColor(this._originalClearColor), e.setClearAlpha(r);\n }\n _renderOverride(e, t, n, i, o) {\n e.getClearColor(this._originalClearColor);\n const r = e.getClearAlpha(), a = e.autoClear;\n e.setRenderTarget(n), e.autoClear = !1, i = t.clearColor || i, o = t.clearAlpha || o, i != null && (e.setClearColor(i), e.setClearAlpha(o || 0), e.clear()), this.scene.overrideMaterial = t, e.render(this.scene, this.camera), this.scene.overrideMaterial = null, e.autoClear = a, e.setClearColor(this._originalClearColor), e.setClearAlpha(r);\n }\n _overrideVisibility() {\n const e = this.scene, t = this._visibilityCache;\n e.traverse(function(n) {\n (n.isPoints || n.isLine || n.isLine2) && n.visible && (n.visible = !1, t.push(n));\n });\n }\n _restoreVisibility() {\n const e = this._visibilityCache;\n for (let t = 0; t < e.length; t++)\n e[t].visible = !0;\n e.length = 0;\n }\n _generateNoise(e = 64) {\n const t = new oc(), n = e * e * 4, i = new Uint8Array(n);\n for (let r = 0; r < e; r++)\n for (let a = 0; a < e; a++) {\n const l = r, h = a;\n i[(r * e + a) * 4] = (t.noise(l, h) * 0.5 + 0.5) * 255, i[(r * e + a) * 4 + 1] = (t.noise(l + e, h) * 0.5 + 0.5) * 255, i[(r * e + a) * 4 + 2] = (t.noise(l, h + e) * 0.5 + 0.5) * 255, i[(r * e + a) * 4 + 3] = (t.noise(l + e, h + e) * 0.5 + 0.5) * 255;\n }\n const o = new Io(i, e, e, Ga, Wa);\n return o.wrapS = Zt, o.wrapT = Zt, o.needsUpdate = !0, o;\n }\n}\nNe.OUTPUT = {\n Off: -1,\n Default: 0,\n Diffuse: 1,\n Depth: 2,\n Normal: 3,\n AO: 4,\n Denoise: 5\n};\nconst ac = {\n uniforms: {\n tDiffuse: { value: null },\n luminosityThreshold: { value: 1 },\n smoothWidth: { value: 1 },\n defaultColor: { value: new je(0) },\n defaultOpacity: { value: 0 }\n },\n vertexShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec3 defaultColor;\n\t\tuniform float defaultOpacity;\n\t\tuniform float luminosityThreshold;\n\t\tuniform float smoothWidth;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\n\t\t\tfloat v = luminance( texel.xyz );\n\n\t\t\tvec4 outputColor = vec4( defaultColor.rgb, defaultOpacity );\n\n\t\t\tfloat alpha = smoothstep( luminosityThreshold, luminosityThreshold + smoothWidth, v );\n\n\t\t\tgl_FragColor = mix( outputColor, texel, alpha );\n\n\t\t}`\n )\n};\nclass yn extends Jt {\n /**\n * Constructs a new Unreal Bloom pass.\n *\n * @param {Vector2} [resolution] - The effect's resolution.\n * @param {number} [strength=1] - The Bloom strength.\n * @param {number} radius - The Bloom radius.\n * @param {number} threshold - The luminance threshold limits which bright areas contribute to the Bloom effect.\n */\n constructor(e, t = 1, n, i) {\n super(), this.strength = t, this.radius = n, this.threshold = i, this.resolution = e !== void 0 ? new ce(e.x, e.y) : new ce(256, 256), this.clearColor = new je(0, 0, 0), this.needsSwap = !1, this.renderTargetsHorizontal = [], this.renderTargetsVertical = [], this.nMips = 5;\n let o = Math.round(this.resolution.x / 2), r = Math.round(this.resolution.y / 2);\n this.renderTargetBright = new dn(o, r, { type: pn }), this.renderTargetBright.texture.name = \"UnrealBloomPass.bright\", this.renderTargetBright.texture.generateMipmaps = !1;\n for (let c = 0; c < this.nMips; c++) {\n const u = new dn(o, r, { type: pn });\n u.texture.name = \"UnrealBloomPass.h\" + c, u.texture.generateMipmaps = !1, this.renderTargetsHorizontal.push(u);\n const d = new dn(o, r, { type: pn });\n d.texture.name = \"UnrealBloomPass.v\" + c, d.texture.generateMipmaps = !1, this.renderTargetsVertical.push(d), o = Math.round(o / 2), r = Math.round(r / 2);\n }\n const a = ac;\n this.highPassUniforms = yt.clone(a.uniforms), this.highPassUniforms.luminosityThreshold.value = i, this.highPassUniforms.smoothWidth.value = 0.01, this.materialHighPassFilter = new et({\n uniforms: this.highPassUniforms,\n vertexShader: a.vertexShader,\n fragmentShader: a.fragmentShader\n }), this.separableBlurMaterials = [];\n const l = [6, 10, 14, 18, 22];\n o = Math.round(this.resolution.x / 2), r = Math.round(this.resolution.y / 2);\n for (let c = 0; c < this.nMips; c++)\n this.separableBlurMaterials.push(this._getSeparableBlurMaterial(l[c])), this.separableBlurMaterials[c].uniforms.invSize.value = new ce(1 / o, 1 / r), o = Math.round(o / 2), r = Math.round(r / 2);\n this.compositeMaterial = this._getCompositeMaterial(this.nMips), this.compositeMaterial.uniforms.blurTexture1.value = this.renderTargetsVertical[0].texture, this.compositeMaterial.uniforms.blurTexture2.value = this.renderTargetsVertical[1].texture, this.compositeMaterial.uniforms.blurTexture3.value = this.renderTargetsVertical[2].texture, this.compositeMaterial.uniforms.blurTexture4.value = this.renderTargetsVertical[3].texture, this.compositeMaterial.uniforms.blurTexture5.value = this.renderTargetsVertical[4].texture, this.compositeMaterial.uniforms.bloomStrength.value = t, this.compositeMaterial.uniforms.bloomRadius.value = 0.1;\n const h = [1, 0.8, 0.6, 0.4, 0.2];\n this.compositeMaterial.uniforms.bloomFactors.value = h, this.bloomTintColors = [new Z(1, 1, 1), new Z(1, 1, 1), new Z(1, 1, 1), new Z(1, 1, 1), new Z(1, 1, 1)], this.compositeMaterial.uniforms.bloomTintColors.value = this.bloomTintColors, this.copyUniforms = yt.clone(Xt.uniforms), this.blendMaterial = new et({\n uniforms: this.copyUniforms,\n vertexShader: Xt.vertexShader,\n fragmentShader: Xt.fragmentShader,\n blending: Xa,\n depthTest: !1,\n depthWrite: !1,\n transparent: !0\n }), this._oldClearColor = new je(), this._oldClearAlpha = 1, this._basic = new hn(), this._fsQuad = new ji(null);\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n */\n dispose() {\n for (let e = 0; e < this.renderTargetsHorizontal.length; e++)\n this.renderTargetsHorizontal[e].dispose();\n for (let e = 0; e < this.renderTargetsVertical.length; e++)\n this.renderTargetsVertical[e].dispose();\n this.renderTargetBright.dispose();\n for (let e = 0; e < this.separableBlurMaterials.length; e++)\n this.separableBlurMaterials[e].dispose();\n this.compositeMaterial.dispose(), this.blendMaterial.dispose(), this._basic.dispose(), this._fsQuad.dispose();\n }\n /**\n * Sets the size of the pass.\n *\n * @param {number} width - The width to set.\n * @param {number} height - The height to set.\n */\n setSize(e, t) {\n let n = Math.round(e / 2), i = Math.round(t / 2);\n this.renderTargetBright.setSize(n, i);\n for (let o = 0; o < this.nMips; o++)\n this.renderTargetsHorizontal[o].setSize(n, i), this.renderTargetsVertical[o].setSize(n, i), this.separableBlurMaterials[o].uniforms.invSize.value = new ce(1 / n, 1 / i), n = Math.round(n / 2), i = Math.round(i / 2);\n }\n /**\n * Performs the Bloom pass.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n, i, o) {\n e.getClearColor(this._oldClearColor), this._oldClearAlpha = e.getClearAlpha();\n const r = e.autoClear;\n e.autoClear = !1, e.setClearColor(this.clearColor, 0), o && e.state.buffers.stencil.setTest(!1), this.renderToScreen && (this._fsQuad.material = this._basic, this._basic.map = n.texture, e.setRenderTarget(null), e.clear(), this._fsQuad.render(e)), this.highPassUniforms.tDiffuse.value = n.texture, this.highPassUniforms.luminosityThreshold.value = this.threshold, this._fsQuad.material = this.materialHighPassFilter, e.setRenderTarget(this.renderTargetBright), e.clear(), this._fsQuad.render(e);\n let a = this.renderTargetBright;\n for (let l = 0; l < this.nMips; l++)\n this._fsQuad.material = this.separableBlurMaterials[l], this.separableBlurMaterials[l].uniforms.colorTexture.value = a.texture, this.separableBlurMaterials[l].uniforms.direction.value = yn.BlurDirectionX, e.setRenderTarget(this.renderTargetsHorizontal[l]), e.clear(), this._fsQuad.render(e), this.separableBlurMaterials[l].uniforms.colorTexture.value = this.renderTargetsHorizontal[l].texture, this.separableBlurMaterials[l].uniforms.direction.value = yn.BlurDirectionY, e.setRenderTarget(this.renderTargetsVertical[l]), e.clear(), this._fsQuad.render(e), a = this.renderTargetsVertical[l];\n this._fsQuad.material = this.compositeMaterial, this.compositeMaterial.uniforms.bloomStrength.value = this.strength, this.compositeMaterial.uniforms.bloomRadius.value = this.radius, this.compositeMaterial.uniforms.bloomTintColors.value = this.bloomTintColors, e.setRenderTarget(this.renderTargetsHorizontal[0]), e.clear(), this._fsQuad.render(e), this._fsQuad.material = this.blendMaterial, this.copyUniforms.tDiffuse.value = this.renderTargetsHorizontal[0].texture, o && e.state.buffers.stencil.setTest(!0), this.renderToScreen ? (e.setRenderTarget(null), this._fsQuad.render(e)) : (e.setRenderTarget(n), this._fsQuad.render(e)), e.setClearColor(this._oldClearColor, this._oldClearAlpha), e.autoClear = r;\n }\n // internals\n _getSeparableBlurMaterial(e) {\n const t = [], n = e / 3;\n for (let i = 0; i < e; i++)\n t.push(0.39894 * Math.exp(-0.5 * i * i / (n * n)) / n);\n return new et({\n defines: {\n KERNEL_RADIUS: e\n },\n uniforms: {\n colorTexture: { value: null },\n invSize: { value: new ce(0.5, 0.5) },\n // inverse texture size\n direction: { value: new ce(0.5, 0.5) },\n gaussianCoefficients: { value: t }\n // precomputed Gaussian coefficients\n },\n vertexShader: `varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n fragmentShader: `#include \n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 invSize;\n\t\t\t\tuniform vec2 direction;\n\t\t\t\tuniform float gaussianCoefficients[KERNEL_RADIUS];\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tfloat weightSum = gaussianCoefficients[0];\n\t\t\t\t\tvec3 diffuseSum = texture2D( colorTexture, vUv ).rgb * weightSum;\n\t\t\t\t\tfor( int i = 1; i < KERNEL_RADIUS; i ++ ) {\n\t\t\t\t\t\tfloat x = float(i);\n\t\t\t\t\t\tfloat w = gaussianCoefficients[i];\n\t\t\t\t\t\tvec2 uvOffset = direction * invSize * x;\n\t\t\t\t\t\tvec3 sample1 = texture2D( colorTexture, vUv + uvOffset ).rgb;\n\t\t\t\t\t\tvec3 sample2 = texture2D( colorTexture, vUv - uvOffset ).rgb;\n\t\t\t\t\t\tdiffuseSum += ( sample1 + sample2 ) * w;\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = vec4( diffuseSum, 1.0 );\n\t\t\t\t}`\n });\n }\n _getCompositeMaterial(e) {\n return new et({\n defines: {\n NUM_MIPS: e\n },\n uniforms: {\n blurTexture1: { value: null },\n blurTexture2: { value: null },\n blurTexture3: { value: null },\n blurTexture4: { value: null },\n blurTexture5: { value: null },\n bloomStrength: { value: 1 },\n bloomFactors: { value: null },\n bloomTintColors: { value: null },\n bloomRadius: { value: 0 }\n },\n vertexShader: `varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n fragmentShader: `varying vec2 vUv;\n\t\t\t\tuniform sampler2D blurTexture1;\n\t\t\t\tuniform sampler2D blurTexture2;\n\t\t\t\tuniform sampler2D blurTexture3;\n\t\t\t\tuniform sampler2D blurTexture4;\n\t\t\t\tuniform sampler2D blurTexture5;\n\t\t\t\tuniform float bloomStrength;\n\t\t\t\tuniform float bloomRadius;\n\t\t\t\tuniform float bloomFactors[NUM_MIPS];\n\t\t\t\tuniform vec3 bloomTintColors[NUM_MIPS];\n\n\t\t\t\tfloat lerpBloomFactor(const in float factor) {\n\t\t\t\t\tfloat mirrorFactor = 1.2 - factor;\n\t\t\t\t\treturn mix(factor, mirrorFactor, bloomRadius);\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tgl_FragColor = bloomStrength * ( lerpBloomFactor(bloomFactors[0]) * vec4(bloomTintColors[0], 1.0) * texture2D(blurTexture1, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[1]) * vec4(bloomTintColors[1], 1.0) * texture2D(blurTexture2, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[2]) * vec4(bloomTintColors[2], 1.0) * texture2D(blurTexture3, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[3]) * vec4(bloomTintColors[3], 1.0) * texture2D(blurTexture4, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[4]) * vec4(bloomTintColors[4], 1.0) * texture2D(blurTexture5, vUv) );\n\t\t\t\t}`\n });\n }\n}\nyn.BlurDirectionX = new ce(1, 0);\nyn.BlurDirectionY = new ce(0, 1);\nconst Zn = {\n name: \"OutputShader\",\n uniforms: {\n tDiffuse: { value: null },\n toneMappingExposure: { value: 1 }\n },\n vertexShader: (\n /* glsl */\n `\n\t\tprecision highp float;\n\n\t\tuniform mat4 modelViewMatrix;\n\t\tuniform mat4 projectionMatrix;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\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 fragmentShader: (\n /* glsl */\n `\n\n\t\tprecision highp float;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\t#include \n\t\t#include \n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t// tone mapping\n\n\t\t\t#ifdef LINEAR_TONE_MAPPING\n\n\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( AGX_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\n\t\t\t#endif\n\n\t\t\t// color space\n\n\t\t\t#ifdef SRGB_TRANSFER\n\n\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\n\t\t\t#endif\n\n\t\t}`\n )\n};\nclass lc extends Jt {\n /**\n * Constructs a new output pass.\n */\n constructor() {\n super(), this.uniforms = yt.clone(Zn.uniforms), this.material = new qa({\n name: Zn.name,\n uniforms: this.uniforms,\n vertexShader: Zn.vertexShader,\n fragmentShader: Zn.fragmentShader\n }), this._fsQuad = new ji(this.material), this._outputColorSpace = null, this._toneMapping = null;\n }\n /**\n * Performs the output pass.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n this.uniforms.tDiffuse.value = n.texture, this.uniforms.toneMappingExposure.value = e.toneMappingExposure, (this._outputColorSpace !== e.outputColorSpace || this._toneMapping !== e.toneMapping) && (this._outputColorSpace = e.outputColorSpace, this._toneMapping = e.toneMapping, this.material.defines = {}, Li.getTransfer(this._outputColorSpace) === Ka && (this.material.defines.SRGB_TRANSFER = \"\"), this._toneMapping === Za ? this.material.defines.LINEAR_TONE_MAPPING = \"\" : this._toneMapping === Ya ? this.material.defines.REINHARD_TONE_MAPPING = \"\" : this._toneMapping === $a ? this.material.defines.CINEON_TONE_MAPPING = \"\" : this._toneMapping === Ja ? this.material.defines.ACES_FILMIC_TONE_MAPPING = \"\" : this._toneMapping === Qa ? this.material.defines.AGX_TONE_MAPPING = \"\" : this._toneMapping === el ? this.material.defines.NEUTRAL_TONE_MAPPING = \"\" : this._toneMapping === tl && (this.material.defines.CUSTOM_TONE_MAPPING = \"\"), this.material.needsUpdate = !0), this.renderToScreen === !0 ? (e.setRenderTarget(null), this._fsQuad.render(e)) : (e.setRenderTarget(t), this.clear && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil), this._fsQuad.render(e));\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n */\n dispose() {\n this.material.dispose(), this._fsQuad.dispose();\n }\n}\nconst cc = {\n name: \"FXAAShader\",\n uniforms: {\n tDiffuse: { value: null },\n resolution: { value: new ce(1 / 1024, 1 / 512) }\n },\n vertexShader: (\n /* glsl */\n `\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 fragmentShader: (\n /* glsl */\n `\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec2 resolution;\n\t\tvarying vec2 vUv;\n\n\t\t#define EDGE_STEP_COUNT 6\n\t\t#define EDGE_GUESS 8.0\n\t\t#define EDGE_STEPS 1.0, 1.5, 2.0, 2.0, 2.0, 4.0\n\t\tconst float edgeSteps[EDGE_STEP_COUNT] = float[EDGE_STEP_COUNT]( EDGE_STEPS );\n\n\t\tfloat _ContrastThreshold = 0.0312;\n\t\tfloat _RelativeThreshold = 0.063;\n\t\tfloat _SubpixelBlending = 1.0;\n\n\t\tvec4 Sample( sampler2D tex2D, vec2 uv ) {\n\n\t\t\treturn texture( tex2D, uv );\n\n\t\t}\n\n\t\tfloat SampleLuminance( sampler2D tex2D, vec2 uv ) {\n\n\t\t\treturn dot( Sample( tex2D, uv ).rgb, vec3( 0.3, 0.59, 0.11 ) );\n\n\t\t}\n\n\t\tfloat SampleLuminance( sampler2D tex2D, vec2 texSize, vec2 uv, float uOffset, float vOffset ) {\n\n\t\t\tuv += texSize * vec2(uOffset, vOffset);\n\t\t\treturn SampleLuminance(tex2D, uv);\n\n\t\t}\n\n\t\tstruct LuminanceData {\n\n\t\t\tfloat m, n, e, s, w;\n\t\t\tfloat ne, nw, se, sw;\n\t\t\tfloat highest, lowest, contrast;\n\n\t\t};\n\n\t\tLuminanceData SampleLuminanceNeighborhood( sampler2D tex2D, vec2 texSize, vec2 uv ) {\n\n\t\t\tLuminanceData l;\n\t\t\tl.m = SampleLuminance( tex2D, uv );\n\t\t\tl.n = SampleLuminance( tex2D, texSize, uv, 0.0, 1.0 );\n\t\t\tl.e = SampleLuminance( tex2D, texSize, uv, 1.0, 0.0 );\n\t\t\tl.s = SampleLuminance( tex2D, texSize, uv, 0.0, -1.0 );\n\t\t\tl.w = SampleLuminance( tex2D, texSize, uv, -1.0, 0.0 );\n\n\t\t\tl.ne = SampleLuminance( tex2D, texSize, uv, 1.0, 1.0 );\n\t\t\tl.nw = SampleLuminance( tex2D, texSize, uv, -1.0, 1.0 );\n\t\t\tl.se = SampleLuminance( tex2D, texSize, uv, 1.0, -1.0 );\n\t\t\tl.sw = SampleLuminance( tex2D, texSize, uv, -1.0, -1.0 );\n\n\t\t\tl.highest = max( max( max( max( l.n, l.e ), l.s ), l.w ), l.m );\n\t\t\tl.lowest = min( min( min( min( l.n, l.e ), l.s ), l.w ), l.m );\n\t\t\tl.contrast = l.highest - l.lowest;\n\t\t\treturn l;\n\n\t\t}\n\n\t\tbool ShouldSkipPixel( LuminanceData l ) {\n\n\t\t\tfloat threshold = max( _ContrastThreshold, _RelativeThreshold * l.highest );\n\t\t\treturn l.contrast < threshold;\n\n\t\t}\n\n\t\tfloat DeterminePixelBlendFactor( LuminanceData l ) {\n\n\t\t\tfloat f = 2.0 * ( l.n + l.e + l.s + l.w );\n\t\t\tf += l.ne + l.nw + l.se + l.sw;\n\t\t\tf *= 1.0 / 12.0;\n\t\t\tf = abs( f - l.m );\n\t\t\tf = clamp( f / l.contrast, 0.0, 1.0 );\n\n\t\t\tfloat blendFactor = smoothstep( 0.0, 1.0, f );\n\t\t\treturn blendFactor * blendFactor * _SubpixelBlending;\n\n\t\t}\n\n\t\tstruct EdgeData {\n\n\t\t\tbool isHorizontal;\n\t\t\tfloat pixelStep;\n\t\t\tfloat oppositeLuminance, gradient;\n\n\t\t};\n\n\t\tEdgeData DetermineEdge( vec2 texSize, LuminanceData l ) {\n\n\t\t\tEdgeData e;\n\t\t\tfloat horizontal =\n\t\t\t\tabs( l.n + l.s - 2.0 * l.m ) * 2.0 +\n\t\t\t\tabs( l.ne + l.se - 2.0 * l.e ) +\n\t\t\t\tabs( l.nw + l.sw - 2.0 * l.w );\n\t\t\tfloat vertical =\n\t\t\t\tabs( l.e + l.w - 2.0 * l.m ) * 2.0 +\n\t\t\t\tabs( l.ne + l.nw - 2.0 * l.n ) +\n\t\t\t\tabs( l.se + l.sw - 2.0 * l.s );\n\t\t\te.isHorizontal = horizontal >= vertical;\n\n\t\t\tfloat pLuminance = e.isHorizontal ? l.n : l.e;\n\t\t\tfloat nLuminance = e.isHorizontal ? l.s : l.w;\n\t\t\tfloat pGradient = abs( pLuminance - l.m );\n\t\t\tfloat nGradient = abs( nLuminance - l.m );\n\n\t\t\te.pixelStep = e.isHorizontal ? texSize.y : texSize.x;\n\n\t\t\tif (pGradient < nGradient) {\n\n\t\t\t\te.pixelStep = -e.pixelStep;\n\t\t\t\te.oppositeLuminance = nLuminance;\n\t\t\t\te.gradient = nGradient;\n\n\t\t\t} else {\n\n\t\t\t\te.oppositeLuminance = pLuminance;\n\t\t\t\te.gradient = pGradient;\n\n\t\t\t}\n\n\t\t\treturn e;\n\n\t\t}\n\n\t\tfloat DetermineEdgeBlendFactor( sampler2D tex2D, vec2 texSize, LuminanceData l, EdgeData e, vec2 uv ) {\n\n\t\t\tvec2 uvEdge = uv;\n\t\t\tvec2 edgeStep;\n\t\t\tif (e.isHorizontal) {\n\n\t\t\t\tuvEdge.y += e.pixelStep * 0.5;\n\t\t\t\tedgeStep = vec2( texSize.x, 0.0 );\n\n\t\t\t} else {\n\n\t\t\t\tuvEdge.x += e.pixelStep * 0.5;\n\t\t\t\tedgeStep = vec2( 0.0, texSize.y );\n\n\t\t\t}\n\n\t\t\tfloat edgeLuminance = ( l.m + e.oppositeLuminance ) * 0.5;\n\t\t\tfloat gradientThreshold = e.gradient * 0.25;\n\n\t\t\tvec2 puv = uvEdge + edgeStep * edgeSteps[0];\n\t\t\tfloat pLuminanceDelta = SampleLuminance( tex2D, puv ) - edgeLuminance;\n\t\t\tbool pAtEnd = abs( pLuminanceDelta ) >= gradientThreshold;\n\n\t\t\tfor ( int i = 1; i < EDGE_STEP_COUNT && !pAtEnd; i++ ) {\n\n\t\t\t\tpuv += edgeStep * edgeSteps[i];\n\t\t\t\tpLuminanceDelta = SampleLuminance( tex2D, puv ) - edgeLuminance;\n\t\t\t\tpAtEnd = abs( pLuminanceDelta ) >= gradientThreshold;\n\n\t\t\t}\n\n\t\t\tif ( !pAtEnd ) {\n\n\t\t\t\tpuv += edgeStep * EDGE_GUESS;\n\n\t\t\t}\n\n\t\t\tvec2 nuv = uvEdge - edgeStep * edgeSteps[0];\n\t\t\tfloat nLuminanceDelta = SampleLuminance( tex2D, nuv ) - edgeLuminance;\n\t\t\tbool nAtEnd = abs( nLuminanceDelta ) >= gradientThreshold;\n\n\t\t\tfor ( int i = 1; i < EDGE_STEP_COUNT && !nAtEnd; i++ ) {\n\n\t\t\t\tnuv -= edgeStep * edgeSteps[i];\n\t\t\t\tnLuminanceDelta = SampleLuminance( tex2D, nuv ) - edgeLuminance;\n\t\t\t\tnAtEnd = abs( nLuminanceDelta ) >= gradientThreshold;\n\n\t\t\t}\n\n\t\t\tif ( !nAtEnd ) {\n\n\t\t\t\tnuv -= edgeStep * EDGE_GUESS;\n\n\t\t\t}\n\n\t\t\tfloat pDistance, nDistance;\n\t\t\tif ( e.isHorizontal ) {\n\n\t\t\t\tpDistance = puv.x - uv.x;\n\t\t\t\tnDistance = uv.x - nuv.x;\n\n\t\t\t} else {\n\n\t\t\t\tpDistance = puv.y - uv.y;\n\t\t\t\tnDistance = uv.y - nuv.y;\n\n\t\t\t}\n\n\t\t\tfloat shortestDistance;\n\t\t\tbool deltaSign;\n\t\t\tif ( pDistance <= nDistance ) {\n\n\t\t\t\tshortestDistance = pDistance;\n\t\t\t\tdeltaSign = pLuminanceDelta >= 0.0;\n\n\t\t\t} else {\n\n\t\t\t\tshortestDistance = nDistance;\n\t\t\t\tdeltaSign = nLuminanceDelta >= 0.0;\n\n\t\t\t}\n\n\t\t\tif ( deltaSign == ( l.m - edgeLuminance >= 0.0 ) ) {\n\n\t\t\t\treturn 0.0;\n\n\t\t\t}\n\n\t\t\treturn 0.5 - shortestDistance / ( pDistance + nDistance );\n\n\t\t}\n\n\t\tvec4 ApplyFXAA( sampler2D tex2D, vec2 texSize, vec2 uv ) {\n\n\t\t\tLuminanceData luminance = SampleLuminanceNeighborhood( tex2D, texSize, uv );\n\t\t\tif ( ShouldSkipPixel( luminance ) ) {\n\n\t\t\t\treturn Sample( tex2D, uv );\n\n\t\t\t}\n\n\t\t\tfloat pixelBlend = DeterminePixelBlendFactor( luminance );\n\t\t\tEdgeData edge = DetermineEdge( texSize, luminance );\n\t\t\tfloat edgeBlend = DetermineEdgeBlendFactor( tex2D, texSize, luminance, edge, uv );\n\t\t\tfloat finalBlend = max( pixelBlend, edgeBlend );\n\n\t\t\tif (edge.isHorizontal) {\n\n\t\t\t\tuv.y += edge.pixelStep * finalBlend;\n\n\t\t\t} else {\n\n\t\t\t\tuv.x += edge.pixelStep * finalBlend;\n\n\t\t\t}\n\n\t\t\treturn Sample( tex2D, uv );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = ApplyFXAA( tDiffuse, resolution.xy, vUv );\n\n\t\t}`\n )\n}, hc = {\n uniforms: {\n tDiffuse: { value: null },\n saturation: { value: 1.2 },\n // 饱和度值,1.0为原始,大于1.0增加饱和度\n contrast: { value: 1.2 }\n // 对比度值,1.0为原始,大于1.0增加对比度\n },\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n uniform sampler2D tDiffuse;\n uniform float saturation;\n uniform float contrast;\n varying vec2 vUv;\n \n void main() {\n vec4 color = texture2D(tDiffuse, vUv);\n \n // 转换为灰度值用于饱和度调整\n float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114));\n \n // 混合原始颜色和灰度值来调整饱和度\n color.rgb = mix(vec3(gray), color.rgb, saturation);\n \n // 调整对比度\n color.rgb = (color.rgb - 0.5) * contrast + 0.5;\n \n gl_FragColor = color;\n }\n `\n};\nclass uc {\n engine;\n composer;\n saturationPass;\n constructor(e) {\n this.engine = e;\n }\n resize() {\n const { width: e, height: t } = this.engine.deviceModule.getContainerSize(), n = e / t;\n if (this.composer) {\n this.composer.setPixelRatio(n), this.composer.setSize(e, t);\n const i = this.composer.passes.find((o) => o instanceof vi && o.material.uniforms.resolution);\n i && (i.material.uniforms.resolution.value.x = 1 / (e * n), i.material.uniforms.resolution.value.y = 1 / (t * n));\n }\n }\n init() {\n const { width: e, height: t } = this.engine.deviceModule.getContainerSize(), n = this.engine.scene, i = this.engine.camera, o = this.engine.renderer, r = e / t, a = new E.WebGLRenderTarget(e, t, {\n minFilter: E.LinearFilter,\n magFilter: E.LinearFilter,\n format: E.RGBAFormat,\n samples: 4\n // 启用多重采样抗锯齿\n });\n this.composer = new tc(o, a), this.composer.setPixelRatio(r), this.composer.setSize(e, t);\n const l = new nc(n, i);\n this.composer.addPass(l);\n const h = new Ne(n, i, e, t);\n h.output = Ne.OUTPUT.Default, h.blendIntensity = 0.5, h.updateGtaoMaterial && h.updateGtaoMaterial({\n radius: 1,\n // 减小半径以获得更紧密、更逼真的接触阴影 (原为 10)\n distanceExponent: 1,\n // 衰减\n thickness: 1,\n // 厚度\n scale: 1,\n // 缩放\n distanceFallOff: 1,\n // 距离衰减\n screenSpaceRadius: !0\n }), new yn(\n new E.Vector2(e, t),\n 0.1,\n // 强度\n 0.1,\n // 半径\n 0.5\n // 阈值\n ), this.saturationPass = new vi(hc), this.saturationPass.uniforms.saturation.value = 1.3, this.saturationPass.uniforms.contrast.value = 1.1, this.composer.addPass(this.saturationPass);\n const c = new lc();\n this.composer.addPass(c);\n const u = new vi(cc);\n u.material.uniforms.resolution.value.x = 1 / (e * r), u.material.uniforms.resolution.value.y = 1 / (t * r), this.composer.addPass(u);\n }\n}\nvar Yn = typeof globalThis < \"u\" ? globalThis : typeof window < \"u\" ? window : typeof global < \"u\" ? global : typeof self < \"u\" ? self : {};\nfunction qo(s) {\n return s && s.__esModule && Object.prototype.hasOwnProperty.call(s, \"default\") ? s.default : s;\n}\nfunction $n(s) {\n throw new Error('Could not dynamically require \"' + s + '\". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');\n}\nvar Qi = { exports: {} };\nvar Tr;\nfunction fc() {\n return Tr || (Tr = 1, (function(s, e) {\n (function(t) {\n s.exports = t();\n })(function() {\n return (function t(n, i, o) {\n function r(h, c) {\n if (!i[h]) {\n if (!n[h]) {\n var u = typeof $n == \"function\" && $n;\n if (!c && u) return u(h, !0);\n if (a) return a(h, !0);\n var d = new Error(\"Cannot find module '\" + h + \"'\");\n throw d.code = \"MODULE_NOT_FOUND\", d;\n }\n var p = i[h] = { exports: {} };\n n[h][0].call(p.exports, function(f) {\n var m = n[h][1][f];\n return r(m || f);\n }, p, p.exports, t, n, i, o);\n }\n return i[h].exports;\n }\n for (var a = typeof $n == \"function\" && $n, l = 0; l < o.length; l++) r(o[l]);\n return r;\n })({ 1: [function(t, n, i) {\n var o = t(\"./utils\"), r = t(\"./support\"), a = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n i.encode = function(l) {\n for (var h, c, u, d, p, f, m, g = [], y = 0, w = l.length, _ = w, x = o.getTypeOf(l) !== \"string\"; y < l.length; ) _ = w - y, u = x ? (h = l[y++], c = y < w ? l[y++] : 0, y < w ? l[y++] : 0) : (h = l.charCodeAt(y++), c = y < w ? l.charCodeAt(y++) : 0, y < w ? l.charCodeAt(y++) : 0), d = h >> 2, p = (3 & h) << 4 | c >> 4, f = 1 < _ ? (15 & c) << 2 | u >> 6 : 64, m = 2 < _ ? 63 & u : 64, g.push(a.charAt(d) + a.charAt(p) + a.charAt(f) + a.charAt(m));\n return g.join(\"\");\n }, i.decode = function(l) {\n var h, c, u, d, p, f, m = 0, g = 0, y = \"data:\";\n if (l.substr(0, y.length) === y) throw new Error(\"Invalid base64 input, it looks like a data url.\");\n var w, _ = 3 * (l = l.replace(/[^A-Za-z0-9+/=]/g, \"\")).length / 4;\n if (l.charAt(l.length - 1) === a.charAt(64) && _--, l.charAt(l.length - 2) === a.charAt(64) && _--, _ % 1 != 0) throw new Error(\"Invalid base64 input, bad content length.\");\n for (w = r.uint8array ? new Uint8Array(0 | _) : new Array(0 | _); m < l.length; ) h = a.indexOf(l.charAt(m++)) << 2 | (d = a.indexOf(l.charAt(m++))) >> 4, c = (15 & d) << 4 | (p = a.indexOf(l.charAt(m++))) >> 2, u = (3 & p) << 6 | (f = a.indexOf(l.charAt(m++))), w[g++] = h, p !== 64 && (w[g++] = c), f !== 64 && (w[g++] = u);\n return w;\n };\n }, { \"./support\": 30, \"./utils\": 32 }], 2: [function(t, n, i) {\n var o = t(\"./external\"), r = t(\"./stream/DataWorker\"), a = t(\"./stream/Crc32Probe\"), l = t(\"./stream/DataLengthProbe\");\n function h(c, u, d, p, f) {\n this.compressedSize = c, this.uncompressedSize = u, this.crc32 = d, this.compression = p, this.compressedContent = f;\n }\n h.prototype = { getContentWorker: function() {\n var c = new r(o.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new l(\"data_length\")), u = this;\n return c.on(\"end\", function() {\n if (this.streamInfo.data_length !== u.uncompressedSize) throw new Error(\"Bug : uncompressed data size mismatch\");\n }), c;\n }, getCompressedWorker: function() {\n return new r(o.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\", this.compressedSize).withStreamInfo(\"uncompressedSize\", this.uncompressedSize).withStreamInfo(\"crc32\", this.crc32).withStreamInfo(\"compression\", this.compression);\n } }, h.createWorkerFrom = function(c, u, d) {\n return c.pipe(new a()).pipe(new l(\"uncompressedSize\")).pipe(u.compressWorker(d)).pipe(new l(\"compressedSize\")).withStreamInfo(\"compression\", u);\n }, n.exports = h;\n }, { \"./external\": 6, \"./stream/Crc32Probe\": 25, \"./stream/DataLengthProbe\": 26, \"./stream/DataWorker\": 27 }], 3: [function(t, n, i) {\n var o = t(\"./stream/GenericWorker\");\n i.STORE = { magic: \"\\0\\0\", compressWorker: function() {\n return new o(\"STORE compression\");\n }, uncompressWorker: function() {\n return new o(\"STORE decompression\");\n } }, i.DEFLATE = t(\"./flate\");\n }, { \"./flate\": 7, \"./stream/GenericWorker\": 28 }], 4: [function(t, n, i) {\n var o = t(\"./utils\"), r = (function() {\n for (var a, l = [], h = 0; h < 256; h++) {\n a = h;\n for (var c = 0; c < 8; c++) a = 1 & a ? 3988292384 ^ a >>> 1 : a >>> 1;\n l[h] = a;\n }\n return l;\n })();\n n.exports = function(a, l) {\n return a !== void 0 && a.length ? o.getTypeOf(a) !== \"string\" ? (function(h, c, u, d) {\n var p = r, f = d + u;\n h ^= -1;\n for (var m = d; m < f; m++) h = h >>> 8 ^ p[255 & (h ^ c[m])];\n return -1 ^ h;\n })(0 | l, a, a.length, 0) : (function(h, c, u, d) {\n var p = r, f = d + u;\n h ^= -1;\n for (var m = d; m < f; m++) h = h >>> 8 ^ p[255 & (h ^ c.charCodeAt(m))];\n return -1 ^ h;\n })(0 | l, a, a.length, 0) : 0;\n };\n }, { \"./utils\": 32 }], 5: [function(t, n, i) {\n i.base64 = !1, i.binary = !1, i.dir = !1, i.createFolders = !0, i.date = null, i.compression = null, i.compressionOptions = null, i.comment = null, i.unixPermissions = null, i.dosPermissions = null;\n }, {}], 6: [function(t, n, i) {\n var o = null;\n o = typeof Promise < \"u\" ? Promise : t(\"lie\"), n.exports = { Promise: o };\n }, { lie: 37 }], 7: [function(t, n, i) {\n var o = typeof Uint8Array < \"u\" && typeof Uint16Array < \"u\" && typeof Uint32Array < \"u\", r = t(\"pako\"), a = t(\"./utils\"), l = t(\"./stream/GenericWorker\"), h = o ? \"uint8array\" : \"array\";\n function c(u, d) {\n l.call(this, \"FlateWorker/\" + u), this._pako = null, this._pakoAction = u, this._pakoOptions = d, this.meta = {};\n }\n i.magic = \"\\b\\0\", a.inherits(c, l), c.prototype.processChunk = function(u) {\n this.meta = u.meta, this._pako === null && this._createPako(), this._pako.push(a.transformTo(h, u.data), !1);\n }, c.prototype.flush = function() {\n l.prototype.flush.call(this), this._pako === null && this._createPako(), this._pako.push([], !0);\n }, c.prototype.cleanUp = function() {\n l.prototype.cleanUp.call(this), this._pako = null;\n }, c.prototype._createPako = function() {\n this._pako = new r[this._pakoAction]({ raw: !0, level: this._pakoOptions.level || -1 });\n var u = this;\n this._pako.onData = function(d) {\n u.push({ data: d, meta: u.meta });\n };\n }, i.compressWorker = function(u) {\n return new c(\"Deflate\", u);\n }, i.uncompressWorker = function() {\n return new c(\"Inflate\", {});\n };\n }, { \"./stream/GenericWorker\": 28, \"./utils\": 32, pako: 38 }], 8: [function(t, n, i) {\n function o(p, f) {\n var m, g = \"\";\n for (m = 0; m < f; m++) g += String.fromCharCode(255 & p), p >>>= 8;\n return g;\n }\n function r(p, f, m, g, y, w) {\n var _, x, b = p.file, A = p.compression, M = w !== h.utf8encode, C = a.transformTo(\"string\", w(b.name)), P = a.transformTo(\"string\", h.utf8encode(b.name)), k = b.comment, B = a.transformTo(\"string\", w(k)), T = a.transformTo(\"string\", h.utf8encode(k)), D = P.length !== b.name.length, v = T.length !== k.length, I = \"\", q = \"\", H = \"\", ee = b.dir, j = b.date, ne = { crc32: 0, compressedSize: 0, uncompressedSize: 0 };\n f && !m || (ne.crc32 = p.crc32, ne.compressedSize = p.compressedSize, ne.uncompressedSize = p.uncompressedSize);\n var O = 0;\n f && (O |= 8), M || !D && !v || (O |= 2048);\n var N = 0, te = 0;\n ee && (N |= 16), y === \"UNIX\" ? (te = 798, N |= (function(K, fe) {\n var pe = K;\n return K || (pe = fe ? 16893 : 33204), (65535 & pe) << 16;\n })(b.unixPermissions, ee)) : (te = 20, N |= (function(K) {\n return 63 & (K || 0);\n })(b.dosPermissions)), _ = j.getUTCHours(), _ <<= 6, _ |= j.getUTCMinutes(), _ <<= 5, _ |= j.getUTCSeconds() / 2, x = j.getUTCFullYear() - 1980, x <<= 4, x |= j.getUTCMonth() + 1, x <<= 5, x |= j.getUTCDate(), D && (q = o(1, 1) + o(c(C), 4) + P, I += \"up\" + o(q.length, 2) + q), v && (H = o(1, 1) + o(c(B), 4) + T, I += \"uc\" + o(H.length, 2) + H);\n var J = \"\";\n return J += `\n\\0`, J += o(O, 2), J += A.magic, J += o(_, 2), J += o(x, 2), J += o(ne.crc32, 4), J += o(ne.compressedSize, 4), J += o(ne.uncompressedSize, 4), J += o(C.length, 2), J += o(I.length, 2), { fileRecord: u.LOCAL_FILE_HEADER + J + C + I, dirRecord: u.CENTRAL_FILE_HEADER + o(te, 2) + J + o(B.length, 2) + \"\\0\\0\\0\\0\" + o(N, 4) + o(g, 4) + C + I + B };\n }\n var a = t(\"../utils\"), l = t(\"../stream/GenericWorker\"), h = t(\"../utf8\"), c = t(\"../crc32\"), u = t(\"../signature\");\n function d(p, f, m, g) {\n l.call(this, \"ZipFileWorker\"), this.bytesWritten = 0, this.zipComment = f, this.zipPlatform = m, this.encodeFileName = g, this.streamFiles = p, this.accumulate = !1, this.contentBuffer = [], this.dirRecords = [], this.currentSourceOffset = 0, this.entriesCount = 0, this.currentFile = null, this._sources = [];\n }\n a.inherits(d, l), d.prototype.push = function(p) {\n var f = p.meta.percent || 0, m = this.entriesCount, g = this._sources.length;\n this.accumulate ? this.contentBuffer.push(p) : (this.bytesWritten += p.data.length, l.prototype.push.call(this, { data: p.data, meta: { currentFile: this.currentFile, percent: m ? (f + 100 * (m - g - 1)) / m : 100 } }));\n }, d.prototype.openedSource = function(p) {\n this.currentSourceOffset = this.bytesWritten, this.currentFile = p.file.name;\n var f = this.streamFiles && !p.file.dir;\n if (f) {\n var m = r(p, f, !1, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);\n this.push({ data: m.fileRecord, meta: { percent: 0 } });\n } else this.accumulate = !0;\n }, d.prototype.closedSource = function(p) {\n this.accumulate = !1;\n var f = this.streamFiles && !p.file.dir, m = r(p, f, !0, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);\n if (this.dirRecords.push(m.dirRecord), f) this.push({ data: (function(g) {\n return u.DATA_DESCRIPTOR + o(g.crc32, 4) + o(g.compressedSize, 4) + o(g.uncompressedSize, 4);\n })(p), meta: { percent: 100 } });\n else for (this.push({ data: m.fileRecord, meta: { percent: 0 } }); this.contentBuffer.length; ) this.push(this.contentBuffer.shift());\n this.currentFile = null;\n }, d.prototype.flush = function() {\n for (var p = this.bytesWritten, f = 0; f < this.dirRecords.length; f++) this.push({ data: this.dirRecords[f], meta: { percent: 100 } });\n var m = this.bytesWritten - p, g = (function(y, w, _, x, b) {\n var A = a.transformTo(\"string\", b(x));\n return u.CENTRAL_DIRECTORY_END + \"\\0\\0\\0\\0\" + o(y, 2) + o(y, 2) + o(w, 4) + o(_, 4) + o(A.length, 2) + A;\n })(this.dirRecords.length, m, p, this.zipComment, this.encodeFileName);\n this.push({ data: g, meta: { percent: 100 } });\n }, d.prototype.prepareNextSource = function() {\n this.previous = this._sources.shift(), this.openedSource(this.previous.streamInfo), this.isPaused ? this.previous.pause() : this.previous.resume();\n }, d.prototype.registerPrevious = function(p) {\n this._sources.push(p);\n var f = this;\n return p.on(\"data\", function(m) {\n f.processChunk(m);\n }), p.on(\"end\", function() {\n f.closedSource(f.previous.streamInfo), f._sources.length ? f.prepareNextSource() : f.end();\n }), p.on(\"error\", function(m) {\n f.error(m);\n }), this;\n }, d.prototype.resume = function() {\n return !!l.prototype.resume.call(this) && (!this.previous && this._sources.length ? (this.prepareNextSource(), !0) : this.previous || this._sources.length || this.generatedError ? void 0 : (this.end(), !0));\n }, d.prototype.error = function(p) {\n var f = this._sources;\n if (!l.prototype.error.call(this, p)) return !1;\n for (var m = 0; m < f.length; m++) try {\n f[m].error(p);\n } catch {\n }\n return !0;\n }, d.prototype.lock = function() {\n l.prototype.lock.call(this);\n for (var p = this._sources, f = 0; f < p.length; f++) p[f].lock();\n }, n.exports = d;\n }, { \"../crc32\": 4, \"../signature\": 23, \"../stream/GenericWorker\": 28, \"../utf8\": 31, \"../utils\": 32 }], 9: [function(t, n, i) {\n var o = t(\"../compressions\"), r = t(\"./ZipFileWorker\");\n i.generateWorker = function(a, l, h) {\n var c = new r(l.streamFiles, h, l.platform, l.encodeFileName), u = 0;\n try {\n a.forEach(function(d, p) {\n u++;\n var f = (function(w, _) {\n var x = w || _, b = o[x];\n if (!b) throw new Error(x + \" is not a valid compression method !\");\n return b;\n })(p.options.compression, l.compression), m = p.options.compressionOptions || l.compressionOptions || {}, g = p.dir, y = p.date;\n p._compressWorker(f, m).withStreamInfo(\"file\", { name: d, dir: g, date: y, comment: p.comment || \"\", unixPermissions: p.unixPermissions, dosPermissions: p.dosPermissions }).pipe(c);\n }), c.entriesCount = u;\n } catch (d) {\n c.error(d);\n }\n return c;\n };\n }, { \"../compressions\": 3, \"./ZipFileWorker\": 8 }], 10: [function(t, n, i) {\n function o() {\n if (!(this instanceof o)) return new o();\n if (arguments.length) throw new Error(\"The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.\");\n this.files = /* @__PURE__ */ Object.create(null), this.comment = null, this.root = \"\", this.clone = function() {\n var r = new o();\n for (var a in this) typeof this[a] != \"function\" && (r[a] = this[a]);\n return r;\n };\n }\n (o.prototype = t(\"./object\")).loadAsync = t(\"./load\"), o.support = t(\"./support\"), o.defaults = t(\"./defaults\"), o.version = \"3.10.1\", o.loadAsync = function(r, a) {\n return new o().loadAsync(r, a);\n }, o.external = t(\"./external\"), n.exports = o;\n }, { \"./defaults\": 5, \"./external\": 6, \"./load\": 11, \"./object\": 15, \"./support\": 30 }], 11: [function(t, n, i) {\n var o = t(\"./utils\"), r = t(\"./external\"), a = t(\"./utf8\"), l = t(\"./zipEntries\"), h = t(\"./stream/Crc32Probe\"), c = t(\"./nodejsUtils\");\n function u(d) {\n return new r.Promise(function(p, f) {\n var m = d.decompressed.getContentWorker().pipe(new h());\n m.on(\"error\", function(g) {\n f(g);\n }).on(\"end\", function() {\n m.streamInfo.crc32 !== d.decompressed.crc32 ? f(new Error(\"Corrupted zip : CRC32 mismatch\")) : p();\n }).resume();\n });\n }\n n.exports = function(d, p) {\n var f = this;\n return p = o.extend(p || {}, { base64: !1, checkCRC32: !1, optimizedBinaryString: !1, createFolders: !1, decodeFileName: a.utf8decode }), c.isNode && c.isStream(d) ? r.Promise.reject(new Error(\"JSZip can't accept a stream when loading a zip file.\")) : o.prepareContent(\"the loaded zip file\", d, !0, p.optimizedBinaryString, p.base64).then(function(m) {\n var g = new l(p);\n return g.load(m), g;\n }).then(function(m) {\n var g = [r.Promise.resolve(m)], y = m.files;\n if (p.checkCRC32) for (var w = 0; w < y.length; w++) g.push(u(y[w]));\n return r.Promise.all(g);\n }).then(function(m) {\n for (var g = m.shift(), y = g.files, w = 0; w < y.length; w++) {\n var _ = y[w], x = _.fileNameStr, b = o.resolve(_.fileNameStr);\n f.file(b, _.decompressed, { binary: !0, optimizedBinaryString: !0, date: _.date, dir: _.dir, comment: _.fileCommentStr.length ? _.fileCommentStr : null, unixPermissions: _.unixPermissions, dosPermissions: _.dosPermissions, createFolders: p.createFolders }), _.dir || (f.file(b).unsafeOriginalName = x);\n }\n return g.zipComment.length && (f.comment = g.zipComment), f;\n });\n };\n }, { \"./external\": 6, \"./nodejsUtils\": 14, \"./stream/Crc32Probe\": 25, \"./utf8\": 31, \"./utils\": 32, \"./zipEntries\": 33 }], 12: [function(t, n, i) {\n var o = t(\"../utils\"), r = t(\"../stream/GenericWorker\");\n function a(l, h) {\n r.call(this, \"Nodejs stream input adapter for \" + l), this._upstreamEnded = !1, this._bindStream(h);\n }\n o.inherits(a, r), a.prototype._bindStream = function(l) {\n var h = this;\n (this._stream = l).pause(), l.on(\"data\", function(c) {\n h.push({ data: c, meta: { percent: 0 } });\n }).on(\"error\", function(c) {\n h.isPaused ? this.generatedError = c : h.error(c);\n }).on(\"end\", function() {\n h.isPaused ? h._upstreamEnded = !0 : h.end();\n });\n }, a.prototype.pause = function() {\n return !!r.prototype.pause.call(this) && (this._stream.pause(), !0);\n }, a.prototype.resume = function() {\n return !!r.prototype.resume.call(this) && (this._upstreamEnded ? this.end() : this._stream.resume(), !0);\n }, n.exports = a;\n }, { \"../stream/GenericWorker\": 28, \"../utils\": 32 }], 13: [function(t, n, i) {\n var o = t(\"readable-stream\").Readable;\n function r(a, l, h) {\n o.call(this, l), this._helper = a;\n var c = this;\n a.on(\"data\", function(u, d) {\n c.push(u) || c._helper.pause(), h && h(d);\n }).on(\"error\", function(u) {\n c.emit(\"error\", u);\n }).on(\"end\", function() {\n c.push(null);\n });\n }\n t(\"../utils\").inherits(r, o), r.prototype._read = function() {\n this._helper.resume();\n }, n.exports = r;\n }, { \"../utils\": 32, \"readable-stream\": 16 }], 14: [function(t, n, i) {\n n.exports = { isNode: typeof Buffer < \"u\", newBufferFrom: function(o, r) {\n if (Buffer.from && Buffer.from !== Uint8Array.from) return Buffer.from(o, r);\n if (typeof o == \"number\") throw new Error('The \"data\" argument must not be a number');\n return new Buffer(o, r);\n }, allocBuffer: function(o) {\n if (Buffer.alloc) return Buffer.alloc(o);\n var r = new Buffer(o);\n return r.fill(0), r;\n }, isBuffer: function(o) {\n return Buffer.isBuffer(o);\n }, isStream: function(o) {\n return o && typeof o.on == \"function\" && typeof o.pause == \"function\" && typeof o.resume == \"function\";\n } };\n }, {}], 15: [function(t, n, i) {\n function o(b, A, M) {\n var C, P = a.getTypeOf(A), k = a.extend(M || {}, c);\n k.date = k.date || /* @__PURE__ */ new Date(), k.compression !== null && (k.compression = k.compression.toUpperCase()), typeof k.unixPermissions == \"string\" && (k.unixPermissions = parseInt(k.unixPermissions, 8)), k.unixPermissions && 16384 & k.unixPermissions && (k.dir = !0), k.dosPermissions && 16 & k.dosPermissions && (k.dir = !0), k.dir && (b = y(b)), k.createFolders && (C = g(b)) && w.call(this, C, !0);\n var B = P === \"string\" && k.binary === !1 && k.base64 === !1;\n M && M.binary !== void 0 || (k.binary = !B), (A instanceof u && A.uncompressedSize === 0 || k.dir || !A || A.length === 0) && (k.base64 = !1, k.binary = !0, A = \"\", k.compression = \"STORE\", P = \"string\");\n var T = null;\n T = A instanceof u || A instanceof l ? A : f.isNode && f.isStream(A) ? new m(b, A) : a.prepareContent(b, A, k.binary, k.optimizedBinaryString, k.base64);\n var D = new d(b, T, k);\n this.files[b] = D;\n }\n var r = t(\"./utf8\"), a = t(\"./utils\"), l = t(\"./stream/GenericWorker\"), h = t(\"./stream/StreamHelper\"), c = t(\"./defaults\"), u = t(\"./compressedObject\"), d = t(\"./zipObject\"), p = t(\"./generate\"), f = t(\"./nodejsUtils\"), m = t(\"./nodejs/NodejsStreamInputAdapter\"), g = function(b) {\n b.slice(-1) === \"/\" && (b = b.substring(0, b.length - 1));\n var A = b.lastIndexOf(\"/\");\n return 0 < A ? b.substring(0, A) : \"\";\n }, y = function(b) {\n return b.slice(-1) !== \"/\" && (b += \"/\"), b;\n }, w = function(b, A) {\n return A = A !== void 0 ? A : c.createFolders, b = y(b), this.files[b] || o.call(this, b, null, { dir: !0, createFolders: A }), this.files[b];\n };\n function _(b) {\n return Object.prototype.toString.call(b) === \"[object RegExp]\";\n }\n var x = { load: function() {\n throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n }, forEach: function(b) {\n var A, M, C;\n for (A in this.files) C = this.files[A], (M = A.slice(this.root.length, A.length)) && A.slice(0, this.root.length) === this.root && b(M, C);\n }, filter: function(b) {\n var A = [];\n return this.forEach(function(M, C) {\n b(M, C) && A.push(C);\n }), A;\n }, file: function(b, A, M) {\n if (arguments.length !== 1) return b = this.root + b, o.call(this, b, A, M), this;\n if (_(b)) {\n var C = b;\n return this.filter(function(k, B) {\n return !B.dir && C.test(k);\n });\n }\n var P = this.files[this.root + b];\n return P && !P.dir ? P : null;\n }, folder: function(b) {\n if (!b) return this;\n if (_(b)) return this.filter(function(P, k) {\n return k.dir && b.test(P);\n });\n var A = this.root + b, M = w.call(this, A), C = this.clone();\n return C.root = M.name, C;\n }, remove: function(b) {\n b = this.root + b;\n var A = this.files[b];\n if (A || (b.slice(-1) !== \"/\" && (b += \"/\"), A = this.files[b]), A && !A.dir) delete this.files[b];\n else for (var M = this.filter(function(P, k) {\n return k.name.slice(0, b.length) === b;\n }), C = 0; C < M.length; C++) delete this.files[M[C].name];\n return this;\n }, generate: function() {\n throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n }, generateInternalStream: function(b) {\n var A, M = {};\n try {\n if ((M = a.extend(b || {}, { streamFiles: !1, compression: \"STORE\", compressionOptions: null, type: \"\", platform: \"DOS\", comment: null, mimeType: \"application/zip\", encodeFileName: r.utf8encode })).type = M.type.toLowerCase(), M.compression = M.compression.toUpperCase(), M.type === \"binarystring\" && (M.type = \"string\"), !M.type) throw new Error(\"No output type specified.\");\n a.checkSupport(M.type), M.platform !== \"darwin\" && M.platform !== \"freebsd\" && M.platform !== \"linux\" && M.platform !== \"sunos\" || (M.platform = \"UNIX\"), M.platform === \"win32\" && (M.platform = \"DOS\");\n var C = M.comment || this.comment || \"\";\n A = p.generateWorker(this, M, C);\n } catch (P) {\n (A = new l(\"error\")).error(P);\n }\n return new h(A, M.type || \"string\", M.mimeType);\n }, generateAsync: function(b, A) {\n return this.generateInternalStream(b).accumulate(A);\n }, generateNodeStream: function(b, A) {\n return (b = b || {}).type || (b.type = \"nodebuffer\"), this.generateInternalStream(b).toNodejsStream(A);\n } };\n n.exports = x;\n }, { \"./compressedObject\": 2, \"./defaults\": 5, \"./generate\": 9, \"./nodejs/NodejsStreamInputAdapter\": 12, \"./nodejsUtils\": 14, \"./stream/GenericWorker\": 28, \"./stream/StreamHelper\": 29, \"./utf8\": 31, \"./utils\": 32, \"./zipObject\": 35 }], 16: [function(t, n, i) {\n n.exports = t(\"stream\");\n }, { stream: void 0 }], 17: [function(t, n, i) {\n var o = t(\"./DataReader\");\n function r(a) {\n o.call(this, a);\n for (var l = 0; l < this.data.length; l++) a[l] = 255 & a[l];\n }\n t(\"../utils\").inherits(r, o), r.prototype.byteAt = function(a) {\n return this.data[this.zero + a];\n }, r.prototype.lastIndexOfSignature = function(a) {\n for (var l = a.charCodeAt(0), h = a.charCodeAt(1), c = a.charCodeAt(2), u = a.charCodeAt(3), d = this.length - 4; 0 <= d; --d) if (this.data[d] === l && this.data[d + 1] === h && this.data[d + 2] === c && this.data[d + 3] === u) return d - this.zero;\n return -1;\n }, r.prototype.readAndCheckSignature = function(a) {\n var l = a.charCodeAt(0), h = a.charCodeAt(1), c = a.charCodeAt(2), u = a.charCodeAt(3), d = this.readData(4);\n return l === d[0] && h === d[1] && c === d[2] && u === d[3];\n }, r.prototype.readData = function(a) {\n if (this.checkOffset(a), a === 0) return [];\n var l = this.data.slice(this.zero + this.index, this.zero + this.index + a);\n return this.index += a, l;\n }, n.exports = r;\n }, { \"../utils\": 32, \"./DataReader\": 18 }], 18: [function(t, n, i) {\n var o = t(\"../utils\");\n function r(a) {\n this.data = a, this.length = a.length, this.index = 0, this.zero = 0;\n }\n r.prototype = { checkOffset: function(a) {\n this.checkIndex(this.index + a);\n }, checkIndex: function(a) {\n if (this.length < this.zero + a || a < 0) throw new Error(\"End of data reached (data length = \" + this.length + \", asked index = \" + a + \"). Corrupted zip ?\");\n }, setIndex: function(a) {\n this.checkIndex(a), this.index = a;\n }, skip: function(a) {\n this.setIndex(this.index + a);\n }, byteAt: function() {\n }, readInt: function(a) {\n var l, h = 0;\n for (this.checkOffset(a), l = this.index + a - 1; l >= this.index; l--) h = (h << 8) + this.byteAt(l);\n return this.index += a, h;\n }, readString: function(a) {\n return o.transformTo(\"string\", this.readData(a));\n }, readData: function() {\n }, lastIndexOfSignature: function() {\n }, readAndCheckSignature: function() {\n }, readDate: function() {\n var a = this.readInt(4);\n return new Date(Date.UTC(1980 + (a >> 25 & 127), (a >> 21 & 15) - 1, a >> 16 & 31, a >> 11 & 31, a >> 5 & 63, (31 & a) << 1));\n } }, n.exports = r;\n }, { \"../utils\": 32 }], 19: [function(t, n, i) {\n var o = t(\"./Uint8ArrayReader\");\n function r(a) {\n o.call(this, a);\n }\n t(\"../utils\").inherits(r, o), r.prototype.readData = function(a) {\n this.checkOffset(a);\n var l = this.data.slice(this.zero + this.index, this.zero + this.index + a);\n return this.index += a, l;\n }, n.exports = r;\n }, { \"../utils\": 32, \"./Uint8ArrayReader\": 21 }], 20: [function(t, n, i) {\n var o = t(\"./DataReader\");\n function r(a) {\n o.call(this, a);\n }\n t(\"../utils\").inherits(r, o), r.prototype.byteAt = function(a) {\n return this.data.charCodeAt(this.zero + a);\n }, r.prototype.lastIndexOfSignature = function(a) {\n return this.data.lastIndexOf(a) - this.zero;\n }, r.prototype.readAndCheckSignature = function(a) {\n return a === this.readData(4);\n }, r.prototype.readData = function(a) {\n this.checkOffset(a);\n var l = this.data.slice(this.zero + this.index, this.zero + this.index + a);\n return this.index += a, l;\n }, n.exports = r;\n }, { \"../utils\": 32, \"./DataReader\": 18 }], 21: [function(t, n, i) {\n var o = t(\"./ArrayReader\");\n function r(a) {\n o.call(this, a);\n }\n t(\"../utils\").inherits(r, o), r.prototype.readData = function(a) {\n if (this.checkOffset(a), a === 0) return new Uint8Array(0);\n var l = this.data.subarray(this.zero + this.index, this.zero + this.index + a);\n return this.index += a, l;\n }, n.exports = r;\n }, { \"../utils\": 32, \"./ArrayReader\": 17 }], 22: [function(t, n, i) {\n var o = t(\"../utils\"), r = t(\"../support\"), a = t(\"./ArrayReader\"), l = t(\"./StringReader\"), h = t(\"./NodeBufferReader\"), c = t(\"./Uint8ArrayReader\");\n n.exports = function(u) {\n var d = o.getTypeOf(u);\n return o.checkSupport(d), d !== \"string\" || r.uint8array ? d === \"nodebuffer\" ? new h(u) : r.uint8array ? new c(o.transformTo(\"uint8array\", u)) : new a(o.transformTo(\"array\", u)) : new l(u);\n };\n }, { \"../support\": 30, \"../utils\": 32, \"./ArrayReader\": 17, \"./NodeBufferReader\": 19, \"./StringReader\": 20, \"./Uint8ArrayReader\": 21 }], 23: [function(t, n, i) {\n i.LOCAL_FILE_HEADER = \"PK\u0003\u0004\", i.CENTRAL_FILE_HEADER = \"PK\u0001\u0002\", i.CENTRAL_DIRECTORY_END = \"PK\u0005\u0006\", i.ZIP64_CENTRAL_DIRECTORY_LOCATOR = \"PK\u0006\\x07\", i.ZIP64_CENTRAL_DIRECTORY_END = \"PK\u0006\u0006\", i.DATA_DESCRIPTOR = \"PK\\x07\\b\";\n }, {}], 24: [function(t, n, i) {\n var o = t(\"./GenericWorker\"), r = t(\"../utils\");\n function a(l) {\n o.call(this, \"ConvertWorker to \" + l), this.destType = l;\n }\n r.inherits(a, o), a.prototype.processChunk = function(l) {\n this.push({ data: r.transformTo(this.destType, l.data), meta: l.meta });\n }, n.exports = a;\n }, { \"../utils\": 32, \"./GenericWorker\": 28 }], 25: [function(t, n, i) {\n var o = t(\"./GenericWorker\"), r = t(\"../crc32\");\n function a() {\n o.call(this, \"Crc32Probe\"), this.withStreamInfo(\"crc32\", 0);\n }\n t(\"../utils\").inherits(a, o), a.prototype.processChunk = function(l) {\n this.streamInfo.crc32 = r(l.data, this.streamInfo.crc32 || 0), this.push(l);\n }, n.exports = a;\n }, { \"../crc32\": 4, \"../utils\": 32, \"./GenericWorker\": 28 }], 26: [function(t, n, i) {\n var o = t(\"../utils\"), r = t(\"./GenericWorker\");\n function a(l) {\n r.call(this, \"DataLengthProbe for \" + l), this.propName = l, this.withStreamInfo(l, 0);\n }\n o.inherits(a, r), a.prototype.processChunk = function(l) {\n if (l) {\n var h = this.streamInfo[this.propName] || 0;\n this.streamInfo[this.propName] = h + l.data.length;\n }\n r.prototype.processChunk.call(this, l);\n }, n.exports = a;\n }, { \"../utils\": 32, \"./GenericWorker\": 28 }], 27: [function(t, n, i) {\n var o = t(\"../utils\"), r = t(\"./GenericWorker\");\n function a(l) {\n r.call(this, \"DataWorker\");\n var h = this;\n this.dataIsReady = !1, this.index = 0, this.max = 0, this.data = null, this.type = \"\", this._tickScheduled = !1, l.then(function(c) {\n h.dataIsReady = !0, h.data = c, h.max = c && c.length || 0, h.type = o.getTypeOf(c), h.isPaused || h._tickAndRepeat();\n }, function(c) {\n h.error(c);\n });\n }\n o.inherits(a, r), a.prototype.cleanUp = function() {\n r.prototype.cleanUp.call(this), this.data = null;\n }, a.prototype.resume = function() {\n return !!r.prototype.resume.call(this) && (!this._tickScheduled && this.dataIsReady && (this._tickScheduled = !0, o.delay(this._tickAndRepeat, [], this)), !0);\n }, a.prototype._tickAndRepeat = function() {\n this._tickScheduled = !1, this.isPaused || this.isFinished || (this._tick(), this.isFinished || (o.delay(this._tickAndRepeat, [], this), this._tickScheduled = !0));\n }, a.prototype._tick = function() {\n if (this.isPaused || this.isFinished) return !1;\n var l = null, h = Math.min(this.max, this.index + 16384);\n if (this.index >= this.max) return this.end();\n switch (this.type) {\n case \"string\":\n l = this.data.substring(this.index, h);\n break;\n case \"uint8array\":\n l = this.data.subarray(this.index, h);\n break;\n case \"array\":\n case \"nodebuffer\":\n l = this.data.slice(this.index, h);\n }\n return this.index = h, this.push({ data: l, meta: { percent: this.max ? this.index / this.max * 100 : 0 } });\n }, n.exports = a;\n }, { \"../utils\": 32, \"./GenericWorker\": 28 }], 28: [function(t, n, i) {\n function o(r) {\n this.name = r || \"default\", this.streamInfo = {}, this.generatedError = null, this.extraStreamInfo = {}, this.isPaused = !0, this.isFinished = !1, this.isLocked = !1, this._listeners = { data: [], end: [], error: [] }, this.previous = null;\n }\n o.prototype = { push: function(r) {\n this.emit(\"data\", r);\n }, end: function() {\n if (this.isFinished) return !1;\n this.flush();\n try {\n this.emit(\"end\"), this.cleanUp(), this.isFinished = !0;\n } catch (r) {\n this.emit(\"error\", r);\n }\n return !0;\n }, error: function(r) {\n return !this.isFinished && (this.isPaused ? this.generatedError = r : (this.isFinished = !0, this.emit(\"error\", r), this.previous && this.previous.error(r), this.cleanUp()), !0);\n }, on: function(r, a) {\n return this._listeners[r].push(a), this;\n }, cleanUp: function() {\n this.streamInfo = this.generatedError = this.extraStreamInfo = null, this._listeners = [];\n }, emit: function(r, a) {\n if (this._listeners[r]) for (var l = 0; l < this._listeners[r].length; l++) this._listeners[r][l].call(this, a);\n }, pipe: function(r) {\n return r.registerPrevious(this);\n }, registerPrevious: function(r) {\n if (this.isLocked) throw new Error(\"The stream '\" + this + \"' has already been used.\");\n this.streamInfo = r.streamInfo, this.mergeStreamInfo(), this.previous = r;\n var a = this;\n return r.on(\"data\", function(l) {\n a.processChunk(l);\n }), r.on(\"end\", function() {\n a.end();\n }), r.on(\"error\", function(l) {\n a.error(l);\n }), this;\n }, pause: function() {\n return !this.isPaused && !this.isFinished && (this.isPaused = !0, this.previous && this.previous.pause(), !0);\n }, resume: function() {\n if (!this.isPaused || this.isFinished) return !1;\n var r = this.isPaused = !1;\n return this.generatedError && (this.error(this.generatedError), r = !0), this.previous && this.previous.resume(), !r;\n }, flush: function() {\n }, processChunk: function(r) {\n this.push(r);\n }, withStreamInfo: function(r, a) {\n return this.extraStreamInfo[r] = a, this.mergeStreamInfo(), this;\n }, mergeStreamInfo: function() {\n for (var r in this.extraStreamInfo) Object.prototype.hasOwnProperty.call(this.extraStreamInfo, r) && (this.streamInfo[r] = this.extraStreamInfo[r]);\n }, lock: function() {\n if (this.isLocked) throw new Error(\"The stream '\" + this + \"' has already been used.\");\n this.isLocked = !0, this.previous && this.previous.lock();\n }, toString: function() {\n var r = \"Worker \" + this.name;\n return this.previous ? this.previous + \" -> \" + r : r;\n } }, n.exports = o;\n }, {}], 29: [function(t, n, i) {\n var o = t(\"../utils\"), r = t(\"./ConvertWorker\"), a = t(\"./GenericWorker\"), l = t(\"../base64\"), h = t(\"../support\"), c = t(\"../external\"), u = null;\n if (h.nodestream) try {\n u = t(\"../nodejs/NodejsStreamOutputAdapter\");\n } catch {\n }\n function d(f, m) {\n return new c.Promise(function(g, y) {\n var w = [], _ = f._internalType, x = f._outputType, b = f._mimeType;\n f.on(\"data\", function(A, M) {\n w.push(A), m && m(M);\n }).on(\"error\", function(A) {\n w = [], y(A);\n }).on(\"end\", function() {\n try {\n var A = (function(M, C, P) {\n switch (M) {\n case \"blob\":\n return o.newBlob(o.transformTo(\"arraybuffer\", C), P);\n case \"base64\":\n return l.encode(C);\n default:\n return o.transformTo(M, C);\n }\n })(x, (function(M, C) {\n var P, k = 0, B = null, T = 0;\n for (P = 0; P < C.length; P++) T += C[P].length;\n switch (M) {\n case \"string\":\n return C.join(\"\");\n case \"array\":\n return Array.prototype.concat.apply([], C);\n case \"uint8array\":\n for (B = new Uint8Array(T), P = 0; P < C.length; P++) B.set(C[P], k), k += C[P].length;\n return B;\n case \"nodebuffer\":\n return Buffer.concat(C);\n default:\n throw new Error(\"concat : unsupported type '\" + M + \"'\");\n }\n })(_, w), b);\n g(A);\n } catch (M) {\n y(M);\n }\n w = [];\n }).resume();\n });\n }\n function p(f, m, g) {\n var y = m;\n switch (m) {\n case \"blob\":\n case \"arraybuffer\":\n y = \"uint8array\";\n break;\n case \"base64\":\n y = \"string\";\n }\n try {\n this._internalType = y, this._outputType = m, this._mimeType = g, o.checkSupport(y), this._worker = f.pipe(new r(y)), f.lock();\n } catch (w) {\n this._worker = new a(\"error\"), this._worker.error(w);\n }\n }\n p.prototype = { accumulate: function(f) {\n return d(this, f);\n }, on: function(f, m) {\n var g = this;\n return f === \"data\" ? this._worker.on(f, function(y) {\n m.call(g, y.data, y.meta);\n }) : this._worker.on(f, function() {\n o.delay(m, arguments, g);\n }), this;\n }, resume: function() {\n return o.delay(this._worker.resume, [], this._worker), this;\n }, pause: function() {\n return this._worker.pause(), this;\n }, toNodejsStream: function(f) {\n if (o.checkSupport(\"nodestream\"), this._outputType !== \"nodebuffer\") throw new Error(this._outputType + \" is not supported by this method\");\n return new u(this, { objectMode: this._outputType !== \"nodebuffer\" }, f);\n } }, n.exports = p;\n }, { \"../base64\": 1, \"../external\": 6, \"../nodejs/NodejsStreamOutputAdapter\": 13, \"../support\": 30, \"../utils\": 32, \"./ConvertWorker\": 24, \"./GenericWorker\": 28 }], 30: [function(t, n, i) {\n if (i.base64 = !0, i.array = !0, i.string = !0, i.arraybuffer = typeof ArrayBuffer < \"u\" && typeof Uint8Array < \"u\", i.nodebuffer = typeof Buffer < \"u\", i.uint8array = typeof Uint8Array < \"u\", typeof ArrayBuffer > \"u\") i.blob = !1;\n else {\n var o = new ArrayBuffer(0);\n try {\n i.blob = new Blob([o], { type: \"application/zip\" }).size === 0;\n } catch {\n try {\n var r = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();\n r.append(o), i.blob = r.getBlob(\"application/zip\").size === 0;\n } catch {\n i.blob = !1;\n }\n }\n }\n try {\n i.nodestream = !!t(\"readable-stream\").Readable;\n } catch {\n i.nodestream = !1;\n }\n }, { \"readable-stream\": 16 }], 31: [function(t, n, i) {\n for (var o = t(\"./utils\"), r = t(\"./support\"), a = t(\"./nodejsUtils\"), l = t(\"./stream/GenericWorker\"), h = new Array(256), c = 0; c < 256; c++) h[c] = 252 <= c ? 6 : 248 <= c ? 5 : 240 <= c ? 4 : 224 <= c ? 3 : 192 <= c ? 2 : 1;\n h[254] = h[254] = 1;\n function u() {\n l.call(this, \"utf-8 decode\"), this.leftOver = null;\n }\n function d() {\n l.call(this, \"utf-8 encode\");\n }\n i.utf8encode = function(p) {\n return r.nodebuffer ? a.newBufferFrom(p, \"utf-8\") : (function(f) {\n var m, g, y, w, _, x = f.length, b = 0;\n for (w = 0; w < x; w++) (64512 & (g = f.charCodeAt(w))) == 55296 && w + 1 < x && (64512 & (y = f.charCodeAt(w + 1))) == 56320 && (g = 65536 + (g - 55296 << 10) + (y - 56320), w++), b += g < 128 ? 1 : g < 2048 ? 2 : g < 65536 ? 3 : 4;\n for (m = r.uint8array ? new Uint8Array(b) : new Array(b), w = _ = 0; _ < b; w++) (64512 & (g = f.charCodeAt(w))) == 55296 && w + 1 < x && (64512 & (y = f.charCodeAt(w + 1))) == 56320 && (g = 65536 + (g - 55296 << 10) + (y - 56320), w++), g < 128 ? m[_++] = g : (g < 2048 ? m[_++] = 192 | g >>> 6 : (g < 65536 ? m[_++] = 224 | g >>> 12 : (m[_++] = 240 | g >>> 18, m[_++] = 128 | g >>> 12 & 63), m[_++] = 128 | g >>> 6 & 63), m[_++] = 128 | 63 & g);\n return m;\n })(p);\n }, i.utf8decode = function(p) {\n return r.nodebuffer ? o.transformTo(\"nodebuffer\", p).toString(\"utf-8\") : (function(f) {\n var m, g, y, w, _ = f.length, x = new Array(2 * _);\n for (m = g = 0; m < _; ) if ((y = f[m++]) < 128) x[g++] = y;\n else if (4 < (w = h[y])) x[g++] = 65533, m += w - 1;\n else {\n for (y &= w === 2 ? 31 : w === 3 ? 15 : 7; 1 < w && m < _; ) y = y << 6 | 63 & f[m++], w--;\n 1 < w ? x[g++] = 65533 : y < 65536 ? x[g++] = y : (y -= 65536, x[g++] = 55296 | y >> 10 & 1023, x[g++] = 56320 | 1023 & y);\n }\n return x.length !== g && (x.subarray ? x = x.subarray(0, g) : x.length = g), o.applyFromCharCode(x);\n })(p = o.transformTo(r.uint8array ? \"uint8array\" : \"array\", p));\n }, o.inherits(u, l), u.prototype.processChunk = function(p) {\n var f = o.transformTo(r.uint8array ? \"uint8array\" : \"array\", p.data);\n if (this.leftOver && this.leftOver.length) {\n if (r.uint8array) {\n var m = f;\n (f = new Uint8Array(m.length + this.leftOver.length)).set(this.leftOver, 0), f.set(m, this.leftOver.length);\n } else f = this.leftOver.concat(f);\n this.leftOver = null;\n }\n var g = (function(w, _) {\n var x;\n for ((_ = _ || w.length) > w.length && (_ = w.length), x = _ - 1; 0 <= x && (192 & w[x]) == 128; ) x--;\n return x < 0 || x === 0 ? _ : x + h[w[x]] > _ ? x : _;\n })(f), y = f;\n g !== f.length && (r.uint8array ? (y = f.subarray(0, g), this.leftOver = f.subarray(g, f.length)) : (y = f.slice(0, g), this.leftOver = f.slice(g, f.length))), this.push({ data: i.utf8decode(y), meta: p.meta });\n }, u.prototype.flush = function() {\n this.leftOver && this.leftOver.length && (this.push({ data: i.utf8decode(this.leftOver), meta: {} }), this.leftOver = null);\n }, i.Utf8DecodeWorker = u, o.inherits(d, l), d.prototype.processChunk = function(p) {\n this.push({ data: i.utf8encode(p.data), meta: p.meta });\n }, i.Utf8EncodeWorker = d;\n }, { \"./nodejsUtils\": 14, \"./stream/GenericWorker\": 28, \"./support\": 30, \"./utils\": 32 }], 32: [function(t, n, i) {\n var o = t(\"./support\"), r = t(\"./base64\"), a = t(\"./nodejsUtils\"), l = t(\"./external\");\n function h(m) {\n return m;\n }\n function c(m, g) {\n for (var y = 0; y < m.length; ++y) g[y] = 255 & m.charCodeAt(y);\n return g;\n }\n t(\"setimmediate\"), i.newBlob = function(m, g) {\n i.checkSupport(\"blob\");\n try {\n return new Blob([m], { type: g });\n } catch {\n try {\n var y = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();\n return y.append(m), y.getBlob(g);\n } catch {\n throw new Error(\"Bug : can't construct the Blob.\");\n }\n }\n };\n var u = { stringifyByChunk: function(m, g, y) {\n var w = [], _ = 0, x = m.length;\n if (x <= y) return String.fromCharCode.apply(null, m);\n for (; _ < x; ) g === \"array\" || g === \"nodebuffer\" ? w.push(String.fromCharCode.apply(null, m.slice(_, Math.min(_ + y, x)))) : w.push(String.fromCharCode.apply(null, m.subarray(_, Math.min(_ + y, x)))), _ += y;\n return w.join(\"\");\n }, stringifyByChar: function(m) {\n for (var g = \"\", y = 0; y < m.length; y++) g += String.fromCharCode(m[y]);\n return g;\n }, applyCanBeUsed: { uint8array: (function() {\n try {\n return o.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1;\n } catch {\n return !1;\n }\n })(), nodebuffer: (function() {\n try {\n return o.nodebuffer && String.fromCharCode.apply(null, a.allocBuffer(1)).length === 1;\n } catch {\n return !1;\n }\n })() } };\n function d(m) {\n var g = 65536, y = i.getTypeOf(m), w = !0;\n if (y === \"uint8array\" ? w = u.applyCanBeUsed.uint8array : y === \"nodebuffer\" && (w = u.applyCanBeUsed.nodebuffer), w) for (; 1 < g; ) try {\n return u.stringifyByChunk(m, y, g);\n } catch {\n g = Math.floor(g / 2);\n }\n return u.stringifyByChar(m);\n }\n function p(m, g) {\n for (var y = 0; y < m.length; y++) g[y] = m[y];\n return g;\n }\n i.applyFromCharCode = d;\n var f = {};\n f.string = { string: h, array: function(m) {\n return c(m, new Array(m.length));\n }, arraybuffer: function(m) {\n return f.string.uint8array(m).buffer;\n }, uint8array: function(m) {\n return c(m, new Uint8Array(m.length));\n }, nodebuffer: function(m) {\n return c(m, a.allocBuffer(m.length));\n } }, f.array = { string: d, array: h, arraybuffer: function(m) {\n return new Uint8Array(m).buffer;\n }, uint8array: function(m) {\n return new Uint8Array(m);\n }, nodebuffer: function(m) {\n return a.newBufferFrom(m);\n } }, f.arraybuffer = { string: function(m) {\n return d(new Uint8Array(m));\n }, array: function(m) {\n return p(new Uint8Array(m), new Array(m.byteLength));\n }, arraybuffer: h, uint8array: function(m) {\n return new Uint8Array(m);\n }, nodebuffer: function(m) {\n return a.newBufferFrom(new Uint8Array(m));\n } }, f.uint8array = { string: d, array: function(m) {\n return p(m, new Array(m.length));\n }, arraybuffer: function(m) {\n return m.buffer;\n }, uint8array: h, nodebuffer: function(m) {\n return a.newBufferFrom(m);\n } }, f.nodebuffer = { string: d, array: function(m) {\n return p(m, new Array(m.length));\n }, arraybuffer: function(m) {\n return f.nodebuffer.uint8array(m).buffer;\n }, uint8array: function(m) {\n return p(m, new Uint8Array(m.length));\n }, nodebuffer: h }, i.transformTo = function(m, g) {\n if (g = g || \"\", !m) return g;\n i.checkSupport(m);\n var y = i.getTypeOf(g);\n return f[y][m](g);\n }, i.resolve = function(m) {\n for (var g = m.split(\"/\"), y = [], w = 0; w < g.length; w++) {\n var _ = g[w];\n _ === \".\" || _ === \"\" && w !== 0 && w !== g.length - 1 || (_ === \"..\" ? y.pop() : y.push(_));\n }\n return y.join(\"/\");\n }, i.getTypeOf = function(m) {\n return typeof m == \"string\" ? \"string\" : Object.prototype.toString.call(m) === \"[object Array]\" ? \"array\" : o.nodebuffer && a.isBuffer(m) ? \"nodebuffer\" : o.uint8array && m instanceof Uint8Array ? \"uint8array\" : o.arraybuffer && m instanceof ArrayBuffer ? \"arraybuffer\" : void 0;\n }, i.checkSupport = function(m) {\n if (!o[m.toLowerCase()]) throw new Error(m + \" is not supported by this platform\");\n }, i.MAX_VALUE_16BITS = 65535, i.MAX_VALUE_32BITS = -1, i.pretty = function(m) {\n var g, y, w = \"\";\n for (y = 0; y < (m || \"\").length; y++) w += \"\\\\x\" + ((g = m.charCodeAt(y)) < 16 ? \"0\" : \"\") + g.toString(16).toUpperCase();\n return w;\n }, i.delay = function(m, g, y) {\n setImmediate(function() {\n m.apply(y || null, g || []);\n });\n }, i.inherits = function(m, g) {\n function y() {\n }\n y.prototype = g.prototype, m.prototype = new y();\n }, i.extend = function() {\n var m, g, y = {};\n for (m = 0; m < arguments.length; m++) for (g in arguments[m]) Object.prototype.hasOwnProperty.call(arguments[m], g) && y[g] === void 0 && (y[g] = arguments[m][g]);\n return y;\n }, i.prepareContent = function(m, g, y, w, _) {\n return l.Promise.resolve(g).then(function(x) {\n return o.blob && (x instanceof Blob || [\"[object File]\", \"[object Blob]\"].indexOf(Object.prototype.toString.call(x)) !== -1) && typeof FileReader < \"u\" ? new l.Promise(function(b, A) {\n var M = new FileReader();\n M.onload = function(C) {\n b(C.target.result);\n }, M.onerror = function(C) {\n A(C.target.error);\n }, M.readAsArrayBuffer(x);\n }) : x;\n }).then(function(x) {\n var b = i.getTypeOf(x);\n return b ? (b === \"arraybuffer\" ? x = i.transformTo(\"uint8array\", x) : b === \"string\" && (_ ? x = r.decode(x) : y && w !== !0 && (x = (function(A) {\n return c(A, o.uint8array ? new Uint8Array(A.length) : new Array(A.length));\n })(x))), x) : l.Promise.reject(new Error(\"Can't read the data of '\" + m + \"'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?\"));\n });\n };\n }, { \"./base64\": 1, \"./external\": 6, \"./nodejsUtils\": 14, \"./support\": 30, setimmediate: 54 }], 33: [function(t, n, i) {\n var o = t(\"./reader/readerFor\"), r = t(\"./utils\"), a = t(\"./signature\"), l = t(\"./zipEntry\"), h = t(\"./support\");\n function c(u) {\n this.files = [], this.loadOptions = u;\n }\n c.prototype = { checkSignature: function(u) {\n if (!this.reader.readAndCheckSignature(u)) {\n this.reader.index -= 4;\n var d = this.reader.readString(4);\n throw new Error(\"Corrupted zip or bug: unexpected signature (\" + r.pretty(d) + \", expected \" + r.pretty(u) + \")\");\n }\n }, isSignature: function(u, d) {\n var p = this.reader.index;\n this.reader.setIndex(u);\n var f = this.reader.readString(4) === d;\n return this.reader.setIndex(p), f;\n }, readBlockEndOfCentral: function() {\n this.diskNumber = this.reader.readInt(2), this.diskWithCentralDirStart = this.reader.readInt(2), this.centralDirRecordsOnThisDisk = this.reader.readInt(2), this.centralDirRecords = this.reader.readInt(2), this.centralDirSize = this.reader.readInt(4), this.centralDirOffset = this.reader.readInt(4), this.zipCommentLength = this.reader.readInt(2);\n var u = this.reader.readData(this.zipCommentLength), d = h.uint8array ? \"uint8array\" : \"array\", p = r.transformTo(d, u);\n this.zipComment = this.loadOptions.decodeFileName(p);\n }, readBlockZip64EndOfCentral: function() {\n this.zip64EndOfCentralSize = this.reader.readInt(8), this.reader.skip(4), this.diskNumber = this.reader.readInt(4), this.diskWithCentralDirStart = this.reader.readInt(4), this.centralDirRecordsOnThisDisk = this.reader.readInt(8), this.centralDirRecords = this.reader.readInt(8), this.centralDirSize = this.reader.readInt(8), this.centralDirOffset = this.reader.readInt(8), this.zip64ExtensibleData = {};\n for (var u, d, p, f = this.zip64EndOfCentralSize - 44; 0 < f; ) u = this.reader.readInt(2), d = this.reader.readInt(4), p = this.reader.readData(d), this.zip64ExtensibleData[u] = { id: u, length: d, value: p };\n }, readBlockZip64EndOfCentralLocator: function() {\n if (this.diskWithZip64CentralDirStart = this.reader.readInt(4), this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8), this.disksCount = this.reader.readInt(4), 1 < this.disksCount) throw new Error(\"Multi-volumes zip are not supported\");\n }, readLocalFiles: function() {\n var u, d;\n for (u = 0; u < this.files.length; u++) d = this.files[u], this.reader.setIndex(d.localHeaderOffset), this.checkSignature(a.LOCAL_FILE_HEADER), d.readLocalPart(this.reader), d.handleUTF8(), d.processAttributes();\n }, readCentralDir: function() {\n var u;\n for (this.reader.setIndex(this.centralDirOffset); this.reader.readAndCheckSignature(a.CENTRAL_FILE_HEADER); ) (u = new l({ zip64: this.zip64 }, this.loadOptions)).readCentralPart(this.reader), this.files.push(u);\n if (this.centralDirRecords !== this.files.length && this.centralDirRecords !== 0 && this.files.length === 0) throw new Error(\"Corrupted zip or bug: expected \" + this.centralDirRecords + \" records in central dir, got \" + this.files.length);\n }, readEndOfCentral: function() {\n var u = this.reader.lastIndexOfSignature(a.CENTRAL_DIRECTORY_END);\n if (u < 0) throw this.isSignature(0, a.LOCAL_FILE_HEADER) ? new Error(\"Corrupted zip: can't find end of central directory\") : new Error(\"Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html\");\n this.reader.setIndex(u);\n var d = u;\n if (this.checkSignature(a.CENTRAL_DIRECTORY_END), this.readBlockEndOfCentral(), this.diskNumber === r.MAX_VALUE_16BITS || this.diskWithCentralDirStart === r.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === r.MAX_VALUE_16BITS || this.centralDirRecords === r.MAX_VALUE_16BITS || this.centralDirSize === r.MAX_VALUE_32BITS || this.centralDirOffset === r.MAX_VALUE_32BITS) {\n if (this.zip64 = !0, (u = this.reader.lastIndexOfSignature(a.ZIP64_CENTRAL_DIRECTORY_LOCATOR)) < 0) throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory locator\");\n if (this.reader.setIndex(u), this.checkSignature(a.ZIP64_CENTRAL_DIRECTORY_LOCATOR), this.readBlockZip64EndOfCentralLocator(), !this.isSignature(this.relativeOffsetEndOfZip64CentralDir, a.ZIP64_CENTRAL_DIRECTORY_END) && (this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(a.ZIP64_CENTRAL_DIRECTORY_END), this.relativeOffsetEndOfZip64CentralDir < 0)) throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory\");\n this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir), this.checkSignature(a.ZIP64_CENTRAL_DIRECTORY_END), this.readBlockZip64EndOfCentral();\n }\n var p = this.centralDirOffset + this.centralDirSize;\n this.zip64 && (p += 20, p += 12 + this.zip64EndOfCentralSize);\n var f = d - p;\n if (0 < f) this.isSignature(d, a.CENTRAL_FILE_HEADER) || (this.reader.zero = f);\n else if (f < 0) throw new Error(\"Corrupted zip: missing \" + Math.abs(f) + \" bytes.\");\n }, prepareReader: function(u) {\n this.reader = o(u);\n }, load: function(u) {\n this.prepareReader(u), this.readEndOfCentral(), this.readCentralDir(), this.readLocalFiles();\n } }, n.exports = c;\n }, { \"./reader/readerFor\": 22, \"./signature\": 23, \"./support\": 30, \"./utils\": 32, \"./zipEntry\": 34 }], 34: [function(t, n, i) {\n var o = t(\"./reader/readerFor\"), r = t(\"./utils\"), a = t(\"./compressedObject\"), l = t(\"./crc32\"), h = t(\"./utf8\"), c = t(\"./compressions\"), u = t(\"./support\");\n function d(p, f) {\n this.options = p, this.loadOptions = f;\n }\n d.prototype = { isEncrypted: function() {\n return (1 & this.bitFlag) == 1;\n }, useUTF8: function() {\n return (2048 & this.bitFlag) == 2048;\n }, readLocalPart: function(p) {\n var f, m;\n if (p.skip(22), this.fileNameLength = p.readInt(2), m = p.readInt(2), this.fileName = p.readData(this.fileNameLength), p.skip(m), this.compressedSize === -1 || this.uncompressedSize === -1) throw new Error(\"Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)\");\n if ((f = (function(g) {\n for (var y in c) if (Object.prototype.hasOwnProperty.call(c, y) && c[y].magic === g) return c[y];\n return null;\n })(this.compressionMethod)) === null) throw new Error(\"Corrupted zip : compression \" + r.pretty(this.compressionMethod) + \" unknown (inner file : \" + r.transformTo(\"string\", this.fileName) + \")\");\n this.decompressed = new a(this.compressedSize, this.uncompressedSize, this.crc32, f, p.readData(this.compressedSize));\n }, readCentralPart: function(p) {\n this.versionMadeBy = p.readInt(2), p.skip(2), this.bitFlag = p.readInt(2), this.compressionMethod = p.readString(2), this.date = p.readDate(), this.crc32 = p.readInt(4), this.compressedSize = p.readInt(4), this.uncompressedSize = p.readInt(4);\n var f = p.readInt(2);\n if (this.extraFieldsLength = p.readInt(2), this.fileCommentLength = p.readInt(2), this.diskNumberStart = p.readInt(2), this.internalFileAttributes = p.readInt(2), this.externalFileAttributes = p.readInt(4), this.localHeaderOffset = p.readInt(4), this.isEncrypted()) throw new Error(\"Encrypted zip are not supported\");\n p.skip(f), this.readExtraFields(p), this.parseZIP64ExtraField(p), this.fileComment = p.readData(this.fileCommentLength);\n }, processAttributes: function() {\n this.unixPermissions = null, this.dosPermissions = null;\n var p = this.versionMadeBy >> 8;\n this.dir = !!(16 & this.externalFileAttributes), p == 0 && (this.dosPermissions = 63 & this.externalFileAttributes), p == 3 && (this.unixPermissions = this.externalFileAttributes >> 16 & 65535), this.dir || this.fileNameStr.slice(-1) !== \"/\" || (this.dir = !0);\n }, parseZIP64ExtraField: function() {\n if (this.extraFields[1]) {\n var p = o(this.extraFields[1].value);\n this.uncompressedSize === r.MAX_VALUE_32BITS && (this.uncompressedSize = p.readInt(8)), this.compressedSize === r.MAX_VALUE_32BITS && (this.compressedSize = p.readInt(8)), this.localHeaderOffset === r.MAX_VALUE_32BITS && (this.localHeaderOffset = p.readInt(8)), this.diskNumberStart === r.MAX_VALUE_32BITS && (this.diskNumberStart = p.readInt(4));\n }\n }, readExtraFields: function(p) {\n var f, m, g, y = p.index + this.extraFieldsLength;\n for (this.extraFields || (this.extraFields = {}); p.index + 4 < y; ) f = p.readInt(2), m = p.readInt(2), g = p.readData(m), this.extraFields[f] = { id: f, length: m, value: g };\n p.setIndex(y);\n }, handleUTF8: function() {\n var p = u.uint8array ? \"uint8array\" : \"array\";\n if (this.useUTF8()) this.fileNameStr = h.utf8decode(this.fileName), this.fileCommentStr = h.utf8decode(this.fileComment);\n else {\n var f = this.findExtraFieldUnicodePath();\n if (f !== null) this.fileNameStr = f;\n else {\n var m = r.transformTo(p, this.fileName);\n this.fileNameStr = this.loadOptions.decodeFileName(m);\n }\n var g = this.findExtraFieldUnicodeComment();\n if (g !== null) this.fileCommentStr = g;\n else {\n var y = r.transformTo(p, this.fileComment);\n this.fileCommentStr = this.loadOptions.decodeFileName(y);\n }\n }\n }, findExtraFieldUnicodePath: function() {\n var p = this.extraFields[28789];\n if (p) {\n var f = o(p.value);\n return f.readInt(1) !== 1 || l(this.fileName) !== f.readInt(4) ? null : h.utf8decode(f.readData(p.length - 5));\n }\n return null;\n }, findExtraFieldUnicodeComment: function() {\n var p = this.extraFields[25461];\n if (p) {\n var f = o(p.value);\n return f.readInt(1) !== 1 || l(this.fileComment) !== f.readInt(4) ? null : h.utf8decode(f.readData(p.length - 5));\n }\n return null;\n } }, n.exports = d;\n }, { \"./compressedObject\": 2, \"./compressions\": 3, \"./crc32\": 4, \"./reader/readerFor\": 22, \"./support\": 30, \"./utf8\": 31, \"./utils\": 32 }], 35: [function(t, n, i) {\n function o(f, m, g) {\n this.name = f, this.dir = g.dir, this.date = g.date, this.comment = g.comment, this.unixPermissions = g.unixPermissions, this.dosPermissions = g.dosPermissions, this._data = m, this._dataBinary = g.binary, this.options = { compression: g.compression, compressionOptions: g.compressionOptions };\n }\n var r = t(\"./stream/StreamHelper\"), a = t(\"./stream/DataWorker\"), l = t(\"./utf8\"), h = t(\"./compressedObject\"), c = t(\"./stream/GenericWorker\");\n o.prototype = { internalStream: function(f) {\n var m = null, g = \"string\";\n try {\n if (!f) throw new Error(\"No output type specified.\");\n var y = (g = f.toLowerCase()) === \"string\" || g === \"text\";\n g !== \"binarystring\" && g !== \"text\" || (g = \"string\"), m = this._decompressWorker();\n var w = !this._dataBinary;\n w && !y && (m = m.pipe(new l.Utf8EncodeWorker())), !w && y && (m = m.pipe(new l.Utf8DecodeWorker()));\n } catch (_) {\n (m = new c(\"error\")).error(_);\n }\n return new r(m, g, \"\");\n }, async: function(f, m) {\n return this.internalStream(f).accumulate(m);\n }, nodeStream: function(f, m) {\n return this.internalStream(f || \"nodebuffer\").toNodejsStream(m);\n }, _compressWorker: function(f, m) {\n if (this._data instanceof h && this._data.compression.magic === f.magic) return this._data.getCompressedWorker();\n var g = this._decompressWorker();\n return this._dataBinary || (g = g.pipe(new l.Utf8EncodeWorker())), h.createWorkerFrom(g, f, m);\n }, _decompressWorker: function() {\n return this._data instanceof h ? this._data.getContentWorker() : this._data instanceof c ? this._data : new a(this._data);\n } };\n for (var u = [\"asText\", \"asBinary\", \"asNodeBuffer\", \"asUint8Array\", \"asArrayBuffer\"], d = function() {\n throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n }, p = 0; p < u.length; p++) o.prototype[u[p]] = d;\n n.exports = o;\n }, { \"./compressedObject\": 2, \"./stream/DataWorker\": 27, \"./stream/GenericWorker\": 28, \"./stream/StreamHelper\": 29, \"./utf8\": 31 }], 36: [function(t, n, i) {\n (function(o) {\n var r, a, l = o.MutationObserver || o.WebKitMutationObserver;\n if (l) {\n var h = 0, c = new l(f), u = o.document.createTextNode(\"\");\n c.observe(u, { characterData: !0 }), r = function() {\n u.data = h = ++h % 2;\n };\n } else if (o.setImmediate || o.MessageChannel === void 0) r = \"document\" in o && \"onreadystatechange\" in o.document.createElement(\"script\") ? function() {\n var m = o.document.createElement(\"script\");\n m.onreadystatechange = function() {\n f(), m.onreadystatechange = null, m.parentNode.removeChild(m), m = null;\n }, o.document.documentElement.appendChild(m);\n } : function() {\n setTimeout(f, 0);\n };\n else {\n var d = new o.MessageChannel();\n d.port1.onmessage = f, r = function() {\n d.port2.postMessage(0);\n };\n }\n var p = [];\n function f() {\n var m, g;\n a = !0;\n for (var y = p.length; y; ) {\n for (g = p, p = [], m = -1; ++m < y; ) g[m]();\n y = p.length;\n }\n a = !1;\n }\n n.exports = function(m) {\n p.push(m) !== 1 || a || r();\n };\n }).call(this, typeof Yn < \"u\" ? Yn : typeof self < \"u\" ? self : typeof window < \"u\" ? window : {});\n }, {}], 37: [function(t, n, i) {\n var o = t(\"immediate\");\n function r() {\n }\n var a = {}, l = [\"REJECTED\"], h = [\"FULFILLED\"], c = [\"PENDING\"];\n function u(y) {\n if (typeof y != \"function\") throw new TypeError(\"resolver must be a function\");\n this.state = c, this.queue = [], this.outcome = void 0, y !== r && m(this, y);\n }\n function d(y, w, _) {\n this.promise = y, typeof w == \"function\" && (this.onFulfilled = w, this.callFulfilled = this.otherCallFulfilled), typeof _ == \"function\" && (this.onRejected = _, this.callRejected = this.otherCallRejected);\n }\n function p(y, w, _) {\n o(function() {\n var x;\n try {\n x = w(_);\n } catch (b) {\n return a.reject(y, b);\n }\n x === y ? a.reject(y, new TypeError(\"Cannot resolve promise with itself\")) : a.resolve(y, x);\n });\n }\n function f(y) {\n var w = y && y.then;\n if (y && (typeof y == \"object\" || typeof y == \"function\") && typeof w == \"function\") return function() {\n w.apply(y, arguments);\n };\n }\n function m(y, w) {\n var _ = !1;\n function x(M) {\n _ || (_ = !0, a.reject(y, M));\n }\n function b(M) {\n _ || (_ = !0, a.resolve(y, M));\n }\n var A = g(function() {\n w(b, x);\n });\n A.status === \"error\" && x(A.value);\n }\n function g(y, w) {\n var _ = {};\n try {\n _.value = y(w), _.status = \"success\";\n } catch (x) {\n _.status = \"error\", _.value = x;\n }\n return _;\n }\n (n.exports = u).prototype.finally = function(y) {\n if (typeof y != \"function\") return this;\n var w = this.constructor;\n return this.then(function(_) {\n return w.resolve(y()).then(function() {\n return _;\n });\n }, function(_) {\n return w.resolve(y()).then(function() {\n throw _;\n });\n });\n }, u.prototype.catch = function(y) {\n return this.then(null, y);\n }, u.prototype.then = function(y, w) {\n if (typeof y != \"function\" && this.state === h || typeof w != \"function\" && this.state === l) return this;\n var _ = new this.constructor(r);\n return this.state !== c ? p(_, this.state === h ? y : w, this.outcome) : this.queue.push(new d(_, y, w)), _;\n }, d.prototype.callFulfilled = function(y) {\n a.resolve(this.promise, y);\n }, d.prototype.otherCallFulfilled = function(y) {\n p(this.promise, this.onFulfilled, y);\n }, d.prototype.callRejected = function(y) {\n a.reject(this.promise, y);\n }, d.prototype.otherCallRejected = function(y) {\n p(this.promise, this.onRejected, y);\n }, a.resolve = function(y, w) {\n var _ = g(f, w);\n if (_.status === \"error\") return a.reject(y, _.value);\n var x = _.value;\n if (x) m(y, x);\n else {\n y.state = h, y.outcome = w;\n for (var b = -1, A = y.queue.length; ++b < A; ) y.queue[b].callFulfilled(w);\n }\n return y;\n }, a.reject = function(y, w) {\n y.state = l, y.outcome = w;\n for (var _ = -1, x = y.queue.length; ++_ < x; ) y.queue[_].callRejected(w);\n return y;\n }, u.resolve = function(y) {\n return y instanceof this ? y : a.resolve(new this(r), y);\n }, u.reject = function(y) {\n var w = new this(r);\n return a.reject(w, y);\n }, u.all = function(y) {\n var w = this;\n if (Object.prototype.toString.call(y) !== \"[object Array]\") return this.reject(new TypeError(\"must be an array\"));\n var _ = y.length, x = !1;\n if (!_) return this.resolve([]);\n for (var b = new Array(_), A = 0, M = -1, C = new this(r); ++M < _; ) P(y[M], M);\n return C;\n function P(k, B) {\n w.resolve(k).then(function(T) {\n b[B] = T, ++A !== _ || x || (x = !0, a.resolve(C, b));\n }, function(T) {\n x || (x = !0, a.reject(C, T));\n });\n }\n }, u.race = function(y) {\n var w = this;\n if (Object.prototype.toString.call(y) !== \"[object Array]\") return this.reject(new TypeError(\"must be an array\"));\n var _ = y.length, x = !1;\n if (!_) return this.resolve([]);\n for (var b = -1, A = new this(r); ++b < _; ) M = y[b], w.resolve(M).then(function(C) {\n x || (x = !0, a.resolve(A, C));\n }, function(C) {\n x || (x = !0, a.reject(A, C));\n });\n var M;\n return A;\n };\n }, { immediate: 36 }], 38: [function(t, n, i) {\n var o = {};\n (0, t(\"./lib/utils/common\").assign)(o, t(\"./lib/deflate\"), t(\"./lib/inflate\"), t(\"./lib/zlib/constants\")), n.exports = o;\n }, { \"./lib/deflate\": 39, \"./lib/inflate\": 40, \"./lib/utils/common\": 41, \"./lib/zlib/constants\": 44 }], 39: [function(t, n, i) {\n var o = t(\"./zlib/deflate\"), r = t(\"./utils/common\"), a = t(\"./utils/strings\"), l = t(\"./zlib/messages\"), h = t(\"./zlib/zstream\"), c = Object.prototype.toString, u = 0, d = -1, p = 0, f = 8;\n function m(y) {\n if (!(this instanceof m)) return new m(y);\n this.options = r.assign({ level: d, method: f, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: p, to: \"\" }, y || {});\n var w = this.options;\n w.raw && 0 < w.windowBits ? w.windowBits = -w.windowBits : w.gzip && 0 < w.windowBits && w.windowBits < 16 && (w.windowBits += 16), this.err = 0, this.msg = \"\", this.ended = !1, this.chunks = [], this.strm = new h(), this.strm.avail_out = 0;\n var _ = o.deflateInit2(this.strm, w.level, w.method, w.windowBits, w.memLevel, w.strategy);\n if (_ !== u) throw new Error(l[_]);\n if (w.header && o.deflateSetHeader(this.strm, w.header), w.dictionary) {\n var x;\n if (x = typeof w.dictionary == \"string\" ? a.string2buf(w.dictionary) : c.call(w.dictionary) === \"[object ArrayBuffer]\" ? new Uint8Array(w.dictionary) : w.dictionary, (_ = o.deflateSetDictionary(this.strm, x)) !== u) throw new Error(l[_]);\n this._dict_set = !0;\n }\n }\n function g(y, w) {\n var _ = new m(w);\n if (_.push(y, !0), _.err) throw _.msg || l[_.err];\n return _.result;\n }\n m.prototype.push = function(y, w) {\n var _, x, b = this.strm, A = this.options.chunkSize;\n if (this.ended) return !1;\n x = w === ~~w ? w : w === !0 ? 4 : 0, typeof y == \"string\" ? b.input = a.string2buf(y) : c.call(y) === \"[object ArrayBuffer]\" ? b.input = new Uint8Array(y) : b.input = y, b.next_in = 0, b.avail_in = b.input.length;\n do {\n if (b.avail_out === 0 && (b.output = new r.Buf8(A), b.next_out = 0, b.avail_out = A), (_ = o.deflate(b, x)) !== 1 && _ !== u) return this.onEnd(_), !(this.ended = !0);\n b.avail_out !== 0 && (b.avail_in !== 0 || x !== 4 && x !== 2) || (this.options.to === \"string\" ? this.onData(a.buf2binstring(r.shrinkBuf(b.output, b.next_out))) : this.onData(r.shrinkBuf(b.output, b.next_out)));\n } while ((0 < b.avail_in || b.avail_out === 0) && _ !== 1);\n return x === 4 ? (_ = o.deflateEnd(this.strm), this.onEnd(_), this.ended = !0, _ === u) : x !== 2 || (this.onEnd(u), !(b.avail_out = 0));\n }, m.prototype.onData = function(y) {\n this.chunks.push(y);\n }, m.prototype.onEnd = function(y) {\n y === u && (this.options.to === \"string\" ? this.result = this.chunks.join(\"\") : this.result = r.flattenChunks(this.chunks)), this.chunks = [], this.err = y, this.msg = this.strm.msg;\n }, i.Deflate = m, i.deflate = g, i.deflateRaw = function(y, w) {\n return (w = w || {}).raw = !0, g(y, w);\n }, i.gzip = function(y, w) {\n return (w = w || {}).gzip = !0, g(y, w);\n };\n }, { \"./utils/common\": 41, \"./utils/strings\": 42, \"./zlib/deflate\": 46, \"./zlib/messages\": 51, \"./zlib/zstream\": 53 }], 40: [function(t, n, i) {\n var o = t(\"./zlib/inflate\"), r = t(\"./utils/common\"), a = t(\"./utils/strings\"), l = t(\"./zlib/constants\"), h = t(\"./zlib/messages\"), c = t(\"./zlib/zstream\"), u = t(\"./zlib/gzheader\"), d = Object.prototype.toString;\n function p(m) {\n if (!(this instanceof p)) return new p(m);\n this.options = r.assign({ chunkSize: 16384, windowBits: 0, to: \"\" }, m || {});\n var g = this.options;\n g.raw && 0 <= g.windowBits && g.windowBits < 16 && (g.windowBits = -g.windowBits, g.windowBits === 0 && (g.windowBits = -15)), !(0 <= g.windowBits && g.windowBits < 16) || m && m.windowBits || (g.windowBits += 32), 15 < g.windowBits && g.windowBits < 48 && (15 & g.windowBits) == 0 && (g.windowBits |= 15), this.err = 0, this.msg = \"\", this.ended = !1, this.chunks = [], this.strm = new c(), this.strm.avail_out = 0;\n var y = o.inflateInit2(this.strm, g.windowBits);\n if (y !== l.Z_OK) throw new Error(h[y]);\n this.header = new u(), o.inflateGetHeader(this.strm, this.header);\n }\n function f(m, g) {\n var y = new p(g);\n if (y.push(m, !0), y.err) throw y.msg || h[y.err];\n return y.result;\n }\n p.prototype.push = function(m, g) {\n var y, w, _, x, b, A, M = this.strm, C = this.options.chunkSize, P = this.options.dictionary, k = !1;\n if (this.ended) return !1;\n w = g === ~~g ? g : g === !0 ? l.Z_FINISH : l.Z_NO_FLUSH, typeof m == \"string\" ? M.input = a.binstring2buf(m) : d.call(m) === \"[object ArrayBuffer]\" ? M.input = new Uint8Array(m) : M.input = m, M.next_in = 0, M.avail_in = M.input.length;\n do {\n if (M.avail_out === 0 && (M.output = new r.Buf8(C), M.next_out = 0, M.avail_out = C), (y = o.inflate(M, l.Z_NO_FLUSH)) === l.Z_NEED_DICT && P && (A = typeof P == \"string\" ? a.string2buf(P) : d.call(P) === \"[object ArrayBuffer]\" ? new Uint8Array(P) : P, y = o.inflateSetDictionary(this.strm, A)), y === l.Z_BUF_ERROR && k === !0 && (y = l.Z_OK, k = !1), y !== l.Z_STREAM_END && y !== l.Z_OK) return this.onEnd(y), !(this.ended = !0);\n M.next_out && (M.avail_out !== 0 && y !== l.Z_STREAM_END && (M.avail_in !== 0 || w !== l.Z_FINISH && w !== l.Z_SYNC_FLUSH) || (this.options.to === \"string\" ? (_ = a.utf8border(M.output, M.next_out), x = M.next_out - _, b = a.buf2string(M.output, _), M.next_out = x, M.avail_out = C - x, x && r.arraySet(M.output, M.output, _, x, 0), this.onData(b)) : this.onData(r.shrinkBuf(M.output, M.next_out)))), M.avail_in === 0 && M.avail_out === 0 && (k = !0);\n } while ((0 < M.avail_in || M.avail_out === 0) && y !== l.Z_STREAM_END);\n return y === l.Z_STREAM_END && (w = l.Z_FINISH), w === l.Z_FINISH ? (y = o.inflateEnd(this.strm), this.onEnd(y), this.ended = !0, y === l.Z_OK) : w !== l.Z_SYNC_FLUSH || (this.onEnd(l.Z_OK), !(M.avail_out = 0));\n }, p.prototype.onData = function(m) {\n this.chunks.push(m);\n }, p.prototype.onEnd = function(m) {\n m === l.Z_OK && (this.options.to === \"string\" ? this.result = this.chunks.join(\"\") : this.result = r.flattenChunks(this.chunks)), this.chunks = [], this.err = m, this.msg = this.strm.msg;\n }, i.Inflate = p, i.inflate = f, i.inflateRaw = function(m, g) {\n return (g = g || {}).raw = !0, f(m, g);\n }, i.ungzip = f;\n }, { \"./utils/common\": 41, \"./utils/strings\": 42, \"./zlib/constants\": 44, \"./zlib/gzheader\": 47, \"./zlib/inflate\": 49, \"./zlib/messages\": 51, \"./zlib/zstream\": 53 }], 41: [function(t, n, i) {\n var o = typeof Uint8Array < \"u\" && typeof Uint16Array < \"u\" && typeof Int32Array < \"u\";\n i.assign = function(l) {\n for (var h = Array.prototype.slice.call(arguments, 1); h.length; ) {\n var c = h.shift();\n if (c) {\n if (typeof c != \"object\") throw new TypeError(c + \"must be non-object\");\n for (var u in c) c.hasOwnProperty(u) && (l[u] = c[u]);\n }\n }\n return l;\n }, i.shrinkBuf = function(l, h) {\n return l.length === h ? l : l.subarray ? l.subarray(0, h) : (l.length = h, l);\n };\n var r = { arraySet: function(l, h, c, u, d) {\n if (h.subarray && l.subarray) l.set(h.subarray(c, c + u), d);\n else for (var p = 0; p < u; p++) l[d + p] = h[c + p];\n }, flattenChunks: function(l) {\n var h, c, u, d, p, f;\n for (h = u = 0, c = l.length; h < c; h++) u += l[h].length;\n for (f = new Uint8Array(u), h = d = 0, c = l.length; h < c; h++) p = l[h], f.set(p, d), d += p.length;\n return f;\n } }, a = { arraySet: function(l, h, c, u, d) {\n for (var p = 0; p < u; p++) l[d + p] = h[c + p];\n }, flattenChunks: function(l) {\n return [].concat.apply([], l);\n } };\n i.setTyped = function(l) {\n l ? (i.Buf8 = Uint8Array, i.Buf16 = Uint16Array, i.Buf32 = Int32Array, i.assign(i, r)) : (i.Buf8 = Array, i.Buf16 = Array, i.Buf32 = Array, i.assign(i, a));\n }, i.setTyped(o);\n }, {}], 42: [function(t, n, i) {\n var o = t(\"./common\"), r = !0, a = !0;\n try {\n String.fromCharCode.apply(null, [0]);\n } catch {\n r = !1;\n }\n try {\n String.fromCharCode.apply(null, new Uint8Array(1));\n } catch {\n a = !1;\n }\n for (var l = new o.Buf8(256), h = 0; h < 256; h++) l[h] = 252 <= h ? 6 : 248 <= h ? 5 : 240 <= h ? 4 : 224 <= h ? 3 : 192 <= h ? 2 : 1;\n function c(u, d) {\n if (d < 65537 && (u.subarray && a || !u.subarray && r)) return String.fromCharCode.apply(null, o.shrinkBuf(u, d));\n for (var p = \"\", f = 0; f < d; f++) p += String.fromCharCode(u[f]);\n return p;\n }\n l[254] = l[254] = 1, i.string2buf = function(u) {\n var d, p, f, m, g, y = u.length, w = 0;\n for (m = 0; m < y; m++) (64512 & (p = u.charCodeAt(m))) == 55296 && m + 1 < y && (64512 & (f = u.charCodeAt(m + 1))) == 56320 && (p = 65536 + (p - 55296 << 10) + (f - 56320), m++), w += p < 128 ? 1 : p < 2048 ? 2 : p < 65536 ? 3 : 4;\n for (d = new o.Buf8(w), m = g = 0; g < w; m++) (64512 & (p = u.charCodeAt(m))) == 55296 && m + 1 < y && (64512 & (f = u.charCodeAt(m + 1))) == 56320 && (p = 65536 + (p - 55296 << 10) + (f - 56320), m++), p < 128 ? d[g++] = p : (p < 2048 ? d[g++] = 192 | p >>> 6 : (p < 65536 ? d[g++] = 224 | p >>> 12 : (d[g++] = 240 | p >>> 18, d[g++] = 128 | p >>> 12 & 63), d[g++] = 128 | p >>> 6 & 63), d[g++] = 128 | 63 & p);\n return d;\n }, i.buf2binstring = function(u) {\n return c(u, u.length);\n }, i.binstring2buf = function(u) {\n for (var d = new o.Buf8(u.length), p = 0, f = d.length; p < f; p++) d[p] = u.charCodeAt(p);\n return d;\n }, i.buf2string = function(u, d) {\n var p, f, m, g, y = d || u.length, w = new Array(2 * y);\n for (p = f = 0; p < y; ) if ((m = u[p++]) < 128) w[f++] = m;\n else if (4 < (g = l[m])) w[f++] = 65533, p += g - 1;\n else {\n for (m &= g === 2 ? 31 : g === 3 ? 15 : 7; 1 < g && p < y; ) m = m << 6 | 63 & u[p++], g--;\n 1 < g ? w[f++] = 65533 : m < 65536 ? w[f++] = m : (m -= 65536, w[f++] = 55296 | m >> 10 & 1023, w[f++] = 56320 | 1023 & m);\n }\n return c(w, f);\n }, i.utf8border = function(u, d) {\n var p;\n for ((d = d || u.length) > u.length && (d = u.length), p = d - 1; 0 <= p && (192 & u[p]) == 128; ) p--;\n return p < 0 || p === 0 ? d : p + l[u[p]] > d ? p : d;\n };\n }, { \"./common\": 41 }], 43: [function(t, n, i) {\n n.exports = function(o, r, a, l) {\n for (var h = 65535 & o | 0, c = o >>> 16 & 65535 | 0, u = 0; a !== 0; ) {\n for (a -= u = 2e3 < a ? 2e3 : a; c = c + (h = h + r[l++] | 0) | 0, --u; ) ;\n h %= 65521, c %= 65521;\n }\n return h | c << 16 | 0;\n };\n }, {}], 44: [function(t, n, i) {\n n.exports = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 };\n }, {}], 45: [function(t, n, i) {\n var o = (function() {\n for (var r, a = [], l = 0; l < 256; l++) {\n r = l;\n for (var h = 0; h < 8; h++) r = 1 & r ? 3988292384 ^ r >>> 1 : r >>> 1;\n a[l] = r;\n }\n return a;\n })();\n n.exports = function(r, a, l, h) {\n var c = o, u = h + l;\n r ^= -1;\n for (var d = h; d < u; d++) r = r >>> 8 ^ c[255 & (r ^ a[d])];\n return -1 ^ r;\n };\n }, {}], 46: [function(t, n, i) {\n var o, r = t(\"../utils/common\"), a = t(\"./trees\"), l = t(\"./adler32\"), h = t(\"./crc32\"), c = t(\"./messages\"), u = 0, d = 4, p = 0, f = -2, m = -1, g = 4, y = 2, w = 8, _ = 9, x = 286, b = 30, A = 19, M = 2 * x + 1, C = 15, P = 3, k = 258, B = k + P + 1, T = 42, D = 113, v = 1, I = 2, q = 3, H = 4;\n function ee(S, G) {\n return S.msg = c[G], G;\n }\n function j(S) {\n return (S << 1) - (4 < S ? 9 : 0);\n }\n function ne(S) {\n for (var G = S.length; 0 <= --G; ) S[G] = 0;\n }\n function O(S) {\n var G = S.state, V = G.pending;\n V > S.avail_out && (V = S.avail_out), V !== 0 && (r.arraySet(S.output, G.pending_buf, G.pending_out, V, S.next_out), S.next_out += V, G.pending_out += V, S.total_out += V, S.avail_out -= V, G.pending -= V, G.pending === 0 && (G.pending_out = 0));\n }\n function N(S, G) {\n a._tr_flush_block(S, 0 <= S.block_start ? S.block_start : -1, S.strstart - S.block_start, G), S.block_start = S.strstart, O(S.strm);\n }\n function te(S, G) {\n S.pending_buf[S.pending++] = G;\n }\n function J(S, G) {\n S.pending_buf[S.pending++] = G >>> 8 & 255, S.pending_buf[S.pending++] = 255 & G;\n }\n function K(S, G) {\n var V, L, R = S.max_chain_length, z = S.strstart, W = S.prev_length, X = S.nice_match, U = S.strstart > S.w_size - B ? S.strstart - (S.w_size - B) : 0, Y = S.window, Q = S.w_mask, $ = S.prev, ie = S.strstart + k, he = Y[z + W - 1], ae = Y[z + W];\n S.prev_length >= S.good_match && (R >>= 2), X > S.lookahead && (X = S.lookahead);\n do\n if (Y[(V = G) + W] === ae && Y[V + W - 1] === he && Y[V] === Y[z] && Y[++V] === Y[z + 1]) {\n z += 2, V++;\n do\n ;\n while (Y[++z] === Y[++V] && Y[++z] === Y[++V] && Y[++z] === Y[++V] && Y[++z] === Y[++V] && Y[++z] === Y[++V] && Y[++z] === Y[++V] && Y[++z] === Y[++V] && Y[++z] === Y[++V] && z < ie);\n if (L = k - (ie - z), z = ie - k, W < L) {\n if (S.match_start = G, X <= (W = L)) break;\n he = Y[z + W - 1], ae = Y[z + W];\n }\n }\n while ((G = $[G & Q]) > U && --R != 0);\n return W <= S.lookahead ? W : S.lookahead;\n }\n function fe(S) {\n var G, V, L, R, z, W, X, U, Y, Q, $ = S.w_size;\n do {\n if (R = S.window_size - S.lookahead - S.strstart, S.strstart >= $ + ($ - B)) {\n for (r.arraySet(S.window, S.window, $, $, 0), S.match_start -= $, S.strstart -= $, S.block_start -= $, G = V = S.hash_size; L = S.head[--G], S.head[G] = $ <= L ? L - $ : 0, --V; ) ;\n for (G = V = $; L = S.prev[--G], S.prev[G] = $ <= L ? L - $ : 0, --V; ) ;\n R += $;\n }\n if (S.strm.avail_in === 0) break;\n if (W = S.strm, X = S.window, U = S.strstart + S.lookahead, Y = R, Q = void 0, Q = W.avail_in, Y < Q && (Q = Y), V = Q === 0 ? 0 : (W.avail_in -= Q, r.arraySet(X, W.input, W.next_in, Q, U), W.state.wrap === 1 ? W.adler = l(W.adler, X, Q, U) : W.state.wrap === 2 && (W.adler = h(W.adler, X, Q, U)), W.next_in += Q, W.total_in += Q, Q), S.lookahead += V, S.lookahead + S.insert >= P) for (z = S.strstart - S.insert, S.ins_h = S.window[z], S.ins_h = (S.ins_h << S.hash_shift ^ S.window[z + 1]) & S.hash_mask; S.insert && (S.ins_h = (S.ins_h << S.hash_shift ^ S.window[z + P - 1]) & S.hash_mask, S.prev[z & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = z, z++, S.insert--, !(S.lookahead + S.insert < P)); ) ;\n } while (S.lookahead < B && S.strm.avail_in !== 0);\n }\n function pe(S, G) {\n for (var V, L; ; ) {\n if (S.lookahead < B) {\n if (fe(S), S.lookahead < B && G === u) return v;\n if (S.lookahead === 0) break;\n }\n if (V = 0, S.lookahead >= P && (S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + P - 1]) & S.hash_mask, V = S.prev[S.strstart & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = S.strstart), V !== 0 && S.strstart - V <= S.w_size - B && (S.match_length = K(S, V)), S.match_length >= P) if (L = a._tr_tally(S, S.strstart - S.match_start, S.match_length - P), S.lookahead -= S.match_length, S.match_length <= S.max_lazy_match && S.lookahead >= P) {\n for (S.match_length--; S.strstart++, S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + P - 1]) & S.hash_mask, V = S.prev[S.strstart & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = S.strstart, --S.match_length != 0; ) ;\n S.strstart++;\n } else S.strstart += S.match_length, S.match_length = 0, S.ins_h = S.window[S.strstart], S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + 1]) & S.hash_mask;\n else L = a._tr_tally(S, 0, S.window[S.strstart]), S.lookahead--, S.strstart++;\n if (L && (N(S, !1), S.strm.avail_out === 0)) return v;\n }\n return S.insert = S.strstart < P - 1 ? S.strstart : P - 1, G === d ? (N(S, !0), S.strm.avail_out === 0 ? q : H) : S.last_lit && (N(S, !1), S.strm.avail_out === 0) ? v : I;\n }\n function se(S, G) {\n for (var V, L, R; ; ) {\n if (S.lookahead < B) {\n if (fe(S), S.lookahead < B && G === u) return v;\n if (S.lookahead === 0) break;\n }\n if (V = 0, S.lookahead >= P && (S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + P - 1]) & S.hash_mask, V = S.prev[S.strstart & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = S.strstart), S.prev_length = S.match_length, S.prev_match = S.match_start, S.match_length = P - 1, V !== 0 && S.prev_length < S.max_lazy_match && S.strstart - V <= S.w_size - B && (S.match_length = K(S, V), S.match_length <= 5 && (S.strategy === 1 || S.match_length === P && 4096 < S.strstart - S.match_start) && (S.match_length = P - 1)), S.prev_length >= P && S.match_length <= S.prev_length) {\n for (R = S.strstart + S.lookahead - P, L = a._tr_tally(S, S.strstart - 1 - S.prev_match, S.prev_length - P), S.lookahead -= S.prev_length - 1, S.prev_length -= 2; ++S.strstart <= R && (S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + P - 1]) & S.hash_mask, V = S.prev[S.strstart & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = S.strstart), --S.prev_length != 0; ) ;\n if (S.match_available = 0, S.match_length = P - 1, S.strstart++, L && (N(S, !1), S.strm.avail_out === 0)) return v;\n } else if (S.match_available) {\n if ((L = a._tr_tally(S, 0, S.window[S.strstart - 1])) && N(S, !1), S.strstart++, S.lookahead--, S.strm.avail_out === 0) return v;\n } else S.match_available = 1, S.strstart++, S.lookahead--;\n }\n return S.match_available && (L = a._tr_tally(S, 0, S.window[S.strstart - 1]), S.match_available = 0), S.insert = S.strstart < P - 1 ? S.strstart : P - 1, G === d ? (N(S, !0), S.strm.avail_out === 0 ? q : H) : S.last_lit && (N(S, !1), S.strm.avail_out === 0) ? v : I;\n }\n function oe(S, G, V, L, R) {\n this.good_length = S, this.max_lazy = G, this.nice_length = V, this.max_chain = L, this.func = R;\n }\n function ue() {\n this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = w, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new r.Buf16(2 * M), this.dyn_dtree = new r.Buf16(2 * (2 * b + 1)), this.bl_tree = new r.Buf16(2 * (2 * A + 1)), ne(this.dyn_ltree), ne(this.dyn_dtree), ne(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new r.Buf16(C + 1), this.heap = new r.Buf16(2 * x + 1), ne(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new r.Buf16(2 * x + 1), ne(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0;\n }\n function me(S) {\n var G;\n return S && S.state ? (S.total_in = S.total_out = 0, S.data_type = y, (G = S.state).pending = 0, G.pending_out = 0, G.wrap < 0 && (G.wrap = -G.wrap), G.status = G.wrap ? T : D, S.adler = G.wrap === 2 ? 0 : 1, G.last_flush = u, a._tr_init(G), p) : ee(S, f);\n }\n function Se(S) {\n var G = me(S);\n return G === p && (function(V) {\n V.window_size = 2 * V.w_size, ne(V.head), V.max_lazy_match = o[V.level].max_lazy, V.good_match = o[V.level].good_length, V.nice_match = o[V.level].nice_length, V.max_chain_length = o[V.level].max_chain, V.strstart = 0, V.block_start = 0, V.lookahead = 0, V.insert = 0, V.match_length = V.prev_length = P - 1, V.match_available = 0, V.ins_h = 0;\n })(S.state), G;\n }\n function De(S, G, V, L, R, z) {\n if (!S) return f;\n var W = 1;\n if (G === m && (G = 6), L < 0 ? (W = 0, L = -L) : 15 < L && (W = 2, L -= 16), R < 1 || _ < R || V !== w || L < 8 || 15 < L || G < 0 || 9 < G || z < 0 || g < z) return ee(S, f);\n L === 8 && (L = 9);\n var X = new ue();\n return (S.state = X).strm = S, X.wrap = W, X.gzhead = null, X.w_bits = L, X.w_size = 1 << X.w_bits, X.w_mask = X.w_size - 1, X.hash_bits = R + 7, X.hash_size = 1 << X.hash_bits, X.hash_mask = X.hash_size - 1, X.hash_shift = ~~((X.hash_bits + P - 1) / P), X.window = new r.Buf8(2 * X.w_size), X.head = new r.Buf16(X.hash_size), X.prev = new r.Buf16(X.w_size), X.lit_bufsize = 1 << R + 6, X.pending_buf_size = 4 * X.lit_bufsize, X.pending_buf = new r.Buf8(X.pending_buf_size), X.d_buf = 1 * X.lit_bufsize, X.l_buf = 3 * X.lit_bufsize, X.level = G, X.strategy = z, X.method = V, Se(S);\n }\n o = [new oe(0, 0, 0, 0, function(S, G) {\n var V = 65535;\n for (V > S.pending_buf_size - 5 && (V = S.pending_buf_size - 5); ; ) {\n if (S.lookahead <= 1) {\n if (fe(S), S.lookahead === 0 && G === u) return v;\n if (S.lookahead === 0) break;\n }\n S.strstart += S.lookahead, S.lookahead = 0;\n var L = S.block_start + V;\n if ((S.strstart === 0 || S.strstart >= L) && (S.lookahead = S.strstart - L, S.strstart = L, N(S, !1), S.strm.avail_out === 0) || S.strstart - S.block_start >= S.w_size - B && (N(S, !1), S.strm.avail_out === 0)) return v;\n }\n return S.insert = 0, G === d ? (N(S, !0), S.strm.avail_out === 0 ? q : H) : (S.strstart > S.block_start && (N(S, !1), S.strm.avail_out), v);\n }), new oe(4, 4, 8, 4, pe), new oe(4, 5, 16, 8, pe), new oe(4, 6, 32, 32, pe), new oe(4, 4, 16, 16, se), new oe(8, 16, 32, 32, se), new oe(8, 16, 128, 128, se), new oe(8, 32, 128, 256, se), new oe(32, 128, 258, 1024, se), new oe(32, 258, 258, 4096, se)], i.deflateInit = function(S, G) {\n return De(S, G, w, 15, 8, 0);\n }, i.deflateInit2 = De, i.deflateReset = Se, i.deflateResetKeep = me, i.deflateSetHeader = function(S, G) {\n return S && S.state ? S.state.wrap !== 2 ? f : (S.state.gzhead = G, p) : f;\n }, i.deflate = function(S, G) {\n var V, L, R, z;\n if (!S || !S.state || 5 < G || G < 0) return S ? ee(S, f) : f;\n if (L = S.state, !S.output || !S.input && S.avail_in !== 0 || L.status === 666 && G !== d) return ee(S, S.avail_out === 0 ? -5 : f);\n if (L.strm = S, V = L.last_flush, L.last_flush = G, L.status === T) if (L.wrap === 2) S.adler = 0, te(L, 31), te(L, 139), te(L, 8), L.gzhead ? (te(L, (L.gzhead.text ? 1 : 0) + (L.gzhead.hcrc ? 2 : 0) + (L.gzhead.extra ? 4 : 0) + (L.gzhead.name ? 8 : 0) + (L.gzhead.comment ? 16 : 0)), te(L, 255 & L.gzhead.time), te(L, L.gzhead.time >> 8 & 255), te(L, L.gzhead.time >> 16 & 255), te(L, L.gzhead.time >> 24 & 255), te(L, L.level === 9 ? 2 : 2 <= L.strategy || L.level < 2 ? 4 : 0), te(L, 255 & L.gzhead.os), L.gzhead.extra && L.gzhead.extra.length && (te(L, 255 & L.gzhead.extra.length), te(L, L.gzhead.extra.length >> 8 & 255)), L.gzhead.hcrc && (S.adler = h(S.adler, L.pending_buf, L.pending, 0)), L.gzindex = 0, L.status = 69) : (te(L, 0), te(L, 0), te(L, 0), te(L, 0), te(L, 0), te(L, L.level === 9 ? 2 : 2 <= L.strategy || L.level < 2 ? 4 : 0), te(L, 3), L.status = D);\n else {\n var W = w + (L.w_bits - 8 << 4) << 8;\n W |= (2 <= L.strategy || L.level < 2 ? 0 : L.level < 6 ? 1 : L.level === 6 ? 2 : 3) << 6, L.strstart !== 0 && (W |= 32), W += 31 - W % 31, L.status = D, J(L, W), L.strstart !== 0 && (J(L, S.adler >>> 16), J(L, 65535 & S.adler)), S.adler = 1;\n }\n if (L.status === 69) if (L.gzhead.extra) {\n for (R = L.pending; L.gzindex < (65535 & L.gzhead.extra.length) && (L.pending !== L.pending_buf_size || (L.gzhead.hcrc && L.pending > R && (S.adler = h(S.adler, L.pending_buf, L.pending - R, R)), O(S), R = L.pending, L.pending !== L.pending_buf_size)); ) te(L, 255 & L.gzhead.extra[L.gzindex]), L.gzindex++;\n L.gzhead.hcrc && L.pending > R && (S.adler = h(S.adler, L.pending_buf, L.pending - R, R)), L.gzindex === L.gzhead.extra.length && (L.gzindex = 0, L.status = 73);\n } else L.status = 73;\n if (L.status === 73) if (L.gzhead.name) {\n R = L.pending;\n do {\n if (L.pending === L.pending_buf_size && (L.gzhead.hcrc && L.pending > R && (S.adler = h(S.adler, L.pending_buf, L.pending - R, R)), O(S), R = L.pending, L.pending === L.pending_buf_size)) {\n z = 1;\n break;\n }\n z = L.gzindex < L.gzhead.name.length ? 255 & L.gzhead.name.charCodeAt(L.gzindex++) : 0, te(L, z);\n } while (z !== 0);\n L.gzhead.hcrc && L.pending > R && (S.adler = h(S.adler, L.pending_buf, L.pending - R, R)), z === 0 && (L.gzindex = 0, L.status = 91);\n } else L.status = 91;\n if (L.status === 91) if (L.gzhead.comment) {\n R = L.pending;\n do {\n if (L.pending === L.pending_buf_size && (L.gzhead.hcrc && L.pending > R && (S.adler = h(S.adler, L.pending_buf, L.pending - R, R)), O(S), R = L.pending, L.pending === L.pending_buf_size)) {\n z = 1;\n break;\n }\n z = L.gzindex < L.gzhead.comment.length ? 255 & L.gzhead.comment.charCodeAt(L.gzindex++) : 0, te(L, z);\n } while (z !== 0);\n L.gzhead.hcrc && L.pending > R && (S.adler = h(S.adler, L.pending_buf, L.pending - R, R)), z === 0 && (L.status = 103);\n } else L.status = 103;\n if (L.status === 103 && (L.gzhead.hcrc ? (L.pending + 2 > L.pending_buf_size && O(S), L.pending + 2 <= L.pending_buf_size && (te(L, 255 & S.adler), te(L, S.adler >> 8 & 255), S.adler = 0, L.status = D)) : L.status = D), L.pending !== 0) {\n if (O(S), S.avail_out === 0) return L.last_flush = -1, p;\n } else if (S.avail_in === 0 && j(G) <= j(V) && G !== d) return ee(S, -5);\n if (L.status === 666 && S.avail_in !== 0) return ee(S, -5);\n if (S.avail_in !== 0 || L.lookahead !== 0 || G !== u && L.status !== 666) {\n var X = L.strategy === 2 ? (function(U, Y) {\n for (var Q; ; ) {\n if (U.lookahead === 0 && (fe(U), U.lookahead === 0)) {\n if (Y === u) return v;\n break;\n }\n if (U.match_length = 0, Q = a._tr_tally(U, 0, U.window[U.strstart]), U.lookahead--, U.strstart++, Q && (N(U, !1), U.strm.avail_out === 0)) return v;\n }\n return U.insert = 0, Y === d ? (N(U, !0), U.strm.avail_out === 0 ? q : H) : U.last_lit && (N(U, !1), U.strm.avail_out === 0) ? v : I;\n })(L, G) : L.strategy === 3 ? (function(U, Y) {\n for (var Q, $, ie, he, ae = U.window; ; ) {\n if (U.lookahead <= k) {\n if (fe(U), U.lookahead <= k && Y === u) return v;\n if (U.lookahead === 0) break;\n }\n if (U.match_length = 0, U.lookahead >= P && 0 < U.strstart && ($ = ae[ie = U.strstart - 1]) === ae[++ie] && $ === ae[++ie] && $ === ae[++ie]) {\n he = U.strstart + k;\n do\n ;\n while ($ === ae[++ie] && $ === ae[++ie] && $ === ae[++ie] && $ === ae[++ie] && $ === ae[++ie] && $ === ae[++ie] && $ === ae[++ie] && $ === ae[++ie] && ie < he);\n U.match_length = k - (he - ie), U.match_length > U.lookahead && (U.match_length = U.lookahead);\n }\n if (U.match_length >= P ? (Q = a._tr_tally(U, 1, U.match_length - P), U.lookahead -= U.match_length, U.strstart += U.match_length, U.match_length = 0) : (Q = a._tr_tally(U, 0, U.window[U.strstart]), U.lookahead--, U.strstart++), Q && (N(U, !1), U.strm.avail_out === 0)) return v;\n }\n return U.insert = 0, Y === d ? (N(U, !0), U.strm.avail_out === 0 ? q : H) : U.last_lit && (N(U, !1), U.strm.avail_out === 0) ? v : I;\n })(L, G) : o[L.level].func(L, G);\n if (X !== q && X !== H || (L.status = 666), X === v || X === q) return S.avail_out === 0 && (L.last_flush = -1), p;\n if (X === I && (G === 1 ? a._tr_align(L) : G !== 5 && (a._tr_stored_block(L, 0, 0, !1), G === 3 && (ne(L.head), L.lookahead === 0 && (L.strstart = 0, L.block_start = 0, L.insert = 0))), O(S), S.avail_out === 0)) return L.last_flush = -1, p;\n }\n return G !== d ? p : L.wrap <= 0 ? 1 : (L.wrap === 2 ? (te(L, 255 & S.adler), te(L, S.adler >> 8 & 255), te(L, S.adler >> 16 & 255), te(L, S.adler >> 24 & 255), te(L, 255 & S.total_in), te(L, S.total_in >> 8 & 255), te(L, S.total_in >> 16 & 255), te(L, S.total_in >> 24 & 255)) : (J(L, S.adler >>> 16), J(L, 65535 & S.adler)), O(S), 0 < L.wrap && (L.wrap = -L.wrap), L.pending !== 0 ? p : 1);\n }, i.deflateEnd = function(S) {\n var G;\n return S && S.state ? (G = S.state.status) !== T && G !== 69 && G !== 73 && G !== 91 && G !== 103 && G !== D && G !== 666 ? ee(S, f) : (S.state = null, G === D ? ee(S, -3) : p) : f;\n }, i.deflateSetDictionary = function(S, G) {\n var V, L, R, z, W, X, U, Y, Q = G.length;\n if (!S || !S.state || (z = (V = S.state).wrap) === 2 || z === 1 && V.status !== T || V.lookahead) return f;\n for (z === 1 && (S.adler = l(S.adler, G, Q, 0)), V.wrap = 0, Q >= V.w_size && (z === 0 && (ne(V.head), V.strstart = 0, V.block_start = 0, V.insert = 0), Y = new r.Buf8(V.w_size), r.arraySet(Y, G, Q - V.w_size, V.w_size, 0), G = Y, Q = V.w_size), W = S.avail_in, X = S.next_in, U = S.input, S.avail_in = Q, S.next_in = 0, S.input = G, fe(V); V.lookahead >= P; ) {\n for (L = V.strstart, R = V.lookahead - (P - 1); V.ins_h = (V.ins_h << V.hash_shift ^ V.window[L + P - 1]) & V.hash_mask, V.prev[L & V.w_mask] = V.head[V.ins_h], V.head[V.ins_h] = L, L++, --R; ) ;\n V.strstart = L, V.lookahead = P - 1, fe(V);\n }\n return V.strstart += V.lookahead, V.block_start = V.strstart, V.insert = V.lookahead, V.lookahead = 0, V.match_length = V.prev_length = P - 1, V.match_available = 0, S.next_in = X, S.input = U, S.avail_in = W, V.wrap = z, p;\n }, i.deflateInfo = \"pako deflate (from Nodeca project)\";\n }, { \"../utils/common\": 41, \"./adler32\": 43, \"./crc32\": 45, \"./messages\": 51, \"./trees\": 52 }], 47: [function(t, n, i) {\n n.exports = function() {\n this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = \"\", this.comment = \"\", this.hcrc = 0, this.done = !1;\n };\n }, {}], 48: [function(t, n, i) {\n n.exports = function(o, r) {\n var a, l, h, c, u, d, p, f, m, g, y, w, _, x, b, A, M, C, P, k, B, T, D, v, I;\n a = o.state, l = o.next_in, v = o.input, h = l + (o.avail_in - 5), c = o.next_out, I = o.output, u = c - (r - o.avail_out), d = c + (o.avail_out - 257), p = a.dmax, f = a.wsize, m = a.whave, g = a.wnext, y = a.window, w = a.hold, _ = a.bits, x = a.lencode, b = a.distcode, A = (1 << a.lenbits) - 1, M = (1 << a.distbits) - 1;\n e: do {\n _ < 15 && (w += v[l++] << _, _ += 8, w += v[l++] << _, _ += 8), C = x[w & A];\n t: for (; ; ) {\n if (w >>>= P = C >>> 24, _ -= P, (P = C >>> 16 & 255) === 0) I[c++] = 65535 & C;\n else {\n if (!(16 & P)) {\n if ((64 & P) == 0) {\n C = x[(65535 & C) + (w & (1 << P) - 1)];\n continue t;\n }\n if (32 & P) {\n a.mode = 12;\n break e;\n }\n o.msg = \"invalid literal/length code\", a.mode = 30;\n break e;\n }\n k = 65535 & C, (P &= 15) && (_ < P && (w += v[l++] << _, _ += 8), k += w & (1 << P) - 1, w >>>= P, _ -= P), _ < 15 && (w += v[l++] << _, _ += 8, w += v[l++] << _, _ += 8), C = b[w & M];\n n: for (; ; ) {\n if (w >>>= P = C >>> 24, _ -= P, !(16 & (P = C >>> 16 & 255))) {\n if ((64 & P) == 0) {\n C = b[(65535 & C) + (w & (1 << P) - 1)];\n continue n;\n }\n o.msg = \"invalid distance code\", a.mode = 30;\n break e;\n }\n if (B = 65535 & C, _ < (P &= 15) && (w += v[l++] << _, (_ += 8) < P && (w += v[l++] << _, _ += 8)), p < (B += w & (1 << P) - 1)) {\n o.msg = \"invalid distance too far back\", a.mode = 30;\n break e;\n }\n if (w >>>= P, _ -= P, (P = c - u) < B) {\n if (m < (P = B - P) && a.sane) {\n o.msg = \"invalid distance too far back\", a.mode = 30;\n break e;\n }\n if (D = y, (T = 0) === g) {\n if (T += f - P, P < k) {\n for (k -= P; I[c++] = y[T++], --P; ) ;\n T = c - B, D = I;\n }\n } else if (g < P) {\n if (T += f + g - P, (P -= g) < k) {\n for (k -= P; I[c++] = y[T++], --P; ) ;\n if (T = 0, g < k) {\n for (k -= P = g; I[c++] = y[T++], --P; ) ;\n T = c - B, D = I;\n }\n }\n } else if (T += g - P, P < k) {\n for (k -= P; I[c++] = y[T++], --P; ) ;\n T = c - B, D = I;\n }\n for (; 2 < k; ) I[c++] = D[T++], I[c++] = D[T++], I[c++] = D[T++], k -= 3;\n k && (I[c++] = D[T++], 1 < k && (I[c++] = D[T++]));\n } else {\n for (T = c - B; I[c++] = I[T++], I[c++] = I[T++], I[c++] = I[T++], 2 < (k -= 3); ) ;\n k && (I[c++] = I[T++], 1 < k && (I[c++] = I[T++]));\n }\n break;\n }\n }\n break;\n }\n } while (l < h && c < d);\n l -= k = _ >> 3, w &= (1 << (_ -= k << 3)) - 1, o.next_in = l, o.next_out = c, o.avail_in = l < h ? h - l + 5 : 5 - (l - h), o.avail_out = c < d ? d - c + 257 : 257 - (c - d), a.hold = w, a.bits = _;\n };\n }, {}], 49: [function(t, n, i) {\n var o = t(\"../utils/common\"), r = t(\"./adler32\"), a = t(\"./crc32\"), l = t(\"./inffast\"), h = t(\"./inftrees\"), c = 1, u = 2, d = 0, p = -2, f = 1, m = 852, g = 592;\n function y(T) {\n return (T >>> 24 & 255) + (T >>> 8 & 65280) + ((65280 & T) << 8) + ((255 & T) << 24);\n }\n function w() {\n this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new o.Buf16(320), this.work = new o.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0;\n }\n function _(T) {\n var D;\n return T && T.state ? (D = T.state, T.total_in = T.total_out = D.total = 0, T.msg = \"\", D.wrap && (T.adler = 1 & D.wrap), D.mode = f, D.last = 0, D.havedict = 0, D.dmax = 32768, D.head = null, D.hold = 0, D.bits = 0, D.lencode = D.lendyn = new o.Buf32(m), D.distcode = D.distdyn = new o.Buf32(g), D.sane = 1, D.back = -1, d) : p;\n }\n function x(T) {\n var D;\n return T && T.state ? ((D = T.state).wsize = 0, D.whave = 0, D.wnext = 0, _(T)) : p;\n }\n function b(T, D) {\n var v, I;\n return T && T.state ? (I = T.state, D < 0 ? (v = 0, D = -D) : (v = 1 + (D >> 4), D < 48 && (D &= 15)), D && (D < 8 || 15 < D) ? p : (I.window !== null && I.wbits !== D && (I.window = null), I.wrap = v, I.wbits = D, x(T))) : p;\n }\n function A(T, D) {\n var v, I;\n return T ? (I = new w(), (T.state = I).window = null, (v = b(T, D)) !== d && (T.state = null), v) : p;\n }\n var M, C, P = !0;\n function k(T) {\n if (P) {\n var D;\n for (M = new o.Buf32(512), C = new o.Buf32(32), D = 0; D < 144; ) T.lens[D++] = 8;\n for (; D < 256; ) T.lens[D++] = 9;\n for (; D < 280; ) T.lens[D++] = 7;\n for (; D < 288; ) T.lens[D++] = 8;\n for (h(c, T.lens, 0, 288, M, 0, T.work, { bits: 9 }), D = 0; D < 32; ) T.lens[D++] = 5;\n h(u, T.lens, 0, 32, C, 0, T.work, { bits: 5 }), P = !1;\n }\n T.lencode = M, T.lenbits = 9, T.distcode = C, T.distbits = 5;\n }\n function B(T, D, v, I) {\n var q, H = T.state;\n return H.window === null && (H.wsize = 1 << H.wbits, H.wnext = 0, H.whave = 0, H.window = new o.Buf8(H.wsize)), I >= H.wsize ? (o.arraySet(H.window, D, v - H.wsize, H.wsize, 0), H.wnext = 0, H.whave = H.wsize) : (I < (q = H.wsize - H.wnext) && (q = I), o.arraySet(H.window, D, v - I, q, H.wnext), (I -= q) ? (o.arraySet(H.window, D, v - I, I, 0), H.wnext = I, H.whave = H.wsize) : (H.wnext += q, H.wnext === H.wsize && (H.wnext = 0), H.whave < H.wsize && (H.whave += q))), 0;\n }\n i.inflateReset = x, i.inflateReset2 = b, i.inflateResetKeep = _, i.inflateInit = function(T) {\n return A(T, 15);\n }, i.inflateInit2 = A, i.inflate = function(T, D) {\n var v, I, q, H, ee, j, ne, O, N, te, J, K, fe, pe, se, oe, ue, me, Se, De, S, G, V, L, R = 0, z = new o.Buf8(4), W = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];\n if (!T || !T.state || !T.output || !T.input && T.avail_in !== 0) return p;\n (v = T.state).mode === 12 && (v.mode = 13), ee = T.next_out, q = T.output, ne = T.avail_out, H = T.next_in, I = T.input, j = T.avail_in, O = v.hold, N = v.bits, te = j, J = ne, G = d;\n e: for (; ; ) switch (v.mode) {\n case f:\n if (v.wrap === 0) {\n v.mode = 13;\n break;\n }\n for (; N < 16; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if (2 & v.wrap && O === 35615) {\n z[v.check = 0] = 255 & O, z[1] = O >>> 8 & 255, v.check = a(v.check, z, 2, 0), N = O = 0, v.mode = 2;\n break;\n }\n if (v.flags = 0, v.head && (v.head.done = !1), !(1 & v.wrap) || (((255 & O) << 8) + (O >> 8)) % 31) {\n T.msg = \"incorrect header check\", v.mode = 30;\n break;\n }\n if ((15 & O) != 8) {\n T.msg = \"unknown compression method\", v.mode = 30;\n break;\n }\n if (N -= 4, S = 8 + (15 & (O >>>= 4)), v.wbits === 0) v.wbits = S;\n else if (S > v.wbits) {\n T.msg = \"invalid window size\", v.mode = 30;\n break;\n }\n v.dmax = 1 << S, T.adler = v.check = 1, v.mode = 512 & O ? 10 : 12, N = O = 0;\n break;\n case 2:\n for (; N < 16; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if (v.flags = O, (255 & v.flags) != 8) {\n T.msg = \"unknown compression method\", v.mode = 30;\n break;\n }\n if (57344 & v.flags) {\n T.msg = \"unknown header flags set\", v.mode = 30;\n break;\n }\n v.head && (v.head.text = O >> 8 & 1), 512 & v.flags && (z[0] = 255 & O, z[1] = O >>> 8 & 255, v.check = a(v.check, z, 2, 0)), N = O = 0, v.mode = 3;\n case 3:\n for (; N < 32; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n v.head && (v.head.time = O), 512 & v.flags && (z[0] = 255 & O, z[1] = O >>> 8 & 255, z[2] = O >>> 16 & 255, z[3] = O >>> 24 & 255, v.check = a(v.check, z, 4, 0)), N = O = 0, v.mode = 4;\n case 4:\n for (; N < 16; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n v.head && (v.head.xflags = 255 & O, v.head.os = O >> 8), 512 & v.flags && (z[0] = 255 & O, z[1] = O >>> 8 & 255, v.check = a(v.check, z, 2, 0)), N = O = 0, v.mode = 5;\n case 5:\n if (1024 & v.flags) {\n for (; N < 16; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n v.length = O, v.head && (v.head.extra_len = O), 512 & v.flags && (z[0] = 255 & O, z[1] = O >>> 8 & 255, v.check = a(v.check, z, 2, 0)), N = O = 0;\n } else v.head && (v.head.extra = null);\n v.mode = 6;\n case 6:\n if (1024 & v.flags && (j < (K = v.length) && (K = j), K && (v.head && (S = v.head.extra_len - v.length, v.head.extra || (v.head.extra = new Array(v.head.extra_len)), o.arraySet(v.head.extra, I, H, K, S)), 512 & v.flags && (v.check = a(v.check, I, K, H)), j -= K, H += K, v.length -= K), v.length)) break e;\n v.length = 0, v.mode = 7;\n case 7:\n if (2048 & v.flags) {\n if (j === 0) break e;\n for (K = 0; S = I[H + K++], v.head && S && v.length < 65536 && (v.head.name += String.fromCharCode(S)), S && K < j; ) ;\n if (512 & v.flags && (v.check = a(v.check, I, K, H)), j -= K, H += K, S) break e;\n } else v.head && (v.head.name = null);\n v.length = 0, v.mode = 8;\n case 8:\n if (4096 & v.flags) {\n if (j === 0) break e;\n for (K = 0; S = I[H + K++], v.head && S && v.length < 65536 && (v.head.comment += String.fromCharCode(S)), S && K < j; ) ;\n if (512 & v.flags && (v.check = a(v.check, I, K, H)), j -= K, H += K, S) break e;\n } else v.head && (v.head.comment = null);\n v.mode = 9;\n case 9:\n if (512 & v.flags) {\n for (; N < 16; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if (O !== (65535 & v.check)) {\n T.msg = \"header crc mismatch\", v.mode = 30;\n break;\n }\n N = O = 0;\n }\n v.head && (v.head.hcrc = v.flags >> 9 & 1, v.head.done = !0), T.adler = v.check = 0, v.mode = 12;\n break;\n case 10:\n for (; N < 32; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n T.adler = v.check = y(O), N = O = 0, v.mode = 11;\n case 11:\n if (v.havedict === 0) return T.next_out = ee, T.avail_out = ne, T.next_in = H, T.avail_in = j, v.hold = O, v.bits = N, 2;\n T.adler = v.check = 1, v.mode = 12;\n case 12:\n if (D === 5 || D === 6) break e;\n case 13:\n if (v.last) {\n O >>>= 7 & N, N -= 7 & N, v.mode = 27;\n break;\n }\n for (; N < 3; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n switch (v.last = 1 & O, N -= 1, 3 & (O >>>= 1)) {\n case 0:\n v.mode = 14;\n break;\n case 1:\n if (k(v), v.mode = 20, D !== 6) break;\n O >>>= 2, N -= 2;\n break e;\n case 2:\n v.mode = 17;\n break;\n case 3:\n T.msg = \"invalid block type\", v.mode = 30;\n }\n O >>>= 2, N -= 2;\n break;\n case 14:\n for (O >>>= 7 & N, N -= 7 & N; N < 32; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if ((65535 & O) != (O >>> 16 ^ 65535)) {\n T.msg = \"invalid stored block lengths\", v.mode = 30;\n break;\n }\n if (v.length = 65535 & O, N = O = 0, v.mode = 15, D === 6) break e;\n case 15:\n v.mode = 16;\n case 16:\n if (K = v.length) {\n if (j < K && (K = j), ne < K && (K = ne), K === 0) break e;\n o.arraySet(q, I, H, K, ee), j -= K, H += K, ne -= K, ee += K, v.length -= K;\n break;\n }\n v.mode = 12;\n break;\n case 17:\n for (; N < 14; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if (v.nlen = 257 + (31 & O), O >>>= 5, N -= 5, v.ndist = 1 + (31 & O), O >>>= 5, N -= 5, v.ncode = 4 + (15 & O), O >>>= 4, N -= 4, 286 < v.nlen || 30 < v.ndist) {\n T.msg = \"too many length or distance symbols\", v.mode = 30;\n break;\n }\n v.have = 0, v.mode = 18;\n case 18:\n for (; v.have < v.ncode; ) {\n for (; N < 3; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n v.lens[W[v.have++]] = 7 & O, O >>>= 3, N -= 3;\n }\n for (; v.have < 19; ) v.lens[W[v.have++]] = 0;\n if (v.lencode = v.lendyn, v.lenbits = 7, V = { bits: v.lenbits }, G = h(0, v.lens, 0, 19, v.lencode, 0, v.work, V), v.lenbits = V.bits, G) {\n T.msg = \"invalid code lengths set\", v.mode = 30;\n break;\n }\n v.have = 0, v.mode = 19;\n case 19:\n for (; v.have < v.nlen + v.ndist; ) {\n for (; oe = (R = v.lencode[O & (1 << v.lenbits) - 1]) >>> 16 & 255, ue = 65535 & R, !((se = R >>> 24) <= N); ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if (ue < 16) O >>>= se, N -= se, v.lens[v.have++] = ue;\n else {\n if (ue === 16) {\n for (L = se + 2; N < L; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if (O >>>= se, N -= se, v.have === 0) {\n T.msg = \"invalid bit length repeat\", v.mode = 30;\n break;\n }\n S = v.lens[v.have - 1], K = 3 + (3 & O), O >>>= 2, N -= 2;\n } else if (ue === 17) {\n for (L = se + 3; N < L; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n N -= se, S = 0, K = 3 + (7 & (O >>>= se)), O >>>= 3, N -= 3;\n } else {\n for (L = se + 7; N < L; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n N -= se, S = 0, K = 11 + (127 & (O >>>= se)), O >>>= 7, N -= 7;\n }\n if (v.have + K > v.nlen + v.ndist) {\n T.msg = \"invalid bit length repeat\", v.mode = 30;\n break;\n }\n for (; K--; ) v.lens[v.have++] = S;\n }\n }\n if (v.mode === 30) break;\n if (v.lens[256] === 0) {\n T.msg = \"invalid code -- missing end-of-block\", v.mode = 30;\n break;\n }\n if (v.lenbits = 9, V = { bits: v.lenbits }, G = h(c, v.lens, 0, v.nlen, v.lencode, 0, v.work, V), v.lenbits = V.bits, G) {\n T.msg = \"invalid literal/lengths set\", v.mode = 30;\n break;\n }\n if (v.distbits = 6, v.distcode = v.distdyn, V = { bits: v.distbits }, G = h(u, v.lens, v.nlen, v.ndist, v.distcode, 0, v.work, V), v.distbits = V.bits, G) {\n T.msg = \"invalid distances set\", v.mode = 30;\n break;\n }\n if (v.mode = 20, D === 6) break e;\n case 20:\n v.mode = 21;\n case 21:\n if (6 <= j && 258 <= ne) {\n T.next_out = ee, T.avail_out = ne, T.next_in = H, T.avail_in = j, v.hold = O, v.bits = N, l(T, J), ee = T.next_out, q = T.output, ne = T.avail_out, H = T.next_in, I = T.input, j = T.avail_in, O = v.hold, N = v.bits, v.mode === 12 && (v.back = -1);\n break;\n }\n for (v.back = 0; oe = (R = v.lencode[O & (1 << v.lenbits) - 1]) >>> 16 & 255, ue = 65535 & R, !((se = R >>> 24) <= N); ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if (oe && (240 & oe) == 0) {\n for (me = se, Se = oe, De = ue; oe = (R = v.lencode[De + ((O & (1 << me + Se) - 1) >> me)]) >>> 16 & 255, ue = 65535 & R, !(me + (se = R >>> 24) <= N); ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n O >>>= me, N -= me, v.back += me;\n }\n if (O >>>= se, N -= se, v.back += se, v.length = ue, oe === 0) {\n v.mode = 26;\n break;\n }\n if (32 & oe) {\n v.back = -1, v.mode = 12;\n break;\n }\n if (64 & oe) {\n T.msg = \"invalid literal/length code\", v.mode = 30;\n break;\n }\n v.extra = 15 & oe, v.mode = 22;\n case 22:\n if (v.extra) {\n for (L = v.extra; N < L; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n v.length += O & (1 << v.extra) - 1, O >>>= v.extra, N -= v.extra, v.back += v.extra;\n }\n v.was = v.length, v.mode = 23;\n case 23:\n for (; oe = (R = v.distcode[O & (1 << v.distbits) - 1]) >>> 16 & 255, ue = 65535 & R, !((se = R >>> 24) <= N); ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if ((240 & oe) == 0) {\n for (me = se, Se = oe, De = ue; oe = (R = v.distcode[De + ((O & (1 << me + Se) - 1) >> me)]) >>> 16 & 255, ue = 65535 & R, !(me + (se = R >>> 24) <= N); ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n O >>>= me, N -= me, v.back += me;\n }\n if (O >>>= se, N -= se, v.back += se, 64 & oe) {\n T.msg = \"invalid distance code\", v.mode = 30;\n break;\n }\n v.offset = ue, v.extra = 15 & oe, v.mode = 24;\n case 24:\n if (v.extra) {\n for (L = v.extra; N < L; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n v.offset += O & (1 << v.extra) - 1, O >>>= v.extra, N -= v.extra, v.back += v.extra;\n }\n if (v.offset > v.dmax) {\n T.msg = \"invalid distance too far back\", v.mode = 30;\n break;\n }\n v.mode = 25;\n case 25:\n if (ne === 0) break e;\n if (K = J - ne, v.offset > K) {\n if ((K = v.offset - K) > v.whave && v.sane) {\n T.msg = \"invalid distance too far back\", v.mode = 30;\n break;\n }\n fe = K > v.wnext ? (K -= v.wnext, v.wsize - K) : v.wnext - K, K > v.length && (K = v.length), pe = v.window;\n } else pe = q, fe = ee - v.offset, K = v.length;\n for (ne < K && (K = ne), ne -= K, v.length -= K; q[ee++] = pe[fe++], --K; ) ;\n v.length === 0 && (v.mode = 21);\n break;\n case 26:\n if (ne === 0) break e;\n q[ee++] = v.length, ne--, v.mode = 21;\n break;\n case 27:\n if (v.wrap) {\n for (; N < 32; ) {\n if (j === 0) break e;\n j--, O |= I[H++] << N, N += 8;\n }\n if (J -= ne, T.total_out += J, v.total += J, J && (T.adler = v.check = v.flags ? a(v.check, q, J, ee - J) : r(v.check, q, J, ee - J)), J = ne, (v.flags ? O : y(O)) !== v.check) {\n T.msg = \"incorrect data check\", v.mode = 30;\n break;\n }\n N = O = 0;\n }\n v.mode = 28;\n case 28:\n if (v.wrap && v.flags) {\n for (; N < 32; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if (O !== (4294967295 & v.total)) {\n T.msg = \"incorrect length check\", v.mode = 30;\n break;\n }\n N = O = 0;\n }\n v.mode = 29;\n case 29:\n G = 1;\n break e;\n case 30:\n G = -3;\n break e;\n case 31:\n return -4;\n case 32:\n default:\n return p;\n }\n return T.next_out = ee, T.avail_out = ne, T.next_in = H, T.avail_in = j, v.hold = O, v.bits = N, (v.wsize || J !== T.avail_out && v.mode < 30 && (v.mode < 27 || D !== 4)) && B(T, T.output, T.next_out, J - T.avail_out) ? (v.mode = 31, -4) : (te -= T.avail_in, J -= T.avail_out, T.total_in += te, T.total_out += J, v.total += J, v.wrap && J && (T.adler = v.check = v.flags ? a(v.check, q, J, T.next_out - J) : r(v.check, q, J, T.next_out - J)), T.data_type = v.bits + (v.last ? 64 : 0) + (v.mode === 12 ? 128 : 0) + (v.mode === 20 || v.mode === 15 ? 256 : 0), (te == 0 && J === 0 || D === 4) && G === d && (G = -5), G);\n }, i.inflateEnd = function(T) {\n if (!T || !T.state) return p;\n var D = T.state;\n return D.window && (D.window = null), T.state = null, d;\n }, i.inflateGetHeader = function(T, D) {\n var v;\n return T && T.state ? (2 & (v = T.state).wrap) == 0 ? p : ((v.head = D).done = !1, d) : p;\n }, i.inflateSetDictionary = function(T, D) {\n var v, I = D.length;\n return T && T.state ? (v = T.state).wrap !== 0 && v.mode !== 11 ? p : v.mode === 11 && r(1, D, I, 0) !== v.check ? -3 : B(T, D, I, I) ? (v.mode = 31, -4) : (v.havedict = 1, d) : p;\n }, i.inflateInfo = \"pako inflate (from Nodeca project)\";\n }, { \"../utils/common\": 41, \"./adler32\": 43, \"./crc32\": 45, \"./inffast\": 48, \"./inftrees\": 50 }], 50: [function(t, n, i) {\n var o = t(\"../utils/common\"), r = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], a = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], l = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], h = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64];\n n.exports = function(c, u, d, p, f, m, g, y) {\n var w, _, x, b, A, M, C, P, k, B = y.bits, T = 0, D = 0, v = 0, I = 0, q = 0, H = 0, ee = 0, j = 0, ne = 0, O = 0, N = null, te = 0, J = new o.Buf16(16), K = new o.Buf16(16), fe = null, pe = 0;\n for (T = 0; T <= 15; T++) J[T] = 0;\n for (D = 0; D < p; D++) J[u[d + D]]++;\n for (q = B, I = 15; 1 <= I && J[I] === 0; I--) ;\n if (I < q && (q = I), I === 0) return f[m++] = 20971520, f[m++] = 20971520, y.bits = 1, 0;\n for (v = 1; v < I && J[v] === 0; v++) ;\n for (q < v && (q = v), T = j = 1; T <= 15; T++) if (j <<= 1, (j -= J[T]) < 0) return -1;\n if (0 < j && (c === 0 || I !== 1)) return -1;\n for (K[1] = 0, T = 1; T < 15; T++) K[T + 1] = K[T] + J[T];\n for (D = 0; D < p; D++) u[d + D] !== 0 && (g[K[u[d + D]]++] = D);\n if (M = c === 0 ? (N = fe = g, 19) : c === 1 ? (N = r, te -= 257, fe = a, pe -= 257, 256) : (N = l, fe = h, -1), T = v, A = m, ee = D = O = 0, x = -1, b = (ne = 1 << (H = q)) - 1, c === 1 && 852 < ne || c === 2 && 592 < ne) return 1;\n for (; ; ) {\n for (C = T - ee, k = g[D] < M ? (P = 0, g[D]) : g[D] > M ? (P = fe[pe + g[D]], N[te + g[D]]) : (P = 96, 0), w = 1 << T - ee, v = _ = 1 << H; f[A + (O >> ee) + (_ -= w)] = C << 24 | P << 16 | k | 0, _ !== 0; ) ;\n for (w = 1 << T - 1; O & w; ) w >>= 1;\n if (w !== 0 ? (O &= w - 1, O += w) : O = 0, D++, --J[T] == 0) {\n if (T === I) break;\n T = u[d + g[D]];\n }\n if (q < T && (O & b) !== x) {\n for (ee === 0 && (ee = q), A += v, j = 1 << (H = T - ee); H + ee < I && !((j -= J[H + ee]) <= 0); ) H++, j <<= 1;\n if (ne += 1 << H, c === 1 && 852 < ne || c === 2 && 592 < ne) return 1;\n f[x = O & b] = q << 24 | H << 16 | A - m | 0;\n }\n }\n return O !== 0 && (f[A + O] = T - ee << 24 | 64 << 16 | 0), y.bits = q, 0;\n };\n }, { \"../utils/common\": 41 }], 51: [function(t, n, i) {\n n.exports = { 2: \"need dictionary\", 1: \"stream end\", 0: \"\", \"-1\": \"file error\", \"-2\": \"stream error\", \"-3\": \"data error\", \"-4\": \"insufficient memory\", \"-5\": \"buffer error\", \"-6\": \"incompatible version\" };\n }, {}], 52: [function(t, n, i) {\n var o = t(\"../utils/common\"), r = 0, a = 1;\n function l(R) {\n for (var z = R.length; 0 <= --z; ) R[z] = 0;\n }\n var h = 0, c = 29, u = 256, d = u + 1 + c, p = 30, f = 19, m = 2 * d + 1, g = 15, y = 16, w = 7, _ = 256, x = 16, b = 17, A = 18, M = [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], C = [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], P = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], k = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], B = new Array(2 * (d + 2));\n l(B);\n var T = new Array(2 * p);\n l(T);\n var D = new Array(512);\n l(D);\n var v = new Array(256);\n l(v);\n var I = new Array(c);\n l(I);\n var q, H, ee, j = new Array(p);\n function ne(R, z, W, X, U) {\n this.static_tree = R, this.extra_bits = z, this.extra_base = W, this.elems = X, this.max_length = U, this.has_stree = R && R.length;\n }\n function O(R, z) {\n this.dyn_tree = R, this.max_code = 0, this.stat_desc = z;\n }\n function N(R) {\n return R < 256 ? D[R] : D[256 + (R >>> 7)];\n }\n function te(R, z) {\n R.pending_buf[R.pending++] = 255 & z, R.pending_buf[R.pending++] = z >>> 8 & 255;\n }\n function J(R, z, W) {\n R.bi_valid > y - W ? (R.bi_buf |= z << R.bi_valid & 65535, te(R, R.bi_buf), R.bi_buf = z >> y - R.bi_valid, R.bi_valid += W - y) : (R.bi_buf |= z << R.bi_valid & 65535, R.bi_valid += W);\n }\n function K(R, z, W) {\n J(R, W[2 * z], W[2 * z + 1]);\n }\n function fe(R, z) {\n for (var W = 0; W |= 1 & R, R >>>= 1, W <<= 1, 0 < --z; ) ;\n return W >>> 1;\n }\n function pe(R, z, W) {\n var X, U, Y = new Array(g + 1), Q = 0;\n for (X = 1; X <= g; X++) Y[X] = Q = Q + W[X - 1] << 1;\n for (U = 0; U <= z; U++) {\n var $ = R[2 * U + 1];\n $ !== 0 && (R[2 * U] = fe(Y[$]++, $));\n }\n }\n function se(R) {\n var z;\n for (z = 0; z < d; z++) R.dyn_ltree[2 * z] = 0;\n for (z = 0; z < p; z++) R.dyn_dtree[2 * z] = 0;\n for (z = 0; z < f; z++) R.bl_tree[2 * z] = 0;\n R.dyn_ltree[2 * _] = 1, R.opt_len = R.static_len = 0, R.last_lit = R.matches = 0;\n }\n function oe(R) {\n 8 < R.bi_valid ? te(R, R.bi_buf) : 0 < R.bi_valid && (R.pending_buf[R.pending++] = R.bi_buf), R.bi_buf = 0, R.bi_valid = 0;\n }\n function ue(R, z, W, X) {\n var U = 2 * z, Y = 2 * W;\n return R[U] < R[Y] || R[U] === R[Y] && X[z] <= X[W];\n }\n function me(R, z, W) {\n for (var X = R.heap[W], U = W << 1; U <= R.heap_len && (U < R.heap_len && ue(z, R.heap[U + 1], R.heap[U], R.depth) && U++, !ue(z, X, R.heap[U], R.depth)); ) R.heap[W] = R.heap[U], W = U, U <<= 1;\n R.heap[W] = X;\n }\n function Se(R, z, W) {\n var X, U, Y, Q, $ = 0;\n if (R.last_lit !== 0) for (; X = R.pending_buf[R.d_buf + 2 * $] << 8 | R.pending_buf[R.d_buf + 2 * $ + 1], U = R.pending_buf[R.l_buf + $], $++, X === 0 ? K(R, U, z) : (K(R, (Y = v[U]) + u + 1, z), (Q = M[Y]) !== 0 && J(R, U -= I[Y], Q), K(R, Y = N(--X), W), (Q = C[Y]) !== 0 && J(R, X -= j[Y], Q)), $ < R.last_lit; ) ;\n K(R, _, z);\n }\n function De(R, z) {\n var W, X, U, Y = z.dyn_tree, Q = z.stat_desc.static_tree, $ = z.stat_desc.has_stree, ie = z.stat_desc.elems, he = -1;\n for (R.heap_len = 0, R.heap_max = m, W = 0; W < ie; W++) Y[2 * W] !== 0 ? (R.heap[++R.heap_len] = he = W, R.depth[W] = 0) : Y[2 * W + 1] = 0;\n for (; R.heap_len < 2; ) Y[2 * (U = R.heap[++R.heap_len] = he < 2 ? ++he : 0)] = 1, R.depth[U] = 0, R.opt_len--, $ && (R.static_len -= Q[2 * U + 1]);\n for (z.max_code = he, W = R.heap_len >> 1; 1 <= W; W--) me(R, Y, W);\n for (U = ie; W = R.heap[1], R.heap[1] = R.heap[R.heap_len--], me(R, Y, 1), X = R.heap[1], R.heap[--R.heap_max] = W, R.heap[--R.heap_max] = X, Y[2 * U] = Y[2 * W] + Y[2 * X], R.depth[U] = (R.depth[W] >= R.depth[X] ? R.depth[W] : R.depth[X]) + 1, Y[2 * W + 1] = Y[2 * X + 1] = U, R.heap[1] = U++, me(R, Y, 1), 2 <= R.heap_len; ) ;\n R.heap[--R.heap_max] = R.heap[1], (function(ae, Te) {\n var $e, ke, Lt, ye, en, vn, Je = Te.dyn_tree, vt = Te.max_code, Bt = Te.stat_desc.static_tree, It = Te.stat_desc.has_stree, zt = Te.stat_desc.extra_bits, St = Te.stat_desc.extra_base, Sn = Te.stat_desc.max_length, jn = 0;\n for (ye = 0; ye <= g; ye++) ae.bl_count[ye] = 0;\n for (Je[2 * ae.heap[ae.heap_max] + 1] = 0, $e = ae.heap_max + 1; $e < m; $e++) Sn < (ye = Je[2 * Je[2 * (ke = ae.heap[$e]) + 1] + 1] + 1) && (ye = Sn, jn++), Je[2 * ke + 1] = ye, vt < ke || (ae.bl_count[ye]++, en = 0, St <= ke && (en = zt[ke - St]), vn = Je[2 * ke], ae.opt_len += vn * (ye + en), It && (ae.static_len += vn * (Bt[2 * ke + 1] + en)));\n if (jn !== 0) {\n do {\n for (ye = Sn - 1; ae.bl_count[ye] === 0; ) ye--;\n ae.bl_count[ye]--, ae.bl_count[ye + 1] += 2, ae.bl_count[Sn]--, jn -= 2;\n } while (0 < jn);\n for (ye = Sn; ye !== 0; ye--) for (ke = ae.bl_count[ye]; ke !== 0; ) vt < (Lt = ae.heap[--$e]) || (Je[2 * Lt + 1] !== ye && (ae.opt_len += (ye - Je[2 * Lt + 1]) * Je[2 * Lt], Je[2 * Lt + 1] = ye), ke--);\n }\n })(R, z), pe(Y, he, R.bl_count);\n }\n function S(R, z, W) {\n var X, U, Y = -1, Q = z[1], $ = 0, ie = 7, he = 4;\n for (Q === 0 && (ie = 138, he = 3), z[2 * (W + 1) + 1] = 65535, X = 0; X <= W; X++) U = Q, Q = z[2 * (X + 1) + 1], ++$ < ie && U === Q || ($ < he ? R.bl_tree[2 * U] += $ : U !== 0 ? (U !== Y && R.bl_tree[2 * U]++, R.bl_tree[2 * x]++) : $ <= 10 ? R.bl_tree[2 * b]++ : R.bl_tree[2 * A]++, Y = U, he = ($ = 0) === Q ? (ie = 138, 3) : U === Q ? (ie = 6, 3) : (ie = 7, 4));\n }\n function G(R, z, W) {\n var X, U, Y = -1, Q = z[1], $ = 0, ie = 7, he = 4;\n for (Q === 0 && (ie = 138, he = 3), X = 0; X <= W; X++) if (U = Q, Q = z[2 * (X + 1) + 1], !(++$ < ie && U === Q)) {\n if ($ < he) for (; K(R, U, R.bl_tree), --$ != 0; ) ;\n else U !== 0 ? (U !== Y && (K(R, U, R.bl_tree), $--), K(R, x, R.bl_tree), J(R, $ - 3, 2)) : $ <= 10 ? (K(R, b, R.bl_tree), J(R, $ - 3, 3)) : (K(R, A, R.bl_tree), J(R, $ - 11, 7));\n Y = U, he = ($ = 0) === Q ? (ie = 138, 3) : U === Q ? (ie = 6, 3) : (ie = 7, 4);\n }\n }\n l(j);\n var V = !1;\n function L(R, z, W, X) {\n J(R, (h << 1) + (X ? 1 : 0), 3), (function(U, Y, Q, $) {\n oe(U), te(U, Q), te(U, ~Q), o.arraySet(U.pending_buf, U.window, Y, Q, U.pending), U.pending += Q;\n })(R, z, W);\n }\n i._tr_init = function(R) {\n V || ((function() {\n var z, W, X, U, Y, Q = new Array(g + 1);\n for (U = X = 0; U < c - 1; U++) for (I[U] = X, z = 0; z < 1 << M[U]; z++) v[X++] = U;\n for (v[X - 1] = U, U = Y = 0; U < 16; U++) for (j[U] = Y, z = 0; z < 1 << C[U]; z++) D[Y++] = U;\n for (Y >>= 7; U < p; U++) for (j[U] = Y << 7, z = 0; z < 1 << C[U] - 7; z++) D[256 + Y++] = U;\n for (W = 0; W <= g; W++) Q[W] = 0;\n for (z = 0; z <= 143; ) B[2 * z + 1] = 8, z++, Q[8]++;\n for (; z <= 255; ) B[2 * z + 1] = 9, z++, Q[9]++;\n for (; z <= 279; ) B[2 * z + 1] = 7, z++, Q[7]++;\n for (; z <= 287; ) B[2 * z + 1] = 8, z++, Q[8]++;\n for (pe(B, d + 1, Q), z = 0; z < p; z++) T[2 * z + 1] = 5, T[2 * z] = fe(z, 5);\n q = new ne(B, M, u + 1, d, g), H = new ne(T, C, 0, p, g), ee = new ne(new Array(0), P, 0, f, w);\n })(), V = !0), R.l_desc = new O(R.dyn_ltree, q), R.d_desc = new O(R.dyn_dtree, H), R.bl_desc = new O(R.bl_tree, ee), R.bi_buf = 0, R.bi_valid = 0, se(R);\n }, i._tr_stored_block = L, i._tr_flush_block = function(R, z, W, X) {\n var U, Y, Q = 0;\n 0 < R.level ? (R.strm.data_type === 2 && (R.strm.data_type = (function($) {\n var ie, he = 4093624447;\n for (ie = 0; ie <= 31; ie++, he >>>= 1) if (1 & he && $.dyn_ltree[2 * ie] !== 0) return r;\n if ($.dyn_ltree[18] !== 0 || $.dyn_ltree[20] !== 0 || $.dyn_ltree[26] !== 0) return a;\n for (ie = 32; ie < u; ie++) if ($.dyn_ltree[2 * ie] !== 0) return a;\n return r;\n })(R)), De(R, R.l_desc), De(R, R.d_desc), Q = (function($) {\n var ie;\n for (S($, $.dyn_ltree, $.l_desc.max_code), S($, $.dyn_dtree, $.d_desc.max_code), De($, $.bl_desc), ie = f - 1; 3 <= ie && $.bl_tree[2 * k[ie] + 1] === 0; ie--) ;\n return $.opt_len += 3 * (ie + 1) + 5 + 5 + 4, ie;\n })(R), U = R.opt_len + 3 + 7 >>> 3, (Y = R.static_len + 3 + 7 >>> 3) <= U && (U = Y)) : U = Y = W + 5, W + 4 <= U && z !== -1 ? L(R, z, W, X) : R.strategy === 4 || Y === U ? (J(R, 2 + (X ? 1 : 0), 3), Se(R, B, T)) : (J(R, 4 + (X ? 1 : 0), 3), (function($, ie, he, ae) {\n var Te;\n for (J($, ie - 257, 5), J($, he - 1, 5), J($, ae - 4, 4), Te = 0; Te < ae; Te++) J($, $.bl_tree[2 * k[Te] + 1], 3);\n G($, $.dyn_ltree, ie - 1), G($, $.dyn_dtree, he - 1);\n })(R, R.l_desc.max_code + 1, R.d_desc.max_code + 1, Q + 1), Se(R, R.dyn_ltree, R.dyn_dtree)), se(R), X && oe(R);\n }, i._tr_tally = function(R, z, W) {\n return R.pending_buf[R.d_buf + 2 * R.last_lit] = z >>> 8 & 255, R.pending_buf[R.d_buf + 2 * R.last_lit + 1] = 255 & z, R.pending_buf[R.l_buf + R.last_lit] = 255 & W, R.last_lit++, z === 0 ? R.dyn_ltree[2 * W]++ : (R.matches++, z--, R.dyn_ltree[2 * (v[W] + u + 1)]++, R.dyn_dtree[2 * N(z)]++), R.last_lit === R.lit_bufsize - 1;\n }, i._tr_align = function(R) {\n J(R, 2, 3), K(R, _, B), (function(z) {\n z.bi_valid === 16 ? (te(z, z.bi_buf), z.bi_buf = 0, z.bi_valid = 0) : 8 <= z.bi_valid && (z.pending_buf[z.pending++] = 255 & z.bi_buf, z.bi_buf >>= 8, z.bi_valid -= 8);\n })(R);\n };\n }, { \"../utils/common\": 41 }], 53: [function(t, n, i) {\n n.exports = function() {\n this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = \"\", this.state = null, this.data_type = 2, this.adler = 0;\n };\n }, {}], 54: [function(t, n, i) {\n (function(o) {\n (function(r, a) {\n if (!r.setImmediate) {\n var l, h, c, u, d = 1, p = {}, f = !1, m = r.document, g = Object.getPrototypeOf && Object.getPrototypeOf(r);\n g = g && g.setTimeout ? g : r, l = {}.toString.call(r.process) === \"[object process]\" ? function(x) {\n process.nextTick(function() {\n w(x);\n });\n } : (function() {\n if (r.postMessage && !r.importScripts) {\n var x = !0, b = r.onmessage;\n return r.onmessage = function() {\n x = !1;\n }, r.postMessage(\"\", \"*\"), r.onmessage = b, x;\n }\n })() ? (u = \"setImmediate$\" + Math.random() + \"$\", r.addEventListener ? r.addEventListener(\"message\", _, !1) : r.attachEvent(\"onmessage\", _), function(x) {\n r.postMessage(u + x, \"*\");\n }) : r.MessageChannel ? ((c = new MessageChannel()).port1.onmessage = function(x) {\n w(x.data);\n }, function(x) {\n c.port2.postMessage(x);\n }) : m && \"onreadystatechange\" in m.createElement(\"script\") ? (h = m.documentElement, function(x) {\n var b = m.createElement(\"script\");\n b.onreadystatechange = function() {\n w(x), b.onreadystatechange = null, h.removeChild(b), b = null;\n }, h.appendChild(b);\n }) : function(x) {\n setTimeout(w, 0, x);\n }, g.setImmediate = function(x) {\n typeof x != \"function\" && (x = new Function(\"\" + x));\n for (var b = new Array(arguments.length - 1), A = 0; A < b.length; A++) b[A] = arguments[A + 1];\n var M = { callback: x, args: b };\n return p[d] = M, l(d), d++;\n }, g.clearImmediate = y;\n }\n function y(x) {\n delete p[x];\n }\n function w(x) {\n if (f) setTimeout(w, 0, x);\n else {\n var b = p[x];\n if (b) {\n f = !0;\n try {\n (function(A) {\n var M = A.callback, C = A.args;\n switch (C.length) {\n case 0:\n M();\n break;\n case 1:\n M(C[0]);\n break;\n case 2:\n M(C[0], C[1]);\n break;\n case 3:\n M(C[0], C[1], C[2]);\n break;\n default:\n M.apply(a, C);\n }\n })(b);\n } finally {\n y(x), f = !1;\n }\n }\n }\n }\n function _(x) {\n x.source === r && typeof x.data == \"string\" && x.data.indexOf(u) === 0 && w(+x.data.slice(u.length));\n }\n })(typeof self > \"u\" ? o === void 0 ? this : o : self);\n }).call(this, typeof Yn < \"u\" ? Yn : typeof self < \"u\" ? self : typeof window < \"u\" ? window : {});\n }, {}] }, {}, [10])(10);\n });\n })(Qi)), Qi.exports;\n}\nvar dc = fc();\nconst Ko = /* @__PURE__ */ qo(dc);\nfunction Zo(s, e) {\n return function() {\n return s.apply(e, arguments);\n };\n}\nconst { toString: pc } = Object.prototype, { getPrototypeOf: nr } = Object, { iterator: Hi, toStringTag: Yo } = Symbol, Gi = /* @__PURE__ */ ((s) => (e) => {\n const t = pc.call(e);\n return s[t] || (s[t] = t.slice(8, -1).toLowerCase());\n})(/* @__PURE__ */ Object.create(null)), it = (s) => (s = s.toLowerCase(), (e) => Gi(e) === s), Wi = (s) => (e) => typeof e === s, { isArray: xn } = Array, wn = Wi(\"undefined\");\nfunction On(s) {\n return s !== null && !wn(s) && s.constructor !== null && !wn(s.constructor) && Ue(s.constructor.isBuffer) && s.constructor.isBuffer(s);\n}\nconst $o = it(\"ArrayBuffer\");\nfunction mc(s) {\n let e;\n return typeof ArrayBuffer < \"u\" && ArrayBuffer.isView ? e = ArrayBuffer.isView(s) : e = s && s.buffer && $o(s.buffer), e;\n}\nconst gc = Wi(\"string\"), Ue = Wi(\"function\"), Jo = Wi(\"number\"), Un = (s) => s !== null && typeof s == \"object\", yc = (s) => s === !0 || s === !1, Si = (s) => {\n if (Gi(s) !== \"object\")\n return !1;\n const e = nr(s);\n return (e === null || e === Object.prototype || Object.getPrototypeOf(e) === null) && !(Yo in s) && !(Hi in s);\n}, wc = (s) => {\n if (!Un(s) || On(s))\n return !1;\n try {\n return Object.keys(s).length === 0 && Object.getPrototypeOf(s) === Object.prototype;\n } catch {\n return !1;\n }\n}, _c = it(\"Date\"), xc = it(\"File\"), bc = it(\"Blob\"), vc = it(\"FileList\"), Sc = (s) => Un(s) && Ue(s.pipe), Tc = (s) => {\n let e;\n return s && (typeof FormData == \"function\" && s instanceof FormData || Ue(s.append) && ((e = Gi(s)) === \"formdata\" || // detect form-data instance\n e === \"object\" && Ue(s.toString) && s.toString() === \"[object FormData]\"));\n}, Ec = it(\"URLSearchParams\"), [Mc, Ac, Cc, Pc] = [\"ReadableStream\", \"Request\", \"Response\", \"Headers\"].map(it), kc = (s) => s.trim ? s.trim() : s.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\");\nfunction Fn(s, e, { allOwnKeys: t = !1 } = {}) {\n if (s === null || typeof s > \"u\")\n return;\n let n, i;\n if (typeof s != \"object\" && (s = [s]), xn(s))\n for (n = 0, i = s.length; n < i; n++)\n e.call(null, s[n], n, s);\n else {\n if (On(s))\n return;\n const o = t ? Object.getOwnPropertyNames(s) : Object.keys(s), r = o.length;\n let a;\n for (n = 0; n < r; n++)\n a = o[n], e.call(null, s[a], a, s);\n }\n}\nfunction Qo(s, e) {\n if (On(s))\n return null;\n e = e.toLowerCase();\n const t = Object.keys(s);\n let n = t.length, i;\n for (; n-- > 0; )\n if (i = t[n], e === i.toLowerCase())\n return i;\n return null;\n}\nconst Wt = typeof globalThis < \"u\" ? globalThis : typeof self < \"u\" ? self : typeof window < \"u\" ? window : global, ea = (s) => !wn(s) && s !== Wt;\nfunction Bs() {\n const { caseless: s, skipUndefined: e } = ea(this) && this || {}, t = {}, n = (i, o) => {\n const r = s && Qo(t, o) || o;\n Si(t[r]) && Si(i) ? t[r] = Bs(t[r], i) : Si(i) ? t[r] = Bs({}, i) : xn(i) ? t[r] = i.slice() : (!e || !wn(i)) && (t[r] = i);\n };\n for (let i = 0, o = arguments.length; i < o; i++)\n arguments[i] && Fn(arguments[i], n);\n return t;\n}\nconst Rc = (s, e, t, { allOwnKeys: n } = {}) => (Fn(e, (i, o) => {\n t && Ue(i) ? s[o] = Zo(i, t) : s[o] = i;\n}, { allOwnKeys: n }), s), Dc = (s) => (s.charCodeAt(0) === 65279 && (s = s.slice(1)), s), Lc = (s, e, t, n) => {\n s.prototype = Object.create(e.prototype, n), s.prototype.constructor = s, Object.defineProperty(s, \"super\", {\n value: e.prototype\n }), t && Object.assign(s.prototype, t);\n}, Bc = (s, e, t, n) => {\n let i, o, r;\n const a = {};\n if (e = e || {}, s == null) return e;\n do {\n for (i = Object.getOwnPropertyNames(s), o = i.length; o-- > 0; )\n r = i[o], (!n || n(r, s, e)) && !a[r] && (e[r] = s[r], a[r] = !0);\n s = t !== !1 && nr(s);\n } while (s && (!t || t(s, e)) && s !== Object.prototype);\n return e;\n}, Ic = (s, e, t) => {\n s = String(s), (t === void 0 || t > s.length) && (t = s.length), t -= e.length;\n const n = s.indexOf(e, t);\n return n !== -1 && n === t;\n}, zc = (s) => {\n if (!s) return null;\n if (xn(s)) return s;\n let e = s.length;\n if (!Jo(e)) return null;\n const t = new Array(e);\n for (; e-- > 0; )\n t[e] = s[e];\n return t;\n}, Nc = /* @__PURE__ */ ((s) => (e) => s && e instanceof s)(typeof Uint8Array < \"u\" && nr(Uint8Array)), Oc = (s, e) => {\n const n = (s && s[Hi]).call(s);\n let i;\n for (; (i = n.next()) && !i.done; ) {\n const o = i.value;\n e.call(s, o[0], o[1]);\n }\n}, Uc = (s, e) => {\n let t;\n const n = [];\n for (; (t = s.exec(e)) !== null; )\n n.push(t);\n return n;\n}, Fc = it(\"HTMLFormElement\"), Vc = (s) => s.toLowerCase().replace(\n /[-_\\s]([a-z\\d])(\\w*)/g,\n function(t, n, i) {\n return n.toUpperCase() + i;\n }\n), Er = (({ hasOwnProperty: s }) => (e, t) => s.call(e, t))(Object.prototype), jc = it(\"RegExp\"), ta = (s, e) => {\n const t = Object.getOwnPropertyDescriptors(s), n = {};\n Fn(t, (i, o) => {\n let r;\n (r = e(i, o, s)) !== !1 && (n[o] = r || i);\n }), Object.defineProperties(s, n);\n}, Hc = (s) => {\n ta(s, (e, t) => {\n if (Ue(s) && [\"arguments\", \"caller\", \"callee\"].indexOf(t) !== -1)\n return !1;\n const n = s[t];\n if (Ue(n)) {\n if (e.enumerable = !1, \"writable\" in e) {\n e.writable = !1;\n return;\n }\n e.set || (e.set = () => {\n throw Error(\"Can not rewrite read-only method '\" + t + \"'\");\n });\n }\n });\n}, Gc = (s, e) => {\n const t = {}, n = (i) => {\n i.forEach((o) => {\n t[o] = !0;\n });\n };\n return xn(s) ? n(s) : n(String(s).split(e)), t;\n}, Wc = () => {\n}, Xc = (s, e) => s != null && Number.isFinite(s = +s) ? s : e;\nfunction qc(s) {\n return !!(s && Ue(s.append) && s[Yo] === \"FormData\" && s[Hi]);\n}\nconst Kc = (s) => {\n const e = new Array(10), t = (n, i) => {\n if (Un(n)) {\n if (e.indexOf(n) >= 0)\n return;\n if (On(n))\n return n;\n if (!(\"toJSON\" in n)) {\n e[i] = n;\n const o = xn(n) ? [] : {};\n return Fn(n, (r, a) => {\n const l = t(r, i + 1);\n !wn(l) && (o[a] = l);\n }), e[i] = void 0, o;\n }\n }\n return n;\n };\n return t(s, 0);\n}, Zc = it(\"AsyncFunction\"), Yc = (s) => s && (Un(s) || Ue(s)) && Ue(s.then) && Ue(s.catch), na = ((s, e) => s ? setImmediate : e ? ((t, n) => (Wt.addEventListener(\"message\", ({ source: i, data: o }) => {\n i === Wt && o === t && n.length && n.shift()();\n}, !1), (i) => {\n n.push(i), Wt.postMessage(t, \"*\");\n}))(`axios@${Math.random()}`, []) : (t) => setTimeout(t))(\n typeof setImmediate == \"function\",\n Ue(Wt.postMessage)\n), $c = typeof queueMicrotask < \"u\" ? queueMicrotask.bind(Wt) : typeof process < \"u\" && process.nextTick || na, Jc = (s) => s != null && Ue(s[Hi]), F = {\n isArray: xn,\n isArrayBuffer: $o,\n isBuffer: On,\n isFormData: Tc,\n isArrayBufferView: mc,\n isString: gc,\n isNumber: Jo,\n isBoolean: yc,\n isObject: Un,\n isPlainObject: Si,\n isEmptyObject: wc,\n isReadableStream: Mc,\n isRequest: Ac,\n isResponse: Cc,\n isHeaders: Pc,\n isUndefined: wn,\n isDate: _c,\n isFile: xc,\n isBlob: bc,\n isRegExp: jc,\n isFunction: Ue,\n isStream: Sc,\n isURLSearchParams: Ec,\n isTypedArray: Nc,\n isFileList: vc,\n forEach: Fn,\n merge: Bs,\n extend: Rc,\n trim: kc,\n stripBOM: Dc,\n inherits: Lc,\n toFlatObject: Bc,\n kindOf: Gi,\n kindOfTest: it,\n endsWith: Ic,\n toArray: zc,\n forEachEntry: Oc,\n matchAll: Uc,\n isHTMLForm: Fc,\n hasOwnProperty: Er,\n hasOwnProp: Er,\n // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors: ta,\n freezeMethods: Hc,\n toObjectSet: Gc,\n toCamelCase: Vc,\n noop: Wc,\n toFiniteNumber: Xc,\n findKey: Qo,\n global: Wt,\n isContextDefined: ea,\n isSpecCompliantForm: qc,\n toJSONObject: Kc,\n isAsyncFn: Zc,\n isThenable: Yc,\n setImmediate: na,\n asap: $c,\n isIterable: Jc\n};\nfunction re(s, e, t, n, i) {\n Error.call(this), Error.captureStackTrace ? Error.captureStackTrace(this, this.constructor) : this.stack = new Error().stack, this.message = s, this.name = \"AxiosError\", e && (this.code = e), t && (this.config = t), n && (this.request = n), i && (this.response = i, this.status = i.status ? i.status : null);\n}\nF.inherits(re, Error, {\n toJSON: function() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: F.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\nconst ia = re.prototype, sa = {};\n[\n \"ERR_BAD_OPTION_VALUE\",\n \"ERR_BAD_OPTION\",\n \"ECONNABORTED\",\n \"ETIMEDOUT\",\n \"ERR_NETWORK\",\n \"ERR_FR_TOO_MANY_REDIRECTS\",\n \"ERR_DEPRECATED\",\n \"ERR_BAD_RESPONSE\",\n \"ERR_BAD_REQUEST\",\n \"ERR_CANCELED\",\n \"ERR_NOT_SUPPORT\",\n \"ERR_INVALID_URL\"\n // eslint-disable-next-line func-names\n].forEach((s) => {\n sa[s] = { value: s };\n});\nObject.defineProperties(re, sa);\nObject.defineProperty(ia, \"isAxiosError\", { value: !0 });\nre.from = (s, e, t, n, i, o) => {\n const r = Object.create(ia);\n F.toFlatObject(s, r, function(c) {\n return c !== Error.prototype;\n }, (h) => h !== \"isAxiosError\");\n const a = s && s.message ? s.message : \"Error\", l = e == null && s ? s.code : e;\n return re.call(r, a, l, t, n, i), s && r.cause == null && Object.defineProperty(r, \"cause\", { value: s, configurable: !0 }), r.name = s && s.name || \"Error\", o && Object.assign(r, o), r;\n};\nconst Qc = null;\nfunction Is(s) {\n return F.isPlainObject(s) || F.isArray(s);\n}\nfunction ra(s) {\n return F.endsWith(s, \"[]\") ? s.slice(0, -2) : s;\n}\nfunction Mr(s, e, t) {\n return s ? s.concat(e).map(function(i, o) {\n return i = ra(i), !t && o ? \"[\" + i + \"]\" : i;\n }).join(t ? \".\" : \"\") : e;\n}\nfunction eh(s) {\n return F.isArray(s) && !s.some(Is);\n}\nconst th = F.toFlatObject(F, {}, null, function(e) {\n return /^is[A-Z]/.test(e);\n});\nfunction Xi(s, e, t) {\n if (!F.isObject(s))\n throw new TypeError(\"target must be an object\");\n e = e || new FormData(), t = F.toFlatObject(t, {\n metaTokens: !0,\n dots: !1,\n indexes: !1\n }, !1, function(m, g) {\n return !F.isUndefined(g[m]);\n });\n const n = t.metaTokens, i = t.visitor || c, o = t.dots, r = t.indexes, l = (t.Blob || typeof Blob < \"u\" && Blob) && F.isSpecCompliantForm(e);\n if (!F.isFunction(i))\n throw new TypeError(\"visitor must be a function\");\n function h(f) {\n if (f === null) return \"\";\n if (F.isDate(f))\n return f.toISOString();\n if (F.isBoolean(f))\n return f.toString();\n if (!l && F.isBlob(f))\n throw new re(\"Blob is not supported. Use a Buffer instead.\");\n return F.isArrayBuffer(f) || F.isTypedArray(f) ? l && typeof Blob == \"function\" ? new Blob([f]) : Buffer.from(f) : f;\n }\n function c(f, m, g) {\n let y = f;\n if (f && !g && typeof f == \"object\") {\n if (F.endsWith(m, \"{}\"))\n m = n ? m : m.slice(0, -2), f = JSON.stringify(f);\n else if (F.isArray(f) && eh(f) || (F.isFileList(f) || F.endsWith(m, \"[]\")) && (y = F.toArray(f)))\n return m = ra(m), y.forEach(function(_, x) {\n !(F.isUndefined(_) || _ === null) && e.append(\n // eslint-disable-next-line no-nested-ternary\n r === !0 ? Mr([m], x, o) : r === null ? m : m + \"[]\",\n h(_)\n );\n }), !1;\n }\n return Is(f) ? !0 : (e.append(Mr(g, m, o), h(f)), !1);\n }\n const u = [], d = Object.assign(th, {\n defaultVisitor: c,\n convertValue: h,\n isVisitable: Is\n });\n function p(f, m) {\n if (!F.isUndefined(f)) {\n if (u.indexOf(f) !== -1)\n throw Error(\"Circular reference detected in \" + m.join(\".\"));\n u.push(f), F.forEach(f, function(y, w) {\n (!(F.isUndefined(y) || y === null) && i.call(\n e,\n y,\n F.isString(w) ? w.trim() : w,\n m,\n d\n )) === !0 && p(y, m ? m.concat(w) : [w]);\n }), u.pop();\n }\n }\n if (!F.isObject(s))\n throw new TypeError(\"data must be an object\");\n return p(s), e;\n}\nfunction Ar(s) {\n const e = {\n \"!\": \"%21\",\n \"'\": \"%27\",\n \"(\": \"%28\",\n \")\": \"%29\",\n \"~\": \"%7E\",\n \"%20\": \"+\",\n \"%00\": \"\\0\"\n };\n return encodeURIComponent(s).replace(/[!'()~]|%20|%00/g, function(n) {\n return e[n];\n });\n}\nfunction ir(s, e) {\n this._pairs = [], s && Xi(s, this, e);\n}\nconst oa = ir.prototype;\noa.append = function(e, t) {\n this._pairs.push([e, t]);\n};\noa.toString = function(e) {\n const t = e ? function(n) {\n return e.call(this, n, Ar);\n } : Ar;\n return this._pairs.map(function(i) {\n return t(i[0]) + \"=\" + t(i[1]);\n }, \"\").join(\"&\");\n};\nfunction nh(s) {\n return encodeURIComponent(s).replace(/%3A/gi, \":\").replace(/%24/g, \"$\").replace(/%2C/gi, \",\").replace(/%20/g, \"+\");\n}\nfunction aa(s, e, t) {\n if (!e)\n return s;\n const n = t && t.encode || nh;\n F.isFunction(t) && (t = {\n serialize: t\n });\n const i = t && t.serialize;\n let o;\n if (i ? o = i(e, t) : o = F.isURLSearchParams(e) ? e.toString() : new ir(e, t).toString(n), o) {\n const r = s.indexOf(\"#\");\n r !== -1 && (s = s.slice(0, r)), s += (s.indexOf(\"?\") === -1 ? \"?\" : \"&\") + o;\n }\n return s;\n}\nclass Cr {\n constructor() {\n this.handlers = [];\n }\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(e, t, n) {\n return this.handlers.push({\n fulfilled: e,\n rejected: t,\n synchronous: n ? n.synchronous : !1,\n runWhen: n ? n.runWhen : null\n }), this.handlers.length - 1;\n }\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {void}\n */\n eject(e) {\n this.handlers[e] && (this.handlers[e] = null);\n }\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n this.handlers && (this.handlers = []);\n }\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(e) {\n F.forEach(this.handlers, function(n) {\n n !== null && e(n);\n });\n }\n}\nconst la = {\n silentJSONParsing: !0,\n forcedJSONParsing: !0,\n clarifyTimeoutError: !1\n}, ih = typeof URLSearchParams < \"u\" ? URLSearchParams : ir, sh = typeof FormData < \"u\" ? FormData : null, rh = typeof Blob < \"u\" ? Blob : null, oh = {\n isBrowser: !0,\n classes: {\n URLSearchParams: ih,\n FormData: sh,\n Blob: rh\n },\n protocols: [\"http\", \"https\", \"file\", \"blob\", \"url\", \"data\"]\n}, sr = typeof window < \"u\" && typeof document < \"u\", zs = typeof navigator == \"object\" && navigator || void 0, ah = sr && (!zs || [\"ReactNative\", \"NativeScript\", \"NS\"].indexOf(zs.product) < 0), lh = typeof WorkerGlobalScope < \"u\" && // eslint-disable-next-line no-undef\nself instanceof WorkerGlobalScope && typeof self.importScripts == \"function\", ch = sr && window.location.href || \"http://localhost\", hh = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n hasBrowserEnv: sr,\n hasStandardBrowserEnv: ah,\n hasStandardBrowserWebWorkerEnv: lh,\n navigator: zs,\n origin: ch\n}, Symbol.toStringTag, { value: \"Module\" })), Re = {\n ...hh,\n ...oh\n};\nfunction uh(s, e) {\n return Xi(s, new Re.classes.URLSearchParams(), {\n visitor: function(t, n, i, o) {\n return Re.isNode && F.isBuffer(t) ? (this.append(n, t.toString(\"base64\")), !1) : o.defaultVisitor.apply(this, arguments);\n },\n ...e\n });\n}\nfunction fh(s) {\n return F.matchAll(/\\w+|\\[(\\w*)]/g, s).map((e) => e[0] === \"[]\" ? \"\" : e[1] || e[0]);\n}\nfunction dh(s) {\n const e = {}, t = Object.keys(s);\n let n;\n const i = t.length;\n let o;\n for (n = 0; n < i; n++)\n o = t[n], e[o] = s[o];\n return e;\n}\nfunction ca(s) {\n function e(t, n, i, o) {\n let r = t[o++];\n if (r === \"__proto__\") return !0;\n const a = Number.isFinite(+r), l = o >= t.length;\n return r = !r && F.isArray(i) ? i.length : r, l ? (F.hasOwnProp(i, r) ? i[r] = [i[r], n] : i[r] = n, !a) : ((!i[r] || !F.isObject(i[r])) && (i[r] = []), e(t, n, i[r], o) && F.isArray(i[r]) && (i[r] = dh(i[r])), !a);\n }\n if (F.isFormData(s) && F.isFunction(s.entries)) {\n const t = {};\n return F.forEachEntry(s, (n, i) => {\n e(fh(n), i, t, 0);\n }), t;\n }\n return null;\n}\nfunction ph(s, e, t) {\n if (F.isString(s))\n try {\n return (e || JSON.parse)(s), F.trim(s);\n } catch (n) {\n if (n.name !== \"SyntaxError\")\n throw n;\n }\n return (t || JSON.stringify)(s);\n}\nconst Vn = {\n transitional: la,\n adapter: [\"xhr\", \"http\", \"fetch\"],\n transformRequest: [function(e, t) {\n const n = t.getContentType() || \"\", i = n.indexOf(\"application/json\") > -1, o = F.isObject(e);\n if (o && F.isHTMLForm(e) && (e = new FormData(e)), F.isFormData(e))\n return i ? JSON.stringify(ca(e)) : e;\n if (F.isArrayBuffer(e) || F.isBuffer(e) || F.isStream(e) || F.isFile(e) || F.isBlob(e) || F.isReadableStream(e))\n return e;\n if (F.isArrayBufferView(e))\n return e.buffer;\n if (F.isURLSearchParams(e))\n return t.setContentType(\"application/x-www-form-urlencoded;charset=utf-8\", !1), e.toString();\n let a;\n if (o) {\n if (n.indexOf(\"application/x-www-form-urlencoded\") > -1)\n return uh(e, this.formSerializer).toString();\n if ((a = F.isFileList(e)) || n.indexOf(\"multipart/form-data\") > -1) {\n const l = this.env && this.env.FormData;\n return Xi(\n a ? { \"files[]\": e } : e,\n l && new l(),\n this.formSerializer\n );\n }\n }\n return o || i ? (t.setContentType(\"application/json\", !1), ph(e)) : e;\n }],\n transformResponse: [function(e) {\n const t = this.transitional || Vn.transitional, n = t && t.forcedJSONParsing, i = this.responseType === \"json\";\n if (F.isResponse(e) || F.isReadableStream(e))\n return e;\n if (e && F.isString(e) && (n && !this.responseType || i)) {\n const r = !(t && t.silentJSONParsing) && i;\n try {\n return JSON.parse(e, this.parseReviver);\n } catch (a) {\n if (r)\n throw a.name === \"SyntaxError\" ? re.from(a, re.ERR_BAD_RESPONSE, this, null, this.response) : a;\n }\n }\n return e;\n }],\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n xsrfCookieName: \"XSRF-TOKEN\",\n xsrfHeaderName: \"X-XSRF-TOKEN\",\n maxContentLength: -1,\n maxBodyLength: -1,\n env: {\n FormData: Re.classes.FormData,\n Blob: Re.classes.Blob\n },\n validateStatus: function(e) {\n return e >= 200 && e < 300;\n },\n headers: {\n common: {\n Accept: \"application/json, text/plain, */*\",\n \"Content-Type\": void 0\n }\n }\n};\nF.forEach([\"delete\", \"get\", \"head\", \"post\", \"put\", \"patch\"], (s) => {\n Vn.headers[s] = {};\n});\nconst mh = F.toObjectSet([\n \"age\",\n \"authorization\",\n \"content-length\",\n \"content-type\",\n \"etag\",\n \"expires\",\n \"from\",\n \"host\",\n \"if-modified-since\",\n \"if-unmodified-since\",\n \"last-modified\",\n \"location\",\n \"max-forwards\",\n \"proxy-authorization\",\n \"referer\",\n \"retry-after\",\n \"user-agent\"\n]), gh = (s) => {\n const e = {};\n let t, n, i;\n return s && s.split(`\n`).forEach(function(r) {\n i = r.indexOf(\":\"), t = r.substring(0, i).trim().toLowerCase(), n = r.substring(i + 1).trim(), !(!t || e[t] && mh[t]) && (t === \"set-cookie\" ? e[t] ? e[t].push(n) : e[t] = [n] : e[t] = e[t] ? e[t] + \", \" + n : n);\n }), e;\n}, Pr = Symbol(\"internals\");\nfunction Tn(s) {\n return s && String(s).trim().toLowerCase();\n}\nfunction Ti(s) {\n return s === !1 || s == null ? s : F.isArray(s) ? s.map(Ti) : String(s);\n}\nfunction yh(s) {\n const e = /* @__PURE__ */ Object.create(null), t = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let n;\n for (; n = t.exec(s); )\n e[n[1]] = n[2];\n return e;\n}\nconst wh = (s) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(s.trim());\nfunction es(s, e, t, n, i) {\n if (F.isFunction(n))\n return n.call(this, e, t);\n if (i && (e = t), !!F.isString(e)) {\n if (F.isString(n))\n return e.indexOf(n) !== -1;\n if (F.isRegExp(n))\n return n.test(e);\n }\n}\nfunction _h(s) {\n return s.trim().toLowerCase().replace(/([a-z\\d])(\\w*)/g, (e, t, n) => t.toUpperCase() + n);\n}\nfunction xh(s, e) {\n const t = F.toCamelCase(\" \" + e);\n [\"get\", \"set\", \"has\"].forEach((n) => {\n Object.defineProperty(s, n + t, {\n value: function(i, o, r) {\n return this[n].call(this, e, i, o, r);\n },\n configurable: !0\n });\n });\n}\nlet Fe = class {\n constructor(e) {\n e && this.set(e);\n }\n set(e, t, n) {\n const i = this;\n function o(a, l, h) {\n const c = Tn(l);\n if (!c)\n throw new Error(\"header name must be a non-empty string\");\n const u = F.findKey(i, c);\n (!u || i[u] === void 0 || h === !0 || h === void 0 && i[u] !== !1) && (i[u || l] = Ti(a));\n }\n const r = (a, l) => F.forEach(a, (h, c) => o(h, c, l));\n if (F.isPlainObject(e) || e instanceof this.constructor)\n r(e, t);\n else if (F.isString(e) && (e = e.trim()) && !wh(e))\n r(gh(e), t);\n else if (F.isObject(e) && F.isIterable(e)) {\n let a = {}, l, h;\n for (const c of e) {\n if (!F.isArray(c))\n throw TypeError(\"Object iterator must return a key-value pair\");\n a[h = c[0]] = (l = a[h]) ? F.isArray(l) ? [...l, c[1]] : [l, c[1]] : c[1];\n }\n r(a, t);\n } else\n e != null && o(t, e, n);\n return this;\n }\n get(e, t) {\n if (e = Tn(e), e) {\n const n = F.findKey(this, e);\n if (n) {\n const i = this[n];\n if (!t)\n return i;\n if (t === !0)\n return yh(i);\n if (F.isFunction(t))\n return t.call(this, i, n);\n if (F.isRegExp(t))\n return t.exec(i);\n throw new TypeError(\"parser must be boolean|regexp|function\");\n }\n }\n }\n has(e, t) {\n if (e = Tn(e), e) {\n const n = F.findKey(this, e);\n return !!(n && this[n] !== void 0 && (!t || es(this, this[n], n, t)));\n }\n return !1;\n }\n delete(e, t) {\n const n = this;\n let i = !1;\n function o(r) {\n if (r = Tn(r), r) {\n const a = F.findKey(n, r);\n a && (!t || es(n, n[a], a, t)) && (delete n[a], i = !0);\n }\n }\n return F.isArray(e) ? e.forEach(o) : o(e), i;\n }\n clear(e) {\n const t = Object.keys(this);\n let n = t.length, i = !1;\n for (; n--; ) {\n const o = t[n];\n (!e || es(this, this[o], o, e, !0)) && (delete this[o], i = !0);\n }\n return i;\n }\n normalize(e) {\n const t = this, n = {};\n return F.forEach(this, (i, o) => {\n const r = F.findKey(n, o);\n if (r) {\n t[r] = Ti(i), delete t[o];\n return;\n }\n const a = e ? _h(o) : String(o).trim();\n a !== o && delete t[o], t[a] = Ti(i), n[a] = !0;\n }), this;\n }\n concat(...e) {\n return this.constructor.concat(this, ...e);\n }\n toJSON(e) {\n const t = /* @__PURE__ */ Object.create(null);\n return F.forEach(this, (n, i) => {\n n != null && n !== !1 && (t[i] = e && F.isArray(n) ? n.join(\", \") : n);\n }), t;\n }\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n toString() {\n return Object.entries(this.toJSON()).map(([e, t]) => e + \": \" + t).join(`\n`);\n }\n getSetCookie() {\n return this.get(\"set-cookie\") || [];\n }\n get [Symbol.toStringTag]() {\n return \"AxiosHeaders\";\n }\n static from(e) {\n return e instanceof this ? e : new this(e);\n }\n static concat(e, ...t) {\n const n = new this(e);\n return t.forEach((i) => n.set(i)), n;\n }\n static accessor(e) {\n const n = (this[Pr] = this[Pr] = {\n accessors: {}\n }).accessors, i = this.prototype;\n function o(r) {\n const a = Tn(r);\n n[a] || (xh(i, r), n[a] = !0);\n }\n return F.isArray(e) ? e.forEach(o) : o(e), this;\n }\n};\nFe.accessor([\"Content-Type\", \"Content-Length\", \"Accept\", \"Accept-Encoding\", \"User-Agent\", \"Authorization\"]);\nF.reduceDescriptors(Fe.prototype, ({ value: s }, e) => {\n let t = e[0].toUpperCase() + e.slice(1);\n return {\n get: () => s,\n set(n) {\n this[t] = n;\n }\n };\n});\nF.freezeMethods(Fe);\nfunction ts(s, e) {\n const t = this || Vn, n = e || t, i = Fe.from(n.headers);\n let o = n.data;\n return F.forEach(s, function(a) {\n o = a.call(t, o, i.normalize(), e ? e.status : void 0);\n }), i.normalize(), o;\n}\nfunction ha(s) {\n return !!(s && s.__CANCEL__);\n}\nfunction bn(s, e, t) {\n re.call(this, s ?? \"canceled\", re.ERR_CANCELED, e, t), this.name = \"CanceledError\";\n}\nF.inherits(bn, re, {\n __CANCEL__: !0\n});\nfunction ua(s, e, t) {\n const n = t.config.validateStatus;\n !t.status || !n || n(t.status) ? s(t) : e(new re(\n \"Request failed with status code \" + t.status,\n [re.ERR_BAD_REQUEST, re.ERR_BAD_RESPONSE][Math.floor(t.status / 100) - 4],\n t.config,\n t.request,\n t\n ));\n}\nfunction bh(s) {\n const e = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(s);\n return e && e[1] || \"\";\n}\nfunction vh(s, e) {\n s = s || 10;\n const t = new Array(s), n = new Array(s);\n let i = 0, o = 0, r;\n return e = e !== void 0 ? e : 1e3, function(l) {\n const h = Date.now(), c = n[o];\n r || (r = h), t[i] = l, n[i] = h;\n let u = o, d = 0;\n for (; u !== i; )\n d += t[u++], u = u % s;\n if (i = (i + 1) % s, i === o && (o = (o + 1) % s), h - r < e)\n return;\n const p = c && h - c;\n return p ? Math.round(d * 1e3 / p) : void 0;\n };\n}\nfunction Sh(s, e) {\n let t = 0, n = 1e3 / e, i, o;\n const r = (h, c = Date.now()) => {\n t = c, i = null, o && (clearTimeout(o), o = null), s(...h);\n };\n return [(...h) => {\n const c = Date.now(), u = c - t;\n u >= n ? r(h, c) : (i = h, o || (o = setTimeout(() => {\n o = null, r(i);\n }, n - u)));\n }, () => i && r(i)];\n}\nconst Ii = (s, e, t = 3) => {\n let n = 0;\n const i = vh(50, 250);\n return Sh((o) => {\n const r = o.loaded, a = o.lengthComputable ? o.total : void 0, l = r - n, h = i(l), c = r <= a;\n n = r;\n const u = {\n loaded: r,\n total: a,\n progress: a ? r / a : void 0,\n bytes: l,\n rate: h || void 0,\n estimated: h && a && c ? (a - r) / h : void 0,\n event: o,\n lengthComputable: a != null,\n [e ? \"download\" : \"upload\"]: !0\n };\n s(u);\n }, t);\n}, kr = (s, e) => {\n const t = s != null;\n return [(n) => e[0]({\n lengthComputable: t,\n total: s,\n loaded: n\n }), e[1]];\n}, Rr = (s) => (...e) => F.asap(() => s(...e)), Th = Re.hasStandardBrowserEnv ? /* @__PURE__ */ ((s, e) => (t) => (t = new URL(t, Re.origin), s.protocol === t.protocol && s.host === t.host && (e || s.port === t.port)))(\n new URL(Re.origin),\n Re.navigator && /(msie|trident)/i.test(Re.navigator.userAgent)\n) : () => !0, Eh = Re.hasStandardBrowserEnv ? (\n // Standard browser envs support document.cookie\n {\n write(s, e, t, n, i, o, r) {\n if (typeof document > \"u\") return;\n const a = [`${s}=${encodeURIComponent(e)}`];\n F.isNumber(t) && a.push(`expires=${new Date(t).toUTCString()}`), F.isString(n) && a.push(`path=${n}`), F.isString(i) && a.push(`domain=${i}`), o === !0 && a.push(\"secure\"), F.isString(r) && a.push(`SameSite=${r}`), document.cookie = a.join(\"; \");\n },\n read(s) {\n if (typeof document > \"u\") return null;\n const e = document.cookie.match(new RegExp(\"(?:^|; )\" + s + \"=([^;]*)\"));\n return e ? decodeURIComponent(e[1]) : null;\n },\n remove(s) {\n this.write(s, \"\", Date.now() - 864e5, \"/\");\n }\n }\n) : (\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {\n },\n read() {\n return null;\n },\n remove() {\n }\n }\n);\nfunction Mh(s) {\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(s);\n}\nfunction Ah(s, e) {\n return e ? s.replace(/\\/?\\/$/, \"\") + \"/\" + e.replace(/^\\/+/, \"\") : s;\n}\nfunction fa(s, e, t) {\n let n = !Mh(e);\n return s && (n || t == !1) ? Ah(s, e) : e;\n}\nconst Dr = (s) => s instanceof Fe ? { ...s } : s;\nfunction Yt(s, e) {\n e = e || {};\n const t = {};\n function n(h, c, u, d) {\n return F.isPlainObject(h) && F.isPlainObject(c) ? F.merge.call({ caseless: d }, h, c) : F.isPlainObject(c) ? F.merge({}, c) : F.isArray(c) ? c.slice() : c;\n }\n function i(h, c, u, d) {\n if (F.isUndefined(c)) {\n if (!F.isUndefined(h))\n return n(void 0, h, u, d);\n } else return n(h, c, u, d);\n }\n function o(h, c) {\n if (!F.isUndefined(c))\n return n(void 0, c);\n }\n function r(h, c) {\n if (F.isUndefined(c)) {\n if (!F.isUndefined(h))\n return n(void 0, h);\n } else return n(void 0, c);\n }\n function a(h, c, u) {\n if (u in e)\n return n(h, c);\n if (u in s)\n return n(void 0, h);\n }\n const l = {\n url: o,\n method: o,\n data: o,\n baseURL: r,\n transformRequest: r,\n transformResponse: r,\n paramsSerializer: r,\n timeout: r,\n timeoutMessage: r,\n withCredentials: r,\n withXSRFToken: r,\n adapter: r,\n responseType: r,\n xsrfCookieName: r,\n xsrfHeaderName: r,\n onUploadProgress: r,\n onDownloadProgress: r,\n decompress: r,\n maxContentLength: r,\n maxBodyLength: r,\n beforeRedirect: r,\n transport: r,\n httpAgent: r,\n httpsAgent: r,\n cancelToken: r,\n socketPath: r,\n responseEncoding: r,\n validateStatus: a,\n headers: (h, c, u) => i(Dr(h), Dr(c), u, !0)\n };\n return F.forEach(Object.keys({ ...s, ...e }), function(c) {\n const u = l[c] || i, d = u(s[c], e[c], c);\n F.isUndefined(d) && u !== a || (t[c] = d);\n }), t;\n}\nconst da = (s) => {\n const e = Yt({}, s);\n let { data: t, withXSRFToken: n, xsrfHeaderName: i, xsrfCookieName: o, headers: r, auth: a } = e;\n if (e.headers = r = Fe.from(r), e.url = aa(fa(e.baseURL, e.url, e.allowAbsoluteUrls), s.params, s.paramsSerializer), a && r.set(\n \"Authorization\",\n \"Basic \" + btoa((a.username || \"\") + \":\" + (a.password ? unescape(encodeURIComponent(a.password)) : \"\"))\n ), F.isFormData(t)) {\n if (Re.hasStandardBrowserEnv || Re.hasStandardBrowserWebWorkerEnv)\n r.setContentType(void 0);\n else if (F.isFunction(t.getHeaders)) {\n const l = t.getHeaders(), h = [\"content-type\", \"content-length\"];\n Object.entries(l).forEach(([c, u]) => {\n h.includes(c.toLowerCase()) && r.set(c, u);\n });\n }\n }\n if (Re.hasStandardBrowserEnv && (n && F.isFunction(n) && (n = n(e)), n || n !== !1 && Th(e.url))) {\n const l = i && o && Eh.read(o);\n l && r.set(i, l);\n }\n return e;\n}, Ch = typeof XMLHttpRequest < \"u\", Ph = Ch && function(s) {\n return new Promise(function(t, n) {\n const i = da(s);\n let o = i.data;\n const r = Fe.from(i.headers).normalize();\n let { responseType: a, onUploadProgress: l, onDownloadProgress: h } = i, c, u, d, p, f;\n function m() {\n p && p(), f && f(), i.cancelToken && i.cancelToken.unsubscribe(c), i.signal && i.signal.removeEventListener(\"abort\", c);\n }\n let g = new XMLHttpRequest();\n g.open(i.method.toUpperCase(), i.url, !0), g.timeout = i.timeout;\n function y() {\n if (!g)\n return;\n const _ = Fe.from(\n \"getAllResponseHeaders\" in g && g.getAllResponseHeaders()\n ), b = {\n data: !a || a === \"text\" || a === \"json\" ? g.responseText : g.response,\n status: g.status,\n statusText: g.statusText,\n headers: _,\n config: s,\n request: g\n };\n ua(function(M) {\n t(M), m();\n }, function(M) {\n n(M), m();\n }, b), g = null;\n }\n \"onloadend\" in g ? g.onloadend = y : g.onreadystatechange = function() {\n !g || g.readyState !== 4 || g.status === 0 && !(g.responseURL && g.responseURL.indexOf(\"file:\") === 0) || setTimeout(y);\n }, g.onabort = function() {\n g && (n(new re(\"Request aborted\", re.ECONNABORTED, s, g)), g = null);\n }, g.onerror = function(x) {\n const b = x && x.message ? x.message : \"Network Error\", A = new re(b, re.ERR_NETWORK, s, g);\n A.event = x || null, n(A), g = null;\n }, g.ontimeout = function() {\n let x = i.timeout ? \"timeout of \" + i.timeout + \"ms exceeded\" : \"timeout exceeded\";\n const b = i.transitional || la;\n i.timeoutErrorMessage && (x = i.timeoutErrorMessage), n(new re(\n x,\n b.clarifyTimeoutError ? re.ETIMEDOUT : re.ECONNABORTED,\n s,\n g\n )), g = null;\n }, o === void 0 && r.setContentType(null), \"setRequestHeader\" in g && F.forEach(r.toJSON(), function(x, b) {\n g.setRequestHeader(b, x);\n }), F.isUndefined(i.withCredentials) || (g.withCredentials = !!i.withCredentials), a && a !== \"json\" && (g.responseType = i.responseType), h && ([d, f] = Ii(h, !0), g.addEventListener(\"progress\", d)), l && g.upload && ([u, p] = Ii(l), g.upload.addEventListener(\"progress\", u), g.upload.addEventListener(\"loadend\", p)), (i.cancelToken || i.signal) && (c = (_) => {\n g && (n(!_ || _.type ? new bn(null, s, g) : _), g.abort(), g = null);\n }, i.cancelToken && i.cancelToken.subscribe(c), i.signal && (i.signal.aborted ? c() : i.signal.addEventListener(\"abort\", c)));\n const w = bh(i.url);\n if (w && Re.protocols.indexOf(w) === -1) {\n n(new re(\"Unsupported protocol \" + w + \":\", re.ERR_BAD_REQUEST, s));\n return;\n }\n g.send(o || null);\n });\n}, kh = (s, e) => {\n const { length: t } = s = s ? s.filter(Boolean) : [];\n if (e || t) {\n let n = new AbortController(), i;\n const o = function(h) {\n if (!i) {\n i = !0, a();\n const c = h instanceof Error ? h : this.reason;\n n.abort(c instanceof re ? c : new bn(c instanceof Error ? c.message : c));\n }\n };\n let r = e && setTimeout(() => {\n r = null, o(new re(`timeout ${e} of ms exceeded`, re.ETIMEDOUT));\n }, e);\n const a = () => {\n s && (r && clearTimeout(r), r = null, s.forEach((h) => {\n h.unsubscribe ? h.unsubscribe(o) : h.removeEventListener(\"abort\", o);\n }), s = null);\n };\n s.forEach((h) => h.addEventListener(\"abort\", o));\n const { signal: l } = n;\n return l.unsubscribe = () => F.asap(a), l;\n }\n}, Rh = function* (s, e) {\n let t = s.byteLength;\n if (t < e) {\n yield s;\n return;\n }\n let n = 0, i;\n for (; n < t; )\n i = n + e, yield s.slice(n, i), n = i;\n}, Dh = async function* (s, e) {\n for await (const t of Lh(s))\n yield* Rh(t, e);\n}, Lh = async function* (s) {\n if (s[Symbol.asyncIterator]) {\n yield* s;\n return;\n }\n const e = s.getReader();\n try {\n for (; ; ) {\n const { done: t, value: n } = await e.read();\n if (t)\n break;\n yield n;\n }\n } finally {\n await e.cancel();\n }\n}, Lr = (s, e, t, n) => {\n const i = Dh(s, e);\n let o = 0, r, a = (l) => {\n r || (r = !0, n && n(l));\n };\n return new ReadableStream({\n async pull(l) {\n try {\n const { done: h, value: c } = await i.next();\n if (h) {\n a(), l.close();\n return;\n }\n let u = c.byteLength;\n if (t) {\n let d = o += u;\n t(d);\n }\n l.enqueue(new Uint8Array(c));\n } catch (h) {\n throw a(h), h;\n }\n },\n cancel(l) {\n return a(l), i.return();\n }\n }, {\n highWaterMark: 2\n });\n}, Br = 64 * 1024, { isFunction: Jn } = F, Bh = (({ Request: s, Response: e }) => ({\n Request: s,\n Response: e\n}))(F.global), {\n ReadableStream: Ir,\n TextEncoder: zr\n} = F.global, Nr = (s, ...e) => {\n try {\n return !!s(...e);\n } catch {\n return !1;\n }\n}, Ih = (s) => {\n s = F.merge.call({\n skipUndefined: !0\n }, Bh, s);\n const { fetch: e, Request: t, Response: n } = s, i = e ? Jn(e) : typeof fetch == \"function\", o = Jn(t), r = Jn(n);\n if (!i)\n return !1;\n const a = i && Jn(Ir), l = i && (typeof zr == \"function\" ? /* @__PURE__ */ ((f) => (m) => f.encode(m))(new zr()) : async (f) => new Uint8Array(await new t(f).arrayBuffer())), h = o && a && Nr(() => {\n let f = !1;\n const m = new t(Re.origin, {\n body: new Ir(),\n method: \"POST\",\n get duplex() {\n return f = !0, \"half\";\n }\n }).headers.has(\"Content-Type\");\n return f && !m;\n }), c = r && a && Nr(() => F.isReadableStream(new n(\"\").body)), u = {\n stream: c && ((f) => f.body)\n };\n i && [\"text\", \"arrayBuffer\", \"blob\", \"formData\", \"stream\"].forEach((f) => {\n !u[f] && (u[f] = (m, g) => {\n let y = m && m[f];\n if (y)\n return y.call(m);\n throw new re(`Response type '${f}' is not supported`, re.ERR_NOT_SUPPORT, g);\n });\n });\n const d = async (f) => {\n if (f == null)\n return 0;\n if (F.isBlob(f))\n return f.size;\n if (F.isSpecCompliantForm(f))\n return (await new t(Re.origin, {\n method: \"POST\",\n body: f\n }).arrayBuffer()).byteLength;\n if (F.isArrayBufferView(f) || F.isArrayBuffer(f))\n return f.byteLength;\n if (F.isURLSearchParams(f) && (f = f + \"\"), F.isString(f))\n return (await l(f)).byteLength;\n }, p = async (f, m) => {\n const g = F.toFiniteNumber(f.getContentLength());\n return g ?? d(m);\n };\n return async (f) => {\n let {\n url: m,\n method: g,\n data: y,\n signal: w,\n cancelToken: _,\n timeout: x,\n onDownloadProgress: b,\n onUploadProgress: A,\n responseType: M,\n headers: C,\n withCredentials: P = \"same-origin\",\n fetchOptions: k\n } = da(f), B = e || fetch;\n M = M ? (M + \"\").toLowerCase() : \"text\";\n let T = kh([w, _ && _.toAbortSignal()], x), D = null;\n const v = T && T.unsubscribe && (() => {\n T.unsubscribe();\n });\n let I;\n try {\n if (A && h && g !== \"get\" && g !== \"head\" && (I = await p(C, y)) !== 0) {\n let O = new t(m, {\n method: \"POST\",\n body: y,\n duplex: \"half\"\n }), N;\n if (F.isFormData(y) && (N = O.headers.get(\"content-type\")) && C.setContentType(N), O.body) {\n const [te, J] = kr(\n I,\n Ii(Rr(A))\n );\n y = Lr(O.body, Br, te, J);\n }\n }\n F.isString(P) || (P = P ? \"include\" : \"omit\");\n const q = o && \"credentials\" in t.prototype, H = {\n ...k,\n signal: T,\n method: g.toUpperCase(),\n headers: C.normalize().toJSON(),\n body: y,\n duplex: \"half\",\n credentials: q ? P : void 0\n };\n D = o && new t(m, H);\n let ee = await (o ? B(D, k) : B(m, H));\n const j = c && (M === \"stream\" || M === \"response\");\n if (c && (b || j && v)) {\n const O = {};\n [\"status\", \"statusText\", \"headers\"].forEach((K) => {\n O[K] = ee[K];\n });\n const N = F.toFiniteNumber(ee.headers.get(\"content-length\")), [te, J] = b && kr(\n N,\n Ii(Rr(b), !0)\n ) || [];\n ee = new n(\n Lr(ee.body, Br, te, () => {\n J && J(), v && v();\n }),\n O\n );\n }\n M = M || \"text\";\n let ne = await u[F.findKey(u, M) || \"text\"](ee, f);\n return !j && v && v(), await new Promise((O, N) => {\n ua(O, N, {\n data: ne,\n headers: Fe.from(ee.headers),\n status: ee.status,\n statusText: ee.statusText,\n config: f,\n request: D\n });\n });\n } catch (q) {\n throw v && v(), q && q.name === \"TypeError\" && /Load failed|fetch/i.test(q.message) ? Object.assign(\n new re(\"Network Error\", re.ERR_NETWORK, f, D),\n {\n cause: q.cause || q\n }\n ) : re.from(q, q && q.code, f, D);\n }\n };\n}, zh = /* @__PURE__ */ new Map(), pa = (s) => {\n let e = s && s.env || {};\n const { fetch: t, Request: n, Response: i } = e, o = [\n n,\n i,\n t\n ];\n let r = o.length, a = r, l, h, c = zh;\n for (; a--; )\n l = o[a], h = c.get(l), h === void 0 && c.set(l, h = a ? /* @__PURE__ */ new Map() : Ih(e)), c = h;\n return h;\n};\npa();\nconst rr = {\n http: Qc,\n xhr: Ph,\n fetch: {\n get: pa\n }\n};\nF.forEach(rr, (s, e) => {\n if (s) {\n try {\n Object.defineProperty(s, \"name\", { value: e });\n } catch {\n }\n Object.defineProperty(s, \"adapterName\", { value: e });\n }\n});\nconst Or = (s) => `- ${s}`, Nh = (s) => F.isFunction(s) || s === null || s === !1;\nfunction Oh(s, e) {\n s = F.isArray(s) ? s : [s];\n const { length: t } = s;\n let n, i;\n const o = {};\n for (let r = 0; r < t; r++) {\n n = s[r];\n let a;\n if (i = n, !Nh(n) && (i = rr[(a = String(n)).toLowerCase()], i === void 0))\n throw new re(`Unknown adapter '${a}'`);\n if (i && (F.isFunction(i) || (i = i.get(e))))\n break;\n o[a || \"#\" + r] = i;\n }\n if (!i) {\n const r = Object.entries(o).map(\n ([l, h]) => `adapter ${l} ` + (h === !1 ? \"is not supported by the environment\" : \"is not available in the build\")\n );\n let a = t ? r.length > 1 ? `since :\n` + r.map(Or).join(`\n`) : \" \" + Or(r[0]) : \"as no adapter specified\";\n throw new re(\n \"There is no suitable adapter to dispatch the request \" + a,\n \"ERR_NOT_SUPPORT\"\n );\n }\n return i;\n}\nconst ma = {\n /**\n * Resolve an adapter from a list of adapter names or functions.\n * @type {Function}\n */\n getAdapter: Oh,\n /**\n * Exposes all known adapters\n * @type {Object}\n */\n adapters: rr\n};\nfunction ns(s) {\n if (s.cancelToken && s.cancelToken.throwIfRequested(), s.signal && s.signal.aborted)\n throw new bn(null, s);\n}\nfunction Ur(s) {\n return ns(s), s.headers = Fe.from(s.headers), s.data = ts.call(\n s,\n s.transformRequest\n ), [\"post\", \"put\", \"patch\"].indexOf(s.method) !== -1 && s.headers.setContentType(\"application/x-www-form-urlencoded\", !1), ma.getAdapter(s.adapter || Vn.adapter, s)(s).then(function(n) {\n return ns(s), n.data = ts.call(\n s,\n s.transformResponse,\n n\n ), n.headers = Fe.from(n.headers), n;\n }, function(n) {\n return ha(n) || (ns(s), n && n.response && (n.response.data = ts.call(\n s,\n s.transformResponse,\n n.response\n ), n.response.headers = Fe.from(n.response.headers))), Promise.reject(n);\n });\n}\nconst ga = \"1.13.2\", qi = {};\n[\"object\", \"boolean\", \"number\", \"function\", \"string\", \"symbol\"].forEach((s, e) => {\n qi[s] = function(n) {\n return typeof n === s || \"a\" + (e < 1 ? \"n \" : \" \") + s;\n };\n});\nconst Fr = {};\nqi.transitional = function(e, t, n) {\n function i(o, r) {\n return \"[Axios v\" + ga + \"] Transitional option '\" + o + \"'\" + r + (n ? \". \" + n : \"\");\n }\n return (o, r, a) => {\n if (e === !1)\n throw new re(\n i(r, \" has been removed\" + (t ? \" in \" + t : \"\")),\n re.ERR_DEPRECATED\n );\n return t && !Fr[r] && (Fr[r] = !0, console.warn(\n i(\n r,\n \" has been deprecated since v\" + t + \" and will be removed in the near future\"\n )\n )), e ? e(o, r, a) : !0;\n };\n};\nqi.spelling = function(e) {\n return (t, n) => (console.warn(`${n} is likely a misspelling of ${e}`), !0);\n};\nfunction Uh(s, e, t) {\n if (typeof s != \"object\")\n throw new re(\"options must be an object\", re.ERR_BAD_OPTION_VALUE);\n const n = Object.keys(s);\n let i = n.length;\n for (; i-- > 0; ) {\n const o = n[i], r = e[o];\n if (r) {\n const a = s[o], l = a === void 0 || r(a, o, s);\n if (l !== !0)\n throw new re(\"option \" + o + \" must be \" + l, re.ERR_BAD_OPTION_VALUE);\n continue;\n }\n if (t !== !0)\n throw new re(\"Unknown option \" + o, re.ERR_BAD_OPTION);\n }\n}\nconst Ei = {\n assertOptions: Uh,\n validators: qi\n}, st = Ei.validators;\nlet qt = class {\n constructor(e) {\n this.defaults = e || {}, this.interceptors = {\n request: new Cr(),\n response: new Cr()\n };\n }\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(e, t) {\n try {\n return await this._request(e, t);\n } catch (n) {\n if (n instanceof Error) {\n let i = {};\n Error.captureStackTrace ? Error.captureStackTrace(i) : i = new Error();\n const o = i.stack ? i.stack.replace(/^.+\\n/, \"\") : \"\";\n try {\n n.stack ? o && !String(n.stack).endsWith(o.replace(/^.+\\n.+\\n/, \"\")) && (n.stack += `\n` + o) : n.stack = o;\n } catch {\n }\n }\n throw n;\n }\n }\n _request(e, t) {\n typeof e == \"string\" ? (t = t || {}, t.url = e) : t = e || {}, t = Yt(this.defaults, t);\n const { transitional: n, paramsSerializer: i, headers: o } = t;\n n !== void 0 && Ei.assertOptions(n, {\n silentJSONParsing: st.transitional(st.boolean),\n forcedJSONParsing: st.transitional(st.boolean),\n clarifyTimeoutError: st.transitional(st.boolean)\n }, !1), i != null && (F.isFunction(i) ? t.paramsSerializer = {\n serialize: i\n } : Ei.assertOptions(i, {\n encode: st.function,\n serialize: st.function\n }, !0)), t.allowAbsoluteUrls !== void 0 || (this.defaults.allowAbsoluteUrls !== void 0 ? t.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls : t.allowAbsoluteUrls = !0), Ei.assertOptions(t, {\n baseUrl: st.spelling(\"baseURL\"),\n withXsrfToken: st.spelling(\"withXSRFToken\")\n }, !0), t.method = (t.method || this.defaults.method || \"get\").toLowerCase();\n let r = o && F.merge(\n o.common,\n o[t.method]\n );\n o && F.forEach(\n [\"delete\", \"get\", \"head\", \"post\", \"put\", \"patch\", \"common\"],\n (f) => {\n delete o[f];\n }\n ), t.headers = Fe.concat(r, o);\n const a = [];\n let l = !0;\n this.interceptors.request.forEach(function(m) {\n typeof m.runWhen == \"function\" && m.runWhen(t) === !1 || (l = l && m.synchronous, a.unshift(m.fulfilled, m.rejected));\n });\n const h = [];\n this.interceptors.response.forEach(function(m) {\n h.push(m.fulfilled, m.rejected);\n });\n let c, u = 0, d;\n if (!l) {\n const f = [Ur.bind(this), void 0];\n for (f.unshift(...a), f.push(...h), d = f.length, c = Promise.resolve(t); u < d; )\n c = c.then(f[u++], f[u++]);\n return c;\n }\n d = a.length;\n let p = t;\n for (; u < d; ) {\n const f = a[u++], m = a[u++];\n try {\n p = f(p);\n } catch (g) {\n m.call(this, g);\n break;\n }\n }\n try {\n c = Ur.call(this, p);\n } catch (f) {\n return Promise.reject(f);\n }\n for (u = 0, d = h.length; u < d; )\n c = c.then(h[u++], h[u++]);\n return c;\n }\n getUri(e) {\n e = Yt(this.defaults, e);\n const t = fa(e.baseURL, e.url, e.allowAbsoluteUrls);\n return aa(t, e.params, e.paramsSerializer);\n }\n};\nF.forEach([\"delete\", \"get\", \"head\", \"options\"], function(e) {\n qt.prototype[e] = function(t, n) {\n return this.request(Yt(n || {}, {\n method: e,\n url: t,\n data: (n || {}).data\n }));\n };\n});\nF.forEach([\"post\", \"put\", \"patch\"], function(e) {\n function t(n) {\n return function(o, r, a) {\n return this.request(Yt(a || {}, {\n method: e,\n headers: n ? {\n \"Content-Type\": \"multipart/form-data\"\n } : {},\n url: o,\n data: r\n }));\n };\n }\n qt.prototype[e] = t(), qt.prototype[e + \"Form\"] = t(!0);\n});\nlet Fh = class ya {\n constructor(e) {\n if (typeof e != \"function\")\n throw new TypeError(\"executor must be a function.\");\n let t;\n this.promise = new Promise(function(o) {\n t = o;\n });\n const n = this;\n this.promise.then((i) => {\n if (!n._listeners) return;\n let o = n._listeners.length;\n for (; o-- > 0; )\n n._listeners[o](i);\n n._listeners = null;\n }), this.promise.then = (i) => {\n let o;\n const r = new Promise((a) => {\n n.subscribe(a), o = a;\n }).then(i);\n return r.cancel = function() {\n n.unsubscribe(o);\n }, r;\n }, e(function(o, r, a) {\n n.reason || (n.reason = new bn(o, r, a), t(n.reason));\n });\n }\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason)\n throw this.reason;\n }\n /**\n * Subscribe to the cancel signal\n */\n subscribe(e) {\n if (this.reason) {\n e(this.reason);\n return;\n }\n this._listeners ? this._listeners.push(e) : this._listeners = [e];\n }\n /**\n * Unsubscribe from the cancel signal\n */\n unsubscribe(e) {\n if (!this._listeners)\n return;\n const t = this._listeners.indexOf(e);\n t !== -1 && this._listeners.splice(t, 1);\n }\n toAbortSignal() {\n const e = new AbortController(), t = (n) => {\n e.abort(n);\n };\n return this.subscribe(t), e.signal.unsubscribe = () => this.unsubscribe(t), e.signal;\n }\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let e;\n return {\n token: new ya(function(i) {\n e = i;\n }),\n cancel: e\n };\n }\n};\nfunction Vh(s) {\n return function(t) {\n return s.apply(null, t);\n };\n}\nfunction jh(s) {\n return F.isObject(s) && s.isAxiosError === !0;\n}\nconst Ns = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n WebServerIsDown: 521,\n ConnectionTimedOut: 522,\n OriginIsUnreachable: 523,\n TimeoutOccurred: 524,\n SslHandshakeFailed: 525,\n InvalidSslCertificate: 526\n};\nObject.entries(Ns).forEach(([s, e]) => {\n Ns[e] = s;\n});\nfunction wa(s) {\n const e = new qt(s), t = Zo(qt.prototype.request, e);\n return F.extend(t, qt.prototype, e, { allOwnKeys: !0 }), F.extend(t, e, null, { allOwnKeys: !0 }), t.create = function(i) {\n return wa(Yt(s, i));\n }, t;\n}\nconst _e = wa(Vn);\n_e.Axios = qt;\n_e.CanceledError = bn;\n_e.CancelToken = Fh;\n_e.isCancel = ha;\n_e.VERSION = ga;\n_e.toFormData = Xi;\n_e.AxiosError = re;\n_e.Cancel = _e.CanceledError;\n_e.all = function(e) {\n return Promise.all(e);\n};\n_e.spread = Vh;\n_e.isAxiosError = jh;\n_e.mergeConfig = Yt;\n_e.AxiosHeaders = Fe;\n_e.formToJSON = (s) => ca(F.isHTMLForm(s) ? new FormData(s) : s);\n_e.getAdapter = ma.getAdapter;\n_e.HttpStatusCode = Ns;\n_e.default = _e;\nconst {\n Axios: pp,\n AxiosError: mp,\n CanceledError: gp,\n isCancel: yp,\n CancelToken: wp,\n VERSION: _p,\n all: xp,\n Cancel: bp,\n isAxiosError: vp,\n spread: Sp,\n toFormData: Tp,\n AxiosHeaders: Ep,\n HttpStatusCode: Mp,\n formToJSON: Ap,\n getAdapter: Cp,\n mergeConfig: Pp\n} = _e;\nfunction Hh(s, e) {\n var t;\n if (window.XMLHttpRequest ? t = new XMLHttpRequest() : window.ActiveXObject ? t = new window.ActiveXObject() : alert(\"请升级至最新版本的浏览器\"), t != null) {\n let n = s;\n t.open(\"GET\", n, !0), t.send(null), t.onreadystatechange = function() {\n t.readyState == 4 && t.status == 200 && (t.responseText.includes(\"\", 0) && t.responseText.includes(\"\", 0) && t.responseText.includes(\"\", 0) ? e(null) : e(t.responseText));\n }, t.onloadend = function() {\n t.readyState == 4 && t.status == 404 && t.status == 502 && e(null);\n };\n }\n}\nfunction Gh(s, e) {\n _e({\n method: \"get\",\n responseType: \"blob\",\n url: s\n }).then((t) => {\n let n = new window.File([t.data], \"zipFolder\", {\n type: \"zip\"\n });\n Ko.loadAsync(n).then((i) => {\n const o = /* @__PURE__ */ new Map(), r = [];\n for (let a in i.files) {\n if (i.files[a].dir)\n continue;\n const l = i.file(i.files[a].name);\n if (l) {\n const h = l.async(\"blob\").then((c) => {\n const u = URL.createObjectURL(c);\n o.set(\"/\" + i.files[a].name.replace(\"\\\\\", \"/\"), u);\n });\n r.push(h);\n }\n }\n Promise.all(r).then(() => {\n e(o);\n }).catch((a) => {\n console.error(\"解压zip文件失败:\", a), e(/* @__PURE__ */ new Map());\n });\n }).catch((i) => {\n console.error(\"加载zip文件失败:\", i), e(/* @__PURE__ */ new Map());\n });\n }).catch((t) => {\n console.error(\"下载zip文件失败:\", t), e(/* @__PURE__ */ new Map());\n });\n}\nfunction _a(s, e) {\n _e({\n method: \"get\",\n responseType: \"blob\",\n url: s\n }).then((n) => {\n let i = new window.File([n.data], \"semantics\", {\n type: \"zip\"\n });\n Ko.loadAsync(i).then((o) => {\n for (let r in o.files)\n o.file(o.files[r].name).async(\"blob\").then((l) => {\n t(l, \"utf-8\", function(h, c) {\n e(c);\n });\n });\n });\n });\n function t(n, i, o) {\n var r = new FileReader(), a = new Blob([n]);\n r.onload = function(l) {\n o(null, l.target.result);\n }, r.onerror = function(l) {\n o(l.error, null);\n }, r.readAsText(a, i);\n }\n}\nconst is = /* @__PURE__ */ new WeakMap();\nclass Wh extends zo {\n /**\n * Constructs a new Draco loader.\n *\n * @param {LoadingManager} [manager] - The loading manager.\n */\n constructor(e) {\n super(e), this.decoderPath = \"\", this.decoderConfig = {}, this.decoderBinary = null, this.decoderPending = null, this.workerLimit = 4, this.workerPool = [], this.workerNextTaskID = 1, this.workerSourceURL = \"\", this.defaultAttributeIDs = {\n position: \"POSITION\",\n normal: \"NORMAL\",\n color: \"COLOR\",\n uv: \"TEX_COORD\"\n }, this.defaultAttributeTypes = {\n position: \"Float32Array\",\n normal: \"Float32Array\",\n color: \"Float32Array\",\n uv: \"Float32Array\"\n };\n }\n /**\n * Provides configuration for the decoder libraries. Configuration cannot be changed after decoding begins.\n *\n * @param {string} path - The decoder path.\n * @return {DRACOLoader} A reference to this loader.\n */\n setDecoderPath(e) {\n return this.decoderPath = e, this;\n }\n /**\n * Provides configuration for the decoder libraries. Configuration cannot be changed after decoding begins.\n *\n * @param {{type:('js'|'wasm')}} config - The decoder config.\n * @return {DRACOLoader} A reference to this loader.\n */\n setDecoderConfig(e) {\n return this.decoderConfig = e, this;\n }\n /**\n * Sets the maximum number of Web Workers to be used during decoding.\n * A lower limit may be preferable if workers are also for other tasks in the application.\n *\n * @param {number} workerLimit - The worker limit.\n * @return {DRACOLoader} A reference to this loader.\n */\n setWorkerLimit(e) {\n return this.workerLimit = e, this;\n }\n /**\n * Starts loading from the given URL and passes the loaded Draco asset\n * to the `onLoad()` callback.\n *\n * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n * @param {onErrorCallback} onError - Executed when errors occur.\n */\n load(e, t, n, i) {\n const o = new Bi(this.manager);\n o.setPath(this.path), o.setResponseType(\"arraybuffer\"), o.setRequestHeader(this.requestHeader), o.setWithCredentials(this.withCredentials), o.load(e, (r) => {\n this.parse(r, t, i);\n }, n, i);\n }\n /**\n * Parses the given Draco data.\n *\n * @param {ArrayBuffer} buffer - The raw Draco data as an array buffer.\n * @param {function(BufferGeometry)} onLoad - Executed when the loading/parsing process has been finished.\n * @param {onErrorCallback} onError - Executed when errors occur.\n */\n parse(e, t, n = () => {\n }) {\n this.decodeDracoFile(e, t, null, null, Rt, n).catch(n);\n }\n //\n decodeDracoFile(e, t, n, i, o = lt, r = () => {\n }) {\n const a = {\n attributeIDs: n || this.defaultAttributeIDs,\n attributeTypes: i || this.defaultAttributeTypes,\n useUniqueIDs: !!n,\n vertexColorSpace: o\n };\n return this.decodeGeometry(e, a).then(t).catch(r);\n }\n decodeGeometry(e, t) {\n const n = JSON.stringify(t);\n if (is.has(e)) {\n const l = is.get(e);\n if (l.key === n)\n return l.promise;\n if (e.byteLength === 0)\n throw new Error(\n \"THREE.DRACOLoader: Unable to re-decode a buffer with different settings. Buffer has already been transferred.\"\n );\n }\n let i;\n const o = this.workerNextTaskID++, r = e.byteLength, a = this._getWorker(o, r).then((l) => (i = l, new Promise((h, c) => {\n i._callbacks[o] = { resolve: h, reject: c }, i.postMessage({ type: \"decode\", id: o, taskConfig: t, buffer: e }, [e]);\n }))).then((l) => this._createGeometry(l.geometry));\n return a.catch(() => !0).then(() => {\n i && o && this._releaseTask(i, o);\n }), is.set(e, {\n key: n,\n promise: a\n }), a;\n }\n _createGeometry(e) {\n const t = new Fi();\n e.index && t.setIndex(new at(e.index.array, 1));\n for (let n = 0; n < e.attributes.length; n++) {\n const { name: i, array: o, itemSize: r, stride: a, vertexColorSpace: l } = e.attributes[n];\n let h;\n if (r === a)\n h = new at(o, r);\n else {\n const c = new No(o, a);\n h = new Oo(c, r, 0);\n }\n i === \"color\" && (this._assignVertexColorSpace(h, l), h.normalized = !(o instanceof Float32Array)), t.setAttribute(i, h);\n }\n return t;\n }\n _assignVertexColorSpace(e, t) {\n if (t !== Rt) return;\n const n = new je();\n for (let i = 0, o = e.count; i < o; i++)\n n.fromBufferAttribute(e, i), Li.colorSpaceToWorking(n, Rt), e.setXYZ(i, n.r, n.g, n.b);\n }\n _loadLibrary(e, t) {\n const n = new Bi(this.manager);\n return n.setPath(this.decoderPath), n.setResponseType(t), n.setWithCredentials(this.withCredentials), new Promise((i, o) => {\n n.load(e, i, void 0, o);\n });\n }\n preload() {\n return this._initDecoder(), this;\n }\n _initDecoder() {\n if (this.decoderPending) return this.decoderPending;\n const e = typeof WebAssembly != \"object\" || this.decoderConfig.type === \"js\", t = [];\n return e ? t.push(this._loadLibrary(\"draco_decoder.js\", \"text\")) : (t.push(this._loadLibrary(\"draco_wasm_wrapper.js\", \"text\")), t.push(this._loadLibrary(\"draco_decoder.wasm\", \"arraybuffer\"))), this.decoderPending = Promise.all(t).then((n) => {\n const i = n[0];\n e || (this.decoderConfig.wasmBinary = n[1]);\n const o = Xh.toString(), r = [\n \"/* draco decoder */\",\n i,\n \"\",\n \"/* worker */\",\n o.substring(o.indexOf(\"{\") + 1, o.lastIndexOf(\"}\"))\n ].join(`\n`);\n this.workerSourceURL = URL.createObjectURL(new Blob([r]));\n }), this.decoderPending;\n }\n _getWorker(e, t) {\n return this._initDecoder().then(() => {\n if (this.workerPool.length < this.workerLimit) {\n const i = new Worker(this.workerSourceURL);\n i._callbacks = {}, i._taskCosts = {}, i._taskLoad = 0, i.postMessage({ type: \"init\", decoderConfig: this.decoderConfig }), i.onmessage = function(o) {\n const r = o.data;\n switch (r.type) {\n case \"decode\":\n i._callbacks[r.id].resolve(r);\n break;\n case \"error\":\n i._callbacks[r.id].reject(r);\n break;\n default:\n console.error('THREE.DRACOLoader: Unexpected message, \"' + r.type + '\"');\n }\n }, this.workerPool.push(i);\n } else\n this.workerPool.sort(function(i, o) {\n return i._taskLoad > o._taskLoad ? -1 : 1;\n });\n const n = this.workerPool[this.workerPool.length - 1];\n return n._taskCosts[e] = t, n._taskLoad += t, n;\n });\n }\n _releaseTask(e, t) {\n e._taskLoad -= e._taskCosts[t], delete e._callbacks[t], delete e._taskCosts[t];\n }\n debug() {\n console.log(\"Task load: \", this.workerPool.map((e) => e._taskLoad));\n }\n dispose() {\n for (let e = 0; e < this.workerPool.length; ++e)\n this.workerPool[e].terminate();\n return this.workerPool.length = 0, this.workerSourceURL !== \"\" && URL.revokeObjectURL(this.workerSourceURL), this;\n }\n}\nfunction Xh() {\n let s, e;\n onmessage = function(r) {\n const a = r.data;\n switch (a.type) {\n case \"init\":\n s = a.decoderConfig, e = new Promise(function(c) {\n s.onModuleLoaded = function(u) {\n c({ draco: u });\n }, DracoDecoderModule(s);\n });\n break;\n case \"decode\":\n const l = a.buffer, h = a.taskConfig;\n e.then((c) => {\n const u = c.draco, d = new u.Decoder();\n try {\n const p = t(u, d, new Int8Array(l), h), f = p.attributes.map((m) => m.array.buffer);\n p.index && f.push(p.index.array.buffer), self.postMessage({ type: \"decode\", id: a.id, geometry: p }, f);\n } catch (p) {\n console.error(p), self.postMessage({ type: \"error\", id: a.id, error: p.message });\n } finally {\n u.destroy(d);\n }\n });\n break;\n }\n };\n function t(r, a, l, h) {\n const c = h.attributeIDs, u = h.attributeTypes;\n let d, p;\n const f = a.GetEncodedGeometryType(l);\n if (f === r.TRIANGULAR_MESH)\n d = new r.Mesh(), p = a.DecodeArrayToMesh(l, l.byteLength, d);\n else if (f === r.POINT_CLOUD)\n d = new r.PointCloud(), p = a.DecodeArrayToPointCloud(l, l.byteLength, d);\n else\n throw new Error(\"THREE.DRACOLoader: Unexpected geometry type.\");\n if (!p.ok() || d.ptr === 0)\n throw new Error(\"THREE.DRACOLoader: Decoding failed: \" + p.error_msg());\n const m = { index: null, attributes: [] };\n for (const g in c) {\n const y = self[u[g]];\n let w, _;\n if (h.useUniqueIDs)\n _ = c[g], w = a.GetAttributeByUniqueId(d, _);\n else {\n if (_ = a.GetAttributeId(d, r[c[g]]), _ === -1) continue;\n w = a.GetAttribute(d, _);\n }\n const x = i(r, a, d, g, y, w);\n g === \"color\" && (x.vertexColorSpace = h.vertexColorSpace), m.attributes.push(x);\n }\n return f === r.TRIANGULAR_MESH && (m.index = n(r, a, d)), r.destroy(d), m;\n }\n function n(r, a, l) {\n const c = l.num_faces() * 3, u = c * 4, d = r._malloc(u);\n a.GetTrianglesUInt32Array(l, u, d);\n const p = new Uint32Array(r.HEAPF32.buffer, d, c).slice();\n return r._free(d), { array: p, itemSize: 1 };\n }\n function i(r, a, l, h, c, u) {\n const d = l.num_points(), p = u.num_components(), f = o(r, c), m = p * c.BYTES_PER_ELEMENT, g = Math.ceil(m / 4) * 4, y = g / c.BYTES_PER_ELEMENT, w = d * m, _ = d * g, x = r._malloc(w);\n a.GetAttributeDataArrayForAllPoints(l, u, f, w, x);\n const b = new c(r.HEAPF32.buffer, x, w / c.BYTES_PER_ELEMENT);\n let A;\n if (m === g)\n A = b.slice();\n else {\n A = new c(_ / c.BYTES_PER_ELEMENT);\n let M = 0;\n for (let C = 0, P = b.length; C < P; C++) {\n for (let k = 0; k < p; k++)\n A[M + k] = b[C * p + k];\n M += y;\n }\n }\n return r._free(x), {\n name: h,\n count: d,\n itemSize: p,\n array: A,\n stride: y\n };\n }\n function o(r, a) {\n switch (a) {\n case Float32Array:\n return r.DT_FLOAT32;\n case Int8Array:\n return r.DT_INT8;\n case Int16Array:\n return r.DT_INT16;\n case Int32Array:\n return r.DT_INT32;\n case Uint8Array:\n return r.DT_UINT8;\n case Uint16Array:\n return r.DT_UINT16;\n case Uint32Array:\n return r.DT_UINT32;\n }\n }\n}\nvar _n = /* @__PURE__ */ ((s) => (s.ModelLoadStart = \"model-load-start\", s.ModelLoadProgress = \"model-load-progress\", s.ModelLoaded = \"model-loaded\", s.ModelError = \"model-error\", s.SelectionChanged = \"selection-changed\", s.HoverChanged = \"hover-changed\", s.Click = \"click\", s.MouseMove = \"mouse-move\", s.CameraChanged = \"camera-changed\", s.CameraIdle = \"camera-idle\", s.ViewportResize = \"viewport-resize\", s.EngineFree = \"engine-free\", s.EngineBusy = \"engine-busy\", s))(_n || {});\nfunction qh(s, e, t, n) {\n let i = 0, o = 0, r = 0, a = s.models.find((p) => p.url == t), l = e.circularMeps, h = e.rectMeps.filter((p) => p.type === \"风管\"), c = e.rectMeps.filter((p) => p.type === \"桥架\"), u = e.ellipseMeps, d = s.scene;\n if (new E.MeshBasicMaterial(), new E.BufferGeometry(), Qn(d, \"InstancedMesh\"), l && l.length) {\n let p = [];\n for (let f of l)\n f.color = new E.Color(`rgb(${f.color})`), f.position = {\n x: f.startPoint.X * 0.3048 + i,\n y: f.startPoint.Z * 0.3048 + o,\n z: -f.startPoint.Y * 0.3048 + r\n }, f.rotation = {\n x: 0,\n y: 0,\n z: 0\n }, a.nodesMap.set(f.id, [f]), p.push(f);\n ei(\"Circle\", d, p, 2);\n }\n if (Qn(d, \"InstancedMesh\"), h && h.length) {\n let p = [];\n for (let f of h)\n f.color = new E.Color(`rgb(${f.color})`), f.position = {\n x: f.startPoint.X * 0.3048 + i,\n y: f.startPoint.Z * 0.3048 + o,\n z: -f.startPoint.Y * 0.3048 + r\n }, f.rotation = {\n x: 0,\n y: 0,\n z: 0\n }, a.nodesMap.set(f.id, [f]), p.push(f);\n ei(\"Rect\", d, p, 3);\n }\n if (Qn(d, \"InstancedMesh\"), u && u.length) {\n let p = [];\n for (let f of u)\n f.color = new E.Color(`rgb(${f.color})`), f.position = {\n x: f.startPoint.X * 0.3048 + i,\n y: f.startPoint.Z * 0.3048 + o,\n z: -f.startPoint.Y * 0.3048 + r\n }, f.rotation = {\n x: 0,\n y: 0,\n z: 0\n }, a.nodesMap.set(f.id, [f]), p.push(f);\n ei(\"Ellipse\", d, p, 4);\n }\n if (Qn(d, \"InstancedMesh\"), c && c.length) {\n let p = [];\n for (let f of c)\n f.color = new E.Color(`rgb(${f.color})`), f.position = {\n x: f.startPoint.X * 0.3048 + i,\n y: f.startPoint.Z * 0.3048 + o,\n z: -f.startPoint.Y * 0.3048 + r\n }, f.rotation = {\n x: 0,\n y: 0,\n z: 0\n }, a.nodesMap.set(f.id, [f]), p.push(f);\n ei(\"Bridge\", d, p, 5);\n }\n}\nfunction Qn(s, e) {\n let t = new E.InstancedMesh(e.geometry, e.material, 1);\n t.index = e.index, t.dataType = e.type, t.url = e.url, t.relativeIndex = e.relativeIndex, t.name = \"机电\", s.add(t);\n}\nfunction ei(s, e, t, n, i) {\n let o, r, a = {\n width: 1,\n height: 1,\n length: 1,\n diameter: 1,\n color: new E.Color(),\n position: {\n x: 0,\n y: 0,\n z: 0\n },\n rotation: {\n x: 0,\n y: 0,\n z: 0\n }\n };\n switch (s) {\n case \"Rect\":\n r = ti(\"Rect\", a);\n break;\n case \"Bridge\":\n r = ti(\"Bridge\", a);\n break;\n case \"Circle\":\n r = ti(\"Circle\", a);\n break;\n case \"Ellipse\":\n r = ti(\"Ellipse\", a);\n break;\n }\n r && (o = new E.InstancedMesh(r.geometry, r.material, t.length));\n let l = [];\n for (var h = 0; h < t.length; h++) {\n let d = t[h], p = new E.Vector3(d.startPoint.X, 0, -d.startPoint.Y), f = new E.Vector3(d.endPoint.X, 0, -d.endPoint.Y), m = new E.Vector3(d.startPoint.X, d.startPoint.Z, -d.startPoint.Y), g = new E.Vector3(d.endPoint.X, d.endPoint.Z, -d.endPoint.Y), y = 0, w = 0, _ = 0;\n if (Math.abs(f.clone().sub(p.clone()).z) < 0.01 && Math.abs(f.clone().sub(p.clone()).x) < 0.01) {\n if (y = (d.startPoint.Z > d.endPoint.Z ? 1 : -1) * Math.PI * 0.5, d.base_x != null) {\n var c = new E.Vector3(d.base_x.X, 0, -d.base_x.Y);\n w = (c.clone().cross(new E.Vector3(0, 0, 1)).y <= 0 ? 1 : -1) * c.angleTo(new E.Vector3(0, 0, 1)) + Math.PI * 0.5;\n }\n } else\n w = (f.clone().sub(p.clone()).cross(new E.Vector3(0, 0, 1)).y > 0 ? -1 : 1) * f.clone().sub(p.clone()).angleTo(new E.Vector3(0, 0, 1)), y = (d.startPoint.Z > d.endPoint.Z ? 1 : -1) * f.clone().sub(p.clone()).angleTo(g.clone().sub(m.clone()));\n let x = new E.Matrix4();\n const b = new E.Euler(y, w, _, \"YXZ\");\n let A = x.clone().makeRotationFromEuler(b), M, C;\n s === \"Circle\" ? (M = d.diameter, C = d.diameter) : (M = d.width, C = d.height);\n let P = x.clone().makeScale(M, C, d.length);\n x.multiplyMatrices(A, P), x.setPosition(d.position.x, d.position.y, d.position.z), o.setMatrixAt(h, x.clone()), o.setColorAt(h, d.color), o.geometry.computeBoundingBox();\n let k = o.geometry.boundingBox.min.clone().applyMatrix4(x.clone()), B = o.geometry.boundingBox.max.clone().applyMatrix4(x.clone()), T = new E.Vector3(Math.min(k.x, B.x), Math.min(k.y, B.y), Math.min(k.z, B.z)), D = new E.Vector3(Math.max(k.x, B.x), Math.max(k.y, B.y), Math.max(k.z, B.z)), v = T.clone().add(D.clone()).multiplyScalar(0.5), I = {\n name: d.name,\n min: T,\n max: D,\n center: v,\n dbid: h,\n // url: path + \"/\" + type,\n // basePath: url,\n // relativePath: relativePath,\n materialName: r.material.name\n }, q = null, H = null;\n s === \"Circle\" && (q = {\n x: d.startPoint.X * 0.3048,\n y: d.startPoint.Z * 0.3048,\n z: -d.startPoint.Y * 0.3048\n }, H = {\n x: d.endPoint.X * 0.3048,\n y: d.endPoint.Z * 0.3048,\n z: -d.endPoint.Y * 0.3048\n }, I.minC = q, I.maxC = H), l.push(I);\n }\n o.castShadow = !0, o.ElementInfos = l, o.name = \"rootModel\", o.TypeName = \"InstancedMesh-Pipe\", o.PipeType = s, o.MeshId = null, o.realMaterial = o.material.clone(), o.originalMaterial = o.material.clone();\n let u = [];\n u = {\n geometry: o.geometry,\n matrix: o.matrix,\n position: o.position,\n rotation: o.rotation\n }, o.meshs = u, o.instanceMatrix && o.instanceMatrix.array && (o.cloneInstanceMatrix = Array.from(o.instanceMatrix.array)), o.index = n, o.Version = \"V1\", e.children[n] = o;\n}\nfunction ti(s, e, t) {\n let n = new E.Shape();\n switch (e.width = e.width * 0.3048, e.height = e.height * 0.3048, e.diameter = e.diameter * 0.3048, s) {\n case \"Rect\":\n n.moveTo(-e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, e.height / 2), n.lineTo(e.width / 2, e.height / 2), n.lineTo(e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, -e.height / 2);\n break;\n case \"Ellipse\":\n n.moveTo(-e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, e.height / 2), n.lineTo(e.width / 2, e.height / 2), n.lineTo(e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, -e.height / 2);\n break;\n case \"Bridge\":\n n.moveTo(-e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, e.height / 2), n.lineTo(-e.width / 2 + 0.01, e.height / 2), n.lineTo(-e.width / 2 + 0.01, -e.height / 2 + 0.01), n.lineTo(e.width / 2 - 0.01, -e.height / 2 + 0.01), n.lineTo(e.width / 2 - 0.01, e.height / 2), n.lineTo(e.width / 2, e.height / 2), n.lineTo(e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, -e.height / 2);\n break;\n case \"Circle\":\n n.moveTo(0, 0), n.absarc(0, 0, e.diameter * 0.5, 0, Math.PI * 2, !1);\n break;\n }\n const i = {\n depth: e.length * 0.3048,\n //拉伸长度\n bevelEnabled: !1\n };\n return o(n, i, e.color, e.position, e.rotation);\n function o(r, a, l, h, c) {\n let u = new E.ExtrudeGeometry(r, a), d = new E.MeshPhongMaterial({\n color: l,\n side: E.DoubleSide\n // depthTest:false\n // name: path + \"/\" + type + \"/material\"\n }), p = new E.Mesh(u, d);\n return p.position.set(h.x, h.y, h.z), p.rotation._order = \"YXZ\", p.rotation.set(c.x, c.y, c.z), p;\n }\n}\nfunction Kh(s, e = !1) {\n const t = s[0].index !== null, n = new Set(Object.keys(s[0].attributes)), i = new Set(Object.keys(s[0].morphAttributes)), o = {}, r = {}, a = s[0].morphTargetsRelative, l = new Fi();\n let h = 0;\n for (let c = 0; c < s.length; ++c) {\n const u = s[c];\n let d = 0;\n if (t !== (u.index !== null))\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"), null;\n for (const p in u.attributes) {\n if (!n.has(p))\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + '. All geometries must have compatible attributes; make sure \"' + p + '\" attribute exists among all geometries, or in none of them.'), null;\n o[p] === void 0 && (o[p] = []), o[p].push(u.attributes[p]), d++;\n }\n if (d !== n.size)\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". Make sure all geometries have the same number of attributes.\"), null;\n if (a !== u.morphTargetsRelative)\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". .morphTargetsRelative must be consistent throughout all geometries.\"), null;\n for (const p in u.morphAttributes) {\n if (!i.has(p))\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". .morphAttributes must be consistent throughout all geometries.\"), null;\n r[p] === void 0 && (r[p] = []), r[p].push(u.morphAttributes[p]);\n }\n if (e) {\n let p;\n if (t)\n p = u.index.count;\n else if (u.attributes.position !== void 0)\n p = u.attributes.position.count;\n else\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". The geometry must have either an index or a position attribute\"), null;\n l.addGroup(h, p, c), h += p;\n }\n }\n if (t) {\n let c = 0;\n const u = [];\n for (let d = 0; d < s.length; ++d) {\n const p = s[d].index;\n for (let f = 0; f < p.count; ++f)\n u.push(p.getX(f) + c);\n c += s[d].attributes.position.count;\n }\n l.setIndex(u);\n }\n for (const c in o) {\n const u = Vr(o[c]);\n if (!u)\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the \" + c + \" attribute.\"), null;\n l.setAttribute(c, u);\n }\n for (const c in r) {\n const u = r[c][0].length;\n if (u === 0) break;\n l.morphAttributes = l.morphAttributes || {}, l.morphAttributes[c] = [];\n for (let d = 0; d < u; ++d) {\n const p = [];\n for (let m = 0; m < r[c].length; ++m)\n p.push(r[c][m][d]);\n const f = Vr(p);\n if (!f)\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the \" + c + \" morphAttribute.\"), null;\n l.morphAttributes[c].push(f);\n }\n }\n return l;\n}\nfunction Vr(s) {\n let e, t, n, i = -1, o = 0;\n for (let h = 0; h < s.length; ++h) {\n const c = s[h];\n if (e === void 0 && (e = c.array.constructor), e !== c.array.constructor)\n return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"), null;\n if (t === void 0 && (t = c.itemSize), t !== c.itemSize)\n return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"), null;\n if (n === void 0 && (n = c.normalized), n !== c.normalized)\n return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"), null;\n if (i === -1 && (i = c.gpuType), i !== c.gpuType)\n return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.\"), null;\n o += c.count * t;\n }\n const r = new e(o), a = new at(r, t, n);\n let l = 0;\n for (let h = 0; h < s.length; ++h) {\n const c = s[h];\n if (c.isInterleavedBufferAttribute) {\n const u = l / t;\n for (let d = 0, p = c.count; d < p; d++)\n for (let f = 0; f < t; f++) {\n const m = c.getComponent(d, f);\n a.setComponent(d + u, f, m);\n }\n } else\n r.set(c.array, l);\n l += c.count * t;\n }\n return i !== void 0 && (a.gpuType = i), a;\n}\nfunction jr(s, e) {\n if (e === nl)\n return console.warn(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.\"), s;\n if (e === Rs || e === Uo) {\n let t = s.getIndex();\n if (t === null) {\n const r = [], a = s.getAttribute(\"position\");\n if (a !== void 0) {\n for (let l = 0; l < a.count; l++)\n r.push(l);\n s.setIndex(r), t = s.getIndex();\n } else\n return console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\"), s;\n }\n const n = t.count - 2, i = [];\n if (e === Rs)\n for (let r = 1; r <= n; r++)\n i.push(t.getX(0)), i.push(t.getX(r)), i.push(t.getX(r + 1));\n else\n for (let r = 0; r < n; r++)\n r % 2 === 0 ? (i.push(t.getX(r)), i.push(t.getX(r + 1)), i.push(t.getX(r + 2))) : (i.push(t.getX(r + 2)), i.push(t.getX(r + 1)), i.push(t.getX(r)));\n i.length / 3 !== n && console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n const o = s.clone();\n return o.setIndex(i), o.clearGroups(), o;\n } else\n return console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:\", e), s;\n}\nclass Zh extends zo {\n /**\n * Constructs a new glTF loader.\n *\n * @param {LoadingManager} [manager] - The loading manager.\n */\n constructor(e) {\n super(e), this.dracoLoader = null, this.ktx2Loader = null, this.meshoptDecoder = null, this.pluginCallbacks = [], this.register(function(t) {\n return new eu(t);\n }), this.register(function(t) {\n return new tu(t);\n }), this.register(function(t) {\n return new hu(t);\n }), this.register(function(t) {\n return new uu(t);\n }), this.register(function(t) {\n return new fu(t);\n }), this.register(function(t) {\n return new iu(t);\n }), this.register(function(t) {\n return new su(t);\n }), this.register(function(t) {\n return new ru(t);\n }), this.register(function(t) {\n return new ou(t);\n }), this.register(function(t) {\n return new Qh(t);\n }), this.register(function(t) {\n return new au(t);\n }), this.register(function(t) {\n return new nu(t);\n }), this.register(function(t) {\n return new cu(t);\n }), this.register(function(t) {\n return new lu(t);\n }), this.register(function(t) {\n return new $h(t);\n }), this.register(function(t) {\n return new du(t);\n }), this.register(function(t) {\n return new pu(t);\n });\n }\n /**\n * Starts loading from the given URL and passes the loaded glTF asset\n * to the `onLoad()` callback.\n *\n * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n * @param {function(GLTFLoader~LoadObject)} onLoad - Executed when the loading process has been finished.\n * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n * @param {onErrorCallback} onError - Executed when errors occur.\n */\n load(e, t, n, i) {\n const o = this;\n let r;\n if (this.resourcePath !== \"\")\n r = this.resourcePath;\n else if (this.path !== \"\") {\n const h = In.extractUrlBase(e);\n r = In.resolveURL(h, this.path);\n } else\n r = In.extractUrlBase(e);\n this.manager.itemStart(e);\n const a = function(h) {\n i ? i(h) : console.error(h), o.manager.itemError(e), o.manager.itemEnd(e);\n }, l = new Bi(this.manager);\n l.setPath(this.path), l.setResponseType(\"arraybuffer\"), l.setRequestHeader(this.requestHeader), l.setWithCredentials(this.withCredentials), l.load(e, function(h) {\n try {\n o.parse(h, r, function(c) {\n t(c), o.manager.itemEnd(e);\n }, a);\n } catch (c) {\n a(c);\n }\n }, n, a);\n }\n /**\n * Sets the given Draco loader to this loader. Required for decoding assets\n * compressed with the `KHR_draco_mesh_compression` extension.\n *\n * @param {DRACOLoader} dracoLoader - The Draco loader to set.\n * @return {GLTFLoader} A reference to this loader.\n */\n setDRACOLoader(e) {\n return this.dracoLoader = e, this;\n }\n /**\n * Sets the given KTX2 loader to this loader. Required for loading KTX2\n * compressed textures.\n *\n * @param {KTX2Loader} ktx2Loader - The KTX2 loader to set.\n * @return {GLTFLoader} A reference to this loader.\n */\n setKTX2Loader(e) {\n return this.ktx2Loader = e, this;\n }\n /**\n * Sets the given meshopt decoder. Required for decoding assets\n * compressed with the `EXT_meshopt_compression` extension.\n *\n * @param {Object} meshoptDecoder - The meshopt decoder to set.\n * @return {GLTFLoader} A reference to this loader.\n */\n setMeshoptDecoder(e) {\n return this.meshoptDecoder = e, this;\n }\n /**\n * Registers a plugin callback. This API is internally used to implement the various\n * glTF extensions but can also used by third-party code to add additional logic\n * to the loader.\n *\n * @param {function(parser:GLTFParser)} callback - The callback function to register.\n * @return {GLTFLoader} A reference to this loader.\n */\n register(e) {\n return this.pluginCallbacks.indexOf(e) === -1 && this.pluginCallbacks.push(e), this;\n }\n /**\n * Unregisters a plugin callback.\n *\n * @param {Function} callback - The callback function to unregister.\n * @return {GLTFLoader} A reference to this loader.\n */\n unregister(e) {\n return this.pluginCallbacks.indexOf(e) !== -1 && this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e), 1), this;\n }\n /**\n * Parses the given FBX data and returns the resulting group.\n *\n * @param {string|ArrayBuffer} data - The raw glTF data.\n * @param {string} path - The URL base path.\n * @param {function(GLTFLoader~LoadObject)} onLoad - Executed when the loading process has been finished.\n * @param {onErrorCallback} onError - Executed when errors occur.\n */\n parse(e, t, n, i) {\n let o;\n const r = {}, a = {}, l = new TextDecoder();\n if (typeof e == \"string\")\n o = JSON.parse(e);\n else if (e instanceof ArrayBuffer)\n if (l.decode(new Uint8Array(e, 0, 4)) === xa) {\n try {\n r[le.KHR_BINARY_GLTF] = new mu(e);\n } catch (u) {\n i && i(u);\n return;\n }\n o = JSON.parse(r[le.KHR_BINARY_GLTF].content);\n } else\n o = JSON.parse(l.decode(e));\n else\n o = e;\n if (o.asset === void 0 || o.asset.version[0] < 2) {\n i && i(new Error(\"THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.\"));\n return;\n }\n const h = new Cu(o, {\n path: t || this.resourcePath || \"\",\n crossOrigin: this.crossOrigin,\n requestHeader: this.requestHeader,\n manager: this.manager,\n ktx2Loader: this.ktx2Loader,\n meshoptDecoder: this.meshoptDecoder\n });\n h.fileLoader.setRequestHeader(this.requestHeader);\n for (let c = 0; c < this.pluginCallbacks.length; c++) {\n const u = this.pluginCallbacks[c](h);\n u.name || console.error(\"THREE.GLTFLoader: Invalid plugin found: missing name\"), a[u.name] = u, r[u.name] = !0;\n }\n if (o.extensionsUsed)\n for (let c = 0; c < o.extensionsUsed.length; ++c) {\n const u = o.extensionsUsed[c], d = o.extensionsRequired || [];\n switch (u) {\n case le.KHR_MATERIALS_UNLIT:\n r[u] = new Jh();\n break;\n case le.KHR_DRACO_MESH_COMPRESSION:\n r[u] = new gu(o, this.dracoLoader);\n break;\n case le.KHR_TEXTURE_TRANSFORM:\n r[u] = new yu();\n break;\n case le.KHR_MESH_QUANTIZATION:\n r[u] = new wu();\n break;\n default:\n d.indexOf(u) >= 0 && a[u] === void 0 && console.warn('THREE.GLTFLoader: Unknown extension \"' + u + '\".');\n }\n }\n h.setExtensions(r), h.setPlugins(a), h.parse(n, i);\n }\n /**\n * Async version of {@link GLTFLoader#parse}.\n *\n * @async\n * @param {string|ArrayBuffer} data - The raw glTF data.\n * @param {string} path - The URL base path.\n * @return {Promise} A Promise that resolves with the loaded glTF when the parsing has been finished.\n */\n parseAsync(e, t) {\n const n = this;\n return new Promise(function(i, o) {\n n.parse(e, t, i, o);\n });\n }\n}\nfunction Yh() {\n let s = {};\n return {\n get: function(e) {\n return s[e];\n },\n add: function(e, t) {\n s[e] = t;\n },\n remove: function(e) {\n delete s[e];\n },\n removeAll: function() {\n s = {};\n }\n };\n}\nconst le = {\n KHR_BINARY_GLTF: \"KHR_binary_glTF\",\n KHR_DRACO_MESH_COMPRESSION: \"KHR_draco_mesh_compression\",\n KHR_LIGHTS_PUNCTUAL: \"KHR_lights_punctual\",\n KHR_MATERIALS_CLEARCOAT: \"KHR_materials_clearcoat\",\n KHR_MATERIALS_DISPERSION: \"KHR_materials_dispersion\",\n KHR_MATERIALS_IOR: \"KHR_materials_ior\",\n KHR_MATERIALS_SHEEN: \"KHR_materials_sheen\",\n KHR_MATERIALS_SPECULAR: \"KHR_materials_specular\",\n KHR_MATERIALS_TRANSMISSION: \"KHR_materials_transmission\",\n KHR_MATERIALS_IRIDESCENCE: \"KHR_materials_iridescence\",\n KHR_MATERIALS_ANISOTROPY: \"KHR_materials_anisotropy\",\n KHR_MATERIALS_UNLIT: \"KHR_materials_unlit\",\n KHR_MATERIALS_VOLUME: \"KHR_materials_volume\",\n KHR_TEXTURE_BASISU: \"KHR_texture_basisu\",\n KHR_TEXTURE_TRANSFORM: \"KHR_texture_transform\",\n KHR_MESH_QUANTIZATION: \"KHR_mesh_quantization\",\n KHR_MATERIALS_EMISSIVE_STRENGTH: \"KHR_materials_emissive_strength\",\n EXT_MATERIALS_BUMP: \"EXT_materials_bump\",\n EXT_TEXTURE_WEBP: \"EXT_texture_webp\",\n EXT_TEXTURE_AVIF: \"EXT_texture_avif\",\n EXT_MESHOPT_COMPRESSION: \"EXT_meshopt_compression\",\n EXT_MESH_GPU_INSTANCING: \"EXT_mesh_gpu_instancing\"\n};\nclass $h {\n constructor(e) {\n this.parser = e, this.name = le.KHR_LIGHTS_PUNCTUAL, this.cache = { refs: {}, uses: {} };\n }\n _markDefs() {\n const e = this.parser, t = this.parser.json.nodes || [];\n for (let n = 0, i = t.length; n < i; n++) {\n const o = t[n];\n o.extensions && o.extensions[this.name] && o.extensions[this.name].light !== void 0 && e._addNodeRef(this.cache, o.extensions[this.name].light);\n }\n }\n _loadLight(e) {\n const t = this.parser, n = \"light:\" + e;\n let i = t.cache.get(n);\n if (i) return i;\n const o = t.json, l = ((o.extensions && o.extensions[this.name] || {}).lights || [])[e];\n let h;\n const c = new je(16777215);\n l.color !== void 0 && c.setRGB(l.color[0], l.color[1], l.color[2], lt);\n const u = l.range !== void 0 ? l.range : 0;\n switch (l.type) {\n case \"directional\":\n h = new rl(c), h.target.position.set(0, 0, -1), h.add(h.target);\n break;\n case \"point\":\n h = new sl(c), h.distance = u;\n break;\n case \"spot\":\n h = new il(c), h.distance = u, l.spot = l.spot || {}, l.spot.innerConeAngle = l.spot.innerConeAngle !== void 0 ? l.spot.innerConeAngle : 0, l.spot.outerConeAngle = l.spot.outerConeAngle !== void 0 ? l.spot.outerConeAngle : Math.PI / 4, h.angle = l.spot.outerConeAngle, h.penumbra = 1 - l.spot.innerConeAngle / l.spot.outerConeAngle, h.target.position.set(0, 0, -1), h.add(h.target);\n break;\n default:\n throw new Error(\"THREE.GLTFLoader: Unexpected light type: \" + l.type);\n }\n return h.position.set(0, 0, 0), rt(h, l), l.intensity !== void 0 && (h.intensity = l.intensity), h.name = t.createUniqueName(l.name || \"light_\" + e), i = Promise.resolve(h), t.cache.add(n, i), i;\n }\n getDependency(e, t) {\n if (e === \"light\")\n return this._loadLight(t);\n }\n createNodeAttachment(e) {\n const t = this, n = this.parser, o = n.json.nodes[e], a = (o.extensions && o.extensions[this.name] || {}).light;\n return a === void 0 ? null : this._loadLight(a).then(function(l) {\n return n._getNodeRef(t.cache, a, l);\n });\n }\n}\nclass Jh {\n constructor() {\n this.name = le.KHR_MATERIALS_UNLIT;\n }\n getMaterialType() {\n return hn;\n }\n extendParams(e, t, n) {\n const i = [];\n e.color = new je(1, 1, 1), e.opacity = 1;\n const o = t.pbrMetallicRoughness;\n if (o) {\n if (Array.isArray(o.baseColorFactor)) {\n const r = o.baseColorFactor;\n e.color.setRGB(r[0], r[1], r[2], lt), e.opacity = r[3];\n }\n o.baseColorTexture !== void 0 && i.push(n.assignTexture(e, \"map\", o.baseColorTexture, Rt));\n }\n return Promise.all(i);\n }\n}\nclass Qh {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_EMISSIVE_STRENGTH;\n }\n extendMaterialParams(e, t) {\n const i = this.parser.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = i.extensions[this.name].emissiveStrength;\n return o !== void 0 && (t.emissiveIntensity = o), Promise.resolve();\n }\n}\nclass eu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_CLEARCOAT;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = [], r = i.extensions[this.name];\n if (r.clearcoatFactor !== void 0 && (t.clearcoat = r.clearcoatFactor), r.clearcoatTexture !== void 0 && o.push(n.assignTexture(t, \"clearcoatMap\", r.clearcoatTexture)), r.clearcoatRoughnessFactor !== void 0 && (t.clearcoatRoughness = r.clearcoatRoughnessFactor), r.clearcoatRoughnessTexture !== void 0 && o.push(n.assignTexture(t, \"clearcoatRoughnessMap\", r.clearcoatRoughnessTexture)), r.clearcoatNormalTexture !== void 0 && (o.push(n.assignTexture(t, \"clearcoatNormalMap\", r.clearcoatNormalTexture)), r.clearcoatNormalTexture.scale !== void 0)) {\n const a = r.clearcoatNormalTexture.scale;\n t.clearcoatNormalScale = new ce(a, a);\n }\n return Promise.all(o);\n }\n}\nclass tu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_DISPERSION;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const i = this.parser.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = i.extensions[this.name];\n return t.dispersion = o.dispersion !== void 0 ? o.dispersion : 0, Promise.resolve();\n }\n}\nclass nu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_IRIDESCENCE;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = [], r = i.extensions[this.name];\n return r.iridescenceFactor !== void 0 && (t.iridescence = r.iridescenceFactor), r.iridescenceTexture !== void 0 && o.push(n.assignTexture(t, \"iridescenceMap\", r.iridescenceTexture)), r.iridescenceIor !== void 0 && (t.iridescenceIOR = r.iridescenceIor), t.iridescenceThicknessRange === void 0 && (t.iridescenceThicknessRange = [100, 400]), r.iridescenceThicknessMinimum !== void 0 && (t.iridescenceThicknessRange[0] = r.iridescenceThicknessMinimum), r.iridescenceThicknessMaximum !== void 0 && (t.iridescenceThicknessRange[1] = r.iridescenceThicknessMaximum), r.iridescenceThicknessTexture !== void 0 && o.push(n.assignTexture(t, \"iridescenceThicknessMap\", r.iridescenceThicknessTexture)), Promise.all(o);\n }\n}\nclass iu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_SHEEN;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = [];\n t.sheenColor = new je(0, 0, 0), t.sheenRoughness = 0, t.sheen = 1;\n const r = i.extensions[this.name];\n if (r.sheenColorFactor !== void 0) {\n const a = r.sheenColorFactor;\n t.sheenColor.setRGB(a[0], a[1], a[2], lt);\n }\n return r.sheenRoughnessFactor !== void 0 && (t.sheenRoughness = r.sheenRoughnessFactor), r.sheenColorTexture !== void 0 && o.push(n.assignTexture(t, \"sheenColorMap\", r.sheenColorTexture, Rt)), r.sheenRoughnessTexture !== void 0 && o.push(n.assignTexture(t, \"sheenRoughnessMap\", r.sheenRoughnessTexture)), Promise.all(o);\n }\n}\nclass su {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_TRANSMISSION;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = [], r = i.extensions[this.name];\n return r.transmissionFactor !== void 0 && (t.transmission = r.transmissionFactor), r.transmissionTexture !== void 0 && o.push(n.assignTexture(t, \"transmissionMap\", r.transmissionTexture)), Promise.all(o);\n }\n}\nclass ru {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_VOLUME;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = [], r = i.extensions[this.name];\n t.thickness = r.thicknessFactor !== void 0 ? r.thicknessFactor : 0, r.thicknessTexture !== void 0 && o.push(n.assignTexture(t, \"thicknessMap\", r.thicknessTexture)), t.attenuationDistance = r.attenuationDistance || 1 / 0;\n const a = r.attenuationColor || [1, 1, 1];\n return t.attenuationColor = new je().setRGB(a[0], a[1], a[2], lt), Promise.all(o);\n }\n}\nclass ou {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_IOR;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const i = this.parser.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = i.extensions[this.name];\n return t.ior = o.ior !== void 0 ? o.ior : 1.5, Promise.resolve();\n }\n}\nclass au {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_SPECULAR;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = [], r = i.extensions[this.name];\n t.specularIntensity = r.specularFactor !== void 0 ? r.specularFactor : 1, r.specularTexture !== void 0 && o.push(n.assignTexture(t, \"specularIntensityMap\", r.specularTexture));\n const a = r.specularColorFactor || [1, 1, 1];\n return t.specularColor = new je().setRGB(a[0], a[1], a[2], lt), r.specularColorTexture !== void 0 && o.push(n.assignTexture(t, \"specularColorMap\", r.specularColorTexture, Rt)), Promise.all(o);\n }\n}\nclass lu {\n constructor(e) {\n this.parser = e, this.name = le.EXT_MATERIALS_BUMP;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = [], r = i.extensions[this.name];\n return t.bumpScale = r.bumpFactor !== void 0 ? r.bumpFactor : 1, r.bumpTexture !== void 0 && o.push(n.assignTexture(t, \"bumpMap\", r.bumpTexture)), Promise.all(o);\n }\n}\nclass cu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_ANISOTROPY;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = [], r = i.extensions[this.name];\n return r.anisotropyStrength !== void 0 && (t.anisotropy = r.anisotropyStrength), r.anisotropyRotation !== void 0 && (t.anisotropyRotation = r.anisotropyRotation), r.anisotropyTexture !== void 0 && o.push(n.assignTexture(t, \"anisotropyMap\", r.anisotropyTexture)), Promise.all(o);\n }\n}\nclass hu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_TEXTURE_BASISU;\n }\n loadTexture(e) {\n const t = this.parser, n = t.json, i = n.textures[e];\n if (!i.extensions || !i.extensions[this.name])\n return null;\n const o = i.extensions[this.name], r = t.options.ktx2Loader;\n if (!r) {\n if (n.extensionsRequired && n.extensionsRequired.indexOf(this.name) >= 0)\n throw new Error(\"THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures\");\n return null;\n }\n return t.loadTextureImage(e, o.source, r);\n }\n}\nclass uu {\n constructor(e) {\n this.parser = e, this.name = le.EXT_TEXTURE_WEBP;\n }\n loadTexture(e) {\n const t = this.name, n = this.parser, i = n.json, o = i.textures[e];\n if (!o.extensions || !o.extensions[t])\n return null;\n const r = o.extensions[t], a = i.images[r.source];\n let l = n.textureLoader;\n if (a.uri) {\n const h = n.options.manager.getHandler(a.uri);\n h !== null && (l = h);\n }\n return n.loadTextureImage(e, r.source, l);\n }\n}\nclass fu {\n constructor(e) {\n this.parser = e, this.name = le.EXT_TEXTURE_AVIF;\n }\n loadTexture(e) {\n const t = this.name, n = this.parser, i = n.json, o = i.textures[e];\n if (!o.extensions || !o.extensions[t])\n return null;\n const r = o.extensions[t], a = i.images[r.source];\n let l = n.textureLoader;\n if (a.uri) {\n const h = n.options.manager.getHandler(a.uri);\n h !== null && (l = h);\n }\n return n.loadTextureImage(e, r.source, l);\n }\n}\nclass du {\n constructor(e) {\n this.name = le.EXT_MESHOPT_COMPRESSION, this.parser = e;\n }\n loadBufferView(e) {\n const t = this.parser.json, n = t.bufferViews[e];\n if (n.extensions && n.extensions[this.name]) {\n const i = n.extensions[this.name], o = this.parser.getDependency(\"buffer\", i.buffer), r = this.parser.options.meshoptDecoder;\n if (!r || !r.supported) {\n if (t.extensionsRequired && t.extensionsRequired.indexOf(this.name) >= 0)\n throw new Error(\"THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files\");\n return null;\n }\n return o.then(function(a) {\n const l = i.byteOffset || 0, h = i.byteLength || 0, c = i.count, u = i.byteStride, d = new Uint8Array(a, l, h);\n return r.decodeGltfBufferAsync ? r.decodeGltfBufferAsync(c, u, d, i.mode, i.filter).then(function(p) {\n return p.buffer;\n }) : r.ready.then(function() {\n const p = new ArrayBuffer(c * u);\n return r.decodeGltfBuffer(new Uint8Array(p), c, u, d, i.mode, i.filter), p;\n });\n });\n } else\n return null;\n }\n}\nclass pu {\n constructor(e) {\n this.name = le.EXT_MESH_GPU_INSTANCING, this.parser = e;\n }\n createNodeMesh(e) {\n const t = this.parser.json, n = t.nodes[e];\n if (!n.extensions || !n.extensions[this.name] || n.mesh === void 0)\n return null;\n const i = t.meshes[n.mesh];\n for (const h of i.primitives)\n if (h.mode !== We.TRIANGLES && h.mode !== We.TRIANGLE_STRIP && h.mode !== We.TRIANGLE_FAN && h.mode !== void 0)\n return null;\n const r = n.extensions[this.name].attributes, a = [], l = {};\n for (const h in r)\n a.push(this.parser.getDependency(\"accessor\", r[h]).then((c) => (l[h] = c, l[h])));\n return a.length < 1 ? null : (a.push(this.parser.createNodeMesh(e)), Promise.all(a).then((h) => {\n const c = h.pop(), u = c.isGroup ? c.children : [c], d = h[0].count, p = [];\n for (const f of u) {\n const m = new Ae(), g = new Z(), y = new Ri(), w = new Z(1, 1, 1), _ = new ol(f.geometry, f.material, d);\n for (let x = 0; x < d; x++)\n l.TRANSLATION && g.fromBufferAttribute(l.TRANSLATION, x), l.ROTATION && y.fromBufferAttribute(l.ROTATION, x), l.SCALE && w.fromBufferAttribute(l.SCALE, x), _.setMatrixAt(x, m.compose(g, y, w));\n for (const x in l)\n if (x === \"_COLOR_0\") {\n const b = l[x];\n _.instanceColor = new al(b.array, b.itemSize, b.normalized);\n } else x !== \"TRANSLATION\" && x !== \"ROTATION\" && x !== \"SCALE\" && f.geometry.setAttribute(x, l[x]);\n Fo.prototype.copy.call(_, f), this.parser.assignFinalMaterial(_), p.push(_);\n }\n return c.isGroup ? (c.clear(), c.add(...p), c) : p[0];\n }));\n }\n}\nconst xa = \"glTF\", En = 12, Hr = { JSON: 1313821514, BIN: 5130562 };\nclass mu {\n constructor(e) {\n this.name = le.KHR_BINARY_GLTF, this.content = null, this.body = null;\n const t = new DataView(e, 0, En), n = new TextDecoder();\n if (this.header = {\n magic: n.decode(new Uint8Array(e.slice(0, 4))),\n version: t.getUint32(4, !0),\n length: t.getUint32(8, !0)\n }, this.header.magic !== xa)\n throw new Error(\"THREE.GLTFLoader: Unsupported glTF-Binary header.\");\n if (this.header.version < 2)\n throw new Error(\"THREE.GLTFLoader: Legacy binary file detected.\");\n const i = this.header.length - En, o = new DataView(e, En);\n let r = 0;\n for (; r < i; ) {\n const a = o.getUint32(r, !0);\n r += 4;\n const l = o.getUint32(r, !0);\n if (r += 4, l === Hr.JSON) {\n const h = new Uint8Array(e, En + r, a);\n this.content = n.decode(h);\n } else if (l === Hr.BIN) {\n const h = En + r;\n this.body = e.slice(h, h + a);\n }\n r += a;\n }\n if (this.content === null)\n throw new Error(\"THREE.GLTFLoader: JSON content not found.\");\n }\n}\nclass gu {\n constructor(e, t) {\n if (!t)\n throw new Error(\"THREE.GLTFLoader: No DRACOLoader instance provided.\");\n this.name = le.KHR_DRACO_MESH_COMPRESSION, this.json = e, this.dracoLoader = t, this.dracoLoader.preload();\n }\n decodePrimitive(e, t) {\n const n = this.json, i = this.dracoLoader, o = e.extensions[this.name].bufferView, r = e.extensions[this.name].attributes, a = {}, l = {}, h = {};\n for (const c in r) {\n const u = Os[c] || c.toLowerCase();\n a[u] = r[c];\n }\n for (const c in e.attributes) {\n const u = Os[c] || c.toLowerCase();\n if (r[c] !== void 0) {\n const d = n.accessors[e.attributes[c]], p = mn[d.componentType];\n h[u] = p.name, l[u] = d.normalized === !0;\n }\n }\n return t.getDependency(\"bufferView\", o).then(function(c) {\n return new Promise(function(u, d) {\n i.decodeDracoFile(c, function(p) {\n for (const f in p.attributes) {\n const m = p.attributes[f], g = l[f];\n g !== void 0 && (m.normalized = g);\n }\n u(p);\n }, a, h, lt, d);\n });\n });\n }\n}\nclass yu {\n constructor() {\n this.name = le.KHR_TEXTURE_TRANSFORM;\n }\n extendTexture(e, t) {\n return (t.texCoord === void 0 || t.texCoord === e.channel) && t.offset === void 0 && t.rotation === void 0 && t.scale === void 0 || (e = e.clone(), t.texCoord !== void 0 && (e.channel = t.texCoord), t.offset !== void 0 && e.offset.fromArray(t.offset), t.rotation !== void 0 && (e.rotation = t.rotation), t.scale !== void 0 && e.repeat.fromArray(t.scale), e.needsUpdate = !0), e;\n }\n}\nclass wu {\n constructor() {\n this.name = le.KHR_MESH_QUANTIZATION;\n }\n}\nclass ba extends Cl {\n constructor(e, t, n, i) {\n super(e, t, n, i);\n }\n copySampleValue_(e) {\n const t = this.resultBuffer, n = this.sampleValues, i = this.valueSize, o = e * i * 3 + i;\n for (let r = 0; r !== i; r++)\n t[r] = n[o + r];\n return t;\n }\n interpolate_(e, t, n, i) {\n const o = this.resultBuffer, r = this.sampleValues, a = this.valueSize, l = a * 2, h = a * 3, c = i - t, u = (n - t) / c, d = u * u, p = d * u, f = e * h, m = f - h, g = -2 * p + 3 * d, y = p - d, w = 1 - g, _ = y - d + u;\n for (let x = 0; x !== a; x++) {\n const b = r[m + x + a], A = r[m + x + l] * c, M = r[f + x + a], C = r[f + x] * c;\n o[x] = w * b + _ * A + g * M + y * C;\n }\n return o;\n }\n}\nconst _u = new Ri();\nclass xu extends ba {\n interpolate_(e, t, n, i) {\n const o = super.interpolate_(e, t, n, i);\n return _u.fromArray(o).normalize().toArray(o), o;\n }\n}\nconst We = {\n POINTS: 0,\n LINES: 1,\n LINE_LOOP: 2,\n LINE_STRIP: 3,\n TRIANGLES: 4,\n TRIANGLE_STRIP: 5,\n TRIANGLE_FAN: 6\n}, mn = {\n 5120: Int8Array,\n 5121: Uint8Array,\n 5122: Int16Array,\n 5123: Uint16Array,\n 5125: Uint32Array,\n 5126: Float32Array\n}, Gr = {\n 9728: Di,\n 9729: Ds,\n 9984: fl,\n 9985: ul,\n 9986: hl,\n 9987: Vo\n}, Wr = {\n 33071: pl,\n 33648: dl,\n 10497: Zt\n}, ss = {\n SCALAR: 1,\n VEC2: 2,\n VEC3: 3,\n VEC4: 4,\n MAT2: 4,\n MAT3: 9,\n MAT4: 16\n}, Os = {\n POSITION: \"position\",\n NORMAL: \"normal\",\n TANGENT: \"tangent\",\n TEXCOORD_0: \"uv\",\n TEXCOORD_1: \"uv1\",\n TEXCOORD_2: \"uv2\",\n TEXCOORD_3: \"uv3\",\n COLOR_0: \"color\",\n WEIGHTS_0: \"skinWeight\",\n JOINTS_0: \"skinIndex\"\n}, Tt = {\n scale: \"scale\",\n translation: \"position\",\n rotation: \"quaternion\",\n weights: \"morphTargetInfluences\"\n}, bu = {\n CUBICSPLINE: void 0,\n // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n // keyframe track will be initialized with a default interpolation type, then modified.\n LINEAR: Ho,\n STEP: Al\n}, rs = {\n OPAQUE: \"OPAQUE\",\n MASK: \"MASK\",\n BLEND: \"BLEND\"\n};\nfunction vu(s) {\n return s.DefaultMaterial === void 0 && (s.DefaultMaterial = new jo({\n color: 16777215,\n emissive: 0,\n metalness: 1,\n roughness: 1,\n transparent: !1,\n depthTest: !0,\n side: Ls\n })), s.DefaultMaterial;\n}\nfunction Nt(s, e, t) {\n for (const n in t.extensions)\n s[n] === void 0 && (e.userData.gltfExtensions = e.userData.gltfExtensions || {}, e.userData.gltfExtensions[n] = t.extensions[n]);\n}\nfunction rt(s, e) {\n e.extras !== void 0 && (typeof e.extras == \"object\" ? Object.assign(s.userData, e.extras) : console.warn(\"THREE.GLTFLoader: Ignoring primitive type .extras, \" + e.extras));\n}\nfunction Su(s, e, t) {\n let n = !1, i = !1, o = !1;\n for (let h = 0, c = e.length; h < c; h++) {\n const u = e[h];\n if (u.POSITION !== void 0 && (n = !0), u.NORMAL !== void 0 && (i = !0), u.COLOR_0 !== void 0 && (o = !0), n && i && o) break;\n }\n if (!n && !i && !o) return Promise.resolve(s);\n const r = [], a = [], l = [];\n for (let h = 0, c = e.length; h < c; h++) {\n const u = e[h];\n if (n) {\n const d = u.POSITION !== void 0 ? t.getDependency(\"accessor\", u.POSITION) : s.attributes.position;\n r.push(d);\n }\n if (i) {\n const d = u.NORMAL !== void 0 ? t.getDependency(\"accessor\", u.NORMAL) : s.attributes.normal;\n a.push(d);\n }\n if (o) {\n const d = u.COLOR_0 !== void 0 ? t.getDependency(\"accessor\", u.COLOR_0) : s.attributes.color;\n l.push(d);\n }\n }\n return Promise.all([\n Promise.all(r),\n Promise.all(a),\n Promise.all(l)\n ]).then(function(h) {\n const c = h[0], u = h[1], d = h[2];\n return n && (s.morphAttributes.position = c), i && (s.morphAttributes.normal = u), o && (s.morphAttributes.color = d), s.morphTargetsRelative = !0, s;\n });\n}\nfunction Tu(s, e) {\n if (s.updateMorphTargets(), e.weights !== void 0)\n for (let t = 0, n = e.weights.length; t < n; t++)\n s.morphTargetInfluences[t] = e.weights[t];\n if (e.extras && Array.isArray(e.extras.targetNames)) {\n const t = e.extras.targetNames;\n if (s.morphTargetInfluences.length === t.length) {\n s.morphTargetDictionary = {};\n for (let n = 0, i = t.length; n < i; n++)\n s.morphTargetDictionary[t[n]] = n;\n } else\n console.warn(\"THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.\");\n }\n}\nfunction Eu(s) {\n let e;\n const t = s.extensions && s.extensions[le.KHR_DRACO_MESH_COMPRESSION];\n if (t ? e = \"draco:\" + t.bufferView + \":\" + t.indices + \":\" + os(t.attributes) : e = s.indices + \":\" + os(s.attributes) + \":\" + s.mode, s.targets !== void 0)\n for (let n = 0, i = s.targets.length; n < i; n++)\n e += \":\" + os(s.targets[n]);\n return e;\n}\nfunction os(s) {\n let e = \"\";\n const t = Object.keys(s).sort();\n for (let n = 0, i = t.length; n < i; n++)\n e += t[n] + \":\" + s[t[n]] + \";\";\n return e;\n}\nfunction Us(s) {\n switch (s) {\n case Int8Array:\n return 1 / 127;\n case Uint8Array:\n return 1 / 255;\n case Int16Array:\n return 1 / 32767;\n case Uint16Array:\n return 1 / 65535;\n default:\n throw new Error(\"THREE.GLTFLoader: Unsupported normalized accessor component type.\");\n }\n}\nfunction Mu(s) {\n return s.search(/\\.jpe?g($|\\?)/i) > 0 || s.search(/^data\\:image\\/jpeg/) === 0 ? \"image/jpeg\" : s.search(/\\.webp($|\\?)/i) > 0 || s.search(/^data\\:image\\/webp/) === 0 ? \"image/webp\" : s.search(/\\.ktx2($|\\?)/i) > 0 || s.search(/^data\\:image\\/ktx2/) === 0 ? \"image/ktx2\" : \"image/png\";\n}\nconst Au = new Ae();\nclass Cu {\n constructor(e = {}, t = {}) {\n this.json = e, this.extensions = {}, this.plugins = {}, this.options = t, this.cache = new Yh(), this.associations = /* @__PURE__ */ new Map(), this.primitiveCache = {}, this.nodeCache = {}, this.meshCache = { refs: {}, uses: {} }, this.cameraCache = { refs: {}, uses: {} }, this.lightCache = { refs: {}, uses: {} }, this.sourceCache = {}, this.textureCache = {}, this.nodeNamesUsed = {};\n let n = !1, i = -1, o = !1, r = -1;\n if (typeof navigator < \"u\") {\n const a = navigator.userAgent;\n n = /^((?!chrome|android).)*safari/i.test(a) === !0;\n const l = a.match(/Version\\/(\\d+)/);\n i = n && l ? parseInt(l[1], 10) : -1, o = a.indexOf(\"Firefox\") > -1, r = o ? a.match(/Firefox\\/([0-9]+)\\./)[1] : -1;\n }\n typeof createImageBitmap > \"u\" || n && i < 17 || o && r < 98 ? this.textureLoader = new ll(this.options.manager) : this.textureLoader = new cl(this.options.manager), this.textureLoader.setCrossOrigin(this.options.crossOrigin), this.textureLoader.setRequestHeader(this.options.requestHeader), this.fileLoader = new Bi(this.options.manager), this.fileLoader.setResponseType(\"arraybuffer\"), this.options.crossOrigin === \"use-credentials\" && this.fileLoader.setWithCredentials(!0);\n }\n setExtensions(e) {\n this.extensions = e;\n }\n setPlugins(e) {\n this.plugins = e;\n }\n parse(e, t) {\n const n = this, i = this.json, o = this.extensions;\n this.cache.removeAll(), this.nodeCache = {}, this._invokeAll(function(r) {\n return r._markDefs && r._markDefs();\n }), Promise.all(this._invokeAll(function(r) {\n return r.beforeRoot && r.beforeRoot();\n })).then(function() {\n return Promise.all([\n n.getDependencies(\"scene\"),\n n.getDependencies(\"animation\"),\n n.getDependencies(\"camera\")\n ]);\n }).then(function(r) {\n const a = {\n scene: r[0][i.scene || 0],\n scenes: r[0],\n animations: r[1],\n cameras: r[2],\n asset: i.asset,\n parser: n,\n userData: {}\n };\n return Nt(o, a, i), rt(a, i), Promise.all(n._invokeAll(function(l) {\n return l.afterRoot && l.afterRoot(a);\n })).then(function() {\n for (const l of a.scenes)\n l.updateMatrixWorld();\n e(a);\n });\n }).catch(t);\n }\n /**\n * Marks the special nodes/meshes in json for efficient parse.\n *\n * @private\n */\n _markDefs() {\n const e = this.json.nodes || [], t = this.json.skins || [], n = this.json.meshes || [];\n for (let i = 0, o = t.length; i < o; i++) {\n const r = t[i].joints;\n for (let a = 0, l = r.length; a < l; a++)\n e[r[a]].isBone = !0;\n }\n for (let i = 0, o = e.length; i < o; i++) {\n const r = e[i];\n r.mesh !== void 0 && (this._addNodeRef(this.meshCache, r.mesh), r.skin !== void 0 && (n[r.mesh].isSkinnedMesh = !0)), r.camera !== void 0 && this._addNodeRef(this.cameraCache, r.camera);\n }\n }\n /**\n * Counts references to shared node / Object3D resources. These resources\n * can be reused, or \"instantiated\", at multiple nodes in the scene\n * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n * be marked. Non-scenegraph resources (like Materials, Geometries, and\n * Textures) can be reused directly and are not marked here.\n *\n * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n *\n * @private\n * @param {Object} cache\n * @param {Object3D} index\n */\n _addNodeRef(e, t) {\n t !== void 0 && (e.refs[t] === void 0 && (e.refs[t] = e.uses[t] = 0), e.refs[t]++);\n }\n /**\n * Returns a reference to a shared resource, cloning it if necessary.\n *\n * @private\n * @param {Object} cache\n * @param {number} index\n * @param {Object} object\n * @return {Object}\n */\n _getNodeRef(e, t, n) {\n if (e.refs[t] <= 1) return n;\n const i = n.clone(), o = (r, a) => {\n const l = this.associations.get(r);\n l != null && this.associations.set(a, l);\n for (const [h, c] of r.children.entries())\n o(c, a.children[h]);\n };\n return o(n, i), i.name += \"_instance_\" + e.uses[t]++, i;\n }\n _invokeOne(e) {\n const t = Object.values(this.plugins);\n t.push(this);\n for (let n = 0; n < t.length; n++) {\n const i = e(t[n]);\n if (i) return i;\n }\n return null;\n }\n _invokeAll(e) {\n const t = Object.values(this.plugins);\n t.unshift(this);\n const n = [];\n for (let i = 0; i < t.length; i++) {\n const o = e(t[i]);\n o && n.push(o);\n }\n return n;\n }\n /**\n * Requests the specified dependency asynchronously, with caching.\n *\n * @private\n * @param {string} type\n * @param {number} index\n * @return {Promise}\n */\n getDependency(e, t) {\n const n = e + \":\" + t;\n let i = this.cache.get(n);\n if (!i) {\n switch (e) {\n case \"scene\":\n i = this.loadScene(t);\n break;\n case \"node\":\n i = this._invokeOne(function(o) {\n return o.loadNode && o.loadNode(t);\n });\n break;\n case \"mesh\":\n i = this._invokeOne(function(o) {\n return o.loadMesh && o.loadMesh(t);\n });\n break;\n case \"accessor\":\n i = this.loadAccessor(t);\n break;\n case \"bufferView\":\n i = this._invokeOne(function(o) {\n return o.loadBufferView && o.loadBufferView(t);\n });\n break;\n case \"buffer\":\n i = this.loadBuffer(t);\n break;\n case \"material\":\n i = this._invokeOne(function(o) {\n return o.loadMaterial && o.loadMaterial(t);\n });\n break;\n case \"texture\":\n i = this._invokeOne(function(o) {\n return o.loadTexture && o.loadTexture(t);\n });\n break;\n case \"skin\":\n i = this.loadSkin(t);\n break;\n case \"animation\":\n i = this._invokeOne(function(o) {\n return o.loadAnimation && o.loadAnimation(t);\n });\n break;\n case \"camera\":\n i = this.loadCamera(t);\n break;\n default:\n if (i = this._invokeOne(function(o) {\n return o != this && o.getDependency && o.getDependency(e, t);\n }), !i)\n throw new Error(\"Unknown type: \" + e);\n break;\n }\n this.cache.add(n, i);\n }\n return i;\n }\n /**\n * Requests all dependencies of the specified type asynchronously, with caching.\n *\n * @private\n * @param {string} type\n * @return {Promise>}\n */\n getDependencies(e) {\n let t = this.cache.get(e);\n if (!t) {\n const n = this, i = this.json[e + (e === \"mesh\" ? \"es\" : \"s\")] || [];\n t = Promise.all(i.map(function(o, r) {\n return n.getDependency(e, r);\n })), this.cache.add(e, t);\n }\n return t;\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n *\n * @private\n * @param {number} bufferIndex\n * @return {Promise}\n */\n loadBuffer(e) {\n const t = this.json.buffers[e], n = this.fileLoader;\n if (t.type && t.type !== \"arraybuffer\")\n throw new Error(\"THREE.GLTFLoader: \" + t.type + \" buffer type is not supported.\");\n if (t.uri === void 0 && e === 0)\n return Promise.resolve(this.extensions[le.KHR_BINARY_GLTF].body);\n const i = this.options;\n return new Promise(function(o, r) {\n n.load(In.resolveURL(t.uri, i.path), o, void 0, function() {\n r(new Error('THREE.GLTFLoader: Failed to load buffer \"' + t.uri + '\".'));\n });\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n *\n * @private\n * @param {number} bufferViewIndex\n * @return {Promise}\n */\n loadBufferView(e) {\n const t = this.json.bufferViews[e];\n return this.getDependency(\"buffer\", t.buffer).then(function(n) {\n const i = t.byteLength || 0, o = t.byteOffset || 0;\n return n.slice(o, o + i);\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n *\n * @private\n * @param {number} accessorIndex\n * @return {Promise}\n */\n loadAccessor(e) {\n const t = this, n = this.json, i = this.json.accessors[e];\n if (i.bufferView === void 0 && i.sparse === void 0) {\n const r = ss[i.type], a = mn[i.componentType], l = i.normalized === !0, h = new a(i.count * r);\n return Promise.resolve(new at(h, r, l));\n }\n const o = [];\n return i.bufferView !== void 0 ? o.push(this.getDependency(\"bufferView\", i.bufferView)) : o.push(null), i.sparse !== void 0 && (o.push(this.getDependency(\"bufferView\", i.sparse.indices.bufferView)), o.push(this.getDependency(\"bufferView\", i.sparse.values.bufferView))), Promise.all(o).then(function(r) {\n const a = r[0], l = ss[i.type], h = mn[i.componentType], c = h.BYTES_PER_ELEMENT, u = c * l, d = i.byteOffset || 0, p = i.bufferView !== void 0 ? n.bufferViews[i.bufferView].byteStride : void 0, f = i.normalized === !0;\n let m, g;\n if (p && p !== u) {\n const y = Math.floor(d / p), w = \"InterleavedBuffer:\" + i.bufferView + \":\" + i.componentType + \":\" + y + \":\" + i.count;\n let _ = t.cache.get(w);\n _ || (m = new h(a, y * p, i.count * p / c), _ = new No(m, p / c), t.cache.add(w, _)), g = new Oo(_, l, d % p / c, f);\n } else\n a === null ? m = new h(i.count * l) : m = new h(a, d, i.count * l), g = new at(m, l, f);\n if (i.sparse !== void 0) {\n const y = ss.SCALAR, w = mn[i.sparse.indices.componentType], _ = i.sparse.indices.byteOffset || 0, x = i.sparse.values.byteOffset || 0, b = new w(r[1], _, i.sparse.count * y), A = new h(r[2], x, i.sparse.count * l);\n a !== null && (g = new at(g.array.slice(), g.itemSize, g.normalized)), g.normalized = !1;\n for (let M = 0, C = b.length; M < C; M++) {\n const P = b[M];\n if (g.setX(P, A[M * l]), l >= 2 && g.setY(P, A[M * l + 1]), l >= 3 && g.setZ(P, A[M * l + 2]), l >= 4 && g.setW(P, A[M * l + 3]), l >= 5) throw new Error(\"THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.\");\n }\n g.normalized = f;\n }\n return g;\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n *\n * @private\n * @param {number} textureIndex\n * @return {Promise}\n */\n loadTexture(e) {\n const t = this.json, n = this.options, o = t.textures[e].source, r = t.images[o];\n let a = this.textureLoader;\n if (r.uri) {\n const l = n.manager.getHandler(r.uri);\n l !== null && (a = l);\n }\n return this.loadTextureImage(e, o, a);\n }\n loadTextureImage(e, t, n) {\n const i = this, o = this.json, r = o.textures[e], a = o.images[t], l = (a.uri || a.bufferView) + \":\" + r.sampler;\n if (this.textureCache[l])\n return this.textureCache[l];\n const h = this.loadImageSource(t, n).then(function(c) {\n c.flipY = !1, c.name = r.name || a.name || \"\", c.name === \"\" && typeof a.uri == \"string\" && a.uri.startsWith(\"data:image/\") === !1 && (c.name = a.uri);\n const d = (o.samplers || {})[r.sampler] || {};\n return c.magFilter = Gr[d.magFilter] || Ds, c.minFilter = Gr[d.minFilter] || Vo, c.wrapS = Wr[d.wrapS] || Zt, c.wrapT = Wr[d.wrapT] || Zt, c.generateMipmaps = !c.isCompressedTexture && c.minFilter !== Di && c.minFilter !== Ds, i.associations.set(c, { textures: e }), c;\n }).catch(function() {\n return null;\n });\n return this.textureCache[l] = h, h;\n }\n loadImageSource(e, t) {\n const n = this, i = this.json, o = this.options;\n if (this.sourceCache[e] !== void 0)\n return this.sourceCache[e].then((u) => u.clone());\n const r = i.images[e], a = self.URL || self.webkitURL;\n let l = r.uri || \"\", h = !1;\n if (r.bufferView !== void 0)\n l = n.getDependency(\"bufferView\", r.bufferView).then(function(u) {\n h = !0;\n const d = new Blob([u], { type: r.mimeType });\n return l = a.createObjectURL(d), l;\n });\n else if (r.uri === void 0)\n throw new Error(\"THREE.GLTFLoader: Image \" + e + \" is missing URI and bufferView\");\n const c = Promise.resolve(l).then(function(u) {\n return new Promise(function(d, p) {\n let f = d;\n t.isImageBitmapLoader === !0 && (f = function(m) {\n const g = new gr(m);\n g.needsUpdate = !0, d(g);\n }), t.load(In.resolveURL(u, o.path), f, void 0, p);\n });\n }).then(function(u) {\n return h === !0 && a.revokeObjectURL(l), rt(u, r), u.userData.mimeType = r.mimeType || Mu(r.uri), u;\n }).catch(function(u) {\n throw console.error(\"THREE.GLTFLoader: Couldn't load texture\", l), u;\n });\n return this.sourceCache[e] = c, c;\n }\n /**\n * Asynchronously assigns a texture to the given material parameters.\n *\n * @private\n * @param {Object} materialParams\n * @param {string} mapName\n * @param {Object} mapDef\n * @param {string} [colorSpace]\n * @return {Promise}\n */\n assignTexture(e, t, n, i) {\n const o = this;\n return this.getDependency(\"texture\", n.index).then(function(r) {\n if (!r) return null;\n if (n.texCoord !== void 0 && n.texCoord > 0 && (r = r.clone(), r.channel = n.texCoord), o.extensions[le.KHR_TEXTURE_TRANSFORM]) {\n const a = n.extensions !== void 0 ? n.extensions[le.KHR_TEXTURE_TRANSFORM] : void 0;\n if (a) {\n const l = o.associations.get(r);\n r = o.extensions[le.KHR_TEXTURE_TRANSFORM].extendTexture(r, a), o.associations.set(r, l);\n }\n }\n return i !== void 0 && (r.colorSpace = i), e[t] = r, r;\n });\n }\n /**\n * Assigns final material to a Mesh, Line, or Points instance. The instance\n * already has a material (generated from the glTF material options alone)\n * but reuse of the same glTF material may require multiple threejs materials\n * to accommodate different primitive types, defines, etc. New materials will\n * be created if necessary, and reused from a cache.\n *\n * @private\n * @param {Object3D} mesh Mesh, Line, or Points instance.\n */\n assignFinalMaterial(e) {\n const t = e.geometry;\n let n = e.material;\n const i = t.attributes.tangent === void 0, o = t.attributes.color !== void 0, r = t.attributes.normal === void 0;\n if (e.isPoints) {\n const a = \"PointsMaterial:\" + n.uuid;\n let l = this.cache.get(a);\n l || (l = new ml(), Zi.prototype.copy.call(l, n), l.color.copy(n.color), l.map = n.map, l.sizeAttenuation = !1, this.cache.add(a, l)), n = l;\n } else if (e.isLine) {\n const a = \"LineBasicMaterial:\" + n.uuid;\n let l = this.cache.get(a);\n l || (l = new gl(), Zi.prototype.copy.call(l, n), l.color.copy(n.color), l.map = n.map, this.cache.add(a, l)), n = l;\n }\n if (i || o || r) {\n let a = \"ClonedMaterial:\" + n.uuid + \":\";\n i && (a += \"derivative-tangents:\"), o && (a += \"vertex-colors:\"), r && (a += \"flat-shading:\");\n let l = this.cache.get(a);\n l || (l = n.clone(), o && (l.vertexColors = !0), r && (l.flatShading = !0), i && (l.normalScale && (l.normalScale.y *= -1), l.clearcoatNormalScale && (l.clearcoatNormalScale.y *= -1)), this.cache.add(a, l), this.associations.set(l, this.associations.get(n))), n = l;\n }\n e.material = n;\n }\n getMaterialType() {\n return jo;\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n *\n * @private\n * @param {number} materialIndex\n * @return {Promise}\n */\n loadMaterial(e) {\n const t = this, n = this.json, i = this.extensions, o = n.materials[e];\n let r;\n const a = {}, l = o.extensions || {}, h = [];\n if (l[le.KHR_MATERIALS_UNLIT]) {\n const u = i[le.KHR_MATERIALS_UNLIT];\n r = u.getMaterialType(), h.push(u.extendParams(a, o, t));\n } else {\n const u = o.pbrMetallicRoughness || {};\n if (a.color = new je(1, 1, 1), a.opacity = 1, Array.isArray(u.baseColorFactor)) {\n const d = u.baseColorFactor;\n a.color.setRGB(d[0], d[1], d[2], lt), a.opacity = d[3];\n }\n u.baseColorTexture !== void 0 && h.push(t.assignTexture(a, \"map\", u.baseColorTexture, Rt)), a.metalness = u.metallicFactor !== void 0 ? u.metallicFactor : 1, a.roughness = u.roughnessFactor !== void 0 ? u.roughnessFactor : 1, u.metallicRoughnessTexture !== void 0 && (h.push(t.assignTexture(a, \"metalnessMap\", u.metallicRoughnessTexture)), h.push(t.assignTexture(a, \"roughnessMap\", u.metallicRoughnessTexture))), r = this._invokeOne(function(d) {\n return d.getMaterialType && d.getMaterialType(e);\n }), h.push(Promise.all(this._invokeAll(function(d) {\n return d.extendMaterialParams && d.extendMaterialParams(e, a);\n })));\n }\n o.doubleSided === !0 && (a.side = Vi);\n const c = o.alphaMode || rs.OPAQUE;\n if (c === rs.BLEND ? (a.transparent = !0, a.depthWrite = !1) : (a.transparent = !1, c === rs.MASK && (a.alphaTest = o.alphaCutoff !== void 0 ? o.alphaCutoff : 0.5)), o.normalTexture !== void 0 && r !== hn && (h.push(t.assignTexture(a, \"normalMap\", o.normalTexture)), a.normalScale = new ce(1, 1), o.normalTexture.scale !== void 0)) {\n const u = o.normalTexture.scale;\n a.normalScale.set(u, u);\n }\n if (o.occlusionTexture !== void 0 && r !== hn && (h.push(t.assignTexture(a, \"aoMap\", o.occlusionTexture)), o.occlusionTexture.strength !== void 0 && (a.aoMapIntensity = o.occlusionTexture.strength)), o.emissiveFactor !== void 0 && r !== hn) {\n const u = o.emissiveFactor;\n a.emissive = new je().setRGB(u[0], u[1], u[2], lt);\n }\n return o.emissiveTexture !== void 0 && r !== hn && h.push(t.assignTexture(a, \"emissiveMap\", o.emissiveTexture, Rt)), Promise.all(h).then(function() {\n const u = new r(a);\n return o.name && (u.name = o.name), rt(u, o), t.associations.set(u, { materials: e }), o.extensions && Nt(i, u, o), u;\n });\n }\n /**\n * When Object3D instances are targeted by animation, they need unique names.\n *\n * @private\n * @param {string} originalName\n * @return {string}\n */\n createUniqueName(e) {\n const t = yl.sanitizeNodeName(e || \"\");\n return t in this.nodeNamesUsed ? t + \"_\" + ++this.nodeNamesUsed[t] : (this.nodeNamesUsed[t] = 0, t);\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n *\n * Creates BufferGeometries from primitives.\n *\n * @private\n * @param {Array} primitives\n * @return {Promise>}\n */\n loadGeometries(e) {\n const t = this, n = this.extensions, i = this.primitiveCache;\n function o(a) {\n return n[le.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(a, t).then(function(l) {\n return Xr(l, a, t);\n });\n }\n const r = [];\n for (let a = 0, l = e.length; a < l; a++) {\n const h = e[a], c = Eu(h), u = i[c];\n if (u)\n r.push(u.promise);\n else {\n let d;\n h.extensions && h.extensions[le.KHR_DRACO_MESH_COMPRESSION] ? d = o(h) : d = Xr(new Fi(), h, t), i[c] = { primitive: h, promise: d }, r.push(d);\n }\n }\n return Promise.all(r);\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n *\n * @private\n * @param {number} meshIndex\n * @return {Promise}\n */\n loadMesh(e) {\n const t = this, n = this.json, i = this.extensions, o = n.meshes[e], r = o.primitives, a = [];\n for (let l = 0, h = r.length; l < h; l++) {\n const c = r[l].material === void 0 ? vu(this.cache) : this.getDependency(\"material\", r[l].material);\n a.push(c);\n }\n return a.push(t.loadGeometries(r)), Promise.all(a).then(function(l) {\n const h = l.slice(0, l.length - 1), c = l[l.length - 1], u = [];\n for (let p = 0, f = c.length; p < f; p++) {\n const m = c[p], g = r[p];\n let y;\n const w = h[p];\n if (g.mode === We.TRIANGLES || g.mode === We.TRIANGLE_STRIP || g.mode === We.TRIANGLE_FAN || g.mode === void 0)\n y = o.isSkinnedMesh === !0 ? new wl(m, w) : new Qs(m, w), y.isSkinnedMesh === !0 && y.normalizeSkinWeights(), g.mode === We.TRIANGLE_STRIP ? y.geometry = jr(y.geometry, Uo) : g.mode === We.TRIANGLE_FAN && (y.geometry = jr(y.geometry, Rs));\n else if (g.mode === We.LINES)\n y = new _l(m, w);\n else if (g.mode === We.LINE_STRIP)\n y = new xl(m, w);\n else if (g.mode === We.LINE_LOOP)\n y = new bl(m, w);\n else if (g.mode === We.POINTS)\n y = new vl(m, w);\n else\n throw new Error(\"THREE.GLTFLoader: Primitive mode unsupported: \" + g.mode);\n Object.keys(y.geometry.morphAttributes).length > 0 && Tu(y, o), y.name = t.createUniqueName(o.name || \"mesh_\" + e), rt(y, o), g.extensions && Nt(i, y, g), t.assignFinalMaterial(y), u.push(y);\n }\n for (let p = 0, f = u.length; p < f; p++)\n t.associations.set(u[p], {\n meshes: e,\n primitives: p\n });\n if (u.length === 1)\n return o.extensions && Nt(i, u[0], o), u[0];\n const d = new Yi();\n o.extensions && Nt(i, d, o), t.associations.set(d, { meshes: e });\n for (let p = 0, f = u.length; p < f; p++)\n d.add(u[p]);\n return d;\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n *\n * @private\n * @param {number} cameraIndex\n * @return {Promise|undefined}\n */\n loadCamera(e) {\n let t;\n const n = this.json.cameras[e], i = n[n.type];\n if (!i) {\n console.warn(\"THREE.GLTFLoader: Missing camera parameters.\");\n return;\n }\n return n.type === \"perspective\" ? t = new Sl(Lo.radToDeg(i.yfov), i.aspectRatio || 1, i.znear || 1, i.zfar || 2e6) : n.type === \"orthographic\" && (t = new Bo(-i.xmag, i.xmag, i.ymag, -i.ymag, i.znear, i.zfar)), n.name && (t.name = this.createUniqueName(n.name)), rt(t, n), Promise.resolve(t);\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n *\n * @private\n * @param {number} skinIndex\n * @return {Promise}\n */\n loadSkin(e) {\n const t = this.json.skins[e], n = [];\n for (let i = 0, o = t.joints.length; i < o; i++)\n n.push(this._loadNodeShallow(t.joints[i]));\n return t.inverseBindMatrices !== void 0 ? n.push(this.getDependency(\"accessor\", t.inverseBindMatrices)) : n.push(null), Promise.all(n).then(function(i) {\n const o = i.pop(), r = i, a = [], l = [];\n for (let h = 0, c = r.length; h < c; h++) {\n const u = r[h];\n if (u) {\n a.push(u);\n const d = new Ae();\n o !== null && d.fromArray(o.array, h * 16), l.push(d);\n } else\n console.warn('THREE.GLTFLoader: Joint \"%s\" could not be found.', t.joints[h]);\n }\n return new Tl(a, l);\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n *\n * @private\n * @param {number} animationIndex\n * @return {Promise}\n */\n loadAnimation(e) {\n const t = this.json, n = this, i = t.animations[e], o = i.name ? i.name : \"animation_\" + e, r = [], a = [], l = [], h = [], c = [];\n for (let u = 0, d = i.channels.length; u < d; u++) {\n const p = i.channels[u], f = i.samplers[p.sampler], m = p.target, g = m.node, y = i.parameters !== void 0 ? i.parameters[f.input] : f.input, w = i.parameters !== void 0 ? i.parameters[f.output] : f.output;\n m.node !== void 0 && (r.push(this.getDependency(\"node\", g)), a.push(this.getDependency(\"accessor\", y)), l.push(this.getDependency(\"accessor\", w)), h.push(f), c.push(m));\n }\n return Promise.all([\n Promise.all(r),\n Promise.all(a),\n Promise.all(l),\n Promise.all(h),\n Promise.all(c)\n ]).then(function(u) {\n const d = u[0], p = u[1], f = u[2], m = u[3], g = u[4], y = [];\n for (let _ = 0, x = d.length; _ < x; _++) {\n const b = d[_], A = p[_], M = f[_], C = m[_], P = g[_];\n if (b === void 0) continue;\n b.updateMatrix && b.updateMatrix();\n const k = n._createAnimationTracks(b, A, M, C, P);\n if (k)\n for (let B = 0; B < k.length; B++)\n y.push(k[B]);\n }\n const w = new El(o, void 0, y);\n return rt(w, i), w;\n });\n }\n createNodeMesh(e) {\n const t = this.json, n = this, i = t.nodes[e];\n return i.mesh === void 0 ? null : n.getDependency(\"mesh\", i.mesh).then(function(o) {\n const r = n._getNodeRef(n.meshCache, i.mesh, o);\n return i.weights !== void 0 && r.traverse(function(a) {\n if (a.isMesh)\n for (let l = 0, h = i.weights.length; l < h; l++)\n a.morphTargetInfluences[l] = i.weights[l];\n }), r;\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n *\n * @private\n * @param {number} nodeIndex\n * @return {Promise}\n */\n loadNode(e) {\n const t = this.json, n = this, i = t.nodes[e], o = n._loadNodeShallow(e), r = [], a = i.children || [];\n for (let h = 0, c = a.length; h < c; h++)\n r.push(n.getDependency(\"node\", a[h]));\n const l = i.skin === void 0 ? Promise.resolve(null) : n.getDependency(\"skin\", i.skin);\n return Promise.all([\n o,\n Promise.all(r),\n l\n ]).then(function(h) {\n const c = h[0], u = h[1], d = h[2];\n d !== null && c.traverse(function(p) {\n p.isSkinnedMesh && p.bind(d, Au);\n });\n for (let p = 0, f = u.length; p < f; p++)\n c.add(u[p]);\n return c;\n });\n }\n // ._loadNodeShallow() parses a single node.\n // skin and child nodes are created and added in .loadNode() (no '_' prefix).\n _loadNodeShallow(e) {\n const t = this.json, n = this.extensions, i = this;\n if (this.nodeCache[e] !== void 0)\n return this.nodeCache[e];\n const o = t.nodes[e], r = o.name ? i.createUniqueName(o.name) : \"\", a = [], l = i._invokeOne(function(h) {\n return h.createNodeMesh && h.createNodeMesh(e);\n });\n return l && a.push(l), o.camera !== void 0 && a.push(i.getDependency(\"camera\", o.camera).then(function(h) {\n return i._getNodeRef(i.cameraCache, o.camera, h);\n })), i._invokeAll(function(h) {\n return h.createNodeAttachment && h.createNodeAttachment(e);\n }).forEach(function(h) {\n a.push(h);\n }), this.nodeCache[e] = Promise.all(a).then(function(h) {\n let c;\n if (o.isBone === !0 ? c = new Ml() : h.length > 1 ? c = new Yi() : h.length === 1 ? c = h[0] : c = new Fo(), c !== h[0])\n for (let u = 0, d = h.length; u < d; u++)\n c.add(h[u]);\n if (o.name && (c.userData.name = o.name, c.name = r), rt(c, o), o.extensions && Nt(n, c, o), o.matrix !== void 0) {\n const u = new Ae();\n u.fromArray(o.matrix), c.applyMatrix4(u);\n } else\n o.translation !== void 0 && c.position.fromArray(o.translation), o.rotation !== void 0 && c.quaternion.fromArray(o.rotation), o.scale !== void 0 && c.scale.fromArray(o.scale);\n if (!i.associations.has(c))\n i.associations.set(c, {});\n else if (o.mesh !== void 0 && i.meshCache.refs[o.mesh] > 1) {\n const u = i.associations.get(c);\n i.associations.set(c, { ...u });\n }\n return i.associations.get(c).nodes = e, c;\n }), this.nodeCache[e];\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n *\n * @private\n * @param {number} sceneIndex\n * @return {Promise}\n */\n loadScene(e) {\n const t = this.extensions, n = this.json.scenes[e], i = this, o = new Yi();\n n.name && (o.name = i.createUniqueName(n.name)), rt(o, n), n.extensions && Nt(t, o, n);\n const r = n.nodes || [], a = [];\n for (let l = 0, h = r.length; l < h; l++)\n a.push(i.getDependency(\"node\", r[l]));\n return Promise.all(a).then(function(l) {\n for (let c = 0, u = l.length; c < u; c++)\n o.add(l[c]);\n const h = (c) => {\n const u = /* @__PURE__ */ new Map();\n for (const [d, p] of i.associations)\n (d instanceof Zi || d instanceof gr) && u.set(d, p);\n return c.traverse((d) => {\n const p = i.associations.get(d);\n p != null && u.set(d, p);\n }), u;\n };\n return i.associations = h(o), o;\n });\n }\n _createAnimationTracks(e, t, n, i, o) {\n const r = [], a = e.name ? e.name : e.uuid, l = [];\n Tt[o.path] === Tt.weights ? e.traverse(function(d) {\n d.morphTargetInfluences && l.push(d.name ? d.name : d.uuid);\n }) : l.push(a);\n let h;\n switch (Tt[o.path]) {\n case Tt.weights:\n h = wr;\n break;\n case Tt.rotation:\n h = _r;\n break;\n case Tt.translation:\n case Tt.scale:\n h = yr;\n break;\n default:\n switch (n.itemSize) {\n case 1:\n h = wr;\n break;\n case 2:\n case 3:\n default:\n h = yr;\n break;\n }\n break;\n }\n const c = i.interpolation !== void 0 ? bu[i.interpolation] : Ho, u = this._getArrayFromAccessor(n);\n for (let d = 0, p = l.length; d < p; d++) {\n const f = new h(\n l[d] + \".\" + Tt[o.path],\n t.array,\n u,\n c\n );\n i.interpolation === \"CUBICSPLINE\" && this._createCubicSplineTrackInterpolant(f), r.push(f);\n }\n return r;\n }\n _getArrayFromAccessor(e) {\n let t = e.array;\n if (e.normalized) {\n const n = Us(t.constructor), i = new Float32Array(t.length);\n for (let o = 0, r = t.length; o < r; o++)\n i[o] = t[o] * n;\n t = i;\n }\n return t;\n }\n _createCubicSplineTrackInterpolant(e) {\n e.createInterpolant = function(n) {\n const i = this instanceof _r ? xu : ba;\n return new i(this.times, this.values, this.getValueSize() / 3, n);\n }, e.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = !0;\n }\n}\nfunction Pu(s, e, t) {\n const n = e.attributes, i = new nt();\n if (n.POSITION !== void 0) {\n const a = t.json.accessors[n.POSITION], l = a.min, h = a.max;\n if (l !== void 0 && h !== void 0) {\n if (i.set(\n new Z(l[0], l[1], l[2]),\n new Z(h[0], h[1], h[2])\n ), a.normalized) {\n const c = Us(mn[a.componentType]);\n i.min.multiplyScalar(c), i.max.multiplyScalar(c);\n }\n } else {\n console.warn(\"THREE.GLTFLoader: Missing min/max properties for accessor POSITION.\");\n return;\n }\n } else\n return;\n const o = e.targets;\n if (o !== void 0) {\n const a = new Z(), l = new Z();\n for (let h = 0, c = o.length; h < c; h++) {\n const u = o[h];\n if (u.POSITION !== void 0) {\n const d = t.json.accessors[u.POSITION], p = d.min, f = d.max;\n if (p !== void 0 && f !== void 0) {\n if (l.setX(Math.max(Math.abs(p[0]), Math.abs(f[0]))), l.setY(Math.max(Math.abs(p[1]), Math.abs(f[1]))), l.setZ(Math.max(Math.abs(p[2]), Math.abs(f[2]))), d.normalized) {\n const m = Us(mn[d.componentType]);\n l.multiplyScalar(m);\n }\n a.max(l);\n } else\n console.warn(\"THREE.GLTFLoader: Missing min/max properties for accessor POSITION.\");\n }\n }\n i.expandByVector(a);\n }\n s.boundingBox = i;\n const r = new Pl();\n i.getCenter(r.center), r.radius = i.min.distanceTo(i.max) / 2, s.boundingSphere = r;\n}\nfunction Xr(s, e, t) {\n const n = e.attributes, i = [];\n function o(r, a) {\n return t.getDependency(\"accessor\", r).then(function(l) {\n s.setAttribute(a, l);\n });\n }\n for (const r in n) {\n const a = Os[r] || r.toLowerCase();\n a in s.attributes || i.push(o(n[r], a));\n }\n if (e.indices !== void 0 && !s.index) {\n const r = t.getDependency(\"accessor\", e.indices).then(function(a) {\n s.setIndex(a);\n });\n i.push(r);\n }\n return Li.workingColorSpace !== lt && \"COLOR_0\" in n && console.warn(`THREE.GLTFLoader: Converting vertex colors from \"srgb-linear\" to \"${Li.workingColorSpace}\" not supported.`), rt(s, e), Pu(s, e, t), Promise.all(i).then(function() {\n return e.targets !== void 0 ? Su(s, e.targets, t) : s;\n });\n}\nfunction ku(s, e, t) {\n let n = new E.Group();\n n.name = e, s.scene.add(n), _a(e + \"/info\", (i) => {\n let o = JSON.parse(i);\n s.engineStatus.models.push({\n type: \"light\",\n info: o,\n name: o.baseInfo.name,\n status: \"loading\",\n url: e,\n elements: /* @__PURE__ */ new Map()\n }), s.models == null && (s.models = []), s.models.push({\n url: e,\n nodesMap: /* @__PURE__ */ new Map(),\n boundingBox: {\n min: new E.Vector3(o.baseInfo.min.X * 0.3048, o.baseInfo.min.Z * 0.3048, -o.baseInfo.min.Y * 0.3048),\n max: new E.Vector3(o.baseInfo.max.X * 0.3048, o.baseInfo.max.Z * 0.3048, -o.baseInfo.max.Y * 0.3048)\n }\n }), s.events.trigger(_n.EngineFree, null);\n });\n}\nfunction Ru(s) {\n s.engineStatus.models.forEach((e) => {\n e.loadStatus == null && (e.loadStatus = {\n mep: !1,\n instance: !1,\n normal: !1\n }), e.status === \"loading\" && e.type === \"light\" && (e.loadStatus.modelMep != !0 && (e.loadStatus.modelMep = !0, qh(s, e.info.modelMep, e.url)), e.loadStatus.normal != !0 && Du(s, e));\n });\n}\nfunction Du(s, e) {\n if (s.camera.position, e.size, e.info == null || e.info.lods == null)\n return;\n e.info.lods.forEach((i) => {\n if (i.status != !0)\n if (i.glbs == null)\n console.log(\"加载GLB.............\"), i.glbs = {}, Gh(e.url + i.path, (o) => {\n Hh(o.get(\"/nodes.json\"), (r) => {\n let a = JSON.parse(r), l = /* @__PURE__ */ new Map();\n s.models.find((c) => c.url == e.url).nodesMap = l;\n let h = 0;\n for (let c in a) {\n a[c].forEach((p) => {\n p.glb = c, l.has(p.id) == !1 ? l.set(p.id, { infos: [p] }) : l.get(p.id).infos.push(p);\n });\n let u = new Zh();\n const d = new Wh();\n d.setDecoderPath(\"/static/js/draco/\"), d.preload(), u.setDRACOLoader(d), u.load(o.get(c + \".glb\"), (p) => {\n i.glbs[c] = p.scene.children, h++, h == Object.keys(a).length && s.engineStatus.isFree && (s.events.trigger(_n.EngineFree, null), s.viewCube.CameraGoHome());\n });\n }\n });\n });\n else {\n console.log(\"加载模型.............\");\n let o = n(e, i, i.octreeBox), r = [], a = s.models.find((l) => l.url == e.url);\n o.forEach((l) => {\n a.nodesMap.has(l) && a.nodesMap.get(l).infos.forEach((h) => {\n let c = i.glbs[h.glb][h.mesh];\n if (c != null && c.geometry != null && c.material != null) {\n let u = new E.Matrix4();\n u.elements = h.matrix;\n let d = new E.Mesh(c.geometry.clone().applyMatrix4(u), c.material), p = new E.Box3().setFromObject(d);\n h.box = p, h.mesh = d, d.name = l, d.glb = h.glb, d.url = e.url, r.push(d);\n }\n });\n }), console.log(\"加载模型数量\", r.length), Lu(e.url, s, r);\n }\n });\n function n(i, o, r) {\n let a = [];\n if (r.status != !0) {\n if (!s.engineStatus.isFree)\n return a;\n let l = new E.Vector3(r.min.X, r.min.Z, -r.min.Y), h = new E.Vector3(r.max.X, r.max.Z, -r.max.Y);\n h.distanceTo(l);\n let c = s.camera.position, u = new E.Vector3(l.x + h.x / 2, l.y + h.y / 2, l.z + h.z / 2);\n c.distanceTo(u), r.elements.forEach((d) => {\n a.push(d);\n }), r.children.forEach((d) => {\n a.push(...n(i, o, d));\n }), r.children.findIndex((d) => d.status != !0) == -1 && (r.status = !0), r.children.length == 0 && (r.status = !0);\n }\n return a;\n }\n}\nfunction Lu(s, e, t) {\n let n = [];\n t.forEach((i) => {\n n.findIndex((r) => r.glb == i.glb) == -1 ? n.push({\n glb: i.glb,\n meshes: [i],\n currentIndex: i.geometry.index.count,\n indexes: /* @__PURE__ */ new Map()\n }) : (n.find((r) => r.glb == i.glb).meshes.push(i), n.find((r) => r.glb == i.glb).currentIndex += i.geometry.index.count);\n let o = n.find((r) => r.glb == i.glb);\n o.indexes.set(Number(i.name), [o.currentIndex - i.geometry.index.count, o.currentIndex]);\n }), n.forEach((i) => {\n let o = e.scene.children.find((r) => r instanceof E.Mesh && r.url == s && r.glb == i.glb);\n if (o != null)\n o.castShadow = !0, o.receiveShadow = !0;\n else {\n let r = new E.BufferGeometry();\n i.meshes.map((h) => h.material), r = Kh(i.meshes.map((h) => h.geometry), !0);\n let a = new E.Mesh(r, i.meshes.map((h) => h.material));\n a.castShadow = !0, a.receiveShadow = !0, e.scene.add(a), a.index = e.scene.children.length - 1, a.url = s, a.glb = i.glb, a.indexes = i.indexes, a.materialClone = i.meshes[0].material;\n let l = e.models.find((h) => h.url == s);\n if (l != null) {\n let h = 0;\n i.indexes.forEach((c) => {\n l.nodesMap.get(Number(i.meshes[h].name)).indexes == null && (l.nodesMap.get(Number(i.meshes[h].name)).indexes = []), l.nodesMap.get(Number(i.meshes[h].name)).indexes.push([a.index, h++, c[0], c[1]]);\n });\n }\n a.material instanceof Array ? a.material.forEach((h) => {\n qr(h);\n }) : qr(a.material);\n }\n });\n}\nfunction qr(s) {\n s.shadowSide = E.FrontSide, s.roughness = 0.6, s.metalness = 0, s.side = E.DoubleSide, s.map != null && (s.map.colorSpace = E.SRGBColorSpace, s.map.needsUpdate = !0, console.log(\"优化贴图\")), s instanceof E.MeshStandardMaterial && (s.map && (s.map.colorSpace = E.SRGBColorSpace, s.map.needsUpdate = !0), s.emissiveMap && (s.emissiveMap.colorSpace = E.SRGBColorSpace, s.emissiveMap.needsUpdate = !0), s.roughnessMap && (s.roughnessMap.colorSpace = E.LinearSRGBColorSpace, s.roughnessMap.needsUpdate = !0), s.metalnessMap && (s.metalnessMap.colorSpace = E.LinearSRGBColorSpace, s.metalnessMap.needsUpdate = !0), s.normalMap && (s.normalMap.colorSpace = E.LinearSRGBColorSpace, s.normalMap.needsUpdate = !0), s.aoMap && (s.aoMap.colorSpace = E.LinearSRGBColorSpace, s.aoMap.needsUpdate = !0), s.roughness = Math.max(0.1, Math.min(1, s.roughness)), s.metalness = Math.max(0, Math.min(1, s.metalness)), s.envMapIntensity = s.envMapIntensity || 1, s.needsUpdate = !0), s instanceof E.MeshPhysicalMaterial && (this.optimizeMaterial(s), s.transmissionMap && (s.transmissionMap.colorSpace = E.LinearSRGBColorSpace, s.transmissionMap.needsUpdate = !0), s.thicknessMap && (s.thicknessMap.colorSpace = E.LinearSRGBColorSpace, s.thicknessMap.needsUpdate = !0), s.transmission = Math.max(0, Math.min(1, s.transmission)), s.thickness = Math.max(0, Math.min(10, s.thickness))), s instanceof E.MeshBasicMaterial && s.map && (s.map.colorSpace = E.SRGBColorSpace, s.map.needsUpdate = !0), s instanceof E.MeshLambertMaterial && (s.map && (s.map.colorSpace = E.SRGBColorSpace, s.map.needsUpdate = !0), s.emissiveMap && (s.emissiveMap.colorSpace = E.SRGBColorSpace, s.emissiveMap.needsUpdate = !0));\n}\nclass Bu {\n engine;\n constructor(e) {\n this.engine = e;\n }\n // 加载多个模型\n async loadModels(e, t) {\n for (const i of e)\n n(i) === \"light\" && ku(this.engine, i);\n function n(i) {\n const o = i.split(\".\").pop();\n return o === \"glb\" || o === \"gltf\" ? \"gltf\" : \"light\";\n }\n }\n}\nclass Iu {\n engine;\n isFree;\n highlightModels;\n hideModels;\n models;\n constructor(e) {\n this.engine = e, this.isFree = !0, this.highlightModels = [], this.hideModels = [], this.models = [];\n }\n init() {\n this.engine.events.on(_n.EngineFree, () => {\n this.updateFree(!0), console.log(\"引擎空闲\"), Ru(this.engine);\n }), this.engine.events.on(_n.EngineBusy, () => {\n this.updateFree(!1), console.log(\"引擎繁忙\");\n });\n }\n // 更新引擎空闲状态\n updateFree(e) {\n this.isFree = e;\n }\n // 关闭所有功能\n closeAllFunction = () => {\n };\n}\nclass zu {\n listeners = /* @__PURE__ */ new Map();\n on(e, t) {\n this.listeners.has(e) || this.listeners.set(e, []), this.listeners.get(e).push(t);\n }\n off(e, t) {\n if (!this.listeners.has(e)) return;\n const n = this.listeners.get(e), i = n.indexOf(t);\n i !== -1 && n.splice(i, 1);\n }\n trigger(e, t) {\n this.listeners.has(e) && this.listeners.get(e).forEach((n) => {\n try {\n n(t);\n } catch (i) {\n console.error(`Error in event listener for ${e}:`, i);\n }\n });\n }\n}\nclass Nu {\n engine;\n constructor(e) {\n this.engine = e;\n }\n // 加入场景基本光照\n init() {\n const e = new E.DirectionalLight(16777215, 2);\n e.position.set(10, 20, 10), e.castShadow = !0, e.shadow.mapSize.width = 4096, e.shadow.mapSize.height = 4096, e.shadow.camera.near = 0.1, e.shadow.camera.far = 500, e.shadow.bias = -5e-5, e.shadow.normalBias = 0.02;\n const t = 50;\n e.shadow.camera.left = -t, e.shadow.camera.right = t, e.shadow.camera.top = t, e.shadow.camera.bottom = -t, e.shadow.radius = 2, this.engine.scene.add(e);\n const n = new E.AmbientLight(16777215, 1);\n this.engine.scene.add(n);\n }\n}\nvar wt = /* @__PURE__ */ ((s) => (s.ModelLoadStart = \"model-load-start\", s.ModelLoadProgress = \"model-load-progress\", s.ModelLoaded = \"model-loaded\", s.ModelError = \"model-error\", s.SelectionChanged = \"selection-changed\", s.HoverChanged = \"hover-changed\", s.Click = \"click\", s.MouseMove = \"mouse-move\", s.CameraChanged = \"camera-changed\", s.CameraIdle = \"camera-idle\", s.EngineFree = \"engine-free\", s.EngineBusy = \"engine-busy\", s.MeasureChanged = \"measure-changed\", s))(wt || {});\nclass Ou {\n engine;\n behavior;\n isCtrlDown = !1;\n constructor(e) {\n this.engine = e;\n }\n init() {\n this.behavior = this.engine.handelBehaved, this.behavior.init(this);\n }\n active() {\n this.behavior.active();\n }\n disActive() {\n this.behavior.disActive();\n }\n // 键盘事件\n handelKeyCtrlUp() {\n this.isCtrlDown = !1;\n }\n handelKeyCtrlDown() {\n this.isCtrlDown = !0;\n }\n // 业务功能-监听鼠标谈起,点选模型\n handleMouseClick(e) {\n if (this.handleMouseClickInstance(e.raycaster), e.catch) {\n const t = e.catch;\n t.object, this.engine.events.trigger(wt.Click, t);\n let n = t.object;\n this.isCtrlDown || this.engine.modelToolModule.unhighlightAllModels(), console.log([{ url: n.url, ids: [n.name] }]), this.engine.controlModule.orbitControls.origin.set(t.point.x, t.point.y, t.point.z), this.engine.modelToolModule.highlightModel([{ url: n.url, ids: [n.name] }]);\n } else\n this.engine.modelToolModule.unhighlightAllModels();\n }\n // 双击模型事件\n handleMouseDoubleClick(e) {\n if (e.catch) {\n const n = e.catch;\n n.object, this.engine.events.trigger(wt.Click, n);\n let i = n.object, a = this.engine.models.find((h) => h.url === i.url).nodesMap.get(i.name).infos.map((h) => h.box), l = t(a);\n this.engine.viewCube.zoomToModel(l);\n }\n function t(n) {\n let i = new E.Vector3(1e8, 1e9, 1e10), o = new E.Vector3(-1e8, -1e9, -1e10);\n return n.forEach((r) => {\n r.min.x < i.x && (i.x = r.min.x), r.min.y < i.y && (i.y = r.min.y), r.min.z < i.z && (i.z = r.min.z), r.max.x > o.x && (o.x = r.max.x), r.max.y > o.y && (o.y = r.max.y), r.max.z > o.z && (o.z = r.max.z);\n }), new E.Box3(i, o);\n }\n }\n // 判断点击instance节点\n handleMouseClickInstance(e) {\n return e.intersectObjects(this.engine.scene.children.filter((n) => n instanceof E.InstancedMesh), !0);\n }\n}\nclass Uu {\n engine;\n highlightMaterial;\n hideMaterial;\n constructor(e) {\n this.engine = e, this.highlightMaterial = new E.MeshBasicMaterial({\n color: 43775,\n // 明显的蓝色\n depthTest: !1,\n // 不进行深度测试,始终显示\n depthWrite: !1,\n // 不写入深度缓冲\n transparent: !0,\n opacity: 0.5,\n // 半透明效果\n side: E.DoubleSide\n // 双面渲染\n }), this.hideMaterial = new E.MeshBasicMaterial({\n color: 0,\n // 明显的蓝色\n depthTest: !1,\n // 不进行深度测试,始终显示\n depthWrite: !1,\n // 不写入深度缓冲\n transparent: !0,\n opacity: 0,\n // 半透明效果\n side: E.DoubleSide\n // 双面渲染\n });\n }\n // 设置模型高亮\n highlightModel(e) {\n e.forEach((t) => {\n t.ids.forEach((n) => {\n this.engine.models.find((o) => o.url == t.url).nodesMap.get(n).indexes.forEach((o) => {\n Kr(this.engine.scene.children[o[0]]), this.engine.scene.children[o[0]].material[o[1]] = this.highlightMaterial;\n });\n }), this.engine.engineStatus.highlightModels.push(t);\n });\n }\n // 取消模型高亮\n unhighlightModel(e) {\n e.forEach((t) => {\n t.ids.forEach((n) => {\n this.engine.models.find((o) => o.url == t.url).nodesMap.get(n).indexes.forEach((o) => {\n this.engine.scene.children[o[0]].material[o[1]] = this.engine.scene.children[o[0]].materialClone;\n });\n });\n });\n }\n // 取消所有模型高亮\n unhighlightAllModels() {\n this.engine.engineStatus.highlightModels.forEach((e) => {\n this.unhighlightModel([e]);\n }), this.engine.engineStatus.highlightModels = [];\n }\n // 隐藏模型\n hideModel(e) {\n e.forEach((t) => {\n t.ids.forEach((i) => {\n let o = this.engine.models.find((r) => r.url == t.url).nodesMap.get(i);\n this.engine.modelEdge.hideModelEdge(t.url, i), o.indexes.forEach((r) => {\n Kr(this.engine.scene.children[r[0]]), this.engine.scene.children[r[0]].material[r[1]] = this.hideMaterial;\n });\n });\n let n = this.engine.engineStatus.hideModels.find((i) => i.url == t.url);\n n != null ? n.ids.push(...t.ids) : this.engine.engineStatus.hideModels.push({\n url: t.url,\n ids: t.ids\n }), this.engine.engineStatus.highlightModels = [];\n });\n }\n // 显示模型\n showModel(e) {\n e.forEach((t) => {\n t.ids.forEach((n) => {\n let i = this.engine.models.find((o) => o.url == t.url).nodesMap.get(n);\n this.engine.modelEdge.showModelEdge(t.url, n), i.indexes.forEach((o) => {\n this.engine.scene.children[o[0]].material[o[1]] = this.engine.scene.children[o[0]].materialClone;\n });\n }), this.engine.engineStatus.hideModels.push(t);\n });\n }\n // 隔离模型 - 只显示传入的模型,隐藏其他所有模型\n isolateModel(e) {\n const t = [];\n this.engine.models.forEach((i) => {\n const o = Array.from(i.nodesMap.keys());\n t.push({\n url: i.url,\n ids: o\n });\n });\n const n = [];\n t.forEach((i) => {\n const o = e.find((r) => r.url === i.url);\n if (o) {\n const r = i.ids.filter((a) => !o.ids.includes(a));\n r.length > 0 && n.push({\n url: i.url,\n ids: r\n });\n } else\n n.push(i);\n }), n.length > 0 && this.hideModel(n);\n }\n // 显示所有模型\n showAllModels() {\n }\n // 设置模型颜色\n setModelColor(e, t) {\n e.material.color.set(t);\n }\n // 设置所有模型颜色\n setAllModelsColor(e) {\n this.engine.scene.children.forEach((t) => {\n t.isMesh;\n });\n }\n // 恢复所有模型颜色\n restoreAllModelsColor() {\n this.engine.scene.children.forEach((e) => {\n e.isMesh;\n });\n }\n // 获取当前选中模型的box包围盒\n getModelsBox(e) {\n new E.Box3();\n let t = [];\n return e.forEach((i) => {\n let o = this.engine.models.find((r) => r.url == i.url);\n i.ids.forEach((r) => {\n o.nodesMap.get(r).infos.forEach((l) => {\n t.push(l.box);\n });\n });\n }), n(t);\n function n(i) {\n let o = new E.Vector3(1e8, 1e9, 1e10), r = new E.Vector3(-1e8, -1e9, -1e10);\n return i.forEach((a) => {\n a.min.x < o.x && (o.x = a.min.x), a.min.y < o.y && (o.y = a.min.y), a.min.z < o.z && (o.z = a.min.z), a.max.x > r.x && (r.x = a.max.x), a.max.y > r.y && (r.y = a.max.y), a.max.z > r.z && (r.z = a.max.z);\n }), new E.Box3(o, r);\n }\n }\n // 获取模型的精准位置描述,给大模型用的,主要是\n getModelDescription(e) {\n }\n}\nfunction Kr(s) {\n (s.isSplit == null || s.isSplit == null || s.isSplit == !1) && (s.isSplit = !0);\n}\nclass Ge {\n /**\n * 构造函数\n * @param camera - Three.js 相机对象(用于投影计算)\n * @param renderer - Three.js 渲染器对象(用于获取画布尺寸)\n * @param scene - Three.js 场景对象(用于屏幕坐标转世界坐标时的射线检测,可选)\n */\n constructor(e, t, n) {\n this.camera = e, this.renderer = t, this.scene = n, this.raycaster = new E.Raycaster();\n }\n raycaster;\n /**\n * 将世界坐标转换为屏幕坐标(归一化坐标,范围 -1 到 1)\n * @param worldPos - 世界空间中的3D坐标点\n * @returns 归一化的屏幕坐标,x 和 y 的范围都是 -1 到 1\n * x: -1 表示屏幕左边缘,1 表示屏幕右边缘\n * y: -1 表示屏幕下边缘,1 表示屏幕上边缘\n */\n worldToScreenNormalized(e) {\n const t = e.clone();\n return t.project(this.camera), new E.Vector2(t.x, t.y);\n }\n /**\n * 将世界坐标转换为屏幕坐标(像素坐标)\n * @param worldPos - 世界空间中的3D坐标点\n * @returns 屏幕像素坐标,x 和 y 表示在画布上的实际像素位置\n * x: 0 表示屏幕左边缘,width 表示屏幕右边缘\n * y: 0 表示屏幕上边缘,height 表示屏幕下边缘\n */\n worldToScreen(e) {\n const t = this.worldToScreenNormalized(e), n = this.renderer.domElement.width, i = this.renderer.domElement.height, o = (t.x + 1) * n / 2, r = (1 - t.y) * i / 2;\n return new E.Vector2(o, r);\n }\n /**\n * 将屏幕坐标(像素坐标)转换为归一化坐标\n * @param screenX - 屏幕像素 X 坐标\n * @param screenY - 屏幕像素 Y 坐标\n * @returns 归一化的屏幕坐标,范围 -1 到 1\n */\n screenToNormalized(e, t) {\n const n = this.renderer.domElement.clientWidth, i = this.renderer.domElement.clientHeight, o = e / n * 2 - 1, r = -(t / i * 2 - 1);\n return new E.Vector2(o, r);\n }\n /**\n * 将屏幕坐标(像素坐标)转换为世界坐标\n * 使用射线检测,返回与场景中第一个相交对象的世界坐标点\n * @param screenX - 屏幕像素 X 坐标\n * @param screenY - 屏幕像素 Y 坐标\n * @param objects - 可选,指定要检测的对象数组。如果不提供且 scene 存在,则检测场景中的所有对象\n * @returns 世界坐标点,如果没有相交则返回 null\n */\n screenToWorld(e, t, n) {\n if (!this.scene && !n)\n return console.warn(\"WorldToScreen: 需要提供 scene 或 objects 参数才能进行屏幕坐标转世界坐标\"), null;\n const i = this.screenToNormalized(e, t);\n this.raycaster.setFromCamera(i, this.camera);\n const o = n || this.scene.children, r = this.raycaster.intersectObjects(o, !0);\n return r.length > 0 ? r[0].point : null;\n }\n /**\n * 将屏幕坐标转换为指定深度的世界坐标\n * @param screenX - 屏幕像素 X 坐标\n * @param screenY - 屏幕像素 Y 坐标\n * @param depth - 沿射线方向的距离(世界单位)\n * @returns 世界坐标点\n */\n screenToWorldWithDepth(e, t, n = 0) {\n const i = this.screenToNormalized(e, t);\n this.raycaster.setFromCamera(i, this.camera);\n const o = new E.Vector3();\n return this.raycaster.ray.at(n, o), o;\n }\n /**\n * 更新相机引用(当相机发生变化时调用)\n * @param camera - 新的相机对象\n */\n updateCamera(e) {\n this.camera = e;\n }\n /**\n * 更新渲染器引用(当渲染器发生变化时调用)\n * @param renderer - 新的渲染器对象\n */\n updateRenderer(e) {\n this.renderer = e;\n }\n /**\n * 更新场景引用(当场景发生变化时调用)\n * @param scene - 新的场景对象\n */\n updateScene(e) {\n this.scene = e;\n }\n}\nvar Mi = { exports: {} }, Fu = Mi.exports, Zr;\nfunction Vu() {\n return Zr || (Zr = 1, (function(s, e) {\n (function(t, n) {\n s.exports = n();\n })(Fu, function() {\n var t = function() {\n function n(p) {\n return r.appendChild(p.dom), p;\n }\n function i(p) {\n for (var f = 0; f < r.children.length; f++) r.children[f].style.display = f === p ? \"block\" : \"none\";\n o = p;\n }\n var o = 0, r = document.createElement(\"div\");\n r.style.cssText = \"position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000\", r.addEventListener(\"click\", function(p) {\n p.preventDefault(), i(++o % r.children.length);\n }, !1);\n var a = (performance || Date).now(), l = a, h = 0, c = n(new t.Panel(\"FPS\", \"#0ff\", \"#002\")), u = n(new t.Panel(\"MS\", \"#0f0\", \"#020\"));\n if (self.performance && self.performance.memory) var d = n(new t.Panel(\"MB\", \"#f08\", \"#201\"));\n return i(0), { REVISION: 16, dom: r, addPanel: n, showPanel: i, begin: function() {\n a = (performance || Date).now();\n }, end: function() {\n h++;\n var p = (performance || Date).now();\n if (u.update(p - a, 200), p > l + 1e3 && (c.update(1e3 * h / (p - l), 100), l = p, h = 0, d)) {\n var f = performance.memory;\n d.update(f.usedJSHeapSize / 1048576, f.jsHeapSizeLimit / 1048576);\n }\n return p;\n }, update: function() {\n a = this.end();\n }, domElement: r, setMode: i };\n };\n return t.Panel = function(n, i, o) {\n var r = 1 / 0, a = 0, l = Math.round, h = l(window.devicePixelRatio || 1), c = 80 * h, u = 48 * h, d = 3 * h, p = 2 * h, f = 3 * h, m = 15 * h, g = 74 * h, y = 30 * h, w = document.createElement(\"canvas\");\n w.width = c, w.height = u, w.style.cssText = \"width:80px;height:48px\";\n var _ = w.getContext(\"2d\");\n return _.font = \"bold \" + 9 * h + \"px Helvetica,Arial,sans-serif\", _.textBaseline = \"top\", _.fillStyle = o, _.fillRect(0, 0, c, u), _.fillStyle = i, _.fillText(n, d, p), _.fillRect(f, m, g, y), _.fillStyle = o, _.globalAlpha = 0.9, _.fillRect(f, m, g, y), { dom: w, update: function(x, b) {\n r = Math.min(r, x), a = Math.max(a, x), _.fillStyle = o, _.globalAlpha = 1, _.fillRect(0, 0, c, m), _.fillStyle = i, _.fillText(l(x) + \" \" + n + \" (\" + l(r) + \"-\" + l(a) + \")\", d, p), _.drawImage(w, f + h, m, g - h, y, f, m, g - h, y), _.fillRect(f + g - h, m, h, y), _.fillStyle = o, _.globalAlpha = 0.9, _.fillRect(f + g - h, m, h, l((1 - x / b) * y));\n } };\n }, t;\n });\n })(Mi)), Mi.exports;\n}\nvar ju = Vu();\nconst Hu = /* @__PURE__ */ qo(ju);\nvar gn = Object.freeze({\n Linear: Object.freeze({\n None: function(s) {\n return s;\n },\n In: function(s) {\n return s;\n },\n Out: function(s) {\n return s;\n },\n InOut: function(s) {\n return s;\n }\n }),\n Quadratic: Object.freeze({\n In: function(s) {\n return s * s;\n },\n Out: function(s) {\n return s * (2 - s);\n },\n InOut: function(s) {\n return (s *= 2) < 1 ? 0.5 * s * s : -0.5 * (--s * (s - 2) - 1);\n }\n }),\n Cubic: Object.freeze({\n In: function(s) {\n return s * s * s;\n },\n Out: function(s) {\n return --s * s * s + 1;\n },\n InOut: function(s) {\n return (s *= 2) < 1 ? 0.5 * s * s * s : 0.5 * ((s -= 2) * s * s + 2);\n }\n }),\n Quartic: Object.freeze({\n In: function(s) {\n return s * s * s * s;\n },\n Out: function(s) {\n return 1 - --s * s * s * s;\n },\n InOut: function(s) {\n return (s *= 2) < 1 ? 0.5 * s * s * s * s : -0.5 * ((s -= 2) * s * s * s - 2);\n }\n }),\n Quintic: Object.freeze({\n In: function(s) {\n return s * s * s * s * s;\n },\n Out: function(s) {\n return --s * s * s * s * s + 1;\n },\n InOut: function(s) {\n return (s *= 2) < 1 ? 0.5 * s * s * s * s * s : 0.5 * ((s -= 2) * s * s * s * s + 2);\n }\n }),\n Sinusoidal: Object.freeze({\n In: function(s) {\n return 1 - Math.sin((1 - s) * Math.PI / 2);\n },\n Out: function(s) {\n return Math.sin(s * Math.PI / 2);\n },\n InOut: function(s) {\n return 0.5 * (1 - Math.sin(Math.PI * (0.5 - s)));\n }\n }),\n Exponential: Object.freeze({\n In: function(s) {\n return s === 0 ? 0 : Math.pow(1024, s - 1);\n },\n Out: function(s) {\n return s === 1 ? 1 : 1 - Math.pow(2, -10 * s);\n },\n InOut: function(s) {\n return s === 0 ? 0 : s === 1 ? 1 : (s *= 2) < 1 ? 0.5 * Math.pow(1024, s - 1) : 0.5 * (-Math.pow(2, -10 * (s - 1)) + 2);\n }\n }),\n Circular: Object.freeze({\n In: function(s) {\n return 1 - Math.sqrt(1 - s * s);\n },\n Out: function(s) {\n return Math.sqrt(1 - --s * s);\n },\n InOut: function(s) {\n return (s *= 2) < 1 ? -0.5 * (Math.sqrt(1 - s * s) - 1) : 0.5 * (Math.sqrt(1 - (s -= 2) * s) + 1);\n }\n }),\n Elastic: Object.freeze({\n In: function(s) {\n return s === 0 ? 0 : s === 1 ? 1 : -Math.pow(2, 10 * (s - 1)) * Math.sin((s - 1.1) * 5 * Math.PI);\n },\n Out: function(s) {\n return s === 0 ? 0 : s === 1 ? 1 : Math.pow(2, -10 * s) * Math.sin((s - 0.1) * 5 * Math.PI) + 1;\n },\n InOut: function(s) {\n return s === 0 ? 0 : s === 1 ? 1 : (s *= 2, s < 1 ? -0.5 * Math.pow(2, 10 * (s - 1)) * Math.sin((s - 1.1) * 5 * Math.PI) : 0.5 * Math.pow(2, -10 * (s - 1)) * Math.sin((s - 1.1) * 5 * Math.PI) + 1);\n }\n }),\n Back: Object.freeze({\n In: function(s) {\n var e = 1.70158;\n return s === 1 ? 1 : s * s * ((e + 1) * s - e);\n },\n Out: function(s) {\n var e = 1.70158;\n return s === 0 ? 0 : --s * s * ((e + 1) * s + e) + 1;\n },\n InOut: function(s) {\n var e = 2.5949095;\n return (s *= 2) < 1 ? 0.5 * (s * s * ((e + 1) * s - e)) : 0.5 * ((s -= 2) * s * ((e + 1) * s + e) + 2);\n }\n }),\n Bounce: Object.freeze({\n In: function(s) {\n return 1 - gn.Bounce.Out(1 - s);\n },\n Out: function(s) {\n return s < 1 / 2.75 ? 7.5625 * s * s : s < 2 / 2.75 ? 7.5625 * (s -= 1.5 / 2.75) * s + 0.75 : s < 2.5 / 2.75 ? 7.5625 * (s -= 2.25 / 2.75) * s + 0.9375 : 7.5625 * (s -= 2.625 / 2.75) * s + 0.984375;\n },\n InOut: function(s) {\n return s < 0.5 ? gn.Bounce.In(s * 2) * 0.5 : gn.Bounce.Out(s * 2 - 1) * 0.5 + 0.5;\n }\n }),\n generatePow: function(s) {\n return s === void 0 && (s = 4), s = s < Number.EPSILON ? Number.EPSILON : s, s = s > 1e4 ? 1e4 : s, {\n In: function(e) {\n return Math.pow(e, s);\n },\n Out: function(e) {\n return 1 - Math.pow(1 - e, s);\n },\n InOut: function(e) {\n return e < 0.5 ? Math.pow(e * 2, s) / 2 : (1 - Math.pow(2 - e * 2, s)) / 2 + 0.5;\n }\n };\n }\n}), Bn = function() {\n return performance.now();\n}, Gu = (\n /** @class */\n (function() {\n function s() {\n this._tweens = {}, this._tweensAddedDuringUpdate = {};\n }\n return s.prototype.getAll = function() {\n var e = this;\n return Object.keys(this._tweens).map(function(t) {\n return e._tweens[t];\n });\n }, s.prototype.removeAll = function() {\n this._tweens = {};\n }, s.prototype.add = function(e) {\n this._tweens[e.getId()] = e, this._tweensAddedDuringUpdate[e.getId()] = e;\n }, s.prototype.remove = function(e) {\n delete this._tweens[e.getId()], delete this._tweensAddedDuringUpdate[e.getId()];\n }, s.prototype.update = function(e, t) {\n e === void 0 && (e = Bn()), t === void 0 && (t = !1);\n var n = Object.keys(this._tweens);\n if (n.length === 0)\n return !1;\n for (; n.length > 0; ) {\n this._tweensAddedDuringUpdate = {};\n for (var i = 0; i < n.length; i++) {\n var o = this._tweens[n[i]], r = !t;\n o && o.update(e, r) === !1 && !t && delete this._tweens[n[i]];\n }\n n = Object.keys(this._tweensAddedDuringUpdate);\n }\n return !0;\n }, s;\n })()\n), Fs = {\n Linear: function(s, e) {\n var t = s.length - 1, n = t * e, i = Math.floor(n), o = Fs.Utils.Linear;\n return e < 0 ? o(s[0], s[1], n) : e > 1 ? o(s[t], s[t - 1], t - n) : o(s[i], s[i + 1 > t ? t : i + 1], n - i);\n },\n Utils: {\n Linear: function(s, e, t) {\n return (e - s) * t + s;\n }\n }\n}, va = (\n /** @class */\n (function() {\n function s() {\n }\n return s.nextId = function() {\n return s._nextId++;\n }, s._nextId = 0, s;\n })()\n), Vs = new Gu(), Wu = (\n /** @class */\n (function() {\n function s(e, t) {\n t === void 0 && (t = Vs), this._object = e, this._group = t, this._isPaused = !1, this._pauseStart = 0, this._valuesStart = {}, this._valuesEnd = {}, this._valuesStartRepeat = {}, this._duration = 1e3, this._isDynamic = !1, this._initialRepeat = 0, this._repeat = 0, this._yoyo = !1, this._isPlaying = !1, this._reversed = !1, this._delayTime = 0, this._startTime = 0, this._easingFunction = gn.Linear.None, this._interpolationFunction = Fs.Linear, this._chainedTweens = [], this._onStartCallbackFired = !1, this._onEveryStartCallbackFired = !1, this._id = va.nextId(), this._isChainStopped = !1, this._propertiesAreSetUp = !1, this._goToEnd = !1;\n }\n return s.prototype.getId = function() {\n return this._id;\n }, s.prototype.isPlaying = function() {\n return this._isPlaying;\n }, s.prototype.isPaused = function() {\n return this._isPaused;\n }, s.prototype.getDuration = function() {\n return this._duration;\n }, s.prototype.to = function(e, t) {\n if (t === void 0 && (t = 1e3), this._isPlaying)\n throw new Error(\"Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.\");\n return this._valuesEnd = e, this._propertiesAreSetUp = !1, this._duration = t < 0 ? 0 : t, this;\n }, s.prototype.duration = function(e) {\n return e === void 0 && (e = 1e3), this._duration = e < 0 ? 0 : e, this;\n }, s.prototype.dynamic = function(e) {\n return e === void 0 && (e = !1), this._isDynamic = e, this;\n }, s.prototype.start = function(e, t) {\n if (e === void 0 && (e = Bn()), t === void 0 && (t = !1), this._isPlaying)\n return this;\n if (this._group && this._group.add(this), this._repeat = this._initialRepeat, this._reversed) {\n this._reversed = !1;\n for (var n in this._valuesStartRepeat)\n this._swapEndStartRepeatValues(n), this._valuesStart[n] = this._valuesStartRepeat[n];\n }\n if (this._isPlaying = !0, this._isPaused = !1, this._onStartCallbackFired = !1, this._onEveryStartCallbackFired = !1, this._isChainStopped = !1, this._startTime = e, this._startTime += this._delayTime, !this._propertiesAreSetUp || t) {\n if (this._propertiesAreSetUp = !0, !this._isDynamic) {\n var i = {};\n for (var o in this._valuesEnd)\n i[o] = this._valuesEnd[o];\n this._valuesEnd = i;\n }\n this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, t);\n }\n return this;\n }, s.prototype.startFromCurrentValues = function(e) {\n return this.start(e, !0);\n }, s.prototype._setupProperties = function(e, t, n, i, o) {\n for (var r in n) {\n var a = e[r], l = Array.isArray(a), h = l ? \"array\" : typeof a, c = !l && Array.isArray(n[r]);\n if (!(h === \"undefined\" || h === \"function\")) {\n if (c) {\n var u = n[r];\n if (u.length === 0)\n continue;\n for (var d = [a], p = 0, f = u.length; p < f; p += 1) {\n var m = this._handleRelativeValue(a, u[p]);\n if (isNaN(m)) {\n c = !1, console.warn(\"Found invalid interpolation list. Skipping.\");\n break;\n }\n d.push(m);\n }\n c && (n[r] = d);\n }\n if ((h === \"object\" || l) && a && !c) {\n t[r] = l ? [] : {};\n var g = a;\n for (var y in g)\n t[r][y] = g[y];\n i[r] = l ? [] : {};\n var u = n[r];\n if (!this._isDynamic) {\n var w = {};\n for (var y in u)\n w[y] = u[y];\n n[r] = u = w;\n }\n this._setupProperties(g, t[r], u, i[r], o);\n } else\n (typeof t[r] > \"u\" || o) && (t[r] = a), l || (t[r] *= 1), c ? i[r] = n[r].slice().reverse() : i[r] = t[r] || 0;\n }\n }\n }, s.prototype.stop = function() {\n return this._isChainStopped || (this._isChainStopped = !0, this.stopChainedTweens()), this._isPlaying ? (this._group && this._group.remove(this), this._isPlaying = !1, this._isPaused = !1, this._onStopCallback && this._onStopCallback(this._object), this) : this;\n }, s.prototype.end = function() {\n return this._goToEnd = !0, this.update(1 / 0), this;\n }, s.prototype.pause = function(e) {\n return e === void 0 && (e = Bn()), this._isPaused || !this._isPlaying ? this : (this._isPaused = !0, this._pauseStart = e, this._group && this._group.remove(this), this);\n }, s.prototype.resume = function(e) {\n return e === void 0 && (e = Bn()), !this._isPaused || !this._isPlaying ? this : (this._isPaused = !1, this._startTime += e - this._pauseStart, this._pauseStart = 0, this._group && this._group.add(this), this);\n }, s.prototype.stopChainedTweens = function() {\n for (var e = 0, t = this._chainedTweens.length; e < t; e++)\n this._chainedTweens[e].stop();\n return this;\n }, s.prototype.group = function(e) {\n return e === void 0 && (e = Vs), this._group = e, this;\n }, s.prototype.delay = function(e) {\n return e === void 0 && (e = 0), this._delayTime = e, this;\n }, s.prototype.repeat = function(e) {\n return e === void 0 && (e = 0), this._initialRepeat = e, this._repeat = e, this;\n }, s.prototype.repeatDelay = function(e) {\n return this._repeatDelayTime = e, this;\n }, s.prototype.yoyo = function(e) {\n return e === void 0 && (e = !1), this._yoyo = e, this;\n }, s.prototype.easing = function(e) {\n return e === void 0 && (e = gn.Linear.None), this._easingFunction = e, this;\n }, s.prototype.interpolation = function(e) {\n return e === void 0 && (e = Fs.Linear), this._interpolationFunction = e, this;\n }, s.prototype.chain = function() {\n for (var e = [], t = 0; t < arguments.length; t++)\n e[t] = arguments[t];\n return this._chainedTweens = e, this;\n }, s.prototype.onStart = function(e) {\n return this._onStartCallback = e, this;\n }, s.prototype.onEveryStart = function(e) {\n return this._onEveryStartCallback = e, this;\n }, s.prototype.onUpdate = function(e) {\n return this._onUpdateCallback = e, this;\n }, s.prototype.onRepeat = function(e) {\n return this._onRepeatCallback = e, this;\n }, s.prototype.onComplete = function(e) {\n return this._onCompleteCallback = e, this;\n }, s.prototype.onStop = function(e) {\n return this._onStopCallback = e, this;\n }, s.prototype.update = function(e, t) {\n var n = this, i;\n if (e === void 0 && (e = Bn()), t === void 0 && (t = !0), this._isPaused)\n return !0;\n var o, r = this._startTime + this._duration;\n if (!this._goToEnd && !this._isPlaying) {\n if (e > r)\n return !1;\n t && this.start(e, !0);\n }\n if (this._goToEnd = !1, e < this._startTime)\n return !0;\n this._onStartCallbackFired === !1 && (this._onStartCallback && this._onStartCallback(this._object), this._onStartCallbackFired = !0), this._onEveryStartCallbackFired === !1 && (this._onEveryStartCallback && this._onEveryStartCallback(this._object), this._onEveryStartCallbackFired = !0);\n var a = e - this._startTime, l = this._duration + ((i = this._repeatDelayTime) !== null && i !== void 0 ? i : this._delayTime), h = this._duration + this._repeat * l, c = function() {\n if (n._duration === 0 || a > h)\n return 1;\n var g = Math.trunc(a / l), y = a - g * l, w = Math.min(y / n._duration, 1);\n return w === 0 && a === n._duration ? 1 : w;\n }, u = c(), d = this._easingFunction(u);\n if (this._updateProperties(this._object, this._valuesStart, this._valuesEnd, d), this._onUpdateCallback && this._onUpdateCallback(this._object, u), this._duration === 0 || a >= this._duration)\n if (this._repeat > 0) {\n var p = Math.min(Math.trunc((a - this._duration) / l) + 1, this._repeat);\n isFinite(this._repeat) && (this._repeat -= p);\n for (o in this._valuesStartRepeat)\n !this._yoyo && typeof this._valuesEnd[o] == \"string\" && (this._valuesStartRepeat[o] = // eslint-disable-next-line\n // @ts-ignore FIXME?\n this._valuesStartRepeat[o] + parseFloat(this._valuesEnd[o])), this._yoyo && this._swapEndStartRepeatValues(o), this._valuesStart[o] = this._valuesStartRepeat[o];\n return this._yoyo && (this._reversed = !this._reversed), this._startTime += l * p, this._onRepeatCallback && this._onRepeatCallback(this._object), this._onEveryStartCallbackFired = !1, !0;\n } else {\n this._onCompleteCallback && this._onCompleteCallback(this._object);\n for (var f = 0, m = this._chainedTweens.length; f < m; f++)\n this._chainedTweens[f].start(this._startTime + this._duration, !1);\n return this._isPlaying = !1, !1;\n }\n return !0;\n }, s.prototype._updateProperties = function(e, t, n, i) {\n for (var o in n)\n if (t[o] !== void 0) {\n var r = t[o] || 0, a = n[o], l = Array.isArray(e[o]), h = Array.isArray(a), c = !l && h;\n c ? e[o] = this._interpolationFunction(a, i) : typeof a == \"object\" && a ? this._updateProperties(e[o], r, a, i) : (a = this._handleRelativeValue(r, a), typeof a == \"number\" && (e[o] = r + (a - r) * i));\n }\n }, s.prototype._handleRelativeValue = function(e, t) {\n return typeof t != \"string\" ? t : t.charAt(0) === \"+\" || t.charAt(0) === \"-\" ? e + parseFloat(t) : parseFloat(t);\n }, s.prototype._swapEndStartRepeatValues = function(e) {\n var t = this._valuesStartRepeat[e], n = this._valuesEnd[e];\n typeof n == \"string\" ? this._valuesStartRepeat[e] = this._valuesStartRepeat[e] + parseFloat(n) : this._valuesStartRepeat[e] = this._valuesEnd[e], this._valuesEnd[e] = t;\n }, s;\n })()\n);\nva.nextId;\nvar ct = Vs;\nct.getAll.bind(ct);\nct.removeAll.bind(ct);\nct.add.bind(ct);\nct.remove.bind(ct);\nct.update.bind(ct);\nvar as = {\n Easing: gn,\n Tween: Wu\n};\nfunction Xu() {\n return new E.Scene();\n}\nfunction qu(s, e) {\n s.appendChild(e.domElement);\n}\nfunction Ku(s, e, t) {\n var n = new Object();\n n.visible = !0;\n let i = null, o, r, a = [];\n n.init = function() {\n o || (h(), c(), u());\n }, n.Hide = function() {\n o.style.display = \"none\", n.visible = !1;\n }, n.Show = function() {\n o.style.display = \"block\", n.visible = !0;\n }, n.RenderScene = function() {\n n.camera.quaternion.copy(e.camera.quaternion);\n let m = new E.Vector3(0, 0, -1).clone().applyMatrix4(e.camera.matrixWorld.clone()), g = e.camera.position.clone().sub(m.clone()).setLength(100);\n n.camera.position.copy(g), n.camera.lookAt(new E.Vector3()), n.sceneOrtho.renderer.render(n.sceneOrtho, n.camera);\n }, n.ToggleDirectionView = function(f) {\n console.log(f);\n var m = new E.Vector3(0, 0, 0);\n f == \"top\" ? m = new E.Vector3(0, 1, 0) : f == \"down\" ? m = new E.Vector3(0, -1, 0) : f == \"front\" ? m = new E.Vector3(0, 0, 1) : f == \"left\" ? m = new E.Vector3(-1, 0, 0) : f == \"back\" ? m = new E.Vector3(0, 0, -1) : f == \"right\" ? m = new E.Vector3(1, 0, 0) : f == \"top_front\" ? m = new E.Vector3(1, 1, 0) : f == \"top_left\" ? m = new E.Vector3(0, 1, -1) : f == \"top_back\" ? m = new E.Vector3(-1, 1, 0) : f == \"top_right\" ? m = new E.Vector3(0, 1, 1) : f == \"down_front\" ? m = new E.Vector3(1, -1, 0) : f == \"down_left\" ? m = new E.Vector3(0, -1, -1) : f == \"down_back\" ? m = new E.Vector3(-1, -1, 0) : f == \"down_right\" ? m = new E.Vector3(0, -1, 1) : f == \"front_right\" ? m = new E.Vector3(1, 0, 1) : f == \"right_back\" ? m = new E.Vector3(-1, 0, 1) : f == \"back_left\" ? m = new E.Vector3(-1, 0, -1) : f == \"left_front\" ? m = new E.Vector3(1, 0, -1) : f == \"top_left_front\" ? m = new E.Vector3(1, 1, -1) : f == \"top_front_right\" ? m = new E.Vector3(1, 1, 1) : f == \"top_right_back\" ? m = new E.Vector3(-1, 1, 1) : f == \"top_back_left\" ? m = new E.Vector3(-1, 1, -1) : f == \"button_left_front\" ? m = new E.Vector3(1, -1, -1) : f == \"button_front_right\" ? m = new E.Vector3(1, -1, 1) : f == \"button_right_back\" ? m = new E.Vector3(-1, 1, 1) : f == \"button_back_left\" && (m = new E.Vector3(-1, -1, -1));\n var g = s.octreeBox.getBoundingBox(), y = g.min, w = g.max, _ = y.clone().add(w.clone()).multiplyScalar(0.5), x = _.clone().add(m.multiplyScalar(1 * w.distanceTo(y)));\n l(e.camera.position, x, s.controls.target.clone(), _);\n }, n.GetCameraPose = function() {\n var f = e.camera.quaternion, m = e.camera.position, g = s.controls.target, y = {\n quaternion: f,\n position: m,\n target: g\n };\n return y;\n }, n.ReductionCameraPose = function(f, m = 1e3, g) {\n var y = new E.Quaternion(\n f.quaternion._x,\n f.quaternion._y,\n f.quaternion._z,\n f.quaternion._w\n ), w = new E.Vector3(f.position.x, f.position.y, f.position.z), _ = new E.Vector3(f.target.x, f.target.y, f.target.z);\n let x = !1;\n l(\n e.camera.position,\n w,\n s.controls.target.clone(),\n _,\n e.camera.quaternion,\n y,\n m,\n (b) => {\n g && (x || (g(b), x = !0));\n }\n ), g && setTimeout(() => {\n x || (g(!0), x = !0);\n }, m + 10);\n }, n.CameraGoHome = function() {\n var f = s.octreeBox.getBoundingBox(), m = f.min.clone().add(f.max.clone()).multiplyScalar(0.5);\n let g = new E.Vector3(1, 1, 1);\n var y = f.max.distanceTo(f.min), w = m.clone().add(g.multiplyScalar(y));\n if (e.camera.isOrthographicCamera) {\n var _ = s.container.clientWidth / s.container.clientHeight, x = y * 0.6;\n e.camera.left = -x * _, e.camera.right = x * _, e.camera.top = x, e.camera.bottom = -x, e.camera.zoom = 1, e.camera.updateProjectionMatrix();\n }\n l(e.camera.position, w, s.controls.target.clone(), m);\n }, n.zoomToBox = function(f) {\n var m = f.min.clone().add(f.max.clone()).multiplyScalar(0.5);\n let y = e.camera.position.clone().sub(s.controls.target.clone()).normalize();\n var w = m.clone().add(y.multiplyScalar(1 * f.max.distanceTo(f.min)));\n l(e.camera.position, w, s.controls.target.clone(), m);\n };\n function l(f, m, g, y, w, _, x = 1e3, b) {\n var A;\n w && _ ? (A = new as.Tween({\n x1: f.x,\n // 相机当前位置x\n y1: f.y,\n // 相机当前位置y\n z1: f.z,\n // 相机当前位置z\n x2: g.x,\n // 控制当前的中心点x\n y2: g.y,\n // 控制当前的中心点y\n z2: g.z,\n // 控制当前的中心点z\n _x: w._x,\n // 相机当前quaternion\n _y: w._y,\n // 相机当前quaternion\n _z: w._z,\n // 相机当前quaternion\n _w: w._w\n // 相机当前quaternion\n }), A.to(\n {\n x1: m.x,\n // 新的相机位置x\n y1: m.y,\n // 新的相机位置y\n z1: m.z,\n // 新的相机位置z\n x2: y.x,\n // 新的控制中心点位置x\n y2: y.y,\n // 新的控制中心点位置x\n z2: y.z,\n // 新的控制中心点位置x\n _x: _._x,\n // 新的相机quaternion\n _y: _._y,\n // 新的相机quaternion\n _z: _._z,\n // 新的相机quaternion\n _w: _._w\n // 新的相机quaternion\n },\n x\n )) : (A = new as.Tween({\n x1: f.x,\n // 相机当前位置x\n y1: f.y,\n // 相机当前位置y\n z1: f.z,\n // 相机当前位置z\n x2: g.x,\n // 控制当前的中心点x\n y2: g.y,\n // 控制当前的中心点y\n z2: g.z\n // 控制当前的中心点z\n }), A.to(\n {\n x1: m.x,\n // 新的相机位置x\n y1: m.y,\n // 新的相机位置y\n z1: m.z,\n // 新的相机位置z\n x2: y.x,\n // 新的控制中心点位置x\n y2: y.y,\n // 新的控制中心点位置x\n z2: y.z\n // 新的控制中心点位置x\n },\n x\n )), A.onUpdate(function(C) {\n w && _ ? (e.camera.quaternion._x = C._x, e.camera.quaternion._y = C._y, e.camera.quaternion._z = C._z, e.camera.quaternion._w = C._w) : s.controls.auto = !0, e.camera.position.x = C.x1, e.camera.position.y = C.y1, e.camera.position.z = C.z1, s.controls.target.x = C.x2, s.controls.target.y = C.y2, s.controls.target.z = C.z2, s.controls.update(), n.RenderScene();\n }), A.onComplete(function(C) {\n s.controls.auto = !1, n.RenderScene(), b && b(!0), cancelAnimationFrame(i), i = null;\n }), A.easing(as.Easing.Cubic.InOut);\n function M(C) {\n i = requestAnimationFrame(M), A.update();\n }\n A.start(), M();\n }\n function h() {\n o = document.createElement(\"div\"), o.className = \"ViewCube\", t.appendChild(o), r = document.createElement(\"div\"), r.className = \"viewSettingWrapper\", r.innerHTML = \"...\", o.appendChild(r);\n var f = document.createElement(\"div\");\n f.className = \"homeViewWrapper\", f.addEventListener(\"mousedown\", function() {\n console.log(\"归位\"), n.CameraGoHome();\n }), o.appendChild(f);\n const m = document.createElement(\"div\");\n m.className = \"cameraToggleWrapper\", m.title = \"切换正交/透视视图\", m.innerHTML = \"⊞\", m.addEventListener(\"mousedown\", function(x) {\n x.stopPropagation(), console.log(\"切换视图\"), n.ToggleCameraType(), w();\n }), o.appendChild(m);\n const g = document.createElement(\"div\");\n g.className = \"screenshotWrapper\", g.title = \"截图\", g.innerHTML = \"📷\", g.addEventListener(\"mousedown\", function(x) {\n x.stopPropagation(), console.log(\"截图\"), n.TakeScreenshot(), w();\n }), o.appendChild(g);\n const y = document.createElement(\"div\");\n y.className = \"fullscreenWrapper\", y.title = \"全屏\", y.innerHTML = \"⛶\", y.addEventListener(\"mousedown\", function(x) {\n x.stopPropagation(), console.log(\"全屏\"), n.ToggleFullscreen(), w();\n }), o.appendChild(y), r.addEventListener(\"mousedown\", function(x) {\n x.stopPropagation(), m.classList.contains(\"show\") ? (w(), console.log(\"隐藏功能按钮\")) : (_(), console.log(\"显示功能按钮\"));\n });\n function w() {\n m.classList.remove(\"show\"), g.classList.remove(\"show\"), y.classList.remove(\"show\");\n }\n function _() {\n m.classList.add(\"show\"), g.classList.add(\"show\"), y.classList.add(\"show\");\n }\n }\n function c() {\n n.sceneOrtho = Xu();\n var g = t.clientWidth, y = t.clientWidth, f = g > y ? g / y : y / g, m = 300;\n n.camera = new E.OrthographicCamera(\n m * f / -2,\n m * f / 2,\n m / 2,\n m / -2,\n 0.01,\n 1e4\n );\n var g = o.clientWidth, y = o.clientHeight, w = new E.WebGLRenderer({\n alpha: !0\n });\n w.setSize(g, y), w.setClearAlpha(0), n.sceneOrtho.renderer = w;\n let _ = new E.AmbientLight(16777215, 0.8);\n n.sceneOrtho.add(_), qu(o, w);\n }\n function u() {\n const f = \"/assets/viewcube/\";\n let m = [\n {\n label: \"右\",\n icon: f + \"cn_right.png\"\n },\n {\n label: \"左\",\n icon: f + \"cn_left.png\"\n },\n {\n label: \"顶\",\n icon: f + \"cn_top.png\"\n },\n {\n label: \"底\",\n icon: f + \"cn_bottom.png\"\n },\n {\n label: \"前\",\n icon: f + \"cn_front.png\"\n },\n {\n label: \"后\",\n icon: f + \"cn_back.png\"\n }\n ];\n var g = [];\n for (const w of m)\n g.push(\n new E.MeshBasicMaterial({\n color: 16777215,\n map: new E.TextureLoader().load(w.icon)\n })\n );\n new E.MeshLambertMaterial({\n color: 255\n });\n var y = new E.Mesh(new E.BoxGeometry(110, 110, 110), g);\n n.sceneOrtho.add(y), d(122), o.addEventListener(\"mousedown\", (w) => {\n var _ = {};\n _.x = w.offsetX / o.clientWidth * 2 - 1, _.y = -(w.offsetY / o.clientHeight) * 2 + 1;\n var x = new E.Raycaster();\n x.setFromCamera(_, n.camera);\n const b = x.intersectObjects(a, !1);\n b.length > 0 && n.ToggleDirectionView(b[0].object.name);\n }), o.addEventListener(\"mousemove\", (w) => {\n var _ = {};\n _.x = w.offsetX / o.clientWidth * 2 - 1, _.y = -(w.offsetY / o.clientHeight) * 2 + 1;\n var x = new E.Raycaster();\n x.setFromCamera(_, n.camera);\n const b = x.intersectObjects(a, !1);\n for (var A of a)\n A.material.opacity = 0.01;\n b.length > 0 && (b[0].object.material.opacity = 0.2);\n });\n }\n function d(f) {\n for (var m = f * 0.5 - 20, g = [\n {\n name: \"right\",\n a: 30,\n b: 75,\n c: 75,\n point: new E.Vector3(m, 0, 0)\n },\n {\n name: \"back\",\n a: 75,\n b: 75,\n c: 30,\n point: new E.Vector3(0, 0, -m)\n },\n {\n name: \"left\",\n a: 30,\n b: 75,\n c: 75,\n point: new E.Vector3(-m, 0, 0)\n },\n {\n name: \"front\",\n a: 75,\n b: 75,\n c: 30,\n point: new E.Vector3(0, 0, m)\n },\n {\n name: \"top\",\n a: 75,\n b: 30,\n c: 75,\n point: new E.Vector3(0, m, 0)\n },\n {\n name: \"button\",\n a: 75,\n b: 30,\n c: 75,\n point: new E.Vector3(0, -m, 0)\n }\n ], y = [\n {\n name: \"top_right_back\",\n a: 30,\n b: 30,\n c: 30,\n point: new E.Vector3(-m, m, m)\n },\n {\n name: \"button_front_right\",\n a: 30,\n b: 30,\n c: 30,\n point: new E.Vector3(-m, -m, m)\n },\n {\n name: \"top_front_right\",\n a: 30,\n b: 30,\n c: 30,\n point: new E.Vector3(m, m, m)\n },\n {\n name: \"button_right_back\",\n a: 30,\n b: 30,\n c: 30,\n point: new E.Vector3(m, -m, m)\n },\n {\n name: \"top_back_left\",\n a: 30,\n b: 30,\n c: 30,\n point: new E.Vector3(-m, m, -m)\n },\n {\n name: \"button_back_left\",\n a: 30,\n b: 30,\n c: 30,\n point: new E.Vector3(-m, -m, -m)\n },\n {\n name: \"top_left_front\",\n a: 30,\n b: 30,\n c: 30,\n point: new E.Vector3(m, m, -m)\n },\n {\n name: \"button_left_front\",\n a: 30,\n b: 30,\n c: 30,\n point: new E.Vector3(m, -m, -m)\n }\n ], w = [\n {\n name: \"top_front\",\n a: 30,\n b: 30,\n c: 75,\n point: new E.Vector3(m, m, 0)\n },\n {\n name: \"top_right\",\n a: 75,\n b: 30,\n c: 30,\n point: new E.Vector3(0, m, m)\n },\n {\n name: \"top_back\",\n a: 30,\n b: 30,\n c: 75,\n point: new E.Vector3(-m, m, 0)\n },\n {\n name: \"top_left\",\n a: 75,\n b: 30,\n c: 30,\n point: new E.Vector3(0, m, -m)\n },\n {\n name: \"button_front\",\n a: 30,\n b: 30,\n c: 75,\n point: new E.Vector3(m, -m, 0)\n },\n {\n name: \"button_right\",\n a: 75,\n b: 30,\n c: 30,\n point: new E.Vector3(0, -m, m)\n },\n {\n name: \"button_back\",\n a: 30,\n b: 30,\n c: 75,\n point: new E.Vector3(-m, -m, 0)\n },\n {\n name: \"button_left\",\n a: 75,\n b: 30,\n c: 30,\n point: new E.Vector3(0, -m, -m)\n },\n {\n name: \"front_right\",\n a: 30,\n b: 75,\n c: 30,\n point: new E.Vector3(m, 0, m)\n },\n {\n name: \"right_back\",\n a: 30,\n b: 75,\n c: 30,\n point: new E.Vector3(-m, 0, m)\n },\n {\n name: \"back_left\",\n a: 30,\n b: 75,\n c: 30,\n point: new E.Vector3(-m, 0, -m)\n },\n {\n name: \"left_front\",\n a: 30,\n b: 75,\n c: 30,\n point: new E.Vector3(m, 0, -m)\n }\n ], _ = 0; _ < g.length; _++)\n a.push(p(g[_]));\n for (var _ = 0; _ < y.length; _++)\n a.push(p(y[_]));\n for (var _ = 0; _ < w.length; _++)\n a.push(p(w[_]));\n }\n function p(f) {\n const m = new E.BoxGeometry(f.a, f.b, f.c), g = new E.MeshBasicMaterial({\n color: \"blue\",\n transparent: !0,\n opacity: 0.01\n }), y = new E.Matrix4().makeTranslation(f.point.x, f.point.y, f.point.z);\n let w = m.applyMatrix4(y), _ = new E.Mesh(w, g);\n return _.name = f.name, n.sceneOrtho.add(_), _;\n }\n return n.ToggleCameraType = function() {\n s.cameraModule.switchCurrentCamera();\n }, n.TakeScreenshot = function() {\n try {\n if (!s.renderer) {\n console.error(\"渲染器未初始化\");\n return;\n }\n s.renderer.render(e, e.camera);\n const m = s.renderer.domElement.toDataURL(\"image/png\"), g = document.createElement(\"a\"), y = (/* @__PURE__ */ new Date()).toISOString().replaceAll(/[:.]/g, \"-\");\n g.download = `screenshot_${y}.png`, g.href = m, g.click(), console.log(\"截图已保存\");\n } catch (f) {\n console.error(\"截图失败:\", f);\n }\n }, n.ToggleFullscreen = function() {\n const f = t || document.documentElement;\n !document.fullscreenElement && !document.webkitFullscreenElement && !document.mozFullScreenElement && !document.msFullscreenElement ? (f.requestFullscreen ? f.requestFullscreen() : f.webkitRequestFullscreen ? f.webkitRequestFullscreen() : f.mozRequestFullScreen ? f.mozRequestFullScreen() : f.msRequestFullscreen && f.msRequestFullscreen(), console.log(\"已进入全屏模式\")) : (document.exitFullscreen ? document.exitFullscreen() : document.webkitExitFullscreen ? document.webkitExitFullscreen() : document.mozCancelFullScreen ? document.mozCancelFullScreen() : document.msExitFullscreen && document.msExitFullscreen(), console.log(\"已退出全屏模式\"));\n }, n;\n}\nclass Zu {\n engine;\n cubeTool;\n constructor(e) {\n this.engine = e;\n }\n init() {\n this.cubeTool = Ku(this.engine, this.engine.scene, this.engine.container), this.cubeTool.init();\n }\n // 相机回归正位\n CameraGoHome() {\n this.cubeTool.CameraGoHome();\n }\n // 缩放到指定模型\n zoomToModel(e) {\n this.cubeTool.zoomToBox(e);\n }\n}\nfunction Yu(s) {\n let e = new Object();\n return e.getBoundingBox = function() {\n let t = s.models, n = new E.Vector3(1e8, 1e9, 1e10), i = new E.Vector3(-1e8, -1e9, -1e10);\n t.forEach((u) => {\n let d = u.boundingBox.min, p = u.boundingBox.max;\n d.x < n.x && (n.x = d.x), d.y < n.y && (n.y = d.y), d.z < n.z && (n.z = d.z), p.x > i.x && (i.x = p.x), p.y > i.y && (i.y = p.y), p.z > i.z && (i.z = p.z);\n });\n let o = Math.min(n.x, i.x), r = Math.min(n.y, i.y), a = Math.min(n.z, i.z), l = Math.max(n.x, i.x), h = Math.max(n.y, i.y), c = Math.max(n.z, i.z);\n return {\n min: new E.Vector3(o, r, a),\n max: new E.Vector3(l, h, c)\n };\n }, e.rayInterationModel = function(t) {\n let n = [];\n return s.engineStatus.models.forEach((r) => {\n r.info.lods.forEach((a) => {\n let l = a.octreeBox;\n o(t, l, r);\n });\n }), t.intersectObjects(n, !1);\n function o(r, a, l) {\n if (a == null)\n return;\n let h = new E.Vector3(a.min.X * 0.3048, a.min.Z * 0.3048, -a.min.Y * 0.3048), c = new E.Vector3(a.max.X * 0.3048, a.max.Z * 0.3048, -a.max.Y * 0.3048), u = new E.Vector3(Math.min(h.x, c.X), Math.min(h.y, c.y), Math.min(h.z, c.z)), d = new E.Vector3(Math.max(c.x, h.x), Math.max(c.y, h.y), Math.max(c.z, h.z)), p = new E.Box3(u, d), f = r.ray.intersectsBox(p);\n if (!(f == null || f == !1))\n if (a.children == null || a.children.length == 0) {\n if (a.elements != null)\n for (var m of a.elements) {\n let g = s.engineStatus.hideModels.find((_) => _.url == l.url)?.ids;\n if (g != null && g.includes(m))\n continue;\n let w = s.models.find((_) => _.url == l.url).nodesMap.get(m);\n w?.infos.map((x) => x.mesh).forEach((x) => {\n n.push(x);\n });\n }\n } else {\n if (a.elements != null)\n for (var m of a.elements) {\n let y = s.engineStatus.hideModels.find((x) => x.url == l.url)?.ids;\n if (y != null && y.includes(m))\n continue;\n let _ = s.models.find((x) => x.url == l.url).nodesMap.get(m);\n _?.infos.map((b) => b.mesh).forEach((b) => {\n n.push(b);\n });\n }\n for (let g of a.children)\n o(r, g, l);\n }\n }\n }, e;\n}\nclass $u {\n engine;\n // 绘制状态\n isDrawing = !1;\n startPoint = new E.Vector2();\n endPoint = new E.Vector2();\n // UI绘制框元素\n selectionBox = null;\n // 坐标转换工具\n worldToScreen = null;\n // 事件处理函数绑定(用于后续移除监听器)\n boundMouseDown;\n boundMouseMove;\n boundMouseUp;\n boundKeyDown;\n constructor(e) {\n this.engine = e, this.boundMouseDown = this.onMouseDown.bind(this), this.boundMouseMove = this.onMouseMove.bind(this), this.boundMouseUp = this.onMouseUp.bind(this), this.boundKeyDown = this.onKeyDown.bind(this);\n }\n /**\n * 初始化工具\n * 创建绘制框UI元素,初始化坐标转换工具\n */\n init() {\n this.createSelectionBoxElement(), this.engine.scene && this.engine.camera && this.engine.renderer && (this.worldToScreen = new Ge(\n this.engine.camera,\n this.engine.renderer,\n this.engine.scene\n ));\n }\n /**\n * 激活工具\n * 禁用控制器,添加鼠标事件监听器和键盘事件监听器\n */\n active() {\n this.engine.controlModule.disActive();\n const e = this.engine.renderer?.domElement;\n e && (e.addEventListener(\"mousedown\", this.boundMouseDown), e.addEventListener(\"mousemove\", this.boundMouseMove), e.addEventListener(\"mouseup\", this.boundMouseUp), e.style.cursor = \"crosshair\"), window.addEventListener(\"keydown\", this.boundKeyDown);\n }\n /**\n * 停用工具\n * 启用控制器,移除鼠标事件监听器和键盘事件监听器\n */\n disActive() {\n this.engine.controlModule.active();\n const e = this.engine.renderer?.domElement;\n e && (e.removeEventListener(\"mousedown\", this.boundMouseDown), e.removeEventListener(\"mousemove\", this.boundMouseMove), e.removeEventListener(\"mouseup\", this.boundMouseUp), e.style.cursor = \"default\"), window.removeEventListener(\"keydown\", this.boundKeyDown), this.isDrawing && this.endDrawing();\n }\n /**\n * 创建绘制框UI元素\n * 用于在屏幕上显示用户绘制的区域\n */\n createSelectionBoxElement() {\n this.selectionBox = document.createElement(\"div\"), this.selectionBox.style.position = \"absolute\", this.selectionBox.style.border = \"2px dashed #00aaff\", this.selectionBox.style.backgroundColor = \"rgba(0, 170, 255, 0.1)\", this.selectionBox.style.pointerEvents = \"none\", this.selectionBox.style.display = \"none\", this.selectionBox.style.zIndex = \"1000\", this.selectionBox.style.boxSizing = \"border-box\";\n const e = this.engine.renderer?.domElement;\n e && e.parentElement && e.parentElement.appendChild(this.selectionBox);\n }\n /**\n * 鼠标按下事件处理\n * 开始绘制区域\n */\n onMouseDown(e) {\n e.button !== 0 || !this.engine.renderer?.domElement || (this.startPoint.set(e.offsetX, e.offsetY), this.endPoint.copy(this.startPoint), this.isDrawing = !0, this.selectionBox && (this.selectionBox.style.display = \"block\", this.updateSelectionBoxUI()), e.preventDefault(), e.stopPropagation());\n }\n /**\n * 鼠标移动事件处理\n * 更新绘制框的显示\n */\n onMouseMove(e) {\n !this.isDrawing || !this.engine.renderer?.domElement || (this.endPoint.set(e.offsetX, e.offsetY), this.updateSelectionBoxUI(), e.preventDefault(), e.stopPropagation());\n }\n /**\n * 鼠标释放事件处理\n * 结束绘制,执行缩放操作\n */\n onMouseUp(e) {\n this.isDrawing && (this.endDrawing(), this.performZoom(), e.preventDefault(), e.stopPropagation(), this.disActive());\n }\n /**\n * 键盘按下事件处理\n * 按下 ESC 键时退出功能\n */\n onKeyDown(e) {\n e.key === \"Escape\" && (this.disActive(), e.preventDefault(), e.stopPropagation());\n }\n /**\n * 结束绘制\n * 隐藏绘制框\n */\n endDrawing() {\n this.isDrawing && (this.isDrawing = !1, this.selectionBox && (this.selectionBox.style.display = \"none\"));\n }\n /**\n * 更新绘制框UI\n * 根据起点和终点更新绘制框的位置和大小\n */\n updateSelectionBoxUI() {\n if (!this.selectionBox || !this.engine.renderer?.domElement) return;\n const t = Math.min(this.startPoint.x, this.endPoint.x), n = Math.min(this.startPoint.y, this.endPoint.y), i = Math.abs(this.endPoint.x - this.startPoint.x), o = Math.abs(this.endPoint.y - this.startPoint.y);\n this.selectionBox.style.left = `${t}px`, this.selectionBox.style.top = `${n}px`, this.selectionBox.style.width = `${i}px`, this.selectionBox.style.height = `${o}px`;\n }\n /**\n * 执行缩放操作\n * 将屏幕区域转换为世界坐标,计算包围盒,调整相机视角\n */\n performZoom() {\n const e = Math.abs(this.endPoint.x - this.startPoint.x), t = Math.abs(this.endPoint.y - this.startPoint.y);\n if (e < 5 || t < 5)\n return;\n if (!this.worldToScreen) {\n console.warn(\"RangeScale: 坐标转换工具未初始化\");\n return;\n }\n const n = Math.min(this.startPoint.x, this.endPoint.x), i = Math.max(this.startPoint.x, this.endPoint.x), o = Math.min(this.startPoint.y, this.endPoint.y), r = Math.max(this.startPoint.y, this.endPoint.y), a = [], l = [\n { x: n, y: o },\n // 左上\n { x: i, y: o },\n // 右上\n { x: i, y: r },\n // 右下\n { x: n, y: r }\n // 左下\n ];\n for (const c of l) {\n const u = this.worldToScreen.screenToWorld(c.x, c.y);\n u && a.push(u);\n }\n if (a.length < 3) {\n console.warn(\"RangeScale: 框选区域未命中模型,无法执行缩放操作\");\n return;\n }\n if (a.length < 3) {\n console.warn(\"RangeScale: 无法将屏幕区域转换为世界坐标\");\n return;\n }\n const h = new E.Box3();\n for (const c of a)\n h.expandByPoint(c);\n if (h.isEmpty()) {\n console.warn(\"RangeScale: 计算得到的包围盒无效\");\n return;\n }\n this.fitCameraToBoundingBox(h);\n }\n /**\n * 调整相机视角以适应包围盒\n * @param boundingBox - 要适应的包围盒\n */\n fitCameraToBoundingBox(e) {\n const t = this.engine.camera, n = this.engine.controls;\n if (!t || !n) {\n console.warn(\"RangeScale: 相机或控制器未初始化\");\n return;\n }\n const i = new E.Vector3();\n e.getCenter(i);\n const o = new E.Vector3();\n e.getSize(o);\n const r = Math.max(o.x, o.y, o.z);\n if (t instanceof E.PerspectiveCamera) {\n const a = t.fov * (Math.PI / 180), h = r / (2 * Math.tan(a / 2)) * 1.2, c = new E.Vector3();\n t.getWorldDirection(c);\n const u = i.clone().sub(t.position);\n c.dot(u.normalize()) < 0 && c.negate();\n const p = i.clone().sub(c.multiplyScalar(h));\n t.position.copy(p), n.target && n.target.copy(i), t.lookAt(i), n.update();\n } else if (t instanceof E.OrthographicCamera) {\n const l = r * 1.2, h = this.engine.renderer?.domElement, c = h ? h.width / h.height : 1;\n t.left = -l * c / 2, t.right = l * c / 2, t.top = l / 2, t.bottom = -l / 2, t.updateProjectionMatrix();\n const u = new E.Vector3();\n t.getWorldDirection(u);\n const d = r * 1.5, p = i.clone().sub(u.multiplyScalar(d));\n t.position.copy(p), n.target && n.target.copy(i), t.lookAt(i), n.update();\n }\n }\n}\nclass Ju {\n engine;\n ground = null;\n // 地面对象\n constructor(e) {\n this.engine = e;\n }\n init() {\n }\n /**\n * 隐藏或显示性能监视器\n * @param visible - true显示,false隐藏\n */\n setStatsVisible(e) {\n this.engine.stats?.dom && (this.engine.stats.dom.style.display = e ? \"block\" : \"none\");\n }\n /**\n * 设置环境光照强度\n * @param intensity - 光照强度,默认范围 0-5\n */\n setAmbientLightIntensity(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof E.AmbientLight\n );\n t && (t.intensity = e);\n }\n /**\n * 设置环境光照颜色\n * @param color - 颜色,可以是十六进制数字 (0xffffff) 或字符串 ('#ffffff')\n */\n setAmbientLightColor(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof E.AmbientLight\n );\n t && t.color.set(e);\n }\n /**\n * 设置定向光源强度\n * @param intensity - 光照强度,默认范围 0-5\n */\n setDirectionalLightIntensity(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof E.DirectionalLight\n );\n t && (t.intensity = e);\n }\n /**\n * 设置定向光源颜色\n * @param color - 颜色,可以是十六进制数字 (0xffffff) 或字符串 ('#ffffff')\n */\n setDirectionalLightColor(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof E.DirectionalLight\n );\n t && t.color.set(e);\n }\n /**\n * 设置阴影精细度(阴影贴图分辨率)\n * @param quality - 质量等级:'low' (1024), 'medium' (2048), 'high' (4096), 'ultra' (8192)\n */\n setShadowQuality(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof E.DirectionalLight\n );\n if (t?.shadow) {\n const i = {\n low: 1024,\n medium: 2048,\n high: 4096,\n ultra: 8192\n }[e];\n t.shadow.mapSize.width = i, t.shadow.mapSize.height = i, t.shadow.map?.dispose(), t.shadow.map = null;\n }\n }\n /**\n * 设置是否开启定向光阴影\n * @param enabled - true开启,false关闭\n */\n setDirectionalLightShadow(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof E.DirectionalLight\n );\n t && (t.castShadow = e), this.engine.renderer && (this.engine.renderer.shadowMap.enabled = e);\n }\n /**\n * 设置是否开启GTAO阴影(环境光遮蔽)\n * @param enabled - true开启,false关闭\n */\n setGTAOEnabled(e) {\n if (!this.engine.composerModule?.composer) {\n console.warn(\"Composer not initialized\");\n return;\n }\n const t = this.engine.composerModule.composer, n = t.passes.find((i) => i instanceof Ne);\n if (e)\n if (n)\n n.enabled = !0;\n else {\n const { width: i, height: o } = this.engine.deviceModule.getContainerSize(), r = new Ne(\n this.engine.scene,\n this.engine.camera,\n i,\n o\n );\n r.output = Ne.OUTPUT.Default, r.blendIntensity = 0.5, r.updateGtaoMaterial && r.updateGtaoMaterial({\n radius: 1,\n distanceExponent: 1,\n thickness: 1,\n scale: 1,\n distanceFallOff: 1,\n screenSpaceRadius: !0\n });\n const a = t.passes.findIndex(\n (l) => l.constructor.name === \"RenderPass\"\n );\n t.passes.splice(a + 1, 0, r);\n }\n else n && (n.enabled = !1);\n }\n /**\n * 设置场景饱和度\n * @param saturation - 饱和度值,1.0为正常,>1增强,<1降低,推荐范围 0.5-2.0\n */\n setSceneSaturation(e) {\n if (!this.engine.composerModule?.saturationPass) {\n console.warn(\"Saturation pass not initialized\");\n return;\n }\n this.engine.composerModule.saturationPass.uniforms.saturation.value = e;\n }\n /**\n * 设置场景对比度\n * @param contrast - 对比度值,1.0为正常,>1增强,<1降低,推荐范围 0.5-2.0\n */\n setSceneContrast(e) {\n if (!this.engine.composerModule?.saturationPass) {\n console.warn(\"Saturation pass not initialized\");\n return;\n }\n this.engine.composerModule.saturationPass.uniforms.contrast.value = e;\n }\n /**\n * 设置是否开启地面\n * @param enabled - true开启,false关闭\n * @param options - 地面配置选项\n */\n setGroundEnabled(e, t) {\n if (e)\n if (this.ground)\n this.ground.visible = !0;\n else {\n const n = t?.size ?? 100, i = t?.color ?? 8421504, o = t?.opacity ?? 0.3, r = new E.PlaneGeometry(n, n), a = new E.MeshStandardMaterial({\n color: i,\n transparent: !0,\n opacity: o,\n side: E.DoubleSide\n });\n this.ground = new E.Mesh(r, a), this.ground.rotation.x = -Math.PI / 2, this.ground.position.y = 0, this.ground.receiveShadow = !0, this.ground.name = \"ground\", this.engine.scene.add(this.ground);\n }\n else this.ground && (this.ground.visible = !1);\n }\n /**\n * 设置HDR背景\n * @param hdrTexture - HDR环境贴图(THREE.Texture),传入null则移除背景\n */\n setHDRBackground(e) {\n e ? (this.engine.scene.background = e, this.engine.scene.environment = e) : (this.engine.scene.background = null, this.engine.scene.environment = null);\n }\n}\nfunction _t() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(s) {\n var e = Math.random() * 16 | 0, t = s == \"x\" ? e : e & 3 | 8;\n return t.toString(16);\n });\n}\nclass bt {\n engine;\n handelBehaved;\n constructor(e) {\n this.engine = e, this.handelBehaved = tr(e), this.handelBehaved.init(this, null);\n }\n active() {\n this.handelBehaved.active();\n }\n disActive() {\n this.handelBehaved.disActive();\n }\n // 取消当前选中的标注\n cancelCurrentSelectedAnnotation() {\n let e = this.engine.measure.annotationData;\n for (let t in e)\n e[t].forEach((n) => {\n n.highlight == !0 && (n.highlight = !1, n.container.classList.remove(\"Hight\"), n.container.getElementsByTagName(\"svg\")[0].classList.remove(\"Hight\"));\n });\n }\n // 监听按下esc\n handelKeyEscDown() {\n this.cancelCurrentSelectedAnnotation();\n let e = this.engine.measure.annotationData;\n for (let t in e)\n for (let n = e[t].length - 1; n >= 0; n--) {\n let i = e[t][n];\n i.isSelect == !0 && (i.container.remove(), e[t].splice(n, 1));\n }\n this.engine.measure.clearAllPoints();\n }\n // 监听按下delete\n handelKeyDeleteDown() {\n let e = this.engine.measure.annotationData;\n for (let t in e)\n for (let n = e[t].length - 1; n >= 0; n--) {\n let i = e[t][n];\n i.highlight == !0 && (i.container.remove(), e[t].splice(n, 1));\n }\n }\n clearHighlight() {\n let e = this.engine.measure.annotationData;\n for (let t in e)\n e[t].forEach((n) => {\n n.highlight = !1, n.container.classList.remove(\"Hight\"), n.container.getElementsByTagName(\"svg\")[0].classList.remove(\"Hight\");\n });\n }\n // 绘制普通标注\n drawNormalAnnotation() {\n let e = this;\n this.engine.measure.annotationData.normalAnnotation.forEach((f) => {\n p(f);\n }), this.engine.measure.annotationData.elevationAnnotation.forEach((f) => {\n d(f);\n }), this.engine.measure.annotationData.coordinateAnnotation.forEach((f) => {\n u(f);\n }), this.engine.measure.annotationData.angleAnnotation.forEach((f) => {\n l(f);\n }), this.engine.measure.annotationData.areaAnnotation.forEach((f) => {\n h(f);\n }), this.engine.measure.annotationData.slopeAnnotation.forEach((f) => {\n c(f);\n });\n function l(f) {\n if (f.container == null) {\n let M = [\n '',\n '',\n // 起点\n '',\n // 顶点\n '',\n // 终点\n '',\n // 起点到顶点的线\n '',\n // 顶点到终点的线\n '',\n '' + f.text + \"\",\n \"\"\n ].join(\"\");\n f.container = document.createElement(\"div\"), f.container.className = \"angle-annotation\", f.container.id = f.id, f.container.style.pointerEvents = \"none\", f.container.innerHTML = M, e.engine.measure.annotationContainer.appendChild(f.container), f.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), f.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), f.highlight = !0;\n });\n }\n let m = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point1), g = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point2), y = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point3), w = e.engine.reactBoundingClientRect.left, _ = e.engine.reactBoundingClientRect.top;\n m.x += w, m.y += _, g.x += w, g.y += _, y.x += w, y.y += _;\n let x = f.container;\n x.getElementsByTagName(\"circle\")[0].setAttribute(\"cx\", m.x), x.getElementsByTagName(\"circle\")[0].setAttribute(\"cy\", m.y), x.getElementsByTagName(\"circle\")[1].setAttribute(\"cx\", g.x), x.getElementsByTagName(\"circle\")[1].setAttribute(\"cy\", g.y), x.getElementsByTagName(\"circle\")[2].setAttribute(\"cx\", y.x), x.getElementsByTagName(\"circle\")[2].setAttribute(\"cy\", y.y), x.getElementsByTagName(\"polyline\")[0].setAttribute(\"points\", m.x + \",\" + m.y + \" \" + g.x + \",\" + g.y), x.getElementsByTagName(\"polyline\")[1].setAttribute(\"points\", g.x + \",\" + g.y + \" \" + y.x + \",\" + y.y);\n let b = g.x, A = g.y - 30;\n x.getElementsByTagName(\"rect\")[0].setAttribute(\"x\", b - 40), x.getElementsByTagName(\"rect\")[0].setAttribute(\"y\", A - 12.5), x.getElementsByTagName(\"text\")[0].setAttribute(\"x\", b), x.getElementsByTagName(\"text\")[0].setAttribute(\"y\", A + 4), x.getElementsByTagName(\"text\")[0].innerHTML = f.text, x.style.top = \"0px\", x.style.left = \"0px\";\n }\n function h(f) {\n if (f.container == null) {\n let C = [\n '',\n '',\n // 填充区域\n '',\n // 边界线\n '',\n '' + f.text + \"\",\n \"\"\n ].join(\"\");\n f.container = document.createElement(\"div\"), f.container.className = \"area-annotation\", f.container.id = f.id, f.container.innerHTML = C, e.engine.measure.annotationContainer.appendChild(f.container), f.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), f.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), f.highlight = !0;\n });\n }\n if (!f.points || f.points.length < 3)\n return;\n let m = e.engine.reactBoundingClientRect.left, g = e.engine.reactBoundingClientRect.top, y = [], w = 0, _ = 0;\n for (let C = 0; C < f.points.length; C++) {\n let P = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.points[C]);\n P.x += m, P.y += g, y.push(P), w += P.x, _ += P.y;\n }\n w = w / y.length, _ = _ / y.length;\n let x = y.map((C) => C.x + \",\" + C.y).join(\" \"), b = f.container;\n b.getElementsByTagName(\"polygon\")[0].setAttribute(\"points\", x), b.getElementsByTagName(\"polyline\")[0].setAttribute(\"points\", x);\n let A = w, M = _;\n b.getElementsByTagName(\"rect\")[0].setAttribute(\"x\", A - 40), b.getElementsByTagName(\"rect\")[0].setAttribute(\"y\", M - 12.5), b.getElementsByTagName(\"text\")[0].setAttribute(\"x\", A), b.getElementsByTagName(\"text\")[0].setAttribute(\"y\", M + 4), b.getElementsByTagName(\"text\")[0].innerHTML = f.text, b.style.top = \"0px\", b.style.left = \"0px\";\n }\n function c(f) {\n if (f.container == null) {\n let A = [\n '',\n \"\",\n '',\n '',\n // 箭头形状\n \"\",\n \"\",\n '',\n // 起点到终点的线,带箭头\n '',\n '' + f.text + \"\",\n \"\"\n ].join(\"\");\n f.container = document.createElement(\"div\"), f.container.className = \"slope-annotation\", f.container.id = f.id, f.container.innerHTML = A, e.engine.measure.annotationContainer.appendChild(f.container), f.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), f.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), f.highlight = !0;\n });\n }\n let m = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point1), g = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point2), y = e.engine.reactBoundingClientRect.left, w = e.engine.reactBoundingClientRect.top;\n m.x += y, m.y += w, g.x += y, g.y += w;\n let _ = f.container;\n _.getElementsByTagName(\"polyline\")[0].setAttribute(\"points\", m.x + \",\" + m.y + \" \" + g.x + \",\" + g.y);\n let x = (m.x + g.x) / 2, b = (m.y + g.y) / 2 - 30;\n _.getElementsByTagName(\"rect\")[0].setAttribute(\"x\", x - 50), _.getElementsByTagName(\"rect\")[0].setAttribute(\"y\", b - 12.5), _.getElementsByTagName(\"text\")[0].setAttribute(\"x\", x), _.getElementsByTagName(\"text\")[0].setAttribute(\"y\", b + 4), _.getElementsByTagName(\"text\")[0].innerHTML = f.text, _.style.top = \"0px\", _.style.left = \"0px\";\n }\n function u(f) {\n if (f.container == null) {\n let M = [\n '',\n '',\n '',\n '' + f.textX + \"\",\n '',\n '' + f.textY + \"\",\n '',\n '' + f.textZ + \"\",\n \"\"\n ].join(\"\");\n f.container = document.createElement(\"div\"), f.container.className = \"coordinate-annotation\", f.container.id = f.id, f.container.style.position = \"absolute\", f.container.style.pointerEvents = \"none\", f.container.innerHTML = M, e.engine.measure.annotationContainer.appendChild(f.container), f.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), f.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), f.highlight = !0;\n });\n }\n let m = f.container, g = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point), y = e.engine.reactBoundingClientRect.left, w = e.engine.reactBoundingClientRect.top;\n g.x += y, g.y += w, m.style.top = \"0px\", m.style.left = \"0px\";\n let _ = m.getElementsByTagName(\"circle\")[0];\n _ && (_.setAttribute(\"cx\", g.x), _.setAttribute(\"cy\", g.y));\n let x = m.getElementsByTagName(\"rect\"), b = m.getElementsByTagName(\"text\"), A = -55;\n x[0] && (x[0].setAttribute(\"x\", g.x + 10), x[0].setAttribute(\"y\", g.y + 10 + A)), b[0] && (b[0].setAttribute(\"x\", g.x + 10 + 40), b[0].setAttribute(\"y\", g.y + 10 + 16 + A)), x[1] && (x[1].setAttribute(\"x\", g.x + 10), x[1].setAttribute(\"y\", g.y + 10 + 30 + A)), b[1] && (b[1].setAttribute(\"x\", g.x + 10 + 40), b[1].setAttribute(\"y\", g.y + 10 + 46 + A)), x[2] && (x[2].setAttribute(\"x\", g.x + 10), x[2].setAttribute(\"y\", g.y + 10 + 60 + A)), b[2] && (b[2].setAttribute(\"x\", g.x + 10 + 40), b[2].setAttribute(\"y\", g.y + 10 + 76 + A)), b[0] && (b[0].innerHTML = f.textX), b[1] && (b[1].innerHTML = f.textY), b[2] && (b[2].innerHTML = f.textZ);\n }\n function d(f) {\n if (f.container == null) {\n let _ = [\n '',\n '',\n '' + f.text + \"\",\n '',\n \"\"\n ].join(\"\");\n f.container = document.createElement(\"div\"), f.container.className = \"elevation-annotation\", f.container.id = f.id, f.container.style.position = \"absolute\", f.container.style.pointerEvents = \"none\", f.container.innerHTML = _, e.engine.measure.annotationContainer.appendChild(f.container), f.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), f.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), f.highlight = !0;\n });\n }\n let m = f.container, g = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point), y = e.engine.reactBoundingClientRect.left, w = e.engine.reactBoundingClientRect.top;\n m.style.top = g.y + w - 48 + \"px\", m.style.left = g.x + y - 16 + \"px\", m.getElementsByTagName(\"text\")[0].innerHTML = f.text;\n }\n function p(f) {\n if (f.container == null) {\n let x = [\n '',\n '',\n '',\n '',\n '',\n '' + f.text + \"\",\n \"\"\n ].join(\"\");\n f.container = document.createElement(\"div\"), f.container.className = \"normal-annotation\", f.container.id = f.id, f.container.innerHTML = x, e.engine.measure.annotationContainer.appendChild(f.container), f.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), f.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), f.highlight = !0;\n });\n }\n let m = f.container;\n if (f.point1 == null || f.point2 == null) {\n m.style.display = \"none\";\n return;\n } else\n m.style.display = \"block\";\n let g = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point1), y = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point2), w = e.engine.reactBoundingClientRect.left, _ = e.engine.reactBoundingClientRect.top;\n g.x += w, g.y += _, y.x += w, y.y += _, m.getElementsByTagName(\"polyline\")[0].setAttribute(\"points\", g.x + \",\" + g.y + \" \" + y.x + \",\" + y.y), m.getElementsByTagName(\"circle\")[0].setAttribute(\"cx\", g.x), m.getElementsByTagName(\"circle\")[0].setAttribute(\"cy\", g.y), m.getElementsByTagName(\"circle\")[1].setAttribute(\"cx\", y.x), m.getElementsByTagName(\"circle\")[1].setAttribute(\"cy\", y.y), m.getElementsByTagName(\"rect\")[0].setAttribute(\"x\", g.x * 0.5 + y.x * 0.5 - 40), m.getElementsByTagName(\"rect\")[0].setAttribute(\"y\", g.y * 0.5 + y.y * 0.5 - 12.5), m.getElementsByTagName(\"text\")[0].setAttribute(\"x\", g.x * 0.5 + y.x * 0.5 + 40 - 40), m.getElementsByTagName(\"text\")[0].setAttribute(\"y\", g.y * 0.5 + y.y * 0.5 + 16 - 12.5), m.getElementsByTagName(\"text\")[0].innerHTML = f.text, m.style.top = \"0px\", m.style.left = \"0px\";\n }\n }\n}\nclass Qu {\n engine;\n isActive = !1;\n tools;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new bt(e);\n }\n // 启动净高测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.isActive = !0, this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n }\n // 停止净高测量\n disActive() {\n this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 鼠标点击\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n if (this.points.length == 0) {\n this.points.push(e.catch.point);\n return;\n }\n let t = this.engine.measure.annotationData.normalAnnotation.find((n) => n.isSelect == !0);\n t != null && (t.isSelect = !1);\n }\n // 鼠标移动\n handleMouseMove(e) {\n if (e.catch == null || this.points.length == 0)\n return;\n let t = this.engine.measure.annotationData.normalAnnotation.find((r) => r.isSelect == !0);\n t == null && (t = {\n text: null,\n id: _t(),\n isSelect: !0\n }, this.engine.measure.annotationData.normalAnnotation.push(t));\n let n = new E.Raycaster(e.catch.point.clone().add(new E.Vector3(0, 0.01, 0)), new E.Vector3(0, 1, 0));\n const i = this.engine.octreeBox.rayInterationModel(n);\n if (i.length === 0) {\n t.point2 = null;\n return;\n }\n let o = e.catch;\n t.point1 = o.point, t.point2 = i[0].point, t.text = t.point1.clone().distanceTo(t.point2.clone()).toFixed(2) + \" m\";\n }\n}\nclass ef {\n engine;\n tools;\n isActive = !1;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new bt(e);\n }\n // 启动距离测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.isActive = !0, this.points = [], this.behavior = this.engine.handelBehaved, this.behavior.init(this, { showCatch: !0 }), this.behavior.active();\n }\n // 停止距离测量\n disActive() {\n this.points = [], this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 鼠标点击\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (this.points.length == 0)\n this.points.push(t.point);\n else if (this.points.length == 1) {\n let n = this.engine.measure.annotationData.normalAnnotation.find((i) => i.isSelect == !0);\n if (n == null)\n return;\n n.point2 = t.point, n.isSelect = !1, this.points = [], this.engine.events.trigger(wt.MeasureChanged, n);\n }\n }\n // 鼠标移动\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (t != null && this.points.length == 1) {\n let n = this.engine.measure.annotationData.normalAnnotation.find((i) => i.isSelect == !0);\n n == null && (n = {\n id: _t(),\n point1: this.points[0].clone(),\n point2: t.point.clone(),\n text: this.points[0].clone().distanceTo(t.point.clone()).toFixed(2) + \" m\",\n isSelect: !0\n }, this.engine.measure.annotationData.normalAnnotation.push(n)), n.point2 = t.point, n.text = n.point1.clone().distanceTo(n.point2.clone()).toFixed(2) + \" m\", console.log(\"距离\", n.text);\n }\n }\n // 按下esc\n}\nclass tf {\n engine;\n isActive = !1;\n tools;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new bt(e);\n }\n // 启动净高测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.isActive = !0, this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n }\n // 停止净距测量\n disActive() {\n this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 鼠标点击\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n if (this.points.length == 0) {\n this.points.push(e.catch.point);\n return;\n }\n let t = this.engine.measure.annotationData.normalAnnotation.find((n) => n.isSelect == !0);\n t != null && (t.isSelect = !1);\n }\n // 鼠标移动\n handleMouseMove(e) {\n if (e.catch == null || this.points.length == 0)\n return;\n let t = this.engine.measure.annotationData.normalAnnotation.find((r) => r.isSelect == !0);\n t == null && (t = {\n text: null,\n id: _t(),\n isSelect: !0\n }, this.engine.measure.annotationData.normalAnnotation.push(t));\n let n = new E.Raycaster(e.catch.point.clone().add(e.catch.normal.clone().setLength(0.01)), e.catch.normal);\n const i = this.engine.octreeBox.rayInterationModel(n);\n if (i.length == 0) {\n t.point2 = null;\n return;\n }\n let o = e.catch;\n t.point1 = o.point, t.point2 = i[0].point, t.text = t.point1.clone().distanceTo(t.point2.clone()).toFixed(2) + \" m\";\n }\n}\nclass nf {\n engine;\n isActive = !1;\n tools;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new bt(e);\n }\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active(), this.isActive = !0;\n }\n disActive() {\n this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = this.engine.measure.annotationData.elevationAnnotation.find((n) => n.isSelect == !0);\n t == null && (t = {\n id: _t(),\n point: e.catch.point.clone(),\n text: Math.round(e.catch.point.y) + \" m\",\n isSelect: !0\n }, this.engine.measure.annotationData.elevationAnnotation.push(t)), t.point = e.catch.point.clone(), t.text = Math.round(e.catch.point.y) + \" m\";\n }\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = this.engine.measure.annotationData.elevationAnnotation.find((n) => n.isSelect == !0);\n t != null && (t.isSelect = !1, t.point = e.catch.point.clone(), t.text = Math.round(e.catch.point.y) + \" m\", this.engine.events.trigger(wt.MeasureChanged, t));\n }\n}\nclass sf {\n engine;\n isActive = !1;\n tools;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new bt(e);\n }\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active(), this.isActive = !0;\n }\n disActive() {\n this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = this.engine.measure.annotationData.coordinateAnnotation.find((n) => n.isSelect == !0);\n t == null && (t = {\n id: _t(),\n point: e.catch.point.clone(),\n text: Math.round(e.catch.point.y) + \" m\",\n isSelect: !0\n }, this.engine.measure.annotationData.coordinateAnnotation.push(t)), t.point = e.catch.point.clone(), t.textX = Math.round(e.catch.point.x) + \" m\", t.textY = Math.round(e.catch.point.y) + \" m\", t.textZ = Math.round(e.catch.point.z) + \" m\";\n }\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = this.engine.measure.annotationData.coordinateAnnotation.find((n) => n.isSelect == !0);\n t != null && (t.isSelect = !1, t.point = e.catch.point.clone(), t.textX = Math.round(e.catch.point.x) + \" m\", t.textY = Math.round(e.catch.point.y) + \" m\", t.textZ = Math.round(e.catch.point.z) + \" m\", this.engine.events.trigger(wt.MeasureChanged, t));\n }\n}\nclass rf {\n engine;\n tools;\n // 存储三个点:起点、顶点(中间点)、终点\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new bt(e);\n }\n // 启动角度测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.points = [], this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n }\n // 停止角度测量\n disActive() {\n this.points = [], this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 计算三点形成的角度(以第二个点为顶点)\n // point1: 起点, point2: 顶点, point3: 终点\n calculateAngle(e, t, n) {\n const i = new E.Vector3().subVectors(e, t), o = new E.Vector3().subVectors(n, t), r = i.length(), a = o.length();\n if (r === 0 || a === 0)\n return 0;\n const h = i.dot(o) / (r * a), c = Math.max(-1, Math.min(1, h));\n return Math.acos(c) * (180 / Math.PI);\n }\n // 处理鼠标点击事件\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (this.points.length == 0)\n this.points.push(t.point);\n else if (this.points.length == 1)\n this.points.push(t.point);\n else if (this.points.length == 2) {\n let n = this.engine.measure.annotationData.angleAnnotation.find((i) => i.isSelect == !0);\n if (n == null)\n return;\n n.point3 = t.point.clone(), n.angle = this.calculateAngle(n.point1, n.point2, n.point3), n.text = n.angle.toFixed(2) + \"°\", n.isSelect = !1, this.points = [], this.engine.events.trigger(wt.MeasureChanged, n);\n }\n }\n // 处理鼠标移动事件\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = this.tools.renderCatchElement(e.catch);\n if (t != null && this.points.length != 1 && this.points.length == 2) {\n let n = this.engine.measure.annotationData.angleAnnotation.find((i) => i.isSelect == !0);\n n == null && (n = {\n id: _t(),\n point1: this.points[0].clone(),\n // 起点\n point2: this.points[1].clone(),\n // 顶点(中间点)\n point3: t.point.clone(),\n // 终点(实时更新)\n angle: 0,\n text: \"0.00°\",\n isSelect: !0\n }, this.engine.measure.annotationData.angleAnnotation.push(n)), n.point3 = t.point.clone(), n.angle = this.calculateAngle(n.point1, n.point2, n.point3), n.text = n.angle.toFixed(2) + \"°\", console.log(\"角度\", n.text);\n }\n }\n}\nclass of {\n engine;\n tools;\n // 存储多个点,用于围成区域\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new bt(e);\n }\n // 启动面积测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.points = [], this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n }\n // 停止面积测量\n disActive() {\n this.points = [], this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 计算多边形面积(使用鞋带公式/Shoelace formula)\n // 注意:这个方法假设点在同一个平面上,使用XZ平面投影计算面积\n calculateArea(e) {\n if (e.length < 3)\n return 0;\n let t = 0;\n const n = e.length;\n for (let i = 0; i < n; i++) {\n const o = (i + 1) % n;\n t += e[i].x * e[o].z, t -= e[o].x * e[i].z;\n }\n return t = Math.abs(t) / 2, t;\n }\n // 处理鼠标点击事件\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (this.points.push(t.point.clone()), this.points.length >= 3) {\n let n = this.engine.measure.annotationData.areaAnnotation.find((i) => i.isSelect == !0);\n n == null ? (n = {\n id: _t(),\n points: this.points.map((i) => i.clone()),\n // 复制所有点\n area: 0,\n text: \"0.00 m²\",\n isSelect: !0\n }, this.engine.measure.annotationData.areaAnnotation.push(n)) : n.points = this.points.map((i) => i.clone()), n.area = this.calculateArea(n.points), n.text = n.area.toFixed(2) + \" m²\", console.log(\"面积\", n.text);\n }\n }\n // 处理鼠标移动事件\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = this.tools.renderCatchElement(e.catch);\n if (t != null && this.points.length >= 2) {\n let n = this.engine.measure.annotationData.areaAnnotation.find((i) => i.isSelect == !0);\n if (n == null) {\n if (this.points.length >= 2) {\n let i = this.points.map((o) => o.clone());\n i.push(t.point.clone()), i.length >= 3 && (n = {\n id: _t(),\n points: i,\n area: 0,\n text: \"0.00 m²\",\n isSelect: !0\n }, this.engine.measure.annotationData.areaAnnotation.push(n));\n }\n } else if (n.points.length > 0) {\n const i = n.points.length - 1;\n n.points[i] = t.point.clone();\n } else\n n.points = this.points.map((i) => i.clone()), n.points.push(t.point.clone());\n n && n.points.length >= 3 && (n.area = this.calculateArea(n.points), n.text = n.area.toFixed(2) + \" m²\");\n }\n }\n // 完成面积测量(可以用于双击或右键完成)\n finishMeasure() {\n let e = this.engine.measure.annotationData.areaAnnotation.find((t) => t.isSelect == !0);\n e != null && e.points.length >= 3 && (e.points.length > this.points.length && (e.points = this.points.map((t) => t.clone())), e.area = this.calculateArea(e.points), e.text = e.area.toFixed(2) + \" m²\", e.isSelect = !1, this.points = [], this.engine.events.trigger(wt.MeasureChanged, e));\n }\n}\nclass af {\n engine;\n tools;\n // 存储两个点:起点和终点\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new bt(e);\n }\n // 启动坡度测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.points = [], this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n }\n // 停止坡度测量\n disActive() {\n this.points = [], this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 计算两点之间的坡度\n // point1: 起点, point2: 终点\n // 返回:{ percentage: 坡度百分比, angle: 坡度角度(度), heightDiff: 高度差, horizontalDist: 水平距离 }\n calculateSlope(e, t) {\n const n = t.y - e.y, i = t.x - e.x, o = t.z - e.z, r = Math.sqrt(i * i + o * o);\n if (r === 0)\n return {\n percentage: 0,\n angle: 0,\n heightDiff: n,\n horizontalDist: 0\n };\n const a = n / r * 100, h = Math.atan(n / r) * (180 / Math.PI);\n return {\n percentage: a,\n angle: h,\n heightDiff: n,\n horizontalDist: r\n };\n }\n // 处理鼠标点击事件\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = this.tools.renderCatchElement(e.catch);\n if (this.points.length == 0)\n this.points.push(t.point);\n else if (this.points.length == 1) {\n let n = this.engine.measure.annotationData.slopeAnnotation.find((o) => o.isSelect == !0);\n if (n == null)\n return;\n n.point2 = t.point.clone();\n const i = this.calculateSlope(n.point1, n.point2);\n n.slopePercentage = i.percentage, n.slopeAngle = i.angle, n.heightDiff = i.heightDiff, n.horizontalDist = i.horizontalDist, n.text = i.percentage.toFixed(2) + \"% (\" + i.angle.toFixed(2) + \"°)\", n.isSelect = !1, this.points = [], this.engine.events.trigger(wt.MeasureChanged, n);\n }\n }\n // 处理鼠标移动事件\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = this.tools.renderCatchElement(e.catch);\n if (t != null && this.points.length == 1) {\n let n = this.engine.measure.annotationData.slopeAnnotation.find((o) => o.isSelect == !0);\n n == null && (n = {\n id: _t(),\n point1: this.points[0].clone(),\n // 起点\n point2: t.point.clone(),\n // 终点(实时更新)\n slopePercentage: 0,\n slopeAngle: 0,\n heightDiff: 0,\n horizontalDist: 0,\n text: \"0.00% (0.00°)\",\n isSelect: !0\n }, this.engine.measure.annotationData.slopeAnnotation.push(n)), n.point2 = t.point.clone();\n const i = this.calculateSlope(n.point1, n.point2);\n n.slopePercentage = i.percentage, n.slopeAngle = i.angle, n.heightDiff = i.heightDiff, n.horizontalDist = i.horizontalDist, n.text = i.percentage.toFixed(2) + \"% (\" + i.angle.toFixed(2) + \"°)\", console.log(\"坡度\", n.text);\n }\n }\n}\nclass lf {\n isActive = !1;\n engine;\n clearHeightMeasure;\n distanceMeasure;\n clearDistanceMeasure;\n elevationMeasure;\n pointMeasure;\n angleMeasure;\n areaMeasure;\n slopeMeasure;\n tools;\n annotationContainer;\n // 存储标注信息\n annotationData = {\n normalAnnotation: [],\n textAnnotation: [],\n coordinateAnnotation: [],\n angleAnnotation: [],\n distanceAnnotation: [],\n areaAnnotation: [],\n slopeAnnotation: [],\n elevationAnnotation: [],\n volumeAnnotation: []\n };\n constructor(e) {\n this.engine = e, this.clearHeightMeasure = new Qu(e), this.distanceMeasure = new ef(e), this.clearDistanceMeasure = new tf(e), this.elevationMeasure = new nf(e), this.pointMeasure = new sf(e), this.angleMeasure = new rf(e), this.areaMeasure = new of(e), this.slopeMeasure = new af(e), this.tools = new bt(e), this.annotationContainer = document.createElement(\"div\"), this.annotationContainer.className = \"annotation-container\", e.container.parentElement.appendChild(this.annotationContainer);\n }\n active() {\n this.isActive = !0, this.tools.active();\n }\n disActive() {\n this.tools.disActive(), this.clearAll(), this.isActive = !1, this.clearHeightMeasure.disActive(), this.distanceMeasure.disActive(), this.clearDistanceMeasure.disActive(), this.elevationMeasure.disActive(), this.pointMeasure.disActive(), this.angleMeasure.disActive(), this.areaMeasure.disActive(), this.slopeMeasure.disActive(), this.engine.interactionModule.active();\n }\n // 清空所有点的测量\n clearAllPoints() {\n this.clearHeightMeasure.clearAllPoints(), this.distanceMeasure.clearAllPoints(), this.clearDistanceMeasure.clearAllPoints(), this.elevationMeasure.clearAllPoints(), this.pointMeasure.clearAllPoints(), this.angleMeasure.clearAllPoints(), this.areaMeasure.clearAllPoints(), this.slopeMeasure.clearAllPoints();\n }\n // 清除所有测量\n clearAll() {\n e(this.annotationData.normalAnnotation), e(this.annotationData.textAnnotation), e(this.annotationData.coordinateAnnotation), e(this.annotationData.angleAnnotation), e(this.annotationData.distanceAnnotation), e(this.annotationData.areaAnnotation), e(this.annotationData.slopeAnnotation), e(this.annotationData.elevationAnnotation), e(this.annotationData.volumeAnnotation);\n function e(t) {\n for (let n = 0; n < t.length; n++)\n t[n].container.remove();\n t = [];\n }\n }\n // 更新标注\n update() {\n this.isActive && this.tools.drawNormalAnnotation();\n }\n}\nclass cf {\n engine;\n isActive = !1;\n isDrag = !1;\n meshs = [];\n box;\n pickPoint;\n pickNormal;\n pickMesh;\n box_;\n plane;\n constructor(e) {\n this.engine = e, this.meshs = [], this.box = null;\n }\n // 启动\n active() {\n if (this.isActive == !0)\n return;\n this.isActive = !0, this.init(), this.meshs.forEach((t) => {\n t.visible = !0;\n }), this.engine.handelBehaved.init(this), this.engine.handelBehaved.active();\n let e = this;\n e.engine.scene.children.filter((t) => t.type == \"Mesh\" && t.url).forEach((t) => {\n t.material && Array.isArray(t.material) ? t.material.forEach((n) => {\n n.clippingPlanes = e.engine.sectionPlane;\n }) : t.material.clippingPlanes = e.engine.sectionPlane, e.engine.clipping.clippingStencil?.addMesh(e.engine.sectionPlane.find((n) => n.name == \"前\"), t);\n });\n }\n disActive() {\n this.isActive = !1, this.engine.handelBehaved.disActive();\n const e = this.engine.sectionPlane.find((t) => t.name == \"前\");\n e && (e.constant = 1e5), this.meshs.forEach((t) => {\n t.visible = !1;\n });\n }\n // 初始化\n init() {\n let e = this.engine.octreeBox.getBoundingBox();\n this.box = e, this.updata_face(e);\n }\n // 更新面\n updata_face(e) {\n let t = this, n = t.engine.scene.children.find((r) => r.type == \"Group\" && r.name == \"ClippingBox\");\n n == null && (n = new E.Group(), n.name = \"ClippingBox\", t.engine.scene.add(n));\n let i = [\n new E.Vector3(e.min.x, e.min.y, e.min.z),\n new E.Vector3(e.max.x, e.min.y, e.min.z),\n new E.Vector3(e.max.x, e.max.y, e.min.z),\n new E.Vector3(e.min.x, e.max.y, e.min.z)\n ];\n o(i, new E.Vector3(0, 0, -1), \"前\");\n function o(r, a, l) {\n const h = new E.BufferGeometry(), c = new Float32Array([\n r[0].x,\n r[0].y,\n r[0].z,\n // 点1\n r[1].x,\n r[1].y,\n r[1].z,\n // 点2\n r[2].x,\n r[2].y,\n r[2].z,\n // 点3\n r[3].x,\n r[3].y,\n r[3].z\n // 点4\n ]), u = [\n 0,\n 1,\n 2,\n // 第一个三角形\n 0,\n 2,\n 3\n // 第二个三角形\n ];\n h.setAttribute(\"position\", new E.BufferAttribute(c, 3)), h.setIndex(u);\n let d = t.meshs.find((y) => y.name == l);\n if (d == null) {\n const y = new E.MeshBasicMaterial({\n color: 65280,\n // 绿色\n transparent: !0,\n opacity: 0.02,\n side: E.DoubleSide\n // 双面渲染\n }), w = new E.Mesh(h, y);\n w.normal = a, w.name = l, n.add(w), t.meshs.push(w);\n } else\n d.geometry = h;\n const p = new Float32Array([\n r[0].x,\n r[0].y,\n r[0].z,\n // 点1\n r[1].x,\n r[1].y,\n r[1].z,\n // 点2\n r[2].x,\n r[2].y,\n r[2].z,\n // 点3\n r[3].x,\n r[3].y,\n r[3].z,\n // 点4 \n r[0].x,\n r[0].y,\n r[0].z\n // 点1\n ]);\n let f = new E.LineBasicMaterial({ color: 255 }), m = new E.BufferGeometry();\n m.setAttribute(\"position\", new E.BufferAttribute(p, 3));\n let g = t.meshs.find((y) => y.name == l + \"Line\");\n g == null && (g = new E.Line(m, f), g.name = l + \"Line\", n.add(g), t.meshs.push(g)), g.geometry = m, g.material = f, t.engine.sectionPlane.find((y) => y.name == l).setFromNormalAndCoplanarPoint(a.clone().setLength(-1), e.min);\n }\n }\n // 重写鼠标按下事件\n handleMouseDown(e) {\n this.isDrag = !0;\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0)\n if (this.pickPoint = t[0].point, this.pickNormal = t[0].face.normal, this.engine.controls.enabled = !1, this.pickMesh = t[0].object, this.box_ = {\n min: this.box.min.clone(),\n max: this.box.max.clone()\n }, this.pickNormal.y == 0) {\n const n = new E.Plane();\n n.setFromNormalAndCoplanarPoint(new E.Vector3(0, 1, 0), this.pickPoint), this.plane = n;\n } else {\n let n = new E.Vector3(this.engine.camera.position.x, this.pickPoint.y, this.engine.camera.position.z);\n const i = new E.Plane();\n i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1), this.pickPoint), this.plane = i;\n }\n }\n handleMouseUp(e) {\n this.isDrag = !1, this.pickPoint = null, this.pickNormal = null, this.pickMesh = null, this.engine.controls.enabled = !0;\n }\n handleMouseMove(e) {\n this.meshs.forEach((n) => {\n n.material.opacity = 0;\n });\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0 && (t[0].object.material.opacity = 0.05), this.pickPoint != null) {\n const n = new E.Vector3();\n if (e.raycaster.ray.intersectPlane(this.plane, n)) {\n let i = n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());\n this.pickMesh.name == \"前\" || this.pickMesh.name == \"左\" || this.pickMesh.name == \"底\" ? this.box.min = this.box_.min.clone().add(this.pickNormal.clone().setLength(i)) : this.box.max = this.box_.max.clone().add(this.pickNormal.clone().setLength(i)), this.updata_face(this.box);\n }\n }\n }\n}\nconst Sa = 0, hf = 1, uf = 2, Yr = 2, ls = 1.25, $r = 1, Be = 32, Ee = Be / 4, Ta = 65535, ff = Math.pow(2, -24), cs = Symbol(\"SKIP_GENERATION\");\nfunction df(s) {\n return s.index ? s.index.count : s.attributes.position.count;\n}\nfunction Qt(s) {\n return df(s) / 3;\n}\nfunction pf(s, e = ArrayBuffer) {\n return s > 65535 ? new Uint32Array(new e(4 * s)) : new Uint16Array(new e(2 * s));\n}\nfunction mf(s, e) {\n if (!s.index) {\n const t = s.attributes.position.count, n = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, i = pf(t, n);\n s.setIndex(new at(i, 1));\n for (let o = 0; o < t; o++)\n i[o] = o;\n }\n}\nfunction Ea(s, e) {\n const t = Qt(s), n = e || s.drawRange, i = n.start / 3, o = (n.start + n.count) / 3, r = Math.max(0, i), a = Math.min(t, o) - r;\n return [{\n offset: Math.floor(r),\n count: Math.floor(a)\n }];\n}\nfunction Jr(s, e) {\n if (!s.groups || !s.groups.length)\n return Ea(s, e);\n const t = [], n = e || s.drawRange, i = n.start / 3, o = (n.start + n.count) / 3, r = Qt(s), a = [];\n for (const c of s.groups) {\n const { start: u, count: d } = c, p = u / 3, f = isFinite(d) ? d : r * 3 - u, m = (u + f) / 3;\n p < o && m > i && (a.push({ pos: Math.max(i, p), isStart: !0 }), a.push({ pos: Math.min(o, m), isStart: !1 }));\n }\n a.sort((c, u) => c.pos !== u.pos ? c.pos - u.pos : c.type === \"end\" ? -1 : 1);\n let l = 0, h = null;\n for (const c of a) {\n const u = c.pos;\n l !== 0 && u !== h && t.push({\n offset: h,\n count: u - h\n }), l += c.isStart ? 1 : -1, h = u;\n }\n return t;\n}\nfunction hs(s, e, t, n, i) {\n let o = 1 / 0, r = 1 / 0, a = 1 / 0, l = -1 / 0, h = -1 / 0, c = -1 / 0, u = 1 / 0, d = 1 / 0, p = 1 / 0, f = -1 / 0, m = -1 / 0, g = -1 / 0;\n const y = s.offset || 0;\n for (let w = (e - y) * 6, _ = (e + t - y) * 6; w < _; w += 6) {\n const x = s[w + 0], b = s[w + 1], A = x - b, M = x + b;\n A < o && (o = A), M > l && (l = M), x < u && (u = x), x > f && (f = x);\n const C = s[w + 2], P = s[w + 3], k = C - P, B = C + P;\n k < r && (r = k), B > h && (h = B), C < d && (d = C), C > m && (m = C);\n const T = s[w + 4], D = s[w + 5], v = T - D, I = T + D;\n v < a && (a = v), I > c && (c = I), T < p && (p = T), T > g && (g = T);\n }\n n[0] = o, n[1] = r, n[2] = a, n[3] = l, n[4] = h, n[5] = c, i[0] = u, i[1] = d, i[2] = p, i[3] = f, i[4] = m, i[5] = g;\n}\nfunction Qr(s, e, t = null, n = null, i = null) {\n const o = s.attributes.position, r = s.index ? s.index.array : null, a = o.normalized;\n if (i === null)\n i = new Float32Array(t * 6), i.offset = e;\n else if (e < 0 || t + e > i.length / 6)\n throw new Error(\"MeshBVH: compute triangle bounds range is invalid.\");\n const l = o.array, h = o.offset || 0;\n let c = 3;\n o.isInterleavedBufferAttribute && (c = o.data.stride);\n const u = [\"getX\", \"getY\", \"getZ\"], d = i.offset;\n for (let p = e, f = e + t; p < f; p++) {\n const g = (n ? n[p] : p) * 3, y = (p - d) * 6;\n let w = g + 0, _ = g + 1, x = g + 2;\n r && (w = r[w], _ = r[_], x = r[x]), a || (w = w * c + h, _ = _ * c + h, x = x * c + h);\n for (let b = 0; b < 3; b++) {\n let A, M, C;\n a ? (A = o[u[b]](w), M = o[u[b]](_), C = o[u[b]](x)) : (A = l[w + b], M = l[_ + b], C = l[x + b]);\n let P = A;\n M < P && (P = M), C < P && (P = C);\n let k = A;\n M > k && (k = M), C > k && (k = C);\n const B = (k - P) / 2, T = b * 2;\n i[y + T + 0] = P + B, i[y + T + 1] = B + (Math.abs(P) + B) * ff;\n }\n }\n return i;\n}\nfunction we(s, e, t) {\n return t.min.x = e[s], t.min.y = e[s + 1], t.min.z = e[s + 2], t.max.x = e[s + 3], t.max.y = e[s + 4], t.max.z = e[s + 5], t;\n}\nfunction eo(s) {\n let e = -1, t = -1 / 0;\n for (let n = 0; n < 3; n++) {\n const i = s[n + 3] - s[n];\n i > t && (t = i, e = n);\n }\n return e;\n}\nfunction to(s, e) {\n e.set(s);\n}\nfunction no(s, e, t) {\n let n, i;\n for (let o = 0; o < 3; o++) {\n const r = o + 3;\n n = s[o], i = e[o], t[o] = n < i ? n : i, n = s[r], i = e[r], t[r] = n > i ? n : i;\n }\n}\nfunction ni(s, e, t) {\n for (let n = 0; n < 3; n++) {\n const i = e[s + 2 * n], o = e[s + 2 * n + 1], r = i - o, a = i + o;\n r < t[n] && (t[n] = r), a > t[n + 3] && (t[n + 3] = a);\n }\n}\nfunction Mn(s) {\n const e = s[3] - s[0], t = s[4] - s[1], n = s[5] - s[2];\n return 2 * (e * t + t * n + n * e);\n}\nconst mt = 32, gf = (s, e) => s.candidate - e.candidate, Et = /* @__PURE__ */ new Array(mt).fill().map(() => ({\n count: 0,\n bounds: new Float32Array(6),\n rightCacheBounds: new Float32Array(6),\n leftCacheBounds: new Float32Array(6),\n candidate: 0\n})), ii = /* @__PURE__ */ new Float32Array(6);\nfunction yf(s, e, t, n, i, o) {\n let r = -1, a = 0;\n if (o === Sa)\n r = eo(e), r !== -1 && (a = (e[r] + e[r + 3]) / 2);\n else if (o === hf)\n r = eo(s), r !== -1 && (a = wf(t, n, i, r));\n else if (o === uf) {\n const l = Mn(s);\n let h = ls * i;\n const c = t.offset || 0, u = (n - c) * 6, d = (n + i - c) * 6;\n for (let p = 0; p < 3; p++) {\n const f = e[p], y = (e[p + 3] - f) / mt;\n if (i < mt / 4) {\n const w = [...Et];\n w.length = i;\n let _ = 0;\n for (let b = u; b < d; b += 6, _++) {\n const A = w[_];\n A.candidate = t[b + 2 * p], A.count = 0;\n const {\n bounds: M,\n leftCacheBounds: C,\n rightCacheBounds: P\n } = A;\n for (let k = 0; k < 3; k++)\n P[k] = 1 / 0, P[k + 3] = -1 / 0, C[k] = 1 / 0, C[k + 3] = -1 / 0, M[k] = 1 / 0, M[k + 3] = -1 / 0;\n ni(b, t, M);\n }\n w.sort(gf);\n let x = i;\n for (let b = 0; b < x; b++) {\n const A = w[b];\n for (; b + 1 < x && w[b + 1].candidate === A.candidate; )\n w.splice(b + 1, 1), x--;\n }\n for (let b = u; b < d; b += 6) {\n const A = t[b + 2 * p];\n for (let M = 0; M < x; M++) {\n const C = w[M];\n A >= C.candidate ? ni(b, t, C.rightCacheBounds) : (ni(b, t, C.leftCacheBounds), C.count++);\n }\n }\n for (let b = 0; b < x; b++) {\n const A = w[b], M = A.count, C = i - A.count, P = A.leftCacheBounds, k = A.rightCacheBounds;\n let B = 0;\n M !== 0 && (B = Mn(P) / l);\n let T = 0;\n C !== 0 && (T = Mn(k) / l);\n const D = $r + ls * (B * M + T * C);\n D < h && (r = p, h = D, a = A.candidate);\n }\n } else {\n for (let x = 0; x < mt; x++) {\n const b = Et[x];\n b.count = 0, b.candidate = f + y + x * y;\n const A = b.bounds;\n for (let M = 0; M < 3; M++)\n A[M] = 1 / 0, A[M + 3] = -1 / 0;\n }\n for (let x = u; x < d; x += 6) {\n let M = ~~((t[x + 2 * p] - f) / y);\n M >= mt && (M = mt - 1);\n const C = Et[M];\n C.count++, ni(x, t, C.bounds);\n }\n const w = Et[mt - 1];\n to(w.bounds, w.rightCacheBounds);\n for (let x = mt - 2; x >= 0; x--) {\n const b = Et[x], A = Et[x + 1];\n no(b.bounds, A.rightCacheBounds, b.rightCacheBounds);\n }\n let _ = 0;\n for (let x = 0; x < mt - 1; x++) {\n const b = Et[x], A = b.count, M = b.bounds, P = Et[x + 1].rightCacheBounds;\n A !== 0 && (_ === 0 ? to(M, ii) : no(M, ii, ii)), _ += A;\n let k = 0, B = 0;\n _ !== 0 && (k = Mn(ii) / l);\n const T = i - _;\n T !== 0 && (B = Mn(P) / l);\n const D = $r + ls * (k * _ + B * T);\n D < h && (r = p, h = D, a = b.candidate);\n }\n }\n }\n } else\n console.warn(`MeshBVH: Invalid build strategy value ${o} used.`);\n return { axis: r, pos: a };\n}\nfunction wf(s, e, t, n) {\n let i = 0;\n const o = s.offset;\n for (let r = e, a = e + t; r < a; r++)\n i += s[(r - o) * 6 + n * 2];\n return i / t;\n}\nclass us {\n constructor() {\n this.boundingData = new Float32Array(6);\n }\n}\nfunction _f(s, e, t, n, i, o) {\n let r = n, a = n + i - 1;\n const l = o.pos, h = o.axis * 2, c = t.offset || 0;\n for (; ; ) {\n for (; r <= a && t[(r - c) * 6 + h] < l; )\n r++;\n for (; r <= a && t[(a - c) * 6 + h] >= l; )\n a--;\n if (r < a) {\n for (let u = 0; u < 3; u++) {\n let d = e[r * 3 + u];\n e[r * 3 + u] = e[a * 3 + u], e[a * 3 + u] = d;\n }\n for (let u = 0; u < 6; u++) {\n const d = r - c, p = a - c, f = t[d * 6 + u];\n t[d * 6 + u] = t[p * 6 + u], t[p * 6 + u] = f;\n }\n r++, a--;\n } else\n return r;\n }\n}\nfunction xf(s, e, t, n, i, o) {\n let r = n, a = n + i - 1;\n const l = o.pos, h = o.axis * 2, c = t.offset || 0;\n for (; ; ) {\n for (; r <= a && t[(r - c) * 6 + h] < l; )\n r++;\n for (; r <= a && t[(a - c) * 6 + h] >= l; )\n a--;\n if (r < a) {\n let u = s[r];\n s[r] = s[a], s[a] = u;\n for (let d = 0; d < 6; d++) {\n const p = r - c, f = a - c, m = t[p * 6 + d];\n t[p * 6 + d] = t[f * 6 + d], t[f * 6 + d] = m;\n }\n r++, a--;\n } else\n return r;\n }\n}\nlet Ma, Ai, js, Aa;\nconst bf = Math.pow(2, 32);\nfunction Hs(s) {\n return \"count\" in s ? 1 : 1 + Hs(s.left) + Hs(s.right);\n}\nfunction vf(s, e, t) {\n return Ma = new Float32Array(t), Ai = new Uint32Array(t), js = new Uint16Array(t), Aa = new Uint8Array(t), Gs(s, e);\n}\nfunction Gs(s, e) {\n const t = s / 4, n = s / 2, i = \"count\" in e, o = e.boundingData;\n for (let r = 0; r < 6; r++)\n Ma[t + r] = o[r];\n if (i)\n return e.buffer ? (Aa.set(new Uint8Array(e.buffer), s), s + e.buffer.byteLength) : (Ai[t + 6] = e.offset, js[n + 14] = e.count, js[n + 15] = Ta, s + Be);\n {\n const { left: r, right: a, splitAxis: l } = e, h = s + Be;\n let c = Gs(h, r);\n const u = s / Be, p = c / Be - u;\n if (p > bf)\n throw new Error(\"MeshBVH: Cannot store relative child node offset greater than 32 bits.\");\n return Ai[t + 6] = p, Ai[t + 7] = l, Gs(c, a);\n }\n}\nfunction Sf(s, e, t) {\n const i = (s.index ? s.index.count : s.attributes.position.count) / 3 > 2 ** 16, o = t.reduce((c, u) => c + u.count, 0), r = i ? 4 : 2, a = e ? new SharedArrayBuffer(o * r) : new ArrayBuffer(o * r), l = i ? new Uint32Array(a) : new Uint16Array(a);\n let h = 0;\n for (let c = 0; c < t.length; c++) {\n const { offset: u, count: d } = t[c];\n for (let p = 0; p < d; p++)\n l[h + p] = u + p;\n h += d;\n }\n return l;\n}\nfunction Tf(s, e, t, n, i) {\n const {\n maxDepth: o,\n verbose: r,\n maxLeafTris: a,\n strategy: l,\n onProgress: h,\n indirect: c\n } = i, u = s._indirectBuffer, d = s.geometry, p = d.index ? d.index.array : null, f = c ? xf : _f, m = Qt(d), g = new Float32Array(6);\n let y = !1;\n const w = new us();\n return hs(e, t, n, w.boundingData, g), x(w, t, n, g), w;\n function _(b) {\n h && h(b / m);\n }\n function x(b, A, M, C = null, P = 0) {\n if (!y && P >= o && (y = !0, r && (console.warn(`MeshBVH: Max depth of ${o} reached when generating BVH. Consider increasing maxDepth.`), console.warn(d))), M <= a || P >= o)\n return _(A + M), b.offset = A, b.count = M, b;\n const k = yf(b.boundingData, C, e, A, M, l);\n if (k.axis === -1)\n return _(A + M), b.offset = A, b.count = M, b;\n const B = f(u, p, e, A, M, k);\n if (B === A || B === A + M)\n _(A + M), b.offset = A, b.count = M;\n else {\n b.splitAxis = k.axis;\n const T = new us(), D = A, v = B - A;\n b.left = T, hs(e, D, v, T.boundingData, g), x(T, D, v, g, P + 1);\n const I = new us(), q = B, H = M - v;\n b.right = I, hs(e, q, H, I.boundingData, g), x(I, q, H, g, P + 1);\n }\n return b;\n }\n}\nfunction Ef(s, e) {\n const t = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, n = s.geometry;\n let i, o;\n if (e.indirect) {\n const r = Jr(n, e.range), a = Sf(n, e.useSharedArrayBuffer, r);\n s._indirectBuffer = a, i = Qr(n, 0, a.length, a), o = [{ offset: 0, count: a.length }];\n } else {\n mf(n, e);\n const r = Ea(n, e.range)[0];\n i = Qr(n, r.offset, r.count), o = Jr(n, e.range);\n }\n s._roots = o.map((r) => {\n const a = Tf(s, i, r.offset, r.count, e), l = Hs(a), h = new t(Be * l);\n return vf(0, a, h), h;\n });\n}\nclass xt {\n constructor() {\n this.min = 1 / 0, this.max = -1 / 0;\n }\n setFromPointsField(e, t) {\n let n = 1 / 0, i = -1 / 0;\n for (let o = 0, r = e.length; o < r; o++) {\n const l = e[o][t];\n n = l < n ? l : n, i = l > i ? l : i;\n }\n this.min = n, this.max = i;\n }\n setFromPoints(e, t) {\n let n = 1 / 0, i = -1 / 0;\n for (let o = 0, r = t.length; o < r; o++) {\n const a = t[o], l = e.dot(a);\n n = l < n ? l : n, i = l > i ? l : i;\n }\n this.min = n, this.max = i;\n }\n isSeparated(e) {\n return this.min > e.max || e.min > this.max;\n }\n}\nxt.prototype.setFromBox = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new Z();\n return function(t, n) {\n const i = n.min, o = n.max;\n let r = 1 / 0, a = -1 / 0;\n for (let l = 0; l <= 1; l++)\n for (let h = 0; h <= 1; h++)\n for (let c = 0; c <= 1; c++) {\n s.x = i.x * l + o.x * (1 - l), s.y = i.y * h + o.y * (1 - h), s.z = i.z * c + o.z * (1 - c);\n const u = t.dot(s);\n r = Math.min(u, r), a = Math.max(u, a);\n }\n this.min = r, this.max = a;\n };\n})();\nconst Mf = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new Z(), e = /* @__PURE__ */ new Z(), t = /* @__PURE__ */ new Z();\n return function(i, o, r) {\n const a = i.start, l = s, h = o.start, c = e;\n t.subVectors(a, h), s.subVectors(i.end, i.start), e.subVectors(o.end, o.start);\n const u = t.dot(c), d = c.dot(l), p = c.dot(c), f = t.dot(l), g = l.dot(l) * p - d * d;\n let y, w;\n g !== 0 ? y = (u * d - f * p) / g : y = 0, w = (u + y * d) / p, r.x = y, r.y = w;\n };\n})(), or = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new ce(), e = /* @__PURE__ */ new Z(), t = /* @__PURE__ */ new Z();\n return function(i, o, r, a) {\n Mf(i, o, s);\n let l = s.x, h = s.y;\n if (l >= 0 && l <= 1 && h >= 0 && h <= 1) {\n i.at(l, r), o.at(h, a);\n return;\n } else if (l >= 0 && l <= 1) {\n h < 0 ? o.at(0, a) : o.at(1, a), i.closestPointToPoint(a, !0, r);\n return;\n } else if (h >= 0 && h <= 1) {\n l < 0 ? i.at(0, r) : i.at(1, r), o.closestPointToPoint(r, !0, a);\n return;\n } else {\n let c;\n l < 0 ? c = i.start : c = i.end;\n let u;\n h < 0 ? u = o.start : u = o.end;\n const d = e, p = t;\n if (i.closestPointToPoint(u, !0, e), o.closestPointToPoint(c, !0, t), d.distanceToSquared(u) <= p.distanceToSquared(c)) {\n r.copy(d), a.copy(u);\n return;\n } else {\n r.copy(c), a.copy(p);\n return;\n }\n }\n };\n})(), Af = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new Z(), e = /* @__PURE__ */ new Z(), t = /* @__PURE__ */ new Ui(), n = /* @__PURE__ */ new Ze();\n return function(o, r) {\n const { radius: a, center: l } = o, { a: h, b: c, c: u } = r;\n if (n.start = h, n.end = c, n.closestPointToPoint(l, !0, s).distanceTo(l) <= a || (n.start = h, n.end = u, n.closestPointToPoint(l, !0, s).distanceTo(l) <= a) || (n.start = c, n.end = u, n.closestPointToPoint(l, !0, s).distanceTo(l) <= a)) return !0;\n const m = r.getPlane(t);\n if (Math.abs(m.distanceToPoint(l)) <= a) {\n const y = m.projectPoint(l, e);\n if (r.containsPoint(y)) return !0;\n }\n return !1;\n };\n})(), Cf = [\"x\", \"y\", \"z\"], gt = 1e-15, io = gt * gt;\nfunction He(s) {\n return Math.abs(s) < gt;\n}\nclass Ye extends Oe {\n constructor(...e) {\n super(...e), this.isExtendedTriangle = !0, this.satAxes = new Array(4).fill().map(() => new Z()), this.satBounds = new Array(4).fill().map(() => new xt()), this.points = [this.a, this.b, this.c], this.plane = new Ui(), this.isDegenerateIntoSegment = !1, this.isDegenerateIntoPoint = !1, this.degenerateSegment = new Ze(), this.needsUpdate = !0;\n }\n intersectsSphere(e) {\n return Af(e, this);\n }\n update() {\n const e = this.a, t = this.b, n = this.c, i = this.points, o = this.satAxes, r = this.satBounds, a = o[0], l = r[0];\n this.getNormal(a), l.setFromPoints(a, i);\n const h = o[1], c = r[1];\n h.subVectors(e, t), c.setFromPoints(h, i);\n const u = o[2], d = r[2];\n u.subVectors(t, n), d.setFromPoints(u, i);\n const p = o[3], f = r[3];\n p.subVectors(n, e), f.setFromPoints(p, i);\n const m = h.length(), g = u.length(), y = p.length();\n this.isDegenerateIntoPoint = !1, this.isDegenerateIntoSegment = !1, m < gt ? g < gt || y < gt ? this.isDegenerateIntoPoint = !0 : (this.isDegenerateIntoSegment = !0, this.degenerateSegment.start.copy(e), this.degenerateSegment.end.copy(n)) : g < gt ? y < gt ? this.isDegenerateIntoPoint = !0 : (this.isDegenerateIntoSegment = !0, this.degenerateSegment.start.copy(t), this.degenerateSegment.end.copy(e)) : y < gt && (this.isDegenerateIntoSegment = !0, this.degenerateSegment.start.copy(n), this.degenerateSegment.end.copy(t)), this.plane.setFromNormalAndCoplanarPoint(a, e), this.needsUpdate = !1;\n }\n}\nYe.prototype.closestPointToSegment = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new Z(), e = /* @__PURE__ */ new Z(), t = /* @__PURE__ */ new Ze();\n return function(i, o = null, r = null) {\n const { start: a, end: l } = i, h = this.points;\n let c, u = 1 / 0;\n for (let d = 0; d < 3; d++) {\n const p = (d + 1) % 3;\n t.start.copy(h[d]), t.end.copy(h[p]), or(t, i, s, e), c = s.distanceToSquared(e), c < u && (u = c, o && o.copy(s), r && r.copy(e));\n }\n return this.closestPointToPoint(a, s), c = a.distanceToSquared(s), c < u && (u = c, o && o.copy(s), r && r.copy(a)), this.closestPointToPoint(l, s), c = l.distanceToSquared(s), c < u && (u = c, o && o.copy(s), r && r.copy(l)), Math.sqrt(u);\n };\n})();\nYe.prototype.intersectsTriangle = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new Ye(), e = /* @__PURE__ */ new xt(), t = /* @__PURE__ */ new xt(), n = /* @__PURE__ */ new Z(), i = /* @__PURE__ */ new Z(), o = /* @__PURE__ */ new Z(), r = /* @__PURE__ */ new Z(), a = /* @__PURE__ */ new Ze(), l = /* @__PURE__ */ new Ze(), h = /* @__PURE__ */ new Z(), c = /* @__PURE__ */ new ce(), u = /* @__PURE__ */ new ce();\n function d(_, x, b, A) {\n const M = n;\n !_.isDegenerateIntoPoint && !_.isDegenerateIntoSegment ? M.copy(_.plane.normal) : M.copy(x.plane.normal);\n const C = _.satBounds, P = _.satAxes;\n for (let T = 1; T < 4; T++) {\n const D = C[T], v = P[T];\n if (e.setFromPoints(v, x.points), D.isSeparated(e) || (r.copy(M).cross(v), e.setFromPoints(r, _.points), t.setFromPoints(r, x.points), e.isSeparated(t))) return !1;\n }\n const k = x.satBounds, B = x.satAxes;\n for (let T = 1; T < 4; T++) {\n const D = k[T], v = B[T];\n if (e.setFromPoints(v, _.points), D.isSeparated(e) || (r.crossVectors(M, v), e.setFromPoints(r, _.points), t.setFromPoints(r, x.points), e.isSeparated(t))) return !1;\n }\n return b && (A || console.warn(\"ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0.\"), b.start.set(0, 0, 0), b.end.set(0, 0, 0)), !0;\n }\n function p(_, x, b, A, M, C, P, k, B, T, D) {\n let v = P / (P - k);\n T.x = A + (M - A) * v, D.start.subVectors(x, _).multiplyScalar(v).add(_), v = P / (P - B), T.y = A + (C - A) * v, D.end.subVectors(b, _).multiplyScalar(v).add(_);\n }\n function f(_, x, b, A, M, C, P, k, B, T, D) {\n if (M > 0)\n p(_.c, _.a, _.b, A, x, b, B, P, k, T, D);\n else if (C > 0)\n p(_.b, _.a, _.c, b, x, A, k, P, B, T, D);\n else if (k * B > 0 || P != 0)\n p(_.a, _.b, _.c, x, b, A, P, k, B, T, D);\n else if (k != 0)\n p(_.b, _.a, _.c, b, x, A, k, P, B, T, D);\n else if (B != 0)\n p(_.c, _.a, _.b, A, x, b, B, P, k, T, D);\n else\n return !0;\n return !1;\n }\n function m(_, x, b, A) {\n const M = x.degenerateSegment, C = _.plane.distanceToPoint(M.start), P = _.plane.distanceToPoint(M.end);\n return He(C) ? He(P) ? d(_, x, b, A) : (b && (b.start.copy(M.start), b.end.copy(M.start)), _.containsPoint(M.start)) : He(P) ? (b && (b.start.copy(M.end), b.end.copy(M.end)), _.containsPoint(M.end)) : _.plane.intersectLine(M, n) != null ? (b && (b.start.copy(n), b.end.copy(n)), _.containsPoint(n)) : !1;\n }\n function g(_, x, b) {\n const A = x.a;\n return He(_.plane.distanceToPoint(A)) && _.containsPoint(A) ? (b && (b.start.copy(A), b.end.copy(A)), !0) : !1;\n }\n function y(_, x, b) {\n const A = _.degenerateSegment, M = x.a;\n return A.closestPointToPoint(M, !0, n), M.distanceToSquared(n) < io ? (b && (b.start.copy(M), b.end.copy(M)), !0) : !1;\n }\n function w(_, x, b, A) {\n if (_.isDegenerateIntoSegment)\n if (x.isDegenerateIntoSegment) {\n const M = _.degenerateSegment, C = x.degenerateSegment, P = i, k = o;\n M.delta(P), C.delta(k);\n const B = n.subVectors(C.start, M.start), T = P.x * k.y - P.y * k.x;\n if (He(T))\n return !1;\n const D = (B.x * k.y - B.y * k.x) / T, v = -(P.x * B.y - P.y * B.x) / T;\n if (D < 0 || D > 1 || v < 0 || v > 1)\n return !1;\n const I = M.start.z + P.z * D, q = C.start.z + k.z * v;\n return He(I - q) ? (b && (b.start.copy(M.start).addScaledVector(P, D), b.end.copy(M.start).addScaledVector(P, D)), !0) : !1;\n } else return x.isDegenerateIntoPoint ? y(_, x, b) : m(x, _, b, A);\n else {\n if (_.isDegenerateIntoPoint)\n return x.isDegenerateIntoPoint ? x.a.distanceToSquared(_.a) < io ? (b && (b.start.copy(_.a), b.end.copy(_.a)), !0) : !1 : x.isDegenerateIntoSegment ? y(x, _, b) : g(x, _, b);\n if (x.isDegenerateIntoPoint)\n return g(_, x, b);\n if (x.isDegenerateIntoSegment)\n return m(_, x, b, A);\n }\n }\n return function(x, b = null, A = !1) {\n this.needsUpdate && this.update(), x.isExtendedTriangle ? x.needsUpdate && x.update() : (s.copy(x), s.update(), x = s);\n const M = w(this, x, b, A);\n if (M !== void 0)\n return M;\n const C = this.plane, P = x.plane;\n let k = P.distanceToPoint(this.a), B = P.distanceToPoint(this.b), T = P.distanceToPoint(this.c);\n He(k) && (k = 0), He(B) && (B = 0), He(T) && (T = 0);\n const D = k * B, v = k * T;\n if (D > 0 && v > 0)\n return !1;\n let I = C.distanceToPoint(x.a), q = C.distanceToPoint(x.b), H = C.distanceToPoint(x.c);\n He(I) && (I = 0), He(q) && (q = 0), He(H) && (H = 0);\n const ee = I * q, j = I * H;\n if (ee > 0 && j > 0)\n return !1;\n i.copy(C.normal), o.copy(P.normal);\n const ne = i.cross(o);\n let O = 0, N = Math.abs(ne.x);\n const te = Math.abs(ne.y);\n te > N && (N = te, O = 1), Math.abs(ne.z) > N && (O = 2);\n const K = Cf[O], fe = this.a[K], pe = this.b[K], se = this.c[K], oe = x.a[K], ue = x.b[K], me = x.c[K];\n if (f(this, fe, pe, se, D, v, k, B, T, c, a))\n return d(this, x, b, A);\n if (f(x, oe, ue, me, ee, j, I, q, H, u, l))\n return d(this, x, b, A);\n if (c.y < c.x) {\n const Se = c.y;\n c.y = c.x, c.x = Se, h.copy(a.start), a.start.copy(a.end), a.end.copy(h);\n }\n if (u.y < u.x) {\n const Se = u.y;\n u.y = u.x, u.x = Se, h.copy(l.start), l.start.copy(l.end), l.end.copy(h);\n }\n return c.y < u.x || u.y < c.x ? !1 : (b && (u.x > c.x ? b.start.copy(l.start) : b.start.copy(a.start), u.y < c.y ? b.end.copy(l.end) : b.end.copy(a.end)), !0);\n };\n})();\nYe.prototype.distanceToPoint = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new Z();\n return function(t) {\n return this.closestPointToPoint(t, s), t.distanceTo(s);\n };\n})();\nYe.prototype.distanceToTriangle = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new Z(), e = /* @__PURE__ */ new Z(), t = [\"a\", \"b\", \"c\"], n = /* @__PURE__ */ new Ze(), i = /* @__PURE__ */ new Ze();\n return function(r, a = null, l = null) {\n const h = a || l ? n : null;\n if (this.intersectsTriangle(r, h))\n return (a || l) && (a && h.getCenter(a), l && h.getCenter(l)), 0;\n let c = 1 / 0;\n for (let u = 0; u < 3; u++) {\n let d;\n const p = t[u], f = r[p];\n this.closestPointToPoint(f, s), d = f.distanceToSquared(s), d < c && (c = d, a && a.copy(s), l && l.copy(f));\n const m = this[p];\n r.closestPointToPoint(m, s), d = m.distanceToSquared(s), d < c && (c = d, a && a.copy(m), l && l.copy(s));\n }\n for (let u = 0; u < 3; u++) {\n const d = t[u], p = t[(u + 1) % 3];\n n.set(this[d], this[p]);\n for (let f = 0; f < 3; f++) {\n const m = t[f], g = t[(f + 1) % 3];\n i.set(r[m], r[g]), or(n, i, s, e);\n const y = s.distanceToSquared(e);\n y < c && (c = y, a && a.copy(s), l && l.copy(e));\n }\n }\n return Math.sqrt(c);\n };\n})();\nclass Ie {\n constructor(e, t, n) {\n this.isOrientedBox = !0, this.min = new Z(), this.max = new Z(), this.matrix = new Ae(), this.invMatrix = new Ae(), this.points = new Array(8).fill().map(() => new Z()), this.satAxes = new Array(3).fill().map(() => new Z()), this.satBounds = new Array(3).fill().map(() => new xt()), this.alignedSatBounds = new Array(3).fill().map(() => new xt()), this.needsUpdate = !1, e && this.min.copy(e), t && this.max.copy(t), n && this.matrix.copy(n);\n }\n set(e, t, n) {\n this.min.copy(e), this.max.copy(t), this.matrix.copy(n), this.needsUpdate = !0;\n }\n copy(e) {\n this.min.copy(e.min), this.max.copy(e.max), this.matrix.copy(e.matrix), this.needsUpdate = !0;\n }\n}\nIe.prototype.update = /* @__PURE__ */ (function() {\n return function() {\n const e = this.matrix, t = this.min, n = this.max, i = this.points;\n for (let h = 0; h <= 1; h++)\n for (let c = 0; c <= 1; c++)\n for (let u = 0; u <= 1; u++) {\n const d = 1 * h | 2 * c | 4 * u, p = i[d];\n p.x = h ? n.x : t.x, p.y = c ? n.y : t.y, p.z = u ? n.z : t.z, p.applyMatrix4(e);\n }\n const o = this.satBounds, r = this.satAxes, a = i[0];\n for (let h = 0; h < 3; h++) {\n const c = r[h], u = o[h], d = 1 << h, p = i[d];\n c.subVectors(a, p), u.setFromPoints(c, i);\n }\n const l = this.alignedSatBounds;\n l[0].setFromPointsField(i, \"x\"), l[1].setFromPointsField(i, \"y\"), l[2].setFromPointsField(i, \"z\"), this.invMatrix.copy(this.matrix).invert(), this.needsUpdate = !1;\n };\n})();\nIe.prototype.intersectsBox = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new xt();\n return function(t) {\n this.needsUpdate && this.update();\n const n = t.min, i = t.max, o = this.satBounds, r = this.satAxes, a = this.alignedSatBounds;\n if (s.min = n.x, s.max = i.x, a[0].isSeparated(s) || (s.min = n.y, s.max = i.y, a[1].isSeparated(s)) || (s.min = n.z, s.max = i.z, a[2].isSeparated(s))) return !1;\n for (let l = 0; l < 3; l++) {\n const h = r[l], c = o[l];\n if (s.setFromBox(h, t), c.isSeparated(s)) return !1;\n }\n return !0;\n };\n})();\nIe.prototype.intersectsTriangle = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new Ye(), e = /* @__PURE__ */ new Array(3), t = /* @__PURE__ */ new xt(), n = /* @__PURE__ */ new xt(), i = /* @__PURE__ */ new Z();\n return function(r) {\n this.needsUpdate && this.update(), r.isExtendedTriangle ? r.needsUpdate && r.update() : (s.copy(r), s.update(), r = s);\n const a = this.satBounds, l = this.satAxes;\n e[0] = r.a, e[1] = r.b, e[2] = r.c;\n for (let d = 0; d < 3; d++) {\n const p = a[d], f = l[d];\n if (t.setFromPoints(f, e), p.isSeparated(t)) return !1;\n }\n const h = r.satBounds, c = r.satAxes, u = this.points;\n for (let d = 0; d < 3; d++) {\n const p = h[d], f = c[d];\n if (t.setFromPoints(f, u), p.isSeparated(t)) return !1;\n }\n for (let d = 0; d < 3; d++) {\n const p = l[d];\n for (let f = 0; f < 4; f++) {\n const m = c[f];\n if (i.crossVectors(p, m), t.setFromPoints(i, e), n.setFromPoints(i, u), t.isSeparated(n)) return !1;\n }\n }\n return !0;\n };\n})();\nIe.prototype.closestPointToPoint = /* @__PURE__ */ (function() {\n return function(e, t) {\n return this.needsUpdate && this.update(), t.copy(e).applyMatrix4(this.invMatrix).clamp(this.min, this.max).applyMatrix4(this.matrix), t;\n };\n})();\nIe.prototype.distanceToPoint = (function() {\n const s = new Z();\n return function(t) {\n return this.closestPointToPoint(t, s), t.distanceTo(s);\n };\n})();\nIe.prototype.distanceToBox = /* @__PURE__ */ (function() {\n const s = [\"x\", \"y\", \"z\"], e = /* @__PURE__ */ new Array(12).fill().map(() => new Ze()), t = /* @__PURE__ */ new Array(12).fill().map(() => new Ze()), n = /* @__PURE__ */ new Z(), i = /* @__PURE__ */ new Z();\n return function(r, a = 0, l = null, h = null) {\n if (this.needsUpdate && this.update(), this.intersectsBox(r))\n return (l || h) && (r.getCenter(i), this.closestPointToPoint(i, n), r.closestPointToPoint(n, i), l && l.copy(n), h && h.copy(i)), 0;\n const c = a * a, u = r.min, d = r.max, p = this.points;\n let f = 1 / 0;\n for (let g = 0; g < 8; g++) {\n const y = p[g];\n i.copy(y).clamp(u, d);\n const w = y.distanceToSquared(i);\n if (w < f && (f = w, l && l.copy(y), h && h.copy(i), w < c))\n return Math.sqrt(w);\n }\n let m = 0;\n for (let g = 0; g < 3; g++)\n for (let y = 0; y <= 1; y++)\n for (let w = 0; w <= 1; w++) {\n const _ = (g + 1) % 3, x = (g + 2) % 3, b = y << _ | w << x, A = 1 << g | y << _ | w << x, M = p[b], C = p[A];\n e[m].set(M, C);\n const k = s[g], B = s[_], T = s[x], D = t[m], v = D.start, I = D.end;\n v[k] = u[k], v[B] = y ? u[B] : d[B], v[T] = w ? u[T] : d[B], I[k] = d[k], I[B] = y ? u[B] : d[B], I[T] = w ? u[T] : d[B], m++;\n }\n for (let g = 0; g <= 1; g++)\n for (let y = 0; y <= 1; y++)\n for (let w = 0; w <= 1; w++) {\n i.x = g ? d.x : u.x, i.y = y ? d.y : u.y, i.z = w ? d.z : u.z, this.closestPointToPoint(i, n);\n const _ = i.distanceToSquared(n);\n if (_ < f && (f = _, l && l.copy(n), h && h.copy(i), _ < c))\n return Math.sqrt(_);\n }\n for (let g = 0; g < 12; g++) {\n const y = e[g];\n for (let w = 0; w < 12; w++) {\n const _ = t[w];\n or(y, _, n, i);\n const x = n.distanceToSquared(i);\n if (x < f && (f = x, l && l.copy(n), h && h.copy(i), x < c))\n return Math.sqrt(x);\n }\n }\n return Math.sqrt(f);\n };\n})();\nclass ar {\n constructor(e) {\n this._getNewPrimitive = e, this._primitives = [];\n }\n getPrimitive() {\n const e = this._primitives;\n return e.length === 0 ? this._getNewPrimitive() : e.pop();\n }\n releasePrimitive(e) {\n this._primitives.push(e);\n }\n}\nclass Pf extends ar {\n constructor() {\n super(() => new Ye());\n }\n}\nconst qe = /* @__PURE__ */ new Pf();\nfunction Me(s, e) {\n return e[s + 15] === Ta;\n}\nfunction Ve(s, e) {\n return e[s + 6];\n}\nfunction Ke(s, e) {\n return e[s + 14];\n}\nfunction Ce(s) {\n return s + Ee;\n}\nfunction Pe(s, e) {\n const t = e[s + 6];\n return s + t * Ee;\n}\nfunction lr(s, e) {\n return e[s + 7];\n}\nclass kf {\n constructor() {\n this.float32Array = null, this.uint16Array = null, this.uint32Array = null;\n const e = [];\n let t = null;\n this.setBuffer = (n) => {\n t && e.push(t), t = n, this.float32Array = new Float32Array(n), this.uint16Array = new Uint16Array(n), this.uint32Array = new Uint32Array(n);\n }, this.clearBuffer = () => {\n t = null, this.float32Array = null, this.uint16Array = null, this.uint32Array = null, e.length !== 0 && this.setBuffer(e.pop());\n };\n }\n}\nconst ge = /* @__PURE__ */ new kf();\nlet Pt, un;\nconst tn = [], si = /* @__PURE__ */ new ar(() => new nt());\nfunction Rf(s, e, t, n, i, o) {\n Pt = si.getPrimitive(), un = si.getPrimitive(), tn.push(Pt, un), ge.setBuffer(s._roots[e]);\n const r = Ws(0, s.geometry, t, n, i, o);\n ge.clearBuffer(), si.releasePrimitive(Pt), si.releasePrimitive(un), tn.pop(), tn.pop();\n const a = tn.length;\n return a > 0 && (un = tn[a - 1], Pt = tn[a - 2]), r;\n}\nfunction Ws(s, e, t, n, i = null, o = 0, r = 0) {\n const { float32Array: a, uint16Array: l, uint32Array: h } = ge;\n let c = s * 2;\n if (Me(c, l)) {\n const d = Ve(s, h), p = Ke(c, l);\n return we(s, a, Pt), n(d, p, !1, r, o + s / Ee, Pt);\n } else {\n let k = function(T) {\n const { uint16Array: D, uint32Array: v } = ge;\n let I = T * 2;\n for (; !Me(I, D); )\n T = Ce(T), I = T * 2;\n return Ve(T, v);\n }, B = function(T) {\n const { uint16Array: D, uint32Array: v } = ge;\n let I = T * 2;\n for (; !Me(I, D); )\n T = Pe(T, v), I = T * 2;\n return Ve(T, v) + Ke(I, D);\n };\n const d = Ce(s), p = Pe(s, h);\n let f = d, m = p, g, y, w, _;\n if (i && (w = Pt, _ = un, we(f, a, w), we(m, a, _), g = i(w), y = i(_), y < g)) {\n f = p, m = d;\n const T = g;\n g = y, y = T, w = _;\n }\n w || (w = Pt, we(f, a, w));\n const x = Me(f * 2, l), b = t(w, x, g, r + 1, o + f / Ee);\n let A;\n if (b === Yr) {\n const T = k(f), v = B(f) - T;\n A = n(T, v, !0, r + 1, o + f / Ee, w);\n } else\n A = b && Ws(\n f,\n e,\n t,\n n,\n i,\n o,\n r + 1\n );\n if (A) return !0;\n _ = un, we(m, a, _);\n const M = Me(m * 2, l), C = t(_, M, y, r + 1, o + m / Ee);\n let P;\n if (C === Yr) {\n const T = k(m), v = B(m) - T;\n P = n(T, v, !0, r + 1, o + m / Ee, _);\n } else\n P = C && Ws(\n m,\n e,\n t,\n n,\n i,\n o,\n r + 1\n );\n return !!P;\n }\n}\nconst An = /* @__PURE__ */ new Z(), fs = /* @__PURE__ */ new Z();\nfunction Df(s, e, t = {}, n = 0, i = 1 / 0) {\n const o = n * n, r = i * i;\n let a = 1 / 0, l = null;\n if (s.shapecast(\n {\n boundsTraverseOrder: (c) => (An.copy(e).clamp(c.min, c.max), An.distanceToSquared(e)),\n intersectsBounds: (c, u, d) => d < a && d < r,\n intersectsTriangle: (c, u) => {\n c.closestPointToPoint(e, An);\n const d = e.distanceToSquared(An);\n return d < a && (fs.copy(An), a = d, l = u), d < o;\n }\n }\n ), a === 1 / 0) return null;\n const h = Math.sqrt(a);\n return t.point ? t.point.copy(fs) : t.point = fs.clone(), t.distance = h, t.faceIndex = l, t;\n}\nconst ri = parseInt(Go) >= 169, Lf = parseInt(Go) <= 161, Ot = /* @__PURE__ */ new Z(), Ut = /* @__PURE__ */ new Z(), Ft = /* @__PURE__ */ new Z(), oi = /* @__PURE__ */ new ce(), ai = /* @__PURE__ */ new ce(), li = /* @__PURE__ */ new ce(), so = /* @__PURE__ */ new Z(), ro = /* @__PURE__ */ new Z(), oo = /* @__PURE__ */ new Z(), Cn = /* @__PURE__ */ new Z();\nfunction Bf(s, e, t, n, i, o, r, a) {\n let l;\n if (o === kl ? l = s.intersectTriangle(n, t, e, !0, i) : l = s.intersectTriangle(e, t, n, o !== Vi, i), l === null) return null;\n const h = s.origin.distanceTo(i);\n return h < r || h > a ? null : {\n distance: h,\n point: i.clone()\n };\n}\nfunction ao(s, e, t, n, i, o, r, a, l, h, c) {\n Ot.fromBufferAttribute(e, o), Ut.fromBufferAttribute(e, r), Ft.fromBufferAttribute(e, a);\n const u = Bf(s, Ot, Ut, Ft, Cn, l, h, c);\n if (u) {\n if (n) {\n oi.fromBufferAttribute(n, o), ai.fromBufferAttribute(n, r), li.fromBufferAttribute(n, a), u.uv = new ce();\n const p = Oe.getInterpolation(Cn, Ot, Ut, Ft, oi, ai, li, u.uv);\n ri || (u.uv = p);\n }\n if (i) {\n oi.fromBufferAttribute(i, o), ai.fromBufferAttribute(i, r), li.fromBufferAttribute(i, a), u.uv1 = new ce();\n const p = Oe.getInterpolation(Cn, Ot, Ut, Ft, oi, ai, li, u.uv1);\n ri || (u.uv1 = p), Lf && (u.uv2 = u.uv1);\n }\n if (t) {\n so.fromBufferAttribute(t, o), ro.fromBufferAttribute(t, r), oo.fromBufferAttribute(t, a), u.normal = new Z();\n const p = Oe.getInterpolation(Cn, Ot, Ut, Ft, so, ro, oo, u.normal);\n u.normal.dot(s.direction) > 0 && u.normal.multiplyScalar(-1), ri || (u.normal = p);\n }\n const d = {\n a: o,\n b: r,\n c: a,\n normal: new Z(),\n materialIndex: 0\n };\n if (Oe.getNormal(Ot, Ut, Ft, d.normal), u.face = d, u.faceIndex = o, ri) {\n const p = new Z();\n Oe.getBarycoord(Cn, Ot, Ut, Ft, p), u.barycoord = p;\n }\n }\n return u;\n}\nfunction lo(s) {\n return s && s.isMaterial ? s.side : s;\n}\nfunction Ki(s, e, t, n, i, o, r) {\n const a = n * 3;\n let l = a + 0, h = a + 1, c = a + 2;\n const { index: u, groups: d } = s;\n s.index && (l = u.getX(l), h = u.getX(h), c = u.getX(c));\n const { position: p, normal: f, uv: m, uv1: g } = s.attributes;\n if (Array.isArray(e)) {\n const y = n * 3;\n for (let w = 0, _ = d.length; w < _; w++) {\n const { start: x, count: b, materialIndex: A } = d[w];\n if (y >= x && y < x + b) {\n const M = lo(e[A]), C = ao(t, p, f, m, g, l, h, c, M, o, r);\n if (C)\n if (C.faceIndex = n, C.face.materialIndex = A, i)\n i.push(C);\n else\n return C;\n }\n }\n } else {\n const y = lo(e), w = ao(t, p, f, m, g, l, h, c, y, o, r);\n if (w)\n if (w.faceIndex = n, w.face.materialIndex = 0, i)\n i.push(w);\n else\n return w;\n }\n return null;\n}\nfunction ve(s, e, t, n) {\n const i = s.a, o = s.b, r = s.c;\n let a = e, l = e + 1, h = e + 2;\n t && (a = t.getX(a), l = t.getX(l), h = t.getX(h)), i.x = n.getX(a), i.y = n.getY(a), i.z = n.getZ(a), o.x = n.getX(l), o.y = n.getY(l), o.z = n.getZ(l), r.x = n.getX(h), r.y = n.getY(h), r.z = n.getZ(h);\n}\nfunction If(s, e, t, n, i, o, r, a) {\n const { geometry: l, _indirectBuffer: h } = s;\n for (let c = n, u = n + i; c < u; c++)\n Ki(l, e, t, c, o, r, a);\n}\nfunction zf(s, e, t, n, i, o, r) {\n const { geometry: a, _indirectBuffer: l } = s;\n let h = 1 / 0, c = null;\n for (let u = n, d = n + i; u < d; u++) {\n let p;\n p = Ki(a, e, t, u, null, o, r), p && p.distance < h && (c = p, h = p.distance);\n }\n return c;\n}\nfunction Nf(s, e, t, n, i, o, r) {\n const { geometry: a } = t, { index: l } = a, h = a.attributes.position;\n for (let c = s, u = e + s; c < u; c++) {\n let d;\n if (d = c, ve(r, d * 3, l, h), r.needsUpdate = !0, n(r, d, i, o))\n return !0;\n }\n return !1;\n}\nfunction Of(s, e = null) {\n e && Array.isArray(e) && (e = new Set(e));\n const t = s.geometry, n = t.index ? t.index.array : null, i = t.attributes.position;\n let o, r, a, l, h = 0;\n const c = s._roots;\n for (let d = 0, p = c.length; d < p; d++)\n o = c[d], r = new Uint32Array(o), a = new Uint16Array(o), l = new Float32Array(o), u(0, h), h += o.byteLength;\n function u(d, p, f = !1) {\n const m = d * 2;\n if (Me(m, a)) {\n const g = r[d + 6], y = a[m + 14];\n let w = 1 / 0, _ = 1 / 0, x = 1 / 0, b = -1 / 0, A = -1 / 0, M = -1 / 0;\n for (let C = 3 * g, P = 3 * (g + y); C < P; C++) {\n let k = n[C];\n const B = i.getX(k), T = i.getY(k), D = i.getZ(k);\n B < w && (w = B), B > b && (b = B), T < _ && (_ = T), T > A && (A = T), D < x && (x = D), D > M && (M = D);\n }\n return l[d + 0] !== w || l[d + 1] !== _ || l[d + 2] !== x || l[d + 3] !== b || l[d + 4] !== A || l[d + 5] !== M ? (l[d + 0] = w, l[d + 1] = _, l[d + 2] = x, l[d + 3] = b, l[d + 4] = A, l[d + 5] = M, !0) : !1;\n } else {\n const g = Ce(d), y = Pe(d, r);\n let w = f, _ = !1, x = !1;\n if (e) {\n if (!w) {\n const k = g / Ee + p / Be, B = y / Ee + p / Be;\n _ = e.has(k), x = e.has(B), w = !_ && !x;\n }\n } else\n _ = !0, x = !0;\n const b = w || _, A = w || x;\n let M = !1;\n b && (M = u(g, p, w));\n let C = !1;\n A && (C = u(y, p, w));\n const P = M || C;\n if (P)\n for (let k = 0; k < 3; k++) {\n const B = g + k, T = y + k, D = l[B], v = l[B + 3], I = l[T], q = l[T + 3];\n l[d + k] = D < I ? D : I, l[d + k + 3] = v > q ? v : q;\n }\n return P;\n }\n }\n}\nfunction Dt(s, e, t, n, i) {\n let o, r, a, l, h, c;\n const u = 1 / t.direction.x, d = 1 / t.direction.y, p = 1 / t.direction.z, f = t.origin.x, m = t.origin.y, g = t.origin.z;\n let y = e[s], w = e[s + 3], _ = e[s + 1], x = e[s + 3 + 1], b = e[s + 2], A = e[s + 3 + 2];\n return u >= 0 ? (o = (y - f) * u, r = (w - f) * u) : (o = (w - f) * u, r = (y - f) * u), d >= 0 ? (a = (_ - m) * d, l = (x - m) * d) : (a = (x - m) * d, l = (_ - m) * d), o > l || a > r || ((a > o || isNaN(o)) && (o = a), (l < r || isNaN(r)) && (r = l), p >= 0 ? (h = (b - g) * p, c = (A - g) * p) : (h = (A - g) * p, c = (b - g) * p), o > c || h > r) ? !1 : ((h > o || o !== o) && (o = h), (c < r || r !== r) && (r = c), o <= i && r >= n);\n}\nfunction Uf(s, e, t, n, i, o, r, a) {\n const { geometry: l, _indirectBuffer: h } = s;\n for (let c = n, u = n + i; c < u; c++) {\n let d = h ? h[c] : c;\n Ki(l, e, t, d, o, r, a);\n }\n}\nfunction Ff(s, e, t, n, i, o, r) {\n const { geometry: a, _indirectBuffer: l } = s;\n let h = 1 / 0, c = null;\n for (let u = n, d = n + i; u < d; u++) {\n let p;\n p = Ki(a, e, t, l ? l[u] : u, null, o, r), p && p.distance < h && (c = p, h = p.distance);\n }\n return c;\n}\nfunction Vf(s, e, t, n, i, o, r) {\n const { geometry: a } = t, { index: l } = a, h = a.attributes.position;\n for (let c = s, u = e + s; c < u; c++) {\n let d;\n if (d = t.resolveTriangleIndex(c), ve(r, d * 3, l, h), r.needsUpdate = !0, n(r, d, i, o))\n return !0;\n }\n return !1;\n}\nfunction jf(s, e, t, n, i, o, r) {\n ge.setBuffer(s._roots[e]), Xs(0, s, t, n, i, o, r), ge.clearBuffer();\n}\nfunction Xs(s, e, t, n, i, o, r) {\n const { float32Array: a, uint16Array: l, uint32Array: h } = ge, c = s * 2;\n if (Me(c, l)) {\n const d = Ve(s, h), p = Ke(c, l);\n If(e, t, n, d, p, i, o, r);\n } else {\n const d = Ce(s);\n Dt(d, a, n, o, r) && Xs(d, e, t, n, i, o, r);\n const p = Pe(s, h);\n Dt(p, a, n, o, r) && Xs(p, e, t, n, i, o, r);\n }\n}\nconst Hf = [\"x\", \"y\", \"z\"];\nfunction Gf(s, e, t, n, i, o) {\n ge.setBuffer(s._roots[e]);\n const r = qs(0, s, t, n, i, o);\n return ge.clearBuffer(), r;\n}\nfunction qs(s, e, t, n, i, o) {\n const { float32Array: r, uint16Array: a, uint32Array: l } = ge;\n let h = s * 2;\n if (Me(h, a)) {\n const u = Ve(s, l), d = Ke(h, a);\n return zf(e, t, n, u, d, i, o);\n } else {\n const u = lr(s, l), d = Hf[u], f = n.direction[d] >= 0;\n let m, g;\n f ? (m = Ce(s), g = Pe(s, l)) : (m = Pe(s, l), g = Ce(s));\n const w = Dt(m, r, n, i, o) ? qs(m, e, t, n, i, o) : null;\n if (w) {\n const b = w.point[d];\n if (f ? b <= r[g + u] : (\n // min bounding data\n b >= r[g + u + 3]\n ))\n return w;\n }\n const x = Dt(g, r, n, i, o) ? qs(g, e, t, n, i, o) : null;\n return w && x ? w.distance <= x.distance ? w : x : w || x || null;\n }\n}\nconst ci = /* @__PURE__ */ new nt(), nn = /* @__PURE__ */ new Ye(), sn = /* @__PURE__ */ new Ye(), Pn = /* @__PURE__ */ new Ae(), co = /* @__PURE__ */ new Ie(), hi = /* @__PURE__ */ new Ie();\nfunction Wf(s, e, t, n) {\n ge.setBuffer(s._roots[e]);\n const i = Ks(0, s, t, n);\n return ge.clearBuffer(), i;\n}\nfunction Ks(s, e, t, n, i = null) {\n const { float32Array: o, uint16Array: r, uint32Array: a } = ge;\n let l = s * 2;\n if (i === null && (t.boundingBox || t.computeBoundingBox(), co.set(t.boundingBox.min, t.boundingBox.max, n), i = co), Me(l, r)) {\n const c = e.geometry, u = c.index, d = c.attributes.position, p = t.index, f = t.attributes.position, m = Ve(s, a), g = Ke(l, r);\n if (Pn.copy(n).invert(), t.boundsTree)\n return we(s, o, hi), hi.matrix.copy(Pn), hi.needsUpdate = !0, t.boundsTree.shapecast({\n intersectsBounds: (w) => hi.intersectsBox(w),\n intersectsTriangle: (w) => {\n w.a.applyMatrix4(n), w.b.applyMatrix4(n), w.c.applyMatrix4(n), w.needsUpdate = !0;\n for (let _ = m * 3, x = (g + m) * 3; _ < x; _ += 3)\n if (ve(sn, _, u, d), sn.needsUpdate = !0, w.intersectsTriangle(sn))\n return !0;\n return !1;\n }\n });\n {\n const y = Qt(t);\n for (let w = m * 3, _ = (g + m) * 3; w < _; w += 3) {\n ve(nn, w, u, d), nn.a.applyMatrix4(Pn), nn.b.applyMatrix4(Pn), nn.c.applyMatrix4(Pn), nn.needsUpdate = !0;\n for (let x = 0, b = y * 3; x < b; x += 3)\n if (ve(sn, x, p, f), sn.needsUpdate = !0, nn.intersectsTriangle(sn))\n return !0;\n }\n }\n } else {\n const c = Ce(s), u = Pe(s, a);\n return we(c, o, ci), !!(i.intersectsBox(ci) && Ks(c, e, t, n, i) || (we(u, o, ci), i.intersectsBox(ci) && Ks(u, e, t, n, i)));\n }\n}\nconst ui = /* @__PURE__ */ new Ae(), ds = /* @__PURE__ */ new Ie(), kn = /* @__PURE__ */ new Ie(), Xf = /* @__PURE__ */ new Z(), qf = /* @__PURE__ */ new Z(), Kf = /* @__PURE__ */ new Z(), Zf = /* @__PURE__ */ new Z();\nfunction Yf(s, e, t, n = {}, i = {}, o = 0, r = 1 / 0) {\n e.boundingBox || e.computeBoundingBox(), ds.set(e.boundingBox.min, e.boundingBox.max, t), ds.needsUpdate = !0;\n const a = s.geometry, l = a.attributes.position, h = a.index, c = e.attributes.position, u = e.index, d = qe.getPrimitive(), p = qe.getPrimitive();\n let f = Xf, m = qf, g = null, y = null;\n i && (g = Kf, y = Zf);\n let w = 1 / 0, _ = null, x = null;\n return ui.copy(t).invert(), kn.matrix.copy(ui), s.shapecast(\n {\n boundsTraverseOrder: (b) => ds.distanceToBox(b),\n intersectsBounds: (b, A, M) => M < w && M < r ? (A && (kn.min.copy(b.min), kn.max.copy(b.max), kn.needsUpdate = !0), !0) : !1,\n intersectsRange: (b, A) => {\n if (e.boundsTree)\n return e.boundsTree.shapecast({\n boundsTraverseOrder: (C) => kn.distanceToBox(C),\n intersectsBounds: (C, P, k) => k < w && k < r,\n intersectsRange: (C, P) => {\n for (let k = C, B = C + P; k < B; k++) {\n ve(p, 3 * k, u, c), p.a.applyMatrix4(t), p.b.applyMatrix4(t), p.c.applyMatrix4(t), p.needsUpdate = !0;\n for (let T = b, D = b + A; T < D; T++) {\n ve(d, 3 * T, h, l), d.needsUpdate = !0;\n const v = d.distanceToTriangle(p, f, g);\n if (v < w && (m.copy(f), y && y.copy(g), w = v, _ = T, x = k), v < o)\n return !0;\n }\n }\n }\n });\n {\n const M = Qt(e);\n for (let C = 0, P = M; C < P; C++) {\n ve(p, 3 * C, u, c), p.a.applyMatrix4(t), p.b.applyMatrix4(t), p.c.applyMatrix4(t), p.needsUpdate = !0;\n for (let k = b, B = b + A; k < B; k++) {\n ve(d, 3 * k, h, l), d.needsUpdate = !0;\n const T = d.distanceToTriangle(p, f, g);\n if (T < w && (m.copy(f), y && y.copy(g), w = T, _ = k, x = C), T < o)\n return !0;\n }\n }\n }\n }\n }\n ), qe.releasePrimitive(d), qe.releasePrimitive(p), w === 1 / 0 ? null : (n.point ? n.point.copy(m) : n.point = m.clone(), n.distance = w, n.faceIndex = _, i && (i.point ? i.point.copy(y) : i.point = y.clone(), i.point.applyMatrix4(ui), m.applyMatrix4(ui), i.distance = m.sub(i.point).length(), i.faceIndex = x), n);\n}\nfunction $f(s, e = null) {\n e && Array.isArray(e) && (e = new Set(e));\n const t = s.geometry, n = t.index ? t.index.array : null, i = t.attributes.position;\n let o, r, a, l, h = 0;\n const c = s._roots;\n for (let d = 0, p = c.length; d < p; d++)\n o = c[d], r = new Uint32Array(o), a = new Uint16Array(o), l = new Float32Array(o), u(0, h), h += o.byteLength;\n function u(d, p, f = !1) {\n const m = d * 2;\n if (Me(m, a)) {\n const g = r[d + 6], y = a[m + 14];\n let w = 1 / 0, _ = 1 / 0, x = 1 / 0, b = -1 / 0, A = -1 / 0, M = -1 / 0;\n for (let C = g, P = g + y; C < P; C++) {\n const k = 3 * s.resolveTriangleIndex(C);\n for (let B = 0; B < 3; B++) {\n let T = k + B;\n T = n ? n[T] : T;\n const D = i.getX(T), v = i.getY(T), I = i.getZ(T);\n D < w && (w = D), D > b && (b = D), v < _ && (_ = v), v > A && (A = v), I < x && (x = I), I > M && (M = I);\n }\n }\n return l[d + 0] !== w || l[d + 1] !== _ || l[d + 2] !== x || l[d + 3] !== b || l[d + 4] !== A || l[d + 5] !== M ? (l[d + 0] = w, l[d + 1] = _, l[d + 2] = x, l[d + 3] = b, l[d + 4] = A, l[d + 5] = M, !0) : !1;\n } else {\n const g = Ce(d), y = Pe(d, r);\n let w = f, _ = !1, x = !1;\n if (e) {\n if (!w) {\n const k = g / Ee + p / Be, B = y / Ee + p / Be;\n _ = e.has(k), x = e.has(B), w = !_ && !x;\n }\n } else\n _ = !0, x = !0;\n const b = w || _, A = w || x;\n let M = !1;\n b && (M = u(g, p, w));\n let C = !1;\n A && (C = u(y, p, w));\n const P = M || C;\n if (P)\n for (let k = 0; k < 3; k++) {\n const B = g + k, T = y + k, D = l[B], v = l[B + 3], I = l[T], q = l[T + 3];\n l[d + k] = D < I ? D : I, l[d + k + 3] = v > q ? v : q;\n }\n return P;\n }\n }\n}\nfunction Jf(s, e, t, n, i, o, r) {\n ge.setBuffer(s._roots[e]), Zs(0, s, t, n, i, o, r), ge.clearBuffer();\n}\nfunction Zs(s, e, t, n, i, o, r) {\n const { float32Array: a, uint16Array: l, uint32Array: h } = ge, c = s * 2;\n if (Me(c, l)) {\n const d = Ve(s, h), p = Ke(c, l);\n Uf(e, t, n, d, p, i, o, r);\n } else {\n const d = Ce(s);\n Dt(d, a, n, o, r) && Zs(d, e, t, n, i, o, r);\n const p = Pe(s, h);\n Dt(p, a, n, o, r) && Zs(p, e, t, n, i, o, r);\n }\n}\nconst Qf = [\"x\", \"y\", \"z\"];\nfunction ed(s, e, t, n, i, o) {\n ge.setBuffer(s._roots[e]);\n const r = Ys(0, s, t, n, i, o);\n return ge.clearBuffer(), r;\n}\nfunction Ys(s, e, t, n, i, o) {\n const { float32Array: r, uint16Array: a, uint32Array: l } = ge;\n let h = s * 2;\n if (Me(h, a)) {\n const u = Ve(s, l), d = Ke(h, a);\n return Ff(e, t, n, u, d, i, o);\n } else {\n const u = lr(s, l), d = Qf[u], f = n.direction[d] >= 0;\n let m, g;\n f ? (m = Ce(s), g = Pe(s, l)) : (m = Pe(s, l), g = Ce(s));\n const w = Dt(m, r, n, i, o) ? Ys(m, e, t, n, i, o) : null;\n if (w) {\n const b = w.point[d];\n if (f ? b <= r[g + u] : (\n // min bounding data\n b >= r[g + u + 3]\n ))\n return w;\n }\n const x = Dt(g, r, n, i, o) ? Ys(g, e, t, n, i, o) : null;\n return w && x ? w.distance <= x.distance ? w : x : w || x || null;\n }\n}\nconst fi = /* @__PURE__ */ new nt(), rn = /* @__PURE__ */ new Ye(), on = /* @__PURE__ */ new Ye(), Rn = /* @__PURE__ */ new Ae(), ho = /* @__PURE__ */ new Ie(), di = /* @__PURE__ */ new Ie();\nfunction td(s, e, t, n) {\n ge.setBuffer(s._roots[e]);\n const i = $s(0, s, t, n);\n return ge.clearBuffer(), i;\n}\nfunction $s(s, e, t, n, i = null) {\n const { float32Array: o, uint16Array: r, uint32Array: a } = ge;\n let l = s * 2;\n if (i === null && (t.boundingBox || t.computeBoundingBox(), ho.set(t.boundingBox.min, t.boundingBox.max, n), i = ho), Me(l, r)) {\n const c = e.geometry, u = c.index, d = c.attributes.position, p = t.index, f = t.attributes.position, m = Ve(s, a), g = Ke(l, r);\n if (Rn.copy(n).invert(), t.boundsTree)\n return we(s, o, di), di.matrix.copy(Rn), di.needsUpdate = !0, t.boundsTree.shapecast({\n intersectsBounds: (w) => di.intersectsBox(w),\n intersectsTriangle: (w) => {\n w.a.applyMatrix4(n), w.b.applyMatrix4(n), w.c.applyMatrix4(n), w.needsUpdate = !0;\n for (let _ = m, x = g + m; _ < x; _++)\n if (ve(on, 3 * e.resolveTriangleIndex(_), u, d), on.needsUpdate = !0, w.intersectsTriangle(on))\n return !0;\n return !1;\n }\n });\n {\n const y = Qt(t);\n for (let w = m, _ = g + m; w < _; w++) {\n const x = e.resolveTriangleIndex(w);\n ve(rn, 3 * x, u, d), rn.a.applyMatrix4(Rn), rn.b.applyMatrix4(Rn), rn.c.applyMatrix4(Rn), rn.needsUpdate = !0;\n for (let b = 0, A = y * 3; b < A; b += 3)\n if (ve(on, b, p, f), on.needsUpdate = !0, rn.intersectsTriangle(on))\n return !0;\n }\n }\n } else {\n const c = Ce(s), u = Pe(s, a);\n return we(c, o, fi), !!(i.intersectsBox(fi) && $s(c, e, t, n, i) || (we(u, o, fi), i.intersectsBox(fi) && $s(u, e, t, n, i)));\n }\n}\nconst pi = /* @__PURE__ */ new Ae(), ps = /* @__PURE__ */ new Ie(), Dn = /* @__PURE__ */ new Ie(), nd = /* @__PURE__ */ new Z(), id = /* @__PURE__ */ new Z(), sd = /* @__PURE__ */ new Z(), rd = /* @__PURE__ */ new Z();\nfunction od(s, e, t, n = {}, i = {}, o = 0, r = 1 / 0) {\n e.boundingBox || e.computeBoundingBox(), ps.set(e.boundingBox.min, e.boundingBox.max, t), ps.needsUpdate = !0;\n const a = s.geometry, l = a.attributes.position, h = a.index, c = e.attributes.position, u = e.index, d = qe.getPrimitive(), p = qe.getPrimitive();\n let f = nd, m = id, g = null, y = null;\n i && (g = sd, y = rd);\n let w = 1 / 0, _ = null, x = null;\n return pi.copy(t).invert(), Dn.matrix.copy(pi), s.shapecast(\n {\n boundsTraverseOrder: (b) => ps.distanceToBox(b),\n intersectsBounds: (b, A, M) => M < w && M < r ? (A && (Dn.min.copy(b.min), Dn.max.copy(b.max), Dn.needsUpdate = !0), !0) : !1,\n intersectsRange: (b, A) => {\n if (e.boundsTree) {\n const M = e.boundsTree;\n return M.shapecast({\n boundsTraverseOrder: (C) => Dn.distanceToBox(C),\n intersectsBounds: (C, P, k) => k < w && k < r,\n intersectsRange: (C, P) => {\n for (let k = C, B = C + P; k < B; k++) {\n const T = M.resolveTriangleIndex(k);\n ve(p, 3 * T, u, c), p.a.applyMatrix4(t), p.b.applyMatrix4(t), p.c.applyMatrix4(t), p.needsUpdate = !0;\n for (let D = b, v = b + A; D < v; D++) {\n const I = s.resolveTriangleIndex(D);\n ve(d, 3 * I, h, l), d.needsUpdate = !0;\n const q = d.distanceToTriangle(p, f, g);\n if (q < w && (m.copy(f), y && y.copy(g), w = q, _ = D, x = k), q < o)\n return !0;\n }\n }\n }\n });\n } else {\n const M = Qt(e);\n for (let C = 0, P = M; C < P; C++) {\n ve(p, 3 * C, u, c), p.a.applyMatrix4(t), p.b.applyMatrix4(t), p.c.applyMatrix4(t), p.needsUpdate = !0;\n for (let k = b, B = b + A; k < B; k++) {\n const T = s.resolveTriangleIndex(k);\n ve(d, 3 * T, h, l), d.needsUpdate = !0;\n const D = d.distanceToTriangle(p, f, g);\n if (D < w && (m.copy(f), y && y.copy(g), w = D, _ = k, x = C), D < o)\n return !0;\n }\n }\n }\n }\n }\n ), qe.releasePrimitive(d), qe.releasePrimitive(p), w === 1 / 0 ? null : (n.point ? n.point.copy(m) : n.point = m.clone(), n.distance = w, n.faceIndex = _, i && (i.point ? i.point.copy(y) : i.point = y.clone(), i.point.applyMatrix4(pi), m.applyMatrix4(pi), i.distance = m.sub(i.point).length(), i.faceIndex = x), n);\n}\nfunction ad() {\n return typeof SharedArrayBuffer < \"u\";\n}\nconst zn = /* @__PURE__ */ new ge.constructor(), zi = /* @__PURE__ */ new ge.constructor(), At = /* @__PURE__ */ new ar(() => new nt()), an = /* @__PURE__ */ new nt(), ln = /* @__PURE__ */ new nt(), ms = /* @__PURE__ */ new nt(), gs = /* @__PURE__ */ new nt();\nlet ys = !1;\nfunction ld(s, e, t, n) {\n if (ys)\n throw new Error(\"MeshBVH: Recursive calls to bvhcast not supported.\");\n ys = !0;\n const i = s._roots, o = e._roots;\n let r, a = 0, l = 0;\n const h = new Ae().copy(t).invert();\n for (let c = 0, u = i.length; c < u; c++) {\n zn.setBuffer(i[c]), l = 0;\n const d = At.getPrimitive();\n we(0, zn.float32Array, d), d.applyMatrix4(h);\n for (let p = 0, f = o.length; p < f && (zi.setBuffer(o[p]), r = Qe(\n 0,\n 0,\n t,\n h,\n n,\n a,\n l,\n 0,\n 0,\n d\n ), zi.clearBuffer(), l += o[p].byteLength / Be, !r); p++)\n ;\n if (At.releasePrimitive(d), zn.clearBuffer(), a += i[c].byteLength / Be, r)\n break;\n }\n return ys = !1, r;\n}\nfunction Qe(s, e, t, n, i, o = 0, r = 0, a = 0, l = 0, h = null, c = !1) {\n let u, d;\n c ? (u = zi, d = zn) : (u = zn, d = zi);\n const p = u.float32Array, f = u.uint32Array, m = u.uint16Array, g = d.float32Array, y = d.uint32Array, w = d.uint16Array, _ = s * 2, x = e * 2, b = Me(_, m), A = Me(x, w);\n let M = !1;\n if (A && b)\n c ? M = i(\n Ve(e, y),\n Ke(e * 2, w),\n Ve(s, f),\n Ke(s * 2, m),\n l,\n r + e / Ee,\n a,\n o + s / Ee\n ) : M = i(\n Ve(s, f),\n Ke(s * 2, m),\n Ve(e, y),\n Ke(e * 2, w),\n a,\n o + s / Ee,\n l,\n r + e / Ee\n );\n else if (A) {\n const C = At.getPrimitive();\n we(e, g, C), C.applyMatrix4(t);\n const P = Ce(s), k = Pe(s, f);\n we(P, p, an), we(k, p, ln);\n const B = C.intersectsBox(an), T = C.intersectsBox(ln);\n M = B && Qe(\n e,\n P,\n n,\n t,\n i,\n r,\n o,\n l,\n a + 1,\n C,\n !c\n ) || T && Qe(\n e,\n k,\n n,\n t,\n i,\n r,\n o,\n l,\n a + 1,\n C,\n !c\n ), At.releasePrimitive(C);\n } else {\n const C = Ce(e), P = Pe(e, y);\n we(C, g, ms), we(P, g, gs);\n const k = h.intersectsBox(ms), B = h.intersectsBox(gs);\n if (k && B)\n M = Qe(\n s,\n C,\n t,\n n,\n i,\n o,\n r,\n a,\n l + 1,\n h,\n c\n ) || Qe(\n s,\n P,\n t,\n n,\n i,\n o,\n r,\n a,\n l + 1,\n h,\n c\n );\n else if (k)\n if (b)\n M = Qe(\n s,\n C,\n t,\n n,\n i,\n o,\n r,\n a,\n l + 1,\n h,\n c\n );\n else {\n const T = At.getPrimitive();\n T.copy(ms).applyMatrix4(t);\n const D = Ce(s), v = Pe(s, f);\n we(D, p, an), we(v, p, ln);\n const I = T.intersectsBox(an), q = T.intersectsBox(ln);\n M = I && Qe(\n C,\n D,\n n,\n t,\n i,\n r,\n o,\n l,\n a + 1,\n T,\n !c\n ) || q && Qe(\n C,\n v,\n n,\n t,\n i,\n r,\n o,\n l,\n a + 1,\n T,\n !c\n ), At.releasePrimitive(T);\n }\n else if (B)\n if (b)\n M = Qe(\n s,\n P,\n t,\n n,\n i,\n o,\n r,\n a,\n l + 1,\n h,\n c\n );\n else {\n const T = At.getPrimitive();\n T.copy(gs).applyMatrix4(t);\n const D = Ce(s), v = Pe(s, f);\n we(D, p, an), we(v, p, ln);\n const I = T.intersectsBox(an), q = T.intersectsBox(ln);\n M = I && Qe(\n P,\n D,\n n,\n t,\n i,\n r,\n o,\n l,\n a + 1,\n T,\n !c\n ) || q && Qe(\n P,\n v,\n n,\n t,\n i,\n r,\n o,\n l,\n a + 1,\n T,\n !c\n ), At.releasePrimitive(T);\n }\n }\n return M;\n}\nconst mi = /* @__PURE__ */ new Ie(), uo = /* @__PURE__ */ new nt(), cd = {\n strategy: Sa,\n maxDepth: 40,\n maxLeafTris: 10,\n useSharedArrayBuffer: !1,\n setBoundingBox: !0,\n onProgress: null,\n indirect: !1,\n verbose: !0,\n range: null\n};\nclass cr {\n static serialize(e, t = {}) {\n t = {\n cloneBuffers: !0,\n ...t\n };\n const n = e.geometry, i = e._roots, o = e._indirectBuffer, r = n.getIndex(), a = {\n version: 1,\n roots: null,\n index: null,\n indirectBuffer: null\n };\n return t.cloneBuffers ? (a.roots = i.map((l) => l.slice()), a.index = r ? r.array.slice() : null, a.indirectBuffer = o ? o.slice() : null) : (a.roots = i, a.index = r ? r.array : null, a.indirectBuffer = o), a;\n }\n static deserialize(e, t, n = {}) {\n n = {\n setIndex: !0,\n indirect: !!e.indirectBuffer,\n ...n\n };\n const { index: i, roots: o, indirectBuffer: r } = e;\n e.version || (console.warn(\n \"MeshBVH.deserialize: Serialization format has been changed and will be fixed up. It is recommended to regenerate any stored serialized data.\"\n ), l(o));\n const a = new cr(t, { ...n, [cs]: !0 });\n if (a._roots = o, a._indirectBuffer = r || null, n.setIndex) {\n const h = t.getIndex();\n if (h === null) {\n const c = new at(e.index, 1, !1);\n t.setIndex(c);\n } else h.array !== i && (h.array.set(i), h.needsUpdate = !0);\n }\n return a;\n function l(h) {\n for (let c = 0; c < h.length; c++) {\n const u = h[c], d = new Uint32Array(u), p = new Uint16Array(u);\n for (let f = 0, m = u.byteLength / Be; f < m; f++) {\n const g = Ee * f, y = 2 * g;\n Me(y, p) || (d[g + 6] = d[g + 6] / Ee - f);\n }\n }\n }\n }\n get indirect() {\n return !!this._indirectBuffer;\n }\n constructor(e, t = {}) {\n if (e.isBufferGeometry) {\n if (e.index && e.index.isInterleavedBufferAttribute)\n throw new Error(\"MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.\");\n } else throw new Error(\"MeshBVH: Only BufferGeometries are supported.\");\n if (t = Object.assign({\n ...cd,\n // undocumented options\n // Whether to skip generating the tree. Used for deserialization.\n [cs]: !1\n }, t), t.useSharedArrayBuffer && !ad())\n throw new Error(\"MeshBVH: SharedArrayBuffer is not available.\");\n this.geometry = e, this._roots = null, this._indirectBuffer = null, t[cs] || (Ef(this, t), !e.boundingBox && t.setBoundingBox && (e.boundingBox = this.getBoundingBox(new nt()))), this.resolveTriangleIndex = t.indirect ? (n) => this._indirectBuffer[n] : (n) => n;\n }\n shiftTriangleOffsets(e) {\n const t = this._indirectBuffer;\n if (t)\n for (let n = 0, i = t.length; n < i; n++)\n t[n] += e;\n else {\n const n = this._roots;\n for (let i = 0; i < n.length; i++) {\n const o = n[i], r = new Uint32Array(o), a = new Uint16Array(o), l = o.byteLength / Be;\n for (let h = 0; h < l; h++) {\n const c = Ee * h, u = 2 * c;\n Me(u, a) && (r[c + 6] += e);\n }\n }\n }\n }\n refit(e = null) {\n return (this.indirect ? $f : Of)(this, e);\n }\n traverse(e, t = 0) {\n const n = this._roots[t], i = new Uint32Array(n), o = new Uint16Array(n);\n r(0);\n function r(a, l = 0) {\n const h = a * 2, c = Me(h, o);\n if (c) {\n const u = i[a + 6], d = o[h + 14];\n e(l, c, new Float32Array(n, a * 4, 6), u, d);\n } else {\n const u = Ce(a), d = Pe(a, i), p = lr(a, i);\n e(l, c, new Float32Array(n, a * 4, 6), p) || (r(u, l + 1), r(d, l + 1));\n }\n }\n }\n /* Core Cast Functions */\n raycast(e, t = Ls, n = 0, i = 1 / 0) {\n const o = this._roots, r = [], a = this.indirect ? Jf : jf;\n for (let l = 0, h = o.length; l < h; l++)\n a(this, l, t, e, r, n, i);\n return r;\n }\n raycastFirst(e, t = Ls, n = 0, i = 1 / 0) {\n const o = this._roots;\n let r = null;\n const a = this.indirect ? ed : Gf;\n for (let l = 0, h = o.length; l < h; l++) {\n const c = a(this, l, t, e, n, i);\n c != null && (r == null || c.distance < r.distance) && (r = c);\n }\n return r;\n }\n intersectsGeometry(e, t) {\n let n = !1;\n const i = this._roots, o = this.indirect ? td : Wf;\n for (let r = 0, a = i.length; r < a && (n = o(this, r, e, t), !n); r++)\n ;\n return n;\n }\n shapecast(e) {\n const t = qe.getPrimitive(), n = this.indirect ? Vf : Nf;\n let {\n boundsTraverseOrder: i,\n intersectsBounds: o,\n intersectsRange: r,\n intersectsTriangle: a\n } = e;\n if (r && a) {\n const u = r;\n r = (d, p, f, m, g) => u(d, p, f, m, g) ? !0 : n(d, p, this, a, f, m, t);\n } else r || (a ? r = (u, d, p, f) => n(u, d, this, a, p, f, t) : r = (u, d, p) => p);\n let l = !1, h = 0;\n const c = this._roots;\n for (let u = 0, d = c.length; u < d; u++) {\n const p = c[u];\n if (l = Rf(this, u, o, r, i, h), l)\n break;\n h += p.byteLength / Be;\n }\n return qe.releasePrimitive(t), l;\n }\n bvhcast(e, t, n) {\n let {\n intersectsRanges: i,\n intersectsTriangles: o\n } = n;\n const r = qe.getPrimitive(), a = this.geometry.index, l = this.geometry.attributes.position, h = this.indirect ? (f) => {\n const m = this.resolveTriangleIndex(f);\n ve(r, m * 3, a, l);\n } : (f) => {\n ve(r, f * 3, a, l);\n }, c = qe.getPrimitive(), u = e.geometry.index, d = e.geometry.attributes.position, p = e.indirect ? (f) => {\n const m = e.resolveTriangleIndex(f);\n ve(c, m * 3, u, d);\n } : (f) => {\n ve(c, f * 3, u, d);\n };\n if (o) {\n const f = (m, g, y, w, _, x, b, A) => {\n for (let M = y, C = y + w; M < C; M++) {\n p(M), c.a.applyMatrix4(t), c.b.applyMatrix4(t), c.c.applyMatrix4(t), c.needsUpdate = !0;\n for (let P = m, k = m + g; P < k; P++)\n if (h(P), r.needsUpdate = !0, o(r, c, P, M, _, x, b, A))\n return !0;\n }\n return !1;\n };\n if (i) {\n const m = i;\n i = function(g, y, w, _, x, b, A, M) {\n return m(g, y, w, _, x, b, A, M) ? !0 : f(g, y, w, _, x, b, A, M);\n };\n } else\n i = f;\n }\n return ld(this, e, t, i);\n }\n /* Derived Cast Functions */\n intersectsBox(e, t) {\n return mi.set(e.min, e.max, t), mi.needsUpdate = !0, this.shapecast(\n {\n intersectsBounds: (n) => mi.intersectsBox(n),\n intersectsTriangle: (n) => mi.intersectsTriangle(n)\n }\n );\n }\n intersectsSphere(e) {\n return this.shapecast(\n {\n intersectsBounds: (t) => e.intersectsBox(t),\n intersectsTriangle: (t) => t.intersectsSphere(e)\n }\n );\n }\n closestPointToGeometry(e, t, n = {}, i = {}, o = 0, r = 1 / 0) {\n return (this.indirect ? od : Yf)(\n this,\n e,\n t,\n n,\n i,\n o,\n r\n );\n }\n closestPointToPoint(e, t = {}, n = 0, i = 1 / 0) {\n return Df(\n this,\n e,\n t,\n n,\n i\n );\n }\n getBoundingBox(e) {\n return e.makeEmpty(), this._roots.forEach((n) => {\n we(0, new Float32Array(n), uo), e.union(uo);\n }), e;\n }\n}\nconst Ca = 1e-6, hd = Ca * 0.5, Pa = Math.pow(10, -Math.log10(Ca)), ud = hd * Pa;\nfunction ot(s) {\n return ~~(s * Pa + ud);\n}\nfunction fd(s) {\n return `${ot(s.x)},${ot(s.y)}`;\n}\nfunction fo(s) {\n return `${ot(s.x)},${ot(s.y)},${ot(s.z)}`;\n}\nfunction dd(s) {\n return `${ot(s.x)},${ot(s.y)},${ot(s.z)},${ot(s.w)}`;\n}\nfunction pd(s, e, t) {\n t.direction.subVectors(e, s).normalize();\n const n = s.dot(t.direction);\n return t.origin.copy(s).addScaledVector(t.direction, -n), t;\n}\nfunction ka() {\n return typeof SharedArrayBuffer < \"u\";\n}\nfunction md(s) {\n if (s.buffer instanceof SharedArrayBuffer)\n return s;\n const e = s.constructor, t = s.buffer, n = new SharedArrayBuffer(t.byteLength), i = new Uint8Array(t);\n return new Uint8Array(n).set(i, 0), new e(n);\n}\nfunction gd(s, e = ArrayBuffer) {\n return s > 65535 ? new Uint32Array(new e(4 * s)) : new Uint16Array(new e(2 * s));\n}\nfunction yd(s, e) {\n if (!s.index) {\n const t = s.attributes.position.count, n = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, i = gd(t, n);\n s.setIndex(new at(i, 1));\n for (let o = 0; o < t; o++)\n i[o] = o;\n }\n}\nfunction wd(s) {\n return s.index ? s.index.count : s.attributes.position.count;\n}\nfunction hr(s) {\n return wd(s) / 3;\n}\nconst _d = 1e-8, xd = new Z();\nfunction bd(s) {\n return ~~(s / 3);\n}\nfunction vd(s) {\n return s % 3;\n}\nfunction po(s, e) {\n return s.start - e.start;\n}\nfunction mo(s, e) {\n return xd.subVectors(e, s.origin).dot(s.direction);\n}\nfunction Sd(s, e, t, n = _d) {\n s.sort(po), e.sort(po);\n for (let a = 0; a < s.length; a++) {\n const l = s[a];\n for (let h = 0; h < e.length; h++) {\n const c = e[h];\n if (!(c.start > l.end)) {\n if (l.end < c.start || c.end < l.start)\n continue;\n if (l.start <= c.start && l.end >= c.end)\n o(c.end, l.end) || s.splice(a + 1, 0, {\n start: c.end,\n end: l.end,\n index: l.index\n }), l.end = c.start, c.start = 0, c.end = 0;\n else if (l.start >= c.start && l.end <= c.end)\n o(l.end, c.end) || e.splice(h + 1, 0, {\n start: l.end,\n end: c.end,\n index: c.index\n }), c.end = l.start, l.start = 0, l.end = 0;\n else if (l.start <= c.start && l.end <= c.end) {\n const u = l.end;\n l.end = c.start, c.start = u;\n } else if (l.start >= c.start && l.end >= c.end) {\n const u = c.end;\n c.end = l.start, l.start = u;\n } else\n throw new Error();\n }\n if (t.has(l.index) || t.set(l.index, []), t.has(c.index) || t.set(c.index, []), t.get(l.index).push(c.index), t.get(c.index).push(l.index), r(c) && (e.splice(h, 1), h--), r(l)) {\n s.splice(a, 1), a--;\n break;\n }\n }\n }\n i(s), i(e);\n function i(a) {\n for (let l = 0; l < a.length; l++)\n r(a[l]) && (a.splice(l, 1), l--);\n }\n function o(a, l) {\n return Math.abs(l - a) < n;\n }\n function r(a) {\n return Math.abs(a.end - a.start) < n;\n }\n}\nconst go = 1e-5, yo = 1e-4;\nclass Td {\n constructor() {\n this._rays = [];\n }\n addRay(e) {\n this._rays.push(e);\n }\n findClosestRay(e) {\n const t = this._rays, n = e.clone();\n n.direction.multiplyScalar(-1);\n let i = 1 / 0, o = null;\n for (let l = 0, h = t.length; l < h; l++) {\n const c = t[l];\n if (r(c, e) && r(c, n))\n continue;\n const u = a(c, e), d = a(c, n), p = Math.min(u, d);\n p < i && (i = p, o = c);\n }\n return o;\n function r(l, h) {\n const c = l.origin.distanceTo(h.origin) > go;\n return l.direction.angleTo(h.direction) > yo || c;\n }\n function a(l, h) {\n const c = l.origin.distanceTo(h.origin), u = l.direction.angleTo(h.direction);\n return c / go + u / yo;\n }\n }\n}\nconst ws = new Z(), _s = new Z(), gi = new Js();\nfunction Ed(s, e, t) {\n const n = s.attributes, i = s.index, o = n.position, r = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), l = Array.from(e), h = new Td();\n for (let c = 0, u = l.length; c < u; c++) {\n const d = l[c], p = bd(d), f = vd(d);\n let m = 3 * p + f, g = 3 * p + (f + 1) % 3;\n i && (m = i.getX(m), g = i.getX(g)), ws.fromBufferAttribute(o, m), _s.fromBufferAttribute(o, g), pd(ws, _s, gi);\n let y, w = h.findClosestRay(gi);\n w === null && (w = gi.clone(), h.addRay(w)), a.has(w) || a.set(w, {\n forward: [],\n reverse: [],\n ray: w\n }), y = a.get(w);\n let _ = mo(w, ws), x = mo(w, _s);\n _ > x && ([_, x] = [x, _]), gi.direction.dot(w.direction) < 0 ? y.reverse.push({ start: _, end: x, index: d }) : y.forward.push({ start: _, end: x, index: d });\n }\n return a.forEach(({ forward: c, reverse: u }, d) => {\n Sd(c, u, r, t), c.length === 0 && u.length === 0 && a.delete(d);\n }), {\n disjointConnectivityMap: r,\n fragmentMap: a\n };\n}\nconst Md = new ce(), xs = new Z(), Ad = new $t(), bs = [\"\", \"\", \"\"];\nclass Cd {\n constructor(e = null) {\n this.data = null, this.disjointConnections = null, this.unmatchedDisjointEdges = null, this.unmatchedEdges = -1, this.matchedEdges = -1, this.useDrawRange = !0, this.useAllAttributes = !1, this.matchDisjointEdges = !1, this.degenerateEpsilon = 1e-8, e && this.updateFrom(e);\n }\n getSiblingTriangleIndex(e, t) {\n const n = this.data[e * 3 + t];\n return n === -1 ? -1 : ~~(n / 3);\n }\n getSiblingEdgeIndex(e, t) {\n const n = this.data[e * 3 + t];\n return n === -1 ? -1 : n % 3;\n }\n getDisjointSiblingTriangleIndices(e, t) {\n const n = e * 3 + t, i = this.disjointConnections.get(n);\n return i ? i.map((o) => ~~(o / 3)) : [];\n }\n getDisjointSiblingEdgeIndices(e, t) {\n const n = e * 3 + t, i = this.disjointConnections.get(n);\n return i ? i.map((o) => o % 3) : [];\n }\n isFullyConnected() {\n return this.unmatchedEdges === 0;\n }\n updateFrom(e) {\n const { useAllAttributes: t, useDrawRange: n, matchDisjointEdges: i, degenerateEpsilon: o } = this, r = t ? _ : w, a = /* @__PURE__ */ new Map(), { attributes: l } = e, h = t ? Object.keys(l) : null, c = e.index, u = l.position;\n let d = hr(e);\n const p = d;\n let f = 0;\n n && (f = e.drawRange.start, e.drawRange.count !== 1 / 0 && (d = ~~(e.drawRange.count / 3)));\n let m = this.data;\n (!m || m.length < 3 * p) && (m = new Int32Array(3 * p)), m.fill(-1);\n let g = 0, y = /* @__PURE__ */ new Set();\n for (let x = f, b = d * 3 + f; x < b; x += 3) {\n const A = x;\n for (let M = 0; M < 3; M++) {\n let C = A + M;\n c && (C = c.getX(C)), bs[M] = r(C);\n }\n for (let M = 0; M < 3; M++) {\n const C = (M + 1) % 3, P = bs[M], k = bs[C], B = `${k}_${P}`;\n if (a.has(B)) {\n const T = A + M, D = a.get(B);\n m[T] = D, m[D] = T, a.delete(B), g += 2, y.delete(D);\n } else {\n const T = `${P}_${k}`, D = A + M;\n a.set(T, D), y.add(D);\n }\n }\n }\n if (i) {\n const {\n fragmentMap: x,\n disjointConnectivityMap: b\n } = Ed(e, y, o);\n y.clear(), x.forEach(({ forward: A, reverse: M }) => {\n A.forEach(({ index: C }) => y.add(C)), M.forEach(({ index: C }) => y.add(C));\n }), this.unmatchedDisjointEdges = x, this.disjointConnections = b, g = d * 3 - y.size;\n }\n this.matchedEdges = g, this.unmatchedEdges = y.size, this.data = m;\n function w(x) {\n return xs.fromBufferAttribute(u, x), fo(xs);\n }\n function _(x) {\n let b = \"\";\n for (let A = 0, M = h.length; A < M; A++) {\n const C = l[h[A]];\n let P;\n switch (C.itemSize) {\n case 1:\n P = ot(C.getX(x));\n break;\n case 2:\n P = fd(Md.fromBufferAttribute(C, x));\n break;\n case 3:\n P = fo(xs.fromBufferAttribute(C, x));\n break;\n case 4:\n P = dd(Ad.fromBufferAttribute(C, x));\n break;\n }\n b !== \"\" && (b += \"|\"), b += P;\n }\n return b;\n }\n }\n}\nclass Ni extends Qs {\n constructor(...e) {\n super(...e), this.isBrush = !0, this._previousMatrix = new Ae(), this._previousMatrix.elements.fill(0);\n }\n markUpdated() {\n this._previousMatrix.copy(this.matrix);\n }\n isDirty() {\n const { matrix: e, _previousMatrix: t } = this, n = e.elements, i = t.elements;\n for (let o = 0; o < 16; o++)\n if (n[o] !== i[o])\n return !0;\n return !1;\n }\n prepareGeometry() {\n const e = this.geometry, t = e.attributes, n = ka();\n if (n)\n for (const i in t) {\n const o = t[i];\n if (o.isInterleavedBufferAttribute)\n throw new Error(\"Brush: InterleavedBufferAttributes are not supported.\");\n o.array = md(o.array);\n }\n if (e.boundsTree || (yd(e, { useSharedArrayBuffer: n }), e.boundsTree = new cr(e, { maxLeafTris: 3, indirect: !0, useSharedArrayBuffer: n })), e.halfEdges || (e.halfEdges = new Cd(e)), !e.groupIndices) {\n const i = hr(e), o = new Uint16Array(i), r = e.groups;\n for (let a = 0, l = r.length; a < l; a++) {\n const { start: h, count: c } = r[a];\n for (let u = h / 3, d = (h + c) / 3; u < d; u++)\n o[u] = a;\n }\n e.groupIndices = o;\n }\n }\n disposeCacheData() {\n const { geometry: e } = this;\n e.halfEdges = null, e.boundsTree = null, e.groupIndices = null;\n }\n}\nconst Pd = 1e-14, vs = new Z(), wo = new Z(), _o = new Z();\nfunction Ct(s, e = Pd) {\n vs.subVectors(s.b, s.a), wo.subVectors(s.c, s.a), _o.subVectors(s.b, s.c);\n const t = vs.angleTo(wo), n = vs.angleTo(_o), i = Math.PI - t - n;\n return Math.abs(t) < e || Math.abs(n) < e || Math.abs(i) < e || s.a.distanceToSquared(s.b) < e || s.a.distanceToSquared(s.c) < e || s.b.distanceToSquared(s.c) < e;\n}\nconst Ss = 1e-10, Ln = 1e-10, kd = 1e-10, ut = new Ze(), xe = new Ze(), ft = new Z(), Ts = new Z(), xo = new Z(), yi = new Ui(), Es = new Ye();\nclass Rd {\n constructor() {\n this._pool = [], this._index = 0;\n }\n getTriangle() {\n return this._index >= this._pool.length && this._pool.push(new Oe()), this._pool[this._index++];\n }\n clear() {\n this._index = 0;\n }\n reset() {\n this._pool.length = 0, this._index = 0;\n }\n}\nclass Dd {\n constructor() {\n this.trianglePool = new Rd(), this.triangles = [], this.normal = new Z(), this.coplanarTriangleUsed = !1;\n }\n // initialize the class with a triangle\n initialize(e) {\n this.reset();\n const { triangles: t, trianglePool: n, normal: i } = this;\n if (Array.isArray(e))\n for (let o = 0, r = e.length; o < r; o++) {\n const a = e[o];\n if (o === 0)\n a.getNormal(i);\n else if (Math.abs(1 - a.getNormal(ft).dot(i)) > Ss)\n throw new Error(\"Triangle Splitter: Cannot initialize with triangles that have different normals.\");\n const l = n.getTriangle();\n l.copy(a), t.push(l);\n }\n else {\n e.getNormal(i);\n const o = n.getTriangle();\n o.copy(e), t.push(o);\n }\n }\n // Split the current set of triangles by passing a single triangle in. If the triangle is\n // coplanar it will attempt to split by the triangle edge planes\n splitByTriangle(e) {\n const { normal: t, triangles: n } = this;\n if (e.getNormal(Ts).normalize(), Math.abs(1 - Math.abs(Ts.dot(t))) < kd) {\n this.coplanarTriangleUsed = !0;\n for (let o = 0, r = n.length; o < r; o++) {\n const a = n[o];\n a.coplanarCount = 0;\n }\n const i = [e.a, e.b, e.c];\n for (let o = 0; o < 3; o++) {\n const r = (o + 1) % 3, a = i[o], l = i[r];\n ft.subVectors(l, a).normalize(), xo.crossVectors(Ts, ft), yi.setFromNormalAndCoplanarPoint(xo, a), this.splitByPlane(yi, e);\n }\n } else\n e.getPlane(yi), this.splitByPlane(yi, e);\n }\n // Split the triangles by the given plan. If a triangle is provided then we ensure we\n // intersect the triangle before splitting the plane\n splitByPlane(e, t) {\n const { triangles: n, trianglePool: i } = this;\n Es.copy(t), Es.needsUpdate = !0;\n for (let o = 0, r = n.length; o < r; o++) {\n const a = n[o];\n if (!Es.intersectsTriangle(a, ut, !0))\n continue;\n const { a: l, b: h, c } = a;\n let u = 0, d = -1, p = !1, f = [], m = [];\n const g = [l, h, c];\n for (let y = 0; y < 3; y++) {\n const w = (y + 1) % 3;\n ut.start.copy(g[y]), ut.end.copy(g[w]);\n const _ = e.distanceToPoint(ut.start), x = e.distanceToPoint(ut.end);\n if (Math.abs(_) < Ln && Math.abs(x) < Ln) {\n p = !0;\n break;\n }\n if (_ > 0 ? f.push(y) : m.push(y), Math.abs(_) < Ln)\n continue;\n let b = !!e.intersectLine(ut, ft);\n !b && Math.abs(x) < Ln && (ft.copy(ut.end), b = !0), b && !(ft.distanceTo(ut.start) < Ss) && (ft.distanceTo(ut.end) < Ss && (d = y), u === 0 ? xe.start.copy(ft) : xe.end.copy(ft), u++);\n }\n if (!p && u === 2 && xe.distance() > Ln)\n if (d !== -1) {\n d = (d + 1) % 3;\n let y = 0;\n y === d && (y = (y + 1) % 3);\n let w = y + 1;\n w === d && (w = (w + 1) % 3);\n const _ = i.getTriangle();\n _.a.copy(g[w]), _.b.copy(xe.end), _.c.copy(xe.start), Ct(_) || n.push(_), a.a.copy(g[y]), a.b.copy(xe.start), a.c.copy(xe.end), Ct(a) && (n.splice(o, 1), o--, r--);\n } else {\n const y = f.length >= 2 ? m[0] : f[0];\n if (y === 0) {\n let A = xe.start;\n xe.start = xe.end, xe.end = A;\n }\n const w = (y + 1) % 3, _ = (y + 2) % 3, x = i.getTriangle(), b = i.getTriangle();\n g[w].distanceToSquared(xe.start) < g[_].distanceToSquared(xe.end) ? (x.a.copy(g[w]), x.b.copy(xe.start), x.c.copy(xe.end), b.a.copy(g[w]), b.b.copy(g[_]), b.c.copy(xe.start)) : (x.a.copy(g[_]), x.b.copy(xe.start), x.c.copy(xe.end), b.a.copy(g[w]), b.b.copy(g[_]), b.c.copy(xe.end)), a.a.copy(g[y]), a.b.copy(xe.end), a.c.copy(xe.start), Ct(x) || n.push(x), Ct(b) || n.push(b), Ct(a) && (n.splice(o, 1), o--, r--);\n }\n else u === 3 && console.warn(\"TriangleClipper: Coplanar clip not handled\");\n }\n }\n reset() {\n this.triangles.length = 0, this.trianglePool.clear(), this.coplanarTriangleUsed = !1;\n }\n}\nfunction Ld(s) {\n return s = ~~s, s + 4 - s % 4;\n}\nclass bo {\n constructor(e, t = 500) {\n this.expansionFactor = 1.5, this.type = e, this.length = 0, this.array = null, this.setSize(t);\n }\n setType(e) {\n if (this.length !== 0)\n throw new Error(\"TypeBackedArray: Cannot change the type while there is used data in the buffer.\");\n const t = this.array.buffer;\n this.array = new e(t), this.type = e;\n }\n setSize(e) {\n if (this.array && e === this.array.length)\n return;\n const t = this.type, n = ka() ? SharedArrayBuffer : ArrayBuffer, i = new t(new n(Ld(e * t.BYTES_PER_ELEMENT)));\n this.array && i.set(this.array, 0), this.array = i;\n }\n expand() {\n const { array: e, expansionFactor: t } = this;\n this.setSize(e.length * t);\n }\n push(...e) {\n let { array: t, length: n } = this;\n n + e.length > t.length && (this.expand(), t = this.array);\n for (let i = 0, o = e.length; i < o; i++)\n t[n + i] = e[i];\n this.length += e.length;\n }\n clear() {\n this.length = 0;\n }\n}\nclass Bd {\n constructor() {\n this.groupAttributes = [{}], this.groupCount = 0;\n }\n // returns the buffer type for the given attribute\n getType(e) {\n return this.groupAttributes[0][e].type;\n }\n getItemSize(e) {\n return this.groupAttributes[0][e].itemSize;\n }\n getNormalized(e) {\n return this.groupAttributes[0][e].normalized;\n }\n getCount(e) {\n if (this.groupCount <= e)\n return 0;\n const t = this.getGroupAttrArray(\"position\", e);\n return t.length / t.itemSize;\n }\n // returns the total length required for all groups for the given attribute\n getTotalLength(e) {\n const { groupCount: t, groupAttributes: n } = this;\n let i = 0;\n for (let o = 0; o < t; o++) {\n const r = n[o];\n i += r[e].length;\n }\n return i;\n }\n getGroupAttrSet(e = 0) {\n const { groupAttributes: t } = this;\n if (t[e])\n return this.groupCount = Math.max(this.groupCount, e + 1), t[e];\n const n = t[0];\n for (this.groupCount = Math.max(this.groupCount, e + 1); e >= t.length; ) {\n const i = {};\n t.push(i);\n for (const o in n) {\n const r = n[o], a = new bo(r.type);\n a.itemSize = r.itemSize, a.normalized = r.normalized, i[o] = a;\n }\n }\n return t[e];\n }\n // Get the raw array for the group set of data\n getGroupAttrArray(e, t = 0) {\n const { groupAttributes: n } = this;\n if (!n[0][e])\n throw new Error(`TypedAttributeData: Attribute with \"${e}\" has not been initialized`);\n return this.getGroupAttrSet(t)[e];\n }\n // initializes an attribute array with the given name, type, and size\n initializeArray(e, t, n, i) {\n const { groupAttributes: o } = this, a = o[0][e];\n if (a) {\n if (a.type !== t)\n for (let l = 0, h = o.length; l < h; l++) {\n const c = o[l][e];\n c.setType(t), c.itemSize = n, c.normalized = i;\n }\n } else\n for (let l = 0, h = o.length; l < h; l++) {\n const c = new bo(t);\n c.itemSize = n, c.normalized = i, o[l][e] = c;\n }\n }\n // Clear all the data\n clear() {\n this.groupCount = 0;\n const { groupAttributes: e } = this;\n e.forEach((t) => {\n for (const n in t)\n t[n].clear();\n });\n }\n // Remove the given key\n delete(e) {\n this.groupAttributes.forEach((t) => {\n delete t[e];\n });\n }\n // Reset the datasets completely\n reset() {\n this.groupAttributes = [], this.groupCount = 0;\n }\n}\nclass vo {\n constructor() {\n this.intersectionSet = {}, this.ids = [];\n }\n add(e, t) {\n const { intersectionSet: n, ids: i } = this;\n n[e] || (n[e] = [], i.push(e)), n[e].push(t);\n }\n}\nconst Id = 0, zd = 1, Nd = 2, Ra = 3, Od = 4, Da = 5, La = 6, Xe = new Js(), So = new Ae(), Le = new Oe(), dt = new Z(), To = new $t(), Eo = new $t(), Mo = new $t(), Ms = new $t(), wi = new $t(), _i = new $t(), Ao = new Ze(), As = new Z(), Cs = 1e-8, Ud = 1e-15, Ht = -1, Gt = 1, Ci = -2, Pi = 2, Nn = 0, Vt = 1, ur = 2, Fd = 1e-14;\nlet ki = null;\nfunction Co(s) {\n ki = s;\n}\nfunction Ba(s, e) {\n s.getMidpoint(Xe.origin), s.getNormal(Xe.direction);\n const t = e.raycastFirst(Xe, Vi);\n return !!(t && Xe.direction.dot(t.face.normal) > 0) ? Ht : Gt;\n}\nfunction Vd(s, e) {\n function t() {\n return Math.random() - 0.5;\n }\n s.getNormal(As), Xe.direction.copy(As), s.getMidpoint(Xe.origin);\n const n = 3;\n let i = 0, o = 1 / 0;\n for (let r = 0; r < n; r++) {\n Xe.direction.x += t() * Cs, Xe.direction.y += t() * Cs, Xe.direction.z += t() * Cs, Xe.direction.multiplyScalar(-1);\n const a = e.raycastFirst(Xe, Vi);\n if (!!(a && Xe.direction.dot(a.face.normal) > 0) && i++, a !== null && (o = Math.min(o, a.distance)), o <= Ud)\n return a.face.normal.dot(As) > 0 ? Pi : Ci;\n if (i / n > 0.5 || (r - i + 1) / n > 0.5)\n break;\n }\n return i / n > 0.5 ? Ht : Gt;\n}\nfunction jd(s, e) {\n const t = new vo(), n = new vo();\n return So.copy(s.matrixWorld).invert().multiply(e.matrixWorld), s.geometry.boundsTree.bvhcast(e.geometry.boundsTree, So, {\n intersectsTriangles(i, o, r, a) {\n if (!Ct(i) && !Ct(o)) {\n let l = i.intersectsTriangle(o, Ao, !0);\n if (!l) {\n const h = i.plane, c = o.plane, u = h.normal, d = c.normal;\n u.dot(d) === 1 && Math.abs(h.constant - c.constant) < Fd && (l = !0);\n }\n if (l) {\n let h = s.geometry.boundsTree.resolveTriangleIndex(r), c = e.geometry.boundsTree.resolveTriangleIndex(a);\n t.add(h, c), n.add(c, h), ki && (ki.addEdge(Ao), ki.addIntersectingTriangles(r, i, a, o));\n }\n }\n return !1;\n }\n }), { aIntersections: t, bIntersections: n };\n}\nfunction Hd(s, e, t, n, i, o, r = !1) {\n const a = t.attributes, l = t.index, h = s * 3, c = l.getX(h + 0), u = l.getX(h + 1), d = l.getX(h + 2);\n for (const p in o) {\n const f = a[p], m = o[p];\n if (!(p in a))\n throw new Error(`CSG Operations: Attribute ${p} not available on geometry.`);\n const g = f.itemSize;\n p === \"position\" ? (Le.a.fromBufferAttribute(f, c).applyMatrix4(n), Le.b.fromBufferAttribute(f, u).applyMatrix4(n), Le.c.fromBufferAttribute(f, d).applyMatrix4(n), Ps(Le.a, Le.b, Le.c, e, 3, m, r)) : p === \"normal\" ? (Le.a.fromBufferAttribute(f, c).applyNormalMatrix(i), Le.b.fromBufferAttribute(f, u).applyNormalMatrix(i), Le.c.fromBufferAttribute(f, d).applyNormalMatrix(i), r && (Le.a.multiplyScalar(-1), Le.b.multiplyScalar(-1), Le.c.multiplyScalar(-1)), Ps(Le.a, Le.b, Le.c, e, 3, m, r, !0)) : (To.fromBufferAttribute(f, c), Eo.fromBufferAttribute(f, u), Mo.fromBufferAttribute(f, d), Ps(To, Eo, Mo, e, g, m, r));\n }\n}\nfunction Gd(s, e, t, n, i, o, r, a = !1) {\n ks(s, n, i, o, r, a), ks(a ? t : e, n, i, o, r, a), ks(a ? e : t, n, i, o, r, a);\n}\nfunction Ia(s, e, t = !1) {\n switch (s) {\n case Id:\n if (e === Gt || e === Pi && !t)\n return Vt;\n break;\n case zd:\n if (t) {\n if (e === Ht)\n return Nn;\n } else if (e === Gt || e === Ci)\n return Vt;\n break;\n case Nd:\n if (t) {\n if (e === Gt || e === Ci)\n return Vt;\n } else if (e === Ht)\n return Nn;\n break;\n case Od:\n if (e === Ht)\n return Nn;\n if (e === Gt)\n return Vt;\n break;\n case Ra:\n if (e === Ht || e === Pi && !t)\n return Vt;\n break;\n case Da:\n if (!t && (e === Gt || e === Ci))\n return Vt;\n break;\n case La:\n if (!t && (e === Ht || e === Pi))\n return Vt;\n break;\n default:\n throw new Error(`Unrecognized CSG operation enum \"${s}\".`);\n }\n return ur;\n}\nfunction Ps(s, e, t, n, i, o, r = !1, a = !1) {\n const l = (h) => {\n o.push(h.x), i > 1 && o.push(h.y), i > 2 && o.push(h.z), i > 3 && o.push(h.w);\n };\n Ms.set(0, 0, 0, 0).addScaledVector(s, n.a.x).addScaledVector(e, n.a.y).addScaledVector(t, n.a.z), wi.set(0, 0, 0, 0).addScaledVector(s, n.b.x).addScaledVector(e, n.b.y).addScaledVector(t, n.b.z), _i.set(0, 0, 0, 0).addScaledVector(s, n.c.x).addScaledVector(e, n.c.y).addScaledVector(t, n.c.z), a && (Ms.normalize(), wi.normalize(), _i.normalize()), l(Ms), r ? (l(_i), l(wi)) : (l(wi), l(_i));\n}\nfunction ks(s, e, t, n, i, o = !1) {\n for (const r in i) {\n const a = e[r], l = i[r];\n if (!(r in e))\n throw new Error(`CSG Operations: Attribute ${r} no available on geometry.`);\n const h = a.itemSize;\n r === \"position\" ? (dt.fromBufferAttribute(a, s).applyMatrix4(t), l.push(dt.x, dt.y, dt.z)) : r === \"normal\" ? (dt.fromBufferAttribute(a, s).applyNormalMatrix(n), o && dt.multiplyScalar(-1), l.push(dt.x, dt.y, dt.z)) : (l.push(a.getX(s)), h > 1 && l.push(a.getY(s)), h > 2 && l.push(a.getZ(s)), h > 3 && l.push(a.getW(s)));\n }\n}\nclass Wd {\n constructor(e) {\n this.triangle = new Oe().copy(e), this.intersects = {};\n }\n addTriangle(e, t) {\n this.intersects[e] = new Oe().copy(t);\n }\n getIntersectArray() {\n const e = [], { intersects: t } = this;\n for (const n in t)\n e.push(t[n]);\n return e;\n }\n}\nclass Po {\n constructor() {\n this.data = {};\n }\n addTriangleIntersection(e, t, n, i) {\n const { data: o } = this;\n o[e] || (o[e] = new Wd(t)), o[e].addTriangle(n, i);\n }\n getTrianglesAsArray(e = null) {\n const { data: t } = this, n = [];\n if (e !== null)\n e in t && n.push(t[e].triangle);\n else\n for (const i in t)\n n.push(t[i].triangle);\n return n;\n }\n getTriangleIndices() {\n return Object.keys(this.data).map((e) => parseInt(e));\n }\n getIntersectionIndices(e) {\n const { data: t } = this;\n return t[e] ? Object.keys(t[e].intersects).map((n) => parseInt(n)) : [];\n }\n getIntersectionsAsArray(e = null, t = null) {\n const { data: n } = this, i = /* @__PURE__ */ new Set(), o = [], r = (a) => {\n if (n[a])\n if (t !== null)\n n[a].intersects[t] && o.push(n[a].intersects[t]);\n else {\n const l = n[a].intersects;\n for (const h in l)\n i.has(h) || (i.add(h), o.push(l[h]));\n }\n };\n if (e !== null)\n r(e);\n else\n for (const a in n)\n r(a);\n return o;\n }\n reset() {\n this.data = {};\n }\n}\nclass Xd {\n constructor() {\n this.enabled = !1, this.triangleIntersectsA = new Po(), this.triangleIntersectsB = new Po(), this.intersectionEdges = [];\n }\n addIntersectingTriangles(e, t, n, i) {\n const { triangleIntersectsA: o, triangleIntersectsB: r } = this;\n o.addTriangleIntersection(e, t, n, i), r.addTriangleIntersection(n, i, e, t);\n }\n addEdge(e) {\n this.intersectionEdges.push(e.clone());\n }\n reset() {\n this.triangleIntersectsA.reset(), this.triangleIntersectsB.reset(), this.intersectionEdges = [];\n }\n init() {\n this.enabled && (this.reset(), Co(this));\n }\n complete() {\n this.enabled && Co(null);\n }\n}\nconst kt = new Ae(), Oi = new Rl(), jt = new Oe(), xi = new Oe(), Mt = new Oe(), bi = new Oe(), tt = [], Kt = [];\nfunction qd(s) {\n for (const e of s) return e;\n}\nfunction Kd(s, e, t, n, i, o = {}) {\n const { useGroups: r = !0 } = o, { aIntersections: a, bIntersections: l } = jd(s, e), h = [];\n let c = null, u;\n return u = r ? 0 : -1, ko(s, e, a, t, !1, n, i, u), Ro(s, e, a, t, !1, i, u), t.findIndex((p) => p !== La && p !== Da) !== -1 && (u = r ? s.geometry.groups.length || 1 : -1, ko(e, s, l, t, !0, n, i, u), Ro(e, s, l, t, !0, i, u)), tt.length = 0, Kt.length = 0, {\n groups: h,\n materials: c\n };\n}\nfunction ko(s, e, t, n, i, o, r, a = 0) {\n const l = s.matrixWorld.determinant() < 0;\n kt.copy(e.matrixWorld).invert().multiply(s.matrixWorld), Oi.getNormalMatrix(s.matrixWorld).multiplyScalar(l ? -1 : 1);\n const h = s.geometry.groupIndices, c = s.geometry.index, u = s.geometry.attributes.position, d = e.geometry.boundsTree, p = e.geometry.index, f = e.geometry.attributes.position, m = t.ids, g = t.intersectionSet;\n for (let y = 0, w = m.length; y < w; y++) {\n const _ = m[y], x = a === -1 ? 0 : h[_] + a, b = 3 * _, A = c.getX(b + 0), M = c.getX(b + 1), C = c.getX(b + 2);\n jt.a.fromBufferAttribute(u, A).applyMatrix4(kt), jt.b.fromBufferAttribute(u, M).applyMatrix4(kt), jt.c.fromBufferAttribute(u, C).applyMatrix4(kt), o.reset(), o.initialize(jt);\n const P = g[_];\n for (let B = 0, T = P.length; B < T; B++) {\n const D = 3 * P[B], v = p.getX(D + 0), I = p.getX(D + 1), q = p.getX(D + 2);\n xi.a.fromBufferAttribute(f, v), xi.b.fromBufferAttribute(f, I), xi.c.fromBufferAttribute(f, q), o.splitByTriangle(xi);\n }\n const k = o.triangles;\n for (let B = 0, T = k.length; B < T; B++) {\n const D = k[B], v = o.coplanarTriangleUsed ? Vd(D, d) : Ba(D, d);\n tt.length = 0, Kt.length = 0;\n for (let I = 0, q = n.length; I < q; I++) {\n const H = Ia(n[I], v, i);\n H !== ur && (Kt.push(H), tt.push(r[I].getGroupAttrSet(x)));\n }\n if (tt.length !== 0) {\n jt.getBarycoord(D.a, bi.a), jt.getBarycoord(D.b, bi.b), jt.getBarycoord(D.c, bi.c);\n for (let I = 0, q = tt.length; I < q; I++) {\n const H = tt[I], j = Kt[I] === Nn;\n Hd(_, bi, s.geometry, s.matrixWorld, Oi, H, l !== j);\n }\n }\n }\n }\n return m.length;\n}\nfunction Ro(s, e, t, n, i, o, r = 0) {\n const a = s.matrixWorld.determinant() < 0;\n kt.copy(e.matrixWorld).invert().multiply(s.matrixWorld), Oi.getNormalMatrix(s.matrixWorld).multiplyScalar(a ? -1 : 1);\n const l = e.geometry.boundsTree, h = s.geometry.groupIndices, c = s.geometry.index, u = s.geometry.attributes, d = u.position, p = [], f = s.geometry.halfEdges, m = /* @__PURE__ */ new Set(), g = hr(s.geometry);\n for (let y = 0, w = g; y < w; y++)\n y in t.intersectionSet || m.add(y);\n for (; m.size > 0; ) {\n const y = qd(m);\n m.delete(y), p.push(y);\n const w = 3 * y, _ = c.getX(w + 0), x = c.getX(w + 1), b = c.getX(w + 2);\n Mt.a.fromBufferAttribute(d, _).applyMatrix4(kt), Mt.b.fromBufferAttribute(d, x).applyMatrix4(kt), Mt.c.fromBufferAttribute(d, b).applyMatrix4(kt);\n const A = Ba(Mt, l);\n Kt.length = 0, tt.length = 0;\n for (let M = 0, C = n.length; M < C; M++) {\n const P = Ia(n[M], A, i);\n P !== ur && (Kt.push(P), tt.push(o[M]));\n }\n for (; p.length > 0; ) {\n const M = p.pop();\n for (let C = 0; C < 3; C++) {\n const P = f.getSiblingTriangleIndex(M, C);\n P !== -1 && m.has(P) && (p.push(P), m.delete(P));\n }\n if (tt.length !== 0) {\n const C = 3 * M, P = c.getX(C + 0), k = c.getX(C + 1), B = c.getX(C + 2), T = r === -1 ? 0 : h[M] + r;\n if (Mt.a.fromBufferAttribute(d, P), Mt.b.fromBufferAttribute(d, k), Mt.c.fromBufferAttribute(d, B), !Ct(Mt))\n for (let D = 0, v = tt.length; D < v; D++) {\n const I = Kt[D], q = tt[D].getGroupAttrSet(T), H = I === Nn;\n Gd(P, k, B, u, s.matrixWorld, Oi, q, H !== a);\n }\n }\n }\n }\n}\nfunction Zd(s) {\n for (let e = 0; e < s.length - 1; e++) {\n const t = s[e], n = s[e + 1];\n if (t.materialIndex === n.materialIndex) {\n const i = t.start, o = n.start + n.count;\n n.start = i, n.count = o - i, s.splice(e, 1), e--;\n }\n }\n}\nfunction Yd(s, e, t, n) {\n t.clear();\n const i = s.attributes;\n for (let o = 0, r = n.length; o < r; o++) {\n const a = n[o], l = i[a];\n t.initializeArray(a, l.array.constructor, l.itemSize, l.normalized);\n }\n for (const o in t.attributes)\n n.includes(o) || t.delete(o);\n for (const o in e.attributes)\n n.includes(o) || (e.deleteAttribute(o), e.dispose());\n}\nfunction $d(s, e, t) {\n let n = !1, i = -1;\n const o = s.attributes, r = e.groupAttributes[0];\n for (const l in r) {\n const h = e.getTotalLength(l), c = e.getType(l), u = e.getItemSize(l), d = e.getNormalized(l);\n let p = o[l];\n (!p || p.array.length < h) && (p = new at(new c(h), u, d), s.setAttribute(l, p), n = !0);\n let f = 0;\n for (let m = 0, g = Math.min(t.length, e.groupCount); m < g; m++) {\n const y = t[m].index, { array: w, type: _, length: x } = e.groupAttributes[y][l], b = new _(w.buffer, 0, x);\n p.array.set(b, f), f += b.length;\n }\n p.needsUpdate = !0, i = h / p.itemSize;\n }\n if (s.index) {\n const l = s.index.array;\n if (l.length < i)\n s.index = null, n = !0;\n else\n for (let h = 0, c = l.length; h < c; h++)\n l[h] = h;\n }\n let a = 0;\n s.clearGroups();\n for (let l = 0, h = Math.min(t.length, e.groupCount); l < h; l++) {\n const { index: c, materialIndex: u } = t[l], d = e.getCount(c);\n d !== 0 && (s.addGroup(a, d, u), a += d);\n }\n s.setDrawRange(0, i), s.boundsTree = null, n && s.dispose();\n}\nfunction Do(s, e) {\n let t = e;\n return Array.isArray(e) || (t = [], s.forEach((n) => {\n t[n.materialIndex] = e;\n })), t;\n}\nclass Jd {\n constructor() {\n this.triangleSplitter = new Dd(), this.attributeData = [], this.attributes = [\"position\", \"uv\", \"normal\"], this.useGroups = !0, this.consolidateGroups = !0, this.debug = new Xd();\n }\n getGroupRanges(e) {\n return !this.useGroups || e.groups.length === 0 ? [{ start: 0, count: 1 / 0, materialIndex: 0 }] : e.groups.map((t) => ({ ...t }));\n }\n evaluate(e, t, n, i = new Ni()) {\n let o = !0;\n if (Array.isArray(n) || (n = [n]), Array.isArray(i) || (i = [i], o = !1), i.length !== n.length)\n throw new Error(\"Evaluator: operations and target array passed as different sizes.\");\n e.prepareGeometry(), t.prepareGeometry();\n const {\n triangleSplitter: r,\n attributeData: a,\n attributes: l,\n useGroups: h,\n consolidateGroups: c,\n debug: u\n } = this;\n for (; a.length < i.length; )\n a.push(new Bd());\n i.forEach((y, w) => {\n Yd(e.geometry, y.geometry, a[w], l);\n }), u.init(), Kd(e, t, n, r, a, { useGroups: h }), u.complete();\n const d = this.getGroupRanges(e.geometry), p = Do(d, e.material), f = this.getGroupRanges(t.geometry), m = Do(f, t.material);\n f.forEach((y) => y.materialIndex += p.length);\n let g = [...d, ...f].map((y, w) => ({ ...y, index: w }));\n if (h) {\n const y = [...p, ...m];\n c && (g = g.map((_) => {\n const x = y[_.materialIndex];\n return _.materialIndex = y.indexOf(x), _;\n }).sort((_, x) => _.materialIndex - x.materialIndex));\n const w = [];\n for (let _ = 0, x = y.length; _ < x; _++) {\n let b = !1;\n for (let A = 0, M = g.length; A < M; A++) {\n const C = g[A];\n C.materialIndex === _ && (b = !0, C.materialIndex = w.length);\n }\n b && w.push(y[_]);\n }\n i.forEach((_) => {\n _.material = w;\n });\n } else\n g = [{ start: 0, count: 1 / 0, index: 0, materialIndex: 0 }], i.forEach((y) => {\n y.material = p[0];\n });\n return i.forEach((y, w) => {\n const _ = y.geometry;\n $d(_, a[w], g), c && Zd(_.groups);\n }), o ? i : i[0];\n }\n // TODO: fix\n evaluateHierarchy(e, t = new Ni()) {\n e.updateMatrixWorld(!0);\n const n = (o, r) => {\n const a = o.children;\n for (let l = 0, h = a.length; l < h; l++) {\n const c = a[l];\n c.isOperationGroup ? n(c, r) : r(c);\n }\n }, i = (o) => {\n const r = o.children;\n let a = !1;\n for (let h = 0, c = r.length; h < c; h++) {\n const u = r[h];\n a = i(u) || a;\n }\n const l = o.isDirty();\n if (l && o.markUpdated(), a && !o.isOperationGroup) {\n let h;\n return n(o, (c) => {\n h ? h = this.evaluate(h, c, c.operation) : h = this.evaluate(o, c, c.operation);\n }), o._cachedGeometry = h.geometry, o._cachedMaterials = h.material, !0;\n } else\n return a || l;\n };\n return i(e), t.geometry = e._cachedGeometry, t.material = e._cachedMaterials, t;\n }\n reset() {\n this.triangleSplitter.reset();\n }\n}\nclass za {\n engine;\n planeObjects = [];\n planes = [];\n isActive = !1;\n evaluator;\n // 缓存相关\n geometryCache = /* @__PURE__ */ new Map();\n sectionMeshes = /* @__PURE__ */ new Map();\n planeGroup;\n planeSize = 1e3;\n sourceMeshes = /* @__PURE__ */ new Map();\n // 使用 Map 存储源网格\n planeThickness = 0.01;\n // 剖切平面盒子的厚度\n // 性能优化参数\n updateThrottleTime = 100;\n // 节流时间(ms)\n lastUpdateTime = 0;\n pendingUpdate = !1;\n updateTimer = null;\n // 缓存过期时间\n cacheExpireTime = 3e4;\n // 30秒\n // 平面变化检测\n planeStates = /* @__PURE__ */ new Map();\n constructor(e, t = {}) {\n this.engine = e, this.evaluator = new Jd(), this.planeGroup = new E.Group(), this.planeGroup.name = \"CSG_ClippingPlanes_Optimized\", t.updateThrottleTime !== void 0 && (this.updateThrottleTime = t.updateThrottleTime), t.cacheExpireTime !== void 0 && (this.cacheExpireTime = t.cacheExpireTime), t.planeThickness !== void 0 && (this.planeThickness = t.planeThickness), this.evaluator.attributes = [\"position\", \"normal\"], this.evaluator.useGroups = !1;\n }\n /**\n * 初始化剖切补面系统\n */\n init() {\n this.calculateSceneSize(), this.engine.scene.add(this.planeGroup), this.planes.forEach((e, t) => {\n const n = this.createEmptySectionMesh(e, t);\n this.planeGroup.add(n), this.sectionMeshes.set(`plane_${t}`, n), this.planeObjects.push(n), this.planeStates.set(t, {\n constant: e.constant,\n normal: e.normal.clone()\n });\n });\n }\n /**\n * 创建空的剖切补面网格\n */\n createEmptySectionMesh(e, t) {\n const n = new E.BufferGeometry(), i = new E.MeshStandardMaterial({\n color: new E.Color(33023),\n metalness: 0.1,\n roughness: 0.75,\n side: E.DoubleSide,\n depthWrite: !0,\n depthTest: !0,\n clippingPlanes: this.planes.filter((r, a) => a !== t)\n }), o = new E.Mesh(n, i);\n return o.name = `CSG_Section_Optimized_${t}`, o.visible = !1, o.renderOrder = t + 1, o;\n }\n /**\n * 激活剖切补面\n */\n active() {\n this.isActive = !0, this.requestUpdate(), this.planeObjects.forEach((e) => {\n e.visible = !0;\n });\n }\n /**\n * 停用剖切补面\n */\n disActive() {\n this.isActive = !1, this.planeObjects.forEach((e) => {\n e.visible = !1;\n }), this.updateTimer && (clearTimeout(this.updateTimer), this.updateTimer = null);\n }\n /**\n * 设置需要剖切的源网格\n */\n setSourceMeshes(e) {\n this.sourceMeshes.clear(), e.forEach((t) => {\n const n = t.uuid;\n this.sourceMeshes.set(n, t);\n }), this.isActive && this.requestUpdate();\n }\n /**\n * 添加单个源网格\n */\n addSourceMesh(e) {\n const t = e.uuid;\n this.sourceMeshes.has(t) || (this.sourceMeshes.set(t, e), this.isActive && this.requestUpdate());\n }\n /**\n * 移除源网格\n */\n removeSourceMesh(e) {\n const t = e.uuid;\n this.sourceMeshes.delete(t) && (this.clearMeshCache(t), this.isActive && this.requestUpdate());\n }\n /**\n * 请求更新(带节流)\n */\n requestUpdate() {\n if (!this.isActive) return;\n const e = Date.now(), t = e - this.lastUpdateTime;\n t >= this.updateThrottleTime ? (this.lastUpdateTime = e, this.pendingUpdate = !1) : (this.pendingUpdate = !0, this.updateTimer && clearTimeout(this.updateTimer), this.updateTimer = setTimeout(() => {\n this.pendingUpdate && this.isActive && (this.lastUpdateTime = Date.now(), this.pendingUpdate = !1), this.updateTimer = null;\n }, this.updateThrottleTime - t));\n }\n /**\n * 更新所有剖切补面\n */\n updateAllSections() {\n this.isActive && (this.planes.forEach((e, t) => {\n if (Math.abs(e.constant) < 99999)\n this.hasPlaneChanged(t, e) && (this.updateSection(e, t), this.updatePlaneState(t, e));\n else {\n const n = this.sectionMeshes.get(`plane_${t}`);\n n && (n.visible = !1);\n }\n }), this.cleanExpiredCache());\n }\n /**\n * 检查平面是否变化\n */\n hasPlaneChanged(e, t) {\n const n = this.planeStates.get(e);\n if (!n) return !0;\n const i = Math.abs(n.constant - t.constant) > 1e-4, o = !n.normal.equals(t.normal);\n return i || o;\n }\n /**\n * 更新平面状态\n */\n updatePlaneState(e, t) {\n this.planeStates.set(e, {\n constant: t.constant,\n normal: t.normal.clone()\n });\n }\n /**\n * 生成平面哈希值(用于缓存键)\n */\n getPlaneHash(e) {\n const t = e.normal, n = e.constant;\n return `${t.x.toFixed(4)}_${t.y.toFixed(4)}_${t.z.toFixed(4)}_${n.toFixed(4)}`;\n }\n /**\n * 生成缓存键\n */\n getCacheKey(e, t) {\n return `${e}_plane_${t}`;\n }\n /**\n * 更新单个剖切面的补面(带缓存)\n */\n updateSection(e, t) {\n const n = this.sectionMeshes.get(`plane_${t}`);\n if (!n) return;\n const i = this.getPlaneHash(e), o = [];\n if (this.sourceMeshes.forEach((r, a) => {\n const l = this.getCacheKey(a, t), h = this.geometryCache.get(l);\n if (h && h.planeHash === i)\n o.push(h.geometry.clone()), h.timestamp = Date.now();\n else\n try {\n const c = this.createPlaneBrush(e), u = new Ni(r.geometry);\n r.updateMatrixWorld(!0), u.matrix.copy(r.matrixWorld), u.updateMatrixWorld();\n const d = this.evaluator.evaluate(c, u, Ra);\n d && d.geometry.attributes.position.count > 0 ? (o.push(d.geometry), this.geometryCache.set(l, {\n geometry: d.geometry.clone(),\n planeHash: i,\n timestamp: Date.now()\n })) : this.geometryCache.delete(l);\n } catch (c) {\n console.warn(`CSG intersection failed for mesh ${a}:`, c);\n }\n }), o.length > 0) {\n const r = this.mergeGeometries(o);\n n.geometry && n.geometry.dispose(), n.geometry = r, n.visible = !0, n.position.set(0, 0, 0), n.rotation.set(0, 0, 0), n.scale.set(1, 1, 1), n.updateMatrixWorld();\n } else\n n.visible = !1;\n o.forEach((r) => r.dispose());\n }\n /**\n * 清理指定网格的缓存\n */\n clearMeshCache(e) {\n const t = [];\n this.geometryCache.forEach((n, i) => {\n i.startsWith(e) && (n.geometry.dispose(), t.push(i));\n }), t.forEach((n) => this.geometryCache.delete(n));\n }\n /**\n * 清理过期缓存\n */\n cleanExpiredCache() {\n const e = Date.now(), t = [];\n this.geometryCache.forEach((n, i) => {\n e - n.timestamp > this.cacheExpireTime && (n.geometry.dispose(), t.push(i));\n }), t.forEach((n) => this.geometryCache.delete(n));\n }\n /**\n * 清理所有缓存\n */\n clearAllCache() {\n this.geometryCache.forEach((e) => {\n e.geometry.dispose();\n }), this.geometryCache.clear();\n }\n /**\n * 创建剖切平面的 Brush 对象\n * 使用极薄的盒子代替平面,以便正确进行 CSG 布尔运算\n */\n createPlaneBrush(e) {\n const t = new E.BoxGeometry(this.planeSize, this.planeThickness, this.planeSize);\n t.translate(0, e.constant, 0), t.applyQuaternion(new E.Quaternion().setFromUnitVectors(new E.Vector3(0, -1, 0), e.normal));\n const n = new E.Mesh(t), i = new Ni(t);\n return i.matrix.copy(n.matrixWorld), i.updateMatrixWorld(), i;\n }\n /**\n * 合并多个几何体\n */\n mergeGeometries(e) {\n if (e.length === 1)\n return e[0].clone();\n const t = new E.BufferGeometry(), n = [], i = [], o = [];\n let r = 0;\n return e.forEach((a) => {\n const l = a.attributes.position, h = a.attributes.normal;\n for (let c = 0; c < l.count; c++)\n n.push(l.getX(c), l.getY(c), l.getZ(c));\n if (h)\n for (let c = 0; c < h.count; c++)\n i.push(h.getX(c), h.getY(c), h.getZ(c));\n if (a.index)\n for (let c = 0; c < a.index.count; c++)\n o.push(a.index.getX(c) + r);\n r += l.count;\n }), t.setAttribute(\"position\", new E.Float32BufferAttribute(n, 3)), i.length > 0 ? t.setAttribute(\"normal\", new E.Float32BufferAttribute(i, 3)) : t.computeVertexNormals(), o.length > 0 && t.setIndex(o), t;\n }\n /**\n * 计算场景大小\n */\n calculateSceneSize() {\n const e = new E.Box3();\n if (this.engine.scene.traverse((t) => {\n if (t.isMesh && t.geometry) {\n const n = new E.Box3().setFromObject(t);\n e.union(n);\n }\n }), e.isEmpty())\n this.planeSize = 1e3;\n else {\n const t = e.getSize(new E.Vector3()), n = Math.max(t.x, t.y, t.z);\n this.planeSize = n * 3;\n }\n }\n /**\n * 更新(每帧调用)\n */\n update() {\n this.isActive && this.pendingUpdate && !this.updateTimer && this.requestUpdate();\n }\n /**\n * 清理资源\n */\n dispose() {\n this.updateTimer && (clearTimeout(this.updateTimer), this.updateTimer = null), this.clearAllCache(), this.planeObjects.forEach((e) => {\n e.geometry && e.geometry.dispose(), e.material && (Array.isArray(e.material) ? e.material.forEach((t) => t.dispose()) : e.material.dispose());\n }), this.sectionMeshes.clear(), this.planeObjects = [], this.sourceMeshes.clear(), this.planeGroup.parent && this.planeGroup.parent.remove(this.planeGroup);\n }\n /**\n * 设置补面材质颜色\n */\n setSectionColor(e) {\n this.planeObjects.forEach((t) => {\n t.material instanceof E.MeshStandardMaterial && t.material.color.set(e);\n });\n }\n /**\n * 获取缓存统计信息\n */\n getCacheStats() {\n return {\n cacheSize: this.geometryCache.size,\n sourceMeshCount: this.sourceMeshes.size,\n sectionMeshCount: this.sectionMeshes.size\n };\n }\n /**\n * 设置剖切平面的厚度\n * @param thickness 厚度值(建议 0.001 - 1.0)\n */\n setPlaneThickness(e) {\n if (e <= 0) {\n console.warn(\"Plane thickness must be positive\");\n return;\n }\n this.planeThickness = e, this.clearAllCache(), this.isActive && this.requestUpdate();\n }\n /**\n * 获取当前平面厚度\n */\n getPlaneThickness() {\n return this.planeThickness;\n }\n /**\n * 显示所有补面\n */\n showSections() {\n this.sectionMeshes.forEach((e) => {\n e.geometry?.attributes.position?.count && e.geometry.attributes.position.count > 0 && (e.visible = !0);\n });\n }\n /**\n * 隐藏所有补面\n */\n hideSections() {\n this.sectionMeshes.forEach((e) => {\n e.visible = !1;\n });\n }\n /**\n * 显示指定索引的补面\n * @param index 平面索引\n */\n showSection() {\n this.planeGroup.visible = !0;\n }\n /**\n * 隐藏指定索引的补面\n * @param index 平面索引\n */\n hideSection() {\n this.planeGroup.visible = !1;\n }\n /**\n * 切换所有补面的可见性\n * @returns 切换后的可见性状态\n */\n toggleSectionsVisibility() {\n let e = !1;\n return this.sectionMeshes.forEach((t) => {\n t.visible && (e = !0);\n }), e ? (this.hideSections(), !1) : (this.showSections(), !0);\n }\n /**\n * 切换指定索引补面的可见性\n * @param index 平面索引\n * @returns 切换后的可见性状态\n */\n toggleSectionVisibility(e) {\n const t = this.sectionMeshes.get(`plane_${e}`);\n return t ? (t.visible = !t.visible, t.visible) : !1;\n }\n}\nclass Qd {\n engine;\n isActive = !1;\n isDrag = !1;\n meshs = [];\n box;\n pickPoint;\n pickNormal;\n pickMesh;\n box_;\n plane;\n // CSG 剖切补面\n csgClipping = null;\n useCsgClipping = !0;\n // 是否使用 CSG 补面\n constructor(e, t) {\n this.engine = e, this.meshs = [], this.box = null, t?.useCsgClipping !== void 0 && (this.useCsgClipping = t.useCsgClipping), this.useCsgClipping && this.initCsgClipping();\n }\n /**\n * 初始化 CSG 剖切补面\n */\n initCsgClipping() {\n this.csgClipping = new za(this.engine, {\n updateThrottleTime: 150,\n cacheExpireTime: 45e3\n }), this.csgClipping.planes = this.engine.sectionPlane, this.csgClipping.init();\n }\n /**\n * 启动剖切\n */\n active() {\n this.isActive || (this.isActive = !0, this.init(), this.meshs.forEach((e) => {\n e.visible = !0;\n }), this.engine.handelBehaved.init(this), this.engine.handelBehaved.active(), this.csgClipping && this.csgClipping.active(), this.engine.models.forEach((e) => {\n e.nodesMap.forEach((t) => {\n t.infos.forEach((n) => {\n this.csgClipping?.addSourceMesh(n.mesh);\n });\n });\n }));\n }\n /**\n * 停用剖切\n */\n disActive() {\n this.isActive = !1, this.engine.handelBehaved.disActive(), this.csgClipping && this.csgClipping.disActive();\n const e = this.engine.sectionPlane.find((t) => t.name == \"顶\");\n e && (e.constant = 1e5), this.meshs.forEach((t) => {\n t.visible = !1;\n });\n }\n /**\n * 初始化\n */\n init() {\n let e = this.engine.octreeBox.getBoundingBox();\n this.box = e, this.updata_face(e);\n }\n /**\n * 更新面\n */\n updata_face(e) {\n let t = this, n = t.engine.scene.children.find(\n (r) => r.type == \"Group\" && r.name == \"ClippingBox\"\n );\n n == null && (n = new E.Group(), n.name = \"ClippingBox\", t.engine.scene.add(n));\n let i = [\n new E.Vector3(e.min.x, e.max.y, e.min.z),\n new E.Vector3(e.max.x, e.max.y, e.min.z),\n new E.Vector3(e.max.x, e.max.y, e.max.z),\n new E.Vector3(e.min.x, e.max.y, e.max.z)\n ];\n o(i, new E.Vector3(0, 1, 0), \"顶\");\n function o(r, a, l) {\n const h = new E.BufferGeometry(), c = new Float32Array([\n r[0].x,\n r[0].y,\n r[0].z,\n // 点1\n r[1].x,\n r[1].y,\n r[1].z,\n // 点2\n r[2].x,\n r[2].y,\n r[2].z,\n // 点3\n r[3].x,\n r[3].y,\n r[3].z\n // 点4\n ]), u = [\n 0,\n 1,\n 2,\n // 第一个三角形\n 0,\n 2,\n 3\n // 第二个三角形\n ];\n h.setAttribute(\"position\", new E.BufferAttribute(c, 3)), h.setIndex(u);\n let d = t.meshs.find((y) => y.name == l);\n if (d == null) {\n const y = new E.MeshBasicMaterial({\n color: 65280,\n // 绿色\n transparent: !0,\n opacity: 0.02,\n side: E.DoubleSide\n }), w = new E.Mesh(h, y);\n w.normal = a, w.name = l, n.add(w), t.meshs.push(w);\n } else\n d.geometry = h;\n const p = new Float32Array([\n r[0].x,\n r[0].y,\n r[0].z,\n r[1].x,\n r[1].y,\n r[1].z,\n r[2].x,\n r[2].y,\n r[2].z,\n r[3].x,\n r[3].y,\n r[3].z,\n r[0].x,\n r[0].y,\n r[0].z\n ]);\n let f = new E.LineBasicMaterial({ color: 255 }), m = new E.BufferGeometry();\n m.setAttribute(\"position\", new E.BufferAttribute(p, 3));\n let g = t.meshs.find((y) => y.name == l + \"Line\");\n g == null && (g = new E.Line(m, f), g.name = l + \"Line\", n.add(g), t.meshs.push(g)), g.geometry = m, g.material = f, t.engine.sectionPlane.find((y) => y.name == l).setFromNormalAndCoplanarPoint(a.clone().setLength(-1), e.max), t.engine.scene.children.filter((y) => y.type == \"Mesh\" && y.url).forEach((y) => {\n y.material && Array.isArray(y.material) ? y.material.forEach((w) => {\n w.clippingPlanes = t.engine.sectionPlane;\n }) : y.material.clippingPlanes = t.engine.sectionPlane;\n });\n }\n }\n /**\n * 重写鼠标按下事件\n */\n handleMouseDown(e) {\n this.csgClipping?.hideSection(), this.isDrag = !0;\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0)\n if (this.pickPoint = t[0].point, this.pickNormal = t[0].face.normal, this.engine.controls.enabled = !1, this.pickMesh = t[0].object, this.box_ = {\n min: this.box.min.clone(),\n max: this.box.max.clone()\n }, this.pickNormal.y == 0) {\n const n = new E.Plane();\n n.setFromNormalAndCoplanarPoint(new E.Vector3(0, 1, 0), this.pickPoint), this.plane = n;\n } else {\n let n = new E.Vector3(\n this.engine.camera.position.x,\n this.pickPoint.y,\n this.engine.camera.position.z\n );\n const i = new E.Plane();\n i.setFromNormalAndCoplanarPoint(\n n.clone().sub(this.pickPoint.clone()).setLength(1),\n this.pickPoint\n ), this.plane = i;\n }\n }\n /**\n * 鼠标释放事件\n */\n handleMouseUp(e) {\n this.isDrag = !1, this.pickPoint = null, this.pickNormal = null, this.pickMesh = null, this.engine.controls.enabled = !0, this.csgClipping && this.isActive && (this.csgClipping.updateAllSections(), this.csgClipping?.showSection());\n }\n /**\n * 鼠标移动事件\n */\n handleMouseMove(e) {\n this.meshs.forEach((n) => {\n n.material.opacity = 0;\n });\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0 && (t[0].object.material.opacity = 0.05), this.pickPoint != null) {\n const n = new E.Vector3();\n if (e.raycaster.ray.intersectPlane(this.plane, n)) {\n let i = n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());\n this.pickMesh.name == \"前\" || this.pickMesh.name == \"左\" || this.pickMesh.name == \"底\" ? this.box.min = this.box_.min.clone().add(this.pickNormal.clone().setLength(i)) : this.box.max = this.box_.max.clone().add(this.pickNormal.clone().setLength(i)), this.updata_face(this.box);\n }\n }\n }\n /**\n * 更新(在渲染循环中调用)\n */\n update() {\n this.csgClipping && this.csgClipping.update();\n }\n /**\n * 切换到 CSG 补面模式\n */\n enableCsgClipping() {\n this.csgClipping || this.initCsgClipping(), this.useCsgClipping = !0, this.isActive && this.csgClipping && (this.engine.clipping?.clippingStencil && this.engine.clipping.clippingStencil.disActive(), this.csgClipping.active());\n }\n /**\n * 切换到传统 Stencil 补面模式\n */\n enableStencilClipping() {\n this.useCsgClipping = !1, this.isActive && (this.csgClipping && this.csgClipping.disActive(), this.engine.clipping?.clippingStencil && this.engine.clipping.clippingStencil.active());\n }\n /**\n * 设置 CSG 补面颜色\n */\n setCsgColor(e) {\n this.csgClipping && this.csgClipping.setSectionColor(e);\n }\n /**\n * 获取 CSG 统计信息\n */\n getCsgStats() {\n return this.csgClipping?.getCacheStats();\n }\n /**\n * 清理 CSG 缓存\n */\n clearCsgCache() {\n this.csgClipping?.clearAllCache();\n }\n /**\n * 清理资源\n */\n dispose() {\n this.disActive(), this.csgClipping && (this.csgClipping.dispose(), this.csgClipping = null);\n }\n}\nclass ep {\n engine;\n isActive = !1;\n isDrag = !1;\n meshs = [];\n box;\n pickPoint;\n pickNormal;\n pickMesh;\n box_;\n plane;\n constructor(e) {\n this.engine = e, this.meshs = [], this.box = null;\n }\n // 启动\n active() {\n this.isActive != !0 && (this.isActive = !0, this.init(), this.meshs.forEach((e) => {\n e.visible = !0;\n }), this.engine.handelBehaved.init(this), this.engine.handelBehaved.active());\n }\n disActive() {\n this.isActive = !1, this.engine.handelBehaved.disActive();\n const e = this.engine.sectionPlane.find((t) => t.name == \"左\");\n e && (e.constant = 1e5), this.meshs.forEach((t) => {\n t.visible = !1;\n });\n }\n // 初始化\n init() {\n let e = this.engine.octreeBox.getBoundingBox();\n this.box = e, this.updata_face(e);\n }\n // 更新面\n updata_face(e) {\n let t = this, n = t.engine.scene.children.find((r) => r.type == \"Group\" && r.name == \"ClippingBox\");\n n == null && (n = new E.Group(), n.name = \"ClippingBox\", t.engine.scene.add(n));\n let i = [\n new E.Vector3(e.min.x, e.min.y, e.max.z),\n new E.Vector3(e.min.x, e.min.y, e.min.z),\n new E.Vector3(e.min.x, e.max.y, e.min.z),\n new E.Vector3(e.min.x, e.max.y, e.max.z)\n ];\n o(i, new E.Vector3(-1, 0, 0), \"左\");\n function o(r, a, l) {\n const h = new E.BufferGeometry(), c = new Float32Array([\n r[0].x,\n r[0].y,\n r[0].z,\n // 点1\n r[1].x,\n r[1].y,\n r[1].z,\n // 点2\n r[2].x,\n r[2].y,\n r[2].z,\n // 点3\n r[3].x,\n r[3].y,\n r[3].z\n // 点4\n ]), u = [\n 0,\n 1,\n 2,\n // 第一个三角形\n 0,\n 2,\n 3\n // 第二个三角形\n ];\n h.setAttribute(\"position\", new E.BufferAttribute(c, 3)), h.setIndex(u);\n let d = t.meshs.find((y) => y.name == l);\n if (d == null) {\n const y = new E.MeshBasicMaterial({\n color: 65280,\n // 绿色\n transparent: !0,\n opacity: 0.02,\n side: E.DoubleSide\n // 双面渲染\n }), w = new E.Mesh(h, y);\n w.normal = a, w.name = l, n.add(w), t.meshs.push(w);\n } else\n d.geometry = h;\n const p = new Float32Array([\n r[0].x,\n r[0].y,\n r[0].z,\n // 点1\n r[1].x,\n r[1].y,\n r[1].z,\n // 点2\n r[2].x,\n r[2].y,\n r[2].z,\n // 点3\n r[3].x,\n r[3].y,\n r[3].z,\n // 点4 \n r[0].x,\n r[0].y,\n r[0].z\n // 点1\n ]);\n let f = new E.LineBasicMaterial({ color: 255 }), m = new E.BufferGeometry();\n m.setAttribute(\"position\", new E.BufferAttribute(p, 3));\n let g = t.meshs.find((y) => y.name == l + \"Line\");\n g == null && (g = new E.Line(m, f), g.name = l + \"Line\", n.add(g), t.meshs.push(g)), g.geometry = m, g.material = f, t.engine.sectionPlane.find((y) => y.name == l).setFromNormalAndCoplanarPoint(a.clone().setLength(-1), e.min), t.engine.scene.children.filter((y) => y.type == \"Mesh\" && y.url).forEach((y) => {\n y.material && Array.isArray(y.material) ? y.material.forEach((w) => {\n w.clippingPlanes = t.engine.sectionPlane;\n }) : y.material.clippingPlanes = t.engine.sectionPlane;\n });\n }\n }\n // 重写鼠标按下事件\n handleMouseDown(e) {\n this.isDrag = !0;\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0)\n if (this.pickPoint = t[0].point, this.pickNormal = t[0].face.normal, this.engine.controls.enabled = !1, this.pickMesh = t[0].object, this.box_ = {\n min: this.box.min.clone(),\n max: this.box.max.clone()\n }, this.pickNormal.y == 0) {\n const n = new E.Plane();\n n.setFromNormalAndCoplanarPoint(new E.Vector3(0, 1, 0), this.pickPoint), this.plane = n;\n } else {\n let n = new E.Vector3(this.engine.camera.position.x, this.pickPoint.y, this.engine.camera.position.z);\n const i = new E.Plane();\n i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1), this.pickPoint), this.plane = i;\n }\n }\n handleMouseUp(e) {\n this.isDrag = !1, this.pickPoint = null, this.pickNormal = null, this.pickMesh = null, this.engine.controls.enabled = !0;\n }\n handleMouseMove(e) {\n this.meshs.forEach((n) => {\n n.material.opacity = 0;\n });\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0 && (t[0].object.material.opacity = 0.05), this.pickPoint != null) {\n const n = new E.Vector3();\n if (e.raycaster.ray.intersectPlane(this.plane, n)) {\n let i = n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());\n this.pickMesh.name == \"前\" || this.pickMesh.name == \"左\" || this.pickMesh.name == \"底\" ? this.box.min = this.box_.min.clone().add(this.pickNormal.clone().setLength(i)) : this.box.max = this.box_.max.clone().add(this.pickNormal.clone().setLength(i)), this.updata_face(this.box);\n }\n }\n }\n}\nclass tp {\n engine;\n isActive = !1;\n box;\n pickPoint;\n pickNormal;\n pickMesh;\n box_;\n plane;\n meshs;\n isDrag = !1;\n // CSG 剖切补面\n csgClipping = null;\n useCsgClipping = !0;\n // 是否使用 CSG 补面\n constructor(e, t) {\n this.engine = e, this.meshs = [], t?.useCsgClipping !== void 0 && (this.useCsgClipping = t.useCsgClipping), this.useCsgClipping && this.initCsgClipping();\n }\n /**\n * 初始化 CSG 剖切补面\n */\n initCsgClipping() {\n this.csgClipping = new za(this.engine, {\n updateThrottleTime: 150,\n cacheExpireTime: 45e3\n }), this.csgClipping.planes = this.engine.sectionPlane, this.csgClipping.init();\n }\n active() {\n console.log(\"调用这里了\"), !this.isActive && (this.isActive = !0, this.init(), this.meshs.forEach((e) => {\n e.visible = !0;\n }), this.engine.handelBehaved.init(this), this.engine.handelBehaved.active(), this.csgClipping && this.csgClipping.active(), this.engine.models.forEach((e) => {\n e.nodesMap.forEach((t) => {\n t.infos.forEach((n) => {\n this.csgClipping?.addSourceMesh(n.mesh);\n });\n });\n }));\n }\n disActive() {\n this.isActive = !1, this.engine.handelBehaved.disActive(), this.csgClipping && this.csgClipping.disActive(), this.engine.sectionPlane.forEach((e) => {\n e.constant = 1e5;\n }), this.meshs.forEach((e) => {\n e.visible = !1;\n });\n }\n // 初始化\n init() {\n let e = this.engine.octreeBox.getBoundingBox();\n this.box = e, this.updata_face(e);\n }\n // 获取xyz值\n getboxXyz() {\n return {\n minX: this.box.min.x,\n minY: this.box.min.y,\n minZ: this.box.min.z,\n maxX: this.box.max.x,\n maxY: this.box.max.y,\n maxZ: this.box.max.z\n };\n }\n setboxXyz(e) {\n this.box.min.x = e.minX, this.box.min.y = e.minY, this.box.min.z = e.minZ, this.box.max.x = e.maxX, this.box.max.y = e.maxY, this.box.max.z = e.maxZ, this.updata_face(this.box);\n }\n // 设置剖切的box\n setBox(e) {\n this.box = e, this.updata_face(e);\n }\n // 反向剖切\n reverseBox() {\n }\n /**\n * 设置剖切盒范围(百分比)\n * @param percent 百分比范围 { x: {min, max}, y: {min, max}, z: {min, max} },值域 0-100\n */\n setboxPercent(e) {\n console.log(\"[SectionBox] setboxPercent called with:\", e);\n }\n // 重写鼠标按下事件\n handleMouseDown(e) {\n this.isDrag = !0;\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0)\n if (this.pickPoint = t[0].point, this.pickNormal = t[0].face.normal, this.engine.controls.enabled = !1, this.pickMesh = t[0].object, this.box_ = {\n min: this.box.min.clone(),\n max: this.box.max.clone()\n }, this.pickNormal.y == 0) {\n const n = new E.Plane();\n n.setFromNormalAndCoplanarPoint(new E.Vector3(0, 1, 0), this.pickPoint), this.plane = n;\n } else {\n let n = new E.Vector3(this.engine.camera.position.x, this.pickPoint.y, this.engine.camera.position.z);\n const i = new E.Plane();\n i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1), this.pickPoint), this.plane = i;\n }\n }\n handleMouseUp(e) {\n this.isDrag = !1, this.pickPoint = null, this.pickNormal = null, this.pickMesh = null, this.engine.controls.enabled = !0, this.csgClipping && this.isActive && (this.csgClipping.updateAllSections(), this.csgClipping?.showSection());\n }\n handleMouseMove(e) {\n this.meshs.forEach((n) => {\n n.material.opacity = 0;\n });\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0 && (t[0].object.material.opacity = 0.05), this.pickPoint != null) {\n const n = new E.Vector3();\n if (e.raycaster.ray.intersectPlane(this.plane, n)) {\n let i = n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());\n this.pickMesh.name == \"前\" || this.pickMesh.name == \"左\" || this.pickMesh.name == \"底\" ? this.box.min = this.box_.min.clone().add(this.pickNormal.clone().setLength(i)) : this.box.max = this.box_.max.clone().add(this.pickNormal.clone().setLength(i)), this.updata_face(this.box);\n }\n }\n }\n // 更新面\n updata_face(e) {\n let t = this, n = [\n new E.Vector3(e.min.x, e.min.y, e.min.z),\n new E.Vector3(e.max.x, e.min.y, e.min.z),\n new E.Vector3(e.max.x, e.max.y, e.min.z),\n new E.Vector3(e.min.x, e.max.y, e.min.z)\n ], i = [\n new E.Vector3(e.min.x, e.min.y, e.max.z),\n new E.Vector3(e.max.x, e.min.y, e.max.z),\n new E.Vector3(e.max.x, e.max.y, e.max.z),\n new E.Vector3(e.min.x, e.max.y, e.max.z)\n ], o = [\n new E.Vector3(e.max.x, e.min.y, e.max.z),\n new E.Vector3(e.max.x, e.min.y, e.min.z),\n new E.Vector3(e.max.x, e.max.y, e.min.z),\n new E.Vector3(e.max.x, e.max.y, e.max.z)\n ], r = [\n new E.Vector3(e.min.x, e.min.y, e.min.z),\n new E.Vector3(e.min.x, e.min.y, e.max.z),\n new E.Vector3(e.min.x, e.max.y, e.max.z),\n new E.Vector3(e.min.x, e.max.y, e.min.z)\n ], a = [\n new E.Vector3(e.min.x, e.max.y, e.min.z),\n new E.Vector3(e.max.x, e.max.y, e.min.z),\n new E.Vector3(e.max.x, e.max.y, e.max.z),\n new E.Vector3(e.min.x, e.max.y, e.max.z)\n ], l = [\n new E.Vector3(e.min.x, e.min.y, e.min.z),\n new E.Vector3(e.max.x, e.min.y, e.min.z),\n new E.Vector3(e.max.x, e.min.y, e.max.z),\n new E.Vector3(e.min.x, e.min.y, e.max.z)\n ];\n h(n, new E.Vector3(0, 0, -1), \"前\"), h(i, new E.Vector3(0, 0, 1), \"后\"), h(o, new E.Vector3(1, 0, 0), \"右\"), h(r, new E.Vector3(-1, 0, 0), \"左\"), h(a, new E.Vector3(0, 1, 0), \"顶\"), h(l, new E.Vector3(0, -1, 0), \"底\");\n function h(c, u, d) {\n const p = new E.BufferGeometry(), f = new Float32Array([\n c[0].x,\n c[0].y,\n c[0].z,\n // 点1\n c[1].x,\n c[1].y,\n c[1].z,\n // 点2\n c[2].x,\n c[2].y,\n c[2].z,\n // 点3\n c[3].x,\n c[3].y,\n c[3].z\n // 点4\n ]), m = [\n 0,\n 1,\n 2,\n // 第一个三角形\n 0,\n 2,\n 3\n // 第二个三角形\n ];\n p.setAttribute(\"position\", new E.BufferAttribute(f, 3)), p.setIndex(m);\n let g = t.engine.scene.children.find((A) => A.type == \"Group\" && A.name == \"ClippingBox\");\n g == null && (g = new E.Group(), g.name = \"ClippingBox\", t.engine.scene.add(g));\n let y = t.meshs.find((A) => A.name == d);\n if (y == null) {\n const A = new E.MeshBasicMaterial({\n color: 65280,\n // 绿色\n transparent: !0,\n opacity: 0,\n side: E.DoubleSide\n // 双面渲染\n }), M = new E.Mesh(p, A);\n M.normal = u, M.name = d, g.add(M), t.meshs.push(M);\n } else\n y.geometry = p;\n const w = new Float32Array([\n c[0].x,\n c[0].y,\n c[0].z,\n // 点1\n c[1].x,\n c[1].y,\n c[1].z,\n // 点2\n c[2].x,\n c[2].y,\n c[2].z,\n // 点3\n c[3].x,\n c[3].y,\n c[3].z,\n // 点4 \n c[0].x,\n c[0].y,\n c[0].z\n // 点1\n ]);\n let _ = new E.LineBasicMaterial({ color: 255 }), x = new E.BufferGeometry();\n x.setAttribute(\"position\", new E.BufferAttribute(w, 3));\n let b = t.meshs.find((A) => A.name == d + \"Line\");\n b == null && (b = new E.Line(x, _), b.name = d + \"Line\", g.add(b), t.meshs.push(b)), b.geometry = x, b.material = _, d == \"前\" || d == \"左\" || d == \"底\" ? t.engine.sectionPlane.find((A) => A.name == d).setFromNormalAndCoplanarPoint(u.clone().setLength(-1), e.min) : t.engine.sectionPlane.find((A) => A.name == d).setFromNormalAndCoplanarPoint(u.clone().setLength(-1), e.max), t.engine.scene.children.filter((A) => A.type == \"Mesh\" && A.url).forEach((A) => {\n A.material && Array.isArray(A.material) ? A.material.forEach((M) => {\n M.clippingPlanes = t.engine.sectionPlane;\n }) : A.material.clippingPlanes = t.engine.sectionPlane;\n });\n }\n }\n}\nclass np {\n engine;\n sectionPlaneX;\n sectionPlaneY;\n sectionPlaneZ;\n sectionBox;\n clippingStencil;\n constructor(e) {\n this.engine = e;\n let t = new E.Plane(new E.Vector3(0, 0, 1), 1e5);\n t.name = \"前\";\n let n = new E.Plane(new E.Vector3(0, 0, 1), 1e5);\n n.name = \"左\";\n let i = new E.Plane(new E.Vector3(0, 0, 1), 1e5);\n i.name = \"后\";\n let o = new E.Plane(new E.Vector3(0, 0, 1), 1e5);\n o.name = \"右\";\n let r = new E.Plane(new E.Vector3(0, 0, 1), 1e5);\n r.name = \"顶\";\n let a = new E.Plane(new E.Vector3(0, 0, 1), 1e5);\n a.name = \"底\", this.engine.sectionPlane = [t, n, i, o, r, a];\n }\n init() {\n this.sectionPlaneX = new cf(this.engine), this.sectionPlaneY = new Qd(this.engine), this.sectionPlaneZ = new ep(this.engine), this.sectionBox = new tp(this.engine);\n }\n disActive() {\n this.sectionPlaneX.disActive(), this.sectionPlaneY.disActive(), this.sectionPlaneZ.disActive(), this.sectionBox.disActive();\n }\n}\nclass ip {\n engine;\n constructor(e) {\n this.engine = e;\n }\n // 获取轴网的模型树\n getLevelTreeData() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n e.push({\n children: t.info.modelTree.modelTreeLevel,\n name: t.info.baseInfo.name\n });\n }), e;\n }\n // 获取类型的模型树\n getTypeTreeData() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n e.push({\n children: t.info.modelTree.modelTreeType,\n name: t.info.baseInfo.name\n });\n }), e;\n }\n // 获取专业的模型树\n getMajorTreeData() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n e.push({\n children: t.info.modelTree.modelTreeMajor,\n name: t.info.baseInfo.name\n });\n }), e;\n }\n}\nclass sp {\n engine;\n constructor(e) {\n this.engine = e;\n }\n /**\n * 获取引擎统计信息\n * 统计场景中所有网格的顶点数和三角面数\n * @returns 返回包含顶点数和三角面数的对象\n */\n getEngineInfo() {\n let e = 0, t = 0, n = 0;\n return !this.engine || !this.engine.scene ? {\n totalVertices: 0,\n totalTriangles: 0,\n meshCount: 0\n } : (this.engine.scene.traverse((i) => {\n if (i instanceof E.Mesh) {\n const o = i.geometry;\n if (o && o.attributes) {\n const r = o.attributes.position;\n if (r) {\n const a = r.count;\n e += a;\n let l = 0;\n o.index ? l = o.index.count / 3 : l = a / 3, t += l, n++;\n }\n }\n }\n }), {\n totalVertices: Math.floor(e),\n totalTriangles: Math.floor(t),\n meshCount: n\n });\n }\n}\nclass rp {\n engine;\n constructor(e) {\n this.engine = e;\n }\n init() {\n }\n // 查询构件属性\n getModelProperties(e, t, n) {\n let i = this.engine.engineStatus.models.find((r) => r.url === e);\n i.properties == null && _a(e + \"/property\", (r) => {\n let a = JSON.parse(r);\n i.properties = a, setTimeout(() => {\n o(a, t, n);\n }, 100);\n }), o(i.properties, t, n);\n function o(r, a, l) {\n let h = [], c = r.models[a.toString() || \"\"], u = c.map((d) => d[0]);\n u = u.filter((d, p) => u.indexOf(d) === p), u.forEach((d) => {\n let p = {\n name: r.categorys[d],\n children: []\n };\n h.push(p), c.filter((f) => f[0] === d).forEach((f) => {\n p.children.push({\n name: r.names[f[1]],\n value: r.values[f[2]]\n });\n });\n }), l?.({\n properties: h,\n materials: []\n });\n }\n }\n}\nclass op {\n engine;\n constructor(e) {\n this.engine = e;\n }\n // 获取模型中所有的类型\n getModelTypes() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n t.info.modelMapper.forEach((i) => {\n e.push(i.typeName);\n });\n }), e = e.filter((t, n, i) => i.indexOf(t) === n), e;\n }\n // 获取模型中所有的专业\n getModelMajors() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n t.info.modelMapper.forEach((i) => {\n e.push(i.majorName);\n });\n }), e = e.filter((t, n, i) => i.indexOf(t) === n), e;\n }\n // 获取模型中所有的楼层\n getModelLevels() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n t.info.modelMapper.forEach((i) => {\n e.push(i.levelName);\n });\n }), e = e.filter((t, n, i) => i.indexOf(t) === n), e;\n }\n // 批量获取模型映射\n getModelMappers(e) {\n }\n // 获取模型的mapper\n getModelMapper(e, t) {\n let n = this.engine.engineStatus.models.find((r) => r.url == e);\n return n ? n.info.modelMapper.find((r) => r.id == t) : null;\n }\n // 获取通类构件\n getModelSWithType(e, t = null) {\n let n = [];\n return this.engine.engineStatus.models.forEach((i) => {\n let o = {\n url: i.url,\n ids: []\n };\n n.push(o), i.info.modelMapper.filter((a) => a.typeName === e).forEach((a) => {\n o.ids.push(Number(a.id));\n });\n }), t && t(n), n;\n }\n // 获取同层构件\n getModelSWithLevel(e, t) {\n let n = [];\n return this.engine.engineStatus.models.forEach((i) => {\n let o = {\n url: i.url,\n ids: []\n };\n n.push(o), i.info.modelMapper.filter((a) => a.levelName === e).forEach((a) => {\n o.ids.push(Number(a.id));\n });\n }), t && t(n), n;\n }\n // 获取通专业构件 \n getModelsWithMajor(e, t) {\n let n = [];\n return this.engine.engineStatus.models.forEach((i) => {\n let o = {\n url: i.url,\n ids: []\n };\n n.push(o), i.info.modelMapper.filter((a) => a.majorName === e).forEach((a) => {\n o.ids.push(Number(a.id));\n });\n }), t && t(n), n;\n }\n}\nclass ap {\n engine;\n isActive = !1;\n groupEdge;\n material;\n indexes = /* @__PURE__ */ new Map();\n constructor(e) {\n this.engine = e, this.groupEdge = this.engine.scene.getObjectByName(\"groupEdge\"), this.material = new E.LineBasicMaterial({\n color: \"#000000\",\n depthTest: !0\n });\n }\n // 启动\n active() {\n this.isActive = !0, this.groupEdge.visible = !0, this.show();\n }\n // 关闭\n disActive() {\n this.isActive = !1, this.groupEdge.visible = !1;\n }\n // 显示模型边线\n show() {\n this.engine.engineStatus.models.forEach((e) => {\n if (!this.groupEdge.children.find((n) => n.url == e.url)) {\n let n = e.info, i = [], o = /* @__PURE__ */ new Map();\n n.modelEdge.forEach((l) => {\n let h = i.length;\n for (let c = 0; c < l.points.length; c++)\n l.points[c].length == 2 && (i.push(l.points[c][0].X), i.push(l.points[c][0].Z), i.push(-l.points[c][0].Y), i.push(l.points[c][1].X), i.push(l.points[c][1].Z), i.push(-l.points[c][1].Y));\n o.set(Number(l.id), [h, i.length, l.points]);\n }), this.indexes.set(e.url, o);\n let r = new E.BufferGeometry();\n r.setAttribute(\"position\", new E.Float32BufferAttribute(i, 3));\n const a = new E.LineSegments(r, this.material);\n a.url = e.url, this.groupEdge.add(a);\n }\n });\n }\n // 获取指定模型的边线\n getModelEdge(e, t) {\n let n = this.indexes.get(e);\n if (n) {\n let i = n.get(t);\n if (i)\n return i;\n }\n return null;\n }\n //隐藏边线\n hideModelEdge(e, t) {\n let n = this.indexes.get(e);\n if (n) {\n let i = n.get(t);\n if (i) {\n let [o, r, a] = i, l = this.groupEdge.children.find((h) => h.url == e);\n if (l) {\n let h = l.geometry.attributes.position.array;\n for (let c = o; c < r; c++)\n h[c] = NaN;\n l.geometry.attributes.position.needsUpdate = !0;\n }\n }\n }\n }\n // 显示边线\n showModelEdge(e, t) {\n let n = this.indexes.get(e);\n if (n) {\n let i = n.get(t);\n if (i) {\n let [o, r, a] = i, l = this.groupEdge.children.find((h) => h.url == e);\n if (l) {\n let h = l.geometry.attributes.position.array, c = 0;\n for (let u = o; u < r; u += 3) {\n const d = Math.floor(c / 6), p = c % 6 >= 3;\n if (a[d] && a[d].length === 2) {\n const f = p ? a[d][1] : a[d][0];\n h[u] = f.X, h[u + 1] = f.Z, h[u + 2] = -f.Y;\n }\n c += 3;\n }\n l.geometry.attributes.position.needsUpdate = !0;\n }\n }\n }\n }\n}\nclass lp {\n config;\n constructor(e) {\n this.config = {\n temperature: 0.7,\n maxTokens: 2e3,\n timeout: 3e4,\n ...e\n };\n }\n /**\n * 发送消息并获取响应(非流式)\n */\n async chat(e) {\n const t = new AbortController(), n = setTimeout(() => t.abort(), this.config.timeout);\n try {\n const i = await fetch(`${this.config.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`\n },\n body: JSON.stringify({\n model: this.config.model,\n messages: e,\n temperature: this.config.temperature,\n max_tokens: this.config.maxTokens,\n stream: !1\n }),\n signal: t.signal\n });\n if (clearTimeout(n), !i.ok) {\n const r = await i.json().catch(() => ({}));\n throw new Error(\n `API请求失败 (${i.status}): ${r.error?.message || r.message || i.statusText}`\n );\n }\n return (await i.json()).choices?.[0]?.message?.content || \"\";\n } catch (i) {\n throw clearTimeout(n), i.name === \"AbortError\" ? new Error(\"请求超时,请重试\") : i.message.includes(\"Failed to fetch\") ? new Error(`网络请求失败,请检查:\n1. 网络连接\n2. API地址是否正确\n3. 是否有CORS限制`) : i;\n }\n }\n /**\n * 发送消息并获取流式响应\n */\n async chatStream(e, t) {\n const n = new AbortController(), i = setTimeout(() => n.abort(), this.config.timeout);\n try {\n const o = await fetch(`${this.config.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`\n },\n body: JSON.stringify({\n model: this.config.model,\n messages: e,\n temperature: this.config.temperature,\n max_tokens: this.config.maxTokens,\n stream: !0\n }),\n signal: n.signal\n });\n if (clearTimeout(i), !o.ok) {\n const h = await o.json().catch(() => ({}));\n throw new Error(\n `API请求失败 (${o.status}): ${h.error?.message || h.message || o.statusText}`\n );\n }\n const r = o.body?.getReader();\n if (!r)\n throw new Error(\"无法读取响应流\");\n const a = new TextDecoder();\n let l = \"\";\n for (; ; ) {\n const { done: h, value: c } = await r.read();\n if (h) {\n t(\"\", !0);\n break;\n }\n l += a.decode(c, { stream: !0 });\n const u = l.split(`\n`);\n l = u.pop() || \"\";\n for (const d of u) {\n const p = d.trim();\n if (!p || !p.startsWith(\"data: \")) continue;\n const f = p.slice(6);\n if (f !== \"[DONE]\")\n try {\n const g = JSON.parse(f).choices?.[0]?.delta?.content;\n g && t(g, !1);\n } catch (m) {\n console.warn(\"解析流式数据失败:\", m);\n }\n }\n }\n } catch (o) {\n throw clearTimeout(i), o.name === \"AbortError\" ? new Error(\"请求超时,请重试\") : o.message.includes(\"Failed to fetch\") ? new Error(\"网络请求失败,请检查网络连接\") : o;\n }\n }\n /**\n * 更新配置\n */\n updateConfig(e) {\n this.config = { ...this.config, ...e };\n }\n /**\n * 获取当前配置\n */\n getConfig() {\n return { ...this.config };\n }\n}\nclass cp {\n /** 引擎实例 */\n engine;\n /** 步骤列表 */\n steps = [];\n /** 步骤执行结果 */\n stepResults = /* @__PURE__ */ new Map();\n /** 对话历史 */\n conversationHistory = [];\n /** 当前状态 */\n state = \"idle\";\n /** 大模型API实例 */\n llmApi = null;\n /** 配置 */\n config = null;\n /** 回调信息 */\n _callback_message;\n _callback_question;\n _callback_content;\n /** 提示词缓存 */\n prompts = {};\n /**\n * 构造函数\n * @param engine 引擎实例\n */\n constructor(e) {\n this.engine = e;\n }\n /**\n * 初始化AI管理器\n * @param config 对话配置\n */\n async init(e, t, n) {\n this._callback_message = e, this._callback_question = t, this._callback_content = n, this.conversationHistory = [];\n let i = {\n llmConfig: {\n baseURL: \"https://api.deepseek.com/v1\",\n apiKey: \"sk-4677b153277a40b096c6716686c29ac4\",\n model: \"deepseek-chat\",\n temperature: 0.7,\n maxTokens: 2e3\n },\n debug: !0,\n stepExecution: {\n // 默认允许 1 次重试:当 AI 生成的代码偶发不可执行/缺参数时,会自动让 AI 修复后再跑一次\n maxRetries: 5\n },\n prompts: {\n main: \"\",\n step: \"\",\n apiDoc: \"\"\n }\n };\n try {\n this.config = i, this.llmApi = new lp(i.llmConfig);\n try {\n const o = await import(\"./main-2Txx2Vau.mjs\");\n this.prompts.main = o.default;\n const r = await import(\"./step-CkmZYIvn.mjs\");\n this.prompts.step = r.default;\n const a = await import(\"./API文档-B1v8UcRF.mjs\");\n this.prompts.apiDoc = a.default;\n } catch (o) {\n throw console.error(\"[AI Manager] 提示词文件加载失败:\", o), new Error(`提示词文件加载失败: ${o.message || \"未知错误\"}`);\n }\n } catch (o) {\n throw console.error(\"[AI Manager] 初始化失败:\", o), o;\n }\n }\n /**\n * 处理对话,与大模型进行交互\n * callback_message:\n * @param callback_message 回调消息\n * @param callback_question 回调问题\n * @param callback_content 回调内容\n */\n async conversationV2(e) {\n if (this.conversationHistory.length === 0) {\n const i = {\n role: \"system\",\n content: `${this.prompts.main}`\n }, o = {\n role: \"system\",\n content: `## BIM引擎API文档\n${this.prompts.apiDoc}`\n };\n this.conversationHistory.push(i), this.conversationHistory.push(o);\n }\n this.conversationHistory.push({\n role: \"user\",\n content: e\n });\n const t = await this.llmApi.chat(this.conversationHistory);\n this.conversationHistory.push({\n role: \"assistant\",\n content: t\n }), this.config?.debug && console.log(\"[AI Manager] 大模型响应:\", t);\n let n = await this.parseAnalysisResponse(t);\n n && n.questions && n.questions.length > 0 && this._callback_question(n.questions);\n }\n /**\n * 解析分析响应\n */\n async parseAnalysisResponse(e) {\n try {\n if (e.includes(\"##question##\")) {\n const t = e.match(/##question##\\s*([\\s\\S]*?)(?=##|$)/);\n if (t) {\n let n = t[1].trim();\n n = n.replace(/^```json\\n?/, \"\").replace(/^```\\n?/, \"\").replace(/\\n?```$/, \"\");\n const i = n.match(/(\\[[\\s\\S]*\\])/);\n i && (n = i[1]);\n const o = JSON.parse(n);\n return this.state = \"waiting_answer\", {\n state: \"waiting_answer\",\n questions: o\n };\n }\n }\n if (e.includes(\"##steps##\")) {\n const t = e.match(/##steps##\\s*([\\s\\S]*?)(?=##|$)/);\n if (t) {\n let n = t[1].trim();\n n = n.replace(/^```json\\n?/, \"\").replace(/^```\\n?/, \"\").replace(/\\n?```$/, \"\");\n const i = n.match(/(\\[[\\s\\S]*\\])/);\n return i && (n = i[1]), this.steps = JSON.parse(n), this.config?.debug && console.log(\"[AI Manager] 步骤规划完成,共\", this.steps.length, \"个步骤\"), this._callback_message(this.steps), await this.executeSteps();\n }\n }\n return {\n state: \"completed\",\n data: e\n };\n } catch (t) {\n return console.error(\"[AI Manager] 解析响应失败:\", t), {\n state: \"error\",\n error: \"解析大模型响应失败: \" + t.message\n };\n }\n }\n /**\n * 执行步骤\n */\n async executeSteps() {\n try {\n this.state = \"executing\", this.stepResults.clear();\n for (const e of this.steps) {\n this._callback_message(e), this.config?.debug && console.log(`[AI Manager] 执行步骤 ${e.id}: ${e.content}`);\n const t = await this.getDependenciesOutput(e.dependencies), n = await this.executeStep(e, t);\n this.stepResults.set(e.id, n), this.config?.debug && console.log(`[AI Manager] 步骤 ${e.id} 执行完成:`, n);\n }\n return this.state = \"completed\", {\n state: \"completed\",\n steps: this.steps,\n result: Array.from(this.stepResults.values())\n };\n } catch (e) {\n return console.error(\"[AI Manager] 步骤执行失败:\", e), {\n state: \"error\",\n error: \"步骤执行失败: \" + e.message\n };\n }\n }\n /**\n * 获取依赖步骤的输出\n */\n async getDependenciesOutput(e) {\n return e.length === 0 ? null : e.length === 1 ? this.stepResults.get(e[0]) : e.map((t) => this.stepResults.get(t));\n }\n /**\n * 执行单个步骤\n */\n async executeStep(e, t) {\n const n = this.config?.stepExecution?.maxRetries ?? 1, i = [];\n let o = null, r = !1;\n for (let a = 0; a <= n; a++)\n try {\n const l = i.length > 0 ? i[i.length - 1] : \"\", c = await (a === 0 ? this.generateCode(e, t) : r ? this.regenerateCodeAfterFailure(e, t, l, o, a) : this.generateCode(e, t));\n i.push(c), this.config?.debug && console.log(`[AI Manager] 步骤 ${e.id} 第 ${a + 1} 次生成的代码:\n${c}`);\n try {\n const u = await this.executeCode(c, t);\n if (u instanceof Object && u.success == !1 || u instanceof String && (u.includes(\"undefined\") || u.includes(\"not\"))) {\n o = u, r = !0;\n debugger;\n throw u;\n }\n debugger;\n return u;\n } catch (u) {\n debugger;\n throw o = u, r = !0, u;\n }\n } catch (l) {\n if (r || (o = l), a >= n)\n throw console.error(`[AI Manager] 执行步骤 ${e.id} 失败(已达重试上限):`, l), new Error(`步骤 ${e.id} (${e.content}) 执行失败: ${l.message}`);\n console.warn(\n `[AI Manager] 步骤 ${e.id} 第 ${a + 1} 次执行失败,将尝试让AI修复后重试(剩余重试次数:${n - a}):`,\n l\n );\n }\n throw new Error(`步骤 ${e.id} (${e.content}) 执行失败: 未知错误`);\n }\n /**\n * 从大模型响应中提取代码(容错处理)\n * 优先尝试从 ##code## 标记中提取,如果没有则尝试从 markdown 代码块中提取\n * @param response 大模型响应文本\n * @returns 提取的代码字符串\n */\n extractCodeFromResponse(e) {\n const t = e.match(/##code##\\s*([\\s\\S]*?)(?=##|$)/);\n if (t) {\n let r = t[1].trim();\n if (r = r.replace(/^```javascript\\n?/, \"\").replace(/^```js\\n?/, \"\").replace(/^```\\n?/, \"\").replace(/\\n?```$/, \"\"), r.length > 0)\n return r;\n }\n const n = [\n /```javascript\\s*([\\s\\S]*?)```/i,\n // ```javascript ... ```\n /```js\\s*([\\s\\S]*?)```/i,\n // ```js ... ```\n /```\\s*([\\s\\S]*?)```/\n // ``` ... ```(通用代码块)\n ];\n for (const r of n) {\n const a = e.match(r);\n if (a && a[1]) {\n const l = a[1].trim();\n if (l.length > 0)\n return this.config?.debug && console.warn(\"[AI Manager] 未找到 ##code## 标记,从 markdown 代码块中提取代码\"), l;\n }\n }\n const i = /[请|说明|注意|需要|应该|可以|如果|但是|因为|所以|例如|比如]/i.test(e), o = /(function|const|let|var|return|async|await|=>|engine\\.|previousStepOutput)/.test(e);\n if (!i && o) {\n const a = e.trim().replace(/^[,。:;!?\\s]+/, \"\").replace(/[,。:;!?\\s]+$/, \"\");\n if (a.length > 10)\n return this.config?.debug && console.warn(\"[AI Manager] 未找到 ##code## 标记和代码块,尝试使用整个响应作为代码\"), a;\n }\n throw new Error(`无法从大模型响应中提取代码。响应内容:${e.substring(0, 200)}...`);\n }\n /**\n * 生成代码\n */\n async generateCode(e, t) {\n try {\n const n = {\n role: \"system\",\n content: `${this.prompts.step}`\n }, i = {\n role: \"system\",\n content: `\n\n## BIM引擎API文档\n${this.prompts.apiDoc}`\n }, o = {\n role: \"user\",\n content: `请根据以下步骤描述生成可执行的JavaScript代码:\n\n步骤信息:\n${JSON.stringify(e, null, 2)}\n\n前序步骤输出数据:\n${t ? JSON.stringify(t, null, 2) : \"null\"}\n\n请严格按照##code##格式输出代码。`\n }, r = [n, i, o], a = await this.llmApi.chat(r);\n return this.extractCodeFromResponse(a);\n } catch (n) {\n throw console.error(\"[AI Manager] 代码生成失败:\", n), n;\n }\n }\n /**\n * 执行失败后,让 AI 基于“错误信息 + 上一次代码”进行修复再生成\n * @param attempt 当前是第几次重试(从 1 开始)\n */\n async regenerateCodeAfterFailure(e, t, n, i, o) {\n try {\n const r = {\n role: \"system\",\n content: `${this.prompts.step}`\n }, a = {\n role: \"system\",\n content: `\n\n## BIM引擎API文档\n${this.prompts.apiDoc}`\n }, l = {\n message: i?.message || (i instanceof Object ? JSON.stringify(i) : String(i)),\n name: i?.name,\n stack: i?.stack\n }, h = {\n role: \"user\",\n content: `上一次生成的代码在执行时失败了,请你修复后重新输出完整可执行的 JavaScript 代码(仍然要严格按 ##code## 格式输出)。\n\n当前步骤信息:\n${JSON.stringify(e, null, 2)}\n\n前序步骤输出数据:\n${t ? JSON.stringify(t, null, 2) : \"null\"}\n\n上一次生成的代码:\n${n ? `\n\\`\\`\\`javascript\n${n}\n\\`\\`\\`\n` : `\n(无)\n`}\n\n执行错误信息(第 ${o} 次重试前):\n${JSON.stringify(l, null, 2)}\n\n修复要求(请务必遵守):\n1) 不要输出解释文字,只输出 ##code## 段落里的代码\n2) 如果是语法错误/引用未定义/缺少 await/返回值不一致,请直接修复\n3) 尽量保持与步骤目标一致,避免引入与步骤无关的副作用\n4) 代码需要能在浏览器环境运行(不要使用 Node 专属 API)`\n }, c = await this.llmApi.chat([r, a, h]);\n try {\n return this.extractCodeFromResponse(c);\n } catch (u) {\n throw new Error(`无法从大模型响应中提取代码(修复重试阶段):${u.message}`);\n }\n } catch (r) {\n throw console.error(\"[AI Manager] 修复后代码生成失败:\", r), r;\n }\n }\n /**\n * 执行代码\n */\n async executeCode(e, t) {\n try {\n const n = this.engine;\n let i = e;\n i = i.replace(/\\b(const|let|var)\\s+previousStepOutput\\s*=\\s*[^;]*;/g, \"\"), i = i.replace(/\\b(const|let|var)\\s+previousStepOutput\\s*;/g, \"\");\n const r = new Function(\"engine\", \"previousStepOutput\", `\n 'use strict';\n ${i}\n `)(n, t);\n return r && typeof r.then == \"function\" ? await r : r;\n } catch (n) {\n return console.error(\"[AI Manager] 代码执行失败:\", n), \"error\" + n.message;\n }\n }\n /**\n * 重置对话\n */\n reset() {\n this.conversationHistory = [], this.steps = [], this.stepResults.clear(), this.state = \"idle\", this.config?.debug && console.log(\"[AI Manager] 对话已重置\");\n }\n /**\n * 获取当前状态\n */\n getState() {\n return this.state;\n }\n /**\n * 获取对话历史\n */\n getHistory() {\n return [...this.conversationHistory];\n }\n /**\n * 获取步骤列表\n */\n getSteps() {\n return [...this.steps];\n }\n /**\n * 获取步骤结果\n */\n getStepResults() {\n return new Map(this.stepResults);\n }\n}\nclass hp {\n // 引擎参数\n options;\n DeviceType;\n animationId = null;\n isRenderingPaused = !1;\n controlsEnabledBeforePause = !0;\n animate;\n onWindowResize;\n // 基础模块\n scene;\n camera;\n renderer;\n sceneModule;\n cameraModule;\n deviceModule;\n renderModule;\n controlModule;\n composerModule;\n loaderModule;\n engineStatus;\n events;\n lightModule;\n interactionModule;\n modelToolModule;\n worldToScreen;\n handelBehaved;\n octreeBox;\n controls;\n stats;\n catchSvg;\n // 功能模块 \n viewCube;\n rangeScale;\n setting;\n measure;\n clipping;\n modelTree;\n engineInfo;\n modelProperties;\n modelMapperBatch;\n modelEdge;\n ai;\n // 业务数据\n models = [];\n reactBoundingClientRect = { left: 0, top: 0 };\n // 引擎容器\n container;\n constructor(e) {\n if (this.options = e, this.container = document.getElementById(e.containerId), !this.container)\n throw new Error(`Container ${e.containerId} not found`);\n this.ai = new cp(this), this.ai.init(), this.deviceModule = new Bl(this), this.DeviceType = this.deviceModule.getDeviceType(), this.cameraModule = new Ll(this), this.sceneModule = new Dl(this), this.scene = this.sceneModule.scene, this.renderModule = new Il(this), this.renderer = this.renderModule.createRenderer(), this.camera = this.cameraModule.orthographicCamera, this.scene.camera = this.camera, this.controlModule = new Yl(this), this.controlModule.switchDefaultMode(), this.controls = this.controlModule.orbitControls, this.composerModule = new uc(this), this.composerModule.init(), this.events = new zu(), this.engineStatus = new Iu(this), this.engineStatus.init(), this.loaderModule = new Bu(this), this.lightModule = new Nu(this), this.lightModule.init(), this.viewCube = new Zu(this), this.viewCube.init(), this.octreeBox = Yu(this), this.rangeScale = new $u(this), this.rangeScale.init(), this.clipping = new np(this), this.clipping.init(), this.setting = new Ju(this), this.setting.init(), this.handelBehaved = tr(this), this.modelMapperBatch = new op(this), this.measure = new lf(this), this.modelToolModule = new Uu(this), this.modelProperties = new rp(this), this.interactionModule = new Ou(this), this.interactionModule.init(), this.interactionModule.active(), this.modelEdge = new ap(this), this.modelTree = new ip(this), this.engineInfo = new sp(this), this.worldToScreen = new Ge(this.camera, this.renderer, this.scene), this.reactBoundingClientRect = this.container.getBoundingClientRect(), this.stats = new Hu(), this.stats.showPanel(0), this.stats.dom.style.position = \"absolute\", this.stats.dom.style.top = \"0px\", this.stats.dom.style.left = \"0px\", this.stats.dom.style.zIndex = \"1000\", this.container.appendChild(this.stats.dom);\n let t = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n t.style.position = \"absolute\", t.style.width = \"100%\", t.style.height = \"100%\", t.style.zIndex = \"1000\", t.style.left = \"0px\", t.style.top = \"0px\", t.style.pointerEvents = \"none\";\n const n = this.renderer?.domElement.width || 1920, i = this.renderer?.domElement.height || 1080;\n t.setAttribute(\"viewBox\", `0 0 ${n} ${i}`), t.setAttribute(\"preserveAspectRatio\", \"none\"), this.container.appendChild(t), this.catchSvg = t, this.onWindowResize = () => {\n this.handleWindowResize();\n }, window.addEventListener(\"resize\", this.onWindowResize), this.animate = () => {\n if (!this.isRenderingPaused)\n this.animationId = requestAnimationFrame(this.animate);\n else {\n this.animationId = null;\n return;\n }\n this.stats && this.stats.begin(), this.composerModule && this.composerModule.composer.render(), this.viewCube.cubeTool.RenderScene(), this.measure.update(), this.controlModule.update(), this.stats && this.stats.end();\n }, this.animate();\n }\n /**\n * 暂停渲染循环\n */\n pauseRendering() {\n if (this.isRenderingPaused) {\n console.warn(\"[BimEngine] Rendering is already paused\");\n return;\n }\n this.isRenderingPaused = !0, this.controls && (this.controlsEnabledBeforePause = this.controls.enabled, this.controls.enabled = !1);\n }\n /**\n * 恢复渲染循环\n */\n resumeRendering() {\n if (!this.isRenderingPaused) {\n console.warn(\"[BimEngine] Rendering is not paused\");\n return;\n }\n this.isRenderingPaused = !1, this.controls && (this.controls.enabled = this.controlsEnabledBeforePause), this.animationId === null && this.animate();\n }\n /**\n * 检查渲染是否暂停\n */\n isRenderingPausedState() {\n return this.isRenderingPaused;\n }\n /**\n * 处理窗口大小变化\n */\n handleWindowResize() {\n if (!this.container || !this.renderer || !this.camera)\n return;\n this.reactBoundingClientRect = this.container.getBoundingClientRect();\n const { width: e, height: t } = this.deviceModule.getContainerSize();\n this.renderer.setSize(e, t);\n const n = e / t;\n if (this.camera === this.cameraModule.perspectiveCamera ? (this.cameraModule.perspectiveCamera.aspect = n, this.cameraModule.perspectiveCamera.updateProjectionMatrix()) : this.camera === this.cameraModule.orthographicCamera && (this.cameraModule.orthographicCamera.left = 50 * n / -2, this.cameraModule.orthographicCamera.right = 50 * n / 2, this.cameraModule.orthographicCamera.top = 50 / 2, this.cameraModule.orthographicCamera.bottom = 50 / -2, this.cameraModule.orthographicCamera.updateProjectionMatrix()), this.composerModule && this.composerModule.composer && this.composerModule.composer.setSize(e, t), this.catchSvg) {\n const i = this.renderer.domElement.width, o = this.renderer.domElement.height;\n this.catchSvg.setAttribute(\"viewBox\", `0 0 ${i} ${o}`);\n }\n this.events && this.events.trigger(_n.ViewportResize, { width: e, height: t });\n }\n /**\n * 销毁引擎,释放资源\n */\n dispose() {\n console.log(\"[BimEngine] Starting engine disposal...\"), this.animationId !== null && (cancelAnimationFrame(this.animationId), this.animationId = null), this.isRenderingPaused = !0, this.onWindowResize && window.removeEventListener(\"resize\", this.onWindowResize);\n try {\n this.measure && (this.measure.disActive(), this.measure.clearAll(), this.measure.annotationContainer && this.measure.annotationContainer.remove()), this.clipping && this.clipping.disActive(), this.interactionModule && this.interactionModule.disActive(), this.viewCube && this.viewCube.cubeTool && typeof this.viewCube.cubeTool.dispose == \"function\" && this.viewCube.cubeTool.dispose();\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing managers:\", e);\n }\n try {\n this.controlModule && (this.controlModule.originDiv && this.controlModule.originDiv.remove(), this.controlModule.orbitControls && typeof this.controlModule.orbitControls.dispose == \"function\" && this.controlModule.orbitControls.dispose(), this.controlModule.firstPersonControls && typeof this.controlModule.firstPersonControls.dispose == \"function\" && this.controlModule.firstPersonControls.dispose());\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing controls:\", e);\n }\n this.scene && this.clearScene(this.scene);\n try {\n this.composerModule && this.composerModule.composer && (this.composerModule.composer.passes && this.composerModule.composer.passes.forEach((e) => {\n e.dispose && e.dispose();\n }), this.composerModule.composer.renderTarget1 && this.composerModule.composer.renderTarget1.dispose(), this.composerModule.composer.renderTarget2 && this.composerModule.composer.renderTarget2.dispose());\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing composer:\", e);\n }\n try {\n this.renderModule && this.renderModule.disposeRenderer(), this.renderer && (this.renderer.domElement && this.renderer.domElement.parentElement && this.renderer.domElement.parentElement.removeChild(this.renderer.domElement), this.renderer.dispose(), this.renderer.forceContextLoss());\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing renderer:\", e);\n }\n try {\n this.stats && this.stats.dom && this.stats.dom.parentElement && this.stats.dom.parentElement.removeChild(this.stats.dom), this.catchSvg && this.catchSvg.parentElement && this.catchSvg.parentElement.removeChild(this.catchSvg);\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing DOM elements:\", e);\n }\n try {\n this.events && this.events.listeners && this.events.listeners.clear();\n } catch (e) {\n console.warn(\"[BimEngine] Error clearing event listeners:\", e);\n }\n this.scene = null, this.camera = null, this.renderer = null, this.controls = null, this.models = [], this.container = null, console.log(\"[BimEngine] Engine disposal completed\");\n }\n /**\n * 递归清理场景中的所有对象\n */\n clearScene(e) {\n if (!e) return;\n [...e.children].forEach((n) => {\n this.clearScene(n);\n }), e.parent && e.parent.remove(e), e instanceof E.Mesh && (e.geometry && e.geometry.dispose(), e.material && (Array.isArray(e.material) ? e.material.forEach((n) => this.disposeMaterial(n)) : this.disposeMaterial(e.material))), e instanceof E.Line && (e.geometry && e.geometry.dispose(), e.material && this.disposeMaterial(e.material)), e instanceof E.Points && (e.geometry && e.geometry.dispose(), e.material && this.disposeMaterial(e.material)), e instanceof E.InstancedMesh && (e.geometry && e.geometry.dispose(), e.material && (Array.isArray(e.material) ? e.material.forEach((n) => this.disposeMaterial(n)) : this.disposeMaterial(e.material)), e.instanceMatrix && (e.instanceMatrix = null), e.instanceColor && (e.instanceColor = null)), e instanceof E.Sprite && e.material && this.disposeMaterial(e.material);\n }\n /**\n * 清理材质及其纹理\n */\n disposeMaterial(e) {\n if (!e) return;\n [\n \"map\",\n \"lightMap\",\n \"bumpMap\",\n \"normalMap\",\n \"specularMap\",\n \"envMap\",\n \"alphaMap\",\n \"aoMap\",\n \"displacementMap\",\n \"emissiveMap\",\n \"gradientMap\",\n \"metalnessMap\",\n \"roughnessMap\",\n \"clearcoatMap\",\n \"clearcoatNormalMap\",\n \"clearcoatRoughnessMap\",\n \"transmissionMap\",\n \"thicknessMap\",\n \"sheenColorMap\",\n \"sheenRoughnessMap\",\n \"specularIntensityMap\",\n \"specularColorMap\",\n \"iridescenceMap\",\n \"iridescenceThicknessMap\"\n ].forEach((n) => {\n const i = e[n];\n i && i instanceof E.Texture && i.dispose();\n }), e.dispose();\n }\n}\nfunction kp(s) {\n return new hp(s);\n}\nexport {\n kp as createEngine\n};\n//# sourceMappingURL=bim-engine-sdk.es.js.map\n","import type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { themeManager } from '../../services/theme';\nimport type { EngineOptions, ModelLoadOptions } from './types';\nimport type { MeasureMode } from '../../types/measure';\nimport type { SectionBoxRange } from '../section-box-panel/types';\n// 导入第三方 SDK 的 createEngine 函数(从 npm 包引入)\n// import { createEngine as createEngineSDK } from 'iflow-engine-base';\nimport { createEngine as createEngineSDK } from '../../../../bim_engine_base/dist/bim-engine-sdk.es';\n\n\n// 重新导出类型,方便外部引用\nexport type { EngineOptions, ModelLoadOptions };\n\n/**\n * 创建 Engine 实例的工厂函数\n * 兼容旧代码直接 import { createEngine } 的方式\n */\nexport const createEngine = (options: EngineOptions) => {\n return new Engine(options);\n};\n\n/**\n * 3D 引擎组件\n * 负责创建和管理第三方 3D 引擎实例\n */\nexport class Engine implements IBimComponent {\n /** 第三方 3D 引擎实例 */\n private engine: any = null;\n /** 引擎挂载的容器元素 */\n private container: HTMLElement;\n /** 引擎容器 ID(用于传递给 createEngine) */\n private containerId: string;\n /** 引擎配置选项(不包含 container) */\n private options: Omit;\n /** 是否已初始化 */\n private _isInitialized = false;\n /** 是否已销毁 */\n private _isDestroyed = false;\n /** 主题订阅取消函数 */\n private unsubscribeTheme: (() => void) | null = null;\n /** 当前激活的测量类型 */\n private currentMeasureType: MeasureMode | null = null;\n /** 主测量功能是否已激活 */\n private isMeasureActive: boolean = false;\n /** 当前激活的剖切轴向 */\n private currentSectionAxis: 'x' | 'y' | 'z' | null = null;\n /** 剖切盒是否激活 */\n private isSectionBoxActive: boolean = false;\n\n /**\n * 构造函数\n * @param options 3D 引擎配置选项\n */\n constructor(options: EngineOptions) {\n // 解析容器元素\n this.container = options.container;\n // 如果容器没有 id,生成一个唯一的 id\n if (!this.container.id) {\n this.containerId = `engine-container-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n this.container.id = this.containerId;\n } else {\n this.containerId = this.container.id;\n }\n\n // 保存配置选项(设置默认值)\n this.options = {\n backgroundColor: 'linear-gradient(to bottom, rgb(214, 224, 235), rgb(246, 250, 255))', // 固定背景渐变色\n version: options.version ?? 'v2', // 默认使用 v2 版本\n showStats: options.showStats ?? false, // 默认不显示统计\n showViewCube: options.showViewCube ?? true, // 默认显示视图立方体\n };\n }\n\n /**\n * 初始化组件 (接口实现)\n * 创建 div 容器并初始化引擎\n */\n public init(): void {\n if (this._isInitialized) {\n console.warn('[Engine] Engine already initialized.');\n return;\n }\n\n if (this._isDestroyed) {\n console.error('[Engine] Cannot initialize destroyed engine.');\n return;\n }\n\n try {\n // 应用背景色到容器\n if (typeof this.options.backgroundColor === 'string') {\n this.container.style.background = this.options.backgroundColor;\n }\n\n // 创建引擎配置对象\n const engineConfig = {\n containerId: this.containerId,\n backgroundColor: this.options.backgroundColor,\n version: this.options.version,\n showStats: this.options.showStats,\n showViewCube: this.options.showViewCube,\n };\n\n // 输出配置信息\n console.log('引擎配置信息:', engineConfig);\n\n // 调用引擎创建函数创建引擎实例\n // 将 options 中的配置复制给 createEngine\n this.engine = createEngineSDK(engineConfig);\n\n if (!this.engine) {\n throw new Error('Failed to create engine instance');\n }\n\n // 标记为已初始化\n this._isInitialized = true;\n\n // 订阅主题变化\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 应用当前主题\n this.setTheme(themeManager.getTheme());\n } catch (error) {\n console.error('[Engine] Failed to initialize engine:', error);\n this._isInitialized = false;\n throw error;\n }\n }\n\n /**\n * 设置主题 (接口实现)\n * 根据主题调整 3D 引擎的视觉效果(如背景色)\n * @param theme 全局主题配置\n */\n public setTheme(_theme: ThemeConfig): void {\n\n }\n\n /**\n * 设置语言 (接口实现)\n */\n public setLocales(): void {\n // 3D 引擎组件暂时不需要本地化\n }\n\n /**\n * 检查是否已初始化\n */\n public isInitialized(): boolean {\n return this._isInitialized;\n }\n\n\n /**\n * 加载 3D 模型\n * @param url 模型文件 URL\n * @param options 加载选项(位置、旋转、缩放)\n */\n public loadModel(url: string, options?: ModelLoadOptions): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Engine not initialized. Please call init() first.');\n return;\n }\n if (!url) {\n console.error('[Engine] Model URL is required.');\n return;\n }\n this.engine.loaderModule.loadModels([url], options);\n }\n\n /**\n * 回到主视角\n * @returns \n */\n public CameraGoHome() {\n this.engine.viewCube.CameraGoHome();\n }\n\n /**\n * 获取原始 3D 引擎实例\n */\n public getEngine(): any {\n return this.engine;\n }\n\n /**\n * 暂停渲染\n */\n public pauseRendering(): void {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return;\n }\n this.engine.pauseRendering();\n }\n\n /**\n * 恢复渲染\n */\n public resumeRendering(): void {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return;\n }\n this.engine.resumeRendering();\n }\n\n /**\n * 销毁 3D 引擎,释放 GPU 资源\n */\n public dispose(): void {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return;\n }\n this.engine.dispose();\n }\n\n // ==================== 测量功能方法 ====================\n\n /**\n * 激活具体测量类型的统一入口(私有方法)\n * @param type 测量类型\n * @param activateFunc 第三方引擎的激活函数\n */\n private activateMeasureType(type: MeasureMode, activateFunc: () => void): void {\n // 1. 检查引擎是否初始化\n if (!this._isInitialized || !this.engine) {\n console.error('Cannot activate measure: engine not initialized.');\n return;\n }\n\n // 2. 检查 measure 模块是否存在\n if (!this.engine.measure) {\n console.error('Measure module not available.');\n return;\n }\n\n if (!this.isMeasureActive) {\n console.log('激活测量功能');\n this.engine.measure.active();\n this.isMeasureActive = true;\n }\n\n // 4. 激活具体的测量类型(直接切换,不需要停用前一个)\n activateFunc();\n this.currentMeasureType = type;\n }\n\n /**\n * 激活距离测量\n */\n public activateDistanceMeasure(): void {\n this.activateMeasureType('distance', () => {\n console.log(`激活距离测量`);\n this.engine.measure.distanceMeasure.active();\n });\n }\n\n /**\n * 激活最小距离测量\n */\n public activateMinDistanceMeasure(): void {\n this.activateMeasureType('minDistance', () => {\n console.log(`激活最小距离测量`);\n this.engine.measure.clearDistanceMeasure.active();\n });\n }\n\n /**\n * 激活角度测量\n */\n public activateAngleMeasure(): void {\n this.activateMeasureType('angle', () => {\n console.log(`激活角度测量`);\n this.engine.measure.angleMeasure.active();\n console.log('[Engine] Angle measure activated (placeholder)');\n });\n }\n\n /**\n * 激活标高测量\n */\n public activateElevationMeasure(): void {\n this.activateMeasureType('elevation', () => {\n console.log(`激活标高测量`);\n this.engine.measure.elevationMeasure.active();\n });\n }\n\n /**\n * 激活体积测量\n */\n public activateVolumeMeasure(): void {\n this.activateMeasureType('volume', () => {\n console.log(`激活体积测量`);\n this.engine.measure.areaMeasure.active();\n });\n }\n\n /**\n * 激活激光测距\n */\n public activateLaserDistanceMeasure(): void {\n this.activateMeasureType('laserDistance', () => {\n // TODO: 调用第三方引擎方法(当前先空着)\n // this.engine.measure.laserDistanceMeasure.active();\n console.log('[Engine] Laser distance measure activated (placeholder)');\n });\n }\n\n /**\n * 激活坡度测量\n */\n public activateSlopeMeasure(): void {\n this.activateMeasureType('slope', () => {\n console.log(`激活坡度测量`);\n this.engine.measure.slopeMeasure.active();\n });\n }\n\n /**\n * 激活空间体积测量\n */\n public activateSpaceVolumeMeasure(): void {\n this.activateMeasureType('spaceVolume', () => {\n // TODO: 调用第三方引擎方法(当前先空着)\n // this.engine.measure.spaceVolumeMeasure.active();\n console.log('[Engine] Space volume measure activated (placeholder)');\n });\n }\n\n /**\n * 激活测量功能(根据类型统一入口)\n * @param mode 测量类型\n */\n public activateMeasure(mode: MeasureMode): void {\n switch (mode) {\n case 'distance':\n this.activateDistanceMeasure();\n break;\n case 'minDistance':\n this.activateMinDistanceMeasure();\n break;\n case 'angle':\n this.activateAngleMeasure();\n break;\n case 'elevation':\n this.activateElevationMeasure();\n break;\n case 'volume':\n this.activateVolumeMeasure();\n break;\n case 'laserDistance':\n this.activateLaserDistanceMeasure();\n break;\n case 'slope':\n this.activateSlopeMeasure();\n break;\n case 'spaceVolume':\n this.activateSpaceVolumeMeasure();\n break;\n }\n }\n\n /**\n * 停用测量功能(关闭测量时调用)\n */\n public deactivateMeasure(): void {\n if (!this._isInitialized || !this.engine?.measure) {\n return;\n }\n\n if (!this.isMeasureActive) {\n return;\n }\n\n console.log('停用测量功能');\n this.engine.measure.disActive();\n this.isMeasureActive = false;\n this.currentMeasureType = null;\n }\n\n /**\n * 获取当前激活的测量类型\n * @returns 当前测量类型,如果未激活则返回 null\n */\n public getCurrentMeasureType(): MeasureMode | null {\n return this.currentMeasureType;\n }\n\n /**\n * 清除所有测量标注\n */\n public clearAllMeasures(): void {\n if (!this._isInitialized || !this.engine?.measure) {\n return;\n }\n console.log('清除所有测量标注');\n this.engine.measure.clearAll();\n }\n\n // ==================== 结束:测量功能方法 ====================\n\n // ==================== 轴向剖切功能 ====================\n\n /**\n * 激活轴向剖切\n * @param axis 要激活的轴向 ('x' | 'y' | 'z')\n * @remarks\n * - 如果传入的轴向与当前激活的轴向相同,则静默返回(幂等操作)\n * - 如果当前有不同的轴向激活,先调用该轴向的 disActive() 再激活新轴向\n * - 使用单个 plane 的 disActive() 而非 clipping.disActive(),避免影响其他剖切功能\n * - 如果引擎未初始化或 clipping 模块不可用,方法会静默返回并输出错误日志\n */\n public activateSectionAxis(axis: 'x' | 'y' | 'z'): void {\n // 1. 检查引擎初始化\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Cannot activate section axis: engine not initialized.');\n return;\n }\n \n // 2. 检查 clipping 模块\n if (!this.engine.clipping) {\n console.error('[Engine] Clipping module not available.');\n return;\n }\n \n // 3. 如果是同一轴向,静默返回(幂等操作)\n if (this.currentSectionAxis === axis) {\n console.log(`[Engine] Section axis ${axis} already active, skipping.`);\n return;\n }\n \n // 4. 如果当前有激活的轴向且不同,先停用当前轴向\n if (this.currentSectionAxis) {\n this.deactivateCurrentSectionAxis();\n }\n \n // 5. 激活新轴向\n const planeMap: Record<'x' | 'y' | 'z', any> = {\n 'x': this.engine.clipping.sectionPlaneX,\n 'y': this.engine.clipping.sectionPlaneY,\n 'z': this.engine.clipping.sectionPlaneZ\n };\n const plane = planeMap[axis];\n \n if (plane && typeof plane.active === 'function') {\n console.log(`[Engine] Activating section axis: ${axis}`);\n plane.active();\n this.currentSectionAxis = axis;\n } else {\n console.error(`[Engine] Section plane ${axis} not available.`);\n }\n }\n\n /**\n * 停用当前轴向剖切(内部方法)\n * @remarks 只停用当前激活的单个轴向,不影响其他剖切功能\n */\n private deactivateCurrentSectionAxis(): void {\n if (!this.currentSectionAxis || !this.engine?.clipping) {\n return;\n }\n \n const planeMap: Record<'x' | 'y' | 'z', any> = {\n 'x': this.engine.clipping.sectionPlaneX,\n 'y': this.engine.clipping.sectionPlaneY,\n 'z': this.engine.clipping.sectionPlaneZ\n };\n const plane = planeMap[this.currentSectionAxis];\n \n if (plane && typeof plane.disActive === 'function') {\n console.log(`[Engine] Deactivating section axis: ${this.currentSectionAxis}`);\n plane.disActive();\n }\n }\n\n /**\n * 停用轴向剖切(公共方法,关闭弹窗时调用)\n * @remarks 使用 clipping.disActive() 停用所有剖切,清理状态\n */\n public deactivateSectionAxis(): void {\n if (!this._isInitialized || !this.engine?.clipping) {\n return;\n }\n \n if (this.currentSectionAxis) {\n console.log('[Engine] Deactivating all section axis');\n this.engine.clipping.disActive();\n this.currentSectionAxis = null;\n }\n }\n\n /**\n * 获取当前剖切轴向\n * @returns 当前激活的轴向,如果未激活则返回 null\n */\n public getCurrentSectionAxis(): 'x' | 'y' | 'z' | null {\n return this.currentSectionAxis;\n }\n\n // ==================== 结束:轴向剖切功能 ====================\n\n // ==================== 剖切盒功能 ====================\n\n /** 激活剖切盒 */\n public activateSectionBox(): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Cannot activate section box: engine not initialized.');\n return;\n }\n\n if (!this.engine.clipping?.sectionBox) {\n console.error('[Engine] Section box module not available.');\n return;\n }\n\n if (this.isSectionBoxActive) {\n console.log('[Engine] Section box already active, skipping.');\n return;\n }\n\n console.log('[Engine] Activating section box');\n this.engine.clipping.sectionBox.active();\n this.isSectionBoxActive = true;\n }\n\n /** 停用剖切盒 */\n public deactivateSectionBox(): void {\n if (!this._isInitialized || !this.engine?.clipping?.sectionBox) {\n return;\n }\n\n if (!this.isSectionBoxActive) {\n return;\n }\n\n console.log('[Engine] Deactivating section box');\n this.engine.clipping.sectionBox.disActive();\n this.isSectionBoxActive = false;\n }\n\n /** 设置剖切盒范围(百分比 0-100) */\n public setSectionBoxRange(range: SectionBoxRange): void {\n if (!this._isInitialized || !this.engine?.clipping?.sectionBox) {\n console.error('[Engine] Cannot set section box range: engine not initialized.');\n return;\n }\n\n console.log('[Engine] Setting section box range:', range);\n this.engine.clipping.sectionBox.setboxPercent(range);\n }\n\n /** 适应剖切盒到模型(将范围设置为整个模型包围盒) */\n public fitSectionBoxToModel(): void {\n if (!this._isInitialized || !this.engine?.clipping?.sectionBox) {\n console.error('[Engine] Cannot fit section box: engine not initialized.');\n return;\n }\n\n const box = this.engine.octreeBox?.getBoundingBox();\n if (!box) {\n console.error('[Engine] Cannot fit section box: model bounding box not available.');\n return;\n }\n\n console.log('[Engine] Fitting section box to model');\n this.engine.clipping.sectionBox.setBox(box);\n }\n\n /**\n * 重置剖切盒\n * @remarks 将剖切盒范围恢复为整个模型的包围盒\n */\n public resetSectionBox(): void {\n this.fitSectionBoxToModel();\n }\n\n // ==================== 结束:剖切盒功能 ====================\n\n // ==================== 漫游功能 ====================\n\n /** 漫游模式是否激活 */\n private isWalkModeActive: boolean = false;\n\n /**\n * 激活第一人称漫游模式\n * @remarks 切换到第一人称控制器,禁用轨道控制器\n */\n public activateFirstPersonMode(): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Cannot activate first person mode: engine not initialized.');\n return;\n }\n\n if (!this.engine.controlModule) {\n console.error('[Engine] Control module not available.');\n return;\n }\n\n if (this.isWalkModeActive) {\n console.log('[Engine] First person mode already active, skipping.');\n return;\n }\n\n console.log('[Engine] Activating first person mode');\n this.engine.controlModule.switchFirstPersonMode();\n this.isWalkModeActive = true;\n }\n\n /**\n * 停用第一人称漫游模式\n * @remarks 切换回轨道控制器\n */\n public deactivateFirstPersonMode(): void {\n if (!this._isInitialized || !this.engine?.controlModule) {\n return;\n }\n\n if (!this.isWalkModeActive) {\n return;\n }\n\n console.log('[Engine] Deactivating first person mode');\n this.engine.controlModule.switchDefaultMode();\n this.isWalkModeActive = false;\n }\n\n /**\n * 设置漫游移动速度\n * @param speed 移动速度(默认 0.02)\n */\n public setWalkSpeed(speed: number): void {\n if (!this._isInitialized || !this.engine?.controlModule?.firstPersonControls) {\n console.error('[Engine] Cannot set walk speed: engine not initialized.');\n return;\n }\n\n console.log('[Engine] Setting walk speed:', speed);\n this.engine.controlModule.firstPersonControls.moveSpeed = speed;\n }\n\n /**\n * 设置漫游重力开关\n * @param enabled 是否启用重力\n */\n public setWalkGravity(enabled: boolean): void {\n if (!this._isInitialized || !this.engine?.controlModule?.firstPersonControls) {\n console.error('[Engine] Cannot set walk gravity: engine not initialized.');\n return;\n }\n\n console.log('[Engine] Setting walk gravity:', enabled);\n this.engine.controlModule.firstPersonControls.applyGravity = enabled;\n }\n\n /**\n * 设置漫游碰撞检测开关\n * @param enabled 是否启用碰撞检测\n */\n public setWalkCollision(enabled: boolean): void {\n if (!this._isInitialized || !this.engine?.controlModule?.firstPersonControls) {\n console.error('[Engine] Cannot set walk collision: engine not initialized.');\n return;\n }\n\n console.log('[Engine] Setting walk collision:', enabled);\n this.engine.controlModule.firstPersonControls.applyCollision = enabled;\n }\n\n /**\n * 获取漫游模式是否激活\n * @returns 是否处于漫游模式\n */\n public isFirstPersonModeActive(): boolean {\n return this.isWalkModeActive;\n }\n\n // ==================== 结束:漫游功能 ====================\n\n /** 激活框选放大功能 */\n public activateZoomBox(): void {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return;\n }\n this.engine.rangeScale?.active();\n }\n\n /**\n * 销毁组件 (接口实现)\n * 清理资源、取消订阅、销毁引擎实例\n */\n public destroy(): void {\n if (this._isDestroyed) {\n return;\n }\n\n // 停用测量功能\n this.deactivateMeasure();\n\n // 取消主题订阅\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n\n // 销毁 3D 引擎,释放 GPU 资源\n if (this.engine) {\n this.engine.dispose();\n this.engine = null;\n }\n\n // 清理容器\n this.container.innerHTML = '';\n\n // 更新状态\n this.currentMeasureType = null;\n this.isMeasureActive = false;\n this._isDestroyed = true;\n this._isInitialized = false;\n }\n}\n\n\n","import { IBimComponent } from '../../types/component';\nimport { ThemeConfig } from '../../themes/types';\nimport { IRightKeyContent, RightKeyOptions } from './types';\nimport './index.css';\n\n/**\n * 右键浮层容器组件 (RightKey)\n * 这是一个纯粹的定位容器,负责在屏幕指定位置显示内容。\n * 它不关心具体内容是什么,只处理定位、边界检测和关闭逻辑。\n */\nexport class BimRightKey implements IBimComponent {\n private element: HTMLElement;\n private content: IRightKeyContent | null = null;\n private isVisible: boolean = false;\n private onCloseCallback?: () => void;\n private options?: RightKeyOptions;\n \n private mouseDownTime: number = 0;\n private readonly CLICK_THRESHOLD: number = 200; // ms\n\n constructor(options?: RightKeyOptions) {\n this.options = options;\n this.element = document.createElement('div');\n this.element.className = `bim-right-key ${options?.className || ''}`;\n \n // 设置层级,默认很高以覆盖其他 UI\n if (options?.zIndex) {\n this.element.style.zIndex = options.zIndex.toString();\n }\n \n // 挂载到 body 以便进行固定定位\n document.body.appendChild(this.element);\n }\n\n public init(): void {\n // 绑定全局点击事件,用于实现\"点击外部关闭\"\n document.addEventListener('mousedown', this.handleGlobalClick);\n \n // 阻止在容器自身上触发系统默认右键菜单\n this.element.addEventListener('contextmenu', (e) => {\n e.preventDefault();\n e.stopPropagation();\n });\n\n // 绑定容器交互事件\n if (this.options?.container) {\n this.options.container.addEventListener('mousedown', this.handleContainerMouseDown);\n this.options.container.addEventListener('mouseup', this.handleContainerMouseUp);\n this.options.container.addEventListener('contextmenu', this.handleContainerContextMenu);\n }\n }\n\n public setTheme(_theme: ThemeConfig): void {\n // 容器本身通常是透明的,主题样式主要由内容组件处理\n // 如果容器需要背景色,可以在这里设置\n // 使用 _theme 前缀避免 TS 未使用变量报错\n }\n\n public setLocales(): void {\n // 容器不包含文本,无需处理国际化\n // 内容组件的国际化由内容组件自身处理\n }\n\n public destroy(): void {\n document.removeEventListener('mousedown', this.handleGlobalClick);\n \n if (this.options?.container) {\n this.options.container.removeEventListener('mousedown', this.handleContainerMouseDown);\n this.options.container.removeEventListener('mouseup', this.handleContainerMouseUp);\n this.options.container.removeEventListener('contextmenu', this.handleContainerContextMenu);\n }\n\n this.unmountContent();\n this.element.remove();\n }\n\n private handleContainerMouseDown = (e: MouseEvent): void => {\n // 记录右键按下时间 (button 2 是右键)\n if (e.button === 2) {\n this.mouseDownTime = Date.now();\n }\n };\n\n private handleContainerMouseUp = (e: MouseEvent): void => {\n // 只处理右键 (button 2)\n if (e.button !== 2) return;\n\n // 检查点击时长,如果是长按或拖拽(时间过长),则不触发回调\n const pressDuration = Date.now() - this.mouseDownTime;\n if (pressDuration > this.CLICK_THRESHOLD) {\n return;\n }\n\n // 触发有效右键回调\n if (this.options?.onContext) {\n this.options.onContext(e);\n }\n };\n\n private handleContainerContextMenu = (e: MouseEvent): void => {\n // 阻止浏览器默认的右键菜单\n // 真正的菜单触发逻辑已移至 mouseup,这里只负责拦截默认行为\n e.preventDefault();\n };\n\n /**\n * 设置关闭时的回调函数\n * 通常用于通知 Manager 状态变更\n */\n public setOnClose(callback: () => void): void {\n this.onCloseCallback = callback;\n }\n\n /**\n * 挂载内容组件\n * @param content 实现了 IRightKeyContent 接口的组件实例\n */\n public mount(content: IRightKeyContent): void {\n // 先卸载旧内容,防止内存泄漏\n this.unmountContent();\n \n this.content = content;\n this.element.appendChild(content.getElement());\n }\n\n /**\n * 卸载当前内容\n */\n public unmountContent(): void {\n if (this.content) {\n this.content.destroy(); // 重要:调用组件销毁方法清理���源\n this.element.innerHTML = '';\n this.content = null;\n }\n }\n\n /**\n * 在指定位置显示容器\n * 包含智能边界检测逻辑,防止溢出屏幕\n * @param x 目标 X 坐标 (通常是鼠标点击位置)\n * @param y 目标 Y 坐标\n */\n public show(x: number, y: number): void {\n this.element.classList.add('visible');\n this.isVisible = true;\n\n // 1. 先定位到目标位置,以便测量尺寸\n this.element.style.left = `${x}px`;\n this.element.style.top = `${y}px`;\n\n // 2. 获取容器尺寸和视口尺寸\n const rect = this.element.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let newX = x;\n let newY = y;\n\n // 3. 水平方向边界检测:如果溢出右边界,则向左对齐\n if (x + rect.width > viewportWidth) {\n newX = x - rect.width;\n }\n \n // 4. 垂直方向边界检测:如果溢出下边界,则向上对齐\n if (y + rect.height > viewportHeight) {\n newY = y - rect.height;\n }\n\n // 5. 应用修正后的坐标\n this.element.style.left = `${newX}px`;\n this.element.style.top = `${newY}px`;\n }\n\n /**\n * 隐藏容器\n */\n public hide(): void {\n this.element.classList.remove('visible');\n this.isVisible = false;\n \n // 为了状态重置,通常隐藏时也卸载内容\n this.unmountContent(); \n \n if (this.onCloseCallback) {\n this.onCloseCallback();\n }\n }\n\n /**\n * 处理全局点击事件\n * 用于检测是否点击了容器外部\n */\n private handleGlobalClick = (e: MouseEvent): void => {\n if (!this.isVisible) return;\n \n // 如果点击的是容器内部,不做处理\n if (this.element.contains(e.target as Node)) {\n return;\n }\n\n // 点击外部,关闭容器\n this.hide();\n };\n}\n","import { IBimComponent } from '../../types/component';\nimport { ThemeConfig } from '../../themes/types';\nimport { localeManager, t } from '../../services/locale';\nimport { MenuItemConfig } from './item';\nimport { MenuOptions } from './types';\nimport './index.css';\nimport { themeManager } from '../../services/theme';\n\n/**\n * 通用菜单列表组件\n * 负责渲染一组菜单项,支持分组、排序、图标、快捷键提示和递归多级子菜单。\n * 它不包含定位逻辑,仅负责内容渲染。\n */\nexport class BimMenu implements IBimComponent {\n public element: HTMLElement;\n private options: MenuOptions;\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n // 当前激活的子菜单引用,用于自动关闭\n private activeSubMenu: { menu: BimMenu; container: HTMLElement } | null = null;\n\n constructor(options: MenuOptions) {\n this.options = options;\n this.element = document.createElement('ul');\n this.element.className = 'bim-menu';\n }\n\n /**\n * 初始化组件\n * 渲染 DOM 结构并订阅语言变更\n */\n public init(): void {\n this.render();\n\n // 订阅语言变更事件,实现国际化自动更新\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n // 自动订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n }\n\n /**\n * 设置主题\n * @param theme 全局主题配置\n */\n public setTheme(theme: ThemeConfig) {\n const style = this.element.style;\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-divider', theme.divider);\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover);\n style.setProperty('--bim-shadow-lg', theme.shadowLg);\n }\n\n /**\n * 响应语言变更\n * 重新渲染整个菜单以更新文本\n */\n public setLocales(): void {\n this.element.innerHTML = '';\n this.render();\n }\n\n /**\n * 销毁组件\n * 清理事件监听、子菜单和 DOM 元素\n */\n public destroy(): void {\n // 取消语言订阅\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n // 关闭并销毁所有打开的子菜单\n this.closeSubMenu();\n // 移除自身 DOM\n this.element.remove();\n }\n\n /**\n * 获取组件根元素\n * 实现 IRightKeyContent 接口,允许被 RightKey 容器挂载\n */\n public getElement(): HTMLElement {\n return this.element;\n }\n\n /**\n * 核心渲染逻辑\n * 处理分组、排序和 DOM 生成\n */\n private render(): void {\n const { items, groupOrder } = this.options;\n\n // 1. 数据分桶:按 group 字段将菜单项分组\n const groups = new Map();\n const defaultGroup = 'default';\n\n items.forEach(item => {\n const groupName = item.group || defaultGroup;\n if (!groups.has(groupName)) {\n groups.set(groupName, []);\n }\n groups.get(groupName)!.push(item);\n });\n\n // 2. 确定分组顺序\n let sortedGroupKeys: string[] = [];\n if (groupOrder) {\n // 优先按照 groupOrder 指定的顺序排序\n sortedGroupKeys = groupOrder.filter(g => groups.has(g));\n // 将未在 groupOrder 中定义的组追加到最后\n for (const key of groups.keys()) {\n if (!sortedGroupKeys.includes(key)) {\n sortedGroupKeys.push(key);\n }\n }\n } else {\n // 如果未指定顺序,则按默认遍历顺序\n sortedGroupKeys = Array.from(groups.keys());\n }\n\n // 3. 渲染分组和组内项\n sortedGroupKeys.forEach((groupName, index) => {\n // 除了第一组外,每组之前插入分割线\n if (index > 0) {\n const divider = document.createElement('li');\n divider.className = 'bim-menu-divider';\n this.element.appendChild(divider);\n }\n\n const groupItems = groups.get(groupName)!;\n // 组内排序:根据 item.order 升序排列\n groupItems.sort((a, b) => (a.order || 0) - (b.order || 0));\n\n groupItems.forEach(item => {\n // 仅渲染可见的项\n if (item.visible !== false) {\n this.element.appendChild(this.createItemElement(item));\n }\n });\n });\n }\n\n /**\n * 创建单个菜单项的 DOM 元素\n */\n private createItemElement(item: MenuItemConfig): HTMLElement {\n const li = document.createElement('li');\n // 根据状态设置样式类\n const isEnabled = !item.disabled;\n li.className = `bim-menu-item ${isEnabled ? '' : 'disabled'}`;\n\n // 1. 图标区域 (Icon Slot)\n const iconDiv = document.createElement('div');\n iconDiv.className = 'bim-menu-item-icon';\n if (item.icon) {\n iconDiv.innerHTML = item.icon;\n }\n li.appendChild(iconDiv);\n\n // 2. 文本区域 (Label Slot)\n const labelDiv = document.createElement('div');\n labelDiv.className = 'bim-menu-item-label';\n // 获取翻译后的文本\n labelDiv.textContent = t(item.label);\n li.appendChild(labelDiv);\n\n // 3. 子菜单指示器 (Arrow Slot)\n const children = item.children;\n const hasChildren = children && children.length > 0;\n\n if (hasChildren) {\n const arrowDiv = document.createElement('div');\n arrowDiv.className = 'bim-menu-item-arrow';\n // 简单的右箭头 SVG\n arrowDiv.innerHTML = '';\n li.appendChild(arrowDiv);\n\n // 绑定子菜单交互事件\n // 鼠标移入:打开子菜单\n li.addEventListener('mouseenter', () => this.openSubMenu(item, li));\n } else {\n // 鼠标移入普通项:关闭当前已打开的子菜单\n li.addEventListener('mouseenter', () => this.closeSubMenu());\n }\n\n // 4. 绑定点击事件\n if (isEnabled) {\n // Debug Log: 检查是否绑定了事件\n // console.log(`[BimMenu] Binding click for ${item.id}, hasChildren: ${hasChildren}, hasOnClick: ${!!item.onClick}`);\n \n li.addEventListener('click', (e) => {\n e.stopPropagation(); // 防止冒泡\n console.log(`[BimMenu] Clicked item: ${item.id}`);\n \n // 如果是叶子节点(没有子菜单),则触发点击动作\n if (!hasChildren) {\n if (item.onClick) {\n console.log(`[BimMenu] Executing onClick for ${item.id}`);\n item.onClick();\n } else {\n console.warn(`[BimMenu] No onClick handler for ${item.id}`);\n }\n }\n });\n }\n\n return li;\n }\n\n /**\n * 打开子菜单\n * @param item 当前菜单项\n * @param parentLi 触发的 DOM 元素(用于定位)\n */\n private openSubMenu(item: MenuItemConfig, parentLi: HTMLElement): void {\n const children = item.children;\n if (!children || children.length === 0) return;\n\n // 如果当前已经打开了子菜单,先关闭它\n this.closeSubMenu();\n\n // 创建子菜单容器 (模拟一个临时的悬浮层)\n const container = document.createElement('div');\n container.style.position = 'fixed';\n container.style.zIndex = '10001'; // 确保比父菜单层级高\n\n // 初步计算位置:位于父项右侧\n const rect = parentLi.getBoundingClientRect();\n container.style.top = `${rect.top}px`;\n container.style.left = `${rect.right}px`;\n\n // 关键修复:阻止 mousedown 冒泡\n // 防止点击子菜单时触发 BimRightKey 的全局关闭逻辑(因为它认为点击发生在主菜单外部)\n container.addEventListener('mousedown', (e) => e.stopPropagation());\n\n // 递归创建新的 BimMenu 实例\n const subMenu = new BimMenu({ items: children });\n subMenu.init();\n container.appendChild(subMenu.element);\n document.body.appendChild(container);\n\n // 保存引用以便后续清理\n this.activeSubMenu = { menu: subMenu, container };\n\n // 边界检测:如果超出屏幕右侧,则向左展开\n const subRect = container.getBoundingClientRect();\n if (subRect.right > window.innerWidth) {\n container.style.left = `${rect.left - subRect.width}px`;\n }\n // TODO: 垂直方向边界检测\n }\n\n /**\n * 关闭当前激活的子菜单\n */\n private closeSubMenu(): void {\n if (this.activeSubMenu) {\n this.activeSubMenu.menu.destroy();\n this.activeSubMenu.container.remove();\n this.activeSubMenu = null;\n }\n }\n}\n\n\n","/**\n * 右键菜单管理器\n * 负责管理右键上下文菜单的显示和交互\n */\nimport { BaseManager } from '../core/base-manager';\nimport { BimRightKey } from '../components/right-key';\nimport { BimMenu } from '../components/menu';\nimport { MenuItemConfig } from '../components/menu/item';\n\n/**\n * 右键菜单管理器\n * 支持注册多个上下文处理器,动态生成右键菜单\n */\nexport class RightKeyManager extends BaseManager {\n /** 容器元素 */\n private container: HTMLElement;\n /** 右键面板实例 */\n private rightKeyPanel: BimRightKey;\n /** 上下文处理器列表 */\n private contextHandlers: Array<(e: MouseEvent) => MenuItemConfig[] | null> = [];\n\n constructor(container: HTMLElement) {\n super();\n this.container = container;\n\n this.rightKeyPanel = new BimRightKey({\n zIndex: 9000,\n container: this.container,\n onContext: this.handleContextMenu\n });\n this.rightKeyPanel.init();\n }\n\n /** 销毁管理器 */\n public destroy(): void {\n this.rightKeyPanel.destroy();\n super.destroy();\n }\n\n /**\n * 注册上下文处理器\n * @param handler 处理器函数,返回菜单项配置\n */\n public registerHandler(handler: (e: MouseEvent) => MenuItemConfig[] | null): void {\n this.contextHandlers.push(handler);\n }\n\n /**\n * 显示菜单\n * @param x 横坐标\n * @param y 纵坐标\n * @param items 菜单项配置\n * @param groupOrder 分组顺序\n */\n public showMenu(x: number, y: number, items: MenuItemConfig[], groupOrder?: string[]): void {\n if (!items || items.length === 0) return;\n\n const menu = new BimMenu({ items, groupOrder });\n menu.init();\n\n this.rightKeyPanel.mount(menu);\n this.rightKeyPanel.show(x, y);\n }\n\n /** 隐藏菜单 */\n public hide(): void {\n this.rightKeyPanel.hide();\n }\n\n /** 处理右键点击事件 */\n private handleContextMenu = (e: MouseEvent): void => {\n let items: MenuItemConfig[] | null = null;\n for (const handler of this.contextHandlers) {\n const result = handler(e);\n if (result && result.length > 0) {\n if (!items) items = [];\n items = items.concat(result);\n }\n }\n\n if (items && items.length > 0) {\n this.showMenu(e.clientX, e.clientY, items);\n } else {\n this.hide();\n }\n };\n}\n","import { MenuItemConfig } from '../item';\nimport { ManagerRegistry } from '../../../core/manager-registry';\n\nexport const infoMenuButton = (): MenuItemConfig => {\n return {\n id: 'infoMenu',\n label: 'menu.info',\n group: 'info',\n icon: '',\n onClick: () => {\n console.log('dianjile');\n const registry = ManagerRegistry.getInstance();\n registry.dialog?.showInfoDialog();\n registry.engine3d?.rightKey?.hide();\n }\n };\n};\n","import { MenuItemConfig } from '../item';\nimport { ManagerRegistry } from '../../../core/manager-registry';\n\nexport const secondMenuButton = (): MenuItemConfig => {\n return {\n id: 'infoMenu',\n label: 'menu.info',\n icon: '',\n onClick: () => {\n console.log('dianjile');\n const registry = ManagerRegistry.getInstance();\n registry.dialog?.showInfoDialog();\n registry.engine3d?.rightKey?.hide();\n }\n };\n};\n","import { MenuItemConfig } from '../item';\nimport { ManagerRegistry } from '../../../core/manager-registry';\n\nexport const fourMenuButton = (): MenuItemConfig => {\n return {\n id: 'fourMenu',\n label: 'menu.info',\n icon: '',\n onClick: () => {\n console.log('dianjile');\n const registry = ManagerRegistry.getInstance();\n registry.dialog?.showInfoDialog();\n registry.engine3d?.rightKey?.hide();\n }\n };\n};\n","import { MenuItemConfig } from '../item';\nimport { ManagerRegistry } from '../../../core/manager-registry';\nimport { secondMenuButton } from './second';\nimport { fourMenuButton } from './four';\n\nexport const homeMenuButton = (): MenuItemConfig => {\n return {\n id: 'homeMenu',\n label: 'menu.home',\n group: 'home',\n children: [secondMenuButton(), fourMenuButton()],\n icon: '',\n onClick: () => {\n const registry = ManagerRegistry.getInstance();\n registry.dialog?.showInfoDialog();\n registry.engine3d?.rightKey?.hide();\n }\n };\n};\n","/**\n * 3D 引擎管理器\n * 负责管理 3D 渲染引擎的初始化、模型加载和测量功能\n */\nimport { Engine, type EngineOptions, type ModelLoadOptions } from '../components/engine';\nimport { BaseManager } from '../core/base-manager';\nimport { RightKeyManager } from './right-key-manager';\nimport { infoMenuButton } from '../components/menu/buttons/info';\nimport { homeMenuButton } from '../components/menu/buttons/home';\nimport type { MeasureMode } from '../types/measure';\nimport type { SectionBoxRange } from '../components/section-box-panel/types';\n\n/**\n * 3D 引擎管理器\n * 封装底层 3D 引擎,提供模型加载、相机控制、测量等功能\n */\nexport class EngineManager extends BaseManager {\n /** 容器元素 */\n private container: HTMLElement;\n /** 引擎实例 */\n private engineInstance: Engine | null = null;\n /** 右键菜单管理器 */\n public rightKey: RightKeyManager | null = null;\n\n constructor(container: HTMLElement) {\n super();\n this.container = container;\n }\n\n /**\n * 初始化 3D 引擎\n * @param options 引擎配置选项\n * @returns 是否初始化成功\n */\n public initialize(options?: Omit): boolean {\n if (this.engineInstance && this.engineInstance.isInitialized()) {\n console.warn('[EngineManager] 3D Engine already initialized. Destroying old instance...');\n this.engineInstance.destroy();\n this.engineInstance = null;\n }\n\n try {\n this.engineInstance = new Engine({\n container: this.container,\n ...options,\n });\n\n this.engineInstance.init();\n\n this.rightKey = new RightKeyManager(this.container);\n\n this.rightKey.registerHandler((_e) => {\n return [\n infoMenuButton(),\n homeMenuButton()\n ];\n });\n\n return this.engineInstance.isInitialized();\n } catch (error) {\n console.error('[EngineManager] Failed to initialize 3D engine:', error);\n this.engineInstance = null;\n return false;\n }\n }\n\n /**\n * 检查引擎是否已初始化\n * @returns 是否已初始化\n */\n public isInitialized(): boolean {\n return this.engineInstance !== null && this.engineInstance.isInitialized();\n }\n\n /**\n * 加载模型\n * @param url 模型 URL\n * @param options 加载选项\n */\n public loadModel(url: string, options?: ModelLoadOptions): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.loadModel(url, options);\n }\n\n /**\n * 获取底层引擎实例\n * @returns 引擎实例\n */\n public getEngine(): any {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return null;\n }\n return this.engineInstance.getEngine();\n }\n\n /** 相机回到初始位置 */\n public CameraGoHome(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.CameraGoHome();\n }\n\n /** 暂停渲染 */\n public pauseRendering(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.pauseRendering();\n }\n\n /** 恢复渲染 */\n public resumeRendering(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.resumeRendering();\n }\n\n /**\n * 激活测量模式\n * @param mode 测量模式\n */\n public activateMeasure(mode: MeasureMode): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.activateMeasure(mode);\n }\n\n /** 停用测量模式 */\n public deactivateMeasure(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.deactivateMeasure();\n }\n\n /**\n * 获取当前测量类型\n * @returns 当前测量模式\n */\n public getCurrentMeasureType(): MeasureMode | null {\n if (!this.engineInstance) {\n return null;\n }\n return this.engineInstance.getCurrentMeasureType();\n }\n\n /** 清除所有测量标注 */\n public clearAllMeasures(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.clearAllMeasures();\n }\n\n /**\n * 激活轴向剖切\n * @param axis 要激活的轴向 ('x' | 'y' | 'z')\n */\n public activateSectionAxis(axis: 'x' | 'y' | 'z'): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.activateSectionAxis(axis);\n }\n\n /**\n * 停用轴向剖切\n */\n public deactivateSectionAxis(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.deactivateSectionAxis();\n }\n\n /**\n * 获取当前剖切轴向\n * @returns 当前激活的轴向\n */\n public getCurrentSectionAxis(): 'x' | 'y' | 'z' | null {\n if (!this.engineInstance) {\n return null;\n }\n return this.engineInstance.getCurrentSectionAxis();\n }\n\n /** 激活剖切盒 */\n public activateSectionBox(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.activateSectionBox();\n }\n\n /** 停用剖切盒 */\n public deactivateSectionBox(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.deactivateSectionBox();\n }\n\n /** 设置剖切盒范围(百分比 0-100) */\n public setSectionBoxRange(range: SectionBoxRange): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.setSectionBoxRange(range);\n }\n\n /** 适应剖切盒到模型 */\n public fitSectionBoxToModel(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.fitSectionBoxToModel();\n }\n\n /** 重置剖切盒 */\n public resetSectionBox(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.resetSectionBox();\n }\n\n /** 激活框选放大功能 */\n public activateZoomBox(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.activateZoomBox();\n }\n\n // ==================== 漫游功能 ====================\n\n /** 激活第一人称漫游模式 */\n public activateFirstPersonMode(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.activateFirstPersonMode();\n }\n\n /** 停用第一人称漫游模式 */\n public deactivateFirstPersonMode(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.deactivateFirstPersonMode();\n }\n\n /**\n * 设置漫游移动速度\n * @param speed 移动速度\n */\n public setWalkSpeed(speed: number): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.setWalkSpeed(speed);\n }\n\n /**\n * 设置漫游重力开关\n * @param enabled 是否启用重力\n */\n public setWalkGravity(enabled: boolean): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.setWalkGravity(enabled);\n }\n\n /**\n * 设置漫游碰撞检测开关\n * @param enabled 是否启用碰撞检测\n */\n public setWalkCollision(enabled: boolean): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.setWalkCollision(enabled);\n }\n\n /**\n * 获取漫游模式是否激活\n * @returns 是否处于漫游模式\n */\n public isFirstPersonModeActive(): boolean {\n if (!this.engineInstance) {\n return false;\n }\n return this.engineInstance.isFirstPersonModeActive();\n }\n\n // ==================== 结束:漫游功能 ====================\n\n /** 销毁引擎管理器 */\n public destroy(): void {\n if (this.engineInstance) {\n this.engineInstance.destroy();\n this.engineInstance = null;\n }\n if (this.rightKey) {\n this.rightKey.destroy();\n this.rightKey = null;\n }\n super.destroy();\n }\n}\n","import type { BimTreeNode } from './tree-node';\n\n/**\n * 节点勾选状态枚举\n */\nexport enum TreeNodeCheckState {\n Unchecked = 0,\n Checked = 1,\n Indeterminate = 2 // 半选\n}\n\n/**\n * 节点点击行为类型\n */\nexport type NodeClickAction = 'select' | 'expand';\n\n/**\n * 树节点配置接口\n */\nexport interface TreeNodeConfig {\n /** 唯一标识符 */\n id: string;\n\n /** 显示文本的翻译键 */\n label: string;\n\n /** 节点图标 (SVG string 或 URL) */\n icon?: string;\n\n /** 子节点列表 */\n children?: TreeNodeConfig[];\n\n /** 初始展开状态 (默认 false) */\n expanded?: boolean;\n\n /** 初始选中状态 (默认 false) */\n checked?: boolean;\n\n /** 是否禁用 (默认 false) */\n disabled?: boolean;\n\n /** 自定义业务数据 */\n data?: any;\n\n /** 是否是叶子节点 (用于异步加载场景,暂留接口) */\n isLeaf?: boolean;\n\n /** 点击整行的行为 (默认 'select') */\n clickAction?: NodeClickAction;\n}\n\n/**\n * 树组件配置选项\n */\nexport interface TreeOptions {\n /** 树的数据源 */\n data: TreeNodeConfig[];\n\n /** 是否显示复选框 (默认 true) */\n checkable?: boolean;\n\n /** \n * 父子节点选中状态是否关联 (默认 true)\n * true: 选中父选子,子全选自动选父\n * false: 独立选中\n */\n checkStrictly?: boolean;\n\n /** 默认展开所有节点 (默认 false) */\n defaultExpandAll?: boolean;\n\n /** 缩进宽度 (像素,默认 24) */\n indent?: number;\n\n /** 是否启用搜索功能 (默认 false) */\n enableSearch?: boolean;\n\n /** 搜索框占位符 */\n searchPlaceholder?: string;\n\n /** 节点勾选回调 */\n onNodeCheck?: (node: BimTreeNode) => void;\n\n /** 节点选择回调 */\n onNodeSelect?: (node: BimTreeNode) => void;\n\n /** 节点展开/折叠回调 */\n onNodeExpand?: (node: BimTreeNode) => void;\n\n /** \n * 选中时显示的自定义操作栏渲染函数 \n * 返回 HTML 字符串或 HTMLElement\n */\n renderActions?: (node: TreeNodeConfig) => HTMLElement | string;\n}","import { TreeNodeConfig, TreeNodeCheckState, TreeOptions } from './types';\n/**\n * 树节点类\n * 负责渲染单个节点、处理交互和递归\n */\nexport class BimTreeNode {\n public config: TreeNodeConfig;\n public element: HTMLElement;\n public children: BimTreeNode[] = [];\n public parent: BimTreeNode | null = null;\n public checkState: TreeNodeCheckState = TreeNodeCheckState.Unchecked;\n\n // UI Elements\n private contentEl!: HTMLElement;\n private switcherEl!: HTMLElement;\n private checkboxEl: HTMLElement | null = null;\n private titleEl!: HTMLElement;\n private actionsEl!: HTMLElement; // 操作栏容器\n private childrenContainer!: HTMLElement;\n // 外部回调\n private onExpandChange: (node: BimTreeNode) => void;\n private onCheckChange: (node: BimTreeNode) => void;\n private onNodeClick: (node: BimTreeNode) => void;\n private renderActions?: (node: TreeNodeConfig) => HTMLElement | string;\n \n constructor(\n config: TreeNodeConfig, \n options: TreeOptions,\n callbacks: {\n onExpand: (n: BimTreeNode) => void,\n onCheck: (n: BimTreeNode) => void,\n onClick: (n: BimTreeNode) => void\n }\n ) {\n this.config = config;\n this.onExpandChange = callbacks.onExpand;\n this.onCheckChange = callbacks.onCheck;\n this.onNodeClick = callbacks.onClick;\n this.renderActions = options.renderActions;\n \n // 初始化状态\n this.checkState = config.checked ? TreeNodeCheckState.Checked : TreeNodeCheckState.Unchecked;\n \n this.element = this.createDom(options);\n }\n /**\n * 创建节点 DOM\n */\n private createDom(options: TreeOptions): HTMLElement {\n const nodeEl = document.createElement('div');\n nodeEl.className = 'bim-tree-node';\n if (this.config.disabled) nodeEl.classList.add('is-disabled');\n\n // 1. 内容行\n this.contentEl = document.createElement('div');\n this.contentEl.className = 'bim-tree-node-content';\n\n // 1.1 展开/折叠箭头\n this.switcherEl = document.createElement('span');\n this.switcherEl.className = 'bim-tree-switcher';\n // 默认右箭头 SVG\n this.switcherEl.innerHTML = ``;\n\n const hasChildren = this.config.children && this.config.children.length > 0;\n if (!hasChildren) {\n this.switcherEl.classList.add('is-hidden');\n } else if (this.config.expanded) {\n this.switcherEl.classList.add('is-expanded');\n }\n\n this.switcherEl.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleExpand();\n });\n\n this.contentEl.appendChild(this.switcherEl);\n\n // 1.2 复选框 (可选)\n if (options.checkable !== false) {\n this.checkboxEl = document.createElement('span');\n this.checkboxEl.className = 'bim-tree-checkbox';\n this.updateCheckboxUI();\n\n this.checkboxEl.addEventListener('click', (e) => {\n e.stopPropagation();\n if (this.config.disabled) return;\n this.toggleCheck();\n });\n this.contentEl.appendChild(this.checkboxEl);\n }\n\n // 1.3 图标 (可选)\n if (this.config.icon) {\n const iconEl = document.createElement('span');\n iconEl.className = 'bim-tree-icon';\n iconEl.innerHTML = this.config.icon.includes('`;\n this.contentEl.appendChild(iconEl);\n }\n\n // 1.4 文本\n this.titleEl = document.createElement('span');\n this.titleEl.className = 'bim-tree-title';\n this.updateLabel(); // 设置文本\n this.contentEl.appendChild(this.titleEl);\n\n // 1.5 操作栏 (Actions)\n this.actionsEl = document.createElement('div');\n this.actionsEl.className = 'bim-tree-node-actions';\n this.actionsEl.addEventListener('click', (e) => {\n e.stopPropagation(); // 防止点击操作栏触发选中/展开\n });\n this.contentEl.appendChild(this.actionsEl);\n\n // 绑定整行点击\n this.contentEl.addEventListener('click', (e) => {\n e.stopPropagation();\n if (this.config.disabled) return;\n\n const action = this.config.clickAction || 'select';\n\n if (action === 'expand') {\n this.toggleExpand();\n } else {\n this.onNodeClick(this);\n }\n });\n\n nodeEl.appendChild(this.contentEl);\n\n // 2. 子节点容器\n this.childrenContainer = document.createElement('div');\n this.childrenContainer.className = 'bim-tree-children';\n // 设置缩进\n const indent = options.indent || 24;\n this.childrenContainer.style.paddingLeft = `${indent}px`; // 每一级子器左移\n\n if (this.config.expanded && hasChildren) {\n this.childrenContainer.classList.add('is-visible');\n }\n nodeEl.appendChild(this.childrenContainer);\n\n return nodeEl;\n }\n\n /**\n * 设置高亮选中状态 (Select 模式下)\n */\n public setSelected(selected: boolean) {\n if (selected) {\n this.contentEl.classList.add('is-selected');\n // 渲染自定义操作栏\n if (this.renderActions) {\n const content = this.renderActions(this.config);\n this.actionsEl.innerHTML = '';\n if (typeof content === 'string') {\n this.actionsEl.innerHTML = content;\n } else if (content instanceof HTMLElement) {\n this.actionsEl.appendChild(content);\n }\n }\n } else {\n this.contentEl.classList.remove('is-selected');\n this.actionsEl.innerHTML = ''; // 清空内容\n }\n }\n\n /**\n * 更新显示文本 (国际化支持) -> 移除国际化,直接显示\n */\n public updateLabel() {\n if (this.titleEl) {\n this.titleEl.textContent = this.config.label;\n }\n }\n\n /**\n * 切换展开状态\n */\n public toggleExpand(force?: boolean) {\n if (!this.config.children || this.config.children.length === 0) return;\n\n const newState = force !== undefined ? force : !this.config.expanded;\n this.config.expanded = newState;\n\n if (newState) {\n this.switcherEl.classList.add('is-expanded');\n this.childrenContainer.classList.add('is-visible');\n } else {\n this.switcherEl.classList.remove('is-expanded');\n this.childrenContainer.classList.remove('is-visible');\n }\n\n // 触发回调\n if (force === undefined) { // 只有用户交互才触发回调,防止初始化时无限循环\n this.onExpandChange(this);\n }\n }\n\n /**\n * 切换选中状态 (用户点击)\n */\n public toggleCheck() {\n // 如果当前是半选,点击变全选;如果全选,点击未选;如果未选,点击变全选\n // 简化逻辑:只要不是 Checked,点击都变 Checked;如果是 Checked,变 Unchecked\n const newChecked = this.checkState !== TreeNodeCheckState.Checked;\n this.setChecked(newChecked ? TreeNodeCheckState.Checked : TreeNodeCheckState.Unchecked, true);\n }\n\n /**\n * 设置选中状态 (API调用或联动)\n * @param state 新状态\n * @param fireEvent 是否触发事件\n */\n public setChecked(state: TreeNodeCheckState, fireEvent: boolean = false) {\n if (this.checkState === state) return;\n\n this.checkState = state;\n this.config.checked = (state === TreeNodeCheckState.Checked);\n\n this.updateCheckboxUI();\n\n if (fireEvent) {\n this.onCheckChange(this);\n }\n }\n\n /**\n * 更新复选框 UI 样式\n */\n public updateCheckboxUI() {\n if (!this.checkboxEl) return;\n\n this.checkboxEl.classList.remove('is-checked', 'is-indeterminate');\n\n if (this.checkState === TreeNodeCheckState.Checked) {\n this.checkboxEl.classList.add('is-checked');\n } else if (this.checkState === TreeNodeCheckState.Indeterminate) {\n this.checkboxEl.classList.add('is-indeterminate');\n }\n }\n\n /**\n * 添加子节点实例\n */\n public appendChild(childNode: BimTreeNode) {\n childNode.parent = this;\n this.children.push(childNode);\n this.childrenContainer.appendChild(childNode.element);\n\n // 如果之前是隐藏的箭头,现在有了子节点,需要显示出来\n if (this.children.length === 1) {\n this.switcherEl.classList.remove('is-hidden');\n }\n }\n\n /**\n * 销毁\n */\n public destroy() {\n this.children.forEach(c => c.destroy());\n this.children = [];\n this.element.remove();\n this.parent = null;\n }\n}\n","import { IBimComponent } from '../../types/component';\nimport { ThemeConfig } from '../../themes/types';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport { TreeOptions, TreeNodeConfig, TreeNodeCheckState } from './types';\nimport { BimTreeNode } from './tree-node';\nimport './index.css';\n\n// 定义辅助事件发射器接口 (由于 BimTree 通常作为 Manager 的一部分或独立使用)\n// 为了方便,这里我们假设它会被 TreeManager 管理,TreeManager 会处理事件发射\n// 但 BimTree 本身也需要一个方式通知 Manager。\n// 我们可以通过构造函数传入 event bus 适配器,或者直接使用 CustomEvent。\n// 更好的方式:BimTree 提供 onEvent 回调。\n\nexport class BimTree implements IBimComponent {\n public element: HTMLElement;\n private contentElement: HTMLElement; // 树内容容器\n private searchInput: HTMLInputElement | null = null;\n private searchResults: HTMLElement | null = null;\n\n private options: TreeOptions;\n private nodeMap: Map = new Map();\n private rootNodes: BimTreeNode[] = [];\n private selectedNode: BimTreeNode | null = null; // 当前选中的高亮节点\n\n // 订阅清理函数\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n private clickOutsideHandler: ((e: MouseEvent) => void) | null = null;\n\n // 事件回调 (由 Manager 注入)\n public onNodeCheck?: (node: BimTreeNode) => void;\n public onNodeSelect?: (node: BimTreeNode) => void;\n public onNodeExpand?: (node: BimTreeNode) => void;\n\n constructor(options: TreeOptions) {\n this.options = {\n checkable: true,\n checkStrictly: true,\n indent: 24,\n defaultExpandAll: true,\n enableSearch: false,\n searchPlaceholder: 'tree.searchPlaceholder',\n ...options\n };\n \n // 主容器\n this.element = document.createElement('div');\n this.element.className = 'bim-tree';\n\n // 搜索区域\n if (this.options.enableSearch) {\n this.createSearchDOM();\n }\n\n // 内容容器\n this.contentElement = document.createElement('div');\n this.contentElement.className = 'bim-tree-content';\n this.element.appendChild(this.contentElement);\n\n // 初始化回调\n if (options.onNodeCheck) this.onNodeCheck = options.onNodeCheck;\n if (options.onNodeSelect) this.onNodeSelect = options.onNodeSelect;\n if (options.onNodeExpand) this.onNodeExpand = options.onNodeExpand;\n }\n\n private createSearchDOM() {\n const searchContainer = document.createElement('div');\n searchContainer.className = 'bim-tree-search';\n\n const wrapper = document.createElement('div');\n wrapper.className = 'bim-tree-search-wrapper';\n\n // 图标\n const icon = document.createElement('span');\n icon.className = 'bim-tree-search-icon';\n icon.innerHTML = ``;\n wrapper.appendChild(icon);\n\n this.searchInput = document.createElement('input');\n this.searchInput.className = 'bim-tree-search-input';\n this.searchInput.type = 'text';\n this.searchInput.placeholder = t(this.options.searchPlaceholder || '搜索...');\n\n // 绑定输入事件\n this.searchInput.addEventListener('input', (e) => {\n const query = (e.target as HTMLInputElement).value;\n this.handleSearch(query);\n });\n\n wrapper.appendChild(this.searchInput);\n searchContainer.appendChild(wrapper);\n\n // 搜索结果容器\n this.searchResults = document.createElement('div');\n this.searchResults.className = 'bim-tree-search-results';\n\n searchContainer.appendChild(this.searchResults);\n this.element.appendChild(searchContainer);\n\n // 点击外部关闭搜索结果\n this.clickOutsideHandler = (e: MouseEvent) => {\n if (this.searchResults &&\n !this.searchResults.contains(e.target as Node) &&\n !this.searchInput?.contains(e.target as Node)) {\n this.searchResults.classList.remove('is-visible');\n }\n };\n document.addEventListener('click', this.clickOutsideHandler);\n }\n\n public init(): void {\n this.render();\n\n // 订阅系统事件\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n // 初始化主题\n this.setTheme(themeManager.getTheme());\n }\n\n /**\n * 处理搜索逻辑\n */\n private handleSearch(query: string) {\n if (!this.searchResults) return;\n\n if (!query.trim()) {\n this.searchResults.classList.remove('is-visible');\n this.searchResults.innerHTML = '';\n return;\n }\n\n const results: { node: BimTreeNode, label: string, path: string }[] = [];\n const lowerQuery = query.toLowerCase();\n\n this.nodeMap.forEach(node => {\n // 直接使用 config.label,不进行翻译\n const label = node.config.label;\n if (label.toLowerCase().includes(lowerQuery)) {\n results.push({\n node,\n label,\n path: this.getNodePath(node)\n });\n }\n });\n\n this.renderSearchResults(results);\n }\n\n /**\n * 获取节点路径(面包屑)\n */\n private getNodePath(node: BimTreeNode): string {\n const path: string[] = [];\n let current: BimTreeNode | null = node.parent; // 从父级开始\n while (current) {\n // 直接使用 label\n path.unshift(current.config.label);\n current = current.parent;\n }\n return path.join(' > ');\n }\n\n /**\n * 渲染搜索结果列表\n */\n private renderSearchResults(results: { node: BimTreeNode, label: string, path: string }[]) {\n if (!this.searchResults) return;\n\n this.searchResults.innerHTML = '';\n if (results.length === 0) {\n const noData = document.createElement('div');\n noData.className = 'bim-tree-search-item';\n noData.style.cursor = 'default';\n noData.style.color = '#999';\n noData.textContent = 'No results';\n this.searchResults.appendChild(noData);\n } else {\n results.forEach(res => {\n const item = document.createElement('div');\n item.className = 'bim-tree-search-item';\n\n const title = document.createElement('span');\n title.className = 'bim-tree-search-item-title';\n title.textContent = res.label;\n\n const path = document.createElement('span');\n path.className = 'bim-tree-search-item-path';\n path.textContent = res.path;\n\n item.appendChild(title);\n if (res.path) item.appendChild(path);\n\n item.addEventListener('click', () => {\n this.revealNode(res.node);\n });\n\n this.searchResults!.appendChild(item);\n });\n }\n this.searchResults.classList.add('is-visible');\n }\n\n /**\n * 定位到指定节点\n */\n public revealNode(node: BimTreeNode) {\n // 1. 关闭搜索下拉\n if (this.searchResults) {\n this.searchResults.classList.remove('is-visible');\n if (this.searchInput) this.searchInput.value = ''; // 可选:清空搜索框\n }\n\n // 2. 递归展开父节点\n let current = node.parent;\n while (current) {\n current.toggleExpand(true); // 强制展开\n current = current.parent;\n }\n\n // 3. 选中节点 (Select)\n this.handleNodeSelect(node);\n\n // 4. 滚动到可视区域\n setTimeout(() => {\n node.element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }, 100);\n }\n\n /**\n * 设置主题\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-primary', theme.primary);\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-secondary', theme.textSecondary);\n style.setProperty('--bim-text-tertiary', theme.textTertiary);\n style.setProperty('--bim-text-disabled', theme.textDisabled);\n style.setProperty('--bim-text-inverse', theme.textInverse);\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-border-disabled', theme.borderDisabled);\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover);\n style.setProperty('--bim-component-bg-selected', theme.componentBgSelected);\n style.setProperty('--bim-component-bg-disabled', theme.componentBgDisabled);\n style.setProperty('--bim-shadow-md', theme.shadowMd);\n style.setProperty('--bim-focus-ring', theme.focusRing);\n }\n\n /**\n * 响应语言变更\n */\n public setLocales(): void {\n this.nodeMap.forEach(node => node.updateLabel());\n if (this.searchInput) {\n this.searchInput.placeholder = t(this.options.searchPlaceholder || 'tree.searchPlaceholder');\n }\n }\n\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n if (this.clickOutsideHandler) {\n document.removeEventListener('click', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n this.rootNodes.forEach(node => node.destroy());\n this.rootNodes = [];\n this.nodeMap.clear();\n this.element.remove();\n this.selectedNode = null;\n }\n\n /**\n * 核心渲染逻辑\n */\n private render(): void {\n this.contentElement.innerHTML = ''; // 清空内容区,而不是整个 element\n this.nodeMap.clear();\n this.rootNodes = [];\n\n this.options.data.forEach(config => {\n this.createNodeRecursively(config, null);\n });\n\n // 移除旧的 expandAll 调用,因为 expanded 状态已在 createNodeRecursively 中处理\n }\n\n /**\n * 递归创建节点\n */\n private createNodeRecursively(config: TreeNodeConfig, parent: BimTreeNode | null) {\n // 处理展开状态优先级: config.expanded > defaultExpandAll\n if (config.expanded === undefined) {\n config.expanded = this.options.defaultExpandAll;\n }\n\n const node = new BimTreeNode(config, this.options, {\n onExpand: (n) => { if (this.onNodeExpand) this.onNodeExpand(n); },\n onCheck: (n) => this.handleNodeCheck(n),\n onClick: (n) => this.handleNodeSelect(n)\n });\n\n this.nodeMap.set(config.id, node);\n\n if (parent) {\n parent.appendChild(node);\n } else {\n this.rootNodes.push(node);\n this.contentElement.appendChild(node.element); // 挂载到 contentElement\n }\n\n if (config.children && config.children.length > 0) {\n config.children.forEach(childConfig => {\n this.createNodeRecursively(childConfig, node);\n });\n }\n\n // 如果是初始化渲染,需要处理 checkStrictly 的向上联动(因为数据里可能只给了子节点 checked,父节点没给)\n // 这里做一个简单的后处理:如果 checkStrictly 开启,且当前节点 checked,则触发一次联动\n // 注意:这可能会导致性能问题,���化做法是在所有节点创建完后统一计算一次状态\n }\n\n /**\n * 处理节点选择 (高亮)\n */\n private handleNodeSelect(node: BimTreeNode) {\n // 如果之前有选中的,先取消选中\n if (this.selectedNode && this.selectedNode !== node) {\n this.selectedNode.setSelected(false);\n }\n\n // 设置当前为选中\n node.setSelected(true);\n this.selectedNode = node;\n\n // 触发外部回调\n if (this.onNodeSelect) this.onNodeSelect(node);\n }\n\n /**\n * 处理节点勾选逻辑 (核心算法)\n */\n private handleNodeCheck(node: BimTreeNode) {\n const isChecked = node.checkState === TreeNodeCheckState.Checked;\n\n // 1. 触发外部回调 (Event)\n if (this.onNodeCheck) this.onNodeCheck(node);\n\n // 2. 如果不联动,直接返回\n if (this.options.checkStrictly === false) return;\n\n // 3. 联动逻辑\n // 3.1 向下级联 (Cascade Down): 父变子全变\n const updateChildren = (n: BimTreeNode, state: TreeNodeCheckState) => {\n n.children.forEach(child => {\n if (child.config.disabled) return; // 跳过禁用节点\n child.setChecked(state, false); // 不再触发事件,只更新状态 UI\n updateChildren(child, state);\n });\n };\n\n // 当前节点是 Checked 或 Unchecked,子节点跟随\n if (isChecked) {\n updateChildren(node, TreeNodeCheckState.Checked);\n } else {\n updateChildren(node, TreeNodeCheckState.Unchecked);\n }\n\n // 3.2 向上冒泡 (Bubble Up): 子变父更新\n let current = node.parent;\n while (current) {\n if (current.config.disabled) {\n current = current.parent;\n continue;\n }\n\n const children = current.children;\n const allChecked = children.every(c => c.checkState === TreeNodeCheckState.Checked);\n const allUnchecked = children.every(c => c.checkState === TreeNodeCheckState.Unchecked);\n\n if (allChecked) {\n current.setChecked(TreeNodeCheckState.Checked, false);\n } else if (allUnchecked) {\n current.setChecked(TreeNodeCheckState.Unchecked, false);\n } else {\n current.setChecked(TreeNodeCheckState.Indeterminate, false);\n }\n\n current = current.parent;\n }\n }\n\n // ================== Public APIs ==================\n\n public getNode(id: string): BimTreeNode | undefined {\n return this.nodeMap.get(id);\n }\n\n public checkNode(id: string, checked: boolean) {\n const node = this.nodeMap.get(id);\n if (node) {\n node.setChecked(checked ? TreeNodeCheckState.Checked : TreeNodeCheckState.Unchecked, true);\n // 手动调用联动处理,因为 setChecked 的 fireEvent 只触发回调,不包含内部逻辑调用?\n // 不,我们在 createNodeRecursively 里绑定的 onCheck 就是 handleNodeCheck\n // 所以只要 fireEvent=true,就会触发 handleNodeCheck,进而触发联动。\n }\n }\n\n public expandAll(expanded: boolean) {\n this.nodeMap.forEach(node => node.toggleExpand(expanded));\n }\n\n public getCheckedNodes(includeHalfChecked: boolean = false): TreeNodeConfig[] {\n const result: TreeNodeConfig[] = [];\n this.nodeMap.forEach(node => {\n if (node.checkState === TreeNodeCheckState.Checked) {\n result.push(node.config);\n } else if (includeHalfChecked && node.checkState === TreeNodeCheckState.Indeterminate) {\n result.push(node.config);\n }\n });\n return result;\n }\n}\n","import { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { ThemeConfig } from '../../themes/types';\nimport type { TabItem, TabOptions } from './index.type';\nimport './index.css';\n\n/**\n * 简单标签页组件(固定标签,不支持运行时增删)\n * - 仅处理标签头部与内容切换\n * - 主题从 ThemeManager 获取,不在配置中传入\n * - 文案通过 t() 翻译,支持传原文直接展示\n */\nexport class BimTab implements IBimComponent {\n /** 组件根节点 */\n public element: HTMLElement;\n /** 头部容器 */\n private navElement: HTMLElement;\n /** 内容容器 */\n private contentElement: HTMLElement;\n /** 业务配置 */\n private options: TabOptions;\n /** 当前激活的标签 id */\n private activeId: string | null;\n /** id -> TabItem */\n private tabMap: Map = new Map();\n /** id -> 内容容器 */\n private panelMap: Map = new Map();\n /** 主题/语言订阅解除函数 */\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n /** 头部点击事件处理引用(便于销毁时解绑) */\n private navClickHandler: ((e: MouseEvent) => void) | null = null;\n\n constructor(options: TabOptions) {\n this.options = options;\n this.activeId = options.activeId || (options.tabs[0]?.id ?? null);\n\n // 预置 tabMap,方便后续查找\n options.tabs.forEach((tab) => this.tabMap.set(tab.id, tab));\n\n // 构建基础 DOM 结构\n this.element = document.createElement('div');\n this.element.className = 'bim-tab';\n\n this.navElement = document.createElement('div');\n this.navElement.className = 'bim-tab__nav';\n this.navElement.setAttribute('role', 'tablist');\n this.element.appendChild(this.navElement);\n\n this.contentElement = document.createElement('div');\n this.contentElement.className = 'bim-tab__content';\n this.element.appendChild(this.contentElement);\n\n // 挂载到容器\n this.options.container.appendChild(this.element);\n }\n\n /**\n * 初始化组件\n */\n public init(): void {\n this.renderNav();\n this.renderPanels();\n // 初始化文案与主题\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n\n // 订阅语言、主题变化\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n }\n\n /**\n * 渲染头部标签\n */\n private renderNav(): void {\n this.navElement.innerHTML = '';\n\n this.navClickHandler = (event: MouseEvent) => {\n const target = (event.target as HTMLElement).closest('.bim-tab__item');\n if (!target) return;\n const tabId = target.dataset.id;\n if (!tabId) return;\n const tab = this.tabMap.get(tabId);\n if (tab?.disabled) return;\n this.activateTab(tabId);\n };\n this.navElement.addEventListener('click', this.navClickHandler);\n\n this.options.tabs.forEach((tab) => {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'bim-tab__item';\n btn.dataset.id = tab.id;\n btn.setAttribute('role', 'tab');\n btn.id = `tab-${tab.id}`;\n btn.setAttribute('aria-selected', `${tab.id === this.activeId}`);\n if (tab.disabled) {\n btn.disabled = true;\n btn.setAttribute('aria-disabled', 'true');\n btn.classList.add('is-disabled');\n }\n\n // 图标\n if (tab.icon) {\n const iconEl = document.createElement('span');\n iconEl.className = 'bim-tab__icon';\n iconEl.innerHTML = tab.icon;\n btn.appendChild(iconEl);\n }\n\n const titleEl = document.createElement('span');\n titleEl.className = 'bim-tab__title';\n titleEl.textContent = this.resolveTitle(tab.title);\n btn.appendChild(titleEl);\n\n if (tab.id === this.activeId) {\n btn.classList.add('is-active');\n }\n\n this.navElement.appendChild(btn);\n });\n }\n\n /**\n * 渲染内容面板\n */\n private renderPanels(): void {\n this.contentElement.innerHTML = '';\n this.panelMap.clear();\n\n this.options.tabs.forEach((tab) => {\n const panel = document.createElement('div');\n panel.className = 'bim-tab__panel';\n panel.dataset.id = tab.id;\n panel.setAttribute('role', 'tabpanel');\n panel.setAttribute('aria-labelledby', `tab-${tab.id}`);\n\n if (tab.content instanceof HTMLElement) {\n panel.appendChild(tab.content);\n } else if (typeof tab.content === 'string') {\n panel.innerHTML = tab.content;\n }\n\n if (tab.id === this.activeId) {\n panel.classList.add('is-active');\n } else {\n panel.style.display = 'none';\n }\n\n this.panelMap.set(tab.id, panel);\n this.contentElement.appendChild(panel);\n });\n }\n\n /**\n * 激活指定标签\n * @param tabId 目标标签 id\n */\n public activateTab(tabId: string): void {\n if (this.activeId === tabId) return;\n const targetTab = this.tabMap.get(tabId);\n if (!targetTab || targetTab.disabled) return;\n\n this.activeId = tabId;\n // 更新头部状态\n const buttons = this.navElement.querySelectorAll('.bim-tab__item');\n buttons.forEach((btn) => {\n const isActive = btn.dataset.id === tabId;\n btn.classList.toggle('is-active', isActive);\n btn.setAttribute('aria-selected', `${isActive}`);\n });\n\n // 更新面板显示\n this.panelMap.forEach((panel, id) => {\n const isActive = id === tabId;\n panel.classList.toggle('is-active', isActive);\n panel.style.display = isActive ? 'block' : 'none';\n });\n\n if (this.options.onChange) {\n this.options.onChange(tabId, targetTab);\n }\n }\n\n /**\n * 应用主题\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-tab-bg', theme.bgElevated);\n style.setProperty('--bim-tab-nav-bg', theme.bgElevated);\n style.setProperty('--bim-tab-text', theme.textPrimary);\n style.setProperty('--bim-tab-text-secondary', theme.textSecondary);\n style.setProperty('--bim-tab-text-active', theme.primary);\n style.setProperty('--bim-tab-border', theme.borderDefault);\n style.setProperty('--bim-tab-hover-bg', theme.componentBgHover);\n style.setProperty('--bim-tab-active-bg', theme.componentBgActive);\n style.setProperty('--bim-tab-icon', theme.iconDefault);\n }\n\n /**\n * 应用当前语言文案\n */\n public setLocales(): void {\n const buttons = this.navElement.querySelectorAll('.bim-tab__item');\n buttons.forEach((btn) => {\n const id = btn.dataset.id;\n if (!id) return;\n const tab = this.tabMap.get(id);\n if (!tab) return;\n const titleEl = btn.querySelector('.bim-tab__title');\n if (titleEl) {\n titleEl.textContent = this.resolveTitle(tab.title);\n }\n });\n }\n\n /**\n * 清理资源\n */\n public destroy(): void {\n if (this.navClickHandler) {\n this.navElement.removeEventListener('click', this.navClickHandler);\n this.navClickHandler = null;\n }\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.panelMap.clear();\n this.tabMap.clear();\n this.element.remove();\n }\n\n /**\n * 工具:解析标题(优先翻译,不存在则回退原值)\n */\n private resolveTitle(title: string): string {\n try {\n const translated = t(title);\n return translated || title;\n } catch (err) {\n // 翻译失败时使用原值\n return title;\n }\n }\n}\n\n","/**\n * 图标管理器\n * 统一管理所有 SVG 图标\n */\n\n/**\n * 所有图标集合(静态变量)\n */\nconst ICONS: Record = {\n // ========== 来自 assets 的图标 (48x48) ==========\n 测量: '',\n 地图: '',\n 框选放大: '',\n 漫游: '',\n 目录树: '',\n 剖切: '',\n 剖切盒: '',\n 全屏: '',\n 设置: '',\n 拾曲面剖切: '',\n 轴向剖切: '',\n 主视角: '',\n 文档: '',\n 第一人称漫游: '',\n 反向: '',\n 路径漫游: '',\n 适应到模型: '',\n 隐藏: '',\n 重置: '',\n\n // ========== 测量相关图标 (32x32) ==========\n 标高: '',\n 距离: '',\n 最小距离: '',\n 激光边距: '',\n 角度: '',\n 坡度: '',\n 体积: '',\n 空间体积: '',\n\n // ========== 通用图标 (24x24) ==========\n close: '',\n check: '',\n warning: '',\n error: '',\n success: '',\n plus: '',\n minus: '',\n arrowUp: '',\n arrowDown: '',\n arrowLeft: '',\n arrowRight: '',\n search: '',\n refresh: '',\n delete: '',\n edit: '',\n save: '',\n expand: '',\n collapse: '',\n\n // ========== 默认图标 ==========\n default: '',\n};\n\n/**\n * 获取图标\n * @param name 图标名称\n * @returns SVG 字符串,如果找不到返回默认图标\n */\nexport function getIcon(name: string): string {\n const icon = ICONS[name];\n\n if (!icon) {\n console.warn(`[IconManager] Icon \"${name}\" not found, using default icon`);\n return ICONS.default;\n }\n\n return icon;\n}\n","/**\n * 构件树管理器\n * 负责管理构件树按钮和构件树对话框\n */\nimport type { ButtonGroupColors, ButtonConfig } from '../components/button-group/index.type';\nimport { BaseManager } from '../core/base-manager';\nimport { BimButtonGroup } from '../components/button-group';\nimport { BimTree } from '../components/tree';\nimport { TreeNodeConfig } from '../components/tree/types';\nimport { BimDialog } from '../components/dialog';\nimport { BimTab } from '../components/tab';\nimport { getIcon } from '../utils/icon-manager';\n\n/** 模拟的构件树数据 */\nconst MOCK_STRUCT_DATA: TreeNodeConfig[] = [\n {\n id: 'root',\n label: '全部构件',\n expanded: true,\n clickAction: 'expand',\n children: [\n {\n id: 'level-1',\n label: '一层',\n expanded: false,\n icon: '',\n clickAction: 'expand',\n children: [\n { id: 'l1-wall', label: '墙体(128)' },\n { id: 'l1-column', label: '柱(46)' },\n { id: 'l1-beam', label: '梁(82)' },\n { id: 'l1-slab', label: '楼板(12)' },\n { id: 'l1-door', label: '门(24)' },\n { id: 'l1-window', label: '窗(36)' }\n ]\n },\n {\n id: 'level-2',\n label: '二层',\n expanded: false,\n clickAction: 'expand',\n children: [\n { id: 'l2-wall', label: '墙体(141)' },\n { id: 'l2-column', label: '柱(52)' },\n { id: 'l2-beam', label: '梁(90)' },\n { id: 'l2-slab', label: '楼板(12)' },\n { id: 'l2-door', label: '门(18)' },\n { id: 'l2-window', label: '窗(40)' }\n ]\n },\n {\n id: 'level-3',\n label: '三层',\n expanded: false,\n clickAction: 'expand',\n children: [\n { id: 'l3-wall', label: '墙体(136)' },\n { id: 'l3-column', label: '柱(48)' },\n { id: 'l3-beam', label: '梁(88)' },\n { id: 'l3-slab', label: '楼板(12)' },\n { id: 'l3-door', label: '门(16)' },\n { id: 'l3-window', label: '窗(38)' }\n ]\n },\n {\n id: 'level-roof',\n label: '屋面层',\n expanded: false,\n clickAction: 'expand',\n children: [\n { id: 'rf-slab', label: '屋面板(6)' },\n { id: 'rf-beam', label: '屋面梁(24)' },\n { id: 'rf-parapet', label: '女儿墙(18)' }\n ]\n }\n ]\n }\n];\n\n/**\n * 构件树管理器\n * 管理左上角的构件树按钮和对话框\n */\nexport class ConstructTreeManagerBtn extends BaseManager {\n /** 按钮组实例 */\n private toolbar: BimButtonGroup | null = null;\n /** 按钮容器元素 */\n private toolbarContainer: HTMLElement | null = null;\n /** 主容器元素 */\n private container: HTMLElement;\n /** 构件树对话框实例 */\n private dialog: BimDialog | null = null;\n\n constructor(container: HTMLElement) {\n super();\n this.container = container;\n this.init();\n }\n\n /** 初始化按钮 */\n private init() {\n this.toolbarContainer = document.createElement('div');\n this.toolbarContainer.id = 'bim-construct-tree';\n this.container.appendChild(this.toolbarContainer);\n this.toolbar = new BimButtonGroup({\n container: this.toolbarContainer,\n showLabel: false,\n direction: 'column',\n position: 'top-left',\n align: 'vertical',\n expand: 'up'\n });\n this.toolbar.init();\n this.toolbar.addGroup('construct-tree');\n this.toolbar.addButton({\n id: 'construct-tree-btn',\n groupId: 'construct-tree',\n type: 'button',\n label: 'construct-tree',\n icon: getIcon('目录树'),\n onClick: () => {\n this.openConstructTreeDialog();\n }\n });\n this.toolbar.render();\n }\n\n /** 打开构件树对话框 */\n public openConstructTreeDialog() {\n this.setVisible(false);\n\n const tree = new BimTree({\n data: MOCK_STRUCT_DATA,\n checkable: true,\n indent: 0,\n enableSearch: true,\n checkStrictly: true,\n defaultExpandAll: true,\n renderActions: (_node) => {\n return '';\n },\n onNodeCheck: (node) => {\n console.log('onNodeCheck', node);\n },\n onNodeSelect: (node) => {\n console.log('onNodeSelect', node);\n },\n onNodeExpand: (node) => {\n console.log('onNodeExpand', node);\n this.dialog?.fitWidth();\n },\n });\n tree.init();\n\n const systemPlaceholder = document.createElement('div');\n systemPlaceholder.className = 'construct-tab__panel-content';\n const spacePlaceholder = document.createElement('div');\n spacePlaceholder.className = 'construct-tab__panel-content';\n\n const componentPanel = document.createElement('div');\n componentPanel.className = 'construct-tab__panel-content';\n componentPanel.appendChild(tree.element);\n\n const tabMount = document.createElement('div');\n tabMount.className = 'construct-tab__container';\n tabMount.style.height = '100%';\n tabMount.style.overflow = 'hidden';\n const tab = new BimTab({\n container: tabMount,\n tabs: [\n { id: 'component', title: 'tab.component', content: componentPanel },\n { id: 'system', title: 'tab.system', content: systemPlaceholder },\n { id: 'space', title: 'tab.space', content: spacePlaceholder },\n ],\n activeId: 'component',\n onChange: () => {\n this.dialog?.fitWidth();\n }\n });\n tab.init();\n\n this.dialog = this.registry.dialog!.create({\n title: 'constructTree.title',\n minWidth: 320,\n height: 420,\n content: tabMount,\n position: { x: 20, y: 20 },\n resizable: false,\n onClose: () => {\n tab.destroy();\n tree.destroy();\n this.setVisible(true);\n }\n });\n this.dialog?.fitWidth();\n }\n\n /** 刷新渲染 */\n public refresh() {\n this.toolbar?.render();\n }\n\n /** 销毁管理器 */\n public destroy() {\n this.toolbar?.destroy();\n this.toolbar = null;\n super.destroy();\n }\n\n /**\n * 添加按钮组\n * @param groupId 组 ID\n * @param beforeGroupId 插入位置\n */\n public addGroup(groupId: string, beforeGroupId?: string) {\n this.toolbar?.addGroup(groupId, beforeGroupId);\n this.toolbar?.render();\n }\n\n /**\n * 添加按钮\n * @param config 按钮配置\n */\n public addButton(config: ButtonConfig) {\n this.toolbar?.addButton(config);\n this.toolbar?.render();\n }\n\n /**\n * 设置按钮可见性\n * @param id 按钮 ID\n * @param v 是否可见\n */\n public setButtonVisibility(id: string, v: boolean) {\n this.toolbar?.updateButtonVisibility(id, v);\n }\n\n /**\n * 设置是否显示标签\n * @param show 是否显示\n */\n public setShowLabel(show: boolean) {\n this.toolbar?.setShowLabel(show);\n }\n\n /**\n * 设置按钮组可见性\n * @param visible 是否可见\n */\n public setVisible(visible: boolean) {\n if (this.toolbarContainer) {\n this.toolbarContainer.style.visibility = visible ? 'visible' : 'hidden';\n }\n }\n\n /**\n * 设置背景颜色\n * @param color 颜色值\n */\n public setBackgroundColor(color: string) {\n this.toolbar?.setBackgroundColor(color);\n }\n\n /**\n * 设置按钮组颜色\n * @param colors 颜色配置\n */\n public setColors(colors: ButtonGroupColors) {\n this.toolbar?.setColors(colors);\n }\n}\n","import './index.css';\nimport { CollapseOptions, CollapseItemConfig } from './types';\nimport { IBimComponent } from '../../types/component';\nimport { t, localeManager } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { ThemeConfig } from '../../themes/types';\n\n/**\n * 单个折叠面板项\n */\nclass BimCollapseItem {\n public element: HTMLElement;\n public headerEl!: HTMLElement;\n public contentEl!: HTMLElement;\n public contentBoxEl!: HTMLElement;\n public arrowEl!: HTMLElement;\n public titleEl!: HTMLElement;\n\n private config: CollapseItemConfig;\n private parent: BimCollapse;\n\n constructor(config: CollapseItemConfig, parent: BimCollapse) {\n this.config = config;\n this.parent = parent;\n this.element = this.createDom();\n }\n\n private createDom(): HTMLElement {\n const itemEl = document.createElement('div');\n itemEl.className = `bim-collapse-item ${this.config.className || ''}`;\n if (this.config.disabled) itemEl.classList.add('is-disabled');\n itemEl.dataset.id = this.config.id;\n\n // ��部区域\n this.headerEl = document.createElement('div');\n this.headerEl.className = 'bim-collapse-header';\n\n // 箭头图标\n this.arrowEl = document.createElement('span');\n this.arrowEl.className = 'bim-collapse-arrow';\n this.arrowEl.innerHTML = ``;\n this.headerEl.appendChild(this.arrowEl);\n\n // 自定义图标 (可选)\n if (this.config.icon) {\n const iconEl = document.createElement('span');\n iconEl.className = 'bim-collapse-icon';\n iconEl.innerHTML = this.config.icon;\n this.headerEl.appendChild(iconEl);\n }\n\n // 标题文本\n this.titleEl = document.createElement('span');\n this.titleEl.className = 'bim-collapse-title';\n this.titleEl.textContent = t(this.config.title); // 初始翻译\n this.headerEl.appendChild(this.titleEl);\n\n // 额外内容 (可选,如右侧标签)\n if (this.config.extra) {\n const extraEl = document.createElement('div');\n extraEl.className = 'bim-collapse-extra';\n if (typeof this.config.extra === 'string') {\n extraEl.innerHTML = this.config.extra;\n } else {\n extraEl.appendChild(this.config.extra);\n }\n this.headerEl.appendChild(extraEl);\n }\n\n // 点击事件\n this.headerEl.addEventListener('click', () => {\n if (this.config.disabled) return;\n this.parent.toggleItem(this.config.id);\n });\n\n itemEl.appendChild(this.headerEl);\n\n // 内容区域\n this.contentEl = document.createElement('div');\n this.contentEl.className = 'bim-collapse-content is-hidden';\n\n this.contentBoxEl = document.createElement('div');\n this.contentBoxEl.className = 'bim-collapse-content-box';\n\n if (typeof this.config.content === 'string') {\n this.contentBoxEl.innerHTML = this.config.content;\n } else {\n this.contentBoxEl.appendChild(this.config.content);\n }\n\n this.contentEl.appendChild(this.contentBoxEl);\n itemEl.appendChild(this.contentEl);\n\n return itemEl;\n }\n\n public updateLocale() {\n if (this.titleEl) {\n this.titleEl.textContent = t(this.config.title);\n }\n }\n\n public setActive(isActive: boolean) {\n if (isActive) {\n this.element.classList.add('is-active');\n this.contentEl.classList.remove('is-hidden');\n // 简单的动画处理:设置 height\n // 实际生产中可能需要更复杂的 JS 动画库或 transitionend 事件处理\n // 这里依赖 CSS transition\n } else {\n this.element.classList.remove('is-active');\n this.contentEl.classList.add('is-hidden');\n }\n }\n}\n\n/**\n * 折叠面板组件\n */\nexport class BimCollapse implements IBimComponent {\n private element: HTMLElement;\n private options: CollapseOptions;\n private items: Map = new Map();\n private activeIds: Set = new Set();\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(options: CollapseOptions) {\n this.options = {\n bordered: true,\n accordion: false,\n ...options\n };\n\n this.element = document.createElement('div');\n this.element.className = `bim-collapse ${this.options.className || ''}`;\n if (!this.options.bordered) this.element.style.border = 'none';\n if (this.options.ghost) this.element.classList.add('is-ghost');\n\n const container = typeof this.options.container === 'string'\n ? document.getElementById(this.options.container)\n : this.options.container;\n\n if (container) {\n container.appendChild(this.element);\n }\n\n // 初始化激活的 ID\n if (this.options.activeIds) {\n this.options.activeIds.forEach(id => this.activeIds.add(id));\n }\n\n this.init();\n }\n\n public init() {\n // 创建子项\n this.options.items.forEach(itemConfig => {\n const item = new BimCollapseItem(itemConfig, this);\n this.items.set(itemConfig.id, item);\n this.element.appendChild(item.element);\n\n // 设置初始状态\n if (this.activeIds.has(itemConfig.id)) {\n item.setActive(true);\n }\n });\n\n // 订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 初始应用主题\n this.setTheme(themeManager.getTheme());\n }\n\n public toggleItem(id: string) {\n const isActive = this.activeIds.has(id);\n\n if (this.options.accordion) {\n // 手风琴模式:关闭其他所有,只展开目标\n this.activeIds.clear();\n if (!isActive) {\n this.activeIds.add(id);\n }\n } else {\n // 普通模式:切换目标状态\n if (isActive) {\n this.activeIds.delete(id);\n } else {\n this.activeIds.add(id);\n }\n }\n\n this.refreshState();\n\n if (this.options.onChange) {\n this.options.onChange(Array.from(this.activeIds));\n }\n }\n\n private refreshState() {\n this.items.forEach((item, id) => {\n item.setActive(this.activeIds.has(id));\n });\n }\n\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-bg-color', theme.bgElevated);\n style.setProperty('--bim-border-color', theme.borderDefault);\n style.setProperty('--bim-text-color', theme.textPrimary);\n style.setProperty('--bim-header-bg-color', theme.componentBgHover);\n style.setProperty('--bim-header-hover-bg-color', theme.componentBgActive);\n style.setProperty('--bim-content-bg-color', theme.bgElevated);\n style.setProperty('--bim-disabled-color', theme.textDisabled);\n }\n\n public setLocales(): void {\n this.items.forEach(item => item.updateLocale());\n }\n\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.element.remove();\n this.items.clear();\n }\n}\n","import './index.css';\nimport { DescriptionOptions, DescriptionItem } from './types';\nimport { IBimComponent } from '../../types/component';\nimport { themeManager } from '../../services/theme';\nimport type { ThemeConfig } from '../../themes/types';\n\n/**\n * 描述列表组件\n * 用于展示一组 Key-Value 数据\n * 注意:本组件为纯展示组件,不处理国际化,请在外部传入处理好的文本。\n */\nexport class BimDescription implements IBimComponent {\n private element: HTMLElement;\n private options: DescriptionOptions;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(options: DescriptionOptions) {\n this.options = {\n bordered: false,\n ...options\n };\n\n this.element = this.createDom();\n\n const container = typeof this.options.container === 'string'\n ? document.getElementById(this.options.container)\n : this.options.container;\n\n if (container) {\n container.appendChild(this.element);\n }\n\n this.init();\n }\n\n public init(): void {\n this.applyCustomStyles();\n this.renderItems();\n\n // 订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 初始应用主题\n this.setTheme(themeManager.getTheme());\n }\n\n private createDom(): HTMLElement {\n const el = document.createElement('div');\n el.className = `bim-description ${this.options.className || ''}`;\n\n if (this.options.bordered) el.classList.add('is-bordered');\n\n return el;\n }\n\n private applyCustomStyles() {\n const style = this.element.style;\n\n // 应用全局字体大小\n if (this.options.fontSize) {\n style.setProperty('--bim-desc-font-size', this.options.fontSize);\n }\n\n // 应用全局 Label 颜色\n if (this.options.labelColor) {\n style.setProperty('--bim-desc-label-color', this.options.labelColor);\n }\n\n // 应用全局 Value 颜色\n if (this.options.valueColor) {\n style.setProperty('--bim-desc-value-color', this.options.valueColor);\n }\n\n // 应用 Padding 配置\n if (this.options.labelPadding) {\n style.setProperty('--bim-desc-label-padding', this.options.labelPadding);\n }\n\n if (this.options.valuePadding) {\n style.setProperty('--bim-desc-value-padding', this.options.valuePadding);\n }\n }\n\n private renderItems() {\n this.element.innerHTML = ''; // 清空现有内容\n\n this.options.items.forEach(item => {\n const itemEl = document.createElement('div');\n itemEl.className = `bim-description-item ${item.className || ''}`;\n\n // 1. Label\n const labelEl = document.createElement('div');\n labelEl.className = 'bim-description-label';\n\n // 行级颜色覆盖全局颜色\n if (item.labelColor) {\n labelEl.style.color = item.labelColor;\n }\n\n // 设置固定宽度\n if (this.options.labelWidth) {\n labelEl.style.width = this.options.labelWidth;\n }\n\n // 直接显示文本\n // bordered 模式移除冒号,普通模式保留\n labelEl.textContent = this.options.bordered ? item.label : (item.label + ':');\n\n // 2. Value\n const valueEl = document.createElement('div');\n valueEl.className = 'bim-description-value';\n\n // 行级颜色覆盖全局颜色\n if (item.valueColor) {\n valueEl.style.color = item.valueColor;\n }\n\n if (typeof item.value === 'string') {\n valueEl.innerHTML = item.value;\n } else {\n valueEl.appendChild(item.value);\n }\n\n itemEl.appendChild(labelEl);\n itemEl.appendChild(valueEl);\n this.element.appendChild(itemEl);\n });\n }\n\n /**\n * 动态更新数据\n */\n public setItems(items: DescriptionItem[]) {\n this.options.items = items;\n this.renderItems();\n }\n\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n // 设置基础主题变量 (作为 fallback 或默认值)\n style.setProperty('--bim-text-color', theme.textPrimary);\n style.setProperty('--bim-label-color', theme.textSecondary);\n style.setProperty('--bim-value-color', theme.textPrimary);\n style.setProperty('--bim-border-color', theme.borderDefault);\n }\n\n public setLocales(): void {\n // 本组件不处理国际化\n }\n\n public destroy(): void {\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.element.remove();\n }\n}\n","/**\n * 属性面板管理器\n * 负责管理构件属性面板的显示和内容\n */\nimport { BaseManager } from '../core/base-manager';\nimport { BimCollapse } from '../components/collapse/index';\nimport { BimDescription } from '../components/description/index';\nimport { BimTab } from '../components/tab/index';\n\n/**\n * 属性面板管理器\n * 显示选中构件的属性信息和材质信息\n */\nexport class PropertyPanelManager extends BaseManager {\n /** 对话框 ID */\n private dialogId = 'property-panel-dialog';\n /** 对话框实例 */\n private dialog: any = null;\n\n constructor() {\n super();\n }\n\n /** 初始化,监听打开事件 */\n public init(): void {\n document.addEventListener('bim-demo:open-property-panel', () => {\n this.show();\n });\n }\n\n /** 显示属性面板 */\n public show() {\n if (!this.registry.dialog) {\n console.warn('Dialog manager is not initialized');\n return;\n }\n\n if (this.isOpen()) {\n return;\n }\n\n const width = 360;\n const x = document.body.clientWidth - width - 40;\n\n this.dialog = this.registry.dialog.create({\n id: this.dialogId,\n title: 'panel.property.title',\n content: '',\n width: `${width}px`,\n height: '500px',\n position: { x, y: 20 },\n showMask: false,\n resizable: true,\n onClose: () => {\n this.hide();\n }\n } as any);\n\n const contentContainer = document.createElement('div');\n contentContainer.style.height = '100%';\n contentContainer.style.display = 'flex';\n contentContainer.style.flexDirection = 'column';\n\n this.dialog.setContent(contentContainer);\n\n const tab = new BimTab({\n container: contentContainer,\n tabs: [\n {\n id: 'props',\n title: 'panel.property.tab.props',\n content: this.createPropsTabContent()\n },\n {\n id: 'material',\n title: 'panel.property.tab.material',\n content: this.createMaterialTabContent()\n }\n ]\n });\n tab.init();\n }\n\n /** 创建属性标签页内容 */\n private createPropsTabContent(): HTMLElement {\n const container = document.createElement('div');\n container.style.height = '100%';\n container.style.overflowY = 'auto';\n\n new BimCollapse({\n container: container,\n accordion: true,\n activeIds: ['base', 'location'],\n items: [\n {\n id: 'base',\n title: 'panel.property.base',\n content: this.createBaseInfoContent(),\n },\n {\n id: 'advanced',\n title: 'panel.property.advanced',\n content: this.createAdvancedInfoContent(),\n disabled: false\n }\n ]\n });\n\n return container;\n }\n\n /** 创建材质标签页内容 */\n private createMaterialTabContent(): HTMLElement {\n const container = document.createElement('div');\n container.style.height = '100%';\n container.style.overflowY = 'auto';\n\n new BimCollapse({\n container: container,\n accordion: true,\n activeIds: ['material'],\n items: [\n {\n id: 'material',\n title: 'panel.property.material',\n content: this.createMaterialContent(),\n }\n ]\n });\n\n return container;\n }\n\n /** 创建基本信息内容 */\n private createBaseInfoContent(): HTMLElement {\n const container = document.createElement('div');\n\n new BimDescription({\n container: container,\n labelWidth: '80px',\n bordered: true,\n items: [\n { label: 'Guid', value: '1f8d-4a2e-9c' },\n { label: 'Name', value: 'Basic Wall: Generic - 200mm' },\n { label: 'Type', value: 'Basic Wall' },\n { label: 'Level', value: 'Trane - Centrifugal Water Chiller - CVHF 2 Stage direct drive TAG(BP-RHS-1100RT) 0202104531 1' }\n ]\n });\n\n return container;\n }\n\n /** 创建高级信息内容 */\n private createAdvancedInfoContent(): HTMLElement {\n const container = document.createElement('div');\n\n new BimDescription({\n container: container,\n labelWidth: '100px',\n bordered: true,\n items: [\n { label: 'Area', value: '32.5 m²' },\n { label: 'Volume', value: '6.5 m³' },\n { label: 'Length', value: '5000 mm' },\n { label: 'Phase', value: 'New Construction' }\n ]\n });\n\n return container;\n }\n\n /** 创建材质内容 */\n private createMaterialContent(): HTMLElement {\n const container = document.createElement('div');\n\n const preview = document.createElement('div');\n preview.style.display = 'flex';\n preview.style.alignItems = 'center';\n preview.style.marginBottom = '4px';\n preview.innerHTML = `\n
    \n Concrete - Cast-in-Place Gray\n `;\n\n const descContainer = document.createElement('div');\n\n new BimDescription({\n container: descContainer,\n items: [\n { label: 'Preview', value: preview },\n { label: 'Class', value: 'Concrete' },\n { label: 'Density', value: '2400 kg/m³' },\n { label: 'Thermal', value: '0.6 W/(m·K)' }\n ]\n });\n\n container.appendChild(descContainer);\n return container;\n }\n\n /**\n * 检查面板是否打开\n * @returns 是否打开\n */\n public isOpen(): boolean {\n return this.dialog !== null;\n }\n\n /** 隐藏面板 */\n public hide(): void {\n if (this.dialog) {\n this.dialog.destroy();\n this.dialog = null;\n }\n }\n\n /** 销毁管理器 */\n public destroy(): void {\n this.hide();\n super.destroy();\n }\n}\n","/**\n * 对话框管理器基类\n * 提供对话框的通用生命周期管理\n */\nimport { BaseManager } from './base-manager';\nimport { BimDialog } from '../components/dialog';\n\n/** 对话框配置选项 */\nexport interface DialogManagerOptions {\n /** 是否可拖拽 */\n draggable?: boolean;\n /** 是否可调整大小 */\n resizable?: boolean;\n}\n\n/**\n * 对话框管理器抽象基类\n * 子类需要实现 dialogId、dialogTitle 和 createContent 方法\n */\nexport abstract class BaseDialogManager extends BaseManager {\n /** 对话框实例 */\n protected dialog: BimDialog | null = null;\n /** 对话框是否可见 */\n protected isVisible: boolean = false;\n\n /** 对话框唯一标识(子类必须实现) */\n protected abstract get dialogId(): string;\n /** 对话框标题,支持国际化 key(子类必须实现) */\n protected abstract get dialogTitle(): string;\n\n /** 对话框宽度,默认 300 */\n protected get dialogWidth(): number {\n return 300;\n }\n\n /** 对话框高度,默认 'auto' 自适应 */\n protected get dialogHeight(): number | 'auto' {\n return 'auto';\n }\n\n /** 对话框选项,默认可拖拽不可缩放 */\n protected get dialogOptions(): DialogManagerOptions {\n return { draggable: true, resizable: false };\n }\n\n /** 创建对话框内容(子类必须实现) */\n protected abstract createContent(): HTMLElement;\n\n /** 对话框关闭时的回调,子类可重写 */\n protected onDialogClose(): void {}\n /** 对话框创建后的回调,子类可重写 */\n protected onDialogCreated(): void {}\n /** 销毁前的回调,子类可重写 */\n protected onBeforeDestroy(): void {}\n\n /**\n * 获取对话框位置\n * 默认定位在容器右侧居中,子类可重写\n */\n protected getDialogPosition(): { x: number; y: number } {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n const width = this.dialogWidth;\n const height = typeof this.dialogHeight === 'number' ? this.dialogHeight : 300;\n const paddingRight = 20;\n\n return {\n x: containerWidth - width - paddingRight,\n y: (containerHeight - height) / 2\n };\n }\n\n /** 显示对话框 */\n public show(): void {\n if (!this.registry.dialog || !this.registry.container) {\n console.warn(`[${this.dialogId}] Dialog manager or container is not initialized`);\n return;\n }\n\n if (this.dialog) {\n this.destroyDialog();\n }\n\n const position = this.getDialogPosition();\n const content = this.createContent();\n const options = this.dialogOptions;\n\n this.dialog = this.registry.dialog.create({\n id: this.dialogId,\n title: this.dialogTitle,\n content,\n width: this.dialogWidth,\n height: this.dialogHeight,\n position,\n draggable: options.draggable,\n resizable: options.resizable,\n onClose: () => {\n this.onDialogClose();\n this.destroyDialog();\n }\n });\n this.dialog.init();\n this.isVisible = true;\n this.onDialogCreated();\n }\n\n /** 隐藏对话框 */\n public hide(): void {\n this.destroyDialog();\n }\n\n /** 切换对话框显示状态 */\n public toggle(): void {\n if (this.isVisible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /** 获取对话框是否打开 */\n public isOpen(): boolean {\n return this.isVisible;\n }\n\n /** 销毁对话框 */\n protected destroyDialog(): void {\n this.onBeforeDestroy();\n if (this.dialog) {\n this.dialog.destroy();\n this.dialog = null;\n }\n this.isVisible = false;\n }\n\n /** 销毁管理器 */\n public destroy(): void {\n this.destroyDialog();\n super.destroy();\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { MeasureConfig, MeasureMode, MeasurePanelOptions, MeasurePrecision, MeasureResult, MeasureUnit } from './types';\n\n/**\n * 测量方式图标(SVG)\n *\n * 说明:\n * - 你上传的 SVG 原文件放在 `src/assets/icons/` 目录\n * - 原始 SVG 含 defs/clipPath/style/背景 rect,直接内联时容易出现渲染/裁剪异常(尤其多个图标同时出现)\n * - 这里把图标“瘦身”为纯 path,并统一使用 currentColor,确保稳定渲染\n */\nconst MEASURE_MODE_ICON_SVGS: Record = {\n distance: ``,\n minDistance: ``,\n angle: ``,\n elevation: ``,\n volume: ``,\n laserDistance: ``,\n slope: ``,\n spaceVolume: ``\n};\n\n/**\n * 测量面板组件(只做 UI,不实现真实测量)\n *\n * 组件职责:\n * - 展示 8 种测量方式按钮(默认 4 个,可展开/收起)\n * - 维护当前选中的测量方式(current mode)\n * - 展示测量结果(由外部 setResult 注入)\n * - 提供 “删除全部 / 设置” 的 UI 与对外方法(暂不实现真实逻辑,仅回调/占位)\n *\n * 注意:\n * - 所有用户可见文本必须通过 t(key) 获取(国际化强制要求)\n * - 组件需要订阅主题/语言变更,并在 destroy 时清理订阅\n */\nexport class MeasurePanel implements IBimComponent {\n public element: HTMLElement;\n\n private options: MeasurePanelOptions;\n private activeMode: MeasureMode;\n private isExpanded: boolean;\n private result: MeasureResult | null = null;\n\n /**\n * 测量配置(单位/精度)\n * 说明:\n * - 你要求:创建 MeasurePanel 不传入单位和精度\n * - 默认值维护在组件内部\n * - 初始化时优先读取缓存(localStorage),否则使用默认值\n */\n private config: MeasureConfig;\n\n /** 设置面板的临时配置(用于“取消”回滚) */\n private draftConfig: MeasureConfig | null = null;\n\n /** 当前视图:主面板 / 设置面板 */\n private view: 'main' | 'settings' = 'main';\n\n /** 缓存 key(默认全局) */\n private static readonly CONFIG_CACHE_KEY = 'bim-engine:measure:config';\n\n /** 默认配置(由组件内部维护) */\n private static readonly DEFAULT_CONFIG: MeasureConfig = {\n unit: 'mm',\n precision: 2\n };\n\n // DOM 引用(便于局部更新,减少频繁 querySelector)\n private toolButtons: Map = new Map();\n private toggleBtn!: HTMLButtonElement;\n private toggleTextEl!: HTMLElement;\n private mainValueValueEl!: HTMLElement;\n private mainValueLabelEl!: HTMLElement;\n private mainNumberEl!: HTMLElement;\n private mainUnitEl!: HTMLElement;\n private xyzBoxEl!: HTMLElement;\n private xyzXEl!: HTMLElement;\n private xyzYEl!: HTMLElement;\n private xyzZEl!: HTMLElement;\n private clearBtn!: HTMLButtonElement;\n private settingsBtn!: HTMLButtonElement;\n\n // Settings DOM\n private mainViewEl!: HTMLElement;\n private settingsViewEl!: HTMLElement;\n private unitSelectEl!: HTMLSelectElement;\n private precisionSelectEl!: HTMLSelectElement;\n private saveSettingsBtn!: HTMLButtonElement;\n private cancelSettingsBtn!: HTMLButtonElement;\n\n // 订阅清理\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n /**\n * 构造函数\n * @param options 组件配置\n */\n constructor(options: MeasurePanelOptions = {}) {\n this.options = options;\n this.activeMode = options.defaultMode ?? 'distance';\n this.isExpanded = options.defaultExpanded ?? false;\n\n // 读取配置:优先缓存,否则默认\n this.config = this.loadConfigFromCache() ?? { ...MeasurePanel.DEFAULT_CONFIG };\n\n this.element = this.createDom();\n }\n\n /**\n * 初始化组件(实现 IBimComponent)\n */\n public init(): void {\n // 订阅语言变更:更新所有文本/提示\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 订阅主题变更:更新 CSS 变量(如需要)\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 初始应用\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n\n // 初始渲染状态(按钮显隐、选中态、结果区)\n this.applyExpandedState();\n this.applyActiveModeState();\n this.applyViewState();\n this.renderResult();\n\n // 触发初始测量模式的回调(让外部知道默认激活了哪个模式)\n if (this.options.onModeChange) {\n this.options.onModeChange(this.activeMode);\n }\n }\n\n /**\n * 设置主题(实现 IBimComponent)\n * @param theme 主题配置\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-bg-elevated', theme.bgElevated ?? '#1f2d3e');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-divider', theme.divider ?? '#334155');\n \n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-hover', theme.primaryHover ?? '#60a5fa');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n style.setProperty('--bim-danger', theme.danger ?? '#ef4444');\n \n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-text-secondary', theme.textSecondary ?? '#94a3b8');\n style.setProperty('--bim-text-tertiary', theme.textTertiary ?? '#64748b');\n style.setProperty('--bim-text-inverse', theme.textInverse ?? '#152232');\n \n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n \n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n }\n\n /**\n * 设置语言(实现 IBimComponent)\n */\n public setLocales(): void {\n // 1) 更新按钮 tooltip(图标占位时,tooltip 是主要的可读文本)\n for (const [mode, btn] of this.toolButtons.entries()) {\n btn.title = t(this.getModeI18nKey(mode));\n btn.setAttribute('aria-label', btn.title);\n }\n\n // 2) 更新展开/收起按钮 tooltip\n this.toggleBtn.title = this.isExpanded ? t('measure.actions.collapse') : t('measure.actions.expand');\n this.toggleBtn.setAttribute('aria-label', this.toggleBtn.title);\n\n // 2.1) 更新展开/收起按钮可见文本(你要求的“文字提示”)\n if (this.toggleTextEl) {\n this.toggleTextEl.textContent = this.toggleBtn.title;\n }\n\n // 3) 更新底部按钮文本/tooltip\n this.clearBtn.textContent = t('measure.actions.clearAll');\n this.settingsBtn.title = t('measure.actions.settings');\n this.settingsBtn.setAttribute('aria-label', this.settingsBtn.title);\n\n // 4) 主值 label(随模式变化)\n this.mainValueLabelEl.textContent = t(this.getModeValueLabelI18nKey(this.activeMode));\n\n // 6) XYZ label(使用 key)\n // 这里 label 在 createDom 已经是固定文本节点,直接用 setText 更新更直观\n // 但为了减少 DOM 结构复杂度,我们把 label 写在 createDom 里,通过 data-key 更新\n const labelNodes = this.element.querySelectorAll('[data-i18n-key]');\n labelNodes.forEach((node) => {\n const key = node.dataset.i18nKey;\n if (key) node.textContent = t(key);\n });\n\n // 7) 设置面板文本\n this.saveSettingsBtn.textContent = t('measure.settings.save');\n this.cancelSettingsBtn.textContent = t('measure.settings.cancel');\n }\n\n /**\n * 销毁组件(实现 IBimComponent)\n */\n public destroy(): void {\n // 清理订阅\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n\n // 清理事件监听:由于本组件的监听都绑定在创建时的具体按钮上,\n // 且按钮会随 element 一起被 GC,这里不做逐个 removeEventListener(可读性优先)\n\n // 移除 DOM\n this.element.remove();\n }\n\n // ==========================\n // 对外 API(给 Manager / 外部业务调用)\n // ==========================\n\n /**\n * 获取当前测量方式\n */\n public getActiveMode(): MeasureMode {\n return this.activeMode;\n }\n\n /**\n * 切换测量方式(你要求的“切换类型的方法”)\n * @param mode 目标测量方式\n */\n public switchMode(mode: MeasureMode): void {\n this.setActiveMode(mode);\n }\n\n /**\n * 设置当前测量方式\n * @param mode 目标测量方式\n */\n public setActiveMode(mode: MeasureMode): void {\n if (this.activeMode === mode) return;\n this.activeMode = mode;\n this.applyActiveModeState();\n\n // 切换方式后,主值 label 也需要更新\n this.mainValueLabelEl.textContent = t(this.getModeValueLabelI18nKey(this.activeMode));\n\n // 通知外部(如果需要)\n if (this.options.onModeChange) {\n this.options.onModeChange(mode);\n }\n\n // 模式切换后,结果展示也应刷新(例如某些字段显示为 --)\n this.renderResult();\n\n // 切换模式会影响结果区高度(例如 distance 显示 xyz,其它不显示)\n // 复用 onExpandedChange 来通知外部重新计算 Dialog 高度(不额外扩展回调,保持接口简单)\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n }\n\n /**\n * 设置测量结果(由外部注入)\n * @param result 测量结果;传 null 表示清空\n */\n public setResult(result: MeasureResult | null): void {\n this.result = result;\n this.renderResult();\n }\n\n /**\n * 删除全部(只做 UI 状态清空 + 回调)\n */\n public clearAll(): void {\n // 先清空结果显示\n this.result = null;\n this.renderResult();\n\n // 通知外部\n if (this.options.onClearAll) {\n this.options.onClearAll();\n }\n }\n\n /**\n * 打开设置(本次只预留方法/回调)\n */\n public openSettings(): void {\n // 进入设置面板(组件内部逻辑)\n this.enterSettingsView();\n\n // 仍然保留回调(如果外部想监听)\n if (this.options.onSettings) {\n this.options.onSettings();\n }\n }\n\n /**\n * 获取当前测量配置\n */\n public getConfig(): MeasureConfig {\n return { ...this.config };\n }\n\n /**\n * 设置测量配置(可选对外调用)\n * @param partial 部分更新\n * @param persist 是否写入缓存(默认 false)\n */\n public setConfig(partial: Partial, persist: boolean = false): void {\n const next: MeasureConfig = {\n unit: partial.unit ?? this.config.unit,\n precision: partial.precision ?? this.config.precision\n };\n this.config = next;\n if (persist) {\n this.saveConfigToCache(next);\n }\n\n // 配置变化会影响数值显示(单位/精度)\n this.renderResult();\n\n // 如果当前在设置面板,表单也需要同步\n if (this.view === 'settings') {\n this.syncSettingsFormFromConfig(next);\n }\n }\n\n /**\n * 展开 / 收起(可选对外调用)\n * @param expanded 是否展开\n */\n public setExpanded(expanded: boolean): void {\n if (this.isExpanded === expanded) return;\n this.isExpanded = expanded;\n this.applyExpandedState();\n this.setLocales(); // 更新 tooltip(展开/收起)\n\n // 通知外部:用于重新计算 Dialog 高度\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n }\n\n /**\n * 获取是否展开\n */\n public getExpanded(): boolean {\n return this.isExpanded;\n }\n\n // ==========================\n // 内部实现\n // ==========================\n\n private createDom(): HTMLElement {\n const root = document.createElement('div');\n root.className = 'bim-measure-panel';\n\n // 主视图容器(默认显示)\n this.mainViewEl = document.createElement('div');\n this.mainViewEl.className = 'bim-measure-main';\n\n // 顶部:工具按钮区\n const toolsBox = document.createElement('div');\n toolsBox.className = 'bim-measure-tools';\n\n const grid = document.createElement('div');\n grid.className = 'bim-measure-tool-grid';\n\n // 8 种测量方式(顺序严格按你给的)\n const modes: MeasureMode[] = [\n 'distance',\n 'minDistance',\n 'angle',\n 'elevation',\n 'volume',\n 'laserDistance',\n 'slope',\n 'spaceVolume'\n ];\n\n // 图标:优先使用你上传的 SVG 文件内容(已内联到 MEASURE_MODE_ICON_SVGS)\n // 兜底:如果某个 mode 没有配置图标,则使用圆形占位(防止页面空白)\n const fallbackCircleIconSvg = `\n \n \n \n `;\n\n // 逐个创建按钮\n for (let i = 0; i < modes.length; i++) {\n const mode = modes[i];\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'bim-measure-tool-btn';\n btn.dataset.mode = mode;\n\n // icon\n const icon = document.createElement('span');\n icon.className = 'bim-measure-tool-icon';\n icon.innerHTML = MEASURE_MODE_ICON_SVGS[mode] || fallbackCircleIconSvg;\n btn.appendChild(icon);\n\n // 点击切换模式\n btn.addEventListener('click', () => {\n this.setActiveMode(mode);\n });\n\n // 先不在这里设置 title/text(统一交给 setLocales)\n this.toolButtons.set(mode, btn);\n grid.appendChild(btn);\n }\n\n toolsBox.appendChild(grid);\n\n // 展开/收起按钮(箭头)\n const toggleBox = document.createElement('div');\n toggleBox.className = 'bim-measure-toggle';\n\n this.toggleBtn = document.createElement('button');\n this.toggleBtn.type = 'button';\n this.toggleBtn.className = 'bim-measure-toggle-btn';\n // 展开/收起按钮:更小,并带文字提示(展开/收起)\n // 注意:文本内容由 setLocales() 统一更新,这里先放一个占位容器\n this.toggleTextEl = document.createElement('span');\n this.toggleTextEl.className = 'bim-measure-toggle-text';\n const toggleIconEl = document.createElement('span');\n toggleIconEl.className = 'bim-measure-toggle-icon';\n toggleIconEl.innerHTML = `\n \n \n \n `;\n this.toggleBtn.appendChild(this.toggleTextEl);\n this.toggleBtn.appendChild(toggleIconEl);\n this.toggleBtn.addEventListener('click', () => {\n this.isExpanded = !this.isExpanded;\n this.applyExpandedState();\n this.setLocales(); // 更新 tooltip(展开/收起)\n\n // 通知外部:用于重新计算 Dialog 高度\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n });\n\n toggleBox.appendChild(this.toggleBtn);\n toolsBox.appendChild(toggleBox);\n this.mainViewEl.appendChild(toolsBox);\n\n // 中部:结果区\n const resultBox = document.createElement('div');\n resultBox.className = 'bim-measure-result';\n\n // 主结果值(随模式变化)\n const mainValueRow = document.createElement('div');\n mainValueRow.className = 'bim-measure-row';\n const mainValueLabel = document.createElement('span');\n mainValueLabel.className = 'label';\n this.mainValueLabelEl = mainValueLabel;\n const mainValueValue = document.createElement('span');\n mainValueValue.className = 'value';\n this.mainValueValueEl = mainValueValue;\n\n // 主值拆分:数值(黄色)+ 单位(普通色)\n // 这样可以满足:\n // 1) 只让“数据”变黄,单位不变色\n // 2) 没有数据时展示 `-- 单位`\n this.mainNumberEl = document.createElement('span');\n this.mainNumberEl.className = 'bim-measure-main-number';\n this.mainUnitEl = document.createElement('span');\n this.mainUnitEl.className = 'bim-measure-main-unit';\n this.mainValueValueEl.appendChild(this.mainNumberEl);\n this.mainValueValueEl.appendChild(document.createTextNode(' '));\n this.mainValueValueEl.appendChild(this.mainUnitEl);\n mainValueRow.appendChild(mainValueLabel);\n mainValueRow.appendChild(mainValueValue);\n resultBox.appendChild(mainValueRow);\n\n // XYZ\n const xyzBox = document.createElement('div');\n xyzBox.className = 'bim-measure-xyz';\n this.xyzBoxEl = xyzBox;\n\n const makeXyzRow = (labelKey: string, valueClassName: string, valueElSetter: (el: HTMLElement) => void) => {\n const row = document.createElement('div');\n row.className = 'bim-measure-row';\n const label = document.createElement('span');\n label.className = 'label';\n label.dataset.i18nKey = labelKey;\n const value = document.createElement('span');\n value.className = `value ${valueClassName}`;\n valueElSetter(value);\n row.appendChild(label);\n row.appendChild(value);\n return row;\n };\n\n xyzBox.appendChild(makeXyzRow('measure.labels.x', 'bim-measure-xyz-x', (el) => (this.xyzXEl = el)));\n xyzBox.appendChild(makeXyzRow('measure.labels.y', 'bim-measure-xyz-y', (el) => (this.xyzYEl = el)));\n xyzBox.appendChild(makeXyzRow('measure.labels.z', 'bim-measure-xyz-z', (el) => (this.xyzZEl = el)));\n resultBox.appendChild(xyzBox);\n\n this.mainViewEl.appendChild(resultBox);\n\n // 底部:删除全部 + 设置\n const footer = document.createElement('div');\n footer.className = 'bim-measure-footer';\n\n this.clearBtn = document.createElement('button');\n this.clearBtn.type = 'button';\n this.clearBtn.className = 'bim-measure-clear-btn';\n this.clearBtn.addEventListener('click', () => {\n this.clearAll();\n });\n\n this.settingsBtn = document.createElement('button');\n this.settingsBtn.type = 'button';\n this.settingsBtn.className = 'bim-measure-settings-btn';\n this.settingsBtn.innerHTML = `\n \n \n \n `;\n this.settingsBtn.addEventListener('click', () => {\n this.openSettings();\n });\n\n footer.appendChild(this.clearBtn);\n footer.appendChild(this.settingsBtn);\n this.mainViewEl.appendChild(footer);\n\n // 设置视图容器(默认隐藏)\n this.settingsViewEl = this.createSettingsDom();\n\n root.appendChild(this.mainViewEl);\n root.appendChild(this.settingsViewEl);\n\n return root;\n }\n\n /**\n * 创建“设置面板”DOM\n */\n private createSettingsDom(): HTMLElement {\n const box = document.createElement('div');\n box.className = 'bim-measure-settings';\n\n // 标题\n const title = document.createElement('div');\n title.className = 'bim-measure-settings-title';\n title.dataset.i18nKey = 'measure.settings.title';\n box.appendChild(title);\n\n // 单位\n const unitRow = document.createElement('div');\n unitRow.className = 'bim-measure-settings-row';\n const unitLabel = document.createElement('div');\n unitLabel.className = 'label';\n unitLabel.dataset.i18nKey = 'measure.settings.unit';\n this.unitSelectEl = document.createElement('select');\n this.unitSelectEl.className = 'bim-measure-settings-select';\n this.unitSelectEl.appendChild(this.makeOption('m'));\n this.unitSelectEl.appendChild(this.makeOption('cm'));\n this.unitSelectEl.appendChild(this.makeOption('mm'));\n this.unitSelectEl.appendChild(this.makeOption('km'));\n unitRow.appendChild(unitLabel);\n unitRow.appendChild(this.unitSelectEl);\n box.appendChild(unitRow);\n\n // 提示文本:你要求放在“单位”下面\n const hint = document.createElement('div');\n hint.className = 'bim-measure-settings-hint';\n hint.dataset.i18nKey = 'measure.settings.hint';\n box.appendChild(hint);\n\n // 精度\n const precisionRow = document.createElement('div');\n precisionRow.className = 'bim-measure-settings-row';\n const precisionLabel = document.createElement('div');\n precisionLabel.className = 'label';\n precisionLabel.dataset.i18nKey = 'measure.settings.precision';\n this.precisionSelectEl = document.createElement('select');\n this.precisionSelectEl.className = 'bim-measure-settings-select';\n this.precisionSelectEl.appendChild(this.makePrecisionOption(0));\n this.precisionSelectEl.appendChild(this.makePrecisionOption(1));\n this.precisionSelectEl.appendChild(this.makePrecisionOption(2));\n this.precisionSelectEl.appendChild(this.makePrecisionOption(3));\n precisionRow.appendChild(precisionLabel);\n precisionRow.appendChild(this.precisionSelectEl);\n box.appendChild(precisionRow);\n\n // 底部按钮\n const actions = document.createElement('div');\n actions.className = 'bim-measure-settings-actions';\n\n this.saveSettingsBtn = document.createElement('button');\n this.saveSettingsBtn.type = 'button';\n this.saveSettingsBtn.className = 'bim-measure-settings-save';\n this.saveSettingsBtn.addEventListener('click', () => {\n this.saveSettings();\n });\n\n this.cancelSettingsBtn = document.createElement('button');\n this.cancelSettingsBtn.type = 'button';\n this.cancelSettingsBtn.className = 'bim-measure-settings-cancel';\n this.cancelSettingsBtn.addEventListener('click', () => {\n this.cancelSettings();\n });\n\n actions.appendChild(this.saveSettingsBtn);\n actions.appendChild(this.cancelSettingsBtn);\n box.appendChild(actions);\n\n // 初次同步表单值\n this.syncSettingsFormFromConfig(this.config);\n\n return box;\n }\n\n private makeOption(unit: MeasureUnit): HTMLOptionElement {\n const opt = document.createElement('option');\n opt.value = unit;\n // 选项显示内容:直接显示单位字符串\n opt.textContent = unit;\n return opt;\n }\n\n private makePrecisionOption(precision: MeasurePrecision): HTMLOptionElement {\n const opt = document.createElement('option');\n opt.value = String(precision);\n // 显示:0 / 0.0 / 0.00 / 0.000\n opt.textContent = precision === 0 ? '0' : `0.${'0'.repeat(precision)}`;\n return opt;\n }\n\n /**\n * 进入设置视图:保存一份当前配置作为草稿基线\n */\n private enterSettingsView(): void {\n this.draftConfig = { ...this.config };\n this.view = 'settings';\n this.syncSettingsFormFromConfig(this.config);\n this.applyViewState();\n }\n\n /**\n * 保存设置:写入 config + 写缓存 + 返回主视图\n */\n private saveSettings(): void {\n const unit = (this.unitSelectEl.value as MeasureUnit) || this.config.unit;\n const precision = (Number(this.precisionSelectEl.value) as MeasurePrecision);\n const next: MeasureConfig = {\n unit,\n precision: this.isValidPrecision(precision) ? precision : this.config.precision\n };\n\n this.config = next;\n this.saveConfigToCache(next);\n this.draftConfig = null;\n this.view = 'main';\n this.applyViewState();\n\n // 配置变化会影响显示\n this.renderResult();\n\n // 高度变化(设置面板 -> 主面板)也需要通知外部\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n }\n\n /**\n * 取消设置:回滚到进入设置前的配置,并返回主视图\n */\n private cancelSettings(): void {\n if (this.draftConfig) {\n this.config = { ...this.draftConfig };\n }\n this.draftConfig = null;\n this.view = 'main';\n this.applyViewState();\n this.renderResult();\n\n // 高度变化(设置面板 -> 主面板)也需要通知外部\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n }\n\n private syncSettingsFormFromConfig(config: MeasureConfig): void {\n this.unitSelectEl.value = config.unit;\n this.precisionSelectEl.value = String(config.precision);\n }\n\n private applyViewState(): void {\n if (this.view === 'settings') {\n this.mainViewEl.style.display = 'none';\n // 注意:CSS 里 `.bim-measure-settings { display: none; }` 是默认隐藏\n // 因此这里必须显式设置为可见(否则会出现“进入设置页后什么都不显示”的问题)\n this.settingsViewEl.style.display = 'block';\n } else {\n // 显式恢复主视图显示(避免外部样式干扰)\n this.mainViewEl.style.display = 'block';\n this.settingsViewEl.style.display = 'none';\n }\n }\n\n /**\n * 从缓存读取配置\n * - 有缓存:返回解析后的配置\n * - 无缓存/解析失败:返回 null\n */\n private loadConfigFromCache(): MeasureConfig | null {\n try {\n const raw = localStorage.getItem(MeasurePanel.CONFIG_CACHE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Partial;\n if (!parsed || typeof parsed !== 'object') return null;\n\n const unit = parsed.unit;\n const precision = parsed.precision;\n\n if (!this.isValidUnit(unit) || !this.isValidPrecision(precision as number)) return null;\n\n return {\n unit,\n precision: precision as MeasurePrecision\n };\n } catch (_e) {\n // localStorage 可能被禁用或 JSON 格式不正确,直接忽略\n return null;\n }\n }\n\n /**\n * 写入缓存(localStorage)\n */\n private saveConfigToCache(config: MeasureConfig): void {\n try {\n localStorage.setItem(MeasurePanel.CONFIG_CACHE_KEY, JSON.stringify(config));\n } catch (_e) {\n // localStorage 可能被禁用:忽略即可,不影响功能\n }\n }\n\n private isValidUnit(unit: any): unit is MeasureUnit {\n return unit === 'm' || unit === 'cm' || unit === 'mm' || unit === 'km';\n }\n\n private isValidPrecision(precision: any): precision is MeasurePrecision {\n return precision === 0 || precision === 1 || precision === 2 || precision === 3;\n }\n\n /**\n * 应用“展开/收起”状态:默认只显示前 4 个按钮\n */\n private applyExpandedState(): void {\n let index = 0;\n for (const btn of this.toolButtons.values()) {\n // 默认展示前四个,其余根据展开状态显示/隐藏\n if (index >= 4) {\n btn.style.display = this.isExpanded ? '' : 'none';\n } else {\n btn.style.display = '';\n }\n index++;\n }\n\n // toggle 样式(旋转箭头)\n if (this.isExpanded) {\n this.toggleBtn.classList.add('is-expanded');\n } else {\n this.toggleBtn.classList.remove('is-expanded');\n }\n }\n\n /**\n * 应用“当前选中按钮”样式\n */\n private applyActiveModeState(): void {\n for (const [mode, btn] of this.toolButtons.entries()) {\n if (mode === this.activeMode) {\n btn.classList.add('is-active');\n } else {\n btn.classList.remove('is-active');\n }\n }\n }\n\n /**\n * 渲染结果区(根据 activeMode 从 result 里取对应字段)\n */\n private renderResult(): void {\n // 1) 根据模式决定结果区显示规则\n // 你给的规则:\n // - 距离:显示数值 + xyz\n // - 最小距离:只显示数值\n // - 角度:--°\n // - 标高:--m(固定 m)\n // - 体积:--mm³(单位随设置变动,即 unit³)\n // - 激光测距:不显示任何数值/xyz,只显示“激光测距”文字\n // - 坡度:--%\n // - 空间体积:--mm³(单位随设置变动,即 unit³)\n\n // 1.1) 主行:默认显示 label + value(数值/单位拆分)\n // 激光测距:只显示文字,因此隐藏 label/单位\n if (this.activeMode === 'laserDistance') {\n this.mainValueLabelEl.style.display = 'none';\n this.mainNumberEl.textContent = t(this.getModeI18nKey('laserDistance'));\n this.mainUnitEl.textContent = '';\n // 激光测距:你要求不使用黄色主数据\n this.mainNumberEl.classList.add('is-laser-text');\n } else {\n this.mainValueLabelEl.style.display = '';\n this.mainValueLabelEl.textContent = t(this.getModeValueLabelI18nKey(this.activeMode));\n const parts = this.formatMainValueParts(this.activeMode, this.result);\n this.mainNumberEl.textContent = parts.numberText;\n this.mainUnitEl.textContent = parts.unitText;\n // 其它模式:恢复黄色主数据\n this.mainNumberEl.classList.remove('is-laser-text');\n }\n\n // 1.2) XYZ:只有“距离”需要展示\n if (this.activeMode === 'distance') {\n this.xyzBoxEl.style.display = '';\n const xyz = this.result?.xyz;\n if (!xyz) {\n this.xyzXEl.textContent = '--';\n this.xyzYEl.textContent = '--';\n this.xyzZEl.textContent = '--';\n return;\n }\n this.xyzXEl.textContent = this.formatNumberWithPrecision(xyz.x, this.config.precision);\n this.xyzYEl.textContent = this.formatNumberWithPrecision(xyz.y, this.config.precision);\n this.xyzZEl.textContent = this.formatNumberWithPrecision(xyz.z, this.config.precision);\n return;\n }\n\n // 非 distance:隐藏 xyz\n this.xyzBoxEl.style.display = 'none';\n }\n\n /**\n * 获取模式名称的国际化 key\n */\n private getModeI18nKey(mode: MeasureMode): string {\n return `measure.modes.${mode}`;\n }\n\n /**\n * 获取“主值 label”的国际化 key(随模式变化)\n */\n private getModeValueLabelI18nKey(mode: MeasureMode): string {\n return `measure.labels.value.${mode}`;\n }\n\n // 注意:旧的 formatMainValue/formatWithFixedUnit 已被 formatMainValueParts 替代,\n // 以支持“数值与单位分色显示”和“无数据时仍展示单位”。\n\n /**\n * 基础数字格式化(按精度显示)\n */\n private formatNumberWithPrecision(value: number, precision: MeasurePrecision): string {\n // 你要求精度可选:0 / 0.0 / 0.00 / 0.000,因此这里不做 trim,严格按 toFixed 输出\n return value.toFixed(precision);\n }\n\n // 注意:旧的 formatLengthWithConfig 已被 formatLengthParts 替代。\n\n private convertMmToUnit(mm: number, unit: MeasureUnit): number {\n switch (unit) {\n case 'mm':\n return mm;\n case 'cm':\n return mm / 10;\n case 'm':\n return mm / 1000;\n case 'km':\n return mm / 1_000_000;\n default:\n return mm;\n }\n }\n\n private getUnitI18nKey(unit: MeasureUnit): string {\n return `measure.units.${unit}`;\n }\n\n // 注意:旧的 formatElevationFixedMeters / formatVolumeWithConfig 已被 formatMainValueParts 替代。\n\n private convertMm3ToUnit3(mm3: number, unit: MeasureUnit): number {\n // 先把 mm³ -> 对应 unit³\n // mm -> cm: /10,因此 mm³ -> cm³: /1000\n // mm -> m : /1000,因此 mm³ -> m³ : /1e9\n // mm -> km: /1e6,因此 mm³ -> km³: /1e18\n switch (unit) {\n case 'mm':\n return mm3;\n case 'cm':\n return mm3 / 1000;\n case 'm':\n return mm3 / 1_000_000_000;\n case 'km':\n return mm3 / 1_000_000_000_000_000_000;\n default:\n return mm3;\n }\n }\n\n /**\n * 主数据拆分:返回 { 数值文本, 单位文本 }\n * 规则:\n * - 没数据时:必须展示 `-- 单位`(而不是只展示 `--`)\n * - 单位随模式变化:\n * - 距离/最小距离:单位随设置变动\n * - 角度:°\n * - 标高:固定 m\n * - 体积/空间体积:单位³(随设置变动)\n * - 坡度:%\n */\n private formatMainValueParts(mode: MeasureMode, result: MeasureResult | null): { numberText: string; unitText: string } {\n if (mode === 'laserDistance') return { numberText: t(this.getModeI18nKey('laserDistance')), unitText: '' };\n\n // 没有数据:显示 `-- 单位`\n if (!result) {\n return this.getEmptyValuePartsByMode(mode);\n }\n\n switch (mode) {\n case 'distance':\n return this.formatLengthParts(result.distanceMm);\n case 'minDistance':\n return this.formatLengthParts(result.minDistanceMm);\n case 'angle':\n return this.formatFixedUnitParts(result.angleDeg, t('measure.units.deg'));\n case 'elevation':\n // 标高固定 m(外部注入值约定为 mm)\n return this.formatFixedUnitParts(\n result.elevationMm === undefined ? undefined : result.elevationMm / 1000,\n t('measure.units.m')\n );\n case 'volume':\n return this.formatVolumeParts(result.volumeM3);\n case 'slope':\n return this.formatFixedUnitParts(result.slopePercent, t('measure.units.percent'));\n case 'spaceVolume':\n return this.formatVolumeParts(result.spaceVolumeM3);\n default:\n return { numberText: '--', unitText: '' };\n }\n }\n\n private getEmptyValuePartsByMode(mode: MeasureMode): { numberText: string; unitText: string } {\n switch (mode) {\n case 'distance':\n case 'minDistance':\n return { numberText: '--', unitText: t(this.getUnitI18nKey(this.config.unit)) };\n case 'angle':\n return { numberText: '--', unitText: t('measure.units.deg') };\n case 'elevation':\n return { numberText: '--', unitText: t('measure.units.m') };\n case 'volume':\n case 'spaceVolume':\n return { numberText: '--', unitText: `${this.config.unit}³` };\n case 'slope':\n return { numberText: '--', unitText: t('measure.units.percent') };\n default:\n return { numberText: '--', unitText: '' };\n }\n }\n\n private formatFixedUnitParts(value: number | undefined, unitText: string): { numberText: string; unitText: string } {\n if (value === null || value === undefined || Number.isNaN(value)) {\n return { numberText: '--', unitText };\n }\n return { numberText: this.formatNumberWithPrecision(value, this.config.precision), unitText };\n }\n\n private formatLengthParts(valueMm: number | undefined): { numberText: string; unitText: string } {\n const unitText = t(this.getUnitI18nKey(this.config.unit));\n if (valueMm === null || valueMm === undefined || Number.isNaN(valueMm)) {\n return { numberText: '--', unitText };\n }\n const converted = this.convertMmToUnit(valueMm, this.config.unit);\n return { numberText: this.formatNumberWithPrecision(converted, this.config.precision), unitText };\n }\n\n private formatVolumeParts(valueMm3: number | undefined): { numberText: string; unitText: string } {\n const unitText = `${this.config.unit}³`;\n if (valueMm3 === null || valueMm3 === undefined || Number.isNaN(valueMm3)) {\n return { numberText: '--', unitText };\n }\n const converted = this.convertMm3ToUnit3(valueMm3, this.config.unit);\n return { numberText: this.formatNumberWithPrecision(converted, this.config.precision), unitText };\n }\n}\n\n\n","/**\n * 测量对话框管理器\n * 负责管理测量工具对话框的显示、隐藏和测量面板的交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { MeasurePanel } from '../components/measure-panel';\nimport type { MeasureConfig, MeasureMode, MeasureResult } from '../components/measure-panel/types';\n\n/**\n * 测量对话框管理器\n * 继承自 BaseDialogManager,提供测量工具的对话框管理功能\n */\nexport class MeasureDialogManager extends BaseDialogManager {\n /** 测量面板实例 */\n private panel: MeasurePanel | null = null;\n /** 测量配置(单位、精度等) */\n private config: MeasureConfig | null = null;\n\n /** 对话框唯一标识 */\n protected get dialogId(): string {\n return 'measure-dialog';\n }\n\n /** 对话框标题(国际化 key) */\n protected get dialogTitle(): string {\n return 'measure.dialogTitle';\n }\n\n /** 对话框宽度 */\n protected get dialogWidth(): number {\n return 250;\n }\n\n /**\n * 创建对话框内容\n * 初始化测量面板并设置回调\n */\n protected createContent(): HTMLElement {\n this.panel = new MeasurePanel({\n defaultMode: 'distance',\n defaultExpanded: false,\n onModeChange: (mode) => {\n console.log('[MeasureDialogManager] 当前测量方式已切换:', mode);\n this.registry.engine3d?.activateMeasure(mode);\n },\n onClearAll: () => {\n console.log('[MeasureDialogManager] 删除全部');\n this.registry.engine3d?.clearAllMeasures();\n },\n onSettings: () => {\n console.log('[MeasureDialogManager] 打开设置');\n },\n onExpandedChange: () => {\n this.dialog?.fitHeight(false);\n }\n });\n this.panel.init();\n this.config = this.panel.getConfig();\n\n const panelWrapper = document.createElement('div');\n panelWrapper.style.padding = '12px';\n panelWrapper.appendChild(this.panel.element);\n\n return panelWrapper;\n }\n\n /** 对话框创建后的回调,自适应高度 */\n protected onDialogCreated(): void {\n this.dialog?.fitHeight(false);\n }\n\n /** 对话框关闭时的回调,取消工具栏按钮激活状态 */\n protected onDialogClose(): void {\n this.registry.toolbar?.setBtnActive('measure', false);\n }\n\n /** 销毁前的清理,停用测量功能并销毁面板 */\n protected onBeforeDestroy(): void {\n if (this.registry.engine3d) {\n this.registry.engine3d.deactivateMeasure();\n }\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n\n /**\n * 获取当前激活的测量模式\n * @returns 当前测量模式,如 'distance'、'angle' 等\n */\n public getActiveMode(): MeasureMode | null {\n return this.panel ? this.panel.getActiveMode() : null;\n }\n\n /**\n * 切换测量模式\n * @param mode 目标测量模式\n */\n public switchMode(mode: MeasureMode): void {\n if (!this.panel) return;\n this.panel.switchMode(mode);\n }\n\n /**\n * 设置测量结果\n * @param result 测量结果对象\n */\n public setMeasureResult(result: MeasureResult | null): void {\n if (!this.panel) return;\n this.panel.setResult(result);\n }\n\n /**\n * 获取测量配置\n * @returns 测量配置副本\n */\n public getConfig(): MeasureConfig | null {\n if (this.panel) {\n this.config = this.panel.getConfig();\n }\n return this.config ? { ...this.config } : null;\n }\n\n /**\n * 设置测量配置\n * @param partial 部分配置\n * @param persist 是否持久化\n */\n public setConfig(partial: Partial, persist: boolean = true): void {\n if (this.panel) {\n this.panel.setConfig(partial, persist);\n this.config = this.panel.getConfig();\n this.dialog?.fitHeight(false);\n return;\n }\n\n const prev = this.config;\n const next: MeasureConfig = {\n unit: partial.unit ?? prev?.unit ?? 'mm',\n precision: partial.precision ?? prev?.precision ?? 2\n };\n this.config = next;\n }\n\n /** 清除所有测量结果 */\n public clearAll(): void {\n if (!this.panel) return;\n this.panel.clearAll();\n }\n\n /** 打开测量设置面板 */\n public openSettings(): void {\n if (!this.panel) return;\n this.panel.openSettings();\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { SectionPlanePanelOptions } from './types';\nimport { getIcon } from '../../utils/icon-manager';\n\n/**\n * 拾取面剖切面板组件\n * 包含三个操作按钮:隐藏、反向、重置\n */\nexport class SectionPlanePanel implements IBimComponent {\n public element: HTMLElement;\n private options: SectionPlanePanelOptions;\n\n // DOM 引用\n private hideBtn!: HTMLButtonElement;\n private reverseBtn!: HTMLButtonElement;\n private resetBtn!: HTMLButtonElement;\n private hideLabelEl!: HTMLElement;\n private reverseLabelEl!: HTMLElement;\n private resetLabelEl!: HTMLElement;\n\n // 订阅清理\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(options: SectionPlanePanelOptions = {}) {\n this.options = options;\n this.element = this.createDom();\n }\n\n /**\n * 初始化组件\n */\n public init(): void {\n // 订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 初始应用\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n }\n\n /**\n * 设置主题\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n }\n\n /**\n * 设置语言\n */\n public setLocales(): void {\n this.hideLabelEl.textContent = t('sectionPlane.actions.hide');\n this.reverseLabelEl.textContent = t('sectionPlane.actions.reverse');\n this.resetLabelEl.textContent = t('sectionPlane.actions.reset');\n\n this.hideBtn.title = t('sectionPlane.actions.hide');\n this.reverseBtn.title = t('sectionPlane.actions.reverse');\n this.resetBtn.title = t('sectionPlane.actions.reset');\n }\n\n /**\n * 销毁组件\n */\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.element.remove();\n }\n\n /**\n * 创建 DOM\n */\n private createDom(): HTMLElement {\n const root = document.createElement('div');\n root.className = 'section-plane-panel';\n\n // 隐藏按钮\n this.hideBtn = this.createButton(\n 'hide',\n getIcon('隐藏'),\n () => {\n if (this.options.onHide) {\n this.options.onHide();\n }\n }\n );\n\n // 反向按钮\n this.reverseBtn = this.createButton(\n 'reverse',\n getIcon('反向'),\n () => {\n if (this.options.onReverse) {\n this.options.onReverse();\n }\n }\n );\n\n // 重置按钮\n this.resetBtn = this.createButton(\n 'reset',\n getIcon('重置'),\n () => {\n if (this.options.onReset) {\n this.options.onReset();\n }\n }\n );\n\n root.appendChild(this.hideBtn);\n root.appendChild(this.reverseBtn);\n root.appendChild(this.resetBtn);\n\n return root;\n }\n\n /**\n * 创建按钮\n */\n private createButton(type: 'hide' | 'reverse' | 'reset', iconSvg: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'section-plane-btn';\n\n // 图标\n const icon = document.createElement('div');\n icon.className = 'section-plane-btn-icon';\n icon.innerHTML = iconSvg;\n btn.appendChild(icon);\n\n // 标签\n const label = document.createElement('div');\n label.className = 'section-plane-btn-label';\n btn.appendChild(label);\n\n // 保存 label 引用\n if (type === 'hide') {\n this.hideLabelEl = label;\n } else if (type === 'reverse') {\n this.reverseLabelEl = label;\n } else {\n this.resetLabelEl = label;\n }\n\n // 点击事件\n btn.addEventListener('click', onClick);\n\n return btn;\n }\n}\n","/**\n * 拾取面剖切对话框管理器\n * 负责管理拾取面剖切工具对话框的显示和交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { SectionPlanePanel } from '../components/section-plane-panel';\n\n/**\n * 拾取面剖切对话框管理器\n * 继承自 BaseDialogManager,提供拾取面剖切功能的对话框管理\n */\nexport class SectionPlaneDialogManager extends BaseDialogManager {\n /** 剖切面板实例 */\n private panel: SectionPlanePanel | null = null;\n\n /** 对话框唯一标识 */\n protected get dialogId() { return 'section-plane-dialog'; }\n /** 对话框标题(国际化 key) */\n protected get dialogTitle() { return 'sectionPlane.dialogTitle'; }\n /** 对话框宽度 */\n protected get dialogWidth() { return 240; }\n /** 对话框高度 */\n protected get dialogHeight(): number { return 120; }\n\n /** 初始化 */\n public init(): void {}\n\n /**\n * 获取对话框位置\n * 定位在容器右下角\n */\n protected getDialogPosition() {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const paddingRight = 20;\n const paddingBottom = 50;\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n\n return {\n x: containerWidth - this.dialogWidth - paddingRight,\n y: containerHeight - this.dialogHeight - paddingBottom\n };\n }\n\n /** 创建对话框内容 */\n protected createContent(): HTMLElement {\n this.panel = new SectionPlanePanel({\n onHide: () => {\n console.log('[SectionPlaneDialogManager] 隐藏');\n },\n onReverse: () => {\n console.log('[SectionPlaneDialogManager] 反向');\n },\n onReset: () => {\n console.log('[SectionPlaneDialogManager] 重置');\n }\n });\n this.panel.init();\n return this.panel.element;\n }\n\n /** 对话框关闭时的回调 */\n protected onDialogClose(): void {\n this.registry.toolbar?.setBtnActive('section-plane', false);\n }\n\n /** 销毁前的清理 */\n protected onBeforeDestroy(): void {\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { SectionAxisPanelOptions, SectionAxis } from './types';\nimport { getIcon } from '../../utils/icon-manager';\n\n/**\n * 轴向剖切面板组件\n * 第一行:隐藏(toggle)、反向\n * 第二行:X、Y、Z(互斥按钮组)\n */\nexport class SectionAxisPanel implements IBimComponent {\n public element: HTMLElement;\n private options: SectionAxisPanelOptions;\n\n // 状态\n private isHidden: boolean = false;\n private activeAxis: SectionAxis = 'x';\n\n // DOM 引用 - 第一行\n private hideBtn!: HTMLButtonElement;\n private reverseBtn!: HTMLButtonElement;\n private hideLabelEl!: HTMLElement;\n private reverseLabelEl!: HTMLElement;\n\n // DOM 引用 - 第二行\n private axisXBtn!: HTMLButtonElement;\n private axisYBtn!: HTMLButtonElement;\n private axisZBtn!: HTMLButtonElement;\n\n // 订阅清理\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(options: SectionAxisPanelOptions = {}) {\n this.options = options;\n this.isHidden = options.defaultHidden ?? false;\n this.activeAxis = options.defaultAxis ?? 'x';\n this.element = this.createDom();\n }\n\n /**\n * 初始化组件\n */\n public init(): void {\n // 订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 初始应用\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n\n // 初始化按钮状态\n this.updateHideButtonState();\n this.updateAxisButtonsState();\n }\n\n /**\n * 设置主题\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-divider', theme.divider ?? '#334155');\n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n }\n\n /**\n * 设置语言\n */\n public setLocales(): void {\n this.hideLabelEl.textContent = t('sectionAxis.actions.hide');\n this.reverseLabelEl.textContent = t('sectionAxis.actions.reverse');\n // XYZ按钮的文字不需要国际化,保持为单个字母\n\n this.hideBtn.title = t('sectionAxis.actions.hide');\n this.reverseBtn.title = t('sectionAxis.actions.reverse');\n this.axisXBtn.title = t('sectionAxis.actions.axisX');\n this.axisYBtn.title = t('sectionAxis.actions.axisY');\n this.axisZBtn.title = t('sectionAxis.actions.axisZ');\n }\n\n /**\n * 设置隐藏状态\n */\n public setHiddenState(isHidden: boolean): void {\n this.isHidden = isHidden;\n this.updateHideButtonState();\n }\n\n /**\n * 获取隐藏状态\n */\n public getHiddenState(): boolean {\n return this.isHidden;\n }\n\n /**\n * 设置激活的轴向\n */\n public setActiveAxis(axis: SectionAxis): void {\n this.activeAxis = axis;\n this.updateAxisButtonsState();\n }\n\n /**\n * 获取激活的轴向\n */\n public getActiveAxis(): SectionAxis {\n return this.activeAxis;\n }\n\n /**\n * 销毁组件\n */\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.element.remove();\n }\n\n /**\n * 创建 DOM\n */\n private createDom(): HTMLElement {\n const root = document.createElement('div');\n root.className = 'section-axis-panel';\n\n // 第一行:隐藏、反向\n const row1 = document.createElement('div');\n row1.className = 'section-axis-row-1';\n\n this.hideBtn = this.createButton(\n 'hide',\n getIcon('隐藏'),\n () => this.handleHideToggle()\n );\n\n this.reverseBtn = this.createButton(\n 'reverse',\n getIcon('反向'),\n () => this.handleReverse()\n );\n\n row1.appendChild(this.hideBtn);\n row1.appendChild(this.reverseBtn);\n\n // 第二行:X、Y、Z\n const row2 = document.createElement('div');\n row2.className = 'section-axis-row-2';\n\n this.axisXBtn = this.createAxisButton('axisX', 'X', () => this.handleAxisChange('x'));\n this.axisYBtn = this.createAxisButton('axisY', 'Y', () => this.handleAxisChange('y'));\n this.axisZBtn = this.createAxisButton('axisZ', 'Z', () => this.handleAxisChange('z'));\n\n row2.appendChild(this.axisXBtn);\n row2.appendChild(this.axisYBtn);\n row2.appendChild(this.axisZBtn);\n\n root.appendChild(row1);\n root.appendChild(row2);\n\n return root;\n }\n\n /**\n * 创建按钮(带图标)\n */\n private createButton(\n type: 'hide' | 'reverse',\n iconSvg: string,\n onClick: () => void\n ): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'section-axis-btn';\n\n // 图标\n const icon = document.createElement('div');\n icon.className = 'section-axis-btn-icon';\n icon.innerHTML = iconSvg;\n btn.appendChild(icon);\n\n // 标签\n const label = document.createElement('div');\n label.className = 'section-axis-btn-label';\n btn.appendChild(label);\n\n // 保存 label 引用\n if (type === 'hide') {\n this.hideLabelEl = label;\n } else if (type === 'reverse') {\n this.reverseLabelEl = label;\n }\n\n // 点击事件\n btn.addEventListener('click', onClick);\n\n return btn;\n }\n\n /**\n * 创建轴向按钮(仅文字)\n */\n private createAxisButton(\n _type: 'axisX' | 'axisY' | 'axisZ',\n text: string,\n onClick: () => void\n ): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'section-axis-btn section-axis-btn-text';\n\n // 文字标签(既是图标也是标签)\n const label = document.createElement('div');\n label.className = 'section-axis-btn-label';\n label.textContent = text;\n btn.appendChild(label);\n\n // 点击事件\n btn.addEventListener('click', onClick);\n\n return btn;\n }\n\n /**\n * 处理隐藏按钮切换\n */\n private handleHideToggle(): void {\n this.isHidden = !this.isHidden;\n this.updateHideButtonState();\n\n if (this.options.onHideToggle) {\n this.options.onHideToggle(this.isHidden);\n }\n }\n\n /**\n * 处理反向按钮点击\n */\n private handleReverse(): void {\n if (this.options.onReverse) {\n this.options.onReverse();\n }\n }\n\n /**\n * 处理轴向切换\n */\n private handleAxisChange(axis: SectionAxis): void {\n if (this.activeAxis === axis) {\n return; // 已经是激活状态,不重复触发\n }\n\n this.activeAxis = axis;\n this.updateAxisButtonsState();\n\n if (this.options.onAxisChange) {\n this.options.onAxisChange(axis);\n }\n }\n\n /**\n * 更新隐藏按钮状态\n */\n private updateHideButtonState(): void {\n if (this.isHidden) {\n this.hideBtn.classList.add('active');\n } else {\n this.hideBtn.classList.remove('active');\n }\n }\n\n /**\n * 更新轴向按钮状态\n */\n private updateAxisButtonsState(): void {\n this.axisXBtn.classList.toggle('active', this.activeAxis === 'x');\n this.axisYBtn.classList.toggle('active', this.activeAxis === 'y');\n this.axisZBtn.classList.toggle('active', this.activeAxis === 'z');\n }\n}\n","/**\n * 轴向剖切对话框管理器\n * 负责管理轴向剖切工具对话框的显示、隐藏和剖切面板的交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { SectionAxisPanel } from '../components/section-axis-panel';\nimport type { SectionAxis } from '../components/section-axis-panel/types';\n\n/**\n * 轴向剖切对话框管理器\n * 继承自 BaseDialogManager,提供 X/Y/Z 轴向剖切的对话框管理功能\n */\nexport class SectionAxisDialogManager extends BaseDialogManager {\n /** 轴向剖切面板实例 */\n private panel: SectionAxisPanel | null = null;\n\n /** 对话框唯一标识 */\n protected get dialogId(): string {\n return 'section-axis-dialog';\n }\n\n /** 对话框标题(国际化 key) */\n protected get dialogTitle(): string {\n return 'sectionAxis.dialogTitle';\n }\n\n /** 对话框宽度 */\n protected get dialogWidth(): number {\n return 240;\n }\n\n /**\n * 获取对话框位置\n * 定位在容器右下角\n */\n protected getDialogPosition(): { x: number; y: number } {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n const paddingRight = 20;\n const paddingBottom = 50;\n\n return {\n x: containerWidth - this.dialogWidth - paddingRight,\n y: containerHeight - paddingBottom - 200\n };\n }\n\n /**\n * 创建对话框内容\n * 初始化轴向剖切面板并设置回调\n */\n protected createContent(): HTMLElement {\n this.panel = new SectionAxisPanel({\n defaultAxis: 'x',\n defaultHidden: false,\n onHideToggle: (isHidden) => {\n // 隐藏功能:第三方引擎无 API,仅输出日志\n console.log('[SectionAxisDialogManager] 隐藏切换(暂不支持):', isHidden);\n },\n onReverse: () => {\n // 反向功能:第三方引擎无 API,仅输出日志\n console.log('[SectionAxisDialogManager] 反向剖切(暂不支持)');\n },\n onAxisChange: (axis) => {\n console.log('[SectionAxisDialogManager] 切换轴向:', axis);\n this.registry.engine3d?.activateSectionAxis(axis);\n }\n });\n this.panel.init();\n return this.panel.element;\n }\n\n /** 对话框创建后的回调,自适应高度 */\n protected onDialogCreated(): void {\n this.dialog?.fitHeight(false);\n \n // 检查 Engine 是否已初始化\n if (!this.registry.engine3d) {\n console.error('[SectionAxisDialogManager] Engine not initialized. Call initEngine() first.');\n return;\n }\n \n // 自动激活默认轴向剖切(X轴)\n this.registry.engine3d.activateSectionAxis('x');\n }\n\n /** 对话框关闭时的回调,取消工具栏按钮激活状态 */\n protected onDialogClose(): void {\n this.registry.toolbar?.setBtnActive('section-axis', false);\n }\n\n /** 销毁前的清理,销毁面板实例 */\n protected onBeforeDestroy(): void {\n // 停用轴向剖切\n this.registry.engine3d?.deactivateSectionAxis();\n \n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n\n /**\n * 获取剖切面隐藏状态\n * @returns 是否隐藏\n */\n public getHiddenState(): boolean {\n return this.panel?.getHiddenState() ?? false;\n }\n\n /**\n * 设置剖切面隐藏状态\n * @param isHidden 是否隐藏\n */\n public setHiddenState(isHidden: boolean): void {\n this.panel?.setHiddenState(isHidden);\n }\n\n /**\n * 获取当前激活的剖切轴向\n * @returns 当前轴向 'x' | 'y' | 'z'\n */\n public getActiveAxis(): SectionAxis {\n return this.panel?.getActiveAxis() ?? 'x';\n }\n\n /**\n * 设置剖切轴向\n * @param axis 目标轴向\n */\n public setActiveAxis(axis: SectionAxis): void {\n this.panel?.setActiveAxis(axis);\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { SectionBoxPanelOptions, SectionBoxRange } from './types';\nimport { getIcon } from '../../utils/icon-manager';\n\nconst DEFAULT_RANGE: SectionBoxRange = {\n x: { min: 0, max: 100 },\n y: { min: 0, max: 100 },\n z: { min: 0, max: 100 }\n};\n\nexport class SectionBoxPanel implements IBimComponent {\n public element!: HTMLElement;\n private options: SectionBoxPanelOptions;\n\n private isHidden: boolean = false;\n private isReversed: boolean = false;\n private range: SectionBoxRange;\n\n private hideBtn!: HTMLButtonElement;\n private reverseBtn!: HTMLButtonElement;\n private fitBtn!: HTMLButtonElement;\n private resetBtn!: HTMLButtonElement;\n\n private hideLabelEl!: HTMLElement;\n private reverseLabelEl!: HTMLElement;\n private fitLabelEl!: HTMLElement;\n private resetLabelEl!: HTMLElement;\n private xLabelEl!: HTMLElement;\n private yLabelEl!: HTMLElement;\n private zLabelEl!: HTMLElement;\n\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n private xSlider!: HTMLElement;\n private ySlider!: HTMLElement;\n private zSlider!: HTMLElement;\n\n private xMinHandle!: HTMLElement;\n private xMaxHandle!: HTMLElement;\n private yMinHandle!: HTMLElement;\n private yMaxHandle!: HTMLElement;\n private zMinHandle!: HTMLElement;\n private zMaxHandle!: HTMLElement;\n\n private dragState: {\n isDragging: boolean;\n axis: 'x' | 'y' | 'z' | null;\n handleType: 'min' | 'max' | null;\n pointerId: number | null;\n } = {\n isDragging: false,\n axis: null,\n handleType: null,\n pointerId: null\n };\n\n constructor(options: SectionBoxPanelOptions = {}) {\n this.options = options;\n this.isHidden = options.defaultHidden ?? false;\n this.isReversed = options.defaultReversed ?? false;\n this.range = JSON.parse(JSON.stringify(options.defaultRange ?? DEFAULT_RANGE));\n }\n\n public init(): void {\n this.element = this.createPanel();\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n this.updateButtonStates();\n this.updateAllSlidersUI();\n this.setupDragListeners();\n }\n\n // --- Public APIs ---\n\n public setHiddenState(isHidden: boolean): void {\n this.isHidden = isHidden;\n this.updateButtonStates();\n }\n\n public getHiddenState(): boolean {\n return this.isHidden;\n }\n\n public setReversedState(isReversed: boolean): void {\n this.isReversed = isReversed;\n this.updateButtonStates();\n }\n\n public getReversedState(): boolean {\n return this.isReversed;\n }\n\n public setRange(range: Partial): void {\n if (range.x) this.range.x = { ...this.range.x, ...range.x };\n if (range.y) this.range.y = { ...this.range.y, ...range.y };\n if (range.z) this.range.z = { ...this.range.z, ...range.z };\n this.updateAllSlidersUI();\n }\n\n public getRange(): SectionBoxRange {\n return JSON.parse(JSON.stringify(this.range));\n }\n\n public reset(): void {\n this.isHidden = this.options.defaultHidden ?? false;\n this.isReversed = this.options.defaultReversed ?? false;\n this.range = JSON.parse(JSON.stringify(this.options.defaultRange ?? DEFAULT_RANGE));\n this.updateButtonStates();\n this.updateAllSlidersUI();\n this.options.onReset?.();\n this.options.onRangeChange?.(this.range);\n }\n\n // --- Private Setup ---\n\n private createPanel(): HTMLElement {\n const panel = document.createElement('div');\n panel.className = 'section-box-panel';\n\n const buttonsContainer = document.createElement('div');\n buttonsContainer.className = 'section-box-row-buttons';\n\n this.hideBtn = this.createButton('hide', t('sectionBox.actions.hide'), () => {\n this.isHidden = !this.isHidden;\n this.updateButtonStates();\n this.options.onHideToggle?.(this.isHidden);\n }, 'hide');\n\n this.reverseBtn = this.createButton('reverse', t('sectionBox.actions.reverse'), () => {\n this.isReversed = !this.isReversed;\n this.updateButtonStates();\n this.options.onReverseToggle?.(this.isReversed);\n }, 'reverse');\n\n this.fitBtn = this.createButton('fit', t('sectionBox.actions.fitToModel'), () => {\n this.options.onFitToModel?.();\n }, 'fit');\n\n this.resetBtn = this.createButton('reset', t('sectionBox.actions.reset'), () => this.reset(), 'reset');\n\n [this.hideBtn, this.reverseBtn, this.fitBtn, this.resetBtn].forEach(btn => buttonsContainer.appendChild(btn));\n\n const slidersContainer = document.createElement('div');\n slidersContainer.className = 'section-box-sliders';\n slidersContainer.addEventListener('pointerdown', (e) => e.stopPropagation());\n\n this.xSlider = this.createSlider('x', t('sectionBox.axes.x'));\n this.ySlider = this.createSlider('y', t('sectionBox.axes.y'));\n this.zSlider = this.createSlider('z', t('sectionBox.axes.z'));\n\n [this.xSlider, this.ySlider, this.zSlider].forEach(s => slidersContainer.appendChild(s));\n\n panel.appendChild(buttonsContainer);\n panel.appendChild(slidersContainer);\n return panel;\n }\n\n private createButton(type: string, label: string, onClick: () => void, ref?: string): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = 'section-box-btn';\n btn.title = label;\n\n const iconMap: Record = {\n hide: '隐藏',\n reverse: '反向',\n fit: '适应到模型',\n reset: '重置'\n };\n\n const icon = document.createElement('div');\n icon.className = 'section-box-btn-icon';\n icon.innerHTML = getIcon(iconMap[type] || type);\n\n const labelEl = document.createElement('div');\n labelEl.className = 'section-box-btn-label';\n labelEl.textContent = label;\n\n if (ref === 'hide') this.hideLabelEl = labelEl;\n else if (ref === 'reverse') this.reverseLabelEl = labelEl;\n else if (ref === 'fit') this.fitLabelEl = labelEl;\n else if (ref === 'reset') this.resetLabelEl = labelEl;\n\n btn.appendChild(icon);\n btn.appendChild(labelEl);\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n private createSlider(axis: 'x' | 'y' | 'z', label: string): HTMLElement {\n const slider = document.createElement('div');\n slider.className = 'section-box-slider';\n\n const labelEl = document.createElement('div');\n labelEl.className = 'section-box-slider-label';\n labelEl.textContent = label;\n if (axis === 'x') this.xLabelEl = labelEl;\n else if (axis === 'y') this.yLabelEl = labelEl;\n else this.zLabelEl = labelEl;\n\n const track = document.createElement('div');\n track.className = 'section-box-slider-track';\n\n const range = document.createElement('div');\n range.className = 'section-box-slider-range';\n\n const minHandle = document.createElement('div');\n minHandle.className = 'section-box-slider-handle';\n minHandle.setAttribute('data-axis', axis);\n minHandle.setAttribute('data-handle', 'min');\n\n const maxHandle = document.createElement('div');\n maxHandle.className = 'section-box-slider-handle';\n maxHandle.setAttribute('data-axis', axis);\n maxHandle.setAttribute('data-handle', 'max');\n\n track.append(range, minHandle, maxHandle);\n slider.append(labelEl, track);\n\n if (axis === 'x') { this.xMinHandle = minHandle; this.xMaxHandle = maxHandle; }\n else if (axis === 'y') { this.yMinHandle = minHandle; this.yMaxHandle = maxHandle; }\n else { this.zMinHandle = minHandle; this.zMaxHandle = maxHandle; }\n\n return slider;\n }\n\n private setupDragListeners(): void {\n const handles = [this.xMinHandle, this.xMaxHandle, this.yMinHandle, this.yMaxHandle, this.zMinHandle, this.zMaxHandle];\n\n handles.forEach(handle => {\n handle.addEventListener('pointerdown', (e: PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n // 核心锁定:确保后续所有移动事件都只发给这个手柄\n handle.setPointerCapture(e.pointerId);\n\n this.dragState = {\n isDragging: true,\n axis: handle.getAttribute('data-axis') as 'x' | 'y' | 'z',\n handleType: handle.getAttribute('data-handle') as 'min' | 'max',\n pointerId: e.pointerId\n };\n\n handle.classList.add('dragging');\n (handle.closest('.section-box-slider') as HTMLElement).style.zIndex = '100';\n });\n\n handle.addEventListener('pointermove', (e: PointerEvent) => {\n if (this.dragState.isDragging && this.dragState.pointerId === e.pointerId) {\n this.onDragging(e);\n }\n });\n\n const stop = (e: PointerEvent) => {\n if (this.dragState.isDragging && this.dragState.pointerId === e.pointerId) {\n handle.releasePointerCapture(e.pointerId);\n (handle.closest('.section-box-slider') as HTMLElement).style.zIndex = '';\n handle.classList.remove('dragging');\n this.dragState.isDragging = false;\n this.dragState.pointerId = null;\n }\n };\n\n handle.addEventListener('pointerup', stop);\n handle.addEventListener('pointercancel', stop);\n });\n }\n\n private onDragging(e: PointerEvent): void {\n const { axis, handleType } = this.dragState;\n if (!axis || !handleType) return;\n\n const sliderEl = axis === 'x' ? this.xSlider : (axis === 'y' ? this.ySlider : this.zSlider);\n const track = sliderEl.querySelector('.section-box-slider-track') as HTMLElement;\n const rect = track.getBoundingClientRect();\n\n let percentage = ((e.clientX - rect.left) / rect.width) * 100;\n percentage = Math.max(0, Math.min(100, percentage));\n\n const current = this.range[axis];\n if (handleType === 'min') {\n current.min = Math.min(percentage, current.max);\n } else {\n current.max = Math.max(percentage, current.min);\n }\n\n this.updateSliderUI(axis);\n this.options.onRangeChange?.(this.range);\n }\n\n private updateSliderUI(axis: 'x' | 'y' | 'z'): void {\n const range = this.range[axis];\n const minH = axis === 'x' ? this.xMinHandle : (axis === 'y' ? this.yMinHandle : this.zMinHandle);\n const maxH = axis === 'x' ? this.xMaxHandle : (axis === 'y' ? this.yMaxHandle : this.zMaxHandle);\n const slider = axis === 'x' ? this.xSlider : (axis === 'y' ? this.ySlider : this.zSlider);\n const rangeEl = slider.querySelector('.section-box-slider-range') as HTMLElement;\n\n minH.style.left = `${range.min}%`;\n maxH.style.left = `${range.max}%`;\n rangeEl.style.left = `${range.min}%`;\n rangeEl.style.width = `${range.max - range.min}%`;\n\n minH.setAttribute('data-value', Math.round(range.min).toString());\n maxH.setAttribute('data-value', Math.round(range.max).toString());\n }\n\n private updateAllSlidersUI(): void {\n ['x', 'y', 'z'].forEach((a: any) => this.updateSliderUI(a));\n }\n\n private updateButtonStates(): void {\n if (this.hideBtn) this.hideBtn.classList.toggle('active', this.isHidden);\n if (this.reverseBtn) this.reverseBtn.classList.toggle('active', this.isReversed);\n }\n\n public setLocales(): void {\n if (!this.hideLabelEl) return;\n this.hideLabelEl.textContent = t('sectionBox.actions.hide');\n this.reverseLabelEl.textContent = t('sectionBox.actions.reverse');\n this.fitLabelEl.textContent = t('sectionBox.actions.fitToModel');\n this.resetLabelEl.textContent = t('sectionBox.actions.reset');\n this.xLabelEl.textContent = t('sectionBox.axes.x');\n this.yLabelEl.textContent = t('sectionBox.axes.y');\n this.zLabelEl.textContent = t('sectionBox.axes.z');\n this.hideBtn.title = t('sectionBox.actions.hide');\n this.reverseBtn.title = t('sectionBox.actions.reverse');\n this.fitBtn.title = t('sectionBox.actions.fitToModel');\n this.resetBtn.title = t('sectionBox.actions.reset');\n }\n\n public setTheme(theme: ThemeConfig): void {\n if (!this.element) return;\n const style = this.element.style;\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-bg-elevated', theme.bgElevated ?? '#1f2d3e');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-divider', theme.divider ?? '#334155');\n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n }\n\n public destroy(): void {\n this.unsubscribeLocale?.();\n this.unsubscribeTheme?.();\n if (this.element && this.element.parentElement) {\n this.element.parentElement.removeChild(this.element);\n }\n }\n}","/**\n * 剖切盒对话框管理器\n * 负责管理剖切盒工具对话框的显示、隐藏和剖切盒面板的交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { SectionBoxPanel } from '../components/section-box-panel';\nimport type { SectionBoxRange } from '../components/section-box-panel/types';\n\n/**\n * 剖切盒对话框管理器\n * 继承自 BaseDialogManager,提供六面体剖切盒的对话框管理功能\n */\nexport class SectionBoxDialogManager extends BaseDialogManager {\n /** 剖切盒面板实例 */\n private panel: SectionBoxPanel | null = null;\n\n /** 对话框唯一标识 */\n protected get dialogId(): string {\n return 'section-box-dialog';\n }\n\n /** 对话框标题(国际化 key) */\n protected get dialogTitle(): string {\n return 'sectionBox.dialogTitle';\n }\n\n /** 对话框宽度 */\n protected get dialogWidth(): number {\n return 280;\n }\n\n /**\n * 获取对话框位置\n * 定位在容器右下角\n */\n protected getDialogPosition(): { x: number; y: number } {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n const paddingRight = 20;\n const paddingBottom = 50;\n\n return {\n x: containerWidth - this.dialogWidth - paddingRight,\n y: containerHeight - paddingBottom - 300\n };\n }\n\n /**\n * 创建对话框内容\n * 初始化剖切盒面板并设置回调\n */\n protected createContent(): HTMLElement {\n this.panel = new SectionBoxPanel({\n defaultHidden: false,\n defaultReversed: false,\n onHideToggle: (isHidden) => {\n // 底层暂不支持隐藏功能\n console.log('[SectionBoxDialogManager] 隐藏切换(底层暂不支持):', isHidden);\n },\n onReverseToggle: (isReversed) => {\n // 底层暂不支持反向功能\n console.log('[SectionBoxDialogManager] 反向切换(底层暂不支持):', isReversed);\n },\n onFitToModel: () => {\n this.registry.engine3d?.fitSectionBoxToModel();\n },\n onReset: () => {\n this.registry.engine3d?.resetSectionBox();\n },\n onRangeChange: (range) => {\n this.registry.engine3d?.setSectionBoxRange(range);\n }\n });\n this.panel.init();\n return this.panel.element;\n }\n\n /** 对话框创建后的回调,激活剖切盒并自适应高度 */\n protected onDialogCreated(): void {\n this.registry.engine3d?.activateSectionBox();\n this.dialog?.fitHeight(false);\n }\n\n /** 对话框关闭时的回调,取消工具栏按钮激活状态 */\n protected onDialogClose(): void {\n this.registry.toolbar?.setBtnActive('section-box', false);\n }\n\n /** 销毁前的清理,停用剖切盒并销毁面板实例 */\n protected onBeforeDestroy(): void {\n this.registry.engine3d?.deactivateSectionBox();\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n\n /**\n * 获取剖切盒隐藏状态\n * @returns 是否隐藏\n */\n public getHiddenState(): boolean {\n return this.panel?.getHiddenState() ?? false;\n }\n\n /**\n * 设置剖切盒隐藏状态\n * @param isHidden 是否隐藏\n */\n public setHiddenState(isHidden: boolean): void {\n this.panel?.setHiddenState(isHidden);\n }\n\n /**\n * 获取剖切盒反向状态\n * @returns 是否反向(显示盒内/盒外)\n */\n public getReversedState(): boolean {\n return this.panel?.getReversedState() ?? false;\n }\n\n /**\n * 设置剖切盒反向状态\n * @param isReversed 是否反向\n */\n public setReversedState(isReversed: boolean): void {\n this.panel?.setReversedState(isReversed);\n }\n\n /**\n * 获取剖切盒范围\n * @returns 六面体范围 { minX, maxX, minY, maxY, minZ, maxZ }\n */\n public getRange(): SectionBoxRange | null {\n return this.panel?.getRange() ?? null;\n }\n\n /**\n * 设置剖切盒范围\n * @param range 部分或全部范围值\n */\n public setRange(range: Partial): void {\n this.panel?.setRange(range);\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { WalkControlPanelOptions, WalkControlState, WalkControlMode, CharacterModel, WalkMode } from './types';\nimport { getIcon } from '../../utils/icon-manager';\n\nexport class WalkControlPanel implements IBimComponent {\n public element!: HTMLElement;\n private options: WalkControlPanelOptions;\n\n // 状态\n private state: WalkControlState = {\n mode: 'none',\n isPlanViewActive: false,\n speed: 1,\n gravity: false,\n collision: false,\n characterModel: 'construction-worker',\n walkMode: 'walk'\n };\n\n // DOM 引用 - 左侧按钮\n private planViewBtn!: HTMLButtonElement;\n private pathModeBtn!: HTMLButtonElement;\n private walkModeBtn!: HTMLButtonElement;\n\n // DOM 引用 - 中间设置区\n private settingsContainer!: HTMLElement;\n private speedControl!: HTMLElement;\n private speedDecreaseBtn!: HTMLButtonElement;\n private speedIncreaseBtn!: HTMLButtonElement;\n private speedDisplay!: HTMLElement;\n private gravityCheckbox!: HTMLInputElement;\n private gravityLabel!: HTMLElement;\n private collisionCheckbox!: HTMLInputElement;\n private collisionLabel!: HTMLElement;\n private characterModelSelect!: HTMLSelectElement;\n private characterModelLabel!: HTMLElement;\n private walkModeSelect!: HTMLSelectElement;\n private walkModeLabel!: HTMLElement;\n\n // DOM 引用 - 退出按钮\n private exitBtn!: HTMLButtonElement;\n\n // 国际化订阅\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(options: WalkControlPanelOptions = {}) {\n this.options = options;\n this.state.speed = options.defaultSpeed ?? 1;\n this.state.gravity = options.defaultGravity ?? false;\n this.state.collision = options.defaultCollision ?? false;\n this.state.characterModel = options.defaultCharacterModel ?? 'construction-worker';\n this.state.walkMode = options.defaultWalkMode ?? 'walk';\n }\n\n public init(): void {\n this.element = this.createPanel();\n this.updateSettingsView();\n\n // 订阅\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n }\n\n // --- 公共方法 ---\n\n public setPlanViewActive(active: boolean): void {\n this.state.isPlanViewActive = active;\n this.updateButtonStates();\n }\n\n public setPathModeActive(active: boolean): void {\n // 只有当前是路径模式时,取消才设置为 none\n // 避免在其他模式下被误设置为 none\n if (!active && this.state.mode !== 'path') {\n return;\n }\n const newMode: WalkControlMode = active ? 'path' : 'none';\n this.setMode(newMode);\n }\n\n public getState(): WalkControlState {\n return { ...this.state };\n }\n\n // --- 私有方法 ---\n\n private createPanel(): HTMLElement {\n const panel = document.createElement('div');\n panel.className = 'walk-control-panel';\n\n // 左侧按钮区\n const leftButtons = this.createLeftButtons();\n\n // 分割线1\n const divider1 = document.createElement('div');\n divider1.className = 'walk-divider';\n\n // 中间设置区\n this.settingsContainer = this.createSettingsContainer();\n\n // 分割线2\n const divider2 = document.createElement('div');\n divider2.className = 'walk-divider';\n\n // 右侧退出按钮\n const exitBtn = this.createExitButton();\n\n panel.appendChild(leftButtons);\n panel.appendChild(divider1);\n panel.appendChild(this.settingsContainer);\n panel.appendChild(divider2);\n panel.appendChild(exitBtn);\n\n return panel;\n }\n\n private createLeftButtons(): HTMLElement {\n const container = document.createElement('div');\n container.className = 'walk-control-left';\n\n this.planViewBtn = this.createIconButton('plan-view', () => {\n this.state.isPlanViewActive = !this.state.isPlanViewActive;\n this.updateButtonStates();\n this.options.onPlanViewToggle?.(this.state.isPlanViewActive);\n });\n\n this.pathModeBtn = this.createIconButton('path', () => {\n const newMode: WalkControlMode = this.state.mode === 'path' ? 'none' : 'path';\n this.setMode(newMode);\n this.options.onPathModeToggle?.(newMode === 'path');\n });\n\n this.walkModeBtn = this.createIconButton('walk', () => {\n const newMode: WalkControlMode = this.state.mode === 'walk' ? 'none' : 'walk';\n this.setMode(newMode);\n this.options.onWalkModeToggle?.(newMode === 'walk');\n });\n\n container.appendChild(this.planViewBtn);\n container.appendChild(this.pathModeBtn);\n container.appendChild(this.walkModeBtn);\n\n return container;\n }\n\n private createSettingsContainer(): HTMLElement {\n const container = document.createElement('div');\n container.className = 'walk-control-settings';\n\n // 移动速度控件\n this.speedControl = this.createSpeedControl();\n\n // 重力复选框\n const gravityWrapper = document.createElement('label');\n gravityWrapper.className = 'walk-checkbox-wrapper walk-checkbox-gravity';\n this.gravityCheckbox = document.createElement('input');\n this.gravityCheckbox.type = 'checkbox';\n this.gravityCheckbox.className = 'walk-checkbox';\n this.gravityCheckbox.checked = this.state.gravity;\n this.gravityCheckbox.addEventListener('change', () => {\n this.state.gravity = this.gravityCheckbox.checked;\n this.options.onGravityToggle?.(this.state.gravity);\n });\n this.gravityLabel = document.createElement('span');\n this.gravityLabel.className = 'walk-checkbox-label';\n gravityWrapper.appendChild(this.gravityCheckbox);\n gravityWrapper.appendChild(this.gravityLabel);\n\n // 碰撞复选框\n const collisionWrapper = document.createElement('label');\n collisionWrapper.className = 'walk-checkbox-wrapper walk-checkbox-collision';\n this.collisionCheckbox = document.createElement('input');\n this.collisionCheckbox.type = 'checkbox';\n this.collisionCheckbox.className = 'walk-checkbox';\n this.collisionCheckbox.checked = this.state.collision;\n this.collisionCheckbox.addEventListener('change', () => {\n this.state.collision = this.collisionCheckbox.checked;\n this.options.onCollisionToggle?.(this.state.collision);\n });\n this.collisionLabel = document.createElement('span');\n this.collisionLabel.className = 'walk-checkbox-label';\n collisionWrapper.appendChild(this.collisionCheckbox);\n collisionWrapper.appendChild(this.collisionLabel);\n\n // 角色模型选择\n const characterWrapper = document.createElement('div');\n characterWrapper.className = 'walk-select-wrapper walk-select-wrapper-character-model';\n this.characterModelLabel = document.createElement('label');\n this.characterModelLabel.className = 'walk-select-label';\n this.characterModelSelect = document.createElement('select');\n this.characterModelSelect.className = 'walk-select walk-select-character-model';\n this.characterModelSelect.addEventListener('change', () => {\n this.state.characterModel = this.characterModelSelect.value as CharacterModel;\n this.options.onCharacterModelChange?.(this.state.characterModel);\n });\n characterWrapper.appendChild(this.characterModelLabel);\n characterWrapper.appendChild(this.characterModelSelect);\n\n // 行走模式选择\n const walkModeWrapper = document.createElement('div');\n walkModeWrapper.className = 'walk-select-wrapper walk-select-wrapper-walk-mode';\n this.walkModeLabel = document.createElement('label');\n this.walkModeLabel.className = 'walk-select-label';\n this.walkModeSelect = document.createElement('select');\n this.walkModeSelect.className = 'walk-select walk-select-walk-mode';\n this.walkModeSelect.addEventListener('change', () => {\n this.state.walkMode = this.walkModeSelect.value as WalkMode;\n this.options.onWalkModeChange?.(this.state.walkMode);\n });\n walkModeWrapper.appendChild(this.walkModeLabel);\n walkModeWrapper.appendChild(this.walkModeSelect);\n\n // 添加所有控件\n // 注意:顺序为 速度、角色模型、行走模式、重力、碰撞\n // 这样在漫游模式下显示的顺序就是:角色模型、行走模式、重力、碰撞\n container.appendChild(this.speedControl);\n container.appendChild(characterWrapper);\n container.appendChild(walkModeWrapper);\n container.appendChild(gravityWrapper);\n container.appendChild(collisionWrapper);\n\n return container;\n }\n\n private createSpeedControl(): HTMLElement {\n const container = document.createElement('div');\n container.className = 'walk-speed-control';\n\n const label = document.createElement('label');\n label.className = 'walk-speed-label';\n label.textContent = t('walkControl.speed');\n\n const controlGroup = document.createElement('div');\n controlGroup.className = 'walk-speed-group';\n\n // 减速按钮\n this.speedDecreaseBtn = document.createElement('button');\n this.speedDecreaseBtn.className = 'walk-speed-btn';\n this.speedDecreaseBtn.textContent = '-';\n this.speedDecreaseBtn.addEventListener('click', () => {\n if (this.state.speed > 1) {\n this.state.speed--;\n this.updateSpeedDisplay();\n this.options.onSpeedChange?.(this.state.speed);\n }\n });\n\n // 速度显示\n this.speedDisplay = document.createElement('div');\n this.speedDisplay.className = 'walk-speed-display';\n this.speedDisplay.textContent = `${this.state.speed}X`;\n\n // 加速按钮\n this.speedIncreaseBtn = document.createElement('button');\n this.speedIncreaseBtn.className = 'walk-speed-btn';\n this.speedIncreaseBtn.textContent = '+';\n this.speedIncreaseBtn.addEventListener('click', () => {\n if (this.state.speed < 10) {\n this.state.speed++;\n this.updateSpeedDisplay();\n this.options.onSpeedChange?.(this.state.speed);\n }\n });\n\n controlGroup.appendChild(this.speedDecreaseBtn);\n controlGroup.appendChild(this.speedDisplay);\n controlGroup.appendChild(this.speedIncreaseBtn);\n\n container.appendChild(label);\n container.appendChild(controlGroup);\n\n return container;\n }\n\n private createIconButton(type: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = `walk-icon-btn walk-icon-btn-${type}`;\n btn.innerHTML = this.getIconSVG(type);\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n private createExitButton(): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = 'walk-exit-btn';\n btn.addEventListener('click', () => {\n this.options.onExit?.();\n });\n this.exitBtn = btn;\n return btn;\n }\n\n private setMode(mode: WalkControlMode): void {\n const oldMode = this.state.mode;\n\n // 如果从walk模式切换到其他模式,触发walk关闭事件\n if (oldMode === 'walk' && mode !== 'walk') {\n this.options.onWalkModeToggle?.(false);\n }\n\n // 如果从path模式切换到其他模式,触发path关闭事件\n if (oldMode === 'path' && mode !== 'path') {\n this.options.onPathModeToggle?.(false);\n }\n\n this.state.mode = mode;\n\n // 路径模式:禁用重力和碰撞\n if (mode === 'path') {\n this.state.gravity = false;\n this.state.collision = false;\n this.gravityCheckbox.checked = false;\n this.gravityCheckbox.disabled = true;\n this.collisionCheckbox.checked = false;\n this.collisionCheckbox.disabled = true;\n } else {\n this.gravityCheckbox.disabled = false;\n this.collisionCheckbox.disabled = false;\n }\n\n this.updateButtonStates();\n this.updateSettingsView();\n this.updateSpeedButtonStates();\n }\n\n private updateButtonStates(): void {\n // 平面图按钮\n this.planViewBtn.classList.toggle('active', this.state.isPlanViewActive);\n\n // 路径漫游按钮\n this.pathModeBtn.classList.toggle('active', this.state.mode === 'path');\n\n // 漫游按钮\n this.walkModeBtn.classList.toggle('active', this.state.mode === 'walk');\n }\n\n private updateSettingsView(): void {\n // 根据模式显示/隐藏不同的控件\n const speedWrapper = this.speedControl;\n const gravityWrapper = this.gravityCheckbox.parentElement!;\n const collisionWrapper = this.collisionCheckbox.parentElement!;\n const characterWrapper = this.characterModelSelect.parentElement!;\n const walkModeWrapper = this.walkModeSelect.parentElement!;\n\n if (this.state.mode === 'walk') {\n // 漫游模式:隐藏速度,显示模型、行走模式、重力、碰撞\n speedWrapper.style.display = 'none';\n gravityWrapper.style.display = 'flex';\n collisionWrapper.style.display = 'flex';\n characterWrapper.style.display = 'flex';\n walkModeWrapper.style.display = 'flex';\n } else {\n // 默认或路径模式:显示速度、重力、碰撞,隐藏模型和行走模式\n speedWrapper.style.display = 'flex';\n gravityWrapper.style.display = 'flex';\n collisionWrapper.style.display = 'flex';\n characterWrapper.style.display = 'none';\n walkModeWrapper.style.display = 'none';\n }\n }\n\n private updateSpeedDisplay(): void {\n this.speedDisplay.textContent = `${this.state.speed}X`;\n this.updateSpeedButtonStates();\n }\n\n private updateSpeedButtonStates(): void {\n this.speedDecreaseBtn.disabled = this.state.speed <= 1;\n this.speedIncreaseBtn.disabled = this.state.speed >= 10;\n }\n\n private getIconSVG(type: string): string {\n const icons: Record = {\n 'plan-view': getIcon('地图'),\n 'path': getIcon('路径漫游'),\n 'walk': getIcon('第一人称漫游')\n };\n return icons[type] || '';\n }\n\n public setLocales(): void {\n // 更新速度标签\n const speedLabel = this.speedControl.querySelector('.walk-speed-label');\n if (speedLabel) {\n speedLabel.textContent = t('walkControl.speed');\n }\n\n // 更新复选框标签\n this.gravityLabel.textContent = t('walkControl.gravity');\n this.collisionLabel.textContent = t('walkControl.collision');\n\n // 更新角色模型下拉框\n this.characterModelLabel.textContent = t('walkControl.characterModel.label');\n this.characterModelSelect.innerHTML = '';\n const constructionWorkerOption = document.createElement('option');\n constructionWorkerOption.value = 'construction-worker';\n constructionWorkerOption.textContent = t('walkControl.characterModel.constructionWorker');\n constructionWorkerOption.selected = this.state.characterModel === 'construction-worker';\n this.characterModelSelect.appendChild(constructionWorkerOption);\n\n const officeMaleOption = document.createElement('option');\n officeMaleOption.value = 'office-male';\n officeMaleOption.textContent = t('walkControl.characterModel.officeMale');\n officeMaleOption.selected = this.state.characterModel === 'office-male';\n this.characterModelSelect.appendChild(officeMaleOption);\n\n // 更新行走模式下拉框\n this.walkModeLabel.textContent = t('walkControl.walkMode.label');\n this.walkModeSelect.innerHTML = '';\n const walkOption = document.createElement('option');\n walkOption.value = 'walk';\n walkOption.textContent = t('walkControl.walkMode.walk');\n walkOption.selected = this.state.walkMode === 'walk';\n this.walkModeSelect.appendChild(walkOption);\n\n const runOption = document.createElement('option');\n runOption.value = 'run';\n runOption.textContent = t('walkControl.walkMode.run');\n runOption.selected = this.state.walkMode === 'run';\n this.walkModeSelect.appendChild(runOption);\n\n // 更新退出按钮\n this.exitBtn.textContent = t('walkControl.exit');\n }\n\n public setTheme(theme: ThemeConfig): void {\n if (!this.element) return;\n const style = this.element.style;\n \n style.setProperty('--bim-bg-base', theme.bgBase ?? '#152232');\n style.setProperty('--bim-bg-elevated', theme.bgElevated ?? '#1f2d3e');\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-border-subtle', theme.borderSubtle ?? '#1e293b');\n style.setProperty('--bim-divider', theme.divider ?? '#334155');\n style.setProperty('--bim-shadow-xl', theme.shadowXl ?? '0 20px 40px rgba(0, 0, 0, 0.3)');\n \n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-hover', theme.primaryHover ?? '#60a5fa');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n \n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-text-inverse', theme.textInverse ?? '#152232');\n \n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n \n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n style.setProperty('--bim-component-bg-active', theme.componentBgActive ?? 'rgba(248, 250, 252, 0.1)');\n }\n\n public destroy(): void {\n this.unsubscribeLocale?.();\n this.unsubscribeTheme?.();\n if (this.element && this.element.parentElement) {\n this.element.parentElement.removeChild(this.element);\n }\n }\n}\n","import type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\n\n/**\n * 路径漫游面板组件(暂时空内容)\n */\nexport class WalkPathPanel implements IBimComponent {\n public element!: HTMLElement;\n\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor() {\n // 暂时无配置\n }\n\n public init(): void {\n this.element = this.createPanel();\n\n // 订阅\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n }\n\n private createPanel(): HTMLElement {\n const panel = document.createElement('div');\n panel.className = 'walk-path-panel';\n panel.style.padding = '20px';\n panel.style.color = 'var(--bim-text-color, #fff)';\n panel.textContent = '路径漫游内容待实现';\n return panel;\n }\n\n public setLocales(): void {\n // 更新文本\n }\n\n public setTheme(_theme: ThemeConfig): void {\n // 应用主题\n }\n\n public destroy(): void {\n this.unsubscribeLocale?.();\n this.unsubscribeTheme?.();\n if (this.element && this.element.parentElement) {\n this.element.parentElement.removeChild(this.element);\n }\n }\n}\n","/**\n * 漫游路径对话框管理器\n * 负责管理漫游路径设置对话框的显示和交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { WalkPathPanel } from '../components/walk-path-panel';\n\n/**\n * 漫游路径对话框管理器\n * 继承自 BaseDialogManager,提供漫游路径配置的对话框管理功能\n */\nexport class WalkPathDialogManager extends BaseDialogManager {\n /** 漫游路径面板实例 */\n private panel: WalkPathPanel | null = null;\n\n /** 对话框唯一标识 */\n protected get dialogId() { return 'walk-path-dialog'; }\n /** 对话框标题(国际化 key) */\n protected get dialogTitle() { return 'walkControl.path.dialogTitle'; }\n /** 对话框宽度 */\n protected get dialogWidth() { return 300; }\n /** 对话框高度 */\n protected get dialogHeight(): number { return 400; }\n\n /** 初始化 */\n public init(): void {}\n\n /**\n * 获取对话框位置\n * 定位在容器右侧居中\n */\n protected getDialogPosition() {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const paddingRight = 20;\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n\n return {\n x: containerWidth - this.dialogWidth - paddingRight,\n y: (containerHeight - this.dialogHeight) / 2\n };\n }\n\n /** 创建对话框内容 */\n protected createContent(): HTMLElement {\n this.panel = new WalkPathPanel();\n this.panel.init();\n return this.panel.element;\n }\n\n /** 对话框关闭时的回调 */\n protected onDialogClose(): void {\n if (this.registry.walkControl && this.registry.walkControl.panel) {\n this.registry.walkControl.panel.setPathModeActive(false);\n }\n }\n\n /** 销毁前的清理 */\n protected onBeforeDestroy(): void {\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n}\n","/**\n * 漫游控制管理器\n * 负责管理漫游模式的控制面板和相关交互\n */\nimport { BaseManager } from '../core/base-manager';\nimport { WalkControlPanel } from '../components/walk-control-panel';\nimport { WalkPathDialogManager } from './walk-path-dialog-manager';\n\n/**\n * 漫游控制管理器\n * 提供第一人称漫游、路径漫游等功能的控制界面\n */\nexport class WalkControlManager extends BaseManager {\n /** 漫游控制面板实例 */\n public panel: WalkControlPanel | null = null;\n /** 路径漫游对话框管理器 */\n private pathManager: WalkPathDialogManager | null = null;\n\n constructor() {\n super();\n }\n\n /** 初始化管理器 */\n public init(): void {\n this.pathManager = new WalkPathDialogManager();\n this.pathManager.init();\n }\n\n /** 显示漫游控制面板 */\n public show(): void {\n if (!this.registry.toolbar) {\n console.warn('Toolbar not initialized');\n return;\n }\n\n this.registry.toolbar.hide();\n\n // 打开漫游面板时,默认激活第一人称模式\n console.log('[WalkControl] 打开漫游面板,激活第一人称模式');\n this.registry.engine3d?.activateFirstPersonMode();\n\n this.panel = new WalkControlPanel({\n onPlanViewToggle: (isActive) => {\n console.log('[WalkControl] 地图:', isActive);\n if (isActive) {\n this.registry.map?.show();\n } else {\n this.registry.map?.hide();\n }\n this.emit('walk:plan-view-toggle', { isActive });\n },\n onPathModeToggle: (isActive) => {\n console.log('[WalkControl] 路径漫游:', isActive);\n if (isActive) {\n this.pathManager?.show();\n } else {\n this.pathManager?.hide();\n }\n this.emit('walk:path-mode-toggle', { isActive });\n },\n onWalkModeToggle: (isActive) => {\n console.log('[WalkControl] 第三人称漫游按钮点击:', isActive);\n if (isActive) {\n this.pathManager?.hide();\n alert('第三人称功能开发中');\n }\n this.emit('walk:walk-mode-toggle', { isActive });\n },\n onSpeedChange: (speed) => {\n console.log('[WalkControl] 速度变化:', speed);\n const engineSpeed = speed * 0.1;\n this.registry.engine3d?.setWalkSpeed(engineSpeed);\n this.emit('walk:speed-change', { speed });\n },\n onGravityToggle: (enabled) => {\n console.log('[WalkControl] 重力:', enabled);\n this.registry.engine3d?.setWalkGravity(enabled);\n this.emit('walk:gravity-toggle', { enabled });\n },\n onCollisionToggle: (enabled) => {\n console.log('[WalkControl] 碰撞:', enabled);\n this.registry.engine3d?.setWalkCollision(enabled);\n this.emit('walk:collision-toggle', { enabled });\n },\n onCharacterModelChange: (model) => {\n console.log('[WalkControl] 角色模型:', model);\n },\n onWalkModeChange: (mode) => {\n console.log('[WalkControl] 行走模式:', mode);\n },\n onExit: () => {\n this.hide();\n }\n });\n this.panel.init();\n\n if (this.registry.map?.isOpen()) {\n this.panel.setPlanViewActive(true);\n }\n\n this.subscribe('map:opened', () => {\n this.panel?.setPlanViewActive(true);\n });\n\n this.subscribe('map:closed', () => {\n this.panel?.setPlanViewActive(false);\n });\n\n if (this.registry.container) {\n this.panel.element.style.position = 'absolute';\n this.panel.element.style.bottom = '20px';\n this.panel.element.style.left = '50%';\n this.panel.element.style.transform = 'translateX(-50%)';\n this.panel.element.style.zIndex = '1000';\n\n this.registry.container.appendChild(this.panel.element);\n } else {\n console.warn('[WalkControlManager] Container not found');\n }\n }\n\n /** 隐藏漫游控制面板 */\n public hide(): void {\n this.pathManager?.hide();\n\n console.log('[WalkControl] 关闭漫游面板,退出第一人称模式');\n this.registry.engine3d?.deactivateFirstPersonMode();\n\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n\n if (this.registry.toolbar) {\n this.registry.toolbar.show();\n }\n }\n\n /** 销毁管理器 */\n public destroy(): void {\n this.hide();\n this.pathManager?.destroy();\n this.pathManager = null;\n super.destroy();\n }\n}\n","import type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\n\n/**\n * 地图面板组件\n */\nexport class MapPanel implements IBimComponent {\n public element!: HTMLElement;\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor() {}\n\n public init(): void {\n this.element = this.createPanel();\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n }\n\n private createPanel(): HTMLElement {\n const panel = document.createElement('div');\n panel.className = 'map-panel';\n panel.style.padding = '20px';\n panel.style.color = '#fff';\n panel.textContent = '地图内容待实现';\n return panel;\n }\n\n public setLocales(): void {\n // 更新文本\n }\n\n public setTheme(_theme: ThemeConfig): void {\n // 应用主题\n }\n\n public destroy(): void {\n this.unsubscribeLocale?.();\n this.unsubscribeTheme?.();\n if (this.element && this.element.parentElement) {\n this.element.parentElement.removeChild(this.element);\n }\n }\n}\n","/**\n * 地图对话框管理器\n * 负责管理地图/平面图对话框的显示和交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { MapPanel } from '../components/map-panel';\n\n/**\n * 地图对话框管理器\n * 继承自 BaseDialogManager,提供地图面板的对话框管理功能\n */\nexport class MapDialogManager extends BaseDialogManager {\n /** 地图面板实例 */\n private panel: MapPanel | null = null;\n\n /** 对话框唯一标识 */\n protected get dialogId() { return 'map-dialog'; }\n /** 对话框标题(国际化 key) */\n protected get dialogTitle() { return 'map.dialogTitle'; }\n /** 对话框宽度 */\n protected get dialogWidth() { return 300; }\n /** 对话框高度 */\n protected get dialogHeight(): number { return 400; }\n\n /** 初始化 */\n public init(): void {}\n\n /**\n * 获取对话框位置\n * 定位在容器左下角\n */\n protected getDialogPosition() {\n const container = this.registry.container;\n if (!container) return { x: 20, y: 100 };\n\n const paddingLeft = 20;\n const paddingBottom = 20;\n const containerHeight = container.clientHeight;\n\n return {\n x: paddingLeft,\n y: containerHeight - this.dialogHeight - paddingBottom\n };\n }\n\n /** 创建对话框内容 */\n protected createContent(): HTMLElement {\n this.panel = new MapPanel();\n this.panel.init();\n return this.panel.element;\n }\n\n /** 对话框创建后的回调 */\n protected onDialogCreated(): void {\n this.emit('map:opened', {});\n }\n\n /** 对话框关闭时的回调 */\n protected onDialogClose(): void {\n this.emit('map:closed', {});\n }\n\n /** 销毁前的清理 */\n protected onBeforeDestroy(): void {\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n\n /** 隐藏对话框 */\n public hide(): void {\n super.hide();\n this.emit('map:closed', {});\n }\n}\n","import './bim-engine.css';\nimport { ToolbarManager } from './managers/toolbar-manager';\nimport { ButtonGroupManager } from './managers/button-group-manager';\nimport { DialogManager } from './managers/dialog-manager';\nimport { EngineManager } from './managers/engine-manager';\nimport { RightKeyManager } from './managers/right-key-manager';\nimport { ConstructTreeManagerBtn } from './managers/construct-tree-manager-btn';\nimport { PropertyPanelManager } from './managers/property-panel-manager';\nimport { MeasureDialogManager } from './managers/measure-dialog-manager';\nimport { SectionPlaneDialogManager } from './managers/section-plane-dialog-manager';\nimport { SectionAxisDialogManager } from './managers/section-axis-dialog-manager';\nimport { SectionBoxDialogManager } from './managers/section-box-dialog-manager';\nimport { WalkControlManager } from './managers/walk-control-manager';\nimport { MapDialogManager } from './managers/map-dialog-manager';\nimport type { EngineOptions, ModelLoadOptions } from './components/engine';\nimport { localeManager } from './services/locale';\nimport { themeManager } from './services/theme';\nimport type { LocaleType } from './locales/types';\nimport type { ThemeType, ThemeConfig } from './themes/types';\nimport { ManagerRegistry } from './core/manager-registry';\nimport { EngineEvents } from './types/events';\n\nexport type { EngineOptions, ModelLoadOptions };\n\nexport class BimEngine {\n public container: HTMLElement;\n private wrapper: HTMLElement | null = null;\n private registry: ManagerRegistry;\n\n public toolbar: ToolbarManager | null = null;\n public constructTreeBtn: ConstructTreeManagerBtn | null = null;\n public buttonGroup: ButtonGroupManager | null = null;\n public dialog: DialogManager | null = null;\n public engine: EngineManager | null = null;\n public rightKey: RightKeyManager | null = null;\n public propertyPanel: PropertyPanelManager | null = null;\n public measure: MeasureDialogManager | null = null;\n public sectionPlane: SectionPlaneDialogManager | null = null;\n public sectionAxis: SectionAxisDialogManager | null = null;\n public sectionBox: SectionBoxDialogManager | null = null;\n public walkControl: WalkControlManager | null = null;\n public map: MapDialogManager | null = null;\n\n constructor(\n container: HTMLElement | string,\n options?: {\n locale?: LocaleType;\n theme?: ThemeType;\n }\n ) {\n const el = typeof container === 'string' ? document.getElementById(container) : container;\n if (!el) throw new Error('Container not found');\n this.container = el;\n\n this.registry = ManagerRegistry.getInstance();\n\n if (options?.locale) localeManager.setLocale(options.locale);\n if (options?.theme) {\n if (options.theme === 'custom') {\n console.warn('Custom theme should be set via setCustomTheme().');\n } else {\n themeManager.setTheme(options.theme);\n }\n }\n\n this.init();\n }\n\n public emit(event: K, payload: EngineEvents[K]) {\n this.registry.emit(event, payload);\n }\n\n public on(event: K, listener: (payload: EngineEvents[K]) => void): () => void {\n return this.registry.on(event, listener);\n }\n\n public setLocale(locale: LocaleType) {\n localeManager.setLocale(locale);\n }\n\n public getLocale(): LocaleType {\n return localeManager.getLocale();\n }\n\n public setTheme(theme: 'dark' | 'light') {\n themeManager.setTheme(theme);\n }\n\n public setCustomTheme(theme: ThemeConfig) {\n themeManager.setCustomTheme(theme);\n }\n\n private init() {\n this.container.innerHTML = '';\n this.wrapper = document.createElement('div');\n this.wrapper.className = 'bim-engine-wrapper';\n this.container.appendChild(this.wrapper);\n\n this.registry.container = this.container;\n this.registry.wrapper = this.wrapper;\n\n this.engine = new EngineManager(this.wrapper);\n this.dialog = new DialogManager(this.wrapper);\n this.toolbar = new ToolbarManager(this.wrapper);\n this.buttonGroup = new ButtonGroupManager(this.wrapper);\n this.rightKey = new RightKeyManager(this.wrapper);\n this.constructTreeBtn = new ConstructTreeManagerBtn(this.wrapper);\n this.propertyPanel = new PropertyPanelManager();\n this.measure = new MeasureDialogManager();\n this.sectionPlane = new SectionPlaneDialogManager();\n this.sectionAxis = new SectionAxisDialogManager();\n this.sectionBox = new SectionBoxDialogManager();\n this.walkControl = new WalkControlManager();\n this.walkControl.init();\n this.map = new MapDialogManager();\n this.map.init();\n\n this.registry.engine3d = this.engine;\n this.registry.dialog = this.dialog;\n this.registry.toolbar = this.toolbar;\n this.registry.buttonGroup = this.buttonGroup;\n this.registry.rightKey = this.rightKey;\n this.registry.constructTree = this.constructTreeBtn;\n this.registry.propertyPanel = this.propertyPanel;\n this.registry.measure = this.measure;\n this.registry.sectionPlane = this.sectionPlane;\n this.registry.sectionAxis = this.sectionAxis;\n this.registry.sectionBox = this.sectionBox;\n this.registry.walkControl = this.walkControl;\n this.registry.map = this.map;\n\n this.updateTheme(themeManager.getTheme());\n themeManager.subscribe((theme) => {\n this.updateTheme(theme);\n });\n }\n\n private updateTheme(theme: ThemeConfig) {\n if (this.wrapper) {\n this.wrapper.style.color = theme.textPrimary;\n }\n }\n\n public destroy() {\n this.toolbar?.destroy();\n this.buttonGroup?.destroy();\n this.engine?.destroy();\n this.dialog?.destroy();\n this.rightKey?.destroy();\n this.propertyPanel?.destroy();\n this.measure?.destroy();\n this.sectionPlane?.destroy();\n this.sectionAxis?.destroy();\n this.sectionBox?.destroy();\n this.walkControl?.destroy();\n this.container.innerHTML = '';\n ManagerRegistry.reset();\n }\n}\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createHomeButton = (): ButtonConfig => {\n return {\n id: 'home',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.home',\n icon: getIcon('主视角'),\n keepActive: false,\n onClick: (button) => {\n console.log('首页按钮被点击:', button.id);\n const registry = ManagerRegistry.getInstance();\n registry.engine3d?.CameraGoHome();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createZoomBoxButton = (): ButtonConfig => {\n return {\n id: 'zoom-box',\n groupId: 'group-1',\n keepActive: false,\n type: 'button',\n label: 'toolbar.zoomBox',\n icon: getIcon('框选放大'),\n onClick: () => {\n const registry = ManagerRegistry.getInstance();\n registry.engine3d?.activateZoomBox();\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createWalkMenuButton = (): ButtonConfig => {\n return {\n id: 'walk',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.walk',\n align: 'vertical',\n icon: getIcon('漫游'),\n onClick: () => {\n console.log('漫游按钮被点击');\n const registry = ManagerRegistry.getInstance();\n registry.walkControl?.show();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createMapButton = (): ButtonConfig => {\n const registry = ManagerRegistry.getInstance();\n\n registry.on('map:opened', () => {\n registry.toolbar?.setBtnActive('map', true);\n });\n\n registry.on('map:closed', () => {\n registry.toolbar?.setBtnActive('map', false);\n });\n\n return {\n id: 'map',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.map',\n align: 'vertical',\n keepActive: true,\n icon: getIcon('地图'),\n onClick: () => {\n if (registry.map?.isOpen()) {\n registry.map?.hide();\n } else {\n registry.map?.show();\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createPropertyButton = (): ButtonConfig => {\n return {\n id: 'property',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.property',\n align: 'vertical',\n icon: getIcon('文档'),\n onClick: () => {\n console.log('构件详情按钮被点击');\n const registry = ManagerRegistry.getInstance();\n registry.propertyPanel?.show();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\n\nexport const createSettingButton = (): ButtonConfig => {\n return {\n id: 'setting',\n groupId: 'group-2',\n type: 'button',\n label: 'toolbar.setting',\n icon: getIcon('设置'),\n keepActive: false,\n onClick: (button) => {\n console.log('设置按钮被点击:', button.id);\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createInfoButton = (): ButtonConfig => {\n return {\n id: 'info',\n groupId: 'group-2',\n type: 'button',\n label: 'toolbar.info',\n icon: getIcon('信息'),\n keepActive: false,\n onClick: () => {\n const registry = ManagerRegistry.getInstance();\n registry.emit('ui:open-dialog', { id: 'info' });\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\n\nexport const createFullscreenButton = (): ButtonConfig => {\n return {\n id: 'fullscreen',\n groupId: 'group-2',\n type: 'button',\n label: 'toolbar.fullscreen',\n align: 'vertical',\n icon: getIcon('全屏'),\n onClick: async () => {\n console.log('全屏按钮被点击');\n\n const isIframe = window.self !== window.top;\n if (isIframe) {\n console.warn('检测到在 Iframe 中运行,请确保父级 iframe 标签拥有 allow=\"fullscreen\" 属性');\n }\n\n try {\n const doc = document as any;\n const fullscreenElement = doc.fullscreenElement ||\n doc.webkitFullscreenElement ||\n doc.mozFullScreenElement ||\n doc.msFullscreenElement;\n\n const isFullscreen = !!fullscreenElement;\n console.log('当前是否全屏:', isFullscreen);\n\n const bimContainer = document.querySelector('.bim-engine-container') as HTMLElement;\n const targetElem = bimContainer || document.body;\n const el = targetElem as any;\n\n if (!isFullscreen) {\n console.log('准备进入全屏...');\n\n if (targetElem.style.backgroundColor === '' || targetElem.style.backgroundColor === 'transparent') {\n targetElem.style.backgroundColor = '#ffffff';\n }\n\n const requestMethod = el.requestFullscreen ||\n el.webkitRequestFullscreen ||\n el.mozRequestFullScreen ||\n el.msRequestFullscreen;\n\n if (requestMethod) {\n await requestMethod.call(el, { navigationUI: 'hide' });\n console.log('全屏请求已发送');\n } else {\n console.warn('当前浏览器不支持全屏 API');\n alert('当前浏览器不支持全屏功能');\n }\n } else {\n console.log('准备退出全屏...');\n\n const exitMethod = doc.exitFullscreen ||\n doc.webkitExitFullscreen ||\n doc.mozCancelFullScreen ||\n doc.msExitFullscreen;\n\n if (exitMethod) {\n await exitMethod.call(doc);\n console.log('退出全屏请求已发送');\n }\n }\n } catch (error: any) {\n console.error('全屏操作失败:', error);\n if (error && error.message && error.message.includes('denied')) {\n console.error('全屏请求被拒绝。如果是 Iframe,请检查 allow=\"fullscreen\"。如果是自动触发,请确保由用户点击触发。');\n }\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createMeasureButton = (): ButtonConfig => {\n return {\n id: 'measure',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.measure',\n icon: getIcon('测量'),\n keepActive: true,\n onClick: (button) => {\n const registry = ManagerRegistry.getInstance();\n if (button.isActive) {\n registry.measure?.show();\n } else {\n registry.measure?.destroy();\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\n\nexport const createSectionMenuButton = (): ButtonConfig => {\n return {\n id: 'section',\n groupId: 'group-1',\n type: 'menu',\n label: 'toolbar.section',\n align: 'vertical',\n icon: getIcon('剖切'),\n keepActive: true,\n onClick: (button) => {\n console.log('剖切按钮被点击:', button.id);\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createSectionPlaneButton = (): ButtonConfig => {\n return {\n id: 'section-plane',\n groupId: 'group-1',\n parentId: 'section',\n type: 'button',\n keepActive: true,\n exclusive: true,\n align: 'vertical',\n label: 'toolbar.sectionPlane',\n icon: getIcon('拾曲面剖切'),\n onClick: (button) => {\n console.log('拾取面剖切被点击:', button.id, '激活状态:', button.isActive);\n const registry = ManagerRegistry.getInstance();\n if (button.isActive) {\n registry.sectionPlane?.show();\n } else {\n registry.sectionPlane?.hide();\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createSectionAxisButton = (): ButtonConfig => {\n return {\n id: 'section-axis',\n groupId: 'group-1',\n parentId: 'section',\n type: 'button',\n keepActive: true,\n exclusive: true,\n align: 'vertical',\n label: 'toolbar.sectionAxis',\n icon: getIcon('轴向剖切'),\n onClick: (button) => {\n const registry = ManagerRegistry.getInstance();\n if (button.isActive) {\n registry.sectionAxis?.show();\n } else {\n registry.sectionAxis?.destroy();\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createSectionBoxButton = (): ButtonConfig => {\n return {\n id: 'section-box',\n groupId: 'group-1',\n parentId: 'section',\n type: 'button',\n keepActive: true,\n exclusive: true,\n align: 'vertical',\n label: 'toolbar.sectionBox',\n icon: getIcon('剖切盒'),\n onClick: (button) => {\n console.log('剖切盒被点击:', button.id, '激活状态:', button.isActive);\n const registry = ManagerRegistry.getInstance();\n if (button.isActive) {\n registry.sectionBox?.show();\n } else {\n registry.sectionBox?.hide();\n }\n }\n };\n};\n","const n = `# BIM引擎AI助手 - 需求分析与步骤规划专家\n\n## 角色定位\n\n你是一位资深的**AI+BIM轻量化引擎架构专家**,具备以下核心能力:\n\n1. **深度理解BIM引擎架构**:精通BIM引擎的模块化设计、API体系、数据结构和交互模式\n2. **需求分析能力**:能够准确理解用户意图,识别模糊需求,提出精准的澄清问题\n3. **任务分解能力**:将复杂需求拆解为可执行的、原子化的操作步骤\n4. **技术决策能力**:根据需求特点选择最优的API组合和实现路径\n\n你的职责是通过分析用户需求,生成结构化的执行步骤,指导代码生成模块完成BIM引擎的功能实现。\n\n## 工作流程\n\n如果存在疑问,你就不能输出最终的步骤,只有当你把所有的疑问清楚后,你才可以输出步骤,如果存在疑问,你要以bim模型为载体,不能问一下和bim模型不想干的问题,尽量没有或减少问题\n\n### 阶段一:需求理解与分析\n\n当接收到用户需求时,你需要:\n\n1. **深度分析需求**:\n - 理解用户的核心目标\n - 识别涉及到的BIM引擎模块(场景、相机、模型、测量、剖切等)\n - 分析数据流向和依赖关系\n - 评估需求的复杂度和可行性\n\n2. **识别模糊点**:\n - 检查需求中是否存在歧义、缺失信息或边界条件不明确的情况\n - 判断是否需要用户澄清才能继续\n\n3. **决策是否需要提问**:\n - **仅在必要时提问**:如果需求足够清晰,直接进入步骤规划阶段\n - **避免过度提问**:不要为了提问而提问,不要询问可以从上下文推断的信息\n - **精准提问**:每个问题都应该针对关键决策点,影响后续实现路径\n\n### 阶段二:需求澄清(如需要)\n\n如果需要用户澄清,请按照以下格式输出:\n\n**输出格式**:\n\\`\\`\\`\n##question## \njson内容\n\\`\\`\\`\n\n**JSON格式规范**:\n\\`\\`\\`json\n[\n {\n \"id\": 0,\n \"question\": \"您是否需要设置所有的构件?\",\n \"answers\": [\n \"A. 是的,设置所有构件\",\n \"B. 只设置1F层的构件\",\n \"C. 根据特定条件筛选构件\"\n ]\n },\n {\n \"id\": 1,\n \"question\": \"颜色设置的优先级是什么?\",\n \"answers\": [\n \"A. 按构件类型设置\",\n \"B. 按楼层设置\",\n \"C. 按自定义属性设置\"\n ]\n }\n]\n\\`\\`\\`\n\n**提问原则**:\n- 每个问题必须针对一个明确的决策点\n- 答案选项应该互斥且覆盖主要场景\n- 问题数量控制在3个以内,优先询问最关键的问题\n- 问题描述清晰、具体,避免模糊表述\n- 不要强行提问,尽量减少或不提问题\n### 阶段三:步骤规划\n\n当需求清晰后,你需要将用户意图拆解为一系列可执行的步骤。\n\n**输出格式**:\n\\`\\`\\`\n##steps## \njson内容\n\n\\`\\`\\`\n\n**JSON格式规范**:\n\\`\\`\\`json\n[\n {\n \"id\": 0,\n \"content\": \"获取所有桩基模型\",\n \"description\": \"通过modelTree模块遍历模型树,筛选出类型为'桩基'的所有构件,返回构件ID数组和构件对象数组\",\n \"output\": \"{\\\\\"modelIds\\\\\": [\\\\\"id1\\\\\", \\\\\"id2\\\\\", ...], \\\\\"models\\\\\": [modelObject1, modelObject2, ...]}\",\n \"dependencies\": [],\n \"apiModules\": [\"modelTree\", \"dataModule\"]\n },\n {\n \"id\": 1,\n \"content\": \"设置桩基模型颜色为红色\",\n \"description\": \"使用modelMapperBatch模块的批量设置方法,将上一步获取的所有桩基模型的颜色属性设置为红色(RGB: 255, 0, 0)\",\n \"output\": \"{\\\\\"success\\\\\": true, \\\\\"count\\\\\": 10, \\\\\"failedIds\\\\\": []}\",\n \"dependencies\": [0],\n \"apiModules\": [\"modelMapperBatch\"]\n }\n]\n\\`\\`\\`\n\n**字段说明**:\n- \\`id\\`: 步骤唯一标识符,从0开始递增\n- \\`content\\`: 步骤的简短描述(一句话概括)\n- \\`description\\`: 步骤的详细功能说明,包括:\n - 具体要做什么\n - 使用哪些API模块\n - 如何处理数据\n - 可能的边界情况\n- \\`output\\`: 步骤输出的数据格式说明(JSON Schema格式),用于:\n - 指导代码生成模块返回正确的数据结构\n - 确保步骤间的数据传递正确\n- \\`dependencies\\`: 依赖的步骤ID数组,表示此步骤需要等待哪些步骤完成\n- \\`apiModules\\`: 此步骤涉及到的BIM引擎模块名称数组(如:modelTree, cameraModule, measure等)\n\n**步骤规划原则**:\n1. **原子化**:每个步骤应该只完成一个明确的功能点\n2. **可执行**:每个步骤都应该能够独立生成可执行的代码\n3. **依赖清晰**:明确标注步骤间的依赖关系,确保执行顺序正确\n4. **数据流转**:每个步骤的输出格式要明确,便于后续步骤使用\n5. **模块化**:合理利用BIM引擎的模块化设计,选择最合适的API\n6. **错误处理**:在关键步骤中考虑异常情况的处理\n\n## 硬性要求\n\n### 1. 输出格式规范\n- **必须严格遵循**上述JSON格式,字段名称和类型不能改变\n- JSON必须是有效的、可解析的格式\n- 步骤ID必须连续且从0开始\n- 依赖关系必须正确,不能出现循环依赖\n\n### 2. 需求理解要求\n- **深度理解**:不能停留在表面理解,要理解用户的真实意图和业务场景\n- **上下文感知**:结合BIM引擎的特性,理解每个需求在BIM场景下的实际意义\n- **技术可行性**:确保规划的步骤在BIM引擎API能力范围内\n\n### 3. 步骤质量要求\n- **完整性**:步骤应该覆盖用户需求的所有方面,不能遗漏关键环节\n- **准确性**:步骤描述要准确,不能有歧义或错误\n- **可执行性**:每个步骤都应该能够生成可执行的代码\n- **效率性**:优先选择高效的API组合,避免不必要的中间步骤\n\n### 4. 错误预防\n- 检查步骤间的数据格式是否匹配\n- 确保依赖关系正确,避免执行顺序错误\n- 验证API模块名称是否正确\n- 考虑边界情况和异常处理\n\n### 5. 代码生成友好\n- 步骤描述要足够详细,让代码生成模块能够准确理解意图\n- 输出格式说明要具体,使用JSON Schema或示例数据\n- 明确标注使用的API模块,便于代码生成时快速定位\n\n## 最佳实践\n\n1. **先理解后规划**:充分理解需求后再开始规划步骤,避免返工\n2. **模块优先**:优先使用BIM引擎提供的功能模块,而不是底层API\n3. **数据驱动**:明确每个步骤的输入输出,确保数据流清晰\n4. **可扩展性**:考虑未来可能的扩展需求,设计灵活的步骤结构\n5. **用户友好**:步骤描述要清晰易懂,便于用户理解整个执行流程\n\n\n''`;\nexport {\n n as default\n};\n//# sourceMappingURL=main-2Txx2Vau.mjs.map\n","const n = `# BIM引擎AI助手 - 代码生成专家\n\n## 角色定位\n\n你是一位资深的**BIM引擎代码生成专家**,具备以下核心能力:\n\n1. **BIM引擎API精通**:深度掌握BIM引擎的所有模块API、方法签名、参数类型和返回值\n2. **代码生成能力**:能够根据步骤描述,生成高质量、可执行、符合规范的JavaScript代码\n3. **上下文理解**:能够理解步骤间的数据流转,正确处理前序步骤的输出结果\n4. **错误处理能力**:具备完善的异常处理和边界情况处理能力\n5. **代码质量意识**:生成的代码应该具备良好的可读性、可维护性和性能\n\n你的职责是根据步骤规划模块提供的步骤描述,生成可直接在BIM引擎环境中执行的JavaScript代码片段。\n\n## 工作流程\n\n### 阶段一:理解步骤要求\n\n当接收到步骤执行请求时,你需要:\n\n1. **解析步骤信息**:\n - 理解步骤的\\`content\\`(简短描述)和\\`description\\`(详细说明)\n - 识别步骤涉及到的BIM引擎模块(\\`apiModules\\`字段)\n - 理解步骤的依赖关系(\\`dependencies\\`字段)\n - 明确步骤的预期输出格式(\\`output\\`字段)\n\n2. **分析上下文数据**:\n - 如果有前序步骤的输出结果,分析其数据结构\n - 理解当前步骤需要使用的输入数据\n - 验证数据格式是否匹配步骤要求\n\n3. **确定实现方案**:\n - 根据步骤描述,选择最合适的BIM引擎API\n - 设计数据转换和处理逻辑\n - 规划错误处理策略\n\n### 阶段二:生成代码\n\n根据步骤要求生成可执行的JavaScript代码。\n\n**输出格式**:\n\\`\\`\\`\n##code##\n[可执行的JavaScript代码]\n\\`\\`\\`\n\n**代码生成规范**:\n\n1. **代码结构**:\n - 代码必须是一个完整的、可执行的JavaScript代码片段\n - 可以是函数、立即执行函数(IIFE)或代码块\n - 代码应该能够直接运行,不需要额外的包装\n\n2. **引擎实例访问**:\n - 假设BIM引擎实例通过变量\\`engine\\`访问(全局作用域)\n - 通过\\`engine.moduleName\\`访问各个功能模块\n - 例如:\\`engine.modelTree\\`、\\`engine.cameraModule\\`、\\`engine.measure\\`等\n\n3. **数据输入处理**:\n - 如果步骤有依赖,使用前序步骤的输出数据\n - 假设前序步骤的输出数据存储在变量\\`previousStepOutput\\`中(如果是第一步,则为\\`null\\`)\n - 需要根据\\`output\\`字段的格式说明,正确解析和使用输入数据\n\n4. **API调用规范**:\n - 严格按照BIM引擎API文档使用API\n - 参数类型和数量必须正确\n - 处理API的返回值和可能的异常\n\n5. **数据输出规范**:\n - 代码执行后,必须返回符合步骤\\`output\\`字段要求的数据格式\n - 使用\\`return\\`语句返回结果\n - 返回的数据必须是可序列化的(JSON格式)\n\n6. **错误处理**:\n - 必须包含完善的错误处理逻辑\n - 使用try-catch捕获可能的异常\n - 对于关键操作,添加参数验证\n - 错误信息要清晰,便于调试\n\n7. **代码质量要求**:\n - 代码要有清晰的注释,说明关键逻辑\n - 变量命名要有意义,符合JavaScript命名规范\n - 避免使用过于复杂的嵌套结构\n - 优先使用可读性高的写法,而不是过于\"高级\"的技巧\n\n## 硬性要求\n\n### 1. 代码格式要求\n- **单一代码块**:输出必须且只能包含一个JavaScript代码片段\n- **可执行性**:代码必须能够直接执行,不需要额外的依赖或配置\n- **完整性**:代码必须完整,不能有语法错误或未定义的变量\n\n### 2. 数据格式要求\n- **输入解析**:正确解析和使用前序步骤的输出数据\n- **输出格式**:严格按照步骤\\`output\\`字段的格式要求返回数据\n- **类型安全**:确保数据类型正确,必要时进行类型转换\n\n### 3. API使用要求\n- **准确性**:API调用必须准确,参数必须正确\n- **模块识别**:正确识别和使用BIM引擎的各个模块\n- **方法调用**:使用正确的方法名和参数签名\n\n### 4. 错误处理要求\n- **异常捕获**:所有可能抛出异常的操作都要有try-catch保护\n- **参数验证**:对关键参数进行验证,避免无效输入\n- **错误信息**:错误信息要清晰,包含足够的上下文信息\n- **优雅降级**:在可能的情况下,提供降级方案\n\n### 5. 代码质量要求\n- **可读性**:代码结构清晰,逻辑易懂\n- **注释完整**:关键逻辑要有注释说明\n- **命名规范**:变量和函数命名要有意义\n- **性能考虑**:避免不必要的循环和计算\n\n## 代码生成示例\n\n### 示例1:获取模型数据\n\n**步骤描述**:\n\\`\\`\\`json\n{\n \"id\": 0,\n \"content\": \"获取所有桩基模型\",\n \"description\": \"通过modelTree模块遍历模型树,筛选出类型为'桩基'的所有构件\",\n \"output\": \"{\\\\\"modelIds\\\\\": [\\\\\"id1\\\\\", \\\\\"id2\\\\\"], \\\\\"models\\\\\": [modelObject1, modelObject2]}\",\n \"dependencies\": [],\n \"apiModules\": [\"modelTree\"]\n}\n\\`\\`\\`\n\n**生成代码**:\n\\`\\`\\`javascript\n// 获取所有桩基模型\ntry {\n // 获取模型树模块\n const modelTree = engine.modelTree;\n if (!modelTree) {\n throw new Error('模型树模块未初始化');\n }\n \n // 获取所有模型\n const allModels = modelTree.getAllModels();\n if (!allModels || allModels.length === 0) {\n return {\n modelIds: [],\n models: []\n };\n }\n \n // 筛选桩基模型\n const pileModels = [];\n const pileModelIds = [];\n \n for (let i = 0; i < allModels.length; i++) {\n const model = allModels[i];\n // 根据模型属性判断是否为桩基\n const modelType = model.getProperty('类型') || model.getProperty('category');\n if (modelType && (modelType.includes('桩基') || modelType.includes('Pile'))) {\n pileModels.push(model);\n pileModelIds.push(model.id || model.uuid);\n }\n }\n \n // 返回结果\n return {\n modelIds: pileModelIds,\n models: pileModels\n };\n} catch (error) {\n console.error('获取桩基模型失败:', error);\n return {\n modelIds: [],\n models: [],\n error: error.message\n };\n}\n\\`\\`\\`\n\n### 示例2:使用前序步骤的输出\n\n**步骤描述**:\n\\`\\`\\`json\n{\n \"id\": 1,\n \"content\": \"设置桩基模型颜色为红色\",\n \"description\": \"使用modelMapperBatch模块批量设置上一步获取的桩基模型颜色\",\n \"output\": \"{\\\\\"success\\\\\": true, \\\\\"count\\\\\": 10}\",\n \"dependencies\": [0],\n \"apiModules\": [\"modelMapperBatch\"]\n}\n\\`\\`\\`\n\n**生成代码**:\n\\`\\`\\`javascript\n// 设置桩基模型颜色为红色\ntry {\n // 获取前序步骤的输出数据\n if (!previousStepOutput || !previousStepOutput.modelIds) {\n throw new Error('前序步骤输出数据无效,缺少modelIds字段');\n }\n \n const modelIds = previousStepOutput.modelIds;\n if (modelIds.length === 0) {\n return {\n success: true,\n count: 0,\n message: '没有需要设置的模型'\n };\n }\n \n // 获取批量映射模块\n const modelMapperBatch = engine.modelMapperBatch;\n if (!modelMapperBatch) {\n throw new Error('批量映射模块未初始化');\n }\n \n // 设置颜色为红色 (RGB: 255, 0, 0)\n const redColor = { r: 255, g: 0, b: 0 };\n \n // 批量设置模型颜色\n const result = modelMapperBatch.setModelColor(modelIds, redColor);\n \n return {\n success: result.success !== false,\n count: result.count || modelIds.length,\n failedIds: result.failedIds || []\n };\n} catch (error) {\n console.error('设置模型颜色失败:', error);\n return {\n success: false,\n count: 0,\n error: error.message\n };\n}\n\\`\\`\\`\n\n## 最佳实践\n\n1. **充分理解步骤**:仔细阅读步骤描述,确保理解每个细节\n2. **查阅API文档**:不确定的API用法,参考BIM引擎API文档\n3. **数据验证优先**:在处理数据前,先验证数据的有效性\n4. **错误处理完善**:考虑各种可能的异常情况\n5. **代码可读性**:优先保证代码的可读性,而不是追求\"高级\"写法\n6. **注释清晰**:关键逻辑要有注释,但不要过度注释\n7. **性能考虑**:对于大量数据的处理,考虑性能优化\n8. **测试友好**:生成的代码应该便于测试和调试 `;\nexport {\n n as default\n};\n//# sourceMappingURL=step-CkmZYIvn.mjs.map\n","const n = `# BIM Engine SDK API 文档\n\n本文档为 BIM Engine SDK 的完整 API 参考,适合大模型阅读和理解引擎的功能结构。\n\n## 目录\n\n1. [核心引擎类](#1-核心引擎类)\n2. [基础模块](#2-基础模块)\n3. [功能管理器](#3-功能管理器)\n4. [状态管理](#4-状态管理)\n\n---\n\n## 1. 核心引擎类\n\n### EngineKernelV2\n\n引擎核心组件,负责整合和管理所有模块。\n\n**文件路径**: \\`src/core/v2/EngineKernel.ts\\`\n\n#### 构造函数\n\n\\`\\`\\`typescript\nconstructor(options: any)\n\\`\\`\\`\n\n**参数**:\n- \\`options.containerId\\`: string - 容器元素的 ID\n\n**功能**:\n- 初始化所有基础模块(场景、相机、渲染器、控制器等)\n- 初始化所有功能管理器(测量、剖切、模型树等)\n- 设置渲染循环\n- 添加性能监视器\n\n#### 公共属性\n\n\\`\\`\\`typescript\n// 基础对象\npublic scene: THREE.Scene | null // 三维场景\npublic camera: THREE.Camera | null // 当前使用的相机\npublic renderer: THREE.WebGLRenderer | null // 渲染器\npublic controls: any // 控制器(轨道控制或第一人称)\n\n// 基础模块\npublic sceneModule: SceneModule // 场景模块\npublic cameraModule: CameraModule // 相机模块\npublic deviceModule: DeviceModule // 设备模块\npublic renderModule: RenderModule // 渲染模块\npublic controlModule: ControlModule // 控制模块\npublic composerModule: ComposerModule // 合成器模块\npublic loaderModule: LoaderModule // 加载器模块\npublic lightModule: LightModule // 光照模块\npublic interactionModule: InteractionModule // 交互模块\npublic modelToolModule: ModelToolModule // 模型工具模块\n\n// 功能管理器\npublic viewCube: ViewCube // 视图立方体\npublic rangeScale: RangeScale // 范围缩放\npublic setting: Setting // 设置\npublic measure: Measure // 测量\npublic clipping: Clipping // 剖切\npublic modelTree: ModelTree // 模型树\npublic engineInfo: EngineInfo // 引擎信息统计\npublic modelProperties: ModelProperties // 模型属性\npublic modelMapperBatch: ModelMapperBatch // 模型批量映射\npublic modelEdge: ModelEdge // 模型边线\n\n// 状态管理\npublic engineStatus: EngineStatus // 引擎状态\npublic events: EventModule // 事件模块\n\n// 业务数据\npublic models: any[] // 已加载的模型数组\npublic reactBoundingClientRect: { left: number; top: number } // 容器的边界矩形\n\\`\\`\\`\n\n#### 公共方法\n\n##### pauseRendering()\n\n\\`\\`\\`typescript\npublic pauseRendering(): void\n\\`\\`\\`\n\n**功能**: 暂停渲染循环\n- 停止动画帧请求\n- 禁用控制器\n- 用于性能优化或后台运行\n\n##### resumeRendering()\n\n\\`\\`\\`typescript\npublic resumeRendering(): void\n\\`\\`\\`\n\n**功能**: 恢复渲染循环\n- 重新启动动画帧请求\n- 恢复控制器状态\n\n##### isRenderingPausedState()\n\n\\`\\`\\`typescript\npublic isRenderingPausedState(): boolean\n\\`\\`\\`\n\n**功能**: 检查渲染是否暂停\n\n**返回值**: boolean - true 表示已暂停\n\n##### dispose()\n\n\\`\\`\\`typescript\npublic dispose(): void\n\\`\\`\\`\n\n**功能**: 销毁引擎,释放所有资源\n- 停止渲染循环\n- 清理所有模块\n- 释放几何体、材质、纹理\n- 移除 DOM 元素\n- 清理事件监听器\n\n**注意**: 调用此方法后引擎不可再使用\n\n---\n\n## 2. 基础模块\n\n### 2.1 SceneModule - 场景模块\n\n**文件路径**: \\`src/core/v2/modules/sceneModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic scene: THREE.Scene | null // 三维场景对象\n\\`\\`\\`\n\n**功能**:\n- 创建并管理 THREE.Scene\n- 初始化边线组(groupEdge)用于存储模型边线\n\n---\n\n### 2.2 CameraModule - 相机模块\n\n**文件路径**: \\`src/core/v2/modules/cameraModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic perspectiveCamera: THREE.PerspectiveCamera // 透视相机\npublic orthographicCamera: THREE.OrthographicCamera // 正交相机\n\\`\\`\\`\n\n#### 公共方法\n\n##### switchCurrentCamera()\n\n\\`\\`\\`typescript\npublic switchCurrentCamera(): void\n\\`\\`\\`\n\n**功能**: 切换当前相机类型(透视 ↔ 正交)\n\n##### switchToPerspectiveCamera()\n\n\\`\\`\\`typescript\npublic switchToPerspectiveCamera(): void\n\\`\\`\\`\n\n**功能**: 切换到透视相机\n- 保持当前位置和目标点\n- 更新控制器\n- 重新初始化合成器\n\n##### switchToOrthographicCamera()\n\n\\`\\`\\`typescript\npublic switchToOrthographicCamera(): void\n\\`\\`\\`\n\n**功能**: 切换到正交相机\n- 保持当前位置和目标点\n- 更新控制器\n- 重新初始化合成器\n\n##### getCameraType()\n\n\\`\\`\\`typescript\npublic getCameraType(): CameraType\n\\`\\`\\`\n\n**功能**: 获取当前相机类型\n\n**返回值**:\n- \\`CameraType.PERSPECTIVE\\` - 透视相机\n- \\`CameraType.ORTHOGRAPHIC\\` - 正交相机\n\n##### getCameraPose()\n\n\\`\\`\\`typescript\npublic getCameraPose(): ICameraPose\n\\`\\`\\`\n\n**功能**: 获取当前相机姿态(位置、旋转、目标点、缩放等)\n\n**返回值**: ICameraPose 对象\n\\`\\`\\`typescript\ninterface ICameraPose {\n type: CameraType;\n position: { x: number; y: number; z: number };\n rotation: { x: number; y: number; z: number };\n quaternion: { x: number; y: number; z: number; w: number };\n target?: { x: number; y: number; z: number };\n zoom?: number;\n}\n\\`\\`\\`\n\n##### restoreCameraPose()\n\n\\`\\`\\`typescript\npublic restoreCameraPose(pose: ICameraPose): void\n\\`\\`\\`\n\n**功能**: 通过相机姿态还原相机位置\n- 自动切换相机类型\n- 恢复位置、旋转、目标点\n- 恢复正交相机的缩放值\n\n**参数**:\n- \\`pose\\`: ICameraPose - 相机姿态对象\n\n---\n\n### 2.3 DeviceModule - 设备模块\n\n**文件路径**: \\`src/core/v2/modules/deviceModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic deviceType: string // 设备类型(默认 'PC')\n\\`\\`\\`\n\n#### 公共方法\n\n##### getDeviceType()\n\n\\`\\`\\`typescript\npublic getDeviceType(): string\n\\`\\`\\`\n\n**功能**: 获取设备类型\n\n**返回值**: 'PC' 或其他设备标识\n\n##### getContainerSize()\n\n\\`\\`\\`typescript\npublic getContainerSize(): { width: number; height: number }\n\\`\\`\\`\n\n**功能**: 获取容器尺寸\n\n**返回值**: 容器的宽度和高度\n\n---\n\n### 2.4 RenderModule - 渲染模块\n\n**文件路径**: \\`src/core/v2/modules/renderModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic renderer: THREE.WebGLRenderer | null // WebGL 渲染器\n\\`\\`\\`\n\n#### 公共方法\n\n##### createRenderer()\n\n\\`\\`\\`typescript\npublic createRenderer(): THREE.WebGLRenderer\n\\`\\`\\`\n\n**功能**: 创建并配置 WebGL 渲染器\n- 启用抗锯齿\n- 启用阴影映射(PCFSoftShadowMap)\n- 启用本地裁剪(用于剖切平面)\n- 配置色彩空间和色调映射\n\n**返回值**: 配置好的渲染器实例\n\n##### disposeRenderer()\n\n\\`\\`\\`typescript\npublic disposeRenderer(): void\n\\`\\`\\`\n\n**功能**: 释放渲染器资源\n\n---\n\n### 2.5 ControlModule - 控制模块\n\n**文件路径**: \\`src/core/v2/modules/controlModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic orbitControls: any // 轨道控制器\npublic firstPersonControls: any // 第一人称控制器\npublic isActive: boolean // 控制器是否激活\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化控制器\n- 创建轨道控制器和第一人称控制器\n- 创建旋转中心指示器 UI\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 激活控制器\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 禁用控制器\n\n##### switchFirstPersonMode()\n\n\\`\\`\\`typescript\npublic switchFirstPersonMode(): void\n\\`\\`\\`\n\n**功能**: 切换到第一人称漫游模式\n- 禁用轨道控制器\n- 启用第一人称控制器\n\n##### switchDefaultMode()\n\n\\`\\`\\`typescript\npublic switchDefaultMode(): void\n\\`\\`\\`\n\n**功能**: 切换到默认模式(轨道控制)\n- 禁用第一人称控制器\n- 启用轨道控制器\n\n##### update()\n\n\\`\\`\\`typescript\npublic update(): void\n\\`\\`\\`\n\n**功能**: 更新控制器状态\n- 更新旋转中心指示器位置\n- 在渲染循环中调用\n\n---\n\n### 2.6 ComposerModule - 合成器模块\n\n**文件路径**: \\`src/core/v2/modules/composerModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic composer: any // 效果合成器\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化后处理管线\n- RenderPass - 基础渲染\n- GTAOPass - 环境光遮蔽(默认禁用)\n- UnrealBloomPass - 辉光效果(默认禁用)\n- SaturationPass - 饱和度和对比度调整\n- OutputPass - 色调映射和颜色校正\n- FXAAPass - 抗锯齿\n\n##### resize()\n\n\\`\\`\\`typescript\npublic resize(): void\n\\`\\`\\`\n\n**功能**: 调整合成器大小\n- 更新所有 pass 的分辨率\n- 更新 FXAA 的分辨率参数\n\n---\n\n### 2.7 LoaderModule - 加载器模块\n\n**文件路径**: \\`src/core/v2/modules/loaderModule.ts\\`\n\n#### 公共方法\n\n##### loadModels()\n\n\\`\\`\\`typescript\nasync loadModels(urls: string[], options?: LoadModelOptions): Promise\n\\`\\`\\`\n\n**功能**: 加载多个模型\n- 支持轻量化模型格式\n- 支持 GLTF/GLB 格式\n- 异步加载\n\n**参数**:\n- \\`urls\\`: string[] - 模型 URL 数组\n- \\`options\\`: LoadModelOptions - 加载选项(可选)\n\n---\n\n### 2.8 EventModule - 事件模块\n\n**文件路径**: \\`src/core/v2/modules/eventModule.ts\\`\n\n#### 公共方法\n\n##### on()\n\n\\`\\`\\`typescript\non(event: EventType, callback: (data: T) => void): void\n\\`\\`\\`\n\n**功能**: 注册事件监听器\n\n**参数**:\n- \\`event\\`: EventType - 事件类型\n- \\`callback\\`: 回调函数\n\n##### off()\n\n\\`\\`\\`typescript\noff(event: EventType, callback: (data: T) => void): void\n\\`\\`\\`\n\n**功能**: 移除事件监听器\n\n**参数**:\n- \\`event\\`: EventType - 事件类型\n- \\`callback\\`: 要移除的回调函数\n\n##### trigger()\n\n\\`\\`\\`typescript\ntrigger(event: EventType, data?: any): void\n\\`\\`\\`\n\n**功能**: 触发事件\n\n**参数**:\n- \\`event\\`: EventType - 事件类型\n- \\`data\\`: 传递给监听器的数据\n\n**常用事件类型**:\n- \\`EventType.Click\\` - 点击事件\n- \\`EventType.ViewportResize\\` - 视口大小改变\n- \\`EventType.EngineFree\\` - 引擎空闲\n- \\`EventType.EngineBusy\\` - 引擎繁忙\n\n---\n\n### 2.9 LightModule - 光照模块\n\n**文件路径**: \\`src/core/v2/modules/lightModule.ts\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化场景基本光照\n- 添加定向光(DirectionalLight)\n - 强度: 2\n - 位置: (10, 20, 10)\n - 阴影贴图: 4096x4096(高质量)\n- 添加环境光(AmbientLight)\n - 强度: 1\n\n---\n\n### 2.10 InteractionModule - 交互模块\n\n**文件路径**: \\`src/core/v2/modules/interactionModule.ts\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化交互行为处理器\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 激活交互功能\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 禁用交互功能\n\n##### handleMouseClick()\n\n\\`\\`\\`typescript\npublic handleMouseClick(event: any): void\n\\`\\`\\`\n\n**功能**: 处理鼠标单击事件\n- 射线检测点击的模型\n- 高亮选中的模型\n- 设置旋转中心\n- 支持 Ctrl 多选\n\n##### handleMouseDoubleClick()\n\n\\`\\`\\`typescript\npublic handleMouseDoubleClick(event: any): void\n\\`\\`\\`\n\n**功能**: 处理鼠标双击事件\n- 双击模型后缩放到该模型\n- 计算模型包围盒并调整相机视角\n\n##### handleMouseClickInstance()\n\n\\`\\`\\`typescript\npublic handleMouseClickInstance(raycaster: any): any\n\\`\\`\\`\n\n**功能**: 判断点击实例化网格节点\n\n**参数**:\n- \\`raycaster\\`: 射线投射器\n\n**返回值**: 相交结果数组\n\n---\n\n### 2.11 ModelToolModule - 模型工具模块\n\n**文件路径**: \\`src/core/v2/modules/modelToolModule.ts\\`\n\n#### 公共方法\n\n##### highlightModel()\n\n\\`\\`\\`typescript\npublic highlightModel(models: any): void\n\\`\\`\\`\n\n**功能**: 设置模型高亮显示\n\n**参数**:\n- \\`models\\`: 模型数组,格式: \\`[{url: string, ids: string[]}]\\`\n\n##### unhighlightModel()\n\n\\`\\`\\`typescript\npublic unhighlightModel(models: any): void\n\\`\\`\\`\n\n**功能**: 取消模型高亮\n\n**参数**:\n- \\`models\\`: 模型数组\n\n##### unhighlightAllModels()\n\n\\`\\`\\`typescript\npublic unhighlightAllModels(): void\n\\`\\`\\`\n\n**功能**: 取消所有模型高亮\n\n##### hideModel()\n\n\\`\\`\\`typescript\npublic hideModel(models: any): void\n\\`\\`\\`\n\n**功能**: 隐藏模型\n\n**参数**:\n- \\`models\\`: 模型数组,格式: \\`[{url: string, ids: string[]}]\\`\n\n##### showModel()\n\n\\`\\`\\`typescript\npublic showModel(models: any): void\n\\`\\`\\`\n\n**功能**: 显示模型\n\n**参数**:\n- \\`models\\`: 模型数组\n\n##### isolateModel()\n\n\\`\\`\\`typescript\npublic isolateModel(models: any): void\n\\`\\`\\`\n\n**功能**: 隔离模型(只显示指定模型,隐藏其他)\n\n**参数**:\n- \\`models\\`: 要显示的模型数组\n\n##### showAllModels()\n\n\\`\\`\\`typescript\npublic showAllModels(): void\n\\`\\`\\`\n\n**功能**: 显示所有模型\n\n##### getModelsBox()\n\n\\`\\`\\`typescript\npublic getModelsBox(models: any): THREE.Box3\n\\`\\`\\`\n\n**功能**: 获取模型的包围盒\n\n**参数**:\n- \\`models\\`: 模型数组\n\n**返回值**: THREE.Box3 包围盒对象\n\n---\n\n## 3. 功能管理器\n\n### 3.1 ViewCube - 视图立方体\n\n**文件路径**: \\`src/core/v2/managers/viewCube/index.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic cubeTool: any // 视图立方体工具\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化视图立方体\n- 创建 3D 小立方体辅助视图\n- 支持六个面和边角视图切换\n\n##### CameraGoHome()\n\n\\`\\`\\`typescript\npublic CameraGoHome(): void\n\\`\\`\\`\n\n**功能**: 相机回归正位(默认视角)\n\n##### zoomToModel()\n\n\\`\\`\\`typescript\npublic zoomToModel(box: THREE.Box3): void\n\\`\\`\\`\n\n**功能**: 缩放到指定模型包围盒\n\n**参数**:\n- \\`box\\`: THREE.Box3 - 目标包围盒\n\n---\n\n### 3.2 RangeScale - 范围缩放工具\n\n**文件路径**: \\`src/core/v2/managers/rangeScale/index.ts\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化范围缩放工具\n- 创建绘制框 UI 元素\n- 初始化坐标转换工具\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 激活范围缩放工具\n- 禁用控制器\n- 启用框选功能\n- 鼠标变为十字光标\n\n**使用方式**:\n1. 激活工具\n2. 鼠标拖拽绘制矩形区域\n3. 松开鼠标自动缩放到该区域\n4. 按 ESC 键退出\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 停用范围缩放工具\n- 恢复控制器\n- 移除事件监听\n\n---\n\n### 3.3 Setting - 设置管理器\n\n**文件路径**: \\`src/core/v2/managers/setting/index.ts\\`\n\n#### 公共方法\n\n##### setStatsVisible()\n\n\\`\\`\\`typescript\npublic setStatsVisible(visible: boolean): void\n\\`\\`\\`\n\n**功能**: 显示/隐藏性能监视器\n\n**参数**:\n- \\`visible\\`: true 显示,false 隐藏\n\n##### setAmbientLightIntensity()\n\n\\`\\`\\`typescript\npublic setAmbientLightIntensity(intensity: number): void\n\\`\\`\\`\n\n**功能**: 设置环境光照强度\n\n**参数**:\n- \\`intensity\\`: 光照强度,范围 0-5\n\n##### setAmbientLightColor()\n\n\\`\\`\\`typescript\npublic setAmbientLightColor(color: number | string): void\n\\`\\`\\`\n\n**功能**: 设置环境光照颜色\n\n**参数**:\n- \\`color\\`: 颜色(0xffffff 或 '#ffffff')\n\n##### setDirectionalLightIntensity()\n\n\\`\\`\\`typescript\npublic setDirectionalLightIntensity(intensity: number): void\n\\`\\`\\`\n\n**功能**: 设置定向光源强度\n\n**参数**:\n- \\`intensity\\`: 光照强度,范围 0-5\n\n##### setDirectionalLightColor()\n\n\\`\\`\\`typescript\npublic setDirectionalLightColor(color: number | string): void\n\\`\\`\\`\n\n**功能**: 设置定向光源颜色\n\n**参数**:\n- \\`color\\`: 颜色\n\n##### setShadowQuality()\n\n\\`\\`\\`typescript\npublic setShadowQuality(quality: 'low' | 'medium' | 'high' | 'ultra'): void\n\\`\\`\\`\n\n**功能**: 设置阴影精细度\n\n**参数**:\n- \\`quality\\`: 质量等级\n - 'low': 1024\n - 'medium': 2048\n - 'high': 4096\n - 'ultra': 8192\n\n##### setDirectionalLightShadow()\n\n\\`\\`\\`typescript\npublic setDirectionalLightShadow(enabled: boolean): void\n\\`\\`\\`\n\n**功能**: 开启/关闭定向光阴影\n\n**参数**:\n- \\`enabled\\`: true 开启,false 关闭\n\n##### setGTAOEnabled()\n\n\\`\\`\\`typescript\npublic setGTAOEnabled(enabled: boolean): void\n\\`\\`\\`\n\n**功能**: 开启/关闭 GTAO 环境光遮蔽\n\n**参数**:\n- \\`enabled\\`: true 开启,false 关闭\n\n##### setSceneSaturation()\n\n\\`\\`\\`typescript\npublic setSceneSaturation(saturation: number): void\n\\`\\`\\`\n\n**功能**: 设置场景饱和度\n\n**参数**:\n- \\`saturation\\`: 饱和度值,1.0 为正常,推荐范围 0.5-2.0\n\n##### setSceneContrast()\n\n\\`\\`\\`typescript\npublic setSceneContrast(contrast: number): void\n\\`\\`\\`\n\n**功能**: 设置场景对比度\n\n**参数**:\n- \\`contrast\\`: 对比度值,1.0 为正常,推荐范围 0.5-2.0\n\n##### setGroundEnabled()\n\n\\`\\`\\`typescript\npublic setGroundEnabled(enabled: boolean, options?: {\n size?: number;\n color?: number | string;\n opacity?: number;\n}): void\n\\`\\`\\`\n\n**功能**: 开启/关闭地面\n\n**参数**:\n- \\`enabled\\`: true 开启,false 关闭\n- \\`options\\`: 地面配置选项\n - \\`size\\`: 地面大小(默认 100)\n - \\`color\\`: 地面颜色(默认 0x808080)\n - \\`opacity\\`: 透明度(默认 0.3)\n\n##### setHDRBackground()\n\n\\`\\`\\`typescript\npublic setHDRBackground(hdrTexture: THREE.Texture | null): void\n\\`\\`\\`\n\n**功能**: 设置 HDR 背景\n\n**参数**:\n- \\`hdrTexture\\`: HDR 环境贴图,null 则移除\n\n---\n\n### 3.4 Measure - 测量工具\n\n**文件路径**: \\`src/core/v2/managers/measure/index.ts\\`\n\n#### 公共方法\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 激活测量工具\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 停用测量工具\n- 清除所有测量\n- 恢复点选功能\n\n##### clearAllPoints()\n\n\\`\\`\\`typescript\npublic clearAllPoints(): void\n\\`\\`\\`\n\n**功能**: 清空所有测量点\n\n##### clearAll()\n\n\\`\\`\\`typescript\npublic clearAll(): void\n\\`\\`\\`\n\n**功能**: 清除所有测量标注\n\n##### update()\n\n\\`\\`\\`typescript\nupdate(): void\n\\`\\`\\`\n\n**功能**: 更新测量标注\n- 在渲染循环中调用\n- 更新屏幕坐标\n\n**测量类型**:\n- 距离测量(DistanceMeasure)\n- 净高测量(ClearHeightMeasure)\n- 净距测量(ClearDistanceMeasure)\n- 标高测量(ElevationMeasure)\n- 点测量(PointMeasure)\n- 角度测量(AngleMeasure)\n- 面积测量(AreaMeasure)\n- 坡度测量(SlopeMeasure)\n\n---\n\n### 3.5 Clipping - 剖切管理器\n\n**文件路径**: \\`src/core/v2/managers/clipping/index.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic sectionPlaneX: any // X 轴剖切平面\npublic sectionPlaneY: any // Y 轴剖切平面\npublic sectionPlaneZ: any // Z 轴剖切平面\npublic sectionBox: any // 剖切盒\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化剖切管理器\n- 创建 6 个剖切平面(前、后、左、右、顶、底)\n- 初始化 X/Y/Z 轴剖切工具\n- 初始化剖切盒工具\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 停用所有剖切工具\n\n---\n\n### 3.6 ModelTree - 模型树\n\n**文件路径**: \\`src/core/v2/managers/modelTree/index.ts\\`\n\n#### 公共方法\n\n##### getTreeData()\n\n\\`\\`\\`typescript\npublic getTreeData(): any[]\n\\`\\`\\`\n\n**功能**: 获取模型树数据\n\n**返回值**: 模型树数组\n\\`\\`\\`typescript\n[{\n name: string, // 模型名称\n children: any[] // 模型层级树\n}]\n\\`\\`\\`\n\n---\n\n### 3.7 EngineInfo - 引擎信息统计\n\n**文件路径**: \\`src/core/v2/managers/engineInfo/index.ts\\`\n\n#### 公共方法\n\n##### getEngineInfo()\n\n\\`\\`\\`typescript\npublic getEngineInfo(): {\n totalVertices: number;\n totalTriangles: number;\n meshCount: number;\n}\n\\`\\`\\`\n\n**功能**: 获取引擎统计信息\n- 统计所有网格的顶点数\n- 统计所有网格的三角面数\n- 统计网格数量\n\n**返回值**:\n- \\`totalVertices\\`: 总顶点数\n- \\`totalTriangles\\`: 总三角面数\n- \\`meshCount\\`: 网格数量\n\n---\n\n### 3.8 ModelProperties - 模型属性\n\n**文件路径**: \\`src/core/v2/managers/modelProperties/index.ts\\`\n\n#### 公共方法\n\n##### getModelProperties()\n\n\\`\\`\\`typescript\npublic getModelProperties(url: string, id: string, callback: (properties: any) => void): void\n\\`\\`\\`\n\n**功能**: 查询构件属性\n- 异步加载属性数据(如果未加载)\n- 从压缩的 JSON 中解析属性\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n- \\`callback\\`: 回调函数,接收属性对象\n\n**返回值格式**:\n\\`\\`\\`typescript\n{\n properties: [{\n name: string, // 分类名称\n children: [{\n name: string, // 属性名\n value: any // 属性值\n }]\n }],\n materials: []\n}\n\\`\\`\\`\n\n---\n\n### 3.9 ModelMapperBatch - 模型批量映射\n\n**文件路径**: \\`src/core/v2/managers/modelMapperBatch/index.ts\\`\n\n#### 公共方法\n\n##### getModelTypes()\n\n\\`\\`\\`typescript\npublic getModelTypes(): any[]\n\\`\\`\\`\n\n**功能**: 获取模型中所有的构件类型\n\n##### getModelMajors()\n\n\\`\\`\\`typescript\npublic getModelMajors(): any[]\n\\`\\`\\`\n\n**功能**: 获取模型中所有的专业\n\n##### getModelLevels()\n\n\\`\\`\\`typescript\npublic getModelLevels(): any[]\n\\`\\`\\`\n\n**功能**: 获取模型中所有的楼层\n\n##### getModelMapper()\n\n\\`\\`\\`typescript\npublic getModelMapper(url: string, id: number): any\n\\`\\`\\`\n\n**功能**: 获取指定构件的映射信息\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n\n**返回值**: Mapper 对象(包含类型、专业、楼层等信息)\n\n##### getModelSWithType()\n\n\\`\\`\\`typescript\npublic getModelSWithType(type: string, callback: any): any[]\n\\`\\`\\`\n\n**功能**: 获取同类型的所有构件\n\n**参数**:\n- \\`type\\`: 构件类型名称\n- \\`callback\\`: 回调函数\n\n**返回值**: \\`[{url: string, ids: number[]}]\\`\n\n##### getModelSWithLevel()\n\n\\`\\`\\`typescript\npublic getModelSWithLevel(level: string, callback: any): any[]\n\\`\\`\\`\n\n**功能**: 获取同楼层的所有构件\n\n**参数**:\n- \\`level\\`: 楼层名称\n- \\`callback\\`: 回调函数\n\n**返回值**: \\`[{url: string, ids: number[]}]\\`\n\n##### getModelsWithMajor()\n\n\\`\\`\\`typescript\npublic getModelsWithMajor(major: string, callback: any): any[]\n\\`\\`\\`\n\n**功能**: 获取同专业的所有构件\n\n**参数**:\n- \\`major\\`: 专业名称\n- \\`callback\\`: 回调函数\n\n**返回值**: \\`[{url: string, ids: number[]}]\\`\n\n---\n\n### 3.10 ModelEdge - 模型边线管理器\n\n**文件路径**: \\`src/core/v2/managers/modelEdge/index.ts\\`\n\n#### 公共方法\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 启动边线显示\n- 显示所有模型的边线\n- 用于技术制图风格渲染\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 关闭边线显示\n\n##### getModelEdge()\n\n\\`\\`\\`typescript\npublic getModelEdge(url: string, id: Number): any\n\\`\\`\\`\n\n**功能**: 获取指定模型的边线数据\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n\n**返回值**: 边线数据 \\`[startIndex, endIndex, points]\\`\n\n##### hideModelEdge()\n\n\\`\\`\\`typescript\npublic hideModelEdge(url: string, id: Number): void\n\\`\\`\\`\n\n**功能**: 隐藏指定构件的边线\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n\n##### showModelEdge()\n\n\\`\\`\\`typescript\npublic showModelEdge(url: string, id: Number): void\n\\`\\`\\`\n\n**功能**: 显示指定构件的边线\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n\n---\n\n## 4. 状态管理\n\n### 4.1 EngineStatus - 引擎状态\n\n**文件路径**: \\`src/core/v2/status/engineStatus.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic isFree: boolean // 引擎是否空闲\npublic highlightModels: any[] // 高亮的模型数组\npublic hideModels: any[] // 隐藏的模型数组\npublic models: any[] // 已加载的模型数组\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化引擎状态监听\n- 监听 \\`EventType.EngineFree\\` 事件\n- 监听 \\`EventType.EngineBusy\\` 事件\n\n##### updateFree()\n\n\\`\\`\\`typescript\npublic updateFree(status: boolean): void\n\\`\\`\\`\n\n**功能**: 更新引擎空闲状态\n\n**参数**:\n- \\`status\\`: true 表示空闲,false 表示繁忙\n\n##### closeAllFunction()\n\n\\`\\`\\`typescript\npublic closeAllFunction(): void\n\\`\\`\\`\n\n**功能**: 关闭所有功能\n\n---\n\n### 4.2 HandelBehaved - 行为处理器\n\n**文件路径**: \\`src/core/v2/status/handelBehaved.ts\\`\n\n这是一个工厂函数,返回行为处理器对象。\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\ninit(self: any, options: any): void\n\\`\\`\\`\n\n**功能**: 初始化行为处理器\n\n**参数**:\n- \\`self\\`: 当前激活的行为对象\n- \\`options\\`: 行为配置选项\n - \\`showCatch\\`: boolean - 是否显示捕捉点\n\n##### active()\n\n\\`\\`\\`typescript\nactive(): void\n\\`\\`\\`\n\n**功能**: 开启事务(激活事件监听)\n- 监听鼠标事件(mousedown, mouseup, mousemove)\n- 监听键盘事件(keydown, keyup)\n\n##### disActive()\n\n\\`\\`\\`typescript\ndisActive(): void\n\\`\\`\\`\n\n**功能**: 关闭事务(禁用事件监听)\n\n**支持的键盘事件**:\n- Delete / Backspace - 删除\n- Escape - 取消\n- Enter - 确认\n- Space - 空格\n- Ctrl / Control - 控制键\n- Shift - 切换键\n- Alt - 辅助键\n- Meta / Command - 命令键\n\n**支持的鼠标事件**:\n- handleMouseDown - 鼠标按下\n- handleMouseMove - 鼠标移动\n- handleMouseUp - 鼠标弹起\n- handleMouseClick - 鼠标单击\n- handleMouseDoubleClick - 鼠标双击\n\n**捕捉功能**:\n- 点捕捉(距离 < 5 像素)\n- 线捕捉(距离 < 5 像素)\n- 面捕捉(默认)\n\n---\n\n## 使用示例\n\n### 初始化引擎\n\n\\`\\`\\`typescript\nimport { EngineKernelV2 } from './src/core/v2/EngineKernel';\n\nconst engine = new EngineKernelV2({\n containerId: 'canvas-container',\n antialias: true\n});\n\\`\\`\\`\n\n### 加载模型\n\n\\`\\`\\`typescript\nawait engine.loaderModule.loadModels([\n 'https://example.com/model1.light',\n 'https://example.com/model2.light'\n]);\n\\`\\`\\`\n\n### 高亮模型\n\n\\`\\`\\`typescript\nengine.modelToolModule.highlightModel([\n { url: 'model1.light', ids: ['wall-001', 'wall-002'] }\n]);\n\\`\\`\\`\n\n### 切换相机\n\n\\`\\`\\`typescript\n// 切换到正交相机\nengine.cameraModule.switchToOrthographicCamera();\n\n// 或切换当前相机类型\nengine.cameraModule.switchCurrentCamera();\n\\`\\`\\`\n\n### 保存和恢复相机姿态\n\n\\`\\`\\`typescript\n// 保存当前相机姿态\nconst pose = engine.cameraModule.getCameraPose();\n\n// 恢复相机姿态\nengine.cameraModule.restoreCameraPose(pose);\n\\`\\`\\`\n\n### 设置光照和渲染质量\n\n\\`\\`\\`typescript\n// 设置环境光强度\nengine.setting.setAmbientLightIntensity(1.5);\n\n// 设置阴影质量\nengine.setting.setShadowQuality('ultra');\n\n// 开启 GTAO\nengine.setting.setGTAOEnabled(true);\n\n// 调整饱和度和对比度\nengine.setting.setSceneSaturation(1.3);\nengine.setting.setSceneContrast(1.1);\n\\`\\`\\`\n\n### 获取模型属性\n\n\\`\\`\\`typescript\nengine.modelProperties.getModelProperties('model.light', 'wall-001', (data) => {\n console.log('属性:', data.properties);\n});\n\\`\\`\\`\n\n### 按类型筛选构件\n\n\\`\\`\\`typescript\nengine.modelMapperBatch.getModelSWithType('墙', (models) => {\n // 高亮所有墙体\n engine.modelToolModule.highlightModel(models);\n});\n\\`\\`\\`\n\n### 监听事件\n\n\\`\\`\\`typescript\n// 监听点击事件\nengine.events.on(EventType.Click, (hit) => {\n console.log('点击了:', hit.object.name);\n});\n\n// 监听视口大小改变\nengine.events.on(EventType.ViewportResize, ({ width, height }) => {\n console.log('视口大小:', width, height);\n});\n\\`\\`\\`\n\n### 暂停和恢复渲染\n\n\\`\\`\\`typescript\n// 暂停渲染(节省性能)\nengine.pauseRendering();\n\n// 恢复渲染\nengine.resumeRendering();\n\n// 检查渲染状态\nif (engine.isRenderingPausedState()) {\n console.log('渲染已暂停');\n}\n\\`\\`\\`\n\n### 销毁引擎\n\n\\`\\`\\`typescript\n// 释放所有资源\nengine.dispose();\n\\`\\`\\`\n\n---\n\n## 总结\n\nBIM Engine SDK 提供了完整的 3D BIM 模型渲染和交互能力,主要特性包括:\n\n- **完整的相机系统**: 支持透视和正交相机,可保存和恢复相机姿态\n- **强大的模型操作**: 高亮、隐藏、隔离、批量筛选\n- **丰富的测量工具**: 距离、净高、净距、标高、角度、面积、坡度\n- **灵活的剖切功能**: 支持 X/Y/Z 轴剖切和剖切盒\n- **可配置的渲染质量**: 阴影、环境光遮蔽、饱和度、对比度\n- **事件驱动架构**: 支持自定义事件监听和触发\n- **性能优化**: 支持暂停/恢复渲染,八叉树加速\n- **完善的资源管理**: 自动释放几何体、材质、纹理等资源\n\n适用场景:\n- BIM 模型在线浏览\n- 建筑设计审查\n- 施工模拟\n- 运维管理\n- AI 辅助设计\n`;\nexport {\n n as default\n};\n//# sourceMappingURL=API文档-B1v8UcRF.mjs.map\n"],"names":["zhCN","enUS","LocaleManager","locale","key","keys","value","k","listener","l","localeManager","t","lightTheme","darkTheme","ThemeManager","themeName","theme","themeManager","EventEmitter","event","listeners","index","payload","error","ManagerRegistry","BimButtonGroup","options","el","stopPropagation","e","eventType","pos","style","margin","dropdown","dropdownStyle","color","themeColors","colorKey","colors","groupId","beforeGroupId","g","newGroup","config","parentId","group","button","parentBtn","buttons","id","btn","found","groupElement","total","groupEl","btnWrapper","wrapper","btnEl","iconSize","minWidth","icon","textWrapper","label","active","newState","siblings","sib","btnRect","expand","currentTheme","subBtn","item","dropdownRect","arrow","buttonId","visible","show","type","Toolbar","createHomeButton","index$c","createZoomBoxButton","index$b","createWalkMenuButton","index$a","createMapButton","index$9","createPropertyButton","index$8","createSettingButton","index$7","createInfoButton","index$6","createFullscreenButton","index$5","createMeasureButton","index$4","createSectionMenuButton","index$3","createSectionPlaneButton","index$2","createSectionAxisButton","index$1","createSectionBoxButton","BaseManager","handler","unsubscribe","unsub","ToolbarManager","container","v","ButtonGroupManager","BimDialog","titleEl","header","title","closeBtn","content","resizeHandle","width","height","recenter","naturalHeight","minHeight","containerHeight","targetHeight","containerW","containerH","elW","elH","bottomOffset","currentLeft","currentTop","maxLeft","maxTop","nextLeft","nextTop","elRect","left","top","pW","pH","startX","startY","startLeft","startTop","onMouseDown","onMouseMove","onMouseUp","dx","dy","newLeft","newTop","handle","startW","startH","newW","newH","BimInfoDialog","contentEl","infoTitle","infoList","actionBtn","DialogManager","dialog","d","REVISION","MOUSE","TOUCH","CullFaceNone","CullFaceBack","CullFaceFront","PCFShadowMap","PCFSoftShadowMap","VSMShadowMap","FrontSide","BackSide","DoubleSide","NoBlending","NormalBlending","AdditiveBlending","SubtractiveBlending","MultiplyBlending","CustomBlending","AddEquation","SubtractEquation","ReverseSubtractEquation","MinEquation","MaxEquation","ZeroFactor","OneFactor","SrcColorFactor","OneMinusSrcColorFactor","SrcAlphaFactor","OneMinusSrcAlphaFactor","DstAlphaFactor","OneMinusDstAlphaFactor","DstColorFactor","OneMinusDstColorFactor","SrcAlphaSaturateFactor","ConstantColorFactor","OneMinusConstantColorFactor","ConstantAlphaFactor","OneMinusConstantAlphaFactor","NeverDepth","AlwaysDepth","LessDepth","LessEqualDepth","EqualDepth","GreaterEqualDepth","GreaterDepth","NotEqualDepth","MultiplyOperation","MixOperation","AddOperation","NoToneMapping","LinearToneMapping","ReinhardToneMapping","CineonToneMapping","ACESFilmicToneMapping","CustomToneMapping","AgXToneMapping","NeutralToneMapping","AttachedBindMode","DetachedBindMode","UVMapping","CubeReflectionMapping","CubeRefractionMapping","EquirectangularReflectionMapping","EquirectangularRefractionMapping","CubeUVReflectionMapping","RepeatWrapping","ClampToEdgeWrapping","MirroredRepeatWrapping","NearestFilter","NearestMipmapNearestFilter","NearestMipmapLinearFilter","LinearFilter","LinearMipmapNearestFilter","LinearMipmapLinearFilter","UnsignedByteType","ByteType","ShortType","UnsignedShortType","IntType","UnsignedIntType","FloatType","HalfFloatType","UnsignedShort4444Type","UnsignedShort5551Type","UnsignedInt248Type","UnsignedInt5999Type","UnsignedInt101111Type","AlphaFormat","RGBFormat","RGBAFormat","DepthFormat","DepthStencilFormat","RedFormat","RedIntegerFormat","RGFormat","RGIntegerFormat","RGBAIntegerFormat","RGB_S3TC_DXT1_Format","RGBA_S3TC_DXT1_Format","RGBA_S3TC_DXT3_Format","RGBA_S3TC_DXT5_Format","RGB_PVRTC_4BPPV1_Format","RGB_PVRTC_2BPPV1_Format","RGBA_PVRTC_4BPPV1_Format","RGBA_PVRTC_2BPPV1_Format","RGB_ETC1_Format","RGB_ETC2_Format","RGBA_ETC2_EAC_Format","RGBA_ASTC_4x4_Format","RGBA_ASTC_5x4_Format","RGBA_ASTC_5x5_Format","RGBA_ASTC_6x5_Format","RGBA_ASTC_6x6_Format","RGBA_ASTC_8x5_Format","RGBA_ASTC_8x6_Format","RGBA_ASTC_8x8_Format","RGBA_ASTC_10x5_Format","RGBA_ASTC_10x6_Format","RGBA_ASTC_10x8_Format","RGBA_ASTC_10x10_Format","RGBA_ASTC_12x10_Format","RGBA_ASTC_12x12_Format","RGBA_BPTC_Format","RGB_BPTC_SIGNED_Format","RGB_BPTC_UNSIGNED_Format","RED_RGTC1_Format","SIGNED_RED_RGTC1_Format","RED_GREEN_RGTC2_Format","SIGNED_RED_GREEN_RGTC2_Format","InterpolateDiscrete","InterpolateLinear","InterpolateSmooth","ZeroCurvatureEnding","ZeroSlopeEnding","WrapAroundEnding","NormalAnimationBlendMode","TrianglesDrawMode","TriangleStripDrawMode","TriangleFanDrawMode","BasicDepthPacking","RGBADepthPacking","TangentSpaceNormalMap","ObjectSpaceNormalMap","NoColorSpace","SRGBColorSpace","LinearSRGBColorSpace","LinearTransfer","SRGBTransfer","KeepStencilOp","AlwaysStencilFunc","NeverCompare","LessCompare","EqualCompare","LessEqualCompare","GreaterCompare","NotEqualCompare","GreaterEqualCompare","AlwaysCompare","StaticDrawUsage","GLSL3","WebGLCoordinateSystem","WebGPUCoordinateSystem","arrayNeedsUint32","array","i","createElementNS","name","createCanvasElement","canvas","_cache","log","params","message","warn","warnOnce","probeAsync","gl","sync","interval","resolve","reject","probe","EventDispatcher","listenerArray","_lut","_seed","DEG2RAD","RAD2DEG","generateUUID","d0","d1","d2","d3","clamp","min","max","euclideanModulo","n","m","mapLinear","x","a1","a2","b1","b2","inverseLerp","y","lerp","damp","lambda","dt","pingpong","length","smoothstep","smootherstep","randInt","low","high","randFloat","randFloatSpread","range","seededRandom","degToRad","degrees","radToDeg","radians","isPowerOfTwo","ceilPowerOfTwo","floorPowerOfTwo","setQuaternionFromProperEuler","q","a","b","c","order","cos","sin","c2","s2","c13","s13","c1_3","s1_3","c3_1","s3_1","denormalize","normalize","MathUtils","Vector2","scalar","s","minVal","maxVal","denominator","theta","alpha","v1","v2","offset","attribute","center","angle","Quaternion","z","w","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","dot","f","quaternion","euler","update","c1","c3","s1","s3","axis","halfAngle","te","m11","m12","m13","m21","m22","m23","m31","m32","m33","trace","vFrom","vTo","r","step","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","qb","qa","theta1","theta2","r1","r2","callback","Vector3","_quaternion$4","vx","vy","vz","qx","qy","qz","qw","tx","ty","tz","camera","ax","ay","az","bx","by","bz","planeNormal","_vector$c","normal","dz","radius","phi","sinPhiRadius","sx","sy","sz","u","Matrix3","n11","n12","n13","n21","n22","n23","n31","n32","n33","me","xAxis","yAxis","zAxis","ae","be","a11","a12","a13","a21","a22","a23","a31","a32","a33","b11","b12","b13","b21","b22","b23","b31","b32","b33","h","t11","t12","t13","det","detInv","tmp","matrix4","rotation","cx","cy","_m3","matrix","LINEAR_REC709_TO_XYZ","XYZ_TO_LINEAR_REC709","createColorManagement","ColorManagement","sourceColorSpace","targetColorSpace","SRGBToLinear","LinearToSRGB","colorSpace","target","colorSpaces","targetMatrix","REC709_PRIMARIES","REC709_LUMINANCE_COEFFICIENTS","D65","_canvas","ImageUtils","image","context","imageData","data","_sourceId","Source","meta","isRootObject","output","url","serializeImage","_textureId","_tempVec3","Texture","mapping","wrapS","wrapT","magFilter","minFilter","format","anisotropy","start","count","source","values","newValue","currentValue","uv","Vector4","xx","yy","zz","xy","xz","yz","RenderTarget","texture","current","depth","il","WebGLRenderTarget","DataArrayTexture","layerIndex","Data3DTexture","Box3","_vector$b","points","size","halfSize","object","precise","box","point","vector","geometry","positionAttribute","_box$4","children","sphere","plane","triangle","_center","_extents","_v0$2","_v1$7","_v2$4","_f0","_f1","_f2","axes","satForAxes","_triangleNormal","_points","json","_testAxis","v0","extents","j","p0","p1","p2","_box$3","_v1$6","_v2$3","Sphere","optionalCenter","maxRadiusSq","radiusSum","deltaLengthSq","lengthSq","delta","_vector$a","_segCenter","_segDir","_diff","_edge1","_edge2","_normal$1","Ray","origin","direction","ray","directionDistance","optionalPointOnRay","optionalPointOnSegment","segExtent","a01","b0","s0","sqrDist","extDet","invDet","tca","radius2","thc","t0","t1","distToPoint","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","backfaceCulling","DdN","sign","DdQxE2","DdE1xQ","QdN","Matrix4","n14","n24","n34","n41","n42","n43","n44","scaleX","_v1$5","scaleY","scaleZ","af","bf","ce","cf","de","df","ac","ad","bc","bd","_zero","_one","eye","up","_z","_x","_y","a14","a24","a34","a41","a42","a43","a44","b14","b24","b34","b41","b42","b43","b44","t14","scaleXSq","scaleYSq","scaleZSq","yx","zx","zy","position","scale","x2","y2","z2","wx","wy","wz","_m1$2","invSX","invSY","invSZ","right","bottom","near","far","coordinateSystem","reversedDepth","_matrix$2","_quaternion$3","Euler","newOrder","Layers","layer","layers","_object3DId","_v1$4","_q1","_m1$1","_target","_position$3","_scale$2","_quaternion$2","_xAxis","_yAxis","_zAxis","_addedEvent","_removedEvent","_childaddedEvent","_childremovedEvent","Object3D","onRotationChange","onQuaternionChange","distance","parent","result","force","updateParents","updateChildren","info","serialize","library","element","parameters","shapes","shape","uuids","animation","geometries","extractFromCache","materials","textures","images","skeletons","animations","nodes","cache","recursive","child","_v0$1","_v1$3","_v2$2","_v3$2","_vab","_vac","_vbc","_vap","_vbp","_vcp","_v40","_v41","_v42","Triangle","targetLengthSq","dot00","dot01","dot02","dot11","dot12","denom","invDenom","p3","v3","attr","i1","i2","i3","barycoord","i0","p","d4","vc","d5","d6","vb","va","_colorKeywords","_hslA","_hslB","hue2rgb","Color","hex","handleAlpha","string","components","_color","hue","saturation","lightness","color1","color2","_materialId","Material","srcPlanes","dstPlanes","MeshBasicMaterial","_vector$9","_vector2$1","_id$2","BufferAttribute","itemSize","normalized","index1","index2","component","Uint16BufferAttribute","Uint32BufferAttribute","Float32BufferAttribute","_id$1","_m1","_obj","_offset","_box$2","_boxMorphTargets","_vector$8","BufferGeometry","indirect","materialIndex","normalMatrix","tangent","morphAttributesPosition","morphAttribute","morphTargetsRelative","jl","attributes","normalAttribute","uvAttribute","tangentAttribute","tan1","tan2","vA","vB","vC","uvA","uvB","uvC","sdir","tdir","handleTriangle","groups","tmp2","n2","handleVertex","pA","pB","pC","nA","nB","nC","cb","ab","normals","convertBufferAttribute","indices","array2","geometry2","newAttribute","morphAttributes","morphArray","hasMorphAttributes","attributeArray","boundingSphere","boundingBox","_inverseMatrix$3","_ray$3","_sphere$6","_sphereHitAt","_vA$1","_vB$1","_vC$1","_tempA","_morphA","_intersectionPoint","_intersectionPointWorld","Mesh","material","ml","morphPosition","morphInfluences","influence","raycaster","intersects","matrixWorld","rayLocalSpace","intersection","uv1","drawRange","groupMaterial","end","checkGeometryIntersection","checkIntersection$1","intersect","face","BoxGeometry","widthSegments","heightSegments","depthSegments","scope","vertices","uvs","numberOfVertices","groupStart","buildPlane","udir","vdir","gridX","gridY","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","gridX1","gridY1","vertexCounter","groupCount","iy","ix","cloneUniforms","src","property","mergeUniforms","uniforms","merged","cloneUniformsGroups","getUnlitUniformColorSpace","renderer","currentRenderTarget","UniformsUtils","default_vertex","default_fragment","ShaderMaterial","extensions","Camera","_v3$1","_minTarget","_maxTarget","PerspectiveCamera","fov","aspect","focalLength","vExtentSlope","minTarget","maxTarget","fullWidth","fullHeight","view","skew","CubeCamera","renderTarget","cameraPX","cameraNX","cameraPY","cameraNY","cameraPZ","cameraNZ","cameras","scene","activeMipmapLevel","currentActiveCubeFace","currentActiveMipmapLevel","currentXrEnabled","generateMipmaps","CubeTexture","WebGLCubeRenderTarget","shader","mesh","currentMinFilter","stencil","Group","_moveEvent","WebXRController","inputSource","hand","inputjoint","frame","referenceSpace","inputPose","gripPose","handPose","targetRay","grip","jointPose","joint","indexTip","thumbTip","distanceToPinch","threshold","Scene","InterleavedBuffer","stride","interleavedBuffer","ib","_vector$7","InterleavedBufferAttribute","SpriteMaterial","_geometry","_intersectPoint","_worldScale","_mvPosition","_alignedPosition","_rotatedPosition","_viewWorldMatrix","_vA","_vB","_vC","_uvA","_uvB","_uvC","Sprite","float32Array","transformVertex","vertexPosition","mvPosition","_basePosition","_skinIndex","_skinWeight","_vector3","_matrix4","_vertex","_sphere$5","_inverseMatrix$2","_ray$2","SkinnedMesh","skeleton","bindMatrix","skinWeight","weight","boneIndex","Bone","DataTexture","_offsetMatrix","_identityMatrix","Skeleton","bones","boneInverses","inverse","bone","boneMatrices","boneTexture","uuid","boneInverse","InstancedBufferAttribute","meshPerAttribute","_instanceLocalMatrix","_instanceWorldMatrix","_instanceIntersects","_box3","_identity","_mesh$1","_sphere$4","InstancedMesh","objectInfluences","len","dataIndex","raycastTimes","instanceId","morphInfluencesSum","morphBaseInfluence","_vector1","_vector2","_normalMatrix","Plane","constant","inverseNormalLength","line","startSign","endSign","optionalNormalMatrix","referencePoint","_sphere$3","_defaultSpriteCenter","_vector$6","Frustum","p4","p5","planes","frustum","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","sprite","negRadius","LineBasicMaterial","_vStart","_vEnd","_inverseMatrix$1","_ray$1","_sphere$1","_intersectPointOnRay","_intersectPointOnSegment","Line","lineDistances","localThreshold","localThresholdSq","checkIntersection","thresholdSq","_start","_end","LineSegments","LineLoop","PointsMaterial","_inverseMatrix","_ray","_sphere","_position$2","Points","testPoint","rayPointDistanceSq","intersectPoint","DepthTexture","ExternalTexture","sourceTexture","Curve","optionalTarget","divisions","lengths","last","sum","arcLengths","targetArcLength","comparison","lengthBefore","segmentLength","segmentFraction","t2","pt1","pt2","segments","closed","tangents","binormals","vec","mat","EllipseCurve","aX","aY","xRadius","yRadius","aStartAngle","aEndAngle","aClockwise","aRotation","twoPi","deltaAngle","samePoints","ArcCurve","aRadius","CubicPoly","c0","init","x3","tension","dt0","dt1","dt2","t3","px","py","pz","CatmullRomCurve3","curveType","intPoint","pow","CatmullRom","QuadraticBezierP0","QuadraticBezierP1","QuadraticBezierP2","QuadraticBezier","CubicBezierP0","CubicBezierP1","CubicBezierP2","CubicBezierP3","CubicBezier","CubicBezierCurve","CubicBezierCurve3","LineCurve","LineCurve3","QuadraticBezierCurve","QuadraticBezierCurve3","SplineCurve","Curves","CurvePath","curve","startPoint","endPoint","lineType","curveLengths","diff","lens","sums","curves","resolution","pts","Path","aCPx","aCPy","aCP1x","aCP1y","aCP2x","aCP2y","npts","firstPoint","lastPoint","Shape","holesPts","hole","earcut","holeIndices","dim","hasHoles","outerLen","outerNode","linkedList","triangles","minX","minY","invSize","eliminateHoles","maxX","maxY","earcutLinked","clockwise","signedArea","insertNode","equals","removeNode","filterPoints","again","area","ear","pass","indexCurve","stop","prev","next","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangleExceptFirst","minZ","zOrder","maxZ","locallyInside","isValidDiagonal","splitPolygon","queue","list","getLeftmost","compareXYSlope","eliminateHole","aSlope","bSlope","bridge","findHoleBridge","bridgeReverse","hx","hy","mx","my","tanMin","pointInTriangle","tan","sectorContainsSector","sortLinked","numMerges","inSize","tail","pSize","qSize","leftmost","intersectsPolygon","middleInside","q1","q2","o1","o2","o3","o4","onSegment","num","inside","createNode","an","bp","Earcut","ShapeUtils","contour","holes","faces","removeDupEndPts","addContour","holeIndex","ExtrudeGeometry","verticesArray","uvArray","addShape","placeholder","curveSegments","steps","bevelEnabled","bevelThickness","bevelSize","bevelOffset","bevelSegments","extrudePath","uvgen","WorldUVGenerator","extrudePts","extrudeByPath","splineTube","binormal","position2","shapePoints","hl","ahole","mergeOverlappingPoints","THRESHOLD_SQ","prevPos","currentIndex","currentPos","distSq","scalingFactorSqrt","thresholdSqScaled","numHoles","scalePt2","pt","vlen","getBevelVec","inPt","inPrev","inNext","v_trans_x","v_trans_y","shrink_by","v_prev_x","v_prev_y","v_next_x","v_next_y","v_prev_lensq","collinear0","v_prev_len","v_next_len","ptPrevShift_x","ptPrevShift_y","ptNextShift_x","ptNextShift_y","sf","v_trans_lensq","direction_eq","contourMovements","holesMovements","oneHoleMovements","verticesMovements","contractedContourVertices","expandedHoleVertices","bs","vert","oneHoleVertices","flen","buildLidFaces","buildSideFaces","f3","layeroffset","sidewalls","sl","slen1","slen2","f4","addVertex","nextIndex","addUV","vector2","toJSON$1","geometryShapes","indexA","indexB","indexC","a_x","a_y","b_x","b_y","c_x","c_y","indexD","a_z","b_z","c_z","d_x","d_y","d_z","PlaneGeometry","width_half","height_half","segment_width","segment_height","RawShaderMaterial","MeshStandardMaterial","MeshPhysicalMaterial","reflectivity","MeshPhongMaterial","MeshNormalMaterial","MeshLambertMaterial","MeshDepthMaterial","MeshDistanceMaterial","convertArray","isTypedArray","getKeyframeOrder","times","compareTime","sortedArray","nValues","srcOffset","flattenJSON","jsonKeys","valuePropertyName","Interpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","pp","validate_interval","seek","linear_scan","forward_scan","giveUpAt","t1global","mid","CubicInterpolant","iPrev","iNext","tPrev","tNext","halfDt","o0","oP","oN","wP","wN","ppp","sP","sN","LinearInterpolant","offset1","offset0","weight1","weight0","DiscreteInterpolant","KeyframeTrack","interpolation","track","trackType","factoryMethod","timeOffset","timeScale","startTime","endTime","nKeys","from","to","valid","valueSize","prevTime","currTime","smoothInterpolation","lastIndex","writeIndex","keep","time","timeNext","offsetP","offsetN","readOffset","writeOffset","TypedKeyframeTrack","BooleanKeyframeTrack","ColorKeyframeTrack","NumberKeyframeTrack","QuaternionLinearInterpolant","QuaternionKeyframeTrack","StringKeyframeTrack","VectorKeyframeTrack","AnimationClip","duration","tracks","blendMode","jsonTracks","frameTime","parseKeyframeTrack","clip","clipTracks","morphTargetSequence","fps","noLoop","numMorphTargets","objectOrClipArray","clipArray","o","morphTargets","animationToMorphTargets","pattern","morphTarget","parts","animationMorphTargets","clips","addNonemptyTrack","trackName","animationKeys","propertyName","destTracks","clipName","hierarchyTracks","morphTargetNames","morphTargetName","animationKey","boneName","getTrackTypeForValueTypeName","typeName","Cache","file","LoadingManager","onLoad","onProgress","onError","isLoading","itemsLoaded","itemsTotal","urlModifier","handlers","transform","regex","loader","DefaultLoadingManager","Loader","manager","crossOrigin","path","resourcePath","requestHeader","loading","HttpError","response","FileLoader","cached","req","mimeType","responseType","callbacks","reader","contentLength","lengthComputable","loaded","stream","controller","readData","done","text","exec","decoder","err","_loading","ImageLoader","arr","onImageLoad","removeEventListeners","onImageError","TextureLoader","Light","intensity","_projScreenMatrix$1","_lightPositionWorld$1","_lookTarget$1","LightShadow","light","shadowCamera","shadowMatrix","viewportIndex","SpotLightShadow","SpotLight","penumbra","decay","power","_projScreenMatrix","_lightPositionWorld","_lookTarget","PointLightShadow","PointLight","OrthographicCamera","scaleW","scaleH","DirectionalLightShadow","DirectionalLight","AmbientLight","LoaderUtils","_errorMap","ImageBitmapLoader","imageBitmap","fetchOptions","promise","res","blob","ArrayCamera","Clock","autoStart","newTime","_RESERVED_CHARS_RE","_reservedRe","_wordChar","_wordCharOrDot","_directoryRe","_nodeRe","_objectRe","_propertyRe","_trackRe","_supportedObjectNames","Composite","targetGroup","optionalParsedPath","parsedPath","PropertyBinding","firstValidIndex","binding","bindings","rootNode","root","matches","results","lastDot","objectName","nodeName","searchNodeSubtree","childNode","subTreeNode","buffer","dest","targetArray","sourceArray","targetObject","propertyIndex","objectIndex","nodeProperty","versioning","bindingType","_matrix","Raycaster","coords","ascSort","objects","propagate","Spherical","other","_startP","_startEnd","_d1","_d2","_r","_c1","_c2","Line3","clampToLine","startEnd2","EPSILON","Controls","domElement","getByteLength","typeByteLength","getTextureTypeByteLength","WebGLAnimation","isAnimating","animationLoop","requestId","onAnimationFrame","WebGLAttributes","buffers","createBuffer","bufferType","usage","updateBuffer","updateRanges","mergeIndex","previousRange","get","remove","alphahash_fragment","alphahash_pars_fragment","alphamap_fragment","alphamap_pars_fragment","alphatest_fragment","alphatest_pars_fragment","aomap_fragment","aomap_pars_fragment","batching_pars_vertex","batching_vertex","begin_vertex","beginnormal_vertex","bsdfs","iridescence_fragment","bumpmap_pars_fragment","clipping_planes_fragment","clipping_planes_pars_fragment","clipping_planes_pars_vertex","clipping_planes_vertex","color_fragment","color_pars_fragment","color_pars_vertex","color_vertex","common","cube_uv_reflection_fragment","defaultnormal_vertex","displacementmap_pars_vertex","displacementmap_vertex","emissivemap_fragment","emissivemap_pars_fragment","colorspace_fragment","colorspace_pars_fragment","envmap_fragment","envmap_common_pars_fragment","envmap_pars_fragment","envmap_pars_vertex","envmap_vertex","fog_vertex","fog_pars_vertex","fog_fragment","fog_pars_fragment","gradientmap_pars_fragment","lightmap_pars_fragment","lights_lambert_fragment","lights_lambert_pars_fragment","lights_pars_begin","envmap_physical_pars_fragment","lights_toon_fragment","lights_toon_pars_fragment","lights_phong_fragment","lights_phong_pars_fragment","lights_physical_fragment","lights_physical_pars_fragment","lights_fragment_begin","lights_fragment_maps","lights_fragment_end","logdepthbuf_fragment","logdepthbuf_pars_fragment","logdepthbuf_pars_vertex","logdepthbuf_vertex","map_fragment","map_pars_fragment","map_particle_fragment","map_particle_pars_fragment","metalnessmap_fragment","metalnessmap_pars_fragment","morphinstance_vertex","morphcolor_vertex","morphnormal_vertex","morphtarget_pars_vertex","morphtarget_vertex","normal_fragment_begin","normal_fragment_maps","normal_pars_fragment","normal_pars_vertex","normal_vertex","normalmap_pars_fragment","clearcoat_normal_fragment_begin","clearcoat_normal_fragment_maps","clearcoat_pars_fragment","iridescence_pars_fragment","opaque_fragment","packing","premultiplied_alpha_fragment","project_vertex","dithering_fragment","dithering_pars_fragment","roughnessmap_fragment","roughnessmap_pars_fragment","shadowmap_pars_fragment","shadowmap_pars_vertex","shadowmap_vertex","shadowmask_pars_fragment","skinbase_vertex","skinning_pars_vertex","skinning_vertex","skinnormal_vertex","specularmap_fragment","specularmap_pars_fragment","tonemapping_fragment","tonemapping_pars_fragment","transmission_fragment","transmission_pars_fragment","uv_pars_fragment","uv_pars_vertex","uv_vertex","worldpos_vertex","ShaderChunk","UniformsLib","ShaderLib","_rgb","_e1$1","WebGLBackground","cubemaps","cubeuvmaps","state","premultipliedAlpha","clearColor","clearAlpha","planeMesh","boxMesh","currentBackground","currentBackgroundVersion","currentTonemapping","getBackground","background","render","forceClear","setClear","environmentBlendMode","addToRenderList","renderList","dispose","WebGLBindingStates","maxVertexAttributes","bindingStates","defaultState","createBindingState","currentState","forceUpdate","setup","program","updateBuffers","getBindingState","bindVertexArrayObject","needsUpdate","saveCache","setupVertexAttributes","createVertexArrayObject","vao","deleteVertexArrayObject","wireframe","programMap","stateMap","newAttributes","enabledAttributes","attributeDivisors","cachedAttributes","geometryAttributes","attributesNum","programAttributes","cachedAttribute","geometryAttribute","initAttributes","enableAttribute","enableAttributeAndDivisor","disableUnusedAttributes","vertexAttribPointer","integer","materialDefaultAttributeValues","programAttribute","bytesPerElement","reset","geometryId","programId","releaseStatesOfGeometry","releaseStatesOfProgram","resetDefaultState","WebGLBufferRenderer","mode","setMode","renderInstances","primcount","renderMultiDraw","starts","counts","drawCount","elementCount","renderMultiDrawInstances","extension","WebGLCapabilities","utils","maxAnisotropy","getMaxAnisotropy","textureFormatReadable","textureFormat","textureTypeReadable","textureType","halfFloatSupportedByExt","getMaxPrecision","precision","maxPrecision","logarithmicDepthBuffer","reversedDepthBuffer","maxTextures","maxVertexTextures","maxTextureSize","maxCubemapSize","maxAttributes","maxVertexUniforms","maxVaryings","maxFragmentUniforms","vertexTextures","maxSamples","WebGLClipping","properties","globalState","numGlobalPlanes","localClippingEnabled","renderingShadows","viewNormalMatrix","uniform","enableLocalClipping","enabled","projectPlanes","useCache","clipIntersection","clipShadows","materialProperties","resetGlobalState","nGlobal","lGlobal","dstArray","skipTransform","nPlanes","flatSize","viewMatrix","i4","WebGLCubeMaps","mapTextureMapping","cubemap","onTextureDispose","LOD_MIN","EXTRA_LOD_SIGMA","MAX_SAMPLES","GGX_SAMPLES","_flatCamera","_clearColor","_oldTarget","_oldActiveCubeFace","_oldActiveMipmapLevel","_oldXrEnabled","_origin","PMREMGenerator","sigma","cubeUVRenderTarget","equirectangular","_getCubemapMaterial","_getEquirectMaterial","cubeSize","outputTarget","_setViewport","_createRenderTarget","_lodMax","_createPlanes","_getBlurShader","_getGGXShader","cubeCamera","upSign","forwardSign","originalAutoClear","toneMapping","backgroundBox","backgroundMaterial","useSolidColor","col","isCubeTexture","autoClear","lodIn","lodOut","pingPongRenderTarget","ggxMaterial","ggxMesh","ggxUniforms","targetRoughness","sourceRoughness","incrementalRoughness","blurStrength","adjustedRoughness","outputSize","poleAxis","targetIn","targetOut","sigmaRadians","blurMaterial","STANDARD_DEVIATIONS","blurMesh","blurUniforms","pixels","radiansPerPixel","sigmaPixels","samples","weights","lodMax","sizeLods","sigmas","lodMeshes","lod","totalLods","sizeLod","texelSize","cubeFaces","positionSize","uvSize","faceIndexSize","faceIndex","coordinates","fill","_getCommonVertexShader","WebGLCubeUVMaps","cubeUVmaps","pmremGenerator","isEquirectMap","isCubeMap","currentPMREMVersion","isCubeTextureComplete","cubemapUV","WebGLExtensions","getExtension","WebGLGeometries","wireframeAttributes","onGeometryDispose","updateWireframeAttribute","geometryIndex","geometryPosition","version","previousAttribute","getWireframeAttribute","currentAttribute","WebGLIndexedBufferRenderer","setIndex","WebGLInfo","memory","instanceCount","WebGLMorphtargets","capabilities","morphTextures","morph","morphTargetsCount","entry","disposeTexture","hasMorphPosition","hasMorphNormals","hasMorphColors","morphNormals","morphColors","vertexDataCount","vertexDataStride","morphNormal","morphColor","WebGLObjects","updateMap","buffergeometry","onInstancedMeshDispose","instancedMesh","emptyTexture","emptyShadowTexture","emptyArrayTexture","empty3dTexture","emptyCubeTexture","arrayCacheF32","arrayCacheI32","mat4array","mat3array","mat2array","flatten","nBlocks","blockSize","firstElem","arraysEqual","copyArray","allocTexUnits","setValueV1f","setValueV2f","setValueV3f","setValueV4f","setValueM2","elements","setValueM3","setValueM4","setValueV1i","setValueV2i","setValueV3i","setValueV4i","setValueV1ui","setValueV2ui","setValueV3ui","setValueV4ui","setValueT1","unit","emptyTexture2D","setValueT3D1","setValueT6","setValueT2DArray1","getSingularSetter","setValueV1fArray","setValueV2fArray","setValueV3fArray","setValueV4fArray","setValueM2Array","setValueM3Array","setValueM4Array","setValueV1iArray","setValueV2iArray","setValueV3iArray","setValueV4iArray","setValueV1uiArray","setValueV2uiArray","setValueV3uiArray","setValueV4uiArray","setValueT1Array","units","setValueT3DArray","setValueT6Array","setValueT2DArrayArray","getPureArraySetter","SingleUniform","activeInfo","addr","PureArrayUniform","StructuredUniform","seq","RePathPart","addUniform","uniformObject","parseUniform","pathLength","match","matchEnd","idIsIndex","subscript","WebGLUniforms","WebGLShader","COMPLETION_STATUS_KHR","programIdCount","handleSource","errorLine","lines","lines2","_m0","getEncodingComponents","encodingMatrix","getShaderErrors","status","errors","errorMatches","getTexelEncodingFunction","functionName","getToneMappingFunction","toneMappingName","_v0","getLuminanceFunction","generateVertexExtensions","filterEmptyLine","generateDefines","defines","chunks","fetchAttributeLocations","locationSize","replaceLightNums","numSpotLightCoords","replaceClippingPlaneNums","includePattern","resolveIncludes","includeReplacer","shaderChunkMap","include","newInclude","unrollLoopPattern","unrollLoops","loopReplacer","snippet","generatePrecision","precisionstring","generateShadowMapTypeDefine","shadowMapTypeDefine","generateEnvMapTypeDefine","envMapTypeDefine","generateEnvMapModeDefine","envMapModeDefine","generateEnvMapBlendingDefine","envMapBlendingDefine","generateCubeUVSize","imageHeight","maxMip","texelHeight","WebGLProgram","cacheKey","vertexShader","fragmentShader","envMapCubeUVSize","customVertexExtensions","customDefines","prefixVertex","prefixFragment","versionString","vertexGlsl","fragmentGlsl","glVertexShader","glFragmentShader","onFirstUse","self","programInfoLog","vertexShaderInfoLog","fragmentShaderInfoLog","programLog","vertexLog","fragmentLog","runnable","haveDiagnostics","vertexErrors","fragmentErrors","cachedUniforms","programReady","_id","WebGLShaderCache","vertexShaderStage","fragmentShaderStage","materialShaders","shaderStage","set","code","stage","WebGLShaderStage","WebGLPrograms","clipping","_programLayers","_customShaders","_activeChannels","programs","SUPPORTS_VERTEX_TEXTURES","shaderIDs","getChannel","getParameters","lights","shadows","fog","environment","envMap","envMapCubeUVHeight","shaderID","morphTextureStride","customVertexShaderID","customFragmentShaderID","IS_INSTANCEDMESH","IS_BATCHEDMESH","HAS_MAP","HAS_MATCAP","HAS_ENVMAP","HAS_AOMAP","HAS_LIGHTMAP","HAS_BUMPMAP","HAS_NORMALMAP","HAS_DISPLACEMENTMAP","HAS_EMISSIVEMAP","HAS_METALNESSMAP","HAS_ROUGHNESSMAP","HAS_ANISOTROPY","HAS_CLEARCOAT","HAS_DISPERSION","HAS_IRIDESCENCE","HAS_SHEEN","HAS_TRANSMISSION","HAS_ANISOTROPYMAP","HAS_CLEARCOATMAP","HAS_CLEARCOAT_NORMALMAP","HAS_CLEARCOAT_ROUGHNESSMAP","HAS_IRIDESCENCEMAP","HAS_IRIDESCENCE_THICKNESSMAP","HAS_SHEEN_COLORMAP","HAS_SHEEN_ROUGHNESSMAP","HAS_SPECULARMAP","HAS_SPECULAR_COLORMAP","HAS_SPECULAR_INTENSITYMAP","HAS_TRANSMISSIONMAP","HAS_THICKNESSMAP","HAS_GRADIENTMAP","HAS_ALPHAMAP","HAS_ALPHATEST","HAS_ALPHAHASH","HAS_EXTENSIONS","getProgramCacheKey","getProgramCacheKeyParameters","getProgramCacheKeyBooleans","getUniforms","acquireProgram","pl","preexistingProgram","releaseProgram","releaseShaderCache","WebGLProperties","has","map","painterSortStable","reversePainterSortStable","WebGLRenderList","renderItems","renderItemsIndex","opaque","transmissive","transparent","getNextRenderItem","groupOrder","renderItem","push","unshift","sort","customOpaqueSort","customTransparentSort","finish","WebGLRenderLists","lists","renderCallDepth","listArray","UniformsCache","ShadowUniformsCache","nextVersion","shadowCastingAndTexturingLightsFirst","lightA","lightB","WebGLLights","shadowCache","vector3","matrix42","directionalLength","pointLength","spotLength","rectAreaLength","hemiLength","numDirectionalShadows","numPointShadows","numSpotShadows","numSpotMaps","numSpotShadowsWithMaps","numLightProbes","shadowMap","shadow","shadowUniforms","hash","setupView","WebGLRenderState","lightsArray","shadowsArray","pushLight","pushShadow","shadowLight","setupLights","setupLightsView","WebGLRenderStates","renderStates","renderStateArray","renderState","vertex","fragment","WebGLShadowMap","_frustum","_shadowMapSize","_viewportSize","_viewport","_depthMaterial","_distanceMaterial","_materialCache","_maxTextureSize","shadowSide","shadowMaterialVertical","shadowMaterialHorizontal","fullScreenTri","fullScreenMesh","_previousType","activeCubeFace","_state","toVSM","fromVSM","shadowFrameExtents","pars","viewportCount","vp","viewport","renderObject","VSMPass","getDepthMaterial","customMaterial","keyA","keyB","materialsForVariant","cachedMaterial","onMaterialDispose","kl","depthMaterial","reversedFuncs","WebGLState","ColorBuffer","locked","currentColorMask","currentColorClear","colorMask","lock","DepthBuffer","currentReversed","currentDepthMask","currentDepthFunc","currentDepthClear","reversed","ext","oldDepth","depthTest","enable","disable","depthMask","depthFunc","StencilBuffer","currentStencilMask","currentStencilFunc","currentStencilRef","currentStencilFuncMask","currentStencilFail","currentStencilZFail","currentStencilZPass","currentStencilClear","stencilTest","stencilMask","stencilFunc","stencilRef","stencilFail","stencilZFail","stencilZPass","colorBuffer","depthBuffer","stencilBuffer","uboBindings","uboProgramMap","enabledCapabilities","currentBoundFramebuffers","currentDrawbuffers","defaultDrawbuffers","currentProgram","currentBlendingEnabled","currentBlending","currentBlendEquation","currentBlendSrc","currentBlendDst","currentBlendEquationAlpha","currentBlendSrcAlpha","currentBlendDstAlpha","currentBlendColor","currentBlendAlpha","currentPremultipledAlpha","currentFlipSided","currentCullFace","currentLineWidth","currentPolygonOffsetFactor","currentPolygonOffsetUnits","lineWidthAvailable","glVersion","currentTextureSlot","currentBoundTextures","scissorParam","viewportParam","currentScissor","currentViewport","createTexture","dimensions","emptyTextures","setFlipSided","setCullFace","setBlending","bindFramebuffer","framebuffer","drawBuffers","useProgram","equationToGL","factorToGL","blending","blendEquation","blendSrc","blendDst","blendEquationAlpha","blendSrcAlpha","blendDstAlpha","blendColor","blendAlpha","setMaterial","frontFaceCW","flipSided","stencilWrite","setPolygonOffset","cullFace","setLineWidth","polygonOffset","factor","setScissorTest","scissorTest","activeTexture","webglSlot","bindTexture","webglType","webglTexture","boundTexture","unbindTexture","compressedTexImage2D","compressedTexImage3D","texSubImage2D","texSubImage3D","compressedTexSubImage2D","compressedTexSubImage3D","texStorage2D","texStorage3D","texImage2D","texImage3D","scissor","updateUBOMapping","uniformsGroup","blockIndex","uniformBlockBinding","WebGLTextures","_gl","multisampledRTTExt","supportsInvalidateFramebuffer","_imageDimensions","_videoTextures","_sources","useOffscreenCanvas","createCanvas","resizeImage","needsNewCanvas","maxSize","getDimensions","textureNeedsGenerateMipmaps","generateMipmap","getTargetType","getInternalFormat","internalFormatName","glFormat","glType","forceLinearTransfer","internalFormat","transfer","getInternalDepthFormat","useStencil","depthType","glInternalFormat","getMipLevels","deallocateTexture","onRenderTargetDispose","deallocateRenderTarget","textureProperties","webglTextures","deleteTexture","renderTargetProperties","level","attachmentProperties","textureUnits","resetTextureUnits","allocateTextureUnit","textureUnit","getTextureCacheKey","setTexture2D","slot","updateVideoTexture","uploadTexture","setTexture2DArray","setTexture3D","setTextureCube","uploadCubeTexture","wrappingToGL","filterToGL","compareToGL","setTextureParameters","initTexture","forceUpload","textureCacheKey","getRow","rowLength","componentStride","updateTexture","previousEnd","currentRow","previousRow","currentUnpackRowLen","currentUnpackSkipPixels","currentUnpackSkipRows","pixelStart","pixelCount","sourceProperties","workingPrimaries","texturePrimaries","unpackConversion","verifyColorSpace","mipmap","mipmaps","useTexStorage","allocateMemory","dataReady","levels","layerByteLength","layerData","isCompressed","isDataTexture","cubeImage","mipmapImage","setupFrameBufferTexture","attachment","textureTarget","useMultisampledRTT","getRenderTargetSamples","setupRenderBufferStorage","renderbuffer","isMultisample","depthTexture","glAttachmentType","setupDepthTexture","webglDepthTexture","setupDepthRenderbuffer","isCube","disposeEvent","rebindTextures","colorTexture","setupRenderTarget","isMultipleRenderTargets","glTextureType","updateRenderTargetMipmap","targetType","invalidationArrayRead","invalidationArrayDraw","updateMultisampleRenderTarget","mask","depthStyle","WebGLUtils","convert","_occlusion_vertex","_occlusion_fragment","WebXRDepthSensing","depthData","cameraXR","WebXRManager","session","framebufferScaleFactor","referenceSpaceType","foveation","customReferenceSpace","pose","glBinding","glProjLayer","glBaseLayer","xrFrame","supportsGlBinding","depthSensing","cameraAccessTextures","initialRenderTarget","newRenderTarget","controllers","controllerInputSources","currentSize","currentPixelRatio","cameraL","cameraR","_currentDepthNear","_currentDepthFar","onSessionEvent","controllerIndex","onSessionEnd","onInputSourcesChange","space","depthFormat","glDepthFormat","projectionlayerInit","layerInit","cameraLPos","cameraRPos","setProjectionFromUnion","ipd","projL","projR","topFov","bottomFov","leftFov","rightFov","zOffset","xOffset","near2","far2","left2","right2","top2","bottom2","updateCamera","depthNear","depthFar","updateUserCamera","xrCamera","onAnimationFrameCallback","views","cameraXRNeedsUpdate","glSubImage","enabledFeatures","cameraTex","glTexture","_e1","WebGLMaterials","refreshTransformUniform","refreshFogUniforms","refreshMaterialUniforms","pixelRatio","transmissionRenderTarget","refreshUniformsCommon","refreshUniformsToon","refreshUniformsPhong","refreshUniformsStandard","refreshUniformsPhysical","refreshUniformsMatcap","refreshUniformsDistance","refreshUniformsLine","refreshUniformsDash","refreshUniformsPoints","refreshUniformsSprites","envMapRotation","WebGLUniformsGroups","updateList","allocatedBindingPoints","maxBindingPoints","bind","webglProgram","prepareUniformsGroup","onUniformsGroupsDispose","updateBufferData","bindingPointIndex","allocateBindingPointIndex","uniformArray","hasUniformChanged","arrayOffset","getUniformSize","indexArray","indexString","cachedObject","chunkSize","chunkOffset","chunkPadding","chunkStart","DATA","lut","getDFGLUT","WebGLRenderer","antialias","preserveDrawingBuffer","powerPreference","failIfMajorPerformanceCaveat","_alpha","INTEGER_FORMATS","UNSIGNED_TYPES","uintClearColor","intClearColor","currentRenderList","currentRenderState","renderListStack","renderStateStack","_this","_isContextLost","_currentActiveCubeFace","_currentActiveMipmapLevel","_currentRenderTarget","_currentMaterialId","_currentCamera","_currentViewport","_currentScissor","_currentScissorTest","_currentClearColor","_currentClearAlpha","_width","_height","_pixelRatio","_opaqueSort","_transparentSort","_scissor","_scissorTest","_clippingEnabled","_localClippingEnabled","_vector4","_emptyScene","_renderBackground","getTargetPixelRatio","getContext","contextName","contextAttributes","onContextLost","onContextRestore","onContextCreationError","programCache","renderLists","morphtargets","bufferRenderer","indexedBufferRenderer","uniformsGroups","initGLContext","xr","updateStyle","boolean","method","bits","isIntegerFormat","targetFormat","isUnsignedType","onXRSessionStart","onXRSessionEnd","infoAutoReset","shadowMapEnabled","shadowMapAutoUpdate","shadowMapNeedsUpdate","shadowMapType","deallocateMaterial","releaseMaterialProgramReferences","setProgram","rangeFactor","drawStart","drawEnd","lineWidth","maxInstanceCount","prepareMaterial","getProgram","targetScene","material2","checkMaterialsReady","depthSensingMesh","projectObject","opaqueObjects","transmissiveObjects","camera2","renderTransmissionPass","renderScene","sortObjects","transparentObjects","renderObjects","activeViewport","currentToneMapping","currentCameraViewport","renderTargetNeedsUpdate","currentSide","overrideMaterial","lightsStateVersion","programCacheKey","updateCommonMaterialProperties","materialNeedsLights","getUniformList","progUniforms","vertexAlphas","vertexTangents","needsProgramChange","refreshProgram","refreshMaterial","refreshLights","p_uniforms","m_uniforms","uCamPos","markUniformsLightsNeedsUpdate","defaultFramebuffer","_scratchFrameBuffer","useDefaultFramebuffer","isRenderTarget3D","__webglFramebuffer","activeCubeFaceIndex","textureIndex","glBuffer","currFramebuffer","levelScale","_srcFramebuffer","_dstFramebuffer","srcTexture","dstTexture","srcRegion","dstPosition","srcLevel","dstLevel","dstX","dstY","dstZ","glTarget","currentUnpackImageHeight","currentUnpackSkipImages","isSrc3D","isDst3D","srcTextureProperties","dstTextureProperties","srcRenderTargetProperties","dstRenderTargetProperties","Dl","E.Scene","E.Group","Ll","E.PerspectiveCamera","E.OrthographicCamera","Bl","Il","E.WebGLRenderer","E.PCFSoftShadowMap","E.SRGBColorSpace","E.ACESFilmicToneMapping","er","Wo","Wn","Js","br","Ui","zl","Lo","Z","ze","$i","Nl","Na","fn","cn","Ri","fr","Ul","Ol","Fl","ql","Hl","Gl","Wl","Xl","Vl","Kl","Zl","vr","E.Vector3","E.Raycaster","E.Euler","tr","E.Vector2","_","C","P","B","T","D","A","I","M","H","ee","E.MathUtils","Yl","Xt","Jt","$l","Bo","Jl","Fi","dr","Ql","ji","Qs","vi","et","yt","Sr","ec","tc","dn","pn","Oa","nc","je","Xn","Ae","qn","Ji","ic","sc","Io","Zt","Kn","Xo","rc","oc","ne","O","N","J","K","fe","pe","se","oe","ue","Se","De","S","G","L","R","W","X","U","Y","Q","$","ie","he","$e","ke","Lt","ye","en","vn","Je","vt","Bt","It","zt","St","Ne","Ua","mr","Gn","Hn","pr","Fa","Va","ja","Ha","Di","Ga","Wa","yn","Xa","hn","Zn","lc","Li","Ka","Za","Ya","$a","Ja","Qa","tl","cc","hc","uc","E.WebGLRenderTarget","E.LinearFilter","E.RGBAFormat","Yn","qo","$n","Qi","Tr","fc","Sn","jn","dc","Ko","Zo","pc","nr","Hi","Yo","Gi","it","Wi","xn","wn","On","Ue","$o","mc","gc","Jo","Un","yc","Si","wc","_c","xc","Sc","Tc","Ec","Mc","Ac","Cc","Pc","kc","Fn","Qo","Wt","ea","Bs","Rc","Dc","Lc","Bc","Ic","zc","Nc","Oc","Uc","Fc","Vc","Er","jc","ta","Hc","Gc","Wc","Xc","qc","Kc","Zc","Yc","na","$c","Jc","F","re","ia","sa","Qc","Is","ra","Mr","eh","th","Xi","Ar","ir","oa","nh","aa","Cr","la","ih","sh","rh","oh","sr","zs","ah","lh","ch","hh","Re","uh","fh","dh","ca","ph","Vn","mh","gh","Pr","Tn","Ti","yh","wh","es","_h","xh","Fe","ts","ha","bn","ua","bh","vh","Sh","Ii","kr","Rr","Th","Eh","Mh","Ah","fa","Dr","Yt","da","Ch","Ph","kh","Rh","Dh","Lh","Lr","Br","Jn","Bh","Ir","zr","Nr","Ih","zh","pa","rr","Or","Nh","Oh","ma","ns","Ur","ga","qi","Fr","Uh","Ei","st","qt","Fh","ya","Vh","jh","Ns","wa","_e","mp","gp","yp","wp","_p","xp","Sp","Tp","Ep","Mp","Ap","Cp","Pp","Hh","Gh","_a","is","Wh","zo","Bi","Rt","lt","at","No","Oo","Xh","_n","qh","E.MeshBasicMaterial","E.BufferGeometry","Qn","E.Color","ei","E.InstancedMesh","ti","E.Matrix4","E.Shape","E.ExtrudeGeometry","E.MeshPhongMaterial","E.DoubleSide","E.Mesh","Kh","Vr","jr","nl","Rs","Uo","Zh","eu","tu","hu","uu","fu","iu","su","ru","ou","Qh","au","nu","cu","lu","$h","du","pu","In","xa","le","mu","Cu","Jh","gu","yu","wu","Yh","rl","rt","ht","We","ol","al","Fo","En","Hr","Os","mn","ba","Cl","_u","xu","Gr","Ds","fl","ul","Vo","Wr","dl","ss","Tt","bu","Ho","Al","rs","vu","jo","Ls","Nt","Su","Tu","Eu","os","Us","Mu","Au","ll","cl","gr","Zi","Vi","yl","Xr","wl","_l","xl","bl","vl","Yi","Sl","Tl","El","Ml","wr","yr","Pu","nt","Pl","ku","Ru","Du","E.Box3","Lu","qr","E.FrontSide","E.MeshStandardMaterial","E.LinearSRGBColorSpace","E.MeshPhysicalMaterial","E.MeshLambertMaterial","Bu","Iu","zu","Nu","E.DirectionalLight","E.AmbientLight","wt","Ou","Uu","Kr","Ge","Mi","Fu","Zr","Vu","ju","Hu","gn","Bn","Gu","Fs","Vs","Wu","ct","as","Xu","qu","Ku","E.Quaternion","E.TextureLoader","E.BoxGeometry","Zu","Yu","$u","Ju","E.PlaneGeometry","_t","bt","Qu","ef","tf","nf","rf","of","lf","E.BufferAttribute","E.LineBasicMaterial","E.Line","E.Plane","Sa","hf","uf","Yr","ls","$r","Be","Ee","Ta","ff","cs","Qt","pf","mf","Ea","Jr","hs","Qr","we","eo","no","ni","Mn","mt","gf","Et","ii","yf","wf","us","_f","xf","Ma","Ai","js","Aa","Hs","vf","Gs","Sf","Tf","Ef","xt","Mf","or","Af","Ze","Cf","gt","io","He","Ye","Oe","Ie","ar","Pf","qe","Me","Ve","Ke","Ce","Pe","lr","kf","ge","Pt","un","tn","si","Rf","Ws","An","fs","Df","ri","Go","Lf","Ot","Ut","Ft","oi","ai","li","so","ro","oo","Cn","Bf","ao","lo","Ki","ve","If","zf","Nf","Of","Dt","Uf","Ff","Vf","jf","Xs","Hf","Gf","qs","ci","nn","sn","Pn","co","hi","Wf","Ks","ui","ds","kn","Xf","qf","Kf","Zf","Yf","$f","Jf","Zs","Qf","ed","Ys","fi","rn","on","Rn","ho","di","td","$s","pi","ps","Dn","nd","sd","rd","od","zn","zi","At","ln","ms","gs","ys","ld","Qe","mi","uo","cd","cr","Ca","hd","Pa","ud","ot","fd","fo","dd","pd","ka","md","gd","yd","wd","hr","_d","xd","vd","po","mo","Sd","go","yo","Td","ws","_s","gi","Ed","Md","xs","Ad","$t","Cd","Ni","Pd","vs","wo","_o","Ct","Ss","Ln","kd","ut","xe","ft","Ts","xo","yi","Es","Rd","Dd","Ld","bo","Bd","vo","Id","zd","Nd","Ra","Od","Da","La","Xe","So","Le","To","Eo","Mo","Ms","wi","_i","Ao","As","Cs","Ud","Ht","Gt","Ci","Pi","Nn","Vt","ur","Fd","ki","Co","Ba","Vd","jd","Hd","Ps","Gd","ks","Ia","Wd","Po","Xd","kt","Oi","Rl","jt","xi","Mt","bi","tt","Kt","qd","Kd","ko","Ro","Zd","Yd","$d","Do","Jd","za","E.Float32BufferAttribute","Qd","ep","tp","np","ip","sp","rp","op","ap","E.LineSegments","lp","cp","main2Txx2Vau","stepCkmZYIvn","API__B1v8UcRF","hp","E.Points","E.Sprite","E.Texture","kp","Engine","engineConfig","createEngineSDK","_theme","activateFunc","speed","BimRightKey","rect","viewportWidth","viewportHeight","newX","newY","BimMenu","items","defaultGroup","groupName","sortedGroupKeys","divider","groupItems","isEnabled","iconDiv","labelDiv","hasChildren","arrowDiv","parentLi","subMenu","subRect","RightKeyManager","menu","infoMenuButton","registry","secondMenuButton","fourMenuButton","homeMenuButton","EngineManager","TreeNodeCheckState","BimTreeNode","nodeEl","iconEl","indent","selected","newChecked","fireEvent","BimTree","searchContainer","query","lowerQuery","node","noData","childConfig","isChecked","allChecked","allUnchecked","checked","expanded","includeHalfChecked","BimTab","tab","tabId","panel","targetTab","isActive","ICONS","getIcon","MOCK_STRUCT_DATA","ConstructTreeManagerBtn","tree","_node","systemPlaceholder","spacePlaceholder","componentPanel","tabMount","BimCollapseItem","itemEl","extraEl","BimCollapse","itemConfig","BimDescription","labelEl","valueEl","PropertyPanelManager","contentContainer","preview","descContainer","BaseDialogManager","containerWidth","MEASURE_MODE_ICON_SVGS","MeasurePanel","partial","persist","toolsBox","grid","modes","fallbackCircleIconSvg","toggleBox","toggleIconEl","resultBox","mainValueRow","mainValueLabel","mainValueValue","xyzBox","makeXyzRow","labelKey","valueClassName","valueElSetter","row","footer","unitRow","unitLabel","hint","precisionRow","precisionLabel","actions","opt","raw","parsed","xyz","mm","mm3","unitText","valueMm","converted","valueMm3","MeasureDialogManager","panelWrapper","SectionPlanePanel","iconSvg","onClick","SectionPlaneDialogManager","paddingRight","paddingBottom","SectionAxisPanel","isHidden","row1","row2","_type","SectionAxisDialogManager","DEFAULT_RANGE","SectionBoxPanel","isReversed","buttonsContainer","slidersContainer","ref","iconMap","slider","minHandle","maxHandle","handleType","percentage","minH","maxH","rangeEl","SectionBoxDialogManager","WalkControlPanel","newMode","leftButtons","divider1","divider2","exitBtn","gravityWrapper","collisionWrapper","characterWrapper","walkModeWrapper","controlGroup","oldMode","speedWrapper","speedLabel","constructionWorkerOption","officeMaleOption","walkOption","runOption","WalkPathPanel","WalkPathDialogManager","WalkControlManager","engineSpeed","model","MapPanel","MapDialogManager","paddingLeft","BimEngine","doc","isFullscreen","targetElem","exitMethod","requestMethod"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEhCC,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wDAE5BC,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAExBC,GAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAE7BC,GAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA2JlB,kBAzJgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA0JhB,kBAxJkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAyJlB,cAvJgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAwJ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AAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MA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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0GCAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mICAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","x_google_ignoreList":[15,16]} \ No newline at end of file +{"version":3,"file":"iflow-engine.umd.js","sources":["../src/locales/zh-CN.ts","../src/locales/en-US.ts","../src/services/locale.ts","../src/themes/presets.ts","../src/services/theme.ts","../src/core/event-emitter.ts","../src/core/manager-registry.ts","../src/components/button-group/index.ts","../src/components/button-group/toolbar/index.ts","../src/core/base-manager.ts","../src/managers/toolbar-manager.ts","../src/managers/button-group-manager.ts","../src/components/dialog/index.ts","../src/components/dialog/bimInfoDialog/index.ts","../src/managers/dialog-manager.ts","../../bim_engine_base/node_modules/three/build/three.core.js","../../bim_engine_base/node_modules/three/build/three.module.js","../../bim_engine_base/dist/bim-engine-sdk.es.js","../src/components/engine/index.ts","../src/components/right-key/index.ts","../src/components/menu/index.ts","../src/managers/right-key-manager.ts","../src/managers/engine-manager.ts","../src/components/tree/types.ts","../src/components/tree/tree-node.ts","../src/components/tree/index.ts","../src/components/tab/index.ts","../src/utils/icon-manager.ts","../src/managers/construct-tree-manager-btn.ts","../src/core/base-dialog-manager.ts","../src/components/measure-panel/index.ts","../src/managers/measure-dialog-manager.ts","../src/components/section-plane-panel/index.ts","../src/managers/section-plane-dialog-manager.ts","../src/components/section-axis-panel/index.ts","../src/managers/section-axis-dialog-manager.ts","../src/components/section-box-panel/index.ts","../src/managers/section-box-dialog-manager.ts","../src/components/walk-control-panel/index.ts","../src/components/walk-path-panel/index.ts","../src/managers/walk-path-dialog-manager.ts","../src/managers/walk-control-manager.ts","../src/components/map-panel/index.ts","../src/managers/map-dialog-manager.ts","../src/components/collapse/index.ts","../src/managers/component-detail-manager.ts","../src/bim-engine.ts","../src/components/button-group/toolbar/buttons/home/index.ts","../src/components/button-group/toolbar/buttons/zoom-box/index.ts","../src/components/button-group/toolbar/buttons/walk/walk-menu/index.ts","../src/components/button-group/toolbar/buttons/map/index.ts","../src/components/button-group/toolbar/buttons/property/index.ts","../src/components/button-group/toolbar/buttons/setting/index.ts","../src/components/button-group/toolbar/buttons/info/index.ts","../src/components/button-group/toolbar/buttons/fullscreen/index.ts","../src/components/button-group/toolbar/buttons/measure/index.ts","../src/components/button-group/toolbar/buttons/section/section-menu/index.ts","../src/components/button-group/toolbar/buttons/section/section-plane/index.ts","../src/components/button-group/toolbar/buttons/section/section-axis/index.ts","../src/components/button-group/toolbar/buttons/section/section-box/index.ts","../../bim_engine_base/dist/main-2Txx2Vau.mjs","../../bim_engine_base/dist/step-CkmZYIvn.mjs","../../bim_engine_base/dist/API文档-B1v8UcRF.mjs"],"sourcesContent":["import {TranslationDictionary} from './types';\n\nexport const zhCN: TranslationDictionary = {\n common: {\n title: 'BimEngine',\n description: '这是一个使用 BIM-ENGINE。',\n openTestDialog: '打开测试弹窗',\n openInfoDialog: '打开信息弹窗 (封装版)',\n },\n toolbar: {\n home: '首页',\n measure: '测量',\n zoomBox: '选框放大',\n info: '信息',\n location: '定位',\n setting: '设置',\n walk: '漫游',\n map: '地图',\n property: '构件详情',\n fullscreen: '全屏',\n walkMenu: '漫游菜单',\n walkPerson: '第一人称',\n walkBird: '第三人称',\n tree: '模型树',\n section: '剖切',\n sectionPlane: '拾取面剖切',\n sectionAxis: '轴向剖切',\n sectionBox: '剖切盒'\n },\n dialog: {\n testTitle: '测试弹窗',\n testContent: '
    这是一个 可拖拽可缩放 的弹窗。

    你可以尝试拖动标题栏,或者拖动右下角改变大小。
    ',\n },\n menu: {\n info: '信息',\n home: '首页',\n componentDetail: '构件详情',\n hideSelected: '隐藏选中构件',\n transparentSelected: '半透明选中构件',\n isolateSelected: '隔离选中构件',\n hideOthers: '其他构件隐藏',\n transparentOthers: '其他构件半透明',\n fitSectionBox: '剖切盒适应',\n showAll: '显示全部'\n },\n tree: {\n searchPlaceholder: '请输入要搜索的内容',\n },\n constructTree: {\n title: '目录树',\n },\n tab: {\n component: '构件',\n system: '系统',\n space: '空间',\n type: '类型',\n major: '专业',\n },\n panel: {\n property: {\n title: '构件详情',\n base: '基本属性',\n material: '材质信息',\n advanced: '高级设置',\n tab: {\n props: '属性',\n material: '材质'\n }\n },\n componentDetail: {\n title: '构件详情',\n noSelection: '请先选中构件'\n }\n },\n measure: {\n btnName: '测量',\n dialogTitle: '测量',\n modes: {\n distance: '距离',\n minDistance: '最小距离',\n angle: '角度',\n elevation: '标高',\n volume: '体积',\n laserDistance: '激光测距',\n slope: '坡度',\n spaceVolume: '空间体积',\n },\n actions: {\n expand: '展开',\n collapse: '收起',\n clearAll: '删除全部',\n settings: '设置',\n },\n labels: {\n currentMode: '当前测量方式:',\n x: 'X:',\n y: 'Y:',\n z: 'Z:',\n value: {\n distance: '距离:',\n minDistance: '最小距离:',\n angle: '角度:',\n elevation: '标高:',\n volume: '体积:',\n laserDistance: '激光测距:',\n slope: '坡度:',\n spaceVolume: '空间体积:',\n }\n },\n units: {\n mm: 'mm',\n cm: 'cm',\n m: 'm',\n km: 'km',\n deg: '°',\n m3: 'm³',\n percent: '%',\n },\n settings: {\n title: '设置',\n unit: '单位:',\n precision: '精度:',\n hint: '距离、最小距离和标高默认使用该单位;角度和体积有各自默认单位。',\n save: '保存设置',\n cancel: '取消',\n }\n },\n sectionPlane: {\n dialogTitle: '拾取面剖切',\n actions: {\n hide: '隐藏',\n reverse: '反向',\n reset: '重置'\n }\n },\n sectionAxis: {\n dialogTitle: '轴向剖切',\n actions: {\n hide: '隐藏',\n reverse: '反向',\n axisX: 'X',\n axisY: 'Y',\n axisZ: 'Z'\n }\n },\n sectionBox: {\n dialogTitle: '剖切盒',\n actions: {\n hide: '隐藏',\n reverse: '反向',\n fitToModel: '适应',\n reset: '重置'\n },\n axes: {\n x: 'X',\n y: 'Y',\n z: 'Z'\n }\n },\n walkControl: {\n speed: '移动速度:',\n gravity: '重力',\n collision: '碰撞',\n characterModel: {\n label: '建筑工人',\n constructionWorker: '建筑工人',\n officeMale: '办公室男性'\n },\n walkMode: {\n label: '行走模式',\n walk: '行走模式',\n run: '奔跑模式'\n },\n exit: '退出',\n path: {\n dialogTitle: '路径漫游'\n }\n },\n map: {\n dialogTitle: '地图'\n }\n};\n","import {TranslationDictionary} from './types';\n\nexport const enUS: TranslationDictionary = {\n common: {\n title: 'BimEngine',\n description: 'This is a BIM-ENGINE demo.',\n openTestDialog: 'Open Test Dialog',\n openInfoDialog: 'Open Info Dialog (Wrapped)',\n },\n toolbar: {\n home: 'Home',\n measure: 'Measure',\n zoomBox: 'Zoom Box',\n info: 'Info',\n location: 'Location',\n setting: 'Settings',\n walk: 'Walk',\n map: 'Map',\n property: 'Property',\n fullscreen: 'Fullscreen',\n walkPerson: 'Person',\n walkBird: 'Bird Eye',\n walkMenu: 'Menu',\n tree: 'Tree',\n section: 'Section',\n sectionPlane: 'Plane Section',\n sectionAxis: 'Axis Section',\n sectionBox: 'Section Box'\n },\n dialog: {\n testTitle: 'Test Dialog',\n testContent: '
    This is a draggable and resizable dialog.

    Try dragging the title bar or resizing from the bottom-right corner.
    ',\n },\n menu: {\n info: 'Info',\n home: 'Home',\n componentDetail: 'Component Detail',\n hideSelected: 'Hide Selected',\n transparentSelected: 'Transparent Selected',\n isolateSelected: 'Isolate Selected',\n hideOthers: 'Hide Others',\n transparentOthers: 'Transparent Others',\n fitSectionBox: 'Fit Section Box',\n showAll: 'Show All'\n },\n tree: {\n searchPlaceholder: 'Please enter content to search',\n },\n constructTree: {\n title: 'Construct Tree',\n },\n tab: {\n component: 'Component',\n system: 'System',\n space: 'Space',\n type: 'Type',\n major: 'Major',\n },\n panel: {\n property: {\n title: 'Component Details',\n base: 'Basic Info',\n material: 'Material',\n advanced: 'Advanced',\n tab: {\n props: 'Properties',\n material: 'Material'\n }\n },\n componentDetail: {\n title: 'Component Detail',\n noSelection: 'Please select a component first'\n }\n },\n measure: {\n btnName: 'Measure',\n dialogTitle: 'Measure',\n modes: {\n distance: 'Distance',\n minDistance: 'Min Distance',\n angle: 'Angle',\n elevation: 'Elevation',\n volume: 'Volume',\n laserDistance: 'Laser Distance',\n slope: 'Slope',\n spaceVolume: 'Space Volume',\n },\n actions: {\n expand: 'Expand',\n collapse: 'Collapse',\n clearAll: 'Clear All',\n settings: 'Settings',\n },\n labels: {\n currentMode: 'Mode:',\n x: 'X:',\n y: 'Y:',\n z: 'Z:',\n value: {\n distance: 'Distance:',\n minDistance: 'Min Distance:',\n angle: 'Angle:',\n elevation: 'Elevation:',\n volume: 'Volume:',\n laserDistance: 'Laser Distance:',\n slope: 'Slope:',\n spaceVolume: 'Space Volume:',\n }\n },\n units: {\n mm: 'mm',\n cm: 'cm',\n m: 'm',\n km: 'km',\n deg: '°',\n m3: 'm³',\n percent: '%',\n },\n settings: {\n title: 'Settings',\n unit: 'Unit:',\n precision: 'Precision:',\n hint: 'Distance, min distance and elevation use this unit by default; angle and volume use their own units.',\n save: 'Save',\n cancel: 'Cancel',\n }\n },\n sectionPlane: {\n dialogTitle: 'Plane Section',\n actions: {\n hide: 'Hide',\n reverse: 'Reverse',\n reset: 'Reset'\n }\n },\n sectionAxis: {\n dialogTitle: 'Axis Section',\n actions: {\n hide: 'Hide',\n reverse: 'Reverse',\n axisX: 'X',\n axisY: 'Y',\n axisZ: 'Z'\n }\n },\n sectionBox: {\n dialogTitle: 'Section Box',\n actions: {\n hide: 'Hide',\n reverse: 'Reverse',\n fitToModel: 'Fit',\n reset: 'Reset'\n },\n axes: {\n x: 'X',\n y: 'Y',\n z: 'Z'\n }\n },\n walkControl: {\n speed: 'Speed:',\n gravity: 'Gravity',\n collision: 'Collision',\n characterModel: {\n label: 'Construction Worker',\n constructionWorker: 'Construction Worker',\n officeMale: 'Office Male'\n },\n walkMode: {\n label: 'Walk Mode',\n walk: 'Walk',\n run: 'Run'\n },\n exit: 'Exit',\n path: {\n dialogTitle: 'Path Walk'\n }\n },\n map: {\n dialogTitle: 'Map'\n }\n};\n","import { LocaleType, TranslationDictionary } from '../locales/types';\nimport { zhCN } from '../locales/zh-CN';\nimport { enUS } from '../locales/en-US';\n\ntype LocaleChangeListener = (locale: LocaleType) => void;\n\n/**\n * 语言管理器类\n */\nexport class LocaleManager {\n private currentLocale: LocaleType = 'zh-CN';\n private messages: Record = {\n 'zh-CN': zhCN,\n 'en-US': enUS,\n };\n private listeners: LocaleChangeListener[] = [];\n\n constructor() {\n // 默认初始化\n }\n\n /**\n * 获取当前语言\n */\n public getLocale(): LocaleType {\n return this.currentLocale;\n }\n\n /**\n * 切换语言\n */\n public setLocale(locale: LocaleType) {\n if (this.currentLocale === locale) return;\n this.currentLocale = locale;\n this.notifyListeners();\n }\n\n /**\n * 翻译核心方法\n */\n public t(key: string): string {\n if (!key) return '';\n \n const keys = key.split('.');\n let value: any = this.messages[this.currentLocale];\n \n for (const k of keys) {\n if (value && typeof value === 'object' && k in value) {\n value = value[k];\n } else {\n return key;\n }\n }\n return value as string;\n }\n\n /**\n * 订阅变更\n */\n public subscribe(listener: LocaleChangeListener): () => void {\n this.listeners.push(listener);\n return () => {\n this.listeners = this.listeners.filter(l => l !== listener);\n };\n }\n\n private notifyListeners() {\n this.listeners.forEach(listener => listener(this.currentLocale));\n }\n}\n\n// --- 导出单例 ---\nexport const localeManager = new LocaleManager();\n\n// --- 导出便捷方法 ---\n/**\n * 全局翻译函数\n * @param key 键路径 (如 'toolbar.home')\n */\nexport const t = (key: string): string => localeManager.t(key);\n","import { ThemeConfig } from './types';\n\n/**\n * Tailwind CSS 调色板参考(维护者参考)\n * \n * Slate: #f8fafc #f1f5f9 #e2e8f0 #cbd5e1 #94a3b8 #64748b #475569 #334155 #1e293b #0f172a\n * Blue: #eff6ff #dbeafe #bfdbfe #93c5fd #60a5fa #3b82f6 #2563eb #1d4ed8 #1e40af #1e3a8a\n * Green: #f0fdf4 #dcfce7 #bbf7d0 #86efac #4ade80 #22c55e #16a34a #15803d #166534 #14532d\n * Amber: #fffbeb #fef3c7 #fde68a #fcd34d #fbbf24 #f59e0b #d97706 #b45309 #92400e #78350f\n * Red: #fef2f2 #fee2e2 #fecaca #fca5a5 #f87171 #ef4444 #dc2626 #b91c1c #991b1b #7f1d1d\n * Cyan: #ecfeff #cffafe #a5f3fc #67e8f9 #22d3ee #06b6d4 #0891b2 #0e7490 #155e75 #164e63\n */\n\nexport const lightTheme: ThemeConfig = {\n name: 'light',\n\n primary: '#2563eb',\n primaryHover: '#1d4ed8',\n primaryActive: '#1e40af',\n primarySubtle: 'rgba(37, 99, 235, 0.1)',\n\n success: '#16a34a',\n successHover: '#15803d',\n successSubtle: 'rgba(22, 163, 74, 0.1)',\n\n warning: '#d97706',\n warningHover: '#b45309',\n warningSubtle: 'rgba(217, 119, 6, 0.1)',\n\n danger: '#dc2626',\n dangerHover: '#b91c1c',\n dangerSubtle: 'rgba(220, 38, 38, 0.1)',\n\n info: '#0891b2',\n infoHover: '#0e7490',\n infoSubtle: 'rgba(8, 145, 178, 0.1)',\n\n bgBase: '#f8fafc',\n bgElevated: '#ffffff',\n bgOverlay: 'rgba(255, 255, 255, 0.98)',\n bgInset: '#f1f5f9',\n bgGlass: 'rgba(255, 255, 255, 0.8)',\n bgGlassBlur: '24px',\n\n textPrimary: '#0f172a',\n textSecondary: '#475569',\n textTertiary: '#94a3b8',\n textDisabled: '#cbd5e1',\n textInverse: '#ffffff',\n textLink: '#2563eb',\n textLinkHover: '#1d4ed8',\n\n iconDefault: '#64748b',\n iconHover: '#334155',\n iconActive: '#2563eb',\n iconDisabled: '#cbd5e1',\n iconInverse: '#ffffff',\n\n borderDefault: '#e2e8f0',\n borderSubtle: '#f1f5f9',\n borderStrong: '#cbd5e1',\n borderDisabled: '#f1f5f9',\n divider: '#e2e8f0',\n\n componentBg: 'transparent',\n componentBgHover: 'rgba(15, 23, 42, 0.04)',\n componentBgActive: 'rgba(15, 23, 42, 0.08)',\n componentBgSelected: 'rgba(37, 99, 235, 0.08)',\n componentBgDisabled: '#f8fafc',\n\n focusRing: 'rgba(37, 99, 235, 0.5)',\n focusRingOffset: '#ffffff',\n selectionBg: 'rgba(37, 99, 235, 0.15)',\n selectionText: '#0f172a',\n\n shadowSm: '0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08)',\n shadowMd: '0 4px 12px rgba(0, 0, 0, 0.12), 0 6px 20px rgba(0, 0, 0, 0.1)',\n shadowLg: '0 10px 25px rgba(0, 0, 0, 0.15), 0 6px 10px rgba(0, 0, 0, 0.1)',\n shadowXl: '0 20px 40px rgba(0, 0, 0, 0.2), 0 10px 15px rgba(0, 0, 0, 0.1)',\n shadowGlow: '0 2px 8px rgba(59, 130, 246, 0.3), 0 4px 16px rgba(59, 130, 246, 0.2)',\n\n scrollbarTrack: '#f1f5f9',\n scrollbarThumb: '#cbd5e1',\n scrollbarThumbHover: '#94a3b8',\n\n floatingBg: 'rgba(255, 255, 255, 0.8)',\n floatingBorder: 'rgba(226, 232, 240, 0.5)',\n floatingShadow: '0 4px 24px rgba(0, 0, 0, 0.06)',\n floatingBtnBg: 'rgba(255, 255, 255, 0.9)',\n floatingBtnBorder: 'rgba(203, 213, 225, 0.6)',\n floatingBtnShadow: '0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 12px rgba(0, 0, 0, 0.08)',\n floatingBtnBgHover: '#ffffff',\n floatingBtnShadowHover: '0 4px 12px rgba(0, 0, 0, 0.12), 0 6px 20px rgba(0, 0, 0, 0.1)',\n floatingIconColor: '#334155',\n floatingIconColorHover: '#1e293b',\n\n panelBg: 'rgba(255, 255, 255, 0.95)',\n panelBorder: 'rgba(226, 232, 240, 0.6)',\n panelHeaderBg: 'rgba(248, 250, 252, 0.9)',\n panelRadius: '12px',\n\n tabBg: '#f1f5f9',\n tabItemBg: 'transparent',\n tabItemBgHover: 'rgba(255, 255, 255, 0.6)',\n tabItemBgActive: '#ffffff',\n tabItemTextActive: '#2563eb',\n\n overrides: {\n dialog: {\n headerBg: '#f8fafc',\n },\n toolbar: {\n bg: 'rgba(255, 255, 255, 0.9)',\n buttonBg: 'rgba(255, 255, 255, 0.95)',\n buttonBgHover: '#ffffff',\n buttonBgActive: '#2563eb',\n },\n input: {\n bg: '#ffffff',\n bgFocus: '#ffffff',\n placeholder: '#94a3b8',\n },\n },\n};\n\nexport const darkTheme: ThemeConfig = {\n name: 'dark',\n\n primary: '#3b82f6',\n primaryHover: '#60a5fa',\n primaryActive: '#2563eb',\n primarySubtle: 'rgba(59, 130, 246, 0.15)',\n\n success: '#22c55e',\n successHover: '#4ade80',\n successSubtle: 'rgba(34, 197, 94, 0.15)',\n\n warning: '#f59e0b',\n warningHover: '#fbbf24',\n warningSubtle: 'rgba(245, 158, 11, 0.15)',\n\n danger: '#ef4444',\n dangerHover: '#f87171',\n dangerSubtle: 'rgba(239, 68, 68, 0.15)',\n\n info: '#06b6d4',\n infoHover: '#22d3ee',\n infoSubtle: 'rgba(6, 182, 212, 0.15)',\n\n bgBase: '#152232',\n bgElevated: '#1f2d3e',\n bgOverlay: 'rgba(21, 34, 50, 0.98)',\n bgInset: '#152232',\n bgGlass: 'rgba(21, 34, 50, 0.85)',\n bgGlassBlur: '24px',\n\n textPrimary: '#ffffff',\n textSecondary: '#94a3b8',\n textTertiary: '#64748b',\n textDisabled: '#475569',\n textInverse: '#152232',\n textLink: '#60a5fa',\n textLinkHover: '#93c5fd',\n\n iconDefault: '#ffffff',\n iconHover: '#ffffff',\n iconActive: '#3b82f6',\n iconDisabled: '#475569',\n iconInverse: '#152232',\n\n borderDefault: 'rgba(51, 65, 85, 0.5)',\n borderSubtle: 'rgba(51, 65, 85, 0.5)',\n borderStrong: '#475569',\n borderDisabled: '#1e293b',\n divider: '#334155',\n\n componentBg: 'transparent',\n componentBgHover: 'rgba(248, 250, 252, 0.06)',\n componentBgActive: 'rgba(248, 250, 252, 0.1)',\n componentBgSelected: 'rgba(59, 130, 246, 0.2)',\n componentBgDisabled: '#1e293b',\n\n focusRing: 'rgba(59, 130, 246, 0.5)',\n focusRingOffset: '#1e293b',\n selectionBg: 'rgba(59, 130, 246, 0.3)',\n selectionText: '#f8fafc',\n\n shadowSm: '0 2px 8px rgba(0, 0, 0, 0.4), 0 4px 12px rgba(0, 0, 0, 0.3)',\n shadowMd: '0 4px 12px rgba(0, 0, 0, 0.5), 0 6px 20px rgba(0, 0, 0, 0.4)',\n shadowLg: '0 10px 25px rgba(0, 0, 0, 0.6), 0 6px 10px rgba(0, 0, 0, 0.4)',\n shadowXl: '0 20px 40px rgba(0, 0, 0, 0.7), 0 10px 15px rgba(0, 0, 0, 0.5)',\n shadowGlow: '0 2px 8px rgba(59, 130, 246, 0.4), 0 4px 16px rgba(59, 130, 246, 0.25)',\n\n scrollbarTrack: '#1e293b',\n scrollbarThumb: '#475569',\n scrollbarThumbHover: '#64748b',\n\n floatingBg: 'rgba(15, 23, 42, 0.85)',\n floatingBorder: 'rgba(51, 65, 85, 0.4)',\n floatingShadow: '0 4px 24px rgba(0, 0, 0, 0.25)',\n floatingBtnBg: 'rgba(51, 65, 85, 0.6)',\n floatingBtnBorder: 'rgba(100, 116, 139, 0.5)',\n floatingBtnShadow: '0 2px 8px rgba(0, 0, 0, 0.3), 0 4px 12px rgba(0, 0, 0, 0.25)',\n floatingBtnBgHover: 'rgba(71, 85, 105, 0.7)',\n floatingBtnShadowHover: '0 4px 12px rgba(0, 0, 0, 0.35), 0 6px 20px rgba(0, 0, 0, 0.3)',\n floatingIconColor: '#e2e8f0',\n floatingIconColorHover: '#f8fafc',\n\n panelBg: 'rgba(15, 23, 42, 0.95)',\n panelBorder: 'rgba(51, 65, 85, 0.5)',\n panelHeaderBg: 'rgba(15, 23, 42, 0.9)',\n panelRadius: '12px',\n\n tabBg: 'rgba(30, 41, 59, 0.6)',\n tabItemBg: 'transparent',\n tabItemBgHover: 'rgba(51, 65, 85, 0.5)',\n tabItemBgActive: 'rgba(51, 65, 85, 0.8)',\n tabItemTextActive: '#60a5fa',\n\n overrides: {\n dialog: {\n headerBg: '#0f172a',\n },\n toolbar: {\n bg: 'rgba(30, 41, 59, 0.9)',\n buttonBg: 'rgba(51, 65, 85, 0.6)',\n buttonBgHover: 'rgba(71, 85, 105, 0.7)',\n buttonBgActive: '#3b82f6',\n },\n input: {\n bg: '#0f172a',\n bgFocus: '#1e293b',\n placeholder: '#64748b',\n },\n },\n};\n\nexport function createThemeFromPartial(base: ThemeConfig, partial: Partial): ThemeConfig {\n return {\n ...base,\n ...partial,\n overrides: {\n ...base.overrides,\n ...partial.overrides,\n },\n };\n}\n\nexport function getThemeByName(name: string): ThemeConfig {\n switch (name) {\n case 'light':\n return lightTheme;\n case 'dark':\n default:\n return darkTheme;\n }\n}\n","import { ThemeConfig } from '../themes/types';\nimport { darkTheme, lightTheme } from '../themes/presets';\n\ntype ThemeChangeListener = (theme: ThemeConfig) => void;\n\n/**\n * 主题管理器 (单例)\n */\nexport class ThemeManager {\n private currentTheme: ThemeConfig = lightTheme;\n private listeners: ThemeChangeListener[] = [];\n\n constructor() {\n // 默认初始化\n }\n\n /**\n * 获取当前主题配置\n */\n public getTheme(): ThemeConfig {\n return this.currentTheme;\n }\n\n /**\n * 切换预设主题\n * @param themeName 'dark' | 'light'\n */\n public setTheme(themeName: 'dark' | 'light') {\n if (themeName === 'light') {\n this.applyTheme(lightTheme);\n } else {\n this.applyTheme(darkTheme);\n }\n }\n\n /**\n * 应用自定义主题配置\n * @param theme 配置对象\n */\n public setCustomTheme(theme: ThemeConfig) {\n this.applyTheme(theme);\n }\n\n /**\n * 内部应用主题逻辑\n */\n private applyTheme(theme: ThemeConfig) {\n this.currentTheme = theme;\n this.notifyListeners();\n }\n\n /**\n * 订阅主题变更\n */\n public subscribe(listener: ThemeChangeListener): () => void {\n this.listeners.push(listener);\n // 立即回调一次当前状态\n listener(this.currentTheme);\n return () => {\n this.listeners = this.listeners.filter(l => l !== listener);\n };\n }\n\n private notifyListeners() {\n this.listeners.forEach(listener => listener(this.currentTheme));\n }\n}\n\n// 导出单例\nexport const themeManager = new ThemeManager();","/**\n * 事件发射器\n * 提供简单的发布/订阅模式实现\n */\n\n/** 事件监听器类型 */\ntype Listener = (payload: T) => void;\n\n/**\n * 事件发射器类\n * 用于组件间的事件通信\n */\nexport class EventEmitter {\n /** 事件监听器映射表 */\n private events: Map = new Map();\n\n /**\n * 订阅事件\n * @param event 事件名称\n * @param listener 事件处理函数\n * @returns 取消订阅的函数\n */\n public on(event: string, listener: Listener): () => void {\n if (!this.events.has(event)) {\n this.events.set(event, []);\n }\n this.events.get(event)!.push(listener);\n\n return () => this.off(event, listener);\n }\n\n /**\n * 取消订阅事件\n * @param event 事件名称\n * @param listener 要移除的事件处理函数\n */\n public off(event: string, listener: Listener): void {\n const listeners = this.events.get(event);\n if (!listeners) return;\n\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n\n /**\n * 发送事件\n * @param event 事件名称\n * @param payload 事件数据\n */\n public emit(event: string, payload?: any): void {\n const listeners = this.events.get(event);\n if (listeners) {\n listeners.forEach(listener => {\n try {\n listener(payload);\n } catch (error) {\n console.error(`[EventEmitter] Error in listener for event \"${event}\":`, error);\n }\n });\n }\n }\n\n /** 清除所有事件监听器 */\n public clear(): void {\n this.events.clear();\n }\n}\n","/**\n * Manager 注册表\n * 全局单例,提供所有 Manager 的集中访问点\n */\nimport { EventEmitter } from './event-emitter';\nimport type { EngineEvents } from '../types/events';\n\nimport type { ToolbarManager } from '../managers/toolbar-manager';\nimport type { DialogManager } from '../managers/dialog-manager';\nimport type { EngineManager } from '../managers/engine-manager';\nimport type { ButtonGroupManager } from '../managers/button-group-manager';\nimport type { RightKeyManager } from '../managers/right-key-manager';\nimport type { ConstructTreeManagerBtn } from '../managers/construct-tree-manager-btn';\n\nimport type { MeasureDialogManager } from '../managers/measure-dialog-manager';\nimport type { WalkControlManager } from '../managers/walk-control-manager';\nimport type { MapDialogManager } from '../managers/map-dialog-manager';\nimport type { SectionPlaneDialogManager } from '../managers/section-plane-dialog-manager';\nimport type { SectionAxisDialogManager } from '../managers/section-axis-dialog-manager';\nimport type { SectionBoxDialogManager } from '../managers/section-box-dialog-manager';\nimport type { WalkPathDialogManager } from '../managers/walk-path-dialog-manager';\nimport type { WalkPlanViewDialogManager } from '../managers/walk-plan-view-dialog-manager';\nimport type { ComponentDetailManager } from '../managers/component-detail-manager';\n\n/**\n * Manager 注册表 - 单例模式\n * 提供所有 Manager 的全局访问点,替代 engine 层层传递\n */\nexport class ManagerRegistry {\n /** 单例实例 */\n private static instance: ManagerRegistry | null = null;\n /** 事件发射器 */\n private eventEmitter: EventEmitter = new EventEmitter();\n\n /** 主容器元素 */\n public container: HTMLElement | null = null;\n /** 包装容器元素 */\n public wrapper: HTMLElement | null = null;\n\n /** 工具栏管理器 */\n public toolbar: ToolbarManager | null = null;\n /** 对话框管理器 */\n public dialog: DialogManager | null = null;\n /** 3D 引擎管理器 */\n public engine3d: EngineManager | null = null;\n /** 按钮组管理器 */\n public buttonGroup: ButtonGroupManager | null = null;\n /** 右键菜单管理器 */\n public rightKey: RightKeyManager | null = null;\n /** 构件树管理器 */\n public constructTree: ConstructTreeManagerBtn | null = null;\n\n /** 测量对话框管理器 */\n public measure: MeasureDialogManager | null = null;\n /** 漫游控制管理器 */\n public walkControl: WalkControlManager | null = null;\n /** 地图对话框管理器 */\n public map: MapDialogManager | null = null;\n /** 拾取面剖切对话框管理器 */\n public sectionPlane: SectionPlaneDialogManager | null = null;\n /** 轴向剖切对话框管理器 */\n public sectionAxis: SectionAxisDialogManager | null = null;\n /** 剖切盒对话框管理器 */\n public sectionBox: SectionBoxDialogManager | null = null;\n /** 漫游路径对话框管理器 */\n public walkPath: WalkPathDialogManager | null = null;\n /** 漫游平面图对话框管理器 */\n public walkPlanView: WalkPlanViewDialogManager | null = null;\n /** 构件详情管理器 */\n public componentDetail: ComponentDetailManager | null = null;\n\n private constructor() {}\n\n /** 获取单例实例 */\n public static getInstance(): ManagerRegistry {\n if (!ManagerRegistry.instance) {\n ManagerRegistry.instance = new ManagerRegistry();\n }\n return ManagerRegistry.instance;\n }\n\n /** 重置单例(用于测试或重新初始化) */\n public static reset(): void {\n if (ManagerRegistry.instance) {\n ManagerRegistry.instance.eventEmitter.clear();\n ManagerRegistry.instance = null;\n }\n }\n\n /**\n * 发送事件\n * @param event 事件名称\n * @param payload 事件数据\n */\n public emit(event: K, payload: EngineEvents[K]): void {\n this.eventEmitter.emit(event, payload);\n }\n\n /**\n * 订阅事件\n * @param event 事件名称\n * @param listener 事件处理函数\n * @returns 取消订阅的函数\n */\n public on(\n event: K,\n listener: (payload: EngineEvents[K]) => void\n ): () => void {\n return this.eventEmitter.on(event, listener);\n }\n\n /**\n * 取消订阅事件\n * @param event 事件名称\n * @param listener 事件处理函数\n */\n public off(\n event: K,\n listener: (payload: EngineEvents[K]) => void\n ): void {\n this.eventEmitter.off(event, listener);\n }\n\n /** 清除所有事件监听器 */\n public clearEvents(): void {\n this.eventEmitter.clear();\n }\n}\n","import './index.css';\nimport type {\n OptButton,\n ButtonGroup,\n ButtonGroupOptions,\n ButtonConfig,\n ButtonGroupColors\n} from './index.type';\nimport { t, localeManager } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { ManagerRegistry } from '../../core/manager-registry';\nimport { EngineEvents } from '../../types/events';\n\nexport class BimButtonGroup implements IBimComponent {\n private container: HTMLElement;\n private options: ButtonGroupOptions;\n private groups: ButtonGroup[] = [];\n private activeBtnIds: Set = new Set();\n private btnRefs: Map = new Map();\n private dropdownElement: HTMLElement | null = null;\n private hoverTimeout: number | null = null;\n private customColors: Set = new Set();\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n private readonly DEFAULT_ICON = '';\n\n constructor(options: ButtonGroupOptions) {\n const el = typeof options.container === 'string'\n ? document.getElementById(options.container)\n : options.container;\n\n if (!el) throw new Error('Container not found');\n\n this.container = el;\n // 合并默认配置\n this.options = {\n showLabel: true,\n visibility: {},\n direction: 'row', // 默认横向\n position: 'static', // 默认静态定位\n align: 'vertical', // 默认图标在上\n expand: 'down', // 默认向下展开\n ...options\n };\n\n // 记录初始传入的自定义颜色\n const colorKeys: (keyof ButtonGroupColors)[] = [\n 'backgroundColor', 'btnBackgroundColor', 'btnHoverColor',\n 'btnActiveColor', 'iconColor', 'iconActiveColor',\n 'textColor', 'textActiveColor'\n ];\n colorKeys.forEach(key => {\n if (options[key]) {\n this.customColors.add(key);\n }\n });\n\n this.initContainer();\n this.applyStyles();\n }\n\n protected emit(event: K, payload: EngineEvents[K]) {\n const registry = ManagerRegistry.getInstance();\n registry.emit(event, payload);\n }\n\n private initContainer(): void {\n this.container.innerHTML = '';\n this.container.classList.add('bim-btn-group-root');\n\n if (this.options.direction === 'column') {\n this.container.classList.add('dir-column');\n } else {\n this.container.classList.add('dir-row');\n }\n\n if (this.options.className) {\n this.container.classList.add(this.options.className);\n }\n\n if (this.options.type && this.options.type !== 'default') {\n this.container.classList.add(`type-${this.options.type}`);\n }\n\n this.updatePosition();\n\n // 添加事件拦截,防止点击穿透到 3D 引擎\n this.setupEventInterception(this.container);\n }\n\n /**\n * 设置事件拦截,防止事件冒泡到下层元素(如 3D 引擎)\n */\n private setupEventInterception(el: HTMLElement): void {\n const stopPropagation = (e: Event) => {\n e.stopPropagation();\n };\n\n const events = [\n 'click', 'dblclick', 'contextmenu', 'wheel',\n 'mousedown', 'mouseup', 'mousemove',\n 'touchstart', 'touchend', 'touchmove',\n 'pointerdown', 'pointerup', 'pointermove', 'pointerenter', 'pointerleave', 'pointerover', 'pointerout'\n ];\n\n events.forEach(eventType => {\n el.addEventListener(eventType, stopPropagation, { passive: false });\n });\n }\n\n private updatePosition() {\n const pos = this.options.position;\n const style = this.container.style;\n\n style.top = ''; style.bottom = ''; style.left = ''; style.right = ''; style.transform = '';\n\n if (pos === 'static') {\n this.container.classList.add('static');\n return;\n }\n\n this.container.classList.remove('static');\n this.container.style.position = 'absolute';\n\n if (typeof pos === 'object' && 'x' in pos) {\n style.left = `${pos.x}px`;\n style.top = `${pos.y}px`;\n } else {\n const margin = '20px';\n switch (pos) {\n case 'top-left':\n style.top = margin; style.left = margin;\n break;\n case 'top-center':\n style.top = margin; style.left = '50%'; style.transform = 'translateX(-50%)';\n break;\n case 'top-right':\n style.top = margin; style.right = margin;\n break;\n case 'bottom-left':\n style.bottom = margin; style.left = margin;\n break;\n case 'bottom-center':\n style.bottom = margin; style.left = '50%'; style.transform = 'translateX(-50%)';\n break;\n case 'bottom-right':\n style.bottom = margin; style.right = margin;\n break;\n case 'left-center':\n style.left = margin; style.top = '50%'; style.transform = 'translateY(-50%)';\n break;\n case 'right-center':\n style.right = margin; style.top = '50%'; style.transform = 'translateY(-50%)';\n break;\n case 'center':\n style.top = '50%'; style.left = '50%'; style.transform = 'translate(-50%, -50%)';\n break;\n }\n }\n }\n\n /**\n * 应用样式到容器\n */\n private applyStyles(): void {\n const style = this.container.style;\n if (this.options.backgroundColor) style.setProperty('--bim-btn-group-section-bg', this.options.backgroundColor);\n if (this.options.btnBackgroundColor) style.setProperty('--bim-btn-bg', this.options.btnBackgroundColor);\n if (this.options.btnHoverColor) style.setProperty('--bim-btn-hover-bg', this.options.btnHoverColor);\n if (this.options.btnActiveColor) style.setProperty('--bim-btn-active-bg', this.options.btnActiveColor);\n if (this.options.iconColor) style.setProperty('--bim-icon-color', this.options.iconColor);\n if (this.options.iconActiveColor) style.setProperty('--bim-icon-active-color', this.options.iconActiveColor);\n if (this.options.textColor) style.setProperty('--bim-btn-text-color', this.options.textColor);\n if (this.options.textActiveColor) style.setProperty('--bim-btn-text-active-color', this.options.textActiveColor);\n\n // 同步更新所有已存在的dropdown元素的CSS变量(dropdown被添加到body,无法继承容器的CSS变量)\n const dropdowns = document.querySelectorAll('.opt-btn-dropdown');\n dropdowns.forEach(dropdown => {\n const dropdownStyle = (dropdown as HTMLElement).style;\n if (this.options.iconColor) dropdownStyle.setProperty('--bim-icon-color', this.options.iconColor);\n if (this.options.iconActiveColor) dropdownStyle.setProperty('--bim-icon-active-color', this.options.iconActiveColor);\n if (this.options.textColor) dropdownStyle.setProperty('--bim-btn-text-color', this.options.textColor);\n if (this.options.textActiveColor) dropdownStyle.setProperty('--bim-btn-text-active-color', this.options.textActiveColor);\n if (this.options.btnBackgroundColor) dropdownStyle.setProperty('--bim-btn-bg', this.options.btnBackgroundColor);\n if (this.options.btnHoverColor) dropdownStyle.setProperty('--bim-btn-hover-bg', this.options.btnHoverColor);\n if (this.options.btnActiveColor) dropdownStyle.setProperty('--bim-btn-active-bg', this.options.btnActiveColor);\n });\n }\n\n /**\n * 设置主题的primary颜色(用于边框等)\n */\n private setPrimaryColor(color: string): void {\n this.container.style.setProperty('--bim-primary-color', color);\n\n // 同步更新所有dropdown(dropdown被添加到body,无法继承容器的CSS变量)\n const dropdowns = document.querySelectorAll('.opt-btn-dropdown');\n dropdowns.forEach(dropdown => {\n (dropdown as HTMLElement).style.setProperty('--bim-primary-color', color);\n });\n }\n\n /**\n * 设置主题颜色\n * 只会应用到没有被用户自定义的颜色属性上\n */\n public setTheme(theme: ThemeConfig): void {\n const themeColors: ButtonGroupColors = {\n backgroundColor: theme.bgElevated,\n btnBackgroundColor: theme.componentBg,\n btnHoverColor: theme.componentBgHover,\n btnActiveColor: theme.componentBgActive,\n iconColor: theme.iconDefault,\n iconActiveColor: theme.iconActive,\n textColor: theme.textSecondary,\n textActiveColor: theme.textPrimary\n };\n\n Object.entries(themeColors).forEach(([key, value]) => {\n const colorKey = key as keyof ButtonGroupColors;\n if (!this.customColors.has(colorKey)) {\n this.options[colorKey] = value;\n }\n });\n\n this.container.classList.remove('theme-dark', 'theme-light');\n this.container.classList.add(`theme-${theme.name}`);\n\n this.applyStyles();\n this.setPrimaryColor(theme.primary);\n this.applyThemeCssVars(theme);\n }\n\n /**\n * 应用主题系统的 CSS 变量到容器\n * 供 glass-pill 等样式变体使用\n */\n private applyThemeCssVars(theme: ThemeConfig): void {\n const style = this.container.style;\n\n style.setProperty('--bim-primary', theme.primary);\n style.setProperty('--bim-primary-hover', theme.primaryHover);\n style.setProperty('--bim-primary-active', theme.primaryActive);\n\n style.setProperty('--bim-bg-glass', theme.bgGlass);\n style.setProperty('--bim-bg-glass-blur', theme.bgGlassBlur);\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-bg-overlay', theme.bgOverlay);\n style.setProperty('--bim-bg-inset', theme.bgInset);\n\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-secondary', theme.textSecondary);\n style.setProperty('--bim-text-tertiary', theme.textTertiary);\n style.setProperty('--bim-text-inverse', theme.textInverse);\n\n style.setProperty('--bim-icon-default', theme.iconDefault);\n style.setProperty('--bim-icon-hover', theme.iconHover);\n style.setProperty('--bim-icon-active', theme.iconActive);\n style.setProperty('--bim-icon-inverse', theme.iconInverse);\n\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-border-subtle', theme.borderSubtle);\n\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover);\n style.setProperty('--bim-component-bg-active', theme.componentBgActive);\n\n style.setProperty('--bim-shadow-sm', theme.shadowSm);\n style.setProperty('--bim-shadow-md', theme.shadowMd);\n style.setProperty('--bim-shadow-lg', theme.shadowLg);\n style.setProperty('--bim-shadow-glow', theme.shadowGlow);\n\n style.setProperty('--bim-floating-bg', theme.floatingBg);\n style.setProperty('--bim-floating-border', theme.floatingBorder);\n style.setProperty('--bim-floating-shadow', theme.floatingShadow);\n style.setProperty('--bim-floating-btn-bg', theme.floatingBtnBg);\n style.setProperty('--bim-floating-btn-border', theme.floatingBtnBorder);\n style.setProperty('--bim-floating-btn-shadow', theme.floatingBtnShadow);\n style.setProperty('--bim-floating-btn-bg-hover', theme.floatingBtnBgHover);\n style.setProperty('--bim-floating-btn-shadow-hover', theme.floatingBtnShadowHover);\n style.setProperty('--bim-floating-icon-color', theme.floatingIconColor);\n style.setProperty('--bim-floating-icon-color-hover', theme.floatingIconColorHover);\n\n this.syncDropdownCssVars(theme);\n }\n\n /**\n * 同步 CSS 变量到所有 dropdown 元素\n * dropdown 被添加到 body,无法继承容器的 CSS 变量\n */\n private syncDropdownCssVars(theme: ThemeConfig): void {\n const dropdowns = document.querySelectorAll('.opt-btn-dropdown');\n dropdowns.forEach(dropdown => {\n const style = (dropdown as HTMLElement).style;\n\n style.setProperty('--bim-primary', theme.primary);\n style.setProperty('--bim-bg-overlay', theme.bgOverlay);\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-inverse', theme.textInverse);\n style.setProperty('--bim-shadow-lg', theme.shadowLg);\n style.setProperty('--bim-floating-btn-bg', theme.floatingBtnBg);\n style.setProperty('--bim-floating-btn-bg-hover', theme.floatingBtnBgHover);\n style.setProperty('--bim-floating-icon-color', theme.floatingIconColor);\n });\n }\n\n /**\n * 直接设置颜色(强制覆盖)\n * 设置的颜色会被标记为自定义,后续的 setTheme 不会覆盖它们\n */\n public setColors(colors: ButtonGroupColors): void {\n // 更新 options\n this.options = { ...this.options, ...colors };\n\n // 标记这些颜色为自定义\n Object.keys(colors).forEach(key => {\n this.customColors.add(key as keyof ButtonGroupColors);\n });\n\n this.applyStyles();\n }\n\n public async init(): Promise {\n this.render();\n\n // 自动订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 自动订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n }\n\n public setLocales(): void {\n this.render();\n }\n\n public addGroup(groupId: string, beforeGroupId?: string): void {\n if (this.groups.some(g => g.id === groupId)) return;\n const newGroup: ButtonGroup = { id: groupId, buttons: [] };\n if (beforeGroupId) {\n const index = this.groups.findIndex(g => g.id === beforeGroupId);\n index !== -1 ? this.groups.splice(index, 0, newGroup) : this.groups.push(newGroup);\n } else {\n this.groups.push(newGroup);\n }\n }\n\n public addButton(config: ButtonConfig): void {\n const { groupId, parentId } = config;\n const group = this.groups.find(g => g.id === groupId);\n if (!group) return;\n\n const button: OptButton = { ...config, children: config.children || [] };\n if (parentId) {\n const parentBtn = this.findButton(group.buttons, parentId);\n if (parentBtn) {\n if (!parentBtn.children) parentBtn.children = [];\n parentBtn.children.push(button);\n }\n } else {\n group.buttons.push(button);\n }\n }\n\n private findButton(buttons: OptButton[], id: string): OptButton | undefined {\n for (const btn of buttons) {\n if (btn.id === id) return btn;\n if (btn.children) {\n const found = this.findButton(btn.children, id);\n if (found) return found;\n }\n }\n return undefined;\n }\n\n public render(): void {\n this.container.innerHTML = '';\n this.btnRefs.clear();\n\n this.groups.forEach((group, index) => {\n const groupElement = this.renderGroup(group, index, this.groups.length);\n this.container.appendChild(groupElement);\n });\n }\n\n private renderGroup(group: ButtonGroup, index: number, total: number): HTMLElement {\n const groupEl = document.createElement('div');\n groupEl.className = 'bim-btn-group-section';\n\n if (index < total - 1) {\n groupEl.classList.add('has-divider');\n }\n\n group.buttons.forEach(button => {\n if (this.isVisible(button.id)) {\n const btnWrapper = this.renderButton(button);\n groupEl.appendChild(btnWrapper);\n }\n });\n return groupEl;\n }\n\n private renderButton(button: OptButton): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.className = 'opt-btn-wrapper';\n\n const btnEl = document.createElement('div');\n btnEl.className = 'opt-btn';\n\n // 初始化时根据 button 自身的属性同步 active 状态\n if (button.isActive) {\n this.activeBtnIds.add(button.id);\n }\n\n // 按钮优先使用自己的 align,否则使用全局配置,默认为 vertical\n const align = button.align || this.options.align || 'vertical';\n if (align === 'horizontal') {\n btnEl.classList.add('align-horizontal');\n } else {\n btnEl.classList.add('align-vertical');\n }\n\n if (this.activeBtnIds.has(button.id)) btnEl.classList.add('active');\n if (button.disabled) btnEl.classList.add('disabled');\n\n // 判断是否显示 label\n const hasLabel = this.options.showLabel && button.label;\n if (!hasLabel) {\n btnEl.classList.add('no-label');\n // 当不显示 label 时,添加 title 属性作为 tooltip\n if (button.label) {\n btnEl.title = t(button.label);\n }\n }\n\n // 应用按钮的自定义样式\n const iconSize = button.iconSize || 32;\n const minWidth = button.minWidth || 50;\n btnEl.style.minWidth = `${minWidth}px`;\n\n const icon = document.createElement('div');\n icon.className = 'opt-btn-icon';\n icon.style.width = `${iconSize}px`;\n icon.style.height = `${iconSize}px`;\n icon.innerHTML = this.getIcon(button.icon);\n btnEl.appendChild(icon);\n\n // 创建文字和箭头的容器,确保它们始终在一起(无论主轴是横是竖)\n const textWrapper = document.createElement('div');\n textWrapper.className = 'opt-btn-text-wrapper';\n\n if (this.options.showLabel && button.label) {\n const label = document.createElement('span');\n label.className = 'opt-btn-label';\n label.textContent = t(button.label);\n textWrapper.appendChild(label);\n }\n\n // TODO: 暂时隐藏下拉箭头\n // if (button.children && button.children.length > 0) {\n // const arrow = document.createElement('span');\n // arrow.className = 'opt-btn-arrow';\n // arrow.textContent = '▼';\n // textWrapper.appendChild(arrow);\n // }\n\n // 只有当有内容时才添加 wrapper\n if (textWrapper.hasChildNodes()) {\n btnEl.appendChild(textWrapper);\n }\n\n btnEl.addEventListener('click', () => this.handleClick(button));\n btnEl.addEventListener('mouseenter', () => this.handleMouseEnter(button, btnEl));\n btnEl.addEventListener('mouseleave', () => this.handleMouseLeave());\n\n this.btnRefs.set(button.id, btnEl);\n wrapper.appendChild(btnEl);\n return wrapper;\n }\n\n /**\n * 设置按钮的激活状态\n * @param id 按钮 ID\n * @param active 可选,如果不传则切换(toggle)当前状态\n */\n public setBtnActive(id: string, active?: boolean): void {\n const button = this.findButtonById(id);\n if (!button) return;\n\n // 确定最终状态\n const newState = active !== undefined ? active : !this.activeBtnIds.has(id);\n\n if (newState) {\n this.activeBtnIds.add(id);\n } else {\n this.activeBtnIds.delete(id);\n }\n\n // 同步对象状态并更新 DOM\n button.isActive = newState;\n this.updateButtonState(id);\n }\n\n private handleClick(button: OptButton): void {\n if (button.disabled) return;\n if (!button.children || button.children.length === 0) {\n if (button.keepActive) {\n // 1) 先切换自身激活状态(onClick 里通常会根据 isActive 决定“打开/关闭”逻辑)\n const wasActive = this.activeBtnIds.has(button.id);\n const newState = !wasActive;\n this.setBtnActive(button.id, newState);\n\n // 2) 互斥逻辑:仅在“本次切换为激活”时触发\n // - 一级按钮:同 groupId 下其它一级按钮互斥\n // - 二级按钮:同 groupId + 同 parentId 下其它二级按钮互斥\n // - 被关闭的按钮需要触发 onClick(用于执行关闭逻辑)\n if (newState && button.exclusive && button.groupId) {\n this.deactivateExclusiveSiblings(button);\n }\n }\n this.closeDropdown();\n if (button.onClick) button.onClick(button);\n }\n }\n\n /**\n * 互斥关闭同范围内的其它已激活按钮,并触发它们的 onClick\n * @param button 当前被激活的按钮\n */\n private deactivateExclusiveSiblings(button: OptButton): void {\n const group = this.groups.find(g => g.id === button.groupId);\n if (!group) return;\n\n // 二级按钮:同 groupId + 同 parentId\n if (button.parentId) {\n const parent = this.findButton(group.buttons, button.parentId);\n const siblings = parent?.children || [];\n for (const sib of siblings) {\n if (!sib) continue;\n if (sib.id === button.id) continue;\n if (sib.parentId !== button.parentId) continue;\n if (sib.groupId !== button.groupId) continue;\n\n if (this.activeBtnIds.has(sib.id)) {\n this.setBtnActive(sib.id, false);\n // 触发被关闭按钮的 onClick(此时 sib.isActive 已经同步为 false)\n if (sib.onClick) sib.onClick(sib);\n }\n }\n return;\n }\n\n // 一级按钮:同 groupId 下其它一级按钮(不包含二级)\n for (const sib of group.buttons) {\n if (sib.id === button.id) continue;\n if (sib.groupId !== button.groupId) continue;\n if (sib.parentId) continue; // 只处理一级按钮\n\n if (this.activeBtnIds.has(sib.id)) {\n this.setBtnActive(sib.id, false);\n if (sib.onClick) sib.onClick(sib);\n }\n }\n }\n\n private handleMouseEnter(button: OptButton, btnEl: HTMLElement): void {\n if (this.hoverTimeout) clearTimeout(this.hoverTimeout);\n if (button.children && button.children.length > 0) {\n this.showDropdown(button, btnEl);\n } else {\n this.closeDropdown();\n }\n }\n\n private handleMouseLeave(): void {\n this.hoverTimeout = window.setTimeout(() => this.closeDropdown(), 200);\n }\n\n private showDropdown(button: OptButton, btnEl: HTMLElement): void {\n this.closeDropdown();\n if (!button.children) return;\n\n const dropdown = document.createElement('div');\n dropdown.className = 'opt-btn-dropdown';\n if (this.options.backgroundColor) dropdown.style.setProperty('--bim-toolbar-bg', this.options.backgroundColor);\n\n // 将主题CSS变量复制到dropdown元素上(因为dropdown被添加到body,无法继承容器的CSS变量)\n const dropdownStyle = dropdown.style;\n if (this.options.iconColor) dropdownStyle.setProperty('--bim-icon-color', this.options.iconColor);\n if (this.options.iconActiveColor) dropdownStyle.setProperty('--bim-icon-active-color', this.options.iconActiveColor);\n if (this.options.textColor) dropdownStyle.setProperty('--bim-btn-text-color', this.options.textColor);\n if (this.options.textActiveColor) dropdownStyle.setProperty('--bim-btn-text-active-color', this.options.textActiveColor);\n if (this.options.btnBackgroundColor) dropdownStyle.setProperty('--bim-btn-bg', this.options.btnBackgroundColor);\n if (this.options.btnHoverColor) dropdownStyle.setProperty('--bim-btn-hover-bg', this.options.btnHoverColor);\n if (this.options.btnActiveColor) dropdownStyle.setProperty('--bim-btn-active-bg', this.options.btnActiveColor);\n\n // 获取按钮的位置信息\n const btnRect = btnEl.getBoundingClientRect();\n const expand = this.options.expand || 'down';\n\n // 根据主按钮组的方向设置下拉菜单的布局方向\n if (this.options.direction === 'row') {\n dropdown.style.flexDirection = 'column'; // 横向按钮组,菜单纵向排列\n } else {\n dropdown.style.flexDirection = 'row'; // 纵向按钮组,菜单横向排列\n }\n\n if (this.options.type && this.options.type !== 'default') {\n dropdown.classList.add(`type-${this.options.type}`);\n }\n\n const currentTheme = themeManager.getTheme();\n dropdown.classList.add(`theme-${currentTheme.name}`);\n\n dropdownStyle.setProperty('--bim-primary', currentTheme.primary);\n dropdownStyle.setProperty('--bim-bg-overlay', currentTheme.bgOverlay);\n dropdownStyle.setProperty('--bim-border-default', currentTheme.borderDefault);\n dropdownStyle.setProperty('--bim-text-primary', currentTheme.textPrimary);\n dropdownStyle.setProperty('--bim-text-inverse', currentTheme.textInverse);\n dropdownStyle.setProperty('--bim-shadow-lg', currentTheme.shadowLg);\n dropdownStyle.setProperty('--bim-floating-btn-bg', currentTheme.floatingBtnBg);\n dropdownStyle.setProperty('--bim-floating-btn-bg-hover', currentTheme.floatingBtnBgHover);\n dropdownStyle.setProperty('--bim-floating-icon-color', currentTheme.floatingIconColor);\n\n document.body.appendChild(dropdown);\n\n // 添加事件拦截\n this.setupEventInterception(dropdown);\n\n // 添加菜单项\n button.children.forEach(subBtn => {\n if (this.isVisible(subBtn.id)) {\n const item = this.renderDropdownItem(subBtn);\n dropdown.appendChild(item);\n }\n });\n\n // 获取下拉菜单的实际尺寸\n const dropdownRect = dropdown.getBoundingClientRect();\n\n if (expand === 'up') {\n // 向上展开,与按钮水平居中对齐\n dropdown.style.bottom = (window.innerHeight - btnRect.top + 8) + 'px';\n dropdown.style.left = (btnRect.left + (btnRect.width - dropdownRect.width) / 2) + 'px';\n } else if (expand === 'down') {\n // 向下展开,与按钮水平居中对齐\n dropdown.style.top = (btnRect.bottom + 8) + 'px';\n dropdown.style.left = (btnRect.left + (btnRect.width - dropdownRect.width) / 2) + 'px';\n } else if (expand === 'right') {\n // 向右展开,与按钮垂直居中对齐\n dropdown.style.top = (btnRect.top + (btnRect.height - dropdownRect.height) / 2) + 'px';\n dropdown.style.left = (btnRect.right + 8) + 'px';\n } else if (expand === 'left') {\n // 向左展开,与按钮垂直居中对齐\n dropdown.style.top = (btnRect.top + (btnRect.height - dropdownRect.height) / 2) + 'px';\n dropdown.style.right = (window.innerWidth - btnRect.left + 8) + 'px';\n }\n\n dropdown.addEventListener('mouseenter', () => { if (this.hoverTimeout) clearTimeout(this.hoverTimeout); });\n dropdown.addEventListener('mouseleave', () => this.handleMouseLeave());\n this.dropdownElement = dropdown;\n }\n\n private renderDropdownItem(button: OptButton): HTMLElement {\n const item = document.createElement('div');\n item.className = 'opt-btn-dropdown-item';\n\n // 应用按钮的 align 设置,默认为 horizontal(图标在左)\n const align = button.align || 'horizontal';\n if (align === 'horizontal') {\n item.classList.add('align-horizontal');\n } else {\n item.classList.add('align-vertical');\n }\n\n // 二级菜单项的 active 状态渲染(修复 keepActive 在二级按钮“看起来不生效”的问题)\n // 说明:\n // - keepActive 的状态会记录在 activeBtnIds / button.isActive 上\n // - 下拉菜单每次打开都会重新渲染,因此必须在这里同步一次 active 样式\n if (this.activeBtnIds.has(button.id) || button.isActive) {\n item.classList.add('active');\n }\n\n // 应用按钮的自定义样式\n const iconSize = button.iconSize || 32; // 二级菜单默认图标更小\n const minWidth = button.minWidth; // 不设置默认值,让下拉菜单项保持紧凑\n if (minWidth) {\n item.style.minWidth = `${minWidth}px`;\n }\n\n const icon = document.createElement('div');\n icon.className = 'opt-btn-icon';\n icon.style.width = `${iconSize}px`;\n icon.style.height = `${iconSize}px`;\n icon.innerHTML = this.getIcon(button.icon);\n item.appendChild(icon);\n\n // 只有在 showLabel 为 true 时才显示 label\n if (this.options.showLabel && button.label) {\n const label = document.createElement('span');\n label.className = 'opt-btn-dropdown-label';\n label.textContent = t(button.label);\n item.appendChild(label);\n } else if (button.label) {\n // 当不显示 label 时,添加 title 属性作为 tooltip\n item.title = t(button.label);\n }\n\n item.addEventListener('click', (e) => { e.stopPropagation(); this.handleClick(button); });\n return item;\n }\n\n private closeDropdown(): void {\n if (this.dropdownElement) {\n this.dropdownElement.remove();\n this.dropdownElement = null;\n }\n this.btnRefs.forEach(btnEl => {\n const arrow = btnEl.querySelector('.opt-btn-arrow');\n if (arrow) arrow.classList.remove('rotated');\n });\n }\n\n private updateButtonState(buttonId: string): void {\n const btnEl = this.btnRefs.get(buttonId);\n if (btnEl) {\n if (this.activeBtnIds.has(buttonId)) {\n btnEl.classList.add('active');\n } else {\n btnEl.classList.remove('active');\n }\n }\n }\n\n private getIcon(icon?: string): string { return icon || this.DEFAULT_ICON; }\n\n public updateButtonVisibility(id: string, visible: boolean): void {\n if (!this.options.visibility) this.options.visibility = {};\n this.options.visibility[id] = visible;\n this.render();\n }\n\n public setShowLabel(show: boolean): void {\n this.options.showLabel = show;\n this.updateLabelsVisibility();\n }\n\n private updateLabelsVisibility(): void {\n this.btnRefs.forEach((btnEl, buttonId) => {\n // 查找按钮配置\n const button = this.findButtonById(buttonId);\n if (!button) return;\n\n const hasLabel = this.options.showLabel && button.label;\n\n // 更新 no-label 类和 title 属性\n if (hasLabel) {\n btnEl.classList.remove('no-label');\n // 显示标签时,移除 title(避免重复显示)\n btnEl.removeAttribute('title');\n } else {\n btnEl.classList.add('no-label');\n // 隐藏标签时,添加 title 作为 tooltip\n if (button.label) {\n btnEl.title = t(button.label);\n }\n }\n });\n }\n\n private findButtonById(id: string): OptButton | undefined {\n for (const group of this.groups) {\n const found = this.findButton(group.buttons, id);\n if (found) return found;\n }\n return undefined;\n }\n\n public setBackgroundColor(color: string): void { this.setColors({ backgroundColor: color }); }\n private isVisible(id: string): boolean { return this.options.visibility?.[id] !== false; }\n\n public setType(type: 'default' | 'glass-pill'): void {\n this.container.classList.remove('type-default', 'type-glass-pill');\n this.options.type = type;\n\n if (type && type !== 'default') {\n this.container.classList.add(`type-${type}`);\n }\n\n this.render();\n }\n\n public getType(): 'default' | 'glass-pill' {\n return this.options.type || 'default';\n }\n\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.closeDropdown();\n this.container.innerHTML = '';\n this.btnRefs.clear();\n }\n}\n","import { BimButtonGroup } from '../index';\n\nexport class Toolbar extends BimButtonGroup {\n public async init(): Promise {\n await super.init();\n\n const { createHomeButton } = await import('./buttons/home');\n const { createZoomBoxButton } = await import('./buttons/zoom-box');\n const { createWalkMenuButton } = await import('./buttons/walk/walk-menu');\n const { createMapButton } = await import('./buttons/map');\n const { createPropertyButton } = await import('./buttons/property');\n const { createSettingButton } = await import('./buttons/setting');\n const { createInfoButton } = await import('./buttons/info');\n const { createFullscreenButton } = await import('./buttons/fullscreen');\n const { createMeasureButton } = await import('./buttons/measure');\n const { createSectionMenuButton } = await import('./buttons/section/section-menu');\n const { createSectionPlaneButton } = await import('./buttons/section/section-plane');\n const { createSectionAxisButton } = await import('./buttons/section/section-axis');\n const { createSectionBoxButton } = await import('./buttons/section/section-box');\n\n this.addGroup('group-1');\n\n this.addButton(createHomeButton());\n this.addButton(createZoomBoxButton());\n this.addButton(createMeasureButton());\n this.addButton(createSectionMenuButton());\n this.addButton(createSectionPlaneButton());\n this.addButton(createSectionAxisButton());\n this.addButton(createSectionBoxButton());\n this.addButton(createWalkMenuButton());\n this.addButton(createMapButton());\n this.addButton(createPropertyButton());\n this.addGroup('group-2');\n this.addButton(createSettingButton());\n this.addButton(createInfoButton());\n this.addButton(createFullscreenButton());\n\n this.render();\n }\n}\n","/**\n * Manager 基类\n * 提供所有 Manager 的通用功能\n */\nimport { ManagerRegistry } from './manager-registry';\nimport type { EngineEvents } from '../types/events';\n\n/**\n * Manager 抽象基类\n * - 自动获取 Registry 实例\n * - 自动管理事件订阅的清理\n */\nexport abstract class BaseManager {\n /** 注册表实例 */\n protected registry: ManagerRegistry;\n /** 事件订阅列表,用于自动清理 */\n private subscriptions: Array<() => void> = [];\n\n constructor() {\n this.registry = ManagerRegistry.getInstance();\n }\n\n /**\n * 订阅事件(自动追踪,destroy 时自动取消)\n * @param event 事件名称\n * @param handler 事件处理函数\n */\n protected subscribe(\n event: K,\n handler: (payload: EngineEvents[K]) => void\n ): void {\n const unsubscribe = this.registry.on(event, handler);\n this.subscriptions.push(unsubscribe);\n }\n\n /**\n * 发送事件\n * @param event 事件名称\n * @param payload 事件数据\n */\n protected emit(\n event: K,\n payload: EngineEvents[K]\n ): void {\n this.registry.emit(event, payload);\n }\n\n /**\n * 销毁 Manager,清理所有订阅\n * 子类应该调用 super.destroy()\n */\n public destroy(): void {\n this.subscriptions.forEach(unsub => unsub());\n this.subscriptions = [];\n }\n}\n","/**\n * 工具栏管理器\n * 负责管理底部工具栏的创建、按钮配置和显示控制\n */\nimport type { ButtonGroupColors, ButtonConfig } from '../components/button-group/index.type';\nimport { Toolbar } from '../components/button-group/toolbar';\nimport type { ThemeConfig } from '../themes/types';\nimport { BaseManager } from '../core/base-manager';\n\n/**\n * 工具栏管理器\n * 提供工具栏按钮的添加、显示/隐藏、主题更新等功能\n */\nexport class ToolbarManager extends BaseManager {\n /** 工具栏实例 */\n private toolbar: Toolbar | null = null;\n /** 工具栏容器元素 */\n private toolbarContainer: HTMLElement | null = null;\n /** 主容器元素 */\n private container: HTMLElement;\n\n constructor(container: HTMLElement) {\n super();\n this.container = container;\n this.init();\n }\n\n /** 初始化工具栏 */\n private init() {\n this.toolbarContainer = document.createElement('div');\n this.toolbarContainer.id = 'opt-btn-groups';\n this.toolbarContainer.className = 'bim-engine-opt-btn-container is-bottom-toolbar';\n this.container.appendChild(this.toolbarContainer);\n\n this.toolbar = new Toolbar({\n container: this.toolbarContainer,\n type: 'glass-pill',\n showLabel: true,\n direction: 'row',\n position: 'bottom-right',\n align: 'vertical',\n expand: 'up'\n });\n\n this.toolbar.init();\n }\n\n /**\n * 更新工具栏主题\n * @param theme 主题配置\n */\n public updateTheme(theme: ThemeConfig) {\n this.toolbar?.setTheme(theme);\n }\n\n /** 刷新工具栏渲染 */\n public refresh() {\n this.toolbar?.render();\n }\n\n /** 销毁工具栏 */\n public destroy() {\n this.toolbar?.destroy();\n this.toolbar = null;\n super.destroy();\n }\n\n /**\n * 添加按钮组\n * @param groupId 组 ID\n * @param beforeGroupId 插入到指定组之前\n */\n public addGroup(groupId: string, beforeGroupId?: string) {\n this.toolbar?.addGroup(groupId, beforeGroupId);\n this.toolbar?.render();\n }\n\n /**\n * 添加按钮\n * @param config 按钮配置\n */\n public addButton(config: ButtonConfig) {\n this.toolbar?.addButton(config);\n this.toolbar?.render();\n }\n\n /**\n * 设置按钮可见性\n * @param id 按钮 ID\n * @param v 是否可见\n */\n public setButtonVisibility(id: string, v: boolean) {\n this.toolbar?.updateButtonVisibility(id, v);\n }\n\n /**\n * 设置是否显示标签\n * @param show 是否显示\n */\n public setShowLabel(show: boolean) {\n this.toolbar?.setShowLabel(show);\n }\n\n /**\n * 设置按钮激活状态\n * @param id 按钮 ID\n * @param active 是否激活\n */\n public setBtnActive(id: string, active?: boolean) {\n this.toolbar?.setBtnActive(id, active);\n }\n\n /**\n * 设置工具栏可见性\n * @param visible 是否可见\n */\n public setVisible(visible: boolean) {\n if (this.toolbarContainer) {\n this.toolbarContainer.style.visibility = visible ? 'visible' : 'hidden';\n }\n }\n\n /**\n * 设置背景颜色\n * @param color 颜色值\n */\n public setBackgroundColor(color: string) {\n this.toolbar?.setBackgroundColor(color);\n }\n\n /**\n * 设置按钮组颜色\n * @param colors 颜色配置\n */\n public setColors(colors: ButtonGroupColors) {\n this.toolbar?.setColors(colors);\n }\n\n /** 隐藏工具栏 */\n public hide(): void {\n if (this.toolbarContainer) {\n this.toolbarContainer.style.display = 'none';\n }\n }\n\n /** 显示工具栏 */\n public show(): void {\n if (this.toolbarContainer) {\n this.toolbarContainer.style.display = '';\n }\n }\n\n /**\n * 获取工具栏容器\n * @returns 容器元素\n */\n public getContainer(): HTMLElement | null {\n return this.toolbarContainer;\n }\n\n public setType(type: 'default' | 'glass-pill'): void {\n this.toolbar?.setType(type);\n }\n\n public getType(): 'default' | 'glass-pill' {\n return this.toolbar?.getType() || 'default';\n }\n}\n","/**\n * 按钮组管理器\n * 负责创建和管理按钮组实例\n */\nimport { BimButtonGroup } from '../components/button-group';\nimport type { ButtonGroupOptions } from '../components/button-group/index.type';\nimport type { ThemeConfig } from '../themes/types';\nimport { BaseManager } from '../core/base-manager';\n\n/**\n * 按钮组管理器\n * 统一管理多个按钮组的创建、主题更新和销毁\n */\nexport class ButtonGroupManager extends BaseManager {\n /** 按钮组映射表 */\n private groups: Map = new Map();\n /** 容器元素 */\n private container: HTMLElement;\n\n constructor(container: HTMLElement) {\n super();\n this.container = container;\n }\n\n /**\n * 创建按钮组\n * @param id 按钮组 ID\n * @param options 按钮组配置\n * @returns 按钮组实例\n */\n public create(id: string, options: Omit): BimButtonGroup {\n const group = new BimButtonGroup({\n container: this.container,\n ...options\n });\n\n group.init();\n this.groups.set(id, group);\n return group;\n }\n\n /**\n * 获取按钮组\n * @param id 按钮组 ID\n * @returns 按钮组实例\n */\n public get(id: string): BimButtonGroup | undefined {\n return this.groups.get(id);\n }\n\n /**\n * 更新所有按钮组的主题\n * @param theme 主题配置\n */\n public updateTheme(theme: ThemeConfig) {\n this.groups.forEach(group => group.setTheme(theme));\n }\n\n /** 销毁管理器和所有按钮组 */\n public destroy() {\n this.groups.forEach(group => group.destroy());\n this.groups.clear();\n super.destroy();\n }\n}\n","import './index.css';\nimport type { DialogOptions } from './index.type';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { themeManager } from '../../services/theme';\nimport { t, localeManager } from '../../services/locale';\n\n/**\n * 通用弹窗组件类\n * 支持拖拽、缩放、自定义内容和位置。\n */\nexport class BimDialog implements IBimComponent {\n private element: HTMLElement;\n private options: DialogOptions;\n private container: HTMLElement;\n private header: HTMLElement;\n private contentArea: HTMLElement;\n private _isDestroyed = false;\n private _isInitialized = false;\n private unsubscribeTheme: (() => void) | null = null;\n private unsubscribeLocale: (() => void) | null = null;\n\n // 性能优化:用于存储 requestAnimationFrame 的 ID\n private rafId: number | null = null;\n\n /**\n * 构造函数\n * @param options 弹窗配置选项\n */\n constructor(options: DialogOptions) {\n // 合并默认配置\n this.options = {\n title: 'Dialog',\n width: 300,\n height: 'auto',\n position: 'center',\n draggable: true,\n resizable: false,\n minWidth: 200,\n minHeight: 100,\n ...options\n };\n this.container = options.container;\n\n // 创建 DOM 结构\n this.element = this.createDom();\n this.header = this.element.querySelector('.bim-dialog-header') as HTMLElement;\n this.contentArea = this.element.querySelector('.bim-dialog-content') as HTMLElement;\n\n // 自动初始化 (为了兼容现有逻辑)\n this.init();\n }\n\n /**\n * 设置主题\n * @param theme 全局主题配置\n */\n public setTheme(theme: ThemeConfig) {\n const style = this.element.style;\n if (!this.options.backgroundColor) style.setProperty('--bim-dialog-bg', theme.bgElevated);\n if (!this.options.headerBackgroundColor) style.setProperty('--bim-dialog-header-bg', theme.bgInset);\n if (!this.options.titleColor) style.setProperty('--bim-dialog-title-color', theme.textPrimary);\n if (!this.options.textColor) style.setProperty('--bim-dialog-text-color', theme.textSecondary);\n if (!this.options.borderColor) style.setProperty('--bim-dialog-border-color', theme.borderDefault);\n\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-bg-inset', theme.bgInset);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-secondary', theme.textSecondary);\n style.setProperty('--bim-text-tertiary', theme.textTertiary);\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-shadow-lg', theme.shadowLg);\n }\n\n /**\n * 初始化组件功能 (接口实现)\n */\n public init() {\n if (this._isInitialized) return;\n\n this.container.appendChild(this.element);\n\n // 必须先挂载才能计算尺寸进行定位\n this.initPosition();\n\n if (this.options.draggable) {\n this.initDrag();\n }\n\n if (this.options.resizable) {\n this.initResize();\n }\n\n this._isInitialized = true;\n\n // 调用弹窗开启后回调\n if (this.options.onOpen) {\n this.options.onOpen();\n }\n\n // 自动订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 自动订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n }\n\n public setLocales(): void {\n if (this.options.title) {\n const titleEl = this.header.querySelector('.bim-dialog-title');\n if (titleEl) {\n titleEl.textContent = t(this.options.title);\n }\n }\n }\n\n /**\n * 创建弹窗的 DOM 结构\n */\n private createDom(): HTMLElement {\n const el = document.createElement('div');\n el.className = 'bim-dialog';\n\n if (this.options.id) el.id = this.options.id;\n\n // 应用颜色配置到 CSS 变量\n const style = el.style;\n if (this.options.backgroundColor) style.setProperty('--bim-dialog-bg', this.options.backgroundColor);\n if (this.options.headerBackgroundColor) style.setProperty('--bim-dialog-header-bg', this.options.headerBackgroundColor);\n if (this.options.titleColor) style.setProperty('--bim-dialog-title-color', this.options.titleColor);\n if (this.options.textColor) style.setProperty('--bim-dialog-text-color', this.options.textColor);\n if (this.options.borderColor) style.setProperty('--bim-dialog-border-color', this.options.borderColor);\n\n // 设置初始尺寸\n this.setSize(el, this.options.width, this.options.height);\n // 确保最小尺寸生效\n if (this.options.minWidth) el.style.minWidth = `${this.options.minWidth}px`;\n\n // 创建标题栏 (Header)\n const header = document.createElement('div');\n header.className = 'bim-dialog-header';\n if (this.options.draggable) header.classList.add('draggable');\n\n const title = document.createElement('span');\n title.className = 'bim-dialog-title';\n title.textContent = this.options.title ? t(this.options.title) : '';\n\n const closeBtn = document.createElement('span');\n closeBtn.className = 'bim-dialog-close';\n closeBtn.innerHTML = '×';\n // 修复 TS 报错:去掉未使用的参数 e\n closeBtn.onclick = () => {\n this.close();\n };\n\n header.appendChild(title);\n header.appendChild(closeBtn);\n\n // 创建内容区域 (Content)\n const content = document.createElement('div');\n content.className = 'bim-dialog-content';\n if (typeof this.options.content === 'string') {\n content.innerHTML = this.options.content;\n } else if (this.options.content instanceof HTMLElement) {\n content.appendChild(this.options.content);\n }\n\n el.appendChild(header);\n el.appendChild(content);\n\n // 如果允许缩放,创建缩放手柄\n if (this.options.resizable) {\n const resizeHandle = document.createElement('div');\n resizeHandle.className = 'bim-dialog-resize-handle';\n el.appendChild(resizeHandle);\n }\n\n // ==================== 事件拦截核心逻辑 ====================\n // 定义阻断逻辑:只阻止冒泡,不阻止捕获,也不阻止默认行为(除非显式阻止)\n const stopPropagation = (e: Event) => {\n e.stopPropagation();\n };\n\n // 现代浏览器和 3D 引擎 (Three.js/Cesium) 交互事件\n const events = [\n 'click', 'dblclick', 'contextmenu', 'wheel',\n 'mousedown', 'mouseup', 'mousemove',\n 'touchstart', 'touchend', 'touchmove',\n 'pointerdown', 'pointerup', 'pointermove', 'pointerenter', 'pointerleave', 'pointerover', 'pointerout'\n ];\n\n // 绑定监听器 (默认冒泡阶段)\n // 这样内部元素(如关闭按钮)先触发,然后冒泡到这里被拦截,不再传给地图\n events.forEach(eventType => {\n el.addEventListener(eventType, stopPropagation, { passive: false });\n });\n\n return el;\n }\n\n /**\n * 设置元素尺寸\n */\n private setSize(el: HTMLElement, width?: number | string, height?: number | string) {\n if (width !== undefined) {\n if (width === 'auto' || width === 'fit-content') {\n el.style.width = width;\n } else {\n el.style.width = typeof width === 'number' ? `${width}px` : width;\n }\n }\n if (height !== undefined) {\n if (height === 'auto' || height === 'fit-content') {\n el.style.height = height;\n } else {\n el.style.height = typeof height === 'number' ? `${height}px` : height;\n }\n }\n }\n\n /**\n * 根据内容自动调整弹窗宽度\n * @param recenter 是否重新计算定位(例如保持居中),默认 true\n */\n public fitWidth(recenter: boolean = false) {\n // 1. 设置为 fit-content 以获取自然宽度,高度保持不变\n this.element.style.width = 'fit-content';\n\n // 2. 如果需要重新定位\n if (recenter) {\n this.initPosition();\n }\n }\n\n /**\n * 根据内容自动调整弹窗高度\n *\n * 设计说明:\n * - 主要用于“内容展开/收起”场景(比如测量面板展开后,Dialog 高度跟随变化)\n * - 默认不改变用户拖拽后的当前位置,只做边界夹紧,避免弹窗超出容器\n *\n * @param recenter 是否根据 options.position 重新定位(默认 false)\n */\n public fitHeight(recenter: boolean = false) {\n // 1) 先让高度由内容自然撑开,便于测量真实高度\n this.element.style.height = 'auto';\n\n // 2) 获取自然高度并做约束(最小高度 + 不超过容器)\n const naturalHeight = this.element.getBoundingClientRect().height;\n const minHeight = this.options.minHeight ?? 100;\n const containerHeight = this.container.clientHeight || 0;\n\n // 如果容器高度不可用,至少保证最小高度\n let targetHeight = Math.max(minHeight, naturalHeight);\n\n // 约束最大高度:不超过容器高度(避免完全溢出)\n if (containerHeight > 0) {\n targetHeight = Math.min(targetHeight, containerHeight);\n }\n\n this.element.style.height = `${targetHeight}px`;\n\n // 3) 定位修正:recenter 则重新按 position 计算,否则只做边界夹紧\n if (recenter) {\n this.initPosition();\n } else {\n this.clampToContainer();\n }\n }\n\n /**\n * 边界夹紧:保持当前 left/top 不变的前提下,确保弹窗不超出容器\n * 说明:用于 fitHeight / fitWidth 后的\"尺寸变化\"场景,避免弹窗被裁切。\n */\n private clampToContainer(): void {\n const containerW = this.container.clientWidth;\n const containerH = this.container.clientHeight;\n const elW = this.element.offsetWidth;\n const elH = this.element.offsetHeight;\n const bottomOffset = this.options.bottomOffset ?? 70;\n\n const currentLeft = this.element.offsetLeft;\n const currentTop = this.element.offsetTop;\n\n const maxLeft = Math.max(0, containerW - elW);\n const maxTop = Math.max(0, containerH - elH - bottomOffset);\n\n const nextLeft = Math.max(0, Math.min(currentLeft, maxLeft));\n const nextTop = Math.max(0, Math.min(currentTop, maxTop));\n\n this.element.style.left = `${nextLeft}px`;\n this.element.style.top = `${nextTop}px`;\n }\n\n /**\n * 初始化弹窗位置\n */\n private initPosition() {\n const pos = this.options.position;\n const elRect = this.element.getBoundingClientRect();\n const bottomOffset = this.options.bottomOffset ?? 70;\n\n let left = 0;\n let top = 0;\n\n const pW = this.container.clientWidth;\n const pH = this.container.clientHeight;\n const elW = elRect.width;\n const elH = elRect.height;\n\n if (typeof pos === 'object' && 'x' in pos) {\n left = pos.x;\n top = pos.y;\n } else {\n switch (pos) {\n case 'center':\n left = (pW - elW) / 2;\n top = (pH - elH) / 2;\n break;\n case 'top-left': left = 0; top = 0; break;\n case 'top-center': left = (pW - elW) / 2; top = 0; break;\n case 'top-right': left = pW - elW; top = 0; break;\n case 'left-center': left = 0; top = (pH - elH) / 2; break;\n case 'right-center': left = pW - elW; top = (pH - elH) / 2; break;\n case 'bottom-left': left = 0; top = pH - elH - bottomOffset; break;\n case 'bottom-center': left = (pW - elW) / 2; top = pH - elH - bottomOffset; break;\n case 'bottom-right': left = pW - elW; top = pH - elH - bottomOffset; break;\n default:\n left = (pW - elW) / 2;\n top = (pH - elH) / 2;\n }\n }\n\n left = Math.max(0, Math.min(left, pW - elW));\n top = Math.max(0, Math.min(top, pH - elH - bottomOffset));\n\n this.element.style.left = `${left}px`;\n this.element.style.top = `${top}px`;\n }\n\n /**\n * 初始化拖拽功能 (性能优化 + 解决粘手)\n */\n private initDrag() {\n let startX = 0;\n let startY = 0;\n let startLeft = 0;\n let startTop = 0;\n let containerW = 0;\n let containerH = 0;\n let elW = 0;\n let elH = 0;\n let bottomOffset = 0;\n\n const onMouseDown = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n startX = e.clientX;\n startY = e.clientY;\n startLeft = this.element.offsetLeft;\n startTop = this.element.offsetTop;\n\n containerW = this.container.clientWidth;\n containerH = this.container.clientHeight;\n elW = this.element.offsetWidth;\n elH = this.element.offsetHeight;\n bottomOffset = this.options.bottomOffset ?? 70;\n\n document.addEventListener('mousemove', onMouseMove, { capture: true });\n document.addEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n const onMouseMove = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.rafId) return;\n\n this.rafId = requestAnimationFrame(() => {\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n\n let newLeft = startLeft + dx;\n let newTop = startTop + dy;\n\n const maxLeft = containerW - elW;\n const maxTop = containerH - elH - bottomOffset;\n\n newLeft = Math.max(0, Math.min(newLeft, maxLeft));\n newTop = Math.max(0, Math.min(newTop, maxTop));\n\n this.element.style.left = `${newLeft}px`;\n this.element.style.top = `${newTop}px`;\n\n this.rafId = null;\n });\n };\n\n const onMouseUp = () => {\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n // 移除监听\n document.removeEventListener('mousemove', onMouseMove, { capture: true });\n document.removeEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n this.header.addEventListener('mousedown', onMouseDown);\n }\n\n /**\n * 初始化缩放功能 (性能优化 + 解决粘手)\n */\n private initResize() {\n const handle = this.element.querySelector('.bim-dialog-resize-handle') as HTMLElement;\n if (!handle) return;\n\n let startX = 0;\n let startY = 0;\n let startW = 0;\n let startH = 0;\n\n const onMouseDown = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n startX = e.clientX;\n startY = e.clientY;\n startW = this.element.offsetWidth;\n startH = this.element.offsetHeight;\n\n // 关键:使用 capture: true\n document.addEventListener('mousemove', onMouseMove, { capture: true });\n document.addEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n const onMouseMove = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.rafId) return;\n\n this.rafId = requestAnimationFrame(() => {\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n\n const newW = Math.max(this.options.minWidth || 100, startW + dx);\n const newH = Math.max(this.options.minHeight || 50, startH + dy);\n\n this.element.style.width = `${newW}px`;\n this.element.style.height = `${newH}px`;\n\n this.rafId = null;\n });\n };\n\n const onMouseUp = () => {\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n document.removeEventListener('mousemove', onMouseMove, { capture: true });\n document.removeEventListener('mouseup', onMouseUp, { capture: true });\n };\n\n handle.addEventListener('mousedown', onMouseDown);\n }\n\n /**\n * 动态设置内容\n * @param content 内容元素或 HTML 字符串\n */\n public setContent(content: HTMLElement | string) {\n this.contentArea.innerHTML = '';\n if (typeof content === 'string') {\n this.contentArea.innerHTML = content;\n } else {\n this.contentArea.appendChild(content);\n }\n }\n\n /**\n * 关闭弹窗并销毁\n */\n public close() {\n if (this._isDestroyed) return;\n\n // 清理可能存在的动画帧,防止报错\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n this.element.remove();\n this._isDestroyed = true;\n if (this.options.onClose) {\n this.options.onClose();\n }\n }\n\n /**\n * 销毁组件 (接口实现)\n */\n public destroy() {\n this.close();\n }\n}\n","import './index.css';\nimport { BimDialog } from '../index';\n\n/**\n * BimInfoDialog (继承版)\n * 这是一个展示项目信息的业务弹窗组件,直接继承自 BimDialog。\n */\nexport class BimInfoDialog extends BimDialog {\n /**\n * 构造函数\n * @param container 父容器\n */\n constructor(container: HTMLElement) {\n // 1. 准备内容 DOM\n const contentEl = document.createElement('div');\n contentEl.className = 'bim-info-dialog-content';\n\n const infoTitle = document.createElement('h3');\n infoTitle.textContent = 'Model Information';\n\n const infoList = document.createElement('ul');\n infoList.innerHTML = `\n
  • Name: Sample Project
  • \n
  • Version: 1.0.0
  • \n
  • Date: ${new Date().toLocaleDateString()}
  • \n
  • Status: Active
  • \n `;\n\n const actionBtn = document.createElement('button');\n actionBtn.textContent = 'Update Status';\n actionBtn.style.marginTop = '10px';\n actionBtn.onclick = () => {\n alert('Status updated!');\n };\n\n contentEl.appendChild(infoTitle);\n contentEl.appendChild(infoList);\n contentEl.appendChild(actionBtn);\n\n // 2. 调用父类构造函数,传入特定的配置\n super({\n container: container,\n title: 'dialog.testTitle',\n content: contentEl,\n width: 320,\n height: 'auto',\n position: 'center',\n resizable: true,\n draggable: true,\n // 可以在这里添加特定的 onClose 逻辑\n onClose: () => {\n console.log('Info dialog closed');\n },\n onOpen: () => {\n console.log('Info dialog opened');\n }\n });\n\n // 3. 如果有特定于子类的初始化逻辑,可以在 super() 之后执行\n // 例如:this.element.classList.add('my-special-class');\n }\n\n // 不需要再手动实现 setTheme, destroy, close, init\n // 它们都已从 BimDialog 继承\n}","/**\n * 对话框管理器\n * 负责创建和管理所有对话框实例\n */\nimport { BimDialog } from '../components/dialog';\nimport { BimInfoDialog } from '../components/dialog/bimInfoDialog';\nimport type { DialogOptions } from '../components/dialog/index.type';\nimport type { ThemeConfig } from '../themes/types';\nimport { themeManager } from '../services/theme';\nimport { BaseManager } from '../core/base-manager';\n\n/**\n * 对话框管理器\n * 统一管理对话框的创建、主题更新和销毁\n */\nexport class DialogManager extends BaseManager {\n /** 容器元素 */\n private container: HTMLElement;\n /** 活跃的对话框列表 */\n private activeDialogs: BimDialog[] = [];\n\n constructor(container: HTMLElement) {\n super();\n this.container = container;\n\n this.subscribe('ui:open-dialog', (payload) => {\n console.log('[DialogManager] Received open-dialog event:', payload);\n if (payload.id === 'info') {\n this.showInfoDialog();\n }\n });\n }\n\n /**\n * 创建对话框\n * @param options 对话框配置选项\n * @returns 对话框实例\n */\n public create(options: Omit): BimDialog {\n const dialog = new BimDialog({\n container: this.container,\n ...options,\n onClose: () => {\n this.activeDialogs = this.activeDialogs.filter(d => d !== dialog);\n if (options.onClose) options.onClose();\n }\n });\n\n dialog.setTheme(themeManager.getTheme());\n this.activeDialogs.push(dialog);\n return dialog;\n }\n\n /** 显示信息对话框 */\n public showInfoDialog() {\n new BimInfoDialog(this.container);\n }\n\n /**\n * 更新所有对话框的主题\n * @param theme 主题配置\n */\n public updateTheme(theme: ThemeConfig) {\n this.activeDialogs.forEach(dialog => {\n if (dialog.setTheme) {\n dialog.setTheme(theme);\n }\n });\n }\n\n /** 销毁管理器和所有对话框 */\n public destroy() {\n this.activeDialogs.forEach(d => d.destroy());\n this.activeDialogs = [];\n super.destroy();\n }\n}\n","/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nconst REVISION = '181';\n\n/**\n * Represents mouse buttons and interaction types in context of controls.\n *\n * @type {ConstantsMouse}\n * @constant\n */\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\n\n/**\n * Represents touch interaction types in context of controls.\n *\n * @type {ConstantsTouch}\n * @constant\n */\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\n\n/**\n * Disables face culling.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceNone = 0;\n\n/**\n * Culls back faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceBack = 1;\n\n/**\n * Culls front faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceFront = 2;\n\n/**\n * Culls both front and back faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceFrontBack = 3;\n\n/**\n * Gives unfiltered shadow maps - fastest, but lowest quality.\n *\n * @type {number}\n * @constant\n */\nconst BasicShadowMap = 0;\n\n/**\n * Filters shadow maps using the Percentage-Closer Filtering (PCF) algorithm.\n *\n * @type {number}\n * @constant\n */\nconst PCFShadowMap = 1;\n\n/**\n * Filters shadow maps using the Percentage-Closer Filtering (PCF) algorithm with\n * better soft shadows especially when using low-resolution shadow maps.\n *\n * @type {number}\n * @constant\n */\nconst PCFSoftShadowMap = 2;\n\n/**\n * Filters shadow maps using the Variance Shadow Map (VSM) algorithm.\n * When using VSMShadowMap all shadow receivers will also cast shadows.\n *\n * @type {number}\n * @constant\n */\nconst VSMShadowMap = 3;\n\n/**\n * Only front faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst FrontSide = 0;\n\n/**\n * Only back faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst BackSide = 1;\n\n/**\n * Both front and back faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst DoubleSide = 2;\n\n/**\n * No blending is performed which effectively disables\n * alpha transparency.\n *\n * @type {number}\n * @constant\n */\nconst NoBlending = 0;\n\n/**\n * The default blending.\n *\n * @type {number}\n * @constant\n */\nconst NormalBlending = 1;\n\n/**\n * Represents additive blending.\n *\n * @type {number}\n * @constant\n */\nconst AdditiveBlending = 2;\n\n/**\n * Represents subtractive blending.\n *\n * @type {number}\n * @constant\n */\nconst SubtractiveBlending = 3;\n\n/**\n * Represents multiply blending.\n *\n * @type {number}\n * @constant\n */\nconst MultiplyBlending = 4;\n\n/**\n * Represents custom blending.\n *\n * @type {number}\n * @constant\n */\nconst CustomBlending = 5;\n\n/**\n * A `source + destination` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst AddEquation = 100;\n\n/**\n * A `source - destination` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst SubtractEquation = 101;\n\n/**\n * A `destination - source` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst ReverseSubtractEquation = 102;\n\n/**\n * A blend equation that uses the minimum of source and destination.\n *\n * @type {number}\n * @constant\n */\nconst MinEquation = 103;\n\n/**\n * A blend equation that uses the maximum of source and destination.\n *\n * @type {number}\n * @constant\n */\nconst MaxEquation = 104;\n\n/**\n * Multiplies all colors by `0`.\n *\n * @type {number}\n * @constant\n */\nconst ZeroFactor = 200;\n\n/**\n * Multiplies all colors by `1`.\n *\n * @type {number}\n * @constant\n */\nconst OneFactor = 201;\n\n/**\n * Multiplies all colors by the source colors.\n *\n * @type {number}\n * @constant\n */\nconst SrcColorFactor = 202;\n\n/**\n * Multiplies all colors by `1` minus each source color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusSrcColorFactor = 203;\n\n/**\n * Multiplies all colors by the source alpha value.\n *\n * @type {number}\n * @constant\n */\nconst SrcAlphaFactor = 204;\n\n/**\n * Multiplies all colors by 1 minus the source alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusSrcAlphaFactor = 205;\n\n/**\n * Multiplies all colors by the destination alpha value.\n *\n * @type {number}\n * @constant\n */\nconst DstAlphaFactor = 206;\n\n/**\n * Multiplies all colors by `1` minus the destination alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusDstAlphaFactor = 207;\n\n/**\n * Multiplies all colors by the destination color.\n *\n * @type {number}\n * @constant\n */\nconst DstColorFactor = 208;\n\n/**\n * Multiplies all colors by `1` minus each destination color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusDstColorFactor = 209;\n\n/**\n * Multiplies the RGB colors by the smaller of either the source alpha\n * value or the value of `1` minus the destination alpha value. The alpha\n * value is multiplied by `1`.\n *\n * @type {number}\n * @constant\n */\nconst SrcAlphaSaturateFactor = 210;\n\n/**\n * Multiplies all colors by a constant color.\n *\n * @type {number}\n * @constant\n */\nconst ConstantColorFactor = 211;\n\n/**\n * Multiplies all colors by `1` minus a constant color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusConstantColorFactor = 212;\n\n/**\n * Multiplies all colors by a constant alpha value.\n *\n * @type {number}\n * @constant\n */\nconst ConstantAlphaFactor = 213;\n\n/**\n * Multiplies all colors by 1 minus a constant alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusConstantAlphaFactor = 214;\n\n/**\n * Never pass.\n *\n * @type {number}\n * @constant\n */\nconst NeverDepth = 0;\n\n/**\n * Always pass.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysDepth = 1;\n\n/**\n * Pass if the incoming value is less than the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst LessDepth = 2;\n\n/**\n * Pass if the incoming value is less than or equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualDepth = 3;\n\n/**\n * Pass if the incoming value equals the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst EqualDepth = 4;\n\n/**\n * Pass if the incoming value is greater than or equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualDepth = 5;\n\n/**\n * Pass if the incoming value is greater than the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterDepth = 6;\n\n/**\n * Pass if the incoming value is not equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualDepth = 7;\n\n/**\n * Multiplies the environment map color with the surface color.\n *\n * @type {number}\n * @constant\n */\nconst MultiplyOperation = 0;\n\n/**\n * Uses reflectivity to blend between the two colors.\n *\n * @type {number}\n * @constant\n */\nconst MixOperation = 1;\n\n/**\n * Adds the two colors.\n *\n * @type {number}\n * @constant\n */\nconst AddOperation = 2;\n\n/**\n * No tone mapping is applied.\n *\n * @type {number}\n * @constant\n */\nconst NoToneMapping = 0;\n\n/**\n * Linear tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst LinearToneMapping = 1;\n\n/**\n * Reinhard tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst ReinhardToneMapping = 2;\n\n/**\n * Cineon tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst CineonToneMapping = 3;\n\n/**\n * ACES Filmic tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst ACESFilmicToneMapping = 4;\n\n/**\n * Custom tone mapping.\n *\n * Expects a custom implementation by modifying shader code of the material's fragment shader.\n *\n * @type {number}\n * @constant\n */\nconst CustomToneMapping = 5;\n\n/**\n * AgX tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst AgXToneMapping = 6;\n\n/**\n * Neutral tone mapping.\n *\n * Implementation based on the Khronos 3D Commerce Group standard tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst NeutralToneMapping = 7;\n\n/**\n * The skinned mesh shares the same world space as the skeleton.\n *\n * @type {string}\n * @constant\n */\nconst AttachedBindMode = 'attached';\n\n/**\n * The skinned mesh does not share the same world space as the skeleton.\n * This is useful when a skeleton is shared across multiple skinned meshes.\n *\n * @type {string}\n * @constant\n */\nconst DetachedBindMode = 'detached';\n\n/**\n * Maps textures using the geometry's UV coordinates.\n *\n * @type {number}\n * @constant\n */\nconst UVMapping = 300;\n\n/**\n * Reflection mapping for cube textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeReflectionMapping = 301;\n\n/**\n * Refraction mapping for cube textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeRefractionMapping = 302;\n\n/**\n * Reflection mapping for equirectangular textures.\n *\n * @type {number}\n * @constant\n */\nconst EquirectangularReflectionMapping = 303;\n\n/**\n * Refraction mapping for equirectangular textures.\n *\n * @type {number}\n * @constant\n */\nconst EquirectangularRefractionMapping = 304;\n\n/**\n * Reflection mapping for PMREM textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeUVReflectionMapping = 306;\n\n/**\n * The texture will simply repeat to infinity.\n *\n * @type {number}\n * @constant\n */\nconst RepeatWrapping = 1000;\n\n/**\n * The last pixel of the texture stretches to the edge of the mesh.\n *\n * @type {number}\n * @constant\n */\nconst ClampToEdgeWrapping = 1001;\n\n/**\n * The texture will repeats to infinity, mirroring on each repeat.\n *\n * @type {number}\n * @constant\n */\nconst MirroredRepeatWrapping = 1002;\n\n/**\n * Returns the value of the texture element that is nearest (in Manhattan distance)\n * to the specified texture coordinates.\n *\n * @type {number}\n * @constant\n */\nconst NearestFilter = 1003;\n\n/**\n * Chooses the mipmap that most closely matches the size of the pixel being textured\n * and uses the `NearestFilter` criterion (the texel nearest to the center of the pixel)\n * to produce a texture value.\n *\n * @type {number}\n * @constant\n */\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004; // legacy\n\n/**\n * Chooses the two mipmaps that most closely match the size of the pixel being textured and\n * uses the `NearestFilter` criterion to produce a texture value from each mipmap.\n * The final texture value is a weighted average of those two values.\n *\n * @type {number}\n * @constant\n */\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005; // legacy\n\n/**\n * Returns the weighted average of the four texture elements that are closest to the specified\n * texture coordinates, and can include items wrapped or repeated from other parts of a texture,\n * depending on the values of `wrapS` and `wrapT`, and on the exact mapping.\n *\n * @type {number}\n * @constant\n */\nconst LinearFilter = 1006;\n\n/**\n * Chooses the mipmap that most closely matches the size of the pixel being textured and uses\n * the `LinearFilter` criterion (a weighted average of the four texels that are closest to the\n * center of the pixel) to produce a texture value.\n *\n * @type {number}\n * @constant\n */\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007; // legacy\n\n/**\n * Chooses the two mipmaps that most closely match the size of the pixel being textured and uses\n * the `LinearFilter` criterion to produce a texture value from each mipmap. The final texture value\n * is a weighted average of those two values.\n *\n * @type {number}\n * @constant\n */\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008; // legacy\n\n/**\n * An unsigned byte data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedByteType = 1009;\n\n/**\n * A byte data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst ByteType = 1010;\n\n/**\n * A short data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst ShortType = 1011;\n\n/**\n * An unsigned short data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShortType = 1012;\n\n/**\n * An int data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst IntType = 1013;\n\n/**\n * An unsigned int data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedIntType = 1014;\n\n/**\n * A float data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst FloatType = 1015;\n\n/**\n * A half float data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst HalfFloatType = 1016;\n\n/**\n * An unsigned short 4_4_4_4 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShort4444Type = 1017;\n\n/**\n * An unsigned short 5_5_5_1 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShort5551Type = 1018;\n\n/**\n * An unsigned int 24_8 data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt248Type = 1020;\n\n/**\n * An unsigned int 5_9_9_9 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt5999Type = 35902;\n\n/**\n * An unsigned int 10_11_11 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt101111Type = 35899;\n\n/**\n * Discards the red, green and blue components and reads just the alpha component.\n *\n * @type {number}\n * @constant\n */\nconst AlphaFormat = 1021;\n\n/**\n * Discards the alpha component and reads the red, green and blue component.\n *\n * @type {number}\n * @constant\n */\nconst RGBFormat = 1022;\n\n/**\n * Reads the red, green, blue and alpha components.\n *\n * @type {number}\n * @constant\n */\nconst RGBAFormat = 1023;\n\n/**\n * Reads each element as a single depth value, converts it to floating point, and clamps to the range `[0,1]`.\n *\n * @type {number}\n * @constant\n */\nconst DepthFormat = 1026;\n\n/**\n * Reads each element is a pair of depth and stencil values. The depth component of the pair is interpreted as\n * in `DepthFormat`. The stencil component is interpreted based on the depth + stencil internal format.\n *\n * @type {number}\n * @constant\n */\nconst DepthStencilFormat = 1027;\n\n/**\n * Discards the green, blue and alpha components and reads just the red component.\n *\n * @type {number}\n * @constant\n */\nconst RedFormat = 1028;\n\n/**\n * Discards the green, blue and alpha components and reads just the red component. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RedIntegerFormat = 1029;\n\n/**\n * Discards the alpha, and blue components and reads the red, and green components.\n *\n * @type {number}\n * @constant\n */\nconst RGFormat = 1030;\n\n/**\n * Discards the alpha, and blue components and reads the red, and green components. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGIntegerFormat = 1031;\n\n/**\n * Discards the alpha component and reads the red, green and blue component. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGBIntegerFormat = 1032;\n\n/**\n * Reads the red, green, blue and alpha components. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGBAIntegerFormat = 1033;\n\n/**\n * A DXT1-compressed image in an RGB image format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_S3TC_DXT1_Format = 33776;\n\n/**\n * A DXT1-compressed image in an RGB image format with a simple on/off alpha value.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT1_Format = 33777;\n\n/**\n * A DXT3-compressed image in an RGBA image format. Compared to a 32-bit RGBA texture, it offers 4:1 compression.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT3_Format = 33778;\n\n/**\n * A DXT5-compressed image in an RGBA image format. It also provides a 4:1 compression, but differs to the DXT3\n * compression in how the alpha compression is done.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT5_Format = 33779;\n\n/**\n * PVRTC RGB compression in 4-bit mode. One block for each 4×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGB_PVRTC_4BPPV1_Format = 35840;\n\n/**\n * PVRTC RGB compression in 2-bit mode. One block for each 8×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGB_PVRTC_2BPPV1_Format = 35841;\n\n/**\n * PVRTC RGBA compression in 4-bit mode. One block for each 4×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\n\n/**\n * PVRTC RGBA compression in 2-bit mode. One block for each 8×4 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\n\n/**\n * ETC1 RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_ETC1_Format = 36196;\n\n/**\n * ETC2 RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_ETC2_Format = 37492;\n\n/**\n * ETC2 RGBA format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ETC2_EAC_Format = 37496;\n\n/**\n * ASTC RGBA 4x4 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_4x4_Format = 37808;\n\n/**\n * ASTC RGBA 5x4 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_5x4_Format = 37809;\n\n/**\n * ASTC RGBA 5x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_5x5_Format = 37810;\n\n/**\n * ASTC RGBA 6x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_6x5_Format = 37811;\n\n/**\n * ASTC RGBA 6x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_6x6_Format = 37812;\n\n/**\n * ASTC RGBA 8x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x5_Format = 37813;\n\n/**\n * ASTC RGBA 8x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x6_Format = 37814;\n\n/**\n * ASTC RGBA 8x8 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x8_Format = 37815;\n\n/**\n * ASTC RGBA 10x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x5_Format = 37816;\n\n/**\n * ASTC RGBA 10x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x6_Format = 37817;\n\n/**\n * ASTC RGBA 10x8 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x8_Format = 37818;\n\n/**\n * ASTC RGBA 10x10 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x10_Format = 37819;\n\n/**\n * ASTC RGBA 12x10 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_12x10_Format = 37820;\n\n/**\n * ASTC RGBA 12x12 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_12x12_Format = 37821;\n\n/**\n * BPTC RGBA format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_BPTC_Format = 36492;\n\n/**\n * BPTC Signed RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_BPTC_SIGNED_Format = 36494;\n\n/**\n * BPTC Unsigned RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_BPTC_UNSIGNED_Format = 36495;\n\n/**\n * RGTC1 Red format.\n *\n * @type {number}\n * @constant\n */\nconst RED_RGTC1_Format = 36283;\n\n/**\n * RGTC1 Signed Red format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RED_RGTC1_Format = 36284;\n\n/**\n * RGTC2 Red Green format.\n *\n * @type {number}\n * @constant\n */\nconst RED_GREEN_RGTC2_Format = 36285;\n\n/**\n * RGTC2 Signed Red Green format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RED_GREEN_RGTC2_Format = 36286;\n\n/**\n * Animations are played once.\n *\n * @type {number}\n * @constant\n */\nconst LoopOnce = 2200;\n\n/**\n * Animations are played with a chosen number of repetitions, each time jumping from\n * the end of the clip directly to its beginning.\n *\n * @type {number}\n * @constant\n */\nconst LoopRepeat = 2201;\n\n/**\n * Animations are played with a chosen number of repetitions, alternately playing forward\n * and backward.\n *\n * @type {number}\n * @constant\n */\nconst LoopPingPong = 2202;\n\n/**\n * Discrete interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateDiscrete = 2300;\n\n/**\n * Linear interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateLinear = 2301;\n\n/**\n * Smooth interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateSmooth = 2302;\n\n/**\n * Zero curvature ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst ZeroCurvatureEnding = 2400;\n\n/**\n * Zero slope ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst ZeroSlopeEnding = 2401;\n\n/**\n * Wrap around ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst WrapAroundEnding = 2402;\n\n/**\n * Default animation blend mode.\n *\n * @type {number}\n * @constant\n */\nconst NormalAnimationBlendMode = 2500;\n\n/**\n * Additive animation blend mode. Can be used to layer motions on top of\n * each other to build complex performances from smaller re-usable assets.\n *\n * @type {number}\n * @constant\n */\nconst AdditiveAnimationBlendMode = 2501;\n\n/**\n * For every three vertices draw a single triangle.\n *\n * @type {number}\n * @constant\n */\nconst TrianglesDrawMode = 0;\n\n/**\n * For each vertex draw a triangle from the last three vertices.\n *\n * @type {number}\n * @constant\n */\nconst TriangleStripDrawMode = 1;\n\n/**\n * For each vertex draw a triangle from the first vertex and the last two vertices.\n *\n * @type {number}\n * @constant\n */\nconst TriangleFanDrawMode = 2;\n\n/**\n * Basic depth packing.\n *\n * @type {number}\n * @constant\n */\nconst BasicDepthPacking = 3200;\n\n/**\n * A depth value is packed into 32 bit RGBA.\n *\n * @type {number}\n * @constant\n */\nconst RGBADepthPacking = 3201;\n\n/**\n * A depth value is packed into 24 bit RGB.\n *\n * @type {number}\n * @constant\n */\nconst RGBDepthPacking = 3202;\n\n/**\n * A depth value is packed into 16 bit RG.\n *\n * @type {number}\n * @constant\n */\nconst RGDepthPacking = 3203;\n\n/**\n * Normal information is relative to the underlying surface.\n *\n * @type {number}\n * @constant\n */\nconst TangentSpaceNormalMap = 0;\n\n/**\n * Normal information is relative to the object orientation.\n *\n * @type {number}\n * @constant\n */\nconst ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\n\n/**\n * No color space.\n *\n * @type {string}\n * @constant\n */\nconst NoColorSpace = '';\n\n/**\n * sRGB color space.\n *\n * @type {string}\n * @constant\n */\nconst SRGBColorSpace = 'srgb';\n\n/**\n * sRGB-linear color space.\n *\n * @type {string}\n * @constant\n */\nconst LinearSRGBColorSpace = 'srgb-linear';\n\n/**\n * Linear transfer function.\n *\n * @type {string}\n * @constant\n */\nconst LinearTransfer = 'linear';\n\n/**\n * sRGB transfer function.\n *\n * @type {string}\n * @constant\n */\nconst SRGBTransfer = 'srgb';\n\n/**\n * Sets the stencil buffer value to `0`.\n *\n * @type {number}\n * @constant\n */\nconst ZeroStencilOp = 0;\n\n/**\n * Keeps the current value.\n *\n * @type {number}\n * @constant\n */\nconst KeepStencilOp = 7680;\n\n/**\n * Sets the stencil buffer value to the specified reference value.\n *\n * @type {number}\n * @constant\n */\nconst ReplaceStencilOp = 7681;\n\n/**\n * Increments the current stencil buffer value. Clamps to the maximum representable unsigned value.\n *\n * @type {number}\n * @constant\n */\nconst IncrementStencilOp = 7682;\n\n/**\n * Decrements the current stencil buffer value. Clamps to `0`.\n *\n * @type {number}\n * @constant\n */\nconst DecrementStencilOp = 7683;\n\n/**\n * Increments the current stencil buffer value. Wraps stencil buffer value to zero when incrementing\n * the maximum representable unsigned value.\n *\n * @type {number}\n * @constant\n */\nconst IncrementWrapStencilOp = 34055;\n\n/**\n * Decrements the current stencil buffer value. Wraps stencil buffer value to the maximum representable\n * unsigned value when decrementing a stencil buffer value of `0`.\n *\n * @type {number}\n * @constant\n */\nconst DecrementWrapStencilOp = 34056;\n\n/**\n * Inverts the current stencil buffer value bitwise.\n *\n * @type {number}\n * @constant\n */\nconst InvertStencilOp = 5386;\n\n/**\n * Will never return true.\n *\n * @type {number}\n * @constant\n */\nconst NeverStencilFunc = 512;\n\n/**\n * Will return true if the stencil reference value is less than the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst LessStencilFunc = 513;\n\n/**\n * Will return true if the stencil reference value is equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst EqualStencilFunc = 514;\n\n/**\n * Will return true if the stencil reference value is less than or equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualStencilFunc = 515;\n\n/**\n * Will return true if the stencil reference value is greater than the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterStencilFunc = 516;\n\n/**\n * Will return true if the stencil reference value is not equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualStencilFunc = 517;\n\n/**\n * Will return true if the stencil reference value is greater than or equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualStencilFunc = 518;\n\n/**\n * Will always return true.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysStencilFunc = 519;\n\n/**\n * Never pass.\n *\n * @type {number}\n * @constant\n */\nconst NeverCompare = 512;\n\n/**\n * Pass if the incoming value is less than the texture value.\n *\n * @type {number}\n * @constant\n */\nconst LessCompare = 513;\n\n/**\n * Pass if the incoming value equals the texture value.\n *\n * @type {number}\n * @constant\n */\nconst EqualCompare = 514;\n\n/**\n * Pass if the incoming value is less than or equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualCompare = 515;\n\n/**\n * Pass if the incoming value is greater than the texture value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterCompare = 516;\n\n/**\n * Pass if the incoming value is not equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualCompare = 517;\n\n/**\n * Pass if the incoming value is greater than or equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualCompare = 518;\n\n/**\n * Always pass.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysCompare = 519;\n\n/**\n * The contents are intended to be specified once by the application, and used many\n * times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StaticDrawUsage = 35044;\n\n/**\n * The contents are intended to be respecified repeatedly by the application, and\n * used many times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst DynamicDrawUsage = 35048;\n\n/**\n * The contents are intended to be specified once by the application, and used at most\n * a few times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StreamDrawUsage = 35040;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and queried\n * many times by the application.\n *\n * @type {number}\n * @constant\n */\nconst StaticReadUsage = 35045;\n\n/**\n * The contents are intended to be respecified repeatedly by reading data from the 3D API, and queried\n * many times by the application.\n *\n * @type {number}\n * @constant\n */\nconst DynamicReadUsage = 35049;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and queried at most\n * a few times by the application\n *\n * @type {number}\n * @constant\n */\nconst StreamReadUsage = 35041;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and used many times as\n * the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StaticCopyUsage = 35046;\n\n/**\n * The contents are intended to be respecified repeatedly by reading data from the 3D API, and used many times\n * as the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst DynamicCopyUsage = 35050;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and used at most a few times\n * as the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StreamCopyUsage = 35042;\n\n/**\n * GLSL 1 shader code.\n *\n * @type {string}\n * @constant\n */\nconst GLSL1 = '100';\n\n/**\n * GLSL 3 shader code.\n *\n * @type {string}\n * @constant\n */\nconst GLSL3 = '300 es';\n\n/**\n * WebGL coordinate system.\n *\n * @type {number}\n * @constant\n */\nconst WebGLCoordinateSystem = 2000;\n\n/**\n * WebGPU coordinate system.\n *\n * @type {number}\n * @constant\n */\nconst WebGPUCoordinateSystem = 2001;\n\n/**\n * Represents the different timestamp query types.\n *\n * @type {ConstantsTimestampQuery}\n * @constant\n */\nconst TimestampQuery = {\n\tCOMPUTE: 'compute',\n\tRENDER: 'render'\n};\n\n/**\n * Represents mouse buttons and interaction types in context of controls.\n *\n * @type {ConstantsInterpolationSamplingType}\n * @constant\n */\nconst InterpolationSamplingType = {\n\tPERSPECTIVE: 'perspective',\n\tLINEAR: 'linear',\n\tFLAT: 'flat'\n};\n\n/**\n * Represents the different interpolation sampling modes.\n *\n * @type {ConstantsInterpolationSamplingMode}\n * @constant\n */\nconst InterpolationSamplingMode = {\n\tNORMAL: 'normal',\n\tCENTROID: 'centroid',\n\tSAMPLE: 'sample',\n\tFIRST: 'first',\n\tEITHER: 'either'\n};\n\n/**\n * This type represents mouse buttons and interaction types in context of controls.\n *\n * @typedef {Object} ConstantsMouse\n * @property {number} MIDDLE - The left mouse button.\n * @property {number} LEFT - The middle mouse button.\n * @property {number} RIGHT - The right mouse button.\n * @property {number} ROTATE - A rotate interaction.\n * @property {number} DOLLY - A dolly interaction.\n * @property {number} PAN - A pan interaction.\n **/\n\n/**\n * This type represents touch interaction types in context of controls.\n *\n * @typedef {Object} ConstantsTouch\n * @property {number} ROTATE - A rotate interaction.\n * @property {number} PAN - A pan interaction.\n * @property {number} DOLLY_PAN - The dolly-pan interaction.\n * @property {number} DOLLY_ROTATE - A dolly-rotate interaction.\n **/\n\n/**\n * This type represents the different timestamp query types.\n *\n * @typedef {Object} ConstantsTimestampQuery\n * @property {string} COMPUTE - A `compute` timestamp query.\n * @property {string} RENDER - A `render` timestamp query.\n **/\n\n/**\n * Represents the different interpolation sampling types.\n *\n * @typedef {Object} ConstantsInterpolationSamplingType\n * @property {string} PERSPECTIVE - Perspective-correct interpolation.\n * @property {string} LINEAR - Linear interpolation.\n * @property {string} FLAT - Flat interpolation.\n */\n\n/**\n * Represents the different interpolation sampling modes.\n *\n * @typedef {Object} ConstantsInterpolationSamplingMode\n * @property {string} NORMAL - Normal sampling mode.\n * @property {string} CENTROID - Centroid sampling mode.\n * @property {string} SAMPLE - Sample-specific sampling mode.\n * @property {string} FIRST - Flat interpolation using the first vertex.\n * @property {string} EITHER - Flat interpolation using either vertex.\n */\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] >= 65535 ) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nconst _cache = {};\n\nlet _setConsoleFunction = null;\n\nfunction setConsoleFunction( fn ) {\n\n\t_setConsoleFunction = fn;\n\n}\n\nfunction getConsoleFunction() {\n\n\treturn _setConsoleFunction;\n\n}\n\nfunction log( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'log', message, ...params );\n\n\t} else {\n\n\t\tconsole.log( message, ...params );\n\n\t}\n\n}\n\nfunction warn( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'warn', message, ...params );\n\n\t} else {\n\n\t\tconsole.warn( message, ...params );\n\n\t}\n\n}\n\nfunction error( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'error', message, ...params );\n\n\t} else {\n\n\t\tconsole.error( message, ...params );\n\n\t}\n\n}\n\nfunction warnOnce( ...params ) {\n\n\tconst message = params.join( ' ' );\n\n\tif ( message in _cache ) return;\n\n\t_cache[ message ] = true;\n\n\twarn( ...params );\n\n}\n\nfunction probeAsync( gl, sync, interval ) {\n\n\treturn new Promise( function ( resolve, reject ) {\n\n\t\tfunction probe() {\n\n\t\t\tswitch ( gl.clientWaitSync( sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0 ) ) {\n\n\t\t\t\tcase gl.WAIT_FAILED:\n\t\t\t\t\treject();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase gl.TIMEOUT_EXPIRED:\n\t\t\t\t\tsetTimeout( probe, interval );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tresolve();\n\n\t\t\t}\n\n\t\t}\n\n\t\tsetTimeout( probe, interval );\n\n\t} );\n\n}\n\n/**\n * This modules allows to dispatch event objects on custom JavaScript objects.\n *\n * Main repository: [eventdispatcher.js](https://github.com/mrdoob/eventdispatcher.js/)\n *\n * Code Example:\n * ```js\n * class Car extends EventDispatcher {\n * \tstart() {\n *\t\tthis.dispatchEvent( { type: 'start', message: 'vroom vroom!' } );\n *\t}\n *};\n *\n * // Using events with the custom object\n * const car = new Car();\n * car.addEventListener( 'start', function ( event ) {\n * \talert( event.message );\n * } );\n *\n * car.start();\n * ```\n */\nclass EventDispatcher {\n\n\t/**\n\t * Adds the given event listener to the given event type.\n\t *\n\t * @param {string} type - The type of event to listen to.\n\t * @param {Function} listener - The function that gets called when the event is fired.\n\t */\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === -1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` if the given event listener has been added to the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to check.\n\t * @return {boolean} Whether the given event listener has been added to the given event type.\n\t */\n\thasEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return false;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== -1;\n\n\t}\n\n\t/**\n\t * Removes the given event listener from the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to remove.\n\t */\n\tremoveEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Dispatches an event object.\n\t *\n\t * @param {Object} event - The event that gets fired.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n/**\n * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)\n * (universally unique identifier).\n *\n * @return {string} The UUID.\n */\nfunction generateUUID() {\n\n\t// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\n/**\n * Clamps the given value between min and max.\n *\n * @param {number} value - The value to clamp.\n * @param {number} min - The min value.\n * @param {number} max - The max value.\n * @return {number} The clamped value.\n */\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n/**\n * Computes the Euclidean modulo of the given parameters that\n * is `( ( n % m ) + m ) % m`.\n *\n * @param {number} n - The first parameter.\n * @param {number} m - The second parameter.\n * @return {number} The Euclidean modulo.\n */\nfunction euclideanModulo( n, m ) {\n\n\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n/**\n * Performs a linear mapping from range `` to range ``\n * for the given value.\n *\n * @param {number} x - The value to be mapped.\n * @param {number} a1 - Minimum value for range A.\n * @param {number} a2 - Maximum value for range A.\n * @param {number} b1 - Minimum value for range B.\n * @param {number} b2 - Maximum value for range B.\n * @return {number} The mapped value.\n */\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n/**\n * Returns the percentage in the closed interval `[0, 1]` of the given value\n * between the start and end point.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} value - A value between start and end.\n * @return {number} The interpolation factor.\n */\nfunction inverseLerp( x, y, value ) {\n\n\t// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n/**\n * Returns a value linearly interpolated from two known points based on the given interval -\n * `t = 0` will return `x` and `t = 1` will return `y`.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n * @return {number} The interpolated value.\n */\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n/**\n * Smoothly interpolate a number from `x` to `y` in a spring-like manner using a delta\n * time to maintain frame rate independent movement. For details, see\n * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/).\n *\n * @param {number} x - The current point.\n * @param {number} y - The target point.\n * @param {number} lambda - A higher lambda value will make the movement more sudden,\n * and a lower value will make the movement more gradual.\n * @param {number} dt - Delta time in seconds.\n * @return {number} The interpolated value.\n */\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n/**\n * Returns a value that alternates between `0` and the given `length` parameter.\n *\n * @param {number} x - The value to pingpong.\n * @param {number} [length=1] - The positive value the function will pingpong to.\n * @return {number} The alternated value.\n */\nfunction pingpong( x, length = 1 ) {\n\n\t// https://www.desmos.com/calculator/vcsjnyz7x4\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n/**\n * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n * the `min` and `max`.\n *\n * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\n/**\n * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)\n * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n/**\n * Returns a random integer from `` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random integer.\n */\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n/**\n * Returns a random float from `` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random float.\n */\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n/**\n * Returns a random integer from `<-range/2, range/2>` interval.\n *\n * @param {number} range - Defines the value range.\n * @return {number} A random float.\n */\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n/**\n * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n *\n * @param {number} [s] - The integer seed.\n * @return {number} A random float.\n */\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\n/**\n * Converts degrees to radians.\n *\n * @param {number} degrees - A value in degrees.\n * @return {number} The converted value in radians.\n */\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\n/**\n * Converts radians to degrees.\n *\n * @param {number} radians - A value in radians.\n * @return {number} The converted value in degrees.\n */\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\n/**\n * Returns `true` if the given number is a power of two.\n *\n * @param {number} value - The value to check.\n * @return {boolean} Whether the given number is a power of two or not.\n */\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\n/**\n * Returns the smallest power of two that is greater than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The smallest power of two that is greater than or equal to the given number.\n */\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Returns the largest power of two that is less than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The largest power of two that is less than or equal to the given number.\n */\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles)\n * defined by the given angles and order.\n *\n * Rotations are applied to the axes in the order specified by order:\n * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n *\n * @param {Quaternion} q - The quaternion to set.\n * @param {number} a - The rotation applied to the first axis, in radians.\n * @param {number} b - The rotation applied to the second axis, in radians.\n * @param {number} c - The rotation applied to the third axis, in radians.\n * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n */\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\twarn( 'MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\n/**\n * Denormalizes the given value according to the given typed array.\n *\n * @param {number} value - The value to denormalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The denormalize (float) value in the range `[0,1]`.\n */\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, -1 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, -1 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, -1 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * Normalizes the given value according to the given typed array.\n *\n * @param {number} value - The float value in the range `[0,1]` to normalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The normalize value.\n */\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * @class\n * @classdesc A collection of math utility functions.\n * @hideconstructor\n */\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\t/**\n\t * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)\n\t * (universally unique identifier).\n\t *\n\t * @static\n\t * @method\n\t * @return {string} The UUID.\n\t */\n\tgenerateUUID: generateUUID,\n\t/**\n\t * Clamps the given value between min and max.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to clamp.\n\t * @param {number} min - The min value.\n\t * @param {number} max - The max value.\n\t * @return {number} The clamped value.\n\t */\n\tclamp: clamp,\n\t/**\n\t * Computes the Euclidean modulo of the given parameters that\n\t * is `( ( n % m ) + m ) % m`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} n - The first parameter.\n\t * @param {number} m - The second parameter.\n\t * @return {number} The Euclidean modulo.\n\t */\n\teuclideanModulo: euclideanModulo,\n\t/**\n\t * Performs a linear mapping from range `` to range ``\n\t * for the given value.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to be mapped.\n\t * @param {number} a1 - Minimum value for range A.\n\t * @param {number} a2 - Maximum value for range A.\n\t * @param {number} b1 - Minimum value for range B.\n\t * @param {number} b2 - Maximum value for range B.\n\t * @return {number} The mapped value.\n\t */\n\tmapLinear: mapLinear,\n\t/**\n\t * Returns the percentage in the closed interval `[0, 1]` of the given value\n\t * between the start and end point.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The start point\n\t * @param {number} y - The end point.\n\t * @param {number} value - A value between start and end.\n\t * @return {number} The interpolation factor.\n\t */\n\tinverseLerp: inverseLerp,\n\t/**\n\t * Returns a value linearly interpolated from two known points based on the given interval -\n\t * `t = 0` will return `x` and `t = 1` will return `y`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The start point\n\t * @param {number} y - The end point.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {number} The interpolated value.\n\t */\n\tlerp: lerp,\n\t/**\n\t * Smoothly interpolate a number from `x` to `y` in a spring-like manner using a delta\n\t * time to maintain frame rate independent movement. For details, see\n\t * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/).\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The current point.\n\t * @param {number} y - The target point.\n\t * @param {number} lambda - A higher lambda value will make the movement more sudden,\n\t * and a lower value will make the movement more gradual.\n\t * @param {number} dt - Delta time in seconds.\n\t * @return {number} The interpolated value.\n\t */\n\tdamp: damp,\n\t/**\n\t * Returns a value that alternates between `0` and the given `length` parameter.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to pingpong.\n\t * @param {number} [length=1] - The positive value the function will pingpong to.\n\t * @return {number} The alternated value.\n\t */\n\tpingpong: pingpong,\n\t/**\n\t * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n\t * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n\t * the `min` and `max`.\n\t *\n\t * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to evaluate based on its position between min and max.\n\t * @param {number} min - The min value. Any x value below min will be `0`.\n\t * @param {number} max - The max value. Any x value above max will be `1`.\n\t * @return {number} The alternated value.\n\t */\n\tsmoothstep: smoothstep,\n\t/**\n\t * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)\n\t * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to evaluate based on its position between min and max.\n\t * @param {number} min - The min value. Any x value below min will be `0`.\n\t * @param {number} max - The max value. Any x value above max will be `1`.\n\t * @return {number} The alternated value.\n\t */\n\tsmootherstep: smootherstep,\n\t/**\n\t * Returns a random integer from `` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} low - The lower value boundary.\n\t * @param {number} high - The upper value boundary\n\t * @return {number} A random integer.\n\t */\n\trandInt: randInt,\n\t/**\n\t * Returns a random float from `` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} low - The lower value boundary.\n\t * @param {number} high - The upper value boundary\n\t * @return {number} A random float.\n\t */\n\trandFloat: randFloat,\n\t/**\n\t * Returns a random integer from `<-range/2, range/2>` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} range - Defines the value range.\n\t * @return {number} A random float.\n\t */\n\trandFloatSpread: randFloatSpread,\n\t/**\n\t * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} [s] - The integer seed.\n\t * @return {number} A random float.\n\t */\n\tseededRandom: seededRandom,\n\t/**\n\t * Converts degrees to radians.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} degrees - A value in degrees.\n\t * @return {number} The converted value in radians.\n\t */\n\tdegToRad: degToRad,\n\t/**\n\t * Converts radians to degrees.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} radians - A value in radians.\n\t * @return {number} The converted value in degrees.\n\t */\n\tradToDeg: radToDeg,\n\t/**\n\t * Returns `true` if the given number is a power of two.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to check.\n\t * @return {boolean} Whether the given number is a power of two or not.\n\t */\n\tisPowerOfTwo: isPowerOfTwo,\n\t/**\n\t * Returns the smallest power of two that is greater than or equal to the given number.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to find a POT for.\n\t * @return {number} The smallest power of two that is greater than or equal to the given number.\n\t */\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\t/**\n\t * Returns the largest power of two that is less than or equal to the given number.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to find a POT for.\n\t * @return {number} The largest power of two that is less than or equal to the given number.\n\t */\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\t/**\n\t * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles)\n\t * defined by the given angles and order.\n\t *\n\t * Rotations are applied to the axes in the order specified by order:\n\t * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n\t *\n\t * @static\n\t * @method\n\t * @param {Quaternion} q - The quaternion to set.\n\t * @param {number} a - The rotation applied to the first axis, in radians.\n\t * @param {number} b - The rotation applied to the second axis, in radians.\n\t * @param {number} c - The rotation applied to the third axis, in radians.\n\t * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n\t */\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\t/**\n\t * Normalizes the given value according to the given typed array.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The float value in the range `[0,1]` to normalize.\n\t * @param {TypedArray} array - The typed array that defines the data type of the value.\n\t * @return {number} The normalize value.\n\t */\n\tnormalize: normalize,\n\t/**\n\t * Denormalizes the given value according to the given typed array.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to denormalize.\n\t * @param {TypedArray} array - The typed array that defines the data type of the value.\n\t * @return {number} The denormalize (float) value in the range `[0,1]`.\n\t */\n\tdenormalize: denormalize\n};\n\n/**\n * Class representing a 2D vector. A 2D vector is an ordered pair of numbers\n * (labeled x and y), which can be used to represent a number of things, such as:\n *\n * - A point in 2D space (i.e. a position on a plane).\n * - A direction and length across a plane. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0)` to `(x, y)`\n * and the direction is also measured from `(0, 0)` towards `(x, y)`.\n * - Any arbitrary ordered pair of numbers.\n *\n * There are other things a 2D vector can be used to represent, such as\n * momentum vectors, complex numbers and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector2( 0, 1 );\n *\n * //no arguments; will be initialised to (0, 0)\n * const b = new THREE.Vector2( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector2 {\n\n\t/**\n\t * Constructs a new 2D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t */\n\tconstructor( x = 0, y = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector2.prototype.isVector2 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#x}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#y}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @param {number} value - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to copy.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector2} v - The vector to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector2} v - The vector to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 as the 3rd component) by\n\t * the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the given vector's x or y\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is less than the given vector's x or y\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the max vector's x or y\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x or y value is less than the min vector's x or y value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector2} min - The minimum x and y values.\n\t * @param {Vector2} max - The maximum x and y values in the desired range.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x or y values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x and y = -y.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the cross product with.\n\t * @return {number} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0) to (x, y). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0) to (x, y).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Computes the angle in radians of this vector with respect to the positive x-axis.\n\t *\n\t * @return {number} The angle in radians.\n\t */\n\tangle() {\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector2} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector2} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector2} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector2} v1 - The first vector.\n\t * @param {Vector2} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector2} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]` and y\n\t * value to be `array[ offset + 1 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this vector around the given center by the given angle.\n\t *\n\t * @param {Vector2} center - The point around which to rotate.\n\t * @param {number} angle - The angle to rotate, in radians.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\n/**\n * Class for representing a Quaternion. Quaternions are used in three.js to represent rotations.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n *\n * Note that three.js expects Quaternions to be normalized.\n * ```js\n * const quaternion = new THREE.Quaternion();\n * quaternion.setFromAxisAngle( new THREE.Vector3( 0, 1, 0 ), Math.PI / 2 );\n *\n * const vector = new THREE.Vector3( 1, 0, 0 );\n * vector.applyQuaternion( quaternion );\n * ```\n */\nclass Quaternion {\n\n\t/**\n\t * Constructs a new quaternion.\n\t *\n\t * @param {number} [x=0] - The x value of this quaternion.\n\t * @param {number} [y=0] - The y value of this quaternion.\n\t * @param {number} [z=0] - The z value of this quaternion.\n\t * @param {number} [w=1] - The w value of this quaternion.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuaternion = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\t/**\n\t * Interpolates between two quaternions via SLERP. This implementation assumes the\n\t * quaternion data are managed in flat arrays.\n\t *\n\t * @param {Array} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array} src1 - The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @param {number} t - The interpolation factor in the range `[0,1]`.\n\t * @see {@link Quaternion#slerp}\n\t */\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tlet x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t <= 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t >= 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet dot = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1;\n\n\t\t\tif ( dot < 0 ) {\n\n\t\t\t\tx1 = - x1;\n\t\t\t\ty1 = - y1;\n\t\t\t\tz1 = - z1;\n\t\t\t\tw1 = - w1;\n\n\t\t\t\tdot = - dot;\n\n\t\t\t}\n\n\t\t\tlet s = 1 - t;\n\n\t\t\tif ( dot < 0.9995 ) {\n\n\t\t\t\t// slerp\n\n\t\t\t\tconst theta = Math.acos( dot );\n\t\t\t\tconst sin = Math.sin( theta );\n\n\t\t\t\ts = Math.sin( s * theta ) / sin;\n\t\t\t\tt = Math.sin( t * theta ) / sin;\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t} else {\n\n\t\t\t\t// for small angles, lerp then normalize\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\t/**\n\t * Multiplies two quaternions. This implementation assumes the quaternion data are managed\n\t * in flat arrays.\n\t *\n\t * @param {Array} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array} src1 - The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @return {Array} The destination array.\n\t * @see {@link Quaternion#multiplyQuaternions}.\n\t */\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\t/**\n\t * The x value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The y value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The z value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The w value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the quaternion components.\n\t *\n\t * @param {number} x - The x value of this quaternion.\n\t * @param {number} y - The y value of this quaternion.\n\t * @param {number} z - The z value of this quaternion.\n\t * @param {number} w - The w value of this quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new quaternion with copied values from this instance.\n\t *\n\t * @return {Quaternion} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given quaternion to this instance.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to copy.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the rotation specified by the given\n\t * Euler angles.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromEuler( euler, update = true ) {\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\twarn( 'Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given axis and angle.\n\t *\n\t * @param {Vector3} axis - The normalized axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the rotation required to rotate the direction vector\n\t * `vFrom` to the direction vector `vTo`.\n\t *\n\t * @param {Vector3} vFrom - The first (normalized) direction vector.\n\t * @param {Vector3} vTo - The second (normalized) direction vector.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < 1e-8 ) { // the epsilon value has been discussed in #31286\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Returns the angle between this quaternion and the given one in radians.\n\t *\n\t * @param {Quaternion} q - The quaternion to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( clamp( this.dot( q ), -1, 1 ) ) );\n\n\t}\n\n\t/**\n\t * Rotates this quaternion by a given angular step to the given quaternion.\n\t * The method ensures that the final quaternion will not overshoot `q`.\n\t *\n\t * @param {Quaternion} q - The target quaternion.\n\t * @param {number} step - The angular step in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the identity quaternion; that is, to the\n\t * quaternion that represents \"no rotation\".\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\t/**\n\t * Inverts this quaternion via {@link Quaternion#conjugate}. The\n\t * quaternion is assumed to have unit length.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tinvert() {\n\n\t\treturn this.conjugate();\n\n\t}\n\n\t/**\n\t * Returns the rotational conjugate of this quaternion. The conjugate of a\n\t * quaternion represents the same rotation in the opposite direction about\n\t * the rotational axis.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tconjugate() {\n\n\t\tthis._x *= -1;\n\t\tthis._y *= -1;\n\t\tthis._z *= -1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of this quaternion and the given one.\n\t *\n\t * @param {Quaternion} v - The quaternion to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\t/**\n\t * Computes the squared Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector. This can be useful if you are comparing the\n\t * lengths of two quaternions, as this is a slightly more efficient calculation than\n\t * {@link Quaternion#length}.\n\t *\n\t * @return {number} The squared Euclidean length.\n\t */\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector.\n\t *\n\t * @return {number} The Euclidean length.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\t/**\n\t * Normalizes this quaternion - that is, calculated the quaternion that performs\n\t * the same rotation as this one, but has a length equal to `1`.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\t/**\n\t * Multiplies the given quaternions and stores the result in this instance.\n\t *\n\t * @param {Quaternion} a - The first quaternion.\n\t * @param {Quaternion} b - The second quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between quaternions.\n\t *\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerp( qb, t ) {\n\n\t\tif ( t <= 0 ) return this;\n\n\t\tif ( t >= 1 ) return this.copy( qb ); // copy calls _onChangeCallback()\n\n\t\tlet x = qb._x, y = qb._y, z = qb._z, w = qb._w;\n\n\t\tlet dot = this.dot( qb );\n\n\t\tif ( dot < 0 ) {\n\n\t\t\tx = - x;\n\t\t\ty = - y;\n\t\t\tz = - z;\n\t\t\tw = - w;\n\n\t\t\tdot = - dot;\n\n\t\t}\n\n\t\tlet s = 1 - t;\n\n\t\tif ( dot < 0.9995 ) {\n\n\t\t\t// slerp\n\n\t\t\tconst theta = Math.acos( dot );\n\t\t\tconst sin = Math.sin( theta );\n\n\t\t\ts = Math.sin( s * theta ) / sin;\n\t\t\tt = Math.sin( t * theta ) / sin;\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis._onChangeCallback();\n\n\t\t} else {\n\n\t\t\t// for small angles, lerp then normalize\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis.normalize(); // normalize calls _onChangeCallback()\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between the given quaternions\n\t * and stores the result in this quaternion.\n\t *\n\t * @param {Quaternion} qa - The source quaternion.\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\t/**\n\t * Sets this quaternion to a uniformly random, normalized quaternion.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trandom() {\n\n\t\t// Ken Shoemake\n\t\t// Uniform random rotations\n\t\t// D. Kirk, editor, Graphics Gems III, pages 124-132. Academic Press, New York, 1992.\n\n\t\tconst theta1 = 2 * Math.PI * Math.random();\n\t\tconst theta2 = 2 * Math.PI * Math.random();\n\n\t\tconst x0 = Math.random();\n\t\tconst r1 = Math.sqrt( 1 - x0 );\n\t\tconst r2 = Math.sqrt( x0 );\n\n\t\treturn this.set(\n\t\t\tr1 * Math.sin( theta1 ),\n\t\t\tr1 * Math.cos( theta1 ),\n\t\t\tr2 * Math.sin( theta2 ),\n\t\t\tr2 * Math.cos( theta2 ),\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if this quaternion is equal with the given one.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to test for equality.\n\t * @return {boolean} Whether this quaternion is equal with the given one.\n\t */\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\t/**\n\t * Sets this quaternion's components from the given array.\n\t *\n\t * @param {Array} array - An array holding the quaternion component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this quaternion to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the quaternion components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The quaternion components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this quaternion from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding quaternion data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the\n\t * numerical elements of this quaternion in an array of format `[x, y, z, w]`.\n\t *\n\t * @return {Array} The serialized quaternion.\n\t */\n\ttoJSON() {\n\n\t\treturn this.toArray();\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\n/**\n * Class representing a 3D vector. A 3D vector is an ordered triplet of numbers\n * (labeled x, y and z), which can be used to represent a number of things, such as:\n *\n * - A point in 3D space.\n * - A direction and length in 3D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0)` to `(x, y, z)`\n * and the direction is also measured from `(0, 0, 0)` towards `(x, y, z)`.\n * - Any arbitrary ordered triplet of numbers.\n *\n * There are other things a 3D vector can be used to represent, such as\n * momentum vectors and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y, z)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector3( 0, 1, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0)\n * const b = new THREE.Vector3( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector3 {\n\n\t/**\n\t * Constructs a new 3D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector3.prototype.isVector3 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @param {number} value - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to copy.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector3} v - The vector to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Euler rotation to this vector.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyEuler( euler ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromEuler( euler ) );\n\n\t}\n\n\t/**\n\t * Applies a rotation specified by an axis and an angle to this vector.\n\t *\n\t * @param {Vector3} axis - A normalized vector representing the rotation axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector by the given normal matrix and normalizes\n\t * the result.\n\t *\n\t * @param {Matrix3} m - The normal matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and\n\t * divides by perspective.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Quaternion to this vector.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t// quaternion q is assumed to have unit length\n\n\t\tconst vx = this.x, vy = this.y, vz = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// t = 2 * cross( q.xyz, v );\n\t\tconst tx = 2 * ( qy * vz - qz * vy );\n\t\tconst ty = 2 * ( qz * vx - qx * vz );\n\t\tconst tz = 2 * ( qx * vy - qy * vx );\n\n\t\t// v + q.w * t + cross( q.xyz, t );\n\t\tthis.x = vx + qw * tx + qy * tz - qz * ty;\n\t\tthis.y = vy + qw * ty + qz * tx - qx * tz;\n\t\tthis.z = vz + qw * tz + qx * ty - qy * tx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector from world space into the camera's normalized\n\t * device coordinate (NDC) space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\t/**\n\t * Unprojects this vector from the camera's normalized device coordinate (NDC)\n\t * space into world space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\t/**\n\t * Transforms the direction of this vector by a matrix (the upper left 3 x 3\n\t * subset of the given 4x4 matrix and then normalizes the result.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector3} v - The vector to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the given vector's x, y or z\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is less than the given vector's x, y or z\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the max vector's x, y or z\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y or z value is less than the min vector's x, y or z value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector3} min - The minimum x, y and z values.\n\t * @param {Vector3} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y or z values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y and z = -z.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0, 0) to (x, y, z).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector3} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector3} v1 - The first vector.\n\t * @param {Vector3} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the cross product with.\n\t * @return {Vector3} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vectors and stores the result\n\t * in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector onto the given one.\n\t *\n\t * @param {Vector3} v - The vector to project to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\t/**\n\t * Projects this vector onto a plane by subtracting this\n\t * vector projected onto the plane's normal from this vector.\n\t *\n\t * @param {Vector3} planeNormal - The plane normal.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector$c.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector$c );\n\n\t}\n\n\t/**\n\t * Reflects this vector off a plane orthogonal to the given normal vector.\n\t *\n\t * @param {Vector3} normal - The (normalized) normal vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\treflect( normal ) {\n\n\t\treturn this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector3} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector3} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {Spherical} s - The spherical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The phi angle in radians.\n\t * @param {number} theta - The theta angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {Cylindrical} c - The cylindrical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle in radians.\n\t * @param {number} y - The y value.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the scale elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given Euler angles.\n\t *\n\t * @param {Euler} e - The Euler angles to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the RGB components of the\n\t * given color.\n\t *\n\t * @param {Color} c - The color to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromColor( c ) {\n\n\t\tthis.x = c.r;\n\t\tthis.y = c.g;\n\t\tthis.z = c.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector3} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`\n\t * and z value to be `array[ offset + 2 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this vector to a uniformly random point on a unit sphere.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandomDirection() {\n\n\t\t// https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst theta = Math.random() * Math.PI * 2;\n\t\tconst u = Math.random() * 2 - 1;\n\t\tconst c = Math.sqrt( 1 - u * u );\n\n\t\tthis.x = c * Math.cos( theta );\n\t\tthis.y = u;\n\t\tthis.z = c * Math.sin( theta );\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nconst _vector$c = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\n\n/**\n * Represents a 3x3 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix();\n * m.set( 11, 12, 13,\n * 21, 22, 23,\n * 31, 32, 33 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31,\n * 12, 22, 32,\n * 13, 23, 33 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix3 {\n\n\t/**\n\t * Constructs a new 3x3 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix3.prototype.isMatrix3 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n21, n22, n23, n31, n32, n33 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 3x3 identity matrix.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix3} m - The matrix to copy.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set this matrix to the upper 3x3 matrix of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 3x3 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix3} a - The first matrix.\n\t * @param {Matrix3} b - The second matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution).\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the normal matrix which is the inverse transpose of the upper\n\t * left 3x3 portion of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\t/**\n\t * Transposes this matrix into the supplied array, and returns itself unchanged.\n\t *\n\t * @param {Array} r - An array to store the transposed matrix elements.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the UV transform matrix from offset, repeat, rotation, and center.\n\t *\n\t * @param {number} tx - Offset x.\n\t * @param {number} ty - Offset y.\n\t * @param {number} sx - Repeat x.\n\t * @param {number} sy - Repeat y.\n\t * @param {number} rotation - Rotation, in radians. Positive values rotate counterclockwise.\n\t * @param {number} cx - Center x of rotation.\n\t * @param {number} cy - Center y of rotation\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this matrix with the given scalar values.\n\t *\n\t * @param {number} sx - The amount to scale in the X axis.\n\t * @param {number} sy - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tscale( sx, sy ) {\n\n\t\tthis.premultiply( _m3.makeScale( sx, sy ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this matrix by the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\trotate( theta ) {\n\n\t\tthis.premultiply( _m3.makeRotation( - theta ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates this matrix by the given scalar values.\n\t *\n\t * @param {number} tx - The amount to translate in the X axis.\n\t * @param {number} ty - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranslate( tx, ty ) {\n\n\t\tthis.premultiply( _m3.makeTranslation( tx, ty ) );\n\n\t\treturn this;\n\n\t}\n\n\t// for 2D Transforms\n\n\t/**\n\t * Sets this matrix as a 2D translation transform.\n\t *\n\t * @param {number|Vector2} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y ) {\n\n\t\tif ( x.isVector2 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x.x,\n\t\t\t\t0, 1, x.y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x,\n\t\t\t\t0, 1, y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D rotational transformation.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeRotation( theta ) {\n\n\t\t// counterclockwise\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0,\n\t\t\ts, c, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D scale transform.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeScale( x, y ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0,\n\t\t\t0, y, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix3} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nconst _m3 = /*@__PURE__*/ new Matrix3();\n\nconst LINEAR_REC709_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.4123908, 0.3575843, 0.1804808,\n\t0.2126390, 0.7151687, 0.0721923,\n\t0.0193308, 0.1191948, 0.9505322\n);\n\nconst XYZ_TO_LINEAR_REC709 = /*@__PURE__*/ new Matrix3().set(\n\t3.2409699, -1.5373832, -0.4986108,\n\t-0.9692436, 1.8759675, 0.0415551,\n\t0.0556301, -0.203977, 1.0569715\n);\n\nfunction createColorManagement() {\n\n\tconst ColorManagement = {\n\n\t\tenabled: true,\n\n\t\tworkingColorSpace: LinearSRGBColorSpace,\n\n\t\t/**\n\t\t * Implementations of supported color spaces.\n\t\t *\n\t\t * Required:\n\t\t *\t- primaries: chromaticity coordinates [ rx ry gx gy bx by ]\n\t\t *\t- whitePoint: reference white [ x y ]\n\t\t *\t- transfer: transfer function (pre-defined)\n\t\t *\t- toXYZ: Matrix3 RGB to XYZ transform\n\t\t *\t- fromXYZ: Matrix3 XYZ to RGB transform\n\t\t *\t- luminanceCoefficients: RGB luminance coefficients\n\t\t *\n\t\t * Optional:\n\t\t * - outputColorSpaceConfig: { drawingBufferColorSpace: ColorSpace, toneMappingMode: 'extended' | 'standard' }\n\t\t * - workingColorSpaceConfig: { unpackColorSpace: ColorSpace }\n\t\t *\n\t\t * Reference:\n\t\t * - https://www.russellcottrell.com/photo/matrixCalculator.htm\n\t\t */\n\t\tspaces: {},\n\n\t\tconvert: function ( color, sourceColorSpace, targetColorSpace ) {\n\n\t\t\tif ( this.enabled === false || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) {\n\n\t\t\t\treturn color;\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = SRGBToLinear( color.r );\n\t\t\t\tcolor.g = SRGBToLinear( color.g );\n\t\t\t\tcolor.b = SRGBToLinear( color.b );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].primaries !== this.spaces[ targetColorSpace ].primaries ) {\n\n\t\t\t\tcolor.applyMatrix3( this.spaces[ sourceColorSpace ].toXYZ );\n\t\t\t\tcolor.applyMatrix3( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ targetColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = LinearToSRGB( color.r );\n\t\t\t\tcolor.g = LinearToSRGB( color.g );\n\t\t\t\tcolor.b = LinearToSRGB( color.b );\n\n\t\t\t}\n\n\t\t\treturn color;\n\n\t\t},\n\n\t\tworkingToColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\treturn this.convert( color, this.workingColorSpace, targetColorSpace );\n\n\t\t},\n\n\t\tcolorSpaceToWorking: function ( color, sourceColorSpace ) {\n\n\t\t\treturn this.convert( color, sourceColorSpace, this.workingColorSpace );\n\n\t\t},\n\n\t\tgetPrimaries: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].primaries;\n\n\t\t},\n\n\t\tgetTransfer: function ( colorSpace ) {\n\n\t\t\tif ( colorSpace === NoColorSpace ) return LinearTransfer;\n\n\t\t\treturn this.spaces[ colorSpace ].transfer;\n\n\t\t},\n\n\t\tgetToneMappingMode: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.toneMappingMode || 'standard';\n\n\t\t},\n\n\t\tgetLuminanceCoefficients: function ( target, colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn target.fromArray( this.spaces[ colorSpace ].luminanceCoefficients );\n\n\t\t},\n\n\t\tdefine: function ( colorSpaces ) {\n\n\t\t\tObject.assign( this.spaces, colorSpaces );\n\n\t\t},\n\n\t\t// Internal APIs\n\n\t\t_getMatrix: function ( targetMatrix, sourceColorSpace, targetColorSpace ) {\n\n\t\t\treturn targetMatrix\n\t\t\t\t.copy( this.spaces[ sourceColorSpace ].toXYZ )\n\t\t\t\t.multiply( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t},\n\n\t\t_getDrawingBufferColorSpace: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.drawingBufferColorSpace;\n\n\t\t},\n\n\t\t_getUnpackColorSpace: function ( colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].workingColorSpaceConfig.unpackColorSpace;\n\n\t\t},\n\n\t\t// Deprecated\n\n\t\tfromWorkingColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\twarnOnce( 'ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace().' ); // @deprecated, r177\n\n\t\t\treturn ColorManagement.workingToColorSpace( color, targetColorSpace );\n\n\t\t},\n\n\t\ttoWorkingColorSpace: function ( color, sourceColorSpace ) {\n\n\t\t\twarnOnce( 'ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking().' ); // @deprecated, r177\n\n\t\t\treturn ColorManagement.colorSpaceToWorking( color, sourceColorSpace );\n\n\t\t},\n\n\t};\n\n\t/******************************************************************************\n\t * sRGB definitions\n\t */\n\n\tconst REC709_PRIMARIES = [ 0.640, 0.330, 0.300, 0.600, 0.150, 0.060 ];\n\tconst REC709_LUMINANCE_COEFFICIENTS = [ 0.2126, 0.7152, 0.0722 ];\n\tconst D65 = [ 0.3127, 0.3290 ];\n\n\tColorManagement.define( {\n\n\t\t[ LinearSRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: LinearTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\tworkingColorSpaceConfig: { unpackColorSpace: SRGBColorSpace },\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t\t[ SRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: SRGBTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t} );\n\n\treturn ColorManagement;\n\n}\n\nconst ColorManagement = /*@__PURE__*/ createColorManagement();\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nlet _canvas;\n\n/**\n * A class containing utility functions for images.\n *\n * @hideconstructor\n */\nclass ImageUtils {\n\n\t/**\n\t * Returns a data URI containing a representation of the given image.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement)} image - The image object.\n\t * @param {string} [type='image/png'] - Indicates the image format.\n\t * @return {string} The data URI.\n\t */\n\tstatic getDataURL( image, type = 'image/png' ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement === 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\treturn canvas.toDataURL( type );\n\n\t}\n\n\t/**\n\t * Converts the given sRGB image data to linear color space.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement|ImageBitmap|Object)} image - The image object.\n\t * @return {HTMLCanvasElement|Object} The converted image.\n\t */\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\twarn( 'ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nlet _sourceId = 0;\n\n/**\n * Represents the data source of a texture.\n *\n * The main purpose of this class is to decouple the data definition from the texture\n * definition so the same data can be used with multiple texture instances.\n */\nclass Source {\n\n\t/**\n\t * Constructs a new video texture.\n\t *\n\t * @param {any} [data=null] - The data definition of a texture.\n\t */\n\tconstructor( data = null ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSource = true;\n\n\t\t/**\n\t\t * The ID of the source.\n\t\t *\n\t\t * @name Source#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _sourceId ++ } );\n\n\t\t/**\n\t\t * The UUID of the source.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The data definition of a texture.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.data = data;\n\n\t\t/**\n\t\t * This property is only relevant when {@link Source#needsUpdate} is set to `true` and\n\t\t * provides more control on how texture data should be processed. When `dataReady` is set\n\t\t * to `false`, the engine performs the memory allocation (if necessary) but does not transfer\n\t\t * the data into the GPU memory.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.dataReady = true;\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Source#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Returns the dimensions of the source into the given target vector.\n\t *\n\t * @param {(Vector2|Vector3)} target - The target object the result is written into.\n\t * @return {(Vector2|Vector3)} The dimensions of the source.\n\t */\n\tgetSize( target ) {\n\n\t\tconst data = this.data;\n\n\t\tif ( ( typeof HTMLVideoElement !== 'undefined' ) && ( data instanceof HTMLVideoElement ) ) {\n\n\t\t\ttarget.set( data.videoWidth, data.videoHeight, 0 );\n\n\t\t} else if ( data instanceof VideoFrame ) {\n\n\t\t\ttarget.set( data.displayHeight, data.displayWidth, 0 );\n\n\t\t} else if ( data !== null ) {\n\n\t\t\ttarget.set( data.width, data.height, data.depth || 0 );\n\n\t\t} else {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * When the property is set to `true`, the engine allocates the memory\n\t * for the texture (if necessary) and triggers the actual texture upload\n\t * to the GPU next time the source is used.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Serializes the source into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized source.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.images[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\t\t\tuuid: this.uuid,\n\t\t\turl: ''\n\t\t};\n\n\t\tconst data = this.data;\n\n\t\tif ( data !== null ) {\n\n\t\t\tlet url;\n\n\t\t\tif ( Array.isArray( data ) ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\turl = [];\n\n\t\t\t\tfor ( let i = 0, l = data.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( data[ i ].isDataTexture ) {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ].image ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// texture\n\n\t\t\t\turl = serializeImage( data );\n\n\t\t\t}\n\n\t\t\toutput.url = url;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.images[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.from( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\twarn( 'Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nlet _textureId = 0;\n\nconst _tempVec3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Base class for all textures.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments EventDispatcher\n */\nclass Texture extends EventDispatcher {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {?Object} [image=Texture.DEFAULT_IMAGE] - The image holding the texture data.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = Texture.DEFAULT_ANISOTROPY, colorSpace = NoColorSpace ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isTexture = true;\n\n\t\t/**\n\t\t * The ID of the texture.\n\t\t *\n\t\t * @name Texture#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _textureId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The data definition of a texture. A reference to the data source can be\n\t\t * shared across textures. This is often useful in context of spritesheets\n\t\t * where multiple textures render the same data but with different texture\n\t\t * transformations.\n\t\t *\n\t\t * @type {Source}\n\t\t */\n\t\tthis.source = new Source( image );\n\n\t\t/**\n\t\t * An array holding user-defined mipmaps.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.mipmaps = [];\n\n\t\t/**\n\t\t * How the texture is applied to the object. The value `UVMapping`\n\t\t * is the default, where texture or uv coordinates are used to apply the map.\n\t\t *\n\t\t * @type {(UVMapping|CubeReflectionMapping|CubeRefractionMapping|EquirectangularReflectionMapping|EquirectangularRefractionMapping|CubeUVReflectionMapping)}\n\t\t * @default UVMapping\n\t\t*/\n\t\tthis.mapping = mapping;\n\n\t\t/**\n\t\t * Lets you select the uv attribute to map the texture to. `0` for `uv`,\n\t\t * `1` for `uv1`, `2` for `uv2` and `3` for `uv3`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.channel = 0;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *U* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapS = wrapS;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *V* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapT = wrapT;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearFilter\n\t\t */\n\t\tthis.magFilter = magFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearMipmapLinearFilter\n\t\t */\n\t\tthis.minFilter = minFilter;\n\n\t\t/**\n\t\t * The number of samples taken along the axis through the pixel that has the\n\t\t * highest density of texels. By default, this value is `1`. A higher value\n\t\t * gives a less blurry result than a basic mipmap, at the cost of more\n\t\t * texture samples being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.anisotropy = anisotropy;\n\n\t\t/**\n\t\t * The format of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default RGBAFormat\n\t\t */\n\t\tthis.format = format;\n\n\t\t/**\n\t\t * The default internal format is derived from {@link Texture#format} and {@link Texture#type} and\n\t\t * defines how the texture data is going to be stored on the GPU.\n\t\t *\n\t\t * This property allows to overwrite the default format.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.internalFormat = null;\n\n\t\t/**\n\t\t * The data type of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * How much a single repetition of the texture is offset from the beginning,\n\t\t * in each direction U and V. Typical range is `0.0` to `1.0`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.offset = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How many times the texture is repeated across the surface, in each\n\t\t * direction U and V. If repeat is set greater than `1` in either direction,\n\t\t * the corresponding wrap parameter should also be set to `RepeatWrapping`\n\t\t * or `MirroredRepeatWrapping` to achieve the desired tiling effect.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The point around which rotation occurs. A value of `(0.5, 0.5)` corresponds\n\t\t * to the center of the texture. Default is `(0, 0)`, the lower left.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.center = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How much the texture is rotated around the center point, in radians.\n\t\t * Positive values are counter-clockwise.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Whether to update the texture's uv-transformation {@link Texture#matrix}\n\t\t * from the properties {@link Texture#offset}, {@link Texture#repeat},\n\t\t * {@link Texture#rotation}, and {@link Texture#center}.\n\t\t *\n\t\t * Set this to `false` if you are specifying the uv-transform matrix directly.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = true;\n\n\t\t/**\n\t\t * The uv-transformation matrix of the texture.\n\t\t *\n\t\t * @type {Matrix3}\n\t\t */\n\t\tthis.matrix = new Matrix3();\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Set this to `false` if you are creating mipmaps manually.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.generateMipmaps = true;\n\n\t\t/**\n\t\t * If set to `true`, the alpha channel, if present, is multiplied into the\n\t\t * color channels when the texture is uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure premultiply alpha on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultiplyAlpha = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure the flip on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.flipY = true;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t * The allowable values are `1` (byte-alignment), `2` (rows aligned to even-numbered bytes),\n\t\t * `4` (word-alignment), and `8` (rows start on double-word boundaries).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 4\n\t\t */\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t/**\n\t\t * Textures containing color data should be annotated with `SRGBColorSpace` or `LinearSRGBColorSpace`.\n\t\t *\n\t\t * @type {string}\n\t\t * @default NoColorSpace\n\t\t */\n\t\tthis.colorSpace = colorSpace;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the texture. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This can be used to only update a subregion or specific rows of the texture (for example, just the\n\t\t * first 3 rows). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Texture#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * A callback function, called when the texture is updated (e.g., when\n\t\t * {@link Texture#needsUpdate} has been set to true and then the texture is used).\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.onUpdate = null;\n\n\t\t/**\n\t\t * An optional back reference to the textures render target.\n\t\t *\n\t\t * @type {?(RenderTarget|WebGLRenderTarget)}\n\t\t * @default null\n\t\t */\n\t\tthis.renderTarget = null;\n\n\t\t/**\n\t\t * Indicates whether a texture belongs to a render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isRenderTargetTexture = false;\n\n\t\t/**\n\t\t * Indicates if a texture should be handled like a texture array.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isArrayTexture = image && image.depth && image.depth > 1 ? true : false;\n\n\t\t/**\n\t\t * Indicates whether this texture should be processed by `PMREMGenerator` or not\n\t\t * (only relevant for render target textures).\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.pmremVersion = 0;\n\n\t}\n\n\t/**\n\t * The width of the texture in pixels.\n\t */\n\tget width() {\n\n\t\treturn this.source.getSize( _tempVec3 ).x;\n\n\t}\n\n\t/**\n\t * The height of the texture in pixels.\n\t */\n\tget height() {\n\n\t\treturn this.source.getSize( _tempVec3 ).y;\n\n\t}\n\n\t/**\n\t * The depth of the texture in pixels.\n\t */\n\tget depth() {\n\n\t\treturn this.source.getSize( _tempVec3 ).z;\n\n\t}\n\n\t/**\n\t * The image object holding the texture data.\n\t *\n\t * @type {?Object}\n\t */\n\tget image() {\n\n\t\treturn this.source.data;\n\n\t}\n\n\tset image( value = null ) {\n\n\t\tthis.source.data = value;\n\n\t}\n\n\t/**\n\t * Updates the texture transformation matrix from the from the properties {@link Texture#offset},\n\t * {@link Texture#repeat}, {@link Texture#rotation}, and {@link Texture#center}.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data texture to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Returns a new texture with copied values from this instance.\n\t *\n\t * @return {Texture} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given texture to this instance.\n\t *\n\t * @param {Texture} source - The texture to copy.\n\t * @return {Texture} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.source = source.source;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\t\tthis.channel = source.channel;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.colorSpace = source.colorSpace;\n\n\t\tthis.renderTarget = source.renderTarget;\n\t\tthis.isRenderTargetTexture = source.isRenderTargetTexture;\n\t\tthis.isArrayTexture = source.isArrayTexture;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this texture's properties based on `values`.\n\t * @param {Object} values - A container with texture parameters.\n\t */\n\tsetValues( values ) {\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\twarn( `Texture.setValues(): parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\twarn( `Texture.setValues(): property '${ key }' does not exist.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( ( currentValue && newValue ) && ( currentValue.isVector2 && newValue.isVector2 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( ( currentValue && newValue ) && ( currentValue.isVector3 && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( ( currentValue && newValue ) && ( currentValue.isMatrix3 && newValue.isMatrix3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the texture into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized texture.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\timage: this.source.toJSON( meta ).uuid,\n\n\t\t\tmapping: this.mapping,\n\t\t\tchannel: this.channel,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\tinternalFormat: this.internalFormat,\n\t\t\ttype: this.type,\n\t\t\tcolorSpace: this.colorSpace,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tgenerateMipmaps: this.generateMipmaps,\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the texture has been disposed of.\n\t\t *\n\t\t * @event Texture#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Transforms the given uv vector with the textures uv transformation matrix.\n\t *\n\t * @param {Vector2} uv - The uv vector.\n\t * @return {Vector2} The transformed uv vector.\n\t */\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the texture\n\t * must be updated in the next render. This triggers a texture upload\n\t * to the GPU and ensures correct texture parameter configuration.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.source.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the PMREM\n\t * must be regenerated.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsPMREMUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.pmremVersion ++;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * The default image for all textures.\n *\n * @static\n * @type {?Image}\n * @default null\n */\nTexture.DEFAULT_IMAGE = null;\n\n/**\n * The default mapping for all textures.\n *\n * @static\n * @type {number}\n * @default UVMapping\n */\nTexture.DEFAULT_MAPPING = UVMapping;\n\n/**\n * The default anisotropy value for all textures.\n *\n * @static\n * @type {number}\n * @default 1\n */\nTexture.DEFAULT_ANISOTROPY = 1;\n\n/**\n * Class representing a 4D vector. A 4D vector is an ordered quadruplet of numbers\n * (labeled x, y, z and w), which can be used to represent a number of things, such as:\n *\n * - A point in 4D space.\n * - A direction and length in 4D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0, 0)` to `(x, y, z, w)`\n * and the direction is also measured from `(0, 0, 0, 0)` towards `(x, y, z, w)`.\n * - Any arbitrary ordered quadruplet of numbers.\n *\n * There are other things a 4D vector can be used to represent, however these\n * are the most common uses in *three.js*.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector4( 0, 1, 0, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0, 1)\n * const b = new THREE.Vector4( );\n *\n * const d = a.dot( b );\n * ```\n */\nclass Vector4 {\n\n\t/**\n\t * Constructs a new 4D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t * @param {number} [w=1] - The w value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector4.prototype.isVector4 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t\t/**\n\t\t * The w value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.w = w;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#z}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#w}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @param {number} w - The value of the w component.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's w component to the given value\n\t *\n\t * @param {number} w - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @param {number} value - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector to copy.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector4} v - The vector to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector4} v - The vector to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector4} v - The vector to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\t\tthis.w /= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the quaternion's axis and w to the angle.\n\t *\n\t * @param {Quaternion} q - The Quaternion to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the axis of rotation and w to the angle.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper left 3x3 matrix is a pure rotation matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\t\tthis.w = e[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is less than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the max vector's x, y, z or w\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y, z or w value is less than the min vector's x, y, z or w value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector4} min - The minimum x, y and z values.\n\t * @param {Vector4} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\t\tthis.w = clamp( this.w, min.w, max.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y, z or w values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\t\tthis.w = clamp( this.w, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\t\tthis.w = Math.trunc( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y, z = -z, w = -w.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0, 0) to (x, y, z, w). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector4} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector4} v1 - The first vector.\n\t * @param {Vector4} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector4} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`,\n\t * z value to be `array[ offset + 2 ]`, w value to be `array[ offset + 3 ]`.\n\t *\n\t * @param {Array} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\n/**\n * A render target is a buffer where the video card draws pixels for a scene\n * that is being rendered in the background. It is used in different effects,\n * such as applying postprocessing to a rendered image before displaying it\n * on the screen.\n *\n * @augments EventDispatcher\n */\nclass RenderTarget extends EventDispatcher {\n\n\t/**\n\t * Render target options.\n\t *\n\t * @typedef {Object} RenderTarget~Options\n\t * @property {boolean} [generateMipmaps=false] - Whether to generate mipmaps or not.\n\t * @property {number} [magFilter=LinearFilter] - The mag filter.\n\t * @property {number} [minFilter=LinearFilter] - The min filter.\n\t * @property {number} [format=RGBAFormat] - The texture format.\n\t * @property {number} [type=UnsignedByteType] - The texture type.\n\t * @property {?string} [internalFormat=null] - The texture's internal format.\n\t * @property {number} [wrapS=ClampToEdgeWrapping] - The texture's uv wrapping mode.\n\t * @property {number} [wrapT=ClampToEdgeWrapping] - The texture's uv wrapping mode.\n\t * @property {number} [anisotropy=1] - The texture's anisotropy value.\n\t * @property {string} [colorSpace=NoColorSpace] - The texture's color space.\n\t * @property {boolean} [depthBuffer=true] - Whether to allocate a depth buffer or not.\n\t * @property {boolean} [stencilBuffer=false] - Whether to allocate a stencil buffer or not.\n\t * @property {boolean} [resolveDepthBuffer=true] - Whether to resolve the depth buffer or not.\n\t * @property {boolean} [resolveStencilBuffer=true] - Whether to resolve the stencil buffer or not.\n\t * @property {?Texture} [depthTexture=null] - Reference to a depth texture.\n\t * @property {number} [samples=0] - The MSAA samples count.\n\t * @property {number} [count=1] - Defines the number of color attachments . Must be at least `1`.\n\t * @property {number} [depth=1] - The texture depth.\n\t * @property {boolean} [multiview=false] - Whether this target is used for multiview rendering.\n\t */\n\n\t/**\n\t * Constructs a new render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper();\n\n\t\toptions = Object.assign( {\n\t\t\tgenerateMipmaps: false,\n\t\t\tinternalFormat: null,\n\t\t\tminFilter: LinearFilter,\n\t\t\tdepthBuffer: true,\n\t\t\tstencilBuffer: false,\n\t\t\tresolveDepthBuffer: true,\n\t\t\tresolveStencilBuffer: true,\n\t\t\tdepthTexture: null,\n\t\t\tsamples: 0,\n\t\t\tcount: 1,\n\t\t\tdepth: 1,\n\t\t\tmultiview: false\n\t\t}, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderTarget = true;\n\n\t\t/**\n\t\t * The width of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.height = height;\n\n\t\t/**\n\t\t * The depth of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.depth = options.depth;\n\n\t\t/**\n\t\t * A rectangular area inside the render target's viewport. Fragments that are\n\t\t * outside the area will be discarded.\n\t\t *\n\t\t * @type {Vector4}\n\t\t * @default (0,0,width,height)\n\t\t */\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\n\t\t/**\n\t\t * Indicates whether the scissor test should be enabled when rendering into\n\t\t * this render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.scissorTest = false;\n\n\t\t/**\n\t\t * A rectangular area representing the render target's viewport.\n\t\t *\n\t\t * @type {Vector4}\n\t\t * @default (0,0,width,height)\n\t\t */\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tconst image = { width: width, height: height, depth: options.depth };\n\n\t\tconst texture = new Texture( image );\n\n\t\t/**\n\t\t * An array of textures. Each color attachment is represented as a separate texture.\n\t\t * Has at least a single entry for the default color attachment.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.textures = [];\n\n\t\tconst count = options.count;\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.textures[ i ] = texture.clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t}\n\n\t\tthis._setTextureOptions( options );\n\n\t\t/**\n\t\t * Whether to allocate a depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthBuffer = options.depthBuffer;\n\n\t\t/**\n\t\t * Whether to allocate a stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilBuffer = options.stencilBuffer;\n\n\t\t/**\n\t\t * Whether to resolve the depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resolveDepthBuffer = options.resolveDepthBuffer;\n\n\t\t/**\n\t\t * Whether to resolve the stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resolveStencilBuffer = options.resolveStencilBuffer;\n\n\t\tthis._depthTexture = null;\n\t\tthis.depthTexture = options.depthTexture;\n\n\t\t/**\n\t\t * The number of MSAA samples.\n\t\t *\n\t\t * A value of `0` disables MSAA.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.samples = options.samples;\n\n\t\t/**\n\t\t * Whether to this target is used in multiview rendering.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.multiview = options.multiview;\n\n\t}\n\n\t_setTextureOptions( options = {} ) {\n\n\t\tconst values = {\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\tflipY: false,\n\t\t\tinternalFormat: null\n\t\t};\n\n\t\tif ( options.mapping !== undefined ) values.mapping = options.mapping;\n\t\tif ( options.wrapS !== undefined ) values.wrapS = options.wrapS;\n\t\tif ( options.wrapT !== undefined ) values.wrapT = options.wrapT;\n\t\tif ( options.wrapR !== undefined ) values.wrapR = options.wrapR;\n\t\tif ( options.magFilter !== undefined ) values.magFilter = options.magFilter;\n\t\tif ( options.minFilter !== undefined ) values.minFilter = options.minFilter;\n\t\tif ( options.format !== undefined ) values.format = options.format;\n\t\tif ( options.type !== undefined ) values.type = options.type;\n\t\tif ( options.anisotropy !== undefined ) values.anisotropy = options.anisotropy;\n\t\tif ( options.colorSpace !== undefined ) values.colorSpace = options.colorSpace;\n\t\tif ( options.flipY !== undefined ) values.flipY = options.flipY;\n\t\tif ( options.generateMipmaps !== undefined ) values.generateMipmaps = options.generateMipmaps;\n\t\tif ( options.internalFormat !== undefined ) values.internalFormat = options.internalFormat;\n\n\t\tfor ( let i = 0; i < this.textures.length; i ++ ) {\n\n\t\t\tconst texture = this.textures[ i ];\n\t\t\ttexture.setValues( values );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The texture representing the default color attachment.\n\t *\n\t * @type {Texture}\n\t */\n\tget texture() {\n\n\t\treturn this.textures[ 0 ];\n\n\t}\n\n\tset texture( value ) {\n\n\t\tthis.textures[ 0 ] = value;\n\n\t}\n\n\tset depthTexture( current ) {\n\n\t\tif ( this._depthTexture !== null ) this._depthTexture.renderTarget = null;\n\t\tif ( current !== null ) current.renderTarget = this;\n\n\t\tthis._depthTexture = current;\n\n\t}\n\n\t/**\n\t * Instead of saving the depth in a renderbuffer, a texture\n\t * can be used instead which is useful for further processing\n\t * e.g. in context of post-processing.\n\t *\n\t * @type {?DepthTexture}\n\t * @default null\n\t */\n\tget depthTexture() {\n\n\t\treturn this._depthTexture;\n\n\t}\n\n\t/**\n\t * Sets the size of this render target.\n\t *\n\t * @param {number} width - The width.\n\t * @param {number} height - The height.\n\t * @param {number} [depth=1] - The depth.\n\t */\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tfor ( let i = 0, il = this.textures.length; i < il; i ++ ) {\n\n\t\t\t\tthis.textures[ i ].image.width = width;\n\t\t\t\tthis.textures[ i ].image.height = height;\n\t\t\t\tthis.textures[ i ].image.depth = depth;\n\n\t\t\t\tif ( this.textures[ i ].isData3DTexture !== true ) { // Fix for #31693\n\n\t\t\t\t\t// TODO: Reconsider setting isArrayTexture flag here and in the ctor of Texture.\n\t\t\t\t\t// Maybe a method `isArrayTexture()` or just a getter could replace a flag since\n\t\t\t\t\t// both are evaluated on each call?\n\n\t\t\t\t\tthis.textures[ i ].isArrayTexture = this.textures[ i ].image.depth > 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\t/**\n\t * Returns a new render target with copied values from this instance.\n\t *\n\t * @return {RenderTarget} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the settings of the given render target. This is a structural copy so\n\t * no resources are shared between render targets after the copy. That includes\n\t * all MRT textures and the depth texture.\n\t *\n\t * @param {RenderTarget} source - The render target to copy.\n\t * @return {RenderTarget} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.scissor.copy( source.scissor );\n\t\tthis.scissorTest = source.scissorTest;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.textures.length = 0;\n\n\t\tfor ( let i = 0, il = source.textures.length; i < il; i ++ ) {\n\n\t\t\tthis.textures[ i ] = source.textures[ i ].clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t\t// ensure image object is not shared, see #20328\n\n\t\t\tconst image = Object.assign( {}, source.textures[ i ].image );\n\t\t\tthis.textures[ i ].source = new Source( image );\n\n\t\t}\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tthis.resolveDepthBuffer = source.resolveDepthBuffer;\n\t\tthis.resolveStencilBuffer = source.resolveStencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires RenderTarget#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\n/**\n * A render target used in context of {@link WebGLRenderer}.\n *\n * @augments RenderTarget\n */\nclass WebGLRenderTarget extends RenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLRenderTarget = true;\n\n\t}\n\n}\n\n/**\n * Creates an array of textures directly from raw buffer data.\n *\n * @augments Texture\n */\nclass DataArrayTexture extends Texture {\n\n\t/**\n\t * Constructs a new data array texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDataArrayTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image = { data, width, height, depth };\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t *\n\t\t * @type {Set}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\t/**\n\t * Describes that a specific layer of the texture needs to be updated.\n\t * Normally when {@link Texture#needsUpdate} is set to `true`, the\n\t * entire data texture array is sent to the GPU. Marking specific\n\t * layers will only transmit subsets of all mipmaps associated with a\n\t * specific depth in the array which is often much more performant.\n\t *\n\t * @param {number} layerIndex - The layer index that should be updated.\n\t */\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\t/**\n\t * Resets the layer updates registry.\n\t */\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\n/**\n * An array render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGLArrayRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new array render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLArrayRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {DataArrayTexture}\n\t\t */\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Creates a three-dimensional texture from raw data, with parameters to\n * divide it into width, height, and depth.\n *\n * @augments Texture\n */\nclass Data3DTexture extends Texture {\n\n\t/**\n\t * Constructs a new data array texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in Data3DTexture directly.\n\t\t//\n\t\t//\tconst texture = new THREE.Data3DTexture( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isData3DTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image = { data, width, height, depth };\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\n/**\n * A 3D render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGL3DRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGL3DRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {Data3DTexture}\n\t\t */\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 3D space.\n */\nclass Box3 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector3} [min=(Infinity,Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector3} [max=(-Infinity,-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox3 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector3} min - The lower boundary of the box.\n\t * @param {Vector3} max - The upper boundary of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} array - An array holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromArray( array ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromArray( array, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromBufferAttribute( attribute, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} points - An array holding 3D position data as instances of {@link Vector3}.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector3} center - The center of the box.\n\t * @param {Vector3} size - The x, y and z dimensions of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the world-axis-aligned bounding box for the given 3D object\n\t * (including its children), accounting for the object's, and children's,\n\t * world transforms. The function may result in a larger box than strictly necessary.\n\t *\n\t * @param {Object3D} object - The 3D object to compute the bounding box for.\n\t * @param {boolean} [precise=false] - If set to `true`, the method computes the smallest\n\t * world-axis-aligned bounding box at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box3} box - The box to copy.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector3} point - The point that should be included by the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions. The depth of this box will be\n\t * expanded by the z component of the vector in both directions.\n\t *\n\t * @param {Vector3} vector - The vector that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given 3D object and\n\t * its children, accounting for the object's, and children's, world\n\t * transforms. The function may result in a larger box than strictly\n\t * necessary (unless the precise parameter is set to true).\n\t *\n\t * @param {Object3D} object - The 3D object that should expand the bounding box.\n\t * @param {boolean} precise - If set to `true`, the method expands the bounding box\n\t * as little as necessary at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\t// precise AABB computation based on vertex data requires at least a position attribute.\n\t\t\t// instancing isn't supported so far and uses the normal (conservative) code path.\n\n\t\t\tif ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) {\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tif ( object.isMesh === true ) {\n\n\t\t\t\t\t\tobject.getVertexPosition( i, _vector$b );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_vector$b.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_vector$b.applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector$b );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( object.boundingBox !== undefined ) {\n\n\t\t\t\t\t// object-level bounding box\n\n\t\t\t\t\tif ( object.boundingBox === null ) {\n\n\t\t\t\t\t\tobject.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( object.boundingBox );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// geometry-level bounding box\n\n\t\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( geometry.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\t_box$4.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box$4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y &&\n\t\t\tpoint.z >= this.min.z && point.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width, height and depth.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A point as a proportion of this box's width, height and depth.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y &&\n\t\t\tbox.max.z >= this.min.z && box.min.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with this bounding box.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with this bounding box.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$b );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given plane intersects with this bounding box.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether the given plane intersects with this bounding box.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given triangle intersects with this bounding box.\n\t *\n\t * @param {Triangle} triangle - The triangle to test.\n\t * @return {boolean} Whether the given triangle intersects with this bounding box.\n\t */\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$2.subVectors( triangle.a, _center );\n\t\t_v1$7.subVectors( triangle.b, _center );\n\t\t_v2$4.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$7, _v0$2 );\n\t\t_f1.subVectors( _v2$4, _v1$7 );\n\t\t_f2.subVectors( _v0$2, _v2$4 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents );\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector3} point - The point to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$b ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Returns a bounding sphere that encloses this bounding box.\n\t *\n\t * @param {Sphere} target - The target sphere that is used to store the method's result.\n\t * @return {Sphere} The bounding sphere that encloses this bounding box.\n\t */\n\tgetBoundingSphere( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\ttarget.makeEmpty();\n\n\t\t} else {\n\n\t\t\tthis.getCenter( target.center );\n\n\t\t\ttarget.radius = this.getSize( _vector$b ).length() * 0.5;\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box3} box - The bounding box to intersect with.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box3} box - The bounding box that will be unioned with this instance.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this bounding box by the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 3D space.\n\t *\n\t * @param {Vector3} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box3} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding box.\n\t *\n\t * @return {Object} Serialized structure with fields representing the object state.\n\t */\n\ttoJSON() {\n\n\t\treturn {\n\t\t\tmin: this.min.toArray(),\n\t\t\tmax: this.max.toArray()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding box.\n\t *\n\t * @param {Object} json - The serialized json to set the box from.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.min.fromArray( json.min );\n\t\tthis.max.fromArray( json.max );\n\t\treturn this;\n\n\t}\n\n}\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\n\nconst _box$4 = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0$2 = /*@__PURE__*/ new Vector3();\nconst _v1$7 = /*@__PURE__*/ new Vector3();\nconst _v2$4 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$3 = /*@__PURE__*/ new Box3();\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical 3D sphere defined by a center and radius. This class is mainly\n * used as a Bounding Sphere for 3D objects.\n */\nclass Sphere {\n\n\t/**\n\t * Constructs a new sphere.\n\t *\n\t * @param {Vector3} [center=(0,0,0)] - The center of the sphere\n\t * @param {number} [radius=-1] - The radius of the sphere.\n\t */\n\tconstructor( center = new Vector3(), radius = -1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphere = true;\n\n\t\t/**\n\t\t * The center of the sphere\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.center = center;\n\n\t\t/**\n\t\t * The radius of the sphere.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.radius = radius;\n\n\t}\n\n\t/**\n\t * Sets the sphere's components by copying the given values.\n\t *\n\t * @param {Vector3} center - The center.\n\t * @param {number} radius - The radius.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the minimum bounding sphere for list of points.\n\t * If the optional center point is given, it is used as the sphere's\n\t * center. Otherwise, the center of the axis-aligned bounding box\n\t * encompassing the points is calculated.\n\t *\n\t * @param {Array} points - A list of points in 3D space.\n\t * @param {Vector3} [optionalCenter] - The center of the sphere.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$3.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given sphere to this instance.\n\t *\n\t * @param {Sphere} sphere - The sphere to copy.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the sphere is empty (the radius set to a negative number).\n\t *\n\t * Spheres with a radius of `0` contain only their center point and are not\n\t * considered to be empty.\n\t *\n\t * @return {boolean} Whether this sphere is empty or not.\n\t */\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\t/**\n\t * Makes this sphere empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = -1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere contains the given point inclusive of\n\t * the surface of the sphere.\n\t *\n\t * @param {Vector3} point - The point to check.\n\t * @return {boolean} Whether this sphere contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\t/**\n\t * Returns the closest distance from the boundary of the sphere to the\n\t * given point. If the sphere contains the point, the distance will\n\t * be negative.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The distance to the point.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test.\n\t * @return {boolean} Whether this sphere intersects with the given one or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to test.\n\t * @return {boolean} Whether this sphere intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether this sphere intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\t/**\n\t * Clamps a point within the sphere. If the point is outside the sphere, it\n\t * will clamp it to the closest point on the edge of the sphere. Points\n\t * already inside the sphere will not be affected.\n\t *\n\t * @param {Vector3} point - The plane to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a bounding box that encloses this sphere.\n\t *\n\t * @param {Box3} target - The target box that is used to store the method's result.\n\t * @return {Box3} The bounding box that encloses this sphere.\n\t */\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Transforms this sphere with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the sphere's center by the given offset.\n\t *\n\t * @param {Vector3} offset - The offset.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this sphere to include the given point.\n\t *\n\t * @param {Vector3} point - The point to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\texpandByPoint( point ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.center.copy( point );\n\n\t\t\tthis.radius = 0;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t_v1$6.subVectors( point, this.center );\n\n\t\tconst lengthSq = _v1$6.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t// calculate the minimal sphere\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\n\t\t\tconst delta = ( length - this.radius ) * 0.5;\n\n\t\t\tthis.center.addScaledVector( _v1$6, delta / length );\n\n\t\t\tthis.radius += delta;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this sphere to enclose both the original sphere and the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tunion( sphere ) {\n\n\t\tif ( sphere.isEmpty() ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.copy( sphere );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t this.radius = Math.max( this.radius, sphere.radius );\n\n\t\t} else {\n\n\t\t\t_v2$3.subVectors( sphere.center, this.center ).setLength( sphere.radius );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).add( _v2$3 ) );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).sub( _v2$3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere is equal with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test for equality.\n\t * @return {boolean} Whether this bounding sphere is equal with the given one.\n\t */\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\t/**\n\t * Returns a new sphere with copied values from this instance.\n\t *\n\t * @return {Sphere} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding sphere.\n\t *\n\t * @return {Object} Serialized structure with fields representing the object state.\n\t */\n\ttoJSON() {\n\n\t\treturn {\n\t\t\tradius: this.radius,\n\t\t\tcenter: this.center.toArray()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding sphere.\n\t *\n\t * @param {Object} json - The serialized json to set the sphere from.\n\t * @return {Box3} A reference to this bounding sphere.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.radius = json.radius;\n\t\tthis.center.fromArray( json.center );\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A ray that emits from an origin in a certain direction. The class is used by\n * {@link Raycaster} to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3D space the mouse is over)\n * amongst other things.\n */\nclass Ray {\n\n\t/**\n\t * Constructs a new ray.\n\t *\n\t * @param {Vector3} [origin=(0,0,0)] - The origin of the ray.\n\t * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray.\n\t */\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, -1 ) ) {\n\n\t\t/**\n\t\t * The origin of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.origin = origin;\n\n\t\t/**\n\t\t * The (normalized) direction of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.direction = direction;\n\n\t}\n\n\t/**\n\t * Sets the ray's components by copying the given values.\n\t *\n\t * @param {Vector3} origin - The origin.\n\t * @param {Vector3} direction - The direction.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given ray to this instance.\n\t *\n\t * @param {Ray} ray - The ray to copy.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector that is located at a given distance along this ray.\n\t *\n\t * @param {number} t - The distance along the ray to retrieve a position for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A position on the ray.\n\t */\n\tat( t, target ) {\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, t );\n\n\t}\n\n\t/**\n\t * Adjusts the direction of the ray to point at the given vector in world space.\n\t *\n\t * @param {Vector3} v - The target position.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Shift the origin of this ray along its direction by the given distance.\n\t *\n\t * @param {number} t - The distance along the ray to interpolate.\n\t * @return {Ray} A reference to this ray.\n\t */\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$a ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the point along this ray that is closest to the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to get the closet location on the ray for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on this ray.\n\t */\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t}\n\n\t/**\n\t * Returns the distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the squared distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$a.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t\treturn _vector$a.distanceToSquared( point );\n\n\t}\n\n\t/**\n\t * Returns the squared distance between this ray and the given line segment.\n\t *\n\t * @param {Vector3} v0 - The start point of the line segment.\n\t * @param {Vector3} v1 - The end point of the line segment.\n\t * @param {Vector3} [optionalPointOnRay] - When provided, it receives the point on this ray that is closest to the segment.\n\t * @param {Vector3} [optionalPointOnSegment] - When provided, it receives the point on the line segment that is closest to this ray.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given sphere, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$a.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$a.dot( this.direction );\n\t\tconst d2 = _vector$a.dot( _vector$a ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if t1 is behind the ray - if so, return null\n\t\tif ( t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @return {boolean} Whether this ray intersects with the given sphere or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tif ( sphere.radius < 0 ) return false; // handle empty spheres, see #31187\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray\n\t * does not intersect with the plane.\n\t *\n\t * @param {Plane} plane - The plane to compute the distance to.\n\t * @return {?number} Whether this ray intersects with the given sphere or not.\n\t */\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given plane, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @return {boolean} Whether this ray intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given bounding box, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\tif ( tymin > tmin || isNaN( tmin ) ) tmin = tymin;\n\n\t\tif ( tymax < tmax || isNaN( tmax ) ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this ray intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector$a ) !== null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given triangle, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Vector3} a - The first vertex of the triangle.\n\t * @param {Vector3} b - The second vertex of the triangle.\n\t * @param {Vector3} c - The third vertex of the triangle.\n\t * @param {boolean} backfaceCulling - Whether to use backface culling or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal$1.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal$1 );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = -1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal$1 );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\t/**\n\t * Transforms this ray with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The transformation matrix.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray is equal with the given one.\n\t *\n\t * @param {Ray} ray - The ray to test for equality.\n\t * @return {boolean} Whether this ray is equal with the given one.\n\t */\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\t/**\n\t * Returns a new ray with copied values from this instance.\n\t *\n\t * @return {Ray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 4x4 matrix.\n *\n * The most common use of a 4x4 matrix in 3D computer graphics is as a transformation matrix.\n * For an introduction to transformation matrices as used in WebGL, check out [this tutorial](https://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices)\n *\n * This allows a 3D vector representing a point in 3D space to undergo\n * transformations such as translation, rotation, shear, scale, reflection,\n * orthogonal or perspective projection and so on, by being multiplied by the\n * matrix. This is known as `applying` the matrix to the vector.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix4();\n * m.set( 11, 12, 13, 14,\n * 21, 22, 23, 24,\n * 31, 32, 33, 34,\n * 41, 42, 43, 44 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31, 41,\n * 12, 22, 32, 42,\n * 13, 23, 33, 43,\n * 14, 24, 34, 44 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix4 {\n\n\t/**\n\t * Constructs a new 4x4 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix4.prototype.isMatrix4 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 4x4 identity matrix.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix4} m - The matrix to copy.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the translation component of the given matrix\n\t * into this matrix's translation component.\n\t *\n\t * @param {Matrix4} m - The matrix to copy the translation component.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given basis vectors to this matrix.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the rotation component of the given matrix\n\t * into this matrix's rotation component.\n\t *\n\t * Note: This method does not support reflection matrices.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractRotation( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component (the upper left 3x3 matrix) of this matrix to\n\t * the rotation specified by the given Euler angles. The rest of\n\t * the matrix is set to the identity. Depending on the {@link Euler#order},\n\t * there are six possible outcomes. See [this page](https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix)\n\t * for a complete list.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromEuler( euler ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component of this matrix to the rotation specified by\n\t * the given Quaternion as outlined [here](https://en.wikipedia.org/wiki/Rotation_matrix#Quaternion)\n\t * The rest of the matrix is set to the identity.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\t/**\n\t * Sets the rotation component of the transformation matrix, looking from `eye` towards\n\t * `target`, and oriented by the up-direction.\n\t *\n\t * @param {Vector3} eye - The eye vector.\n\t * @param {Vector3} target - The target vector.\n\t * @param {Vector3} up - The up vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 4x4 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix4} a - The first matrix.\n\t * @param {Matrix4} b - The second matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * Based on the method outlined [here](http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html).\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the position component for this matrix from the given vector,\n\t * without affecting the rest of the matrix.\n\t *\n\t * @param {number|Vector3} x - The x component of the vector or alternatively the vector object.\n\t * @param {number} y - The y component of the vector.\n\t * @param {number} z - The z component of the vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution).\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the columns of this matrix by the given vector.\n\t *\n\t * @param {Vector3} v - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the maximum scale value of the three axes.\n\t *\n\t * @return {number} The maximum scale.\n\t */\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\t/**\n\t * Sets this matrix as a translation transform from the given vector.\n\t *\n\t * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @param {number} z - The amount to translate in the z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y, z ) {\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x.x,\n\t\t\t\t0, 1, 0, x.y,\n\t\t\t\t0, 0, 1, x.z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the X axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Y axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Z axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the given axis by\n\t * the given angle.\n\t *\n\t * This is a somewhat controversial but mathematically sound alternative to\n\t * rotating via Quaternions. See the discussion [here](https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199).\n\t *\n\t * @param {Vector3} axis - The normalized rotation axis.\n\t * @param {number} angle - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a scale transformation.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @param {number} z - The amount to scale in the Z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a shear transformation.\n\t *\n\t * @param {number} xy - The amount to shear X by Y.\n\t * @param {number} xz - The amount to shear X by Z.\n\t * @param {number} yx - The amount to shear Y by X.\n\t * @param {number} yz - The amount to shear Y by Z.\n\t * @param {number} zx - The amount to shear Z by X.\n\t * @param {number} zy - The amount to shear Z by Y.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the transformation composed of the given position,\n\t * rotation (Quaternion) and scale.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Decomposes this matrix into its position, rotation and scale components\n\t * and provides the result in the given objects.\n\t *\n\t * Note: Not all matrices are decomposable in this way. For example, if an\n\t * object has a non-uniformly scaled parent, then the object's world matrix\n\t * may not be decomposable, and this method may not be appropriate.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1$2.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1$2.elements[ 0 ] *= invSX;\n\t\t_m1$2.elements[ 1 ] *= invSX;\n\t\t_m1$2.elements[ 2 ] *= invSX;\n\n\t\t_m1$2.elements[ 4 ] *= invSY;\n\t\t_m1$2.elements[ 5 ] *= invSY;\n\t\t_m1$2.elements[ 6 ] *= invSY;\n\n\t\t_m1$2.elements[ 8 ] *= invSZ;\n\t\t_m1$2.elements[ 9 ] *= invSZ;\n\t\t_m1$2.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1$2 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a perspective projection matrix. This is used internally by\n\t * {@link PerspectiveCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tc = near / ( far - near );\n\t\t\td = ( far * near ) / ( far - near );\n\n\t\t} else {\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tc = - ( far + near ) / ( far - near );\n\t\t\t\td = ( -2 * far * near ) / ( far - near );\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tc = - far / ( far - near );\n\t\t\t\td = ( - far * near ) / ( far - near );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a; \tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b; \tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c; \tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = -1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a orthographic projection matrix. This is used internally by\n\t * {@link OrthographicCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = 2 / ( right - left );\n\t\tconst y = 2 / ( top - bottom );\n\n\t\tconst a = - ( right + left ) / ( right - left );\n\t\tconst b = - ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tc = 1 / ( far - near );\n\t\t\td = far / ( far - near );\n\n\t\t} else {\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tc = -2 / ( far - near );\n\t\t\t\td = - ( far + near ) / ( far - near );\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tc = -1 / ( far - near );\n\t\t\t\td = - near / ( far - near );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\tte[ 0 ] = x;\t\tte[ 4 ] = 0;\t\tte[ 8 ] = 0; \t\tte[ 12 ] = a;\n\t\tte[ 1 ] = 0; \t\tte[ 5 ] = y;\t\tte[ 9 ] = 0; \t\tte[ 13 ] = b;\n\t\tte[ 2 ] = 0; \t\tte[ 6 ] = 0;\t\tte[ 10 ] = c;\t\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0; \t\tte[ 7 ] = 0;\t\tte[ 11 ] = 0;\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix4} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nconst _v1$5 = /*@__PURE__*/ new Vector3();\nconst _m1$2 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix$2 = /*@__PURE__*/ new Matrix4();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\n\n/**\n * A class representing Euler angles.\n *\n * Euler angles describe a rotational transformation by rotating an object on\n * its various axes in specified amounts per axis, and a specified axis\n * order.\n *\n * Iterating through an instance will yield its components (x, y, z,\n * order) in the corresponding order.\n *\n * ```js\n * const a = new THREE.Euler( 0, 1, 1.57, 'XYZ' );\n * const b = new THREE.Vector3( 1, 0, 1 );\n * b.applyEuler(a);\n * ```\n */\nclass Euler {\n\n\t/**\n\t * Constructs a new euler instance.\n\t *\n\t * @param {number} [x=0] - The angle of the x axis in radians.\n\t * @param {number} [y=0] - The angle of the y axis in radians.\n\t * @param {number} [z=0] - The angle of the z axis in radians.\n\t * @param {string} [order=Euler.DEFAULT_ORDER] - A string representing the order that the rotations are applied.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEuler = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\t/**\n\t * The angle of the x axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the y axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the z axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * A string representing the order that the rotations are applied.\n\t *\n\t * @type {string}\n\t * @default 'XYZ'\n\t */\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the Euler components.\n\t *\n\t * @param {number} x - The angle of the x axis in radians.\n\t * @param {number} y - The angle of the y axis in radians.\n\t * @param {number} z - The angle of the z axis in radians.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new Euler instance with copied values from this instance.\n\t *\n\t * @return {Euler} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\t/**\n\t * Copies the values of the given Euler instance to this instance.\n\t *\n\t * @param {Euler} euler - The Euler instance to copy.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a pure rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\twarn( 'Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a normalized quaternion.\n\t *\n\t * @param {Quaternion} q - A normalized Quaternion.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix$2.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix$2, order, update );\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from the given vector.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\t/**\n\t * Resets the euler angle with a new order by creating a quaternion from this\n\t * euler angle and then setting this euler angle with the quaternion and the\n\t * new order.\n\t *\n\t * Warning: This discards revolution information.\n\t *\n\t * @param {string} [newOrder] - A string representing the new order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\treorder( newOrder ) {\n\n\t\t_quaternion$3.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$3, newOrder );\n\n\t}\n\n\t/**\n\t * Returns `true` if this Euler instance is equal with the given one.\n\t *\n\t * @param {Euler} euler - The Euler instance to test for equality.\n\t * @return {boolean} Whether this Euler instance is equal with the given one.\n\t */\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\t/**\n\t * Sets this Euler instance's components to values from the given array. The first three\n\t * entries of the array are assign to the x,y and z components. An optional fourth entry\n\t * defines the Euler order.\n\t *\n\t * @param {Array} array - An array holding the Euler component values.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this Euler instance to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the Euler components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The Euler components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\n/**\n * The default Euler angle order.\n *\n * @static\n * @type {string}\n * @default 'XYZ'\n */\nEuler.DEFAULT_ORDER = 'XYZ';\n\n/**\n * A layers object assigns an 3D object to 1 or more of 32\n * layers numbered `0` to `31` - internally the layers are stored as a\n * bit mask], and by default all 3D objects are a member of layer `0`.\n *\n * This can be used to control visibility - an object must share a layer with\n * a camera to be visible when that camera's view is\n * rendered.\n *\n * All classes that inherit from {@link Object3D} have an `layers` property which\n * is an instance of this class.\n */\nclass Layers {\n\n\t/**\n\t * Constructs a new layers instance, with membership\n\t * initially set to layer `0`.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A bit mask storing which of the 32 layers this layers object is currently\n\t\t * a member of.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\t/**\n\t * Sets membership to the given layer, and remove membership all other layers.\n\t *\n\t * @param {number} layer - The layer to set.\n\t */\n\tset( layer ) {\n\n\t\tthis.mask = ( 1 << layer | 0 ) >>> 0;\n\n\t}\n\n\t/**\n\t * Adds membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to enable.\n\t */\n\tenable( layer ) {\n\n\t\tthis.mask |= 1 << layer | 0;\n\n\t}\n\n\t/**\n\t * Adds membership to all layers.\n\t */\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\t/**\n\t * Toggles the membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to toggle.\n\t */\n\ttoggle( layer ) {\n\n\t\tthis.mask ^= 1 << layer | 0;\n\n\t}\n\n\t/**\n\t * Removes membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to enable.\n\t */\n\tdisable( layer ) {\n\n\t\tthis.mask &= ~ ( 1 << layer | 0 );\n\n\t}\n\n\t/**\n\t * Removes the membership from all layers.\n\t */\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if this and the given layers object have at least one\n\t * layer in common.\n\t *\n\t * @param {Layers} layers - The layers to test.\n\t * @return {boolean } Whether this and the given layers object have at least one layer in common or not.\n\t */\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given layer is enabled.\n\t *\n\t * @param {number} layer - The layer to test.\n\t * @return {boolean } Whether the given layer is enabled or not.\n\t */\n\tisEnabled( layer ) {\n\n\t\treturn ( this.mask & ( 1 << layer | 0 ) ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$4 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$2 = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\n/**\n * Fires when the object has been added to its parent object.\n *\n * @event Object3D#added\n * @type {Object}\n */\nconst _addedEvent = { type: 'added' };\n\n/**\n * Fires when the object has been removed from its parent object.\n *\n * @event Object3D#removed\n * @type {Object}\n */\nconst _removedEvent = { type: 'removed' };\n\n/**\n * Fires when a new child object has been added.\n *\n * @event Object3D#childadded\n * @type {Object}\n */\nconst _childaddedEvent = { type: 'childadded', child: null };\n\n/**\n * Fires when a child object has been removed.\n *\n * @event Object3D#childremoved\n * @type {Object}\n */\nconst _childremovedEvent = { type: 'childremoved', child: null };\n\n/**\n * This is the base class for most objects in three.js and provides a set of\n * properties and methods for manipulating objects in 3D space.\n *\n * @augments EventDispatcher\n */\nclass Object3D extends EventDispatcher {\n\n\t/**\n\t * Constructs a new 3D object.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isObject3D = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name Object3D#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Object3D';\n\n\t\t/**\n\t\t * A reference to the parent object.\n\t\t *\n\t\t * @type {?Object3D}\n\t\t * @default null\n\t\t */\n\t\tthis.parent = null;\n\n\t\t/**\n\t\t * An array holding the child 3D objects of this instance.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.children = [];\n\n\t\t/**\n\t\t * Defines the `up` direction of the 3D object which influences\n\t\t * the orientation via methods like {@link Object3D#lookAt}.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_UP`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.up = Object3D.DEFAULT_UP.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * Represents the object's local position.\n\t\t\t *\n\t\t\t * @name Object3D#position\n\t\t\t * @type {Vector3}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Euler angles, in radians.\n\t\t\t *\n\t\t\t * @name Object3D#rotation\n\t\t\t * @type {Euler}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Quaternions.\n\t\t\t *\n\t\t\t * @name Object3D#quaternion\n\t\t\t * @type {Quaternion}\n\t\t\t */\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local scale.\n\t\t\t *\n\t\t\t * @name Object3D#scale\n\t\t\t * @type {Vector3}\n\t\t\t * @default (1,1,1)\n\t\t\t */\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's model-view matrix.\n\t\t\t *\n\t\t\t * @name Object3D#modelViewMatrix\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's normal matrix.\n\t\t\t *\n\t\t\t * @name Object3D#normalMatrix\n\t\t\t * @type {Matrix3}\n\t\t\t */\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in local space.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in world space.\n\t\t * If the 3D object has no parent, then it's identical to the local transformation matrix\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the local matrix from position,\n\t\t * rotation and scale every frame.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE;\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the world matrix from the current local\n\t\t * matrix and the object's transformation hierarchy.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer\n\n\t\t/**\n\t\t * When set to `true`, it calculates the world matrix in that frame and resets this property\n\t\t * to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t/**\n\t\t * The layer membership of the 3D object. The 3D object is only visible if it has\n\t\t * at least one layer in common with the camera in use. This property can also be\n\t\t * used to filter out unwanted objects in ray-intersection tests when using {@link Raycaster}.\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered into shadow maps.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.castShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is affected by shadows in the scene.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.receiveShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is honored by view frustum culling.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.frustumCulled = true;\n\n\t\t/**\n\t\t * This value allows the default rendering order of scene graph objects to be\n\t\t * overridden although opaque and transparent objects remain sorted independently.\n\t\t * When this property is set for an instance of {@link Group},all descendants\n\t\t * objects will be sorted and rendered together. Sorting is from lowest to highest\n\t\t * render order.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.renderOrder = 0;\n\n\t\t/**\n\t\t * An array holding the animation clips of the 3D object.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.animations = [];\n\n\t\t/**\n\t\t * Custom depth material to be used when rendering to the depth map. Can only be used\n\t\t * in context of meshes. When shadow-casting with a {@link DirectionalLight} or {@link SpotLight},\n\t\t * if you are modifying vertex positions in the vertex shader you must specify a custom depth\n\t\t * material for proper shadows.\n\t\t *\n\t\t * Only relevant in context of {@link WebGLRenderer}.\n\t\t *\n\t\t * @type {(Material|undefined)}\n\t\t * @default undefined\n\t\t */\n\t\tthis.customDepthMaterial = undefined;\n\n\t\t/**\n\t\t * Same as {@link Object3D#customDepthMaterial}, but used with {@link PointLight}.\n\t\t *\n\t\t * Only relevant in context of {@link WebGLRenderer}.\n\t\t *\n\t\t * @type {(Material|undefined)}\n\t\t * @default undefined\n\t\t */\n\t\tthis.customDistanceMaterial = undefined;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the 3D object. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * Applies the given transformation matrix to the object and updates the object's position,\n\t * rotation and scale.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\t/**\n\t * Applies a rotation represented by given the quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as an axis/angle couple to the 3D object.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t */\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as Euler angles to the 3D object.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t */\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as rotation matrix to the 3D object.\n\t *\n\t * @param {Matrix4} m - Although a 4x4 matrix is expected, the upper 3x3 portion must be\n\t * a pure rotation matrix (i.e, unscaled).\n\t */\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as a Quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The Quaternion\n\t */\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in world space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its X axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Y axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Z axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along the given axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$4.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$4.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its X-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Y-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Z-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's local space to world space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tlocalToWorld( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's word space to local space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tworldToLocal( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\t/**\n\t * Rotates the object to face a point in world space.\n\t *\n\t * This method does not support objects having non-uniformly-scaled parent(s).\n\t *\n\t * @param {number|Vector3} x - The x coordinate in world space. Alternatively, a vector representing a position in world space\n\t * @param {number} [y] - The y coordinate in world space.\n\t * @param {number} [z] - The z coordinate in world space.\n\t */\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position$3.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$1.lookAt( _position$3, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$1.lookAt( _target, _position$3, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child to this 3D object. An arbitrary number of\n\t * objects may be added. Any current parent on an object passed in here will be\n\t * removed, since an object can have at most one parent.\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to add.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\terror( 'Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tobject.removeFromParent();\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t\t_childaddedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t\t_childaddedEvent.child = null;\n\n\t\t} else {\n\n\t\t\terror( 'Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given 3D object as child from this 3D object.\n\t * An arbitrary number of objects may be removed.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @param {Object3D} object - The 3D object to remove.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== -1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t\t_childremovedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childremovedEvent );\n\t\t\t_childremovedEvent.child = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes this 3D object from its current parent.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes all child objects.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tclear() {\n\n\t\treturn this.remove( ... this.children );\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child of this 3D object, while maintaining the object's world\n\t * transform. This method does not support scene graphs having non-uniformly-scaled nodes(s).\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to attach.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$1 );\n\n\t\tobject.removeFromParent();\n\t\tobject.parent = this;\n\t\tthis.children.push( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t_childaddedEvent.child = object;\n\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t_childaddedEvent.child = null;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching ID.\n\t *\n\t * @param {number} id - The id.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching name.\n\t *\n\t * @param {string} name - The name.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns all 3D objects with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @param {Array} result - The method stores the result in this array.\n\t * @return {Array} The found 3D objects.\n\t */\n\tgetObjectsByProperty( name, value, result = [] ) {\n\n\t\tif ( this[ name ] === value ) result.push( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].getObjectsByProperty( name, value, result );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the position of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's position in world space.\n\t */\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Returns a Quaternion representing the position of the 3D object in world space.\n\t *\n\t * @param {Quaternion} target - The target Quaternion the result is stored to.\n\t * @return {Quaternion} The 3D object's rotation in world space.\n\t */\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, target, _scale$2 );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the scale of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's scale in world space.\n\t */\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$2, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\t/**\n\t * Abstract method to get intersections between a casted ray and this\n\t * 3D object. Renderable 3D objects such as {@link Mesh}, {@link Line} or {@link Points}\n\t * implement this method in order to use raycasting.\n\t *\n\t * @abstract\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - An array holding the result of the method.\n\t */\n\traycast( /* raycaster, intersects */ ) {}\n\n\t/**\n\t * Executes the callback on this 3D object and all descendants.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for visible 3D objects.\n\t * Descendants of invisible 3D objects are not traversed.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for all ancestors.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in local space by computing it from the current\n\t * position, rotation and scale values.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in world space of this 3D objects and its descendants.\n\t *\n\t * To ensure correct results, this method also recomputes the 3D object's transformation matrix in\n\t * local space. The computation of the local and world matrix can be controlled with the\n\t * {@link Object3D#matrixAutoUpdate} and {@link Object3D#matrixWorldAutoUpdate} flags which are both\n\t * `true` by default. Set these flags to `false` if you need more control over the update matrix process.\n\t *\n\t * @param {boolean} [force=false] - When set to `true`, a recomputation of world matrices is forced even\n\t * when {@link Object3D#matrixWorldAutoUpdate} is set to `false`.\n\t */\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// make sure descendants are updated if required\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst child = children[ i ];\n\n\t\t\tchild.updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * An alternative version of {@link Object3D#updateMatrixWorld} with more control over the\n\t * update of ancestor and descendant nodes.\n\t *\n\t * @param {boolean} [updateParents=false] Whether ancestor nodes should be updated or not.\n\t * @param {boolean} [updateChildren=false] Whether descendant nodes should be updated or not.\n\t */\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// make sure descendants are updated\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = children[ i ];\n\n\t\t\t\tchild.updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the 3D object into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized 3D object.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( Object.keys( this.userData ).length > 0 ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\t\tobject.up = this.up.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\tif ( this.isBatchedMesh ) {\n\n\t\t\tobject.type = 'BatchedMesh';\n\t\t\tobject.perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\t\tobject.sortObjects = this.sortObjects;\n\n\t\t\tobject.drawRanges = this._drawRanges;\n\t\t\tobject.reservedRanges = this._reservedRanges;\n\n\t\t\tobject.geometryInfo = this._geometryInfo.map( info => ( {\n\t\t\t\t...info,\n\t\t\t\tboundingBox: info.boundingBox ? info.boundingBox.toJSON() : undefined,\n\t\t\t\tboundingSphere: info.boundingSphere ? info.boundingSphere.toJSON() : undefined\n\t\t\t} ) );\n\t\t\tobject.instanceInfo = this._instanceInfo.map( info => ( { ...info } ) );\n\n\t\t\tobject.availableInstanceIds = this._availableInstanceIds.slice();\n\t\t\tobject.availableGeometryIds = this._availableGeometryIds.slice();\n\n\t\t\tobject.nextIndexStart = this._nextIndexStart;\n\t\t\tobject.nextVertexStart = this._nextVertexStart;\n\t\t\tobject.geometryCount = this._geometryCount;\n\n\t\t\tobject.maxInstanceCount = this._maxInstanceCount;\n\t\t\tobject.maxVertexCount = this._maxVertexCount;\n\t\t\tobject.maxIndexCount = this._maxIndexCount;\n\n\t\t\tobject.geometryInitialized = this._geometryInitialized;\n\n\t\t\tobject.matricesTexture = this._matricesTexture.toJSON( meta );\n\n\t\t\tobject.indirectTexture = this._indirectTexture.toJSON( meta );\n\n\t\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\t\tobject.colorsTexture = this._colorsTexture.toJSON( meta );\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tobject.boundingSphere = this.boundingSphere.toJSON();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tobject.boundingBox = this.boundingBox.toJSON();\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new 3D object with copied values from this instance.\n\t *\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are also cloned.\n\t * @return {Object3D} A clone of this instance.\n\t */\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\t/**\n\t * Copies the values of the given 3D object to this instance.\n\t *\n\t * @param {Object3D} source - The 3D object to copy.\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are cloned.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\tthis.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.animations = source.animations.slice();\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * The default up direction for objects, also used as the default\n * position for {@link DirectionalLight} and {@link HemisphereLight}.\n *\n * @static\n * @type {Vector3}\n * @default (0,1,0)\n */\nObject3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 );\n\n/**\n * The default setting for {@link Object3D#matrixAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_AUTO_UPDATE = true;\n\n/**\n * The default setting for {@link Object3D#matrixWorldAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true;\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$2 = /*@__PURE__*/ new Vector3();\nconst _v3$2 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nconst _v40 = /*@__PURE__*/ new Vector4();\nconst _v41 = /*@__PURE__*/ new Vector4();\nconst _v42 = /*@__PURE__*/ new Vector4();\n\n/**\n * A geometric triangle as defined by three vectors representing its three corners.\n */\nclass Triangle {\n\n\t/**\n\t * Constructs a new triangle.\n\t *\n\t * @param {Vector3} [a=(0,0,0)] - The first corner of the triangle.\n\t * @param {Vector3} [b=(0,0,0)] - The second corner of the triangle.\n\t * @param {Vector3} [c=(0,0,0)] - The third corner of the triangle.\n\t */\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\t/**\n\t\t * The first corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.a = a;\n\n\t\t/**\n\t\t * The second corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.b = b;\n\n\t\t/**\n\t\t * The third corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.c = c;\n\n\t}\n\n\t/**\n\t * Computes the normal vector of a triangle.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$1.subVectors( a, b );\n\t\ttarget.cross( _v0$1 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\n\t\t_v0$1.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$2.subVectors( point, a );\n\n\t\tconst dot00 = _v0$1.dot( _v0$1 );\n\t\tconst dot01 = _v0$1.dot( _v1$3 );\n\t\tconst dot02 = _v0$1.dot( _v2$2 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\t// if the triangle is degenerate then we can't contain a point\n\t\tif ( this.getBarycoord( point, a, b, c, _v3$2 ) === null ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn ( _v3$2.x >= 0 ) && ( _v3$2.y >= 0 ) && ( ( _v3$2.x + _v3$2.y ) <= 1 );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} p1 - The first corner of the triangle.\n\t * @param {Vector3} p2 - The second corner of the triangle.\n\t * @param {Vector3} p3 - The third corner of the triangle.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tstatic getInterpolation( point, p1, p2, p3, v1, v2, v3, target ) {\n\n\t\tif ( this.getBarycoord( point, p1, p2, p3, _v3$2 ) === null ) {\n\n\t\t\ttarget.x = 0;\n\t\t\ttarget.y = 0;\n\t\t\tif ( 'z' in target ) target.z = 0;\n\t\t\tif ( 'w' in target ) target.w = 0;\n\t\t\treturn null;\n\n\t\t}\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( v1, _v3$2.x );\n\t\ttarget.addScaledVector( v2, _v3$2.y );\n\t\ttarget.addScaledVector( v3, _v3$2.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given attribute and indices.\n\t *\n\t * @param {BufferAttribute} attr - The attribute to interpolate.\n\t * @param {number} i1 - Index of first vertex.\n\t * @param {number} i2 - Index of second vertex.\n\t * @param {number} i3 - Index of third vertex.\n\t * @param {Vector3} barycoord - The barycoordinate value to use to interpolate.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The interpolated attribute value.\n\t */\n\tstatic getInterpolatedAttribute( attr, i1, i2, i3, barycoord, target ) {\n\n\t\t_v40.setScalar( 0 );\n\t\t_v41.setScalar( 0 );\n\t\t_v42.setScalar( 0 );\n\n\t\t_v40.fromBufferAttribute( attr, i1 );\n\t\t_v41.fromBufferAttribute( attr, i2 );\n\t\t_v42.fromBufferAttribute( attr, i3 );\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( _v40, barycoord.x );\n\t\ttarget.addScaledVector( _v41, barycoord.y );\n\t\ttarget.addScaledVector( _v42, barycoord.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$1.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given values.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given array values.\n\t *\n\t * @param {Array} points - An array with 3D points.\n\t * @param {number} i0 - The array index representing the first corner of the triangle.\n\t * @param {number} i1 - The array index representing the second corner of the triangle.\n\t * @param {number} i2 - The array index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given attribute values.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute with 3D points data.\n\t * @param {number} i0 - The attribute index representing the first corner of the triangle.\n\t * @param {number} i1 - The attribute index representing the second corner of the triangle.\n\t * @param {number} i2 - The attribute index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new triangle with copied values from this instance.\n\t *\n\t * @return {Triangle} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given triangle to this instance.\n\t *\n\t * @param {Triangle} triangle - The triangle to copy.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the area of the triangle.\n\t *\n\t * @return {number} The triangle's area.\n\t */\n\tgetArea() {\n\n\t\t_v0$1.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$1.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\t/**\n\t * Computes the midpoint of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's midpoint.\n\t */\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\t/**\n\t * Computes the normal of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes a plane the triangle lies within.\n\t *\n\t * @param {Plane} target - The target vector that is used to store the method's result.\n\t * @return {Plane} The plane the triangle lies within.\n\t */\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tgetInterpolation( point, v1, v2, v3, target ) {\n\n\t\treturn Triangle.getInterpolation( point, this.a, this.b, this.c, v1, v2, v3, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this triangle intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\t/**\n\t * Returns the closest point on the triangle to the given point.\n\t *\n\t * @param {Vector3} p - The point to compute the closest point for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the triangle.\n\t */\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle is equal with the given one.\n\t *\n\t * @param {Triangle} triangle - The triangle to test for equality.\n\t * @return {boolean} Whether this triangle is equal with the given one.\n\t */\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\n/**\n * A Color instance is represented by RGB components in the linear working\n * color space, which defaults to `LinearSRGBColorSpace`. Inputs\n * conventionally using `SRGBColorSpace` (such as hexadecimals and CSS\n * strings) are converted to the working color space automatically.\n *\n * ```js\n * // converted automatically from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setHex( 0x112233 );\n * ```\n * Source color spaces may be specified explicitly, to ensure correct conversions.\n * ```js\n * // assumed already LinearSRGBColorSpace; no conversion\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5 );\n *\n * // converted explicitly from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5, SRGBColorSpace );\n * ```\n * If THREE.ColorManagement is disabled, no conversions occur. For details,\n * see Color management. Iterating through a Color instance will yield\n * its components (r, g, b) in the corresponding order. A Color can be initialised\n * in any of the following ways:\n * ```js\n * //empty constructor - will default white\n * const color1 = new THREE.Color();\n *\n * //Hexadecimal color (recommended)\n * const color2 = new THREE.Color( 0xff0000 );\n *\n * //RGB string\n * const color3 = new THREE.Color(\"rgb(255, 0, 0)\");\n * const color4 = new THREE.Color(\"rgb(100%, 0%, 0%)\");\n *\n * //X11 color name - all 140 color names are supported.\n * //Note the lack of CamelCase in the name\n * const color5 = new THREE.Color( 'skyblue' );\n * //HSL string\n * const color6 = new THREE.Color(\"hsl(0, 100%, 50%)\");\n *\n * //Separate RGB values between 0 and 1\n * const color7 = new THREE.Color( 1, 0, 0 );\n * ```\n */\nclass Color {\n\n\t/**\n\t * Constructs a new color.\n\t *\n\t * Note that standard method of specifying color in three.js is with a hexadecimal triplet,\n\t * and that method is used throughout the rest of the documentation.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t */\n\tconstructor( r, g, b ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isColor = true;\n\n\t\t/**\n\t\t * The red component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.r = 1;\n\n\t\t/**\n\t\t * The green component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.g = 1;\n\n\t\t/**\n\t\t * The blue component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.b = 1;\n\n\t\treturn this.set( r, g, b );\n\n\t}\n\n\t/**\n\t * Sets the colors's components from the given values.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t * @return {Color} A reference to this color.\n\t */\n\tset( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\n\t\t\tconst value = r;\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.setRGB( r, g, b );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the colors's components to the given scalar value.\n\t *\n\t * @param {number} scalar - The scalar value.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a hexadecimal value.\n\t *\n\t * @param {number} hex - The hexadecimal value.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHex( hex, colorSpace = SRGBColorSpace ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} r - Red channel value between `0.0` and `1.0`.\n\t * @param {number} g - Green channel value between `0.0` and `1.0`.\n\t * @param {number} b - Blue channel value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetRGB( r, g, b, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHSL( h, s, l, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = euclideanModulo( h, 1 );\n\t\ts = clamp( s, 0, 1 );\n\t\tl = clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a CSS-style string. For example, `rgb(250, 0,0)`,\n\t * `rgb(100%, 0%, 0%)`, `hsl(0, 100%, 50%)`, `#ff0000`, `#f00`, or `red` ( or\n\t * any [X11 color name](https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart) -\n\t * all 140 color names are supported).\n\t *\n\t * @param {string} style - Color as a CSS-style string.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetStyle( style, colorSpace = SRGBColorSpace ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\twarn( 'Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^(\\w+)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 1 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 2 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 3 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 1 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 2 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 3 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL(\n\t\t\t\t\t\t\tparseFloat( color[ 1 ] ) / 360,\n\t\t\t\t\t\t\tparseFloat( color[ 2 ] ) / 100,\n\t\t\t\t\t\t\tparseFloat( color[ 3 ] ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\twarn( 'Color: Unknown color model ' + style );\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\treturn this.setRGB(\n\t\t\t\t\tparseInt( hex.charAt( 0 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 1 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 2 ), 16 ) / 15,\n\t\t\t\t\tcolorSpace\n\t\t\t\t);\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\treturn this.setHex( parseInt( hex, 16 ), colorSpace );\n\n\t\t\t} else {\n\n\t\t\t\twarn( 'Color: Invalid hex color ' + style );\n\n\t\t\t}\n\n\t\t} else if ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style, colorSpace );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a color name. Faster than {@link Color#setStyle} if\n\t * you don't need the other CSS-style formats.\n\t *\n\t * For convenience, the list of names is exposed in `Color.NAMES` as a hash.\n\t * ```js\n\t * Color.NAMES.aliceblue // returns 0xF0F8FF\n\t * ```\n\t *\n\t * @param {string} style - The color name.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetColorName( style, colorSpace = SRGBColorSpace ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex, colorSpace );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\twarn( 'Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new color with copied values from this instance.\n\t *\n\t * @return {Color} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\t/**\n\t * Copies the values of the given color to this instance.\n\t *\n\t * @param {Color} color - The color to copy.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {number} The hexadecimal value.\n\t */\n\tgetHex( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\treturn Math.round( clamp( _color.r * 255, 0, 255 ) ) * 65536 + Math.round( clamp( _color.g * 255, 0, 255 ) ) * 256 + Math.round( clamp( _color.b * 255, 0, 255 ) );\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color as a string (for example, 'FFFFFF').\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The hexadecimal value as a string.\n\t */\n\tgetHexString( colorSpace = SRGBColorSpace ) {\n\n\t\treturn ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( -6 );\n\n\t}\n\n\t/**\n\t * Converts the colors RGB values into the HSL format and stores them into the\n\t * given target object.\n\t *\n\t * @param {{h:number,s:number,l:number}} target - The target object that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {{h:number,s:number,l:number}} The HSL representation of this color.\n\t */\n\tgetHSL( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the RGB values of this color and stores them into the given target object.\n\t *\n\t * @param {Color} target - The target color that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} The RGB representation of this color.\n\t */\n\tgetRGB( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\ttarget.r = _color.r;\n\t\ttarget.g = _color.g;\n\t\ttarget.b = _color.b;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the value of this color as a CSS style string. Example: `rgb(255,0,0)`.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The CSS representation of this color.\n\t */\n\tgetStyle( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tif ( colorSpace !== SRGBColorSpace ) {\n\n\t\t\t// Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n\t\t\treturn `color(${ colorSpace } ${ r.toFixed( 3 ) } ${ g.toFixed( 3 ) } ${ b.toFixed( 3 ) })`;\n\n\t\t}\n\n\t\treturn `rgb(${ Math.round( r * 255 ) },${ Math.round( g * 255 ) },${ Math.round( b * 255 ) })`;\n\n\t}\n\n\t/**\n\t * Adds the given HSL values to this color's values.\n\t * Internally, this converts the color's RGB values to HSL, adds HSL\n\t * and then converts the color back to RGB.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @return {Color} A reference to this color.\n\t */\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\treturn this.setHSL( _hslA.h + h, _hslA.s + s, _hslA.l + l );\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given color to the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to add.\n\t * @return {Color} A reference to this color.\n\t */\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given colors and stores the result in this instance.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @return {Color} A reference to this color.\n\t */\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Color} A reference to this color.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the RGB values of the given color from the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to subtract.\n\t * @return {Color} A reference to this color.\n\t */\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the RGB values of the given color with the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's RGB values toward the RGB values of the\n\t * given color. The alpha argument can be thought of as the ratio between\n\t * the two colors, where `0.0` is this color and `1.0` is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given colors and stores the result in this instance.\n\t * The alpha argument can be thought of as the ratio between the two colors, where `0.0`\n\t * is the first and `1.0` is the second color.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's HSL values toward the HSL values of the\n\t * given color. It differs from {@link Color#lerp} by not interpolating straight\n\t * from one color to the other, but instead going through all the hues in between\n\t * those two colors. The alpha argument can be thought of as the ratio between\n\t * the two colors, where 0.0 is this color and 1.0 is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the color's RGB components from the given 3D vector.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetFromVector3( v ) {\n\n\t\tthis.r = v.x;\n\t\tthis.g = v.y;\n\t\tthis.b = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this color with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix.\n\t * @return {Color} A reference to this color.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\t\tconst e = m.elements;\n\n\t\tthis.r = e[ 0 ] * r + e[ 3 ] * g + e[ 6 ] * b;\n\t\tthis.g = e[ 1 ] * r + e[ 4 ] * g + e[ 7 ] * b;\n\t\tthis.b = e[ 2 ] * r + e[ 5 ] * g + e[ 8 ] * b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this color is equal with the given one.\n\t *\n\t * @param {Color} c - The color to test for equality.\n\t * @return {boolean} Whether this bounding color is equal with the given one.\n\t */\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\t/**\n\t * Sets this color's RGB components from the given array.\n\t *\n\t * @param {Array} array - An array holding the RGB values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the RGB components of this color to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array} [array=[]] - The target array holding the color components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array} The color components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this color from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding color data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the color\n\t * as a hexadecimal value.\n\t *\n\t * @return {number} The hexadecimal value.\n\t */\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\n\t}\n\n}\n\nconst _color = /*@__PURE__*/ new Color();\n\n/**\n * A dictionary with X11 color names.\n *\n * Note that multiple words such as Dark Orange become the string 'darkorange'.\n *\n * @static\n * @type {Object}\n */\nColor.NAMES = _colorKeywords;\n\nlet _materialId = 0;\n\n/**\n * Abstract base class for materials.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Material extends EventDispatcher {\n\n\t/**\n\t * Constructs a new material.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMaterial = true;\n\n\t\t/**\n\t\t * The ID of the material.\n\t\t *\n\t\t * @name Material#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _materialId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Material';\n\n\t\t/**\n\t\t * Defines the blending type of the material.\n\t\t *\n\t\t * It must be set to `CustomBlending` if custom blending properties like\n\t\t * {@link Material#blendSrc}, {@link Material#blendDst} or {@link Material#blendEquation}\n\t\t * should have any effect.\n\t\t *\n\t\t * @type {(NoBlending|NormalBlending|AdditiveBlending|SubtractiveBlending|MultiplyBlending|CustomBlending)}\n\t\t * @default NormalBlending\n\t\t */\n\t\tthis.blending = NormalBlending;\n\n\t\t/**\n\t\t * Defines which side of faces will be rendered - front, back or both.\n\t\t *\n\t\t * @type {(FrontSide|BackSide|DoubleSide)}\n\t\t * @default FrontSide\n\t\t */\n\t\tthis.side = FrontSide;\n\n\t\t/**\n\t\t * If set to `true`, vertex colors should be used.\n\t\t *\n\t\t * The engine supports RGB and RGBA vertex colors depending on whether a three (RGB) or\n\t\t * four (RGBA) component color buffer attribute is used.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.vertexColors = false;\n\n\t\t/**\n\t\t * Defines how transparent the material is.\n\t\t * A value of `0.0` indicates fully transparent, `1.0` is fully opaque.\n\t\t *\n\t\t * If the {@link Material#transparent} is not set to `true`,\n\t\t * the material will remain fully opaque and this value will only affect its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.opacity = 1;\n\n\t\t/**\n\t\t * Defines whether this material is transparent. This has an effect on\n\t\t * rendering as transparent objects need special treatment and are rendered\n\t\t * after non-transparent objects.\n\t\t *\n\t\t * When set to true, the extent to which the material is transparent is\n\t\t * controlled by {@link Material#opacity}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.transparent = false;\n\n\t\t/**\n\t\t * Enables alpha hashed transparency, an alternative to {@link Material#transparent} or\n\t\t * {@link Material#alphaTest}. The material will not be rendered if opacity is lower than\n\t\t * a random threshold. Randomization introduces some grain or noise, but approximates alpha\n\t\t * blending without the associated problems of sorting. Using TAA can reduce the resulting noise.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaHash = false;\n\n\t\t/**\n\t\t * Defines the blending source factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default SrcAlphaFactor\n\t\t */\n\t\tthis.blendSrc = SrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending destination factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default OneMinusSrcAlphaFactor\n\t\t */\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending equation.\n\t\t *\n\t\t * @type {(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default AddEquation\n\t\t */\n\t\tthis.blendEquation = AddEquation;\n\n\t\t/**\n\t\t * Defines the blending source alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendSrcAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending destination alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendDstAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending equation of the alpha channel.\n\t\t *\n\t\t * @type {?(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendEquationAlpha = null;\n\n\t\t/**\n\t\t * Represents the RGB values of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantColor` or `OneMinusConstantColor`.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.blendColor = new Color( 0, 0, 0 );\n\n\t\t/**\n\t\t * Represents the alpha value of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantAlpha` or `OneMinusConstantAlpha`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.blendAlpha = 0;\n\n\t\t/**\n\t\t * Defines the depth function.\n\t\t *\n\t\t * @type {(NeverDepth|AlwaysDepth|LessDepth|LessEqualDepth|EqualDepth|GreaterEqualDepth|GreaterDepth|NotEqualDepth)}\n\t\t * @default LessEqualDepth\n\t\t */\n\t\tthis.depthFunc = LessEqualDepth;\n\n\t\t/**\n\t\t * Whether to have depth test enabled when rendering this material.\n\t\t * When the depth test is disabled, the depth write will also be implicitly disabled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthTest = true;\n\n\t\t/**\n\t\t * Whether rendering this material has any effect on the depth buffer.\n\t\t *\n\t\t * When drawing 2D overlays it can be useful to disable the depth writing in\n\t\t * order to layer several things together without creating z-index artifacts.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthWrite = true;\n\n\t\t/**\n\t\t * The bit mask to use when writing to the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilWriteMask = 0xff;\n\n\t\t/**\n\t\t * The stencil comparison function to use.\n\t\t *\n\t\t * @type {NeverStencilFunc|LessStencilFunc|EqualStencilFunc|LessEqualStencilFunc|GreaterStencilFunc|NotEqualStencilFunc|GreaterEqualStencilFunc|AlwaysStencilFunc}\n\t\t * @default AlwaysStencilFunc\n\t\t */\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\n\t\t/**\n\t\t * The value to use when performing stencil comparisons or stencil operations.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.stencilRef = 0;\n\n\t\t/**\n\t\t * The bit mask to use when comparing against the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilFuncMask = 0xff;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns `false`.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` but the depth test fails.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` and the depth test passes.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZPass = KeepStencilOp;\n\n\t\t/**\n\t\t * Whether stencil operations are performed against the stencil buffer. In\n\t\t * order to perform writes or comparisons against the stencil buffer this\n\t\t * value must be `true`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilWrite = false;\n\n\t\t/**\n\t\t * User-defined clipping planes specified as THREE.Plane objects in world\n\t\t * space. These planes apply to the objects this material is attached to.\n\t\t * Points in space whose signed distance to the plane is negative are clipped\n\t\t * (not rendered). This requires {@link WebGLRenderer#localClippingEnabled} to\n\t\t * be `true`.\n\t\t *\n\t\t * @type {?Array}\n\t\t * @default null\n\t\t */\n\t\tthis.clippingPlanes = null;\n\n\t\t/**\n\t\t * Changes the behavior of clipping planes so that only their intersection is\n\t\t * clipped, rather than their union.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipIntersection = false;\n\n\t\t/**\n\t\t * Defines whether to clip shadows according to the clipping planes specified\n\t\t * on this material.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipShadows = false;\n\n\t\t/**\n\t\t * Defines which side of faces cast shadows. If `null`, the side casting shadows\n\t\t * is determined as follows:\n\t\t *\n\t\t * - When {@link Material#side} is set to `FrontSide`, the back side cast shadows.\n\t\t * - When {@link Material#side} is set to `BackSide`, the front side cast shadows.\n\t\t * - When {@link Material#side} is set to `DoubleSide`, both sides cast shadows.\n\t\t *\n\t\t * @type {?(FrontSide|BackSide|DoubleSide)}\n\t\t * @default null\n\t\t */\n\t\tthis.shadowSide = null;\n\n\t\t/**\n\t\t * Whether to render the material's color.\n\t\t *\n\t\t * This can be used in conjunction with {@link Object3D#renderOder} to create invisible\n\t\t * objects that occlude other objects.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.colorWrite = true;\n\n\t\t/**\n\t\t * Override the renderer's default precision for this material.\n\t\t *\n\t\t * @type {?('highp'|'mediump'|'lowp')}\n\t\t * @default null\n\t\t */\n\t\tthis.precision = null;\n\n\t\t/**\n\t\t * Whether to use polygon offset or not. When enabled, each fragment's depth value will\n\t\t * be offset after it is interpolated from the depth values of the appropriate vertices.\n\t\t * The offset is added before the depth test is performed and before the value is written\n\t\t * into the depth buffer.\n\t\t *\n\t\t * Can be useful for rendering hidden-line images, for applying decals to surfaces, and for\n\t\t * rendering solids with highlighted edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.polygonOffset = false;\n\n\t\t/**\n\t\t * Specifies a scale factor that is used to create a variable depth offset for each polygon.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetFactor = 0;\n\n\t\t/**\n\t\t * Is multiplied by an implementation-specific value to create a constant depth offset.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\t/**\n\t\t * Whether to apply dithering to the color to remove the appearance of banding.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.dithering = false;\n\n\t\t/**\n\t\t * Whether alpha to coverage should be enabled or not. Can only be used with MSAA-enabled contexts\n\t\t * (meaning when the renderer was created with *antialias* parameter set to `true`). Enabling this\n\t\t * will smooth aliasing on clip plane edges and alphaTest-clipped edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaToCoverage = false;\n\n\t\t/**\n\t\t * Whether to premultiply the alpha (transparency) value.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultipliedAlpha = false;\n\n\t\t/**\n\t\t * Whether double-sided, transparent objects should be rendered with a single pass or not.\n\t\t *\n\t\t * The engine renders double-sided, transparent objects with two draw calls (back faces first,\n\t\t * then front faces) to mitigate transparency artifacts. There are scenarios however where this\n\t\t * approach produces no quality gains but still doubles draw calls e.g. when rendering flat\n\t\t * vegetation like grass sprites. In these cases, set the `forceSinglePass` flag to `true` to\n\t\t * disable the two pass rendering to avoid performance issues.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.forceSinglePass = false;\n\n\t\t/**\n\t\t * Whether it's possible to override the material with {@link Scene#overrideMaterial} or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.allowOverride = true;\n\n\t\t/**\n\t\t * Defines whether 3D objects using this material are visible.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * Defines whether this material is tone mapped according to the renderer's tone mapping setting.\n\t\t *\n\t\t * It is ignored when rendering to a render target or using post processing or when using\n\t\t * `WebGPURenderer`. In all these cases, all materials are honored by tone mapping.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.toneMapped = true;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the Material. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Material#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\t/**\n\t * Sets the alpha value to be used when running an alpha test. The material\n\t * will not be rendered if the opacity is lower than this value.\n\t *\n\t * @type {number}\n\t * @readonly\n\t * @default 0\n\t */\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\t/**\n\t * An optional callback that is executed immediately before the material is used to render a 3D object.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Scene} scene - The scene.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\t/**\n\t * An optional callback that is executed immediately before the shader\n\t * program is compiled. This function is called with the shader source code\n\t * as a parameter. Useful for the modification of built-in materials.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}. The\n\t * recommended approach when customizing materials is to use `WebGPURenderer` with the new\n\t * Node Material system and [TSL](https://github.com/mrdoob/three.js/wiki/Three.js-Shading-Language).\n\t *\n\t * @param {{vertexShader:string,fragmentShader:string,uniforms:Object}} shaderobject - The object holds the uniforms and the vertex and fragment shader source.\n\t * @param {WebGLRenderer} renderer - A reference to the renderer.\n\t */\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\t/**\n\t * In case {@link Material#onBeforeCompile} is used, this callback can be used to identify\n\t * values of settings used in `onBeforeCompile()`, so three.js can reuse a cached\n\t * shader or recompile the shader for this material as needed.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @return {string} The custom program cache key.\n\t */\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\t/**\n\t * This method can be used to set default values from parameter objects.\n\t * It is a generic implementation so it can be used with different types\n\t * of materials.\n\t *\n\t * @param {Object} [values] - The material values to set.\n\t */\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\twarn( `Material: parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\twarn( `Material: '${ key }' is not a property of THREE.${ this.type }.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the material into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized material.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRootObject ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity !== undefined && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.sheenColorMap && this.sheenColorMap.isTexture ) {\n\n\t\t\tdata.sheenColorMap = this.sheenColorMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.sheenRoughnessMap && this.sheenRoughnessMap.isTexture ) {\n\n\t\t\tdata.sheenRoughnessMap = this.sheenRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.dispersion !== undefined ) data.dispersion = this.dispersion;\n\n\t\tif ( this.iridescence !== undefined ) data.iridescence = this.iridescence;\n\t\tif ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR;\n\t\tif ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange;\n\n\t\tif ( this.iridescenceMap && this.iridescenceMap.isTexture ) {\n\n\t\t\tdata.iridescenceMap = this.iridescenceMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture ) {\n\n\t\t\tdata.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.anisotropy !== undefined ) data.anisotropy = this.anisotropy;\n\t\tif ( this.anisotropyRotation !== undefined ) data.anisotropyRotation = this.anisotropyRotation;\n\n\t\tif ( this.anisotropyMap && this.anisotropyMap.isTexture ) {\n\n\t\t\tdata.anisotropyMap = this.anisotropyMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapRotation !== undefined ) data.envMapRotation = this.envMapRotation.toArray();\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined && this.attenuationDistance !== Infinity ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors === true ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = true;\n\n\t\tif ( this.blendSrc !== SrcAlphaFactor ) data.blendSrc = this.blendSrc;\n\t\tif ( this.blendDst !== OneMinusSrcAlphaFactor ) data.blendDst = this.blendDst;\n\t\tif ( this.blendEquation !== AddEquation ) data.blendEquation = this.blendEquation;\n\t\tif ( this.blendSrcAlpha !== null ) data.blendSrcAlpha = this.blendSrcAlpha;\n\t\tif ( this.blendDstAlpha !== null ) data.blendDstAlpha = this.blendDstAlpha;\n\t\tif ( this.blendEquationAlpha !== null ) data.blendEquationAlpha = this.blendEquationAlpha;\n\t\tif ( this.blendColor && this.blendColor.isColor ) data.blendColor = this.blendColor.getHex();\n\t\tif ( this.blendAlpha !== 0 ) data.blendAlpha = this.blendAlpha;\n\n\t\tif ( this.depthFunc !== LessEqualDepth ) data.depthFunc = this.depthFunc;\n\t\tif ( this.depthTest === false ) data.depthTest = this.depthTest;\n\t\tif ( this.depthWrite === false ) data.depthWrite = this.depthWrite;\n\t\tif ( this.colorWrite === false ) data.colorWrite = this.colorWrite;\n\n\t\tif ( this.stencilWriteMask !== 0xff ) data.stencilWriteMask = this.stencilWriteMask;\n\t\tif ( this.stencilFunc !== AlwaysStencilFunc ) data.stencilFunc = this.stencilFunc;\n\t\tif ( this.stencilRef !== 0 ) data.stencilRef = this.stencilRef;\n\t\tif ( this.stencilFuncMask !== 0xff ) data.stencilFuncMask = this.stencilFuncMask;\n\t\tif ( this.stencilFail !== KeepStencilOp ) data.stencilFail = this.stencilFail;\n\t\tif ( this.stencilZFail !== KeepStencilOp ) data.stencilZFail = this.stencilZFail;\n\t\tif ( this.stencilZPass !== KeepStencilOp ) data.stencilZPass = this.stencilZPass;\n\t\tif ( this.stencilWrite === true ) data.stencilWrite = this.stencilWrite;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaHash === true ) data.alphaHash = true;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = true;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = true;\n\t\tif ( this.forceSinglePass === true ) data.forceSinglePass = true;\n\n\t\tif ( this.wireframe === true ) data.wireframe = true;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( this.fog === false ) data.fog = false;\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new material with copied values from this instance.\n\t *\n\t * @return {Material} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given material to this instance.\n\t *\n\t * @param {Material} source - The material to copy.\n\t * @return {Material} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\t\tthis.blendColor.copy( source.blendColor );\n\t\tthis.blendAlpha = source.blendAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaHash = source.alphaHash;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\t\tthis.forceSinglePass = source.forceSinglePass;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Material#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the material has been disposed of.\n\t\t *\n\t\t * @event Material#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the material\n\t * needs to be recompiled.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\n/**\n * A material for drawing geometries in a simple shaded (flat or wireframe) way.\n *\n * This material is not affected by lights.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshBasicMaterial\n */\nclass MeshBasicMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh basic material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshBasicMaterial = true;\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Specular map used by the material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst _tables = /*@__PURE__*/ _generateTables();\n\nfunction _generateTables() {\n\n\t// float32 to float16 helpers\n\n\tconst buffer = new ArrayBuffer( 4 );\n\tconst floatView = new Float32Array( buffer );\n\tconst uint32View = new Uint32Array( buffer );\n\n\tconst baseTable = new Uint32Array( 512 );\n\tconst shiftTable = new Uint32Array( 512 );\n\n\tfor ( let i = 0; i < 256; ++ i ) {\n\n\t\tconst e = i - 127;\n\n\t\t// very small number (0, -0)\n\n\t\tif ( e < -27 ) {\n\n\t\t\tbaseTable[ i ] = 0x0000;\n\t\t\tbaseTable[ i | 0x100 ] = 0x8000;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// small number (denorm)\n\n\t\t} else if ( e < -14 ) {\n\n\t\t\tbaseTable[ i ] = 0x0400 >> ( - e - 14 );\n\t\t\tbaseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000;\n\t\t\tshiftTable[ i ] = - e - 1;\n\t\t\tshiftTable[ i | 0x100 ] = - e - 1;\n\n\t\t\t// normal number\n\n\t\t} else if ( e <= 15 ) {\n\n\t\t\tbaseTable[ i ] = ( e + 15 ) << 10;\n\t\t\tbaseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t\t// large number (Infinity, -Infinity)\n\n\t\t} else if ( e < 128 ) {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// stay (NaN, Infinity, -Infinity)\n\n\t\t} else {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t}\n\n\t}\n\n\t// float16 to float32 helpers\n\n\tconst mantissaTable = new Uint32Array( 2048 );\n\tconst exponentTable = new Uint32Array( 64 );\n\tconst offsetTable = new Uint32Array( 64 );\n\n\tfor ( let i = 1; i < 1024; ++ i ) {\n\n\t\tlet m = i << 13; // zero pad mantissa bits\n\t\tlet e = 0; // zero exponent\n\n\t\t// normalized\n\t\twhile ( ( m & 0x00800000 ) === 0 ) {\n\n\t\t\tm <<= 1;\n\t\t\te -= 0x00800000; // decrement exponent\n\n\t\t}\n\n\t\tm &= -8388609; // clear leading 1 bit\n\t\te += 0x38800000; // adjust bias\n\n\t\tmantissaTable[ i ] = m | e;\n\n\t}\n\n\tfor ( let i = 1024; i < 2048; ++ i ) {\n\n\t\tmantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 );\n\n\t}\n\n\tfor ( let i = 1; i < 31; ++ i ) {\n\n\t\texponentTable[ i ] = i << 23;\n\n\t}\n\n\texponentTable[ 31 ] = 0x47800000;\n\texponentTable[ 32 ] = 0x80000000;\n\n\tfor ( let i = 33; i < 63; ++ i ) {\n\n\t\texponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 );\n\n\t}\n\n\texponentTable[ 63 ] = 0xc7800000;\n\n\tfor ( let i = 1; i < 64; ++ i ) {\n\n\t\tif ( i !== 32 ) {\n\n\t\t\toffsetTable[ i ] = 1024;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tfloatView: floatView,\n\t\tuint32View: uint32View,\n\t\tbaseTable: baseTable,\n\t\tshiftTable: shiftTable,\n\t\tmantissaTable: mantissaTable,\n\t\texponentTable: exponentTable,\n\t\toffsetTable: offsetTable\n\t};\n\n}\n\n/**\n * Returns a half precision floating point value (FP16) from the given single\n * precision floating point value (FP32).\n *\n * @param {number} val - A single precision floating point value.\n * @return {number} The FP16 value.\n */\nfunction toHalfFloat( val ) {\n\n\tif ( Math.abs( val ) > 65504 ) warn( 'DataUtils.toHalfFloat(): Value out of range.' );\n\n\tval = clamp( val, -65504, 65504 );\n\n\t_tables.floatView[ 0 ] = val;\n\tconst f = _tables.uint32View[ 0 ];\n\tconst e = ( f >> 23 ) & 0x1ff;\n\treturn _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] );\n\n}\n\n/**\n * Returns a single precision floating point value (FP32) from the given half\n * precision floating point value (FP16).\n *\n * @param {number} val - A half precision floating point value.\n * @return {number} The FP32 value.\n */\nfunction fromHalfFloat( val ) {\n\n\tconst m = val >> 10;\n\t_tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ];\n\treturn _tables.floatView[ 0 ];\n\n}\n\n/**\n * A class containing utility functions for data.\n *\n * @hideconstructor\n */\nclass DataUtils {\n\n\t/**\n\t * Returns a half precision floating point value (FP16) from the given single\n\t * precision floating point value (FP32).\n\t *\n\t * @param {number} val - A single precision floating point value.\n\t * @return {number} The FP16 value.\n\t */\n\tstatic toHalfFloat( val ) {\n\n\t\treturn toHalfFloat( val );\n\n\t}\n\n\t/**\n\t * Returns a single precision floating point value (FP32) from the given half\n\t * precision floating point value (FP16).\n\t *\n\t * @param {number} val - A half precision floating point value.\n\t * @return {number} The FP32 value.\n\t */\n\tstatic fromHalfFloat( val ) {\n\n\t\treturn fromHalfFloat( val );\n\n\t}\n\n}\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\nconst _vector2$1 = /*@__PURE__*/ new Vector2();\n\nlet _id$2 = 0;\n\n/**\n * This class stores data for an attribute (such as vertex positions, face\n * indices, normals, colors, UVs, and any custom attributes ) associated with\n * a geometry, which allows for more efficient passing of data to the GPU.\n *\n * When working with vector-like data, the `fromBufferAttribute( attribute, index )`\n * helper methods on vector and color class might be helpful. E.g. {@link Vector3#fromBufferAttribute}.\n */\nclass BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {TypedArray} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized = false ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferAttribute = true;\n\n\t\t/**\n\t\t * The ID of the buffer attribute.\n\t\t *\n\t\t * @name BufferAttribute#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$2 ++ } );\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The array holding the attribute data. It should have `itemSize * numVertices`\n\t\t * elements, where `numVertices` is the number of vertices in the associated geometry.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of values of the array that should be associated with a particular vertex.\n\t\t * For instance, if this attribute is storing a 3-component vector (such as a position,\n\t\t * normal, or color), then the value should be `3`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * Represents the number of items this buffer attribute stores. It is internally computed\n\t\t * by dividing the `array` length by the `itemSize`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\n\t\t/**\n\t\t * Applies to integer data only. Indicates how the underlying data in the buffer maps to\n\t\t * the values in the GLSL code. For instance, if `array` is an instance of `UInt16Array`,\n\t\t * and `normalized` is `true`, the values `0 - +65535` in the array data will be mapped to\n\t\t * `0.0f - +1.0f` in the GLSL attribute. If `normalized` is `false`, the values will be converted\n\t\t * to floats unmodified, i.e. `65535` becomes `65535.0f`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t *\n\t\t * Note: After the initial use of a buffer, its usage cannot be changed. Instead,\n\t\t * instantiate a new one and set the desired usage before the next render.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * This can be used to only update some components of stored vectors (for example, just the\n\t\t * component related to color). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * Configures the bound GPU type for use in shaders.\n\t\t *\n\t\t * Note: this only has an effect for integer arrays and is not configurable for float arrays.\n\t\t * For lower precision float types, use `Float16BufferAttribute`.\n\t\t *\n\t\t * @type {(FloatType|IntType)}\n\t\t * @default FloatType\n\t\t */\n\t\tthis.gpuType = FloatType;\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * A callback function that is executed after the renderer has transferred the attribute\n\t * array data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the usage of this buffer attribute.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {BufferAttribute} A reference to this buffer attribute.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Copies the values of the given buffer attribute to this instance.\n\t *\n\t * @param {BufferAttribute} source - The buffer attribute to copy.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\t\tthis.gpuType = source.gpuType;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies a vector from the given buffer attribute to this one. The start\n\t * and destination position in the attribute buffers are represented by the\n\t * given indices.\n\t *\n\t * @param {number} index1 - The destination index into this buffer attribute.\n\t * @param {BufferAttribute} attribute - The buffer attribute to copy from.\n\t * @param {number} index2 - The source index into the given buffer attribute.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given array data into this buffer attribute.\n\t *\n\t * @param {(TypedArray|Array)} array - The array to copy.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 matrix to the given attribute. Works with\n\t * item size `2` and `3`.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$9.fromBufferAttribute( this, i );\n\t\t\t\t_vector$9.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 normal matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix3} m - The normal matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3` and with direction vectors.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given array data in the buffer attribute.\n\t *\n\t * @param {(TypedArray|Array)} value - The array data to set.\n\t * @param {number} [offset=0] - The offset in this buffer attribute's array.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tset( value, offset = 0 ) {\n\n\t\t// Matching BufferAttribute constructor, do not normalize the array.\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @return {number} The returned value.\n\t */\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.itemSize + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Sets the given value to the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @param {number} value - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.array[ index * this.itemSize + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The x component.\n\t */\n\tgetX( index ) {\n\n\t\tlet x = this.array[ index * this.itemSize ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\t/**\n\t * Sets the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The y component.\n\t */\n\tgetY( index ) {\n\n\t\tlet y = this.array[ index * this.itemSize + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\t/**\n\t * Sets the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} y - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The z component.\n\t */\n\tgetZ( index ) {\n\n\t\tlet z = this.array[ index * this.itemSize + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\t/**\n\t * Sets the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} z - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The w component.\n\t */\n\tgetW( index ) {\n\n\t\tlet w = this.array[ index * this.itemSize + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\t/**\n\t * Sets the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} w - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x and y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y, z and w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @param {number} w - The value for the w component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given callback function that is executed after the Renderer has transferred\n\t * the attribute array data to the GPU. Can be used to perform clean-up operations after\n\t * the upload when attribute data are not needed anymore on the CPU side.\n\t *\n\t * @param {Function} callback - The `onUpload()` callback.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new buffer attribute with copied values from this instance.\n\t *\n\t * @return {BufferAttribute} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the buffer attribute into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized buffer attribute.\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.from( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int8` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int8BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Int8Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt8` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint8Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt8Clamped` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint8ClampedArray)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int16` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Int16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt16` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Int32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Float16` buffer attribute with\n * a plain `Array` instance.\n *\n * This class automatically converts to and from FP16 via `Uint16Array` since `Float16Array`\n * browser support is still problematic.\n *\n * @augments BufferAttribute\n */\nclass Float16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Uint16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t\tthis.isFloat16BufferAttribute = true;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = fromHalfFloat( this.array[ index * this.itemSize ] );\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = toHalfFloat( x );\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] );\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] );\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] );\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\t\tthis.array[ index + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Float32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Float32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array|Float32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nlet _id$1 = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box$2 = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector$8 = /*@__PURE__*/ new Vector3();\n\n/**\n * A representation of mesh, line, or point geometry. Includes vertex\n * positions, face indices, normals, colors, UVs, and custom attributes\n * within buffers, reducing the cost of passing all this data to the GPU.\n *\n * ```js\n * const geometry = new THREE.BufferGeometry();\n * // create a simple square shape. We duplicate the top left and bottom right\n * // vertices because each vertex needs to appear once per triangle.\n * const vertices = new Float32Array( [\n * \t-1.0, -1.0, 1.0, // v0\n * \t 1.0, -1.0, 1.0, // v1\n * \t 1.0, 1.0, 1.0, // v2\n *\n * \t 1.0, 1.0, 1.0, // v3\n * \t-1.0, 1.0, 1.0, // v4\n * \t-1.0, -1.0, 1.0 // v5\n * ] );\n * // itemSize = 3 because there are 3 values (components) per vertex\n * geometry.setAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );\n * const material = new THREE.MeshBasicMaterial( { color: 0xff0000 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * ```\n *\n * @augments EventDispatcher\n */\nclass BufferGeometry extends EventDispatcher {\n\n\t/**\n\t * Constructs a new geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferGeometry = true;\n\n\t\t/**\n\t\t * The ID of the geometry.\n\t\t *\n\t\t * @name BufferGeometry#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$1 ++ } );\n\n\t\t/**\n\t\t * The UUID of the geometry.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the geometry.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\t/**\n\t\t * Allows for vertices to be re-used across multiple triangles; this is\n\t\t * called using \"indexed triangles\". Each triangle is associated with the\n\t\t * indices of three vertices. This attribute therefore stores the index of\n\t\t * each vertex for each triangular face. If this attribute is not set, the\n\t\t * renderer assumes that each three contiguous positions represent a single triangle.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.index = null;\n\n\t\t/**\n\t\t * A (storage) buffer attribute which was generated with a compute shader and\n\t\t * now defines indirect draw calls.\n\t\t *\n\t\t * Can only be used with {@link WebGPURenderer} and a WebGPU backend.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.indirect = null;\n\n\t\t/**\n\t\t * This dictionary has as id the name of the attribute to be set and as value\n\t\t * the buffer attribute to set it to. Rather than accessing this property directly,\n\t\t * use `setAttribute()` and `getAttribute()` to access attributes of this geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.attributes = {};\n\n\t\t/**\n\t\t * This dictionary holds the morph targets of the geometry.\n\t\t *\n\t\t * Note: Once the geometry has been rendered, the morph attribute data cannot\n\t\t * be changed. You will have to call `dispose()?, and create a new geometry instance.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.morphAttributes = {};\n\n\t\t/**\n\t\t * Used to control the morph target behavior; when set to `true`, the morph\n\t\t * target data is treated as relative offsets, rather than as absolute\n\t\t * positions/normals.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.morphTargetsRelative = false;\n\n\t\t/**\n\t\t * Split the geometry into groups, each of which will be rendered in a\n\t\t * separate draw call. This allows an array of materials to be used with the geometry.\n\t\t *\n\t\t * Use `addGroup()` and `clearGroups()` to edit groups, rather than modifying this array directly.\n\t\t *\n\t\t * Every vertex and index must belong to exactly one group — groups must not share vertices or\n\t\t * indices, and must not leave vertices or indices unused.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.groups = [];\n\n\t\t/**\n\t\t * Bounding box for the geometry which can be calculated with `computeBoundingBox()`.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * Bounding sphere for the geometry which can be calculated with `computeBoundingSphere()`.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Determines the part of the geometry to render. This should not be set directly,\n\t\t * instead use `setDrawRange()`.\n\t\t *\n\t\t * @type {{start:number,count:number}}\n\t\t */\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the geometry.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * Returns the index of this geometry.\n\t *\n\t * @return {?BufferAttribute} The index. Returns `null` if no index is defined.\n\t */\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\t/**\n\t * Sets the given index to this geometry.\n\t *\n\t * @param {Array|BufferAttribute} index - The index to set.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given indirect attribute to this geometry.\n\t *\n\t * @param {BufferAttribute} indirect - The attribute holding indirect draw calls.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetIndirect( indirect ) {\n\n\t\tthis.indirect = indirect;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the indirect attribute of this geometry.\n\t *\n\t * @return {?BufferAttribute} The indirect attribute. Returns `null` if no indirect attribute is defined.\n\t */\n\tgetIndirect() {\n\n\t\treturn this.indirect;\n\n\t}\n\n\t/**\n\t * Returns the buffer attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {BufferAttribute|InterleavedBufferAttribute|undefined} The buffer attribute.\n\t * Returns `undefined` if not attribute has been found.\n\t */\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\t/**\n\t * Sets the given attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @param {BufferAttribute|InterleavedBufferAttribute} attribute - The attribute to set.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes the attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name to delete.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this geometry has an attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {boolean} Whether this geometry has an attribute for the given name or not.\n\t */\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\t/**\n\t * Adds a group to this geometry.\n\t *\n\t * @param {number} start - The first element in this draw call. That is the first\n\t * vertex for non-indexed geometry, otherwise the first triangle index.\n\t * @param {number} count - Specifies how many vertices (or indices) are part of this group.\n\t * @param {number} [materialIndex=0] - The material array index to use.\n\t */\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Clears all groups.\n\t */\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\t/**\n\t * Sets the draw range for this geometry.\n\t *\n\t * @param {number} start - The first vertex for non-indexed geometry, otherwise the first triangle index.\n\t * @param {number} count - For non-indexed BufferGeometry, `count` is the number of vertices to render.\n\t * For indexed BufferGeometry, `count` is the number of indices to render.\n\t */\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 transformation matrix to the geometry.\n\t *\n\t * @param {Matrix4} matrix - The matrix to apply.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the rotation represented by the Quaternion to the geometry.\n\t *\n\t * @param {Quaternion} q - The Quaternion to apply.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the X axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the Y axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the Z axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the geometry. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#position} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} x - The x offset.\n\t * @param {number} y - The y offset.\n\t * @param {number} z - The z offset.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales the geometry. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#scale} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} x - The x scale.\n\t * @param {number} y - The y scale.\n\t * @param {number} z - The z scale.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry to face a point in 3D space. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#lookAt} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {Vector3} vector - The target point.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Center the geometry based on its bounding box.\n\t *\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines a geometry by creating a `position` attribute based on the given array of points. The array\n\t * can hold 2D or 3D vectors. When using two-dimensional data, the `z` coordinate for all vertices is\n\t * set to `0`.\n\t *\n\t * If the method is used with an existing `position` attribute, the vertex data are overwritten with the\n\t * data from the array. The length of the array must match the vertex count.\n\t *\n\t * @param {Array|Array} points - The points.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute === undefined ) {\n\n\t\t\tconst position = [];\n\n\t\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\t} else {\n\n\t\t\tconst l = Math.min( points.length, positionAttribute.count ); // make sure data do not exceed buffer size\n\n\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tpositionAttribute.setXYZ( i, point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tif ( points.length > positionAttribute.count ) {\n\n\t\t\t\twarn( 'BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry.' );\n\n\t\t\t}\n\n\t\t\tpositionAttribute.needsUpdate = true;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the geometry, and updates the `boundingBox` member.\n\t * The bounding box is not computed by the engine; it must be computed by your app.\n\t * You may need to recompute the bounding box if the geometry vertices are modified.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$2.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.min, _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.max, _box$2.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the geometry, and updates the `boundingSphere` member.\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if the geometry vertices are modified.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$2.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$2.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$8.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$8.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$8.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\terror( 'BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calculates and adds a tangent attribute to this geometry.\n\t *\n\t * The computation is only supported for indexed geometries and if position, normal, and uv attributes\n\t * are defined. When using a tangent space normal map, prefer the MikkTSpace algorithm provided by\n\t * {@link BufferGeometryUtils#computeMikkTSpaceTangents} instead.\n\t */\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\terror( 'BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst positionAttribute = attributes.position;\n\t\tconst normalAttribute = attributes.normal;\n\t\tconst uvAttribute = attributes.uv;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * positionAttribute.count ), 4 ) );\n\n\t\t}\n\n\t\tconst tangentAttribute = this.getAttribute( 'tangent' );\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromBufferAttribute( positionAttribute, a );\n\t\t\tvB.fromBufferAttribute( positionAttribute, b );\n\t\t\tvC.fromBufferAttribute( positionAttribute, c );\n\n\t\t\tuvA.fromBufferAttribute( uvAttribute, a );\n\t\t\tuvB.fromBufferAttribute( uvAttribute, b );\n\t\t\tuvC.fromBufferAttribute( uvAttribute, c );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: index.count\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindex.getX( j + 0 ),\n\t\t\t\t\tindex.getX( j + 1 ),\n\t\t\t\t\tindex.getX( j + 2 )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromBufferAttribute( normalAttribute, v );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? -1 : 1.0;\n\n\t\t\ttangentAttribute.setXYZW( v, tmp.x, tmp.y, tmp.z, w );\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( index.getX( j + 0 ) );\n\t\t\t\thandleVertex( index.getX( j + 1 ) );\n\t\t\t\thandleVertex( index.getX( j + 2 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes vertex normals for the given vertex data. For indexed geometries, the method sets\n\t * each vertex normal to be the average of the face normals of the faces that share that vertex.\n\t * For non-indexed geometries, vertices are not shared, and the method sets each vertex normal\n\t * to be the same as the face normal.\n\t */\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Ensures every normal vector in a geometry will have a magnitude of `1`. This will\n\t * correct lighting on the geometry surfaces.\n\t */\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$8.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a new non-index version of this indexed geometry. If the geometry\n\t * is already non-indexed, the method is a NOOP.\n\t *\n\t * @return {BufferGeometry} The non-indexed version of this indexed geometry.\n\t */\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\twarn( 'BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\t/**\n\t * Serializes the geometry into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized geometry.\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = boundingSphere.toJSON();\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new geometry with copied values from this instance.\n\t *\n\t * @return {BufferGeometry} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given geometry to this instance.\n\t *\n\t * @param {BufferGeometry} source - The geometry to copy.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires BufferGeometry#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nconst _inverseMatrix$3 = /*@__PURE__*/ new Matrix4();\nconst _ray$3 = /*@__PURE__*/ new Ray();\nconst _sphere$6 = /*@__PURE__*/ new Sphere();\nconst _sphereHitAt = /*@__PURE__*/ new Vector3();\n\nconst _vA$1 = /*@__PURE__*/ new Vector3();\nconst _vB$1 = /*@__PURE__*/ new Vector3();\nconst _vC$1 = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _morphA = /*@__PURE__*/ new Vector3();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\n/**\n * Class representing triangular polygon mesh based objects.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments Object3D\n */\nclass Mesh extends Object3D {\n\n\t/**\n\t * Constructs a new mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMesh = true;\n\n\t\tthis.type = 'Mesh';\n\n\t\t/**\n\t\t * The mesh geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The mesh material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default MeshBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\t/**\n\t\t * The number of instances of this mesh.\n\t\t * Can only be used with {@link WebGPURenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.count = 1;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Mesh#morphTargetDictionary} and {@link Mesh#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the local-space position of the vertex at the given index, taking into\n\t * account the current animation state of both morph targets and skinning.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * @return {Vector3} The vertex position in local space.\n\t */\n\tgetVertexPosition( index, target ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.attributes.position;\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\n\t\ttarget.fromBufferAttribute( position, index );\n\n\t\tconst morphInfluences = this.morphTargetInfluences;\n\n\t\tif ( morphPosition && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morphAttribute, index );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( target ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttarget.add( _morphA );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$6.copy( geometry.boundingSphere );\n\t\t_sphere$6.applyMatrix4( matrixWorld );\n\n\t\t// check distance from ray origin to bounding sphere\n\n\t\t_ray$3.copy( raycaster.ray ).recast( raycaster.near );\n\n\t\tif ( _sphere$6.containsPoint( _ray$3.origin ) === false ) {\n\n\t\t\tif ( _ray$3.intersectSphere( _sphere$6, _sphereHitAt ) === null ) return;\n\n\t\t\tif ( _ray$3.origin.distanceToSquared( _sphereHitAt ) > ( raycaster.far - raycaster.near ) ** 2 ) return;\n\n\t\t}\n\n\t\t// convert ray to local space of mesh\n\n\t\t_inverseMatrix$3.copy( matrixWorld ).invert();\n\t\t_ray$3.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$3 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray$3.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$3 );\n\n\t}\n\n\t_computeIntersections( raycaster, intersects, rayLocalSpace ) {\n\n\t\tlet intersection;\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\tconst index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\t\tconst uv = geometry.attributes.uv;\n\t\tconst uv1 = geometry.attributes.uv1;\n\t\tconst normal = geometry.attributes.normal;\n\t\tconst groups = geometry.groups;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\tif ( index !== null ) {\n\n\t\t\t// indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( position !== undefined ) {\n\n\t\t\t// non-indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = i;\n\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection$1( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, ( material.side === FrontSide ), point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkGeometryIntersection( object, material, raycaster, ray, uv, uv1, normal, a, b, c ) {\n\n\tobject.getVertexPosition( a, _vA$1 );\n\tobject.getVertexPosition( b, _vB$1 );\n\tobject.getVertexPosition( c, _vC$1 );\n\n\tconst intersection = checkIntersection$1( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tconst barycoord = new Vector3();\n\t\tTriangle.getBarycoord( _intersectionPoint, _vA$1, _vB$1, _vC$1, barycoord );\n\n\t\tif ( uv ) {\n\n\t\t\tintersection.uv = Triangle.getInterpolatedAttribute( uv, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv1 ) {\n\n\t\t\tintersection.uv1 = Triangle.getInterpolatedAttribute( uv1, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( normal ) {\n\n\t\t\tintersection.normal = Triangle.getInterpolatedAttribute( normal, a, b, c, barycoord, new Vector3() );\n\n\t\t\tif ( intersection.normal.dot( ray.direction ) > 0 ) {\n\n\t\t\t\tintersection.normal.multiplyScalar( -1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal );\n\n\t\tintersection.face = face;\n\t\tintersection.barycoord = barycoord;\n\n\t}\n\n\treturn intersection;\n\n}\n\n/**\n * A geometry class for a rectangular cuboid with a given width, height, and depth.\n * On creation, the cuboid is centred on the origin, with each edge parallel to one\n * of the axes.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const cube = new THREE.Mesh( geometry, material );\n * scene.add( cube );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#BoxGeometry\n */\nclass BoxGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new box geometry.\n\t *\n\t * @param {number} [width=1] - The width. That is, the length of the edges parallel to the X axis.\n\t * @param {number} [height=1] - The height. That is, the length of the edges parallel to the Y axis.\n\t * @param {number} [depth=1] - The depth. That is, the length of the edges parallel to the Z axis.\n\t * @param {number} [widthSegments=1] - Number of segmented rectangular faces along the width of the sides.\n\t * @param {number} [heightSegments=1] - Number of segmented rectangular faces along the height of the sides.\n\t * @param {number} [depthSegments=1] - Number of segmented rectangular faces along the depth of the sides.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, -1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, -1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', -1, -1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : -1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {BoxGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\n/**\n * Provides utility functions for managing uniforms.\n *\n * @module UniformsUtils\n */\n\n/**\n * Clones the given uniform definitions by performing a deep-copy. That means\n * if the value of a uniform refers to an object like a Vector3 or Texture,\n * the cloned uniform will refer to a new object reference.\n *\n * @param {Object} src - An object representing uniform definitions.\n * @return {Object} The cloned uniforms.\n */\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tif ( property.isRenderTargetTexture ) {\n\n\t\t\t\t\twarn( 'UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().' );\n\t\t\t\t\tdst[ u ][ p ] = null;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\n/**\n * Merges the given uniform definitions into a single object. Since the\n * method internally uses cloneUniforms(), it performs a deep-copy when\n * producing the merged uniform definitions.\n *\n * @param {Array} uniforms - An array of objects containing uniform definitions.\n * @return {Object} The merged uniforms.\n */\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\nfunction cloneUniformsGroups( src ) {\n\n\tconst dst = [];\n\n\tfor ( let u = 0; u < src.length; u ++ ) {\n\n\t\tdst.push( src[ u ].clone() );\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction getUnlitUniformColorSpace( renderer ) {\n\n\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\tif ( currentRenderTarget === null ) {\n\n\t\t// https://github.com/mrdoob/three.js/pull/23937#issuecomment-1111067398\n\t\treturn renderer.outputColorSpace;\n\n\t}\n\n\t// https://github.com/mrdoob/three.js/issues/27868\n\tif ( currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\treturn currentRenderTarget.texture.colorSpace;\n\n\t}\n\n\treturn ColorManagement.workingColorSpace;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\n/**\n * A material rendered with custom shaders. A shader is a small program written in GLSL.\n * that runs on the GPU. You may want to use a custom shader if you need to implement an\n * effect not included with any of the built-in materials.\n *\n * There are the following notes to bear in mind when using a `ShaderMaterial`:\n *\n * - `ShaderMaterial` can only be used with {@link WebGLRenderer}.\n * - Built in attributes and uniforms are passed to the shaders along with your code. If\n * you don't want that, use {@link RawShaderMaterial} instead.\n * - You can use the directive `#pragma unroll_loop_start` and `#pragma unroll_loop_end`\n * in order to unroll a `for` loop in GLSL by the shader preprocessor. The directive has\n * to be placed right above the loop. The loop formatting has to correspond to a defined standard.\n * - The loop has to be [normalized](https://en.wikipedia.org/wiki/Normalized_loop).\n * - The loop variable has to be *i*.\n * - The value `UNROLLED_LOOP_INDEX` will be replaced with the explicitly\n * value of *i* for the given iteration and can be used in preprocessor\n * statements.\n *\n * ```js\n * const material = new THREE.ShaderMaterial( {\n * \tuniforms: {\n * \t\ttime: { value: 1.0 },\n * \t\tresolution: { value: new THREE.Vector2() }\n * \t},\n * \tvertexShader: document.getElementById( 'vertexShader' ).textContent,\n * \tfragmentShader: document.getElementById( 'fragmentShader' ).textContent\n * } );\n * ```\n *\n * @augments Material\n */\nclass ShaderMaterial extends Material {\n\n\t/**\n\t * Constructs a new shader material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShaderMaterial = true;\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\t/**\n\t\t * Defines custom constants using `#define` directives within the GLSL code\n\t\t * for both the vertex shader and the fragment shader; each key/value pair\n\t\t * yields another directive.\n\t\t * ```js\n\t\t * defines: {\n\t\t * \tFOO: 15,\n\t\t * \tBAR: true\n\t\t * }\n\t\t * ```\n\t\t * Yields the lines:\n\t\t * ```\n\t\t * #define FOO 15\n\t\t * #define BAR true\n\t\t * ```\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.defines = {};\n\n\t\t/**\n\t\t * An object of the form:\n\t\t * ```js\n\t\t * {\n\t\t * \t\"uniform1\": { value: 1.0 },\n\t\t * \t\"uniform2\": { value: 2 }\n\t\t * }\n\t\t * ```\n\t\t * specifying the uniforms to be passed to the shader code; keys are uniform\n\t\t * names, values are definitions of the form\n\t\t * ```\n\t\t * {\n\t\t * \tvalue: 1.0\n\t\t * }\n\t\t * ```\n\t\t * where `value` is the value of the uniform. Names must match the name of\n\t\t * the uniform, as defined in the GLSL code. Note that uniforms are refreshed\n\t\t * on every frame, so updating the value of the uniform will immediately\n\t\t * update the value available to the GLSL code.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = {};\n\n\t\t/**\n\t\t * An array holding uniforms groups for configuring UBOs.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.uniformsGroups = [];\n\n\t\t/**\n\t\t * Vertex shader GLSL code. This is the actual code for the shader.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.vertexShader = default_vertex;\n\n\t\t/**\n\t\t * Fragment shader GLSL code. This is the actual code for the shader.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.fragmentShader = default_fragment;\n\n\t\t/**\n\t\t * Controls line thickness or lines.\n\t\t *\n\t\t * WebGL and WebGPU ignore this setting and always render line primitives with a\n\t\t * width of one pixel.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.linewidth = 1;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Define whether the material color is affected by global fog settings; `true`\n\t\t * to pass fog uniforms to the shader.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.fog = false;\n\n\t\t/**\n\t\t * Defines whether this material uses lighting; `true` to pass uniform data\n\t\t * related to lighting to this shader.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.lights = false;\n\n\t\t/**\n\t\t * Defines whether this material supports clipping; `true` to let the renderer\n\t\t * pass the clippingPlanes uniform.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipping = false;\n\n\t\t/**\n\t\t * Overwritten and set to `true` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.forceSinglePass = true;\n\n\t\t/**\n\t\t * This object allows to enable certain WebGL 2 extensions.\n\t\t *\n\t\t * - clipCullDistance: set to `true` to use vertex shader clipping\n\t\t * - multiDraw: set to `true` to use vertex shader multi_draw / enable gl_DrawID\n\t\t *\n\t\t * @type {{clipCullDistance:false,multiDraw:false}}\n\t\t */\n\t\tthis.extensions = {\n\t\t\tclipCullDistance: false, // set to use vertex shader clipping\n\t\t\tmultiDraw: false // set to use vertex shader multi_draw / enable gl_DrawID\n\t\t};\n\n\t\t/**\n\t\t * When the rendered geometry doesn't include these attributes but the\n\t\t * material does, these default values will be passed to the shaders. This\n\t\t * avoids errors when buffer data is missing.\n\t\t *\n\t\t * - color: [ 1, 1, 1 ]\n\t\t * - uv: [ 0, 0 ]\n\t\t * - uv1: [ 0, 0 ]\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv1': [ 0, 0 ]\n\t\t};\n\n\t\t/**\n\t\t * If set, this calls [gl.bindAttribLocation](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bindAttribLocation)\n\t\t * to bind a generic vertex index to an attribute variable.\n\t\t *\n\t\t * @type {string|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.index0AttributeName = undefined;\n\n\t\t/**\n\t\t * Can be used to force a uniform update while changing uniforms in\n\t\t * {@link Object3D#onBeforeRender}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\t/**\n\t\t * Defines the GLSL version of custom shader code.\n\t\t *\n\t\t * @type {?(GLSL1|GLSL3)}\n\t\t * @default null\n\t\t */\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\t\tthis.uniformsGroups = cloneUniformsGroups( source.uniformsGroups );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tdata.lights = this.lights;\n\t\tdata.clipping = this.clipping;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Abstract base class for cameras. This class should always be inherited\n * when you build a new camera.\n *\n * @abstract\n * @augments Object3D\n */\nclass Camera extends Object3D {\n\n\t/**\n\t * Constructs a new camera.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCamera = true;\n\n\t\tthis.type = 'Camera';\n\n\t\t/**\n\t\t * The inverse of the camera's world matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\t/**\n\t\t * The camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The inverse of the camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The coordinate system in which the camera is used.\n\t\t *\n\t\t * @type {(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t\tthis._reversedDepth = false;\n\n\t}\n\n\t/**\n\t * The flag that indicates whether the camera uses a reversed depth buffer.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t */\n\tget reversedDepth() {\n\n\t\treturn this._reversedDepth;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\tthis.coordinateSystem = source.coordinateSystem;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * This method is overwritten since cameras have a different forward vector compared to other\n\t * 3D objects. A camera looks down its local, negative z-axis by default.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\treturn super.getWorldDirection( target ).negate();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _v3$1 = /*@__PURE__*/ new Vector3();\nconst _minTarget = /*@__PURE__*/ new Vector2();\nconst _maxTarget = /*@__PURE__*/ new Vector2();\n\n/**\n * Camera that uses [perspective projection](https://en.wikipedia.org/wiki/Perspective_(graphical)).\n *\n * This projection mode is designed to mimic the way the human eye sees. It\n * is the most common projection mode used for rendering a 3D scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 45, width / height, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass PerspectiveCamera extends Camera {\n\n\t/**\n\t * Constructs a new perspective camera.\n\t *\n\t * @param {number} [fov=50] - The vertical field of view.\n\t * @param {number} [aspect=1] - The aspect ratio.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPerspectiveCamera = true;\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\t/**\n\t\t * The vertical field of view, from bottom to top of view,\n\t\t * in degrees.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 50\n\t\t */\n\t\tthis.fov = fov;\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link PerspectiveCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link OrthographicCamera}, `0` is not a\n\t\t * valid value for a perspective camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link PerspectiveCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * Object distance used for stereoscopy and depth-of-field effects. This\n\t\t * parameter does not influence the projection matrix unless a\n\t\t * {@link StereoCamera} is being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.focus = 10;\n\n\t\t/**\n\t\t * The aspect ratio, usually the canvas width / canvas height.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = aspect;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * Film size used for the larger axis. Default is `35` (millimeters). This\n\t\t * parameter does not influence the projection matrix unless {@link PerspectiveCamera#filmOffset}\n\t\t * is set to a nonzero value.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 35\n\t\t */\n\t\tthis.filmGauge = 35;\n\n\t\t/**\n\t\t * Horizontal off-center offset in the same unit as {@link PerspectiveCamera#filmGauge}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.filmOffset = 0;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * @param {number} focalLength - Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Returns the focal length from the current {@link PerspectiveCamera#fov} and\n\t * {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The computed focal length.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\t/**\n\t * Returns the current vertical field of view angle in degrees considering {@link PerspectiveCamera#zoom}.\n\t *\n\t * @return {number} The effective FOV.\n\t */\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\t/**\n\t * Returns the width of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Returns the height of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Computes the 2D bounds of the camera's viewable rectangle at a given distance along the viewing direction.\n\t * Sets `minTarget` and `maxTarget` to the coordinates of the lower-left and upper-right corners of the view rectangle.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} minTarget - The lower-left corner of the view rectangle is written into this vector.\n\t * @param {Vector2} maxTarget - The upper-right corner of the view rectangle is written into this vector.\n\t */\n\tgetViewBounds( distance, minTarget, maxTarget ) {\n\n\t\t_v3$1.set( -1, -1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tminTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t\t_v3$1.set( 1, 1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tmaxTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t}\n\n\t/**\n\t * Computes the width and height of the camera's viewable rectangle at a given distance along the viewing direction.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} target - The target vector that is used to store result where x is width and y is height.\n\t * @returns {Vector2} The view size.\n\t */\n\tgetViewSize( distance, target ) {\n\n\t\tthis.getViewBounds( distance, _minTarget, _maxTarget );\n\n\t\treturn target.subVectors( _maxTarget, _minTarget );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *```\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *```\n\t * then for each monitor you would call it like this:\n\t *```js\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * // --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * // --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * // --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * // --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * // --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * // --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t * ```\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = -0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far, this.coordinateSystem, this.reversedDepth );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst fov = -90; // negative fov is not an error\nconst aspect = 1;\n\n/**\n * A special type of camera that is positioned in 3D space to render its surroundings into a\n * cube render target. The render target can then be used as an environment map for rendering\n * realtime reflections in your scene.\n *\n * ```js\n * // Create cube render target\n * const cubeRenderTarget = new THREE.WebGLCubeRenderTarget( 256, { generateMipmaps: true, minFilter: THREE.LinearMipmapLinearFilter } );\n *\n * // Create cube camera\n * const cubeCamera = new THREE.CubeCamera( 1, 100000, cubeRenderTarget );\n * scene.add( cubeCamera );\n *\n * // Create car\n * const chromeMaterial = new THREE.MeshLambertMaterial( { color: 0xffffff, envMap: cubeRenderTarget.texture } );\n * const car = new THREE.Mesh( carGeometry, chromeMaterial );\n * scene.add( car );\n *\n * // Update the render target cube\n * car.visible = false;\n * cubeCamera.position.copy( car.position );\n * cubeCamera.update( renderer, scene );\n *\n * // Render the scene\n * car.visible = true;\n * renderer.render( scene, camera );\n * ```\n *\n * @augments Object3D\n */\nclass CubeCamera extends Object3D {\n\n\t/**\n\t * Constructs a new cube camera.\n\t *\n\t * @param {number} near - The camera's near plane.\n\t * @param {number} far - The camera's far plane.\n\t * @param {WebGLCubeRenderTarget} renderTarget - The cube render target.\n\t */\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\t/**\n\t\t * A reference to the cube render target.\n\t\t *\n\t\t * @type {WebGLCubeRenderTarget}\n\t\t */\n\t\tthis.renderTarget = renderTarget;\n\n\t\t/**\n\t\t * The current active coordinate system.\n\t\t *\n\t\t * @type {?(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t * @default null\n\t\t */\n\t\tthis.coordinateSystem = null;\n\n\t\t/**\n\t\t * The current active mipmap level\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.activeMipmapLevel = 0;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\t/**\n\t * Must be called when the coordinate system of the cube camera is changed.\n\t */\n\tupdateCoordinateSystem() {\n\n\t\tconst coordinateSystem = this.coordinateSystem;\n\n\t\tconst cameras = this.children.concat();\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = cameras;\n\n\t\tfor ( const camera of cameras ) this.remove( camera );\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, 1, 0 );\n\t\t\tcameraPX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, 1, 0 );\n\t\t\tcameraNX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, -1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, 1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, 1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, 1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, -1, 0 );\n\t\t\tcameraPX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, -1, 0 );\n\t\t\tcameraNX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, 1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, -1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, -1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, -1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tfor ( const camera of cameras ) {\n\n\t\t\tthis.add( camera );\n\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calling this method will render the given scene with the given renderer\n\t * into the cube render target of the camera.\n\t *\n\t * @param {(Renderer|WebGLRenderer)} renderer - The renderer.\n\t * @param {Scene} scene - The scene to render.\n\t */\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst { renderTarget, activeMipmapLevel } = this;\n\n\t\tif ( this.coordinateSystem !== renderer.coordinateSystem ) {\n\n\t\t\tthis.coordinateSystem = renderer.coordinateSystem;\n\n\t\t\tthis.updateCoordinateSystem();\n\n\t\t}\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst currentActiveCubeFace = renderer.getActiveCubeFace();\n\t\tconst currentActiveMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\t// mipmaps are generated during the last call of render()\n\t\t// at this point, all sides of the cube render target are defined\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\n/**\n * Creates a cube texture made up of six images.\n *\n * ```js\n * const loader = new THREE.CubeTextureLoader();\n * loader.setPath( 'textures/cube/pisa/' );\n *\n * const textureCube = loader.load( [\n * \t'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'\n * ] );\n *\n * const material = new THREE.MeshBasicMaterial( { color: 0xffffff, envMap: textureCube } );\n * ```\n *\n * @augments Texture\n */\nclass CubeTexture extends Texture {\n\n\t/**\n\t * Constructs a new cube texture.\n\t *\n\t * @param {Array} [images=[]] - An array holding a image for each side of a cube.\n\t * @param {number} [mapping=CubeReflectionMapping] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space value.\n\t */\n\tconstructor( images = [], mapping = CubeReflectionMapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ) {\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t}\n\n\t/**\n\t * Alias for {@link CubeTexture#image}.\n\t *\n\t * @type {Array}\n\t */\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\n/**\n * A cube render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new cube render target.\n\t *\n\t * @param {number} [size=1] - The size of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( size = 1, options = {} ) {\n\n\t\tsuper( size, size, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLCubeRenderTarget = true;\n\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {DataArrayTexture}\n\t\t */\n\t\tthis.texture = new CubeTexture( images );\n\t\tthis._setTextureOptions( options );\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n\t/**\n\t * Converts the given equirectangular texture to a cube map.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Texture} texture - The equirectangular texture.\n\t * @return {WebGLCubeRenderTarget} A reference to this cube render target.\n\t */\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.colorSpace = texture.colorSpace;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Clears this cube render target.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t */\n\tclear( renderer, color = true, depth = true, stencil = true ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\n/**\n * This is almost identical to an {@link Object3D}. Its purpose is to\n * make working with groups of objects syntactically clearer.\n *\n * ```js\n * // Create a group and add the two cubes.\n * // These cubes can now be rotated / scaled etc as a group.\n * const group = new THREE.Group();\n *\n * group.add( meshA );\n * group.add( meshB );\n *\n * scene.add( group );\n * ```\n *\n * @augments Object3D\n */\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGroup = true;\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nconst _moveEvent = { type: 'move' };\n\n/**\n * Class for representing a XR controller with its\n * different coordinate systems.\n *\n * @private\n */\nclass WebXRController {\n\n\t/**\n\t * Constructs a new XR controller.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A group representing the target ray space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._targetRay = null;\n\n\t\t/**\n\t\t * A group representing the grip space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._grip = null;\n\n\t\t/**\n\t\t * A group representing the hand space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._hand = null;\n\n\t}\n\n\t/**\n\t * Returns a group representing the hand space of the XR controller.\n\t *\n\t * @return {Group} A group representing the hand space of the XR controller.\n\t */\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\t/**\n\t * Returns a group representing the target ray space of the XR controller.\n\t *\n\t * @return {Group} A group representing the target ray space of the XR controller.\n\t */\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\t/**\n\t * Returns a group representing the grip space of the XR controller.\n\t *\n\t * @return {Group} A group representing the grip space of the XR controller.\n\t */\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\t/**\n\t * Dispatches the given event to the groups representing\n\t * the different coordinate spaces of the XR controller.\n\t *\n\t * @param {Object} event - The event to dispatch.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects the controller with the given XR input source.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tconnect( inputSource ) {\n\n\t\tif ( inputSource && inputSource.hand ) {\n\n\t\t\tconst hand = this._hand;\n\n\t\t\tif ( hand ) {\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Initialize hand with joints when connected\n\t\t\t\t\tthis._getHandJoint( hand, inputjoint );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects the controller from the given XR input source.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the controller with the given input source, XR frame and reference space.\n\t * This updates the transformations of the groups that represent the different\n\t * coordinate systems of the controller.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @param {XRFrame} frame - The XR frame.\n\t * @param {XRReferenceSpace} referenceSpace - The reference space.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\tconst joint = this._getHandJoint( hand, inputjoint );\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.matrixWorldNeedsUpdate = true;\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\t\t\t\t\t\tgrip.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\t// Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it\n\t\t\t\tif ( inputPose === null && gripPose !== null ) {\n\n\t\t\t\t\tinputPose = gripPose;\n\n\t\t\t\t}\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\t\t\t\t\ttargetRay.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a group representing the hand joint for the given input joint.\n\t *\n\t * @private\n\t * @param {Group} hand - The group representing the hand space.\n\t * @param {XRJointSpace} inputjoint - The hand joint data.\n\t * @return {Group} A group representing the hand joint for the given input joint.\n\t */\n\t_getHandJoint( hand, inputjoint ) {\n\n\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\tconst joint = new Group();\n\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\tjoint.visible = false;\n\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\n\t\t\thand.add( joint );\n\n\t\t}\n\n\t\treturn hand.joints[ inputjoint.jointName ];\n\n\t}\n\n}\n\n/**\n * This class can be used to define an exponential squared fog,\n * which gives a clear view near the camera and a faster than exponentially\n * densening fog farther from the camera.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );\n * ```\n */\nclass FogExp2 {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [density=0.00025] - Defines how fast the fog will grow dense.\n\t */\n\tconstructor( color, density = 0.00025 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFogExp2 = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * Defines how fast the fog will grow dense.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.00025\n\t\t */\n\t\tthis.density = density;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {FogExp2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n}\n\n/**\n * This class can be used to define a linear fog that grows linearly denser\n * with the distance.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );\n * ```\n */\nclass Fog {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [near=1] - The minimum distance to start applying fog.\n\t * @param {number} [far=1000] - The maximum distance at which fog stops being calculated and applied.\n\t */\n\tconstructor( color, near = 1, far = 1000 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFog = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The minimum distance to start applying fog. Objects that are less than\n\t\t * `near` units from the active camera won't be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The maximum distance at which fog stops being calculated and applied.\n\t\t * Objects that are more than `far` units away from the active camera won't\n\t\t * be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1000\n\t\t */\n\t\tthis.far = far;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {Fog} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n}\n\n/**\n * Scenes allow you to set up what is to be rendered and where by three.js.\n * This is where you place 3D objects like meshes, lines or lights.\n *\n * @augments Object3D\n */\nclass Scene extends Object3D {\n\n\t/**\n\t * Constructs a new scene.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isScene = true;\n\n\t\tthis.type = 'Scene';\n\n\t\t/**\n\t\t * Defines the background of the scene. Valid inputs are:\n\t\t *\n\t\t * - A color for defining a uniform colored background.\n\t\t * - A texture for defining a (flat) textured background.\n\t\t * - Cube textures or equirectangular textures for defining a skybox.\n\t\t *\n\t\t * @type {?(Color|Texture)}\n\t\t * @default null\n\t\t */\n\t\tthis.background = null;\n\n\t\t/**\n\t\t * Sets the environment map for all physical materials in the scene. However,\n\t\t * it's not possible to overwrite an existing texture assigned to the `envMap`\n\t\t * material property.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.environment = null;\n\n\t\t/**\n\t\t * A fog instance defining the type of fog that affects everything\n\t\t * rendered in the scene.\n\t\t *\n\t\t * @type {?(Fog|FogExp2)}\n\t\t * @default null\n\t\t */\n\t\tthis.fog = null;\n\n\t\t/**\n\t\t * Sets the blurriness of the background. Only influences environment maps\n\t\t * assigned to {@link Scene#background}. Valid input is a float between `0`\n\t\t * and `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.backgroundBlurriness = 0;\n\n\t\t/**\n\t\t * Attenuates the color of the background. Only applies to background textures.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.backgroundIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the background in radians. Only influences environment maps\n\t\t * assigned to {@link Scene#background}.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.backgroundRotation = new Euler();\n\n\t\t/**\n\t\t * Attenuates the color of the environment. Only influences environment maps\n\t\t * assigned to {@link Scene#environment}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.environmentIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians. Only influences physical materials\n\t\t * in the scene when {@link Scene#environment} is used.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.environmentRotation = new Euler();\n\n\t\t/**\n\t\t * Forces everything in the scene to be rendered with the defined material. It is possible\n\t\t * to exclude materials from override by setting {@link Material#allowOverride} to `false`.\n\t\t *\n\t\t * @type {?Material}\n\t\t * @default null\n\t\t */\n\t\tthis.overrideMaterial = null;\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tthis.backgroundBlurriness = source.backgroundBlurriness;\n\t\tthis.backgroundIntensity = source.backgroundIntensity;\n\t\tthis.backgroundRotation.copy( source.backgroundRotation );\n\n\t\tthis.environmentIntensity = source.environmentIntensity;\n\t\tthis.environmentRotation.copy( source.environmentRotation );\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\tif ( this.backgroundBlurriness > 0 ) data.object.backgroundBlurriness = this.backgroundBlurriness;\n\t\tif ( this.backgroundIntensity !== 1 ) data.object.backgroundIntensity = this.backgroundIntensity;\n\t\tdata.object.backgroundRotation = this.backgroundRotation.toArray();\n\n\t\tif ( this.environmentIntensity !== 1 ) data.object.environmentIntensity = this.environmentIntensity;\n\t\tdata.object.environmentRotation = this.environmentRotation.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * \"Interleaved\" means that multiple attributes, possibly of different types,\n * (e.g., position, normal, uv, color) are packed into a single array buffer.\n *\n * An introduction into interleaved arrays can be found here: [Interleaved array basics](https://blog.tojicode.com/2011/05/interleaved-array-basics.html)\n */\nclass InterleavedBuffer {\n\n\t/**\n\t * Constructs a new interleaved buffer.\n\t *\n\t * @param {TypedArray} array - A typed array with a shared buffer storing attribute data.\n\t * @param {number} stride - The number of typed-array elements per vertex.\n\t */\n\tconstructor( array, stride ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInterleavedBuffer = true;\n\n\t\t/**\n\t\t * A typed array with a shared buffer storing attribute data.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of typed-array elements per vertex.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.stride = stride;\n\n\t\t/**\n\t\t * The total number of elements in the array\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t *\n\t\t * Note: After the initial use of a buffer, its usage cannot be changed. Instead,\n\t\t * instantiate a new one and set the desired usage before the next render.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * This can be used to only update some components of stored vectors (for example, just the\n\t\t * component related to color). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * The UUID of the interleaved buffer.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t}\n\n\t/**\n\t * A callback function that is executed after the renderer has transferred the attribute array\n\t * data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the usage of this interleaved buffer.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {InterleavedBuffer} A reference to this interleaved buffer.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Copies the values of the given interleaved buffer to this instance.\n\t *\n\t * @param {InterleavedBuffer} source - The interleaved buffer to copy.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies a vector from the given interleaved buffer to this one. The start\n\t * and destination position in the attribute buffers are represented by the\n\t * given indices.\n\t *\n\t * @param {number} index1 - The destination index into this interleaved buffer.\n\t * @param {InterleavedBuffer} interleavedBuffer - The interleaved buffer to copy from.\n\t * @param {number} index2 - The source index into the given interleaved buffer.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tcopyAt( index1, interleavedBuffer, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= interleavedBuffer.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = interleavedBuffer.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given array data in the interleaved buffer.\n\t *\n\t * @param {(TypedArray|Array)} value - The array data to set.\n\t * @param {number} [offset=0] - The offset in this interleaved buffer's array.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new interleaved buffer with copied values from this instance.\n\t *\n\t * @param {Object} [data] - An object with shared array buffers that allows to retain shared structures.\n\t * @return {InterleavedBuffer} A clone of this instance.\n\t */\n\tclone( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new this.constructor( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t}\n\n\t/**\n\t * Sets the given callback function that is executed after the Renderer has transferred\n\t * the array data to the GPU. Can be used to perform clean-up operations after\n\t * the upload when data are not needed anymore on the CPU side.\n\t *\n\t * @param {Function} callback - The `onUpload()` callback.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the interleaved buffer into JSON.\n\t *\n\t * @param {Object} [data] - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized interleaved buffer.\n\t */\n\ttoJSON( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.from( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n}\n\nconst _vector$7 = /*@__PURE__*/ new Vector3();\n\n/**\n * An alternative version of a buffer attribute with interleaved data. Interleaved\n * attributes share a common interleaved data storage ({@link InterleavedBuffer}) and refer with\n * different offsets into the buffer.\n */\nclass InterleavedBufferAttribute {\n\n\t/**\n\t * Constructs a new interleaved buffer attribute.\n\t *\n\t * @param {InterleavedBuffer} interleavedBuffer - The buffer holding the interleaved data.\n\t * @param {number} itemSize - The item size.\n\t * @param {number} offset - The attribute offset into the buffer.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( interleavedBuffer, itemSize, offset, normalized = false ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInterleavedBufferAttribute = true;\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The buffer holding the interleaved data.\n\t\t *\n\t\t * @type {InterleavedBuffer}\n\t\t */\n\t\tthis.data = interleavedBuffer;\n\n\t\t/**\n\t\t * The item size, see {@link BufferAttribute#itemSize}.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * The attribute offset into the buffer.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.offset = offset;\n\n\t\t/**\n\t\t * Whether the data are normalized or not, see {@link BufferAttribute#normalized}\n\t\t *\n\t\t * @type {InterleavedBuffer}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t}\n\n\t/**\n\t * The item count of this buffer attribute.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget count() {\n\n\t\treturn this.data.count;\n\n\t}\n\n\t/**\n\t * The array holding the interleaved buffer attribute data.\n\t *\n\t * @type {TypedArray}\n\t */\n\tget array() {\n\n\t\treturn this.data.array;\n\n\t}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tthis.data.needsUpdate = value;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 normal matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix3} m - The normal matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3` and with direction vectors.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @return {number} The returned value.\n\t */\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.data.stride + this.offset + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Sets the given value to the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @param {number} value - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} y - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} z - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} w - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The x component.\n\t */\n\tgetX( index ) {\n\n\t\tlet x = this.data.array[ index * this.data.stride + this.offset ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\t/**\n\t * Returns the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The y component.\n\t */\n\tgetY( index ) {\n\n\t\tlet y = this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\t/**\n\t * Returns the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The z component.\n\t */\n\tgetZ( index ) {\n\n\t\tlet z = this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\t/**\n\t * Returns the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The w component.\n\t */\n\tgetW( index ) {\n\n\t\tlet w = this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\t/**\n\t * Sets the x and y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXY( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y, z and w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @param {number} w - The value for the w component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new buffer attribute with copied values from this instance.\n\t *\n\t * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data.\n\t *\n\t * @param {Object} [data] - An object with interleaved buffers that allows to retain the interleaved property.\n\t * @return {BufferAttribute|InterleavedBufferAttribute} A clone of this instance.\n\t */\n\tclone( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tlog( 'InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the buffer attribute into JSON.\n\t *\n\t * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data.\n\t *\n\t * @param {Object} [data] - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized buffer attribute.\n\t */\n\ttoJSON( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tlog( 'InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// de-interleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interleaved attribute\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * A material for rendering instances of {@link Sprite}.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'textures/sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map, color: 0xffffff } );\n *\n * const sprite = new THREE.Sprite( material );\n * sprite.scale.set(200, 200, 1)\n * scene.add( sprite );\n * ```\n *\n * @augments Material\n */\nclass SpriteMaterial extends Material {\n\n\t/**\n\t * Constructs a new sprite material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpriteMaterial = true;\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The rotation of the sprite in radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Specifies whether size of the sprite is attenuated by the camera depth (perspective camera only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Overwritten since sprite materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _geometry;\n\nconst _intersectPoint = /*@__PURE__*/ new Vector3();\nconst _worldScale = /*@__PURE__*/ new Vector3();\nconst _mvPosition = /*@__PURE__*/ new Vector3();\n\nconst _alignedPosition = /*@__PURE__*/ new Vector2();\nconst _rotatedPosition = /*@__PURE__*/ new Vector2();\nconst _viewWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\n/**\n * A sprite is a plane that always faces towards the camera, generally with a\n * partially transparent texture applied.\n *\n * Sprites do not cast shadows, setting {@link Object3D#castShadow} to `true` will\n * have no effect.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map } );\n *\n * const sprite = new THREE.Sprite( material );\n * scene.add( sprite );\n * ```\n *\n * @augments Object3D\n */\nclass Sprite extends Object3D {\n\n\t/**\n\t * Constructs a new sprite.\n\t *\n\t * @param {(SpriteMaterial|SpriteNodeMaterial)} [material] - The sprite material.\n\t */\n\tconstructor( material = new SpriteMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSprite = true;\n\n\t\tthis.type = 'Sprite';\n\n\t\tif ( _geometry === undefined ) {\n\n\t\t\t_geometry = new BufferGeometry();\n\n\t\t\tconst float32Array = new Float32Array( [\n\t\t\t\t-0.5, -0.5, 0, 0, 0,\n\t\t\t\t0.5, -0.5, 0, 1, 0,\n\t\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t\t-0.5, 0.5, 0, 0, 1\n\t\t\t] );\n\n\t\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t\t}\n\n\t\t/**\n\t\t * The sprite geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = _geometry;\n\n\t\t/**\n\t\t * The sprite material.\n\t\t *\n\t\t * @type {(SpriteMaterial|SpriteNodeMaterial)}\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * The sprite's anchor point, and the point around which the sprite rotates.\n\t\t * A value of `(0.5, 0.5)` corresponds to the midpoint of the sprite. A value\n\t\t * of `(0, 0)` corresponds to the lower left corner of the sprite.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0.5,0.5)\n\t\t */\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t\t/**\n\t\t * The number of instances of this sprite.\n\t\t * Can only be used with {@link WebGPURenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.count = 1;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this sprite.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\terror( 'Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA.set( -0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB.set( 0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA.set( 0, 0 );\n\t\t_uvB.set( 1, 0 );\n\t\t_uvC.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB.set( -0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getInterpolation( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$2 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A component for providing a basic Level of Detail (LOD) mechanism.\n *\n * Every LOD level is associated with an object, and rendering can be switched\n * between them at the distances specified. Typically you would create, say,\n * three meshes, one for far away (low detail), one for mid range (medium\n * detail) and one for close up (high detail).\n *\n * ```js\n * const lod = new THREE.LOD();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n *\n * //Create spheres with 3 levels of detail and create new LOD levels for them\n * for( let i = 0; i < 3; i++ ) {\n *\n * \tconst geometry = new THREE.IcosahedronGeometry( 10, 3 - i );\n * \tconst mesh = new THREE.Mesh( geometry, material );\n * \tlod.addLevel( mesh, i * 75 );\n *\n * }\n *\n * scene.add( lod );\n * ```\n *\n * @augments Object3D\n */\nclass LOD extends Object3D {\n\n\t/**\n\t * Constructs a new LOD.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLOD = true;\n\n\t\t/**\n\t\t * The current LOD index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._currentLevel = 0;\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * This array holds the LOD levels.\n\t\t\t *\n\t\t\t * @name LOD#levels\n\t\t\t * @type {Array<{object:Object3D,distance:number,hysteresis:number}>}\n\t\t\t */\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Whether the LOD object is updated automatically by the renderer per frame\n\t\t * or not. If set to `false`, you have to call {@link LOD#update} in the\n\t\t * render loop by yourself.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance, level.hysteresis );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a mesh that will display at a certain distance and greater. Typically\n\t * the further away the distance, the lower the detail on the mesh.\n\t *\n\t * @param {Object3D} object - The 3D object to display at this level.\n\t * @param {number} [distance=0] - The distance at which to display this level of detail.\n\t * @param {number} [hysteresis=0] - Threshold used to avoid flickering at LOD boundaries, as a fraction of distance.\n\t * @return {LOD} A reference to this instance.\n\t */\n\taddLevel( object, distance = 0, hysteresis = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, hysteresis: hysteresis, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes an existing level, based on the distance from the camera.\n\t * Returns `true` when the level has been removed. Otherwise `false`.\n\t *\n\t * @param {number} distance - Distance of the level to remove.\n\t * @return {boolean} Whether the level has been removed or not.\n\t */\n\tremoveLevel( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0; i < levels.length; i ++ ) {\n\n\t\t\tif ( levels[ i ].distance === distance ) {\n\n\t\t\t\tconst removedElements = levels.splice( i, 1 );\n\t\t\t\tthis.remove( removedElements[ 0 ].object );\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns the currently active LOD level index.\n\t *\n\t * @return {number} The current active LOD level index.\n\t */\n\tgetCurrentLevel() {\n\n\t\treturn this._currentLevel;\n\n\t}\n\n\t/**\n\t * Returns a reference to the first 3D object that is greater than\n\t * the given distance.\n\t *\n\t * @param {number} distance - The LOD distance.\n\t * @return {?Object3D} The found 3D object. `null` if no 3D object has been found.\n\t */\n\tgetObjectForDistance( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance < levelDistance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this LOD.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$2 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the LOD by computing which LOD level should be visible according\n\t * to the current distance of the given camera.\n\t *\n\t * @param {Camera} camera - The camera the scene is rendered with.\n\t */\n\tupdate( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$1.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance >= levelDistance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance,\n\t\t\t\thysteresis: level.hysteresis\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _basePosition = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\n\nconst _vector3 = /*@__PURE__*/ new Vector3();\nconst _matrix4 = /*@__PURE__*/ new Matrix4();\nconst _vertex = /*@__PURE__*/ new Vector3();\n\nconst _sphere$5 = /*@__PURE__*/ new Sphere();\nconst _inverseMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _ray$2 = /*@__PURE__*/ new Ray();\n\n/**\n * A mesh that has a {@link Skeleton} that can then be used to animate the\n * vertices of the geometry with skinning/skeleton animation.\n *\n * Next to a valid skeleton, the skinned mesh requires skin indices and weights\n * as buffer attributes in its geometry. These attribute define which bones affect a single\n * vertex to a certain extend.\n *\n * Typically skinned meshes are not created manually but loaders like {@link GLTFLoader}\n * or {@link FBXLoader } import respective models.\n *\n * @augments Mesh\n * @demo scenes/bones-browser.html\n */\nclass SkinnedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new skinned mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkinnedMesh = true;\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\t/**\n\t\t * `AttachedBindMode` means the skinned mesh shares the same world space as the skeleton.\n\t\t * This is not true when using `DetachedBindMode` which is useful when sharing a skeleton\n\t\t * across multiple skinned meshes.\n\t\t *\n\t\t * @type {(AttachedBindMode|DetachedBindMode)}\n\t\t * @default AttachedBindMode\n\t\t */\n\t\tthis.bindMode = AttachedBindMode;\n\n\t\t/**\n\t\t * The base matrix that is used for the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The base matrix that is used for resetting the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The bounding box of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the skinned mesh, and updates {@link SkinnedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * If the skinned mesh is animated, the bounding box should be recomputed per frame in order to reflect\n\t * the current animation state.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingBox.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the skinned mesh, and updates {@link SkinnedMesh#boundingSphere}.\n\t * The bounding sphere is automatically computed by the engine once when it is needed, e.g., for ray casting\n\t * and view frustum culling. If the skinned mesh is animated, the bounding sphere should be recomputed\n\t * per frame in order to reflect the current animation state.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingSphere.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$5.copy( this.boundingSphere );\n\t\t_sphere$5.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$5 ) === false ) return;\n\n\t\t// convert ray to local space of skinned mesh\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tif ( _ray$2.intersectsBox( this.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$2 );\n\n\t}\n\n\tgetVertexPosition( index, target ) {\n\n\t\tsuper.getVertexPosition( index, target );\n\n\t\tthis.applyBoneTransform( index, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Binds the given skeleton to the skinned mesh.\n\t *\n\t * @param {Skeleton} skeleton - The skeleton to bind.\n\t * @param {Matrix4} [bindMatrix] - The bind matrix. If no bind matrix is provided,\n\t * the skinned mesh's world matrix will be used instead.\n\t */\n\tbind( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.copy( bindMatrix ).invert();\n\n\t}\n\n\t/**\n\t * This method sets the skinned mesh in the rest pose).\n\t */\n\tpose() {\n\n\t\tthis.skeleton.pose();\n\n\t}\n\n\t/**\n\t * Normalizes the skin weights which are defined as a buffer attribute\n\t * in the skinned mesh's geometry.\n\t */\n\tnormalizeSkinWeights() {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.fromBufferAttribute( skinWeight, i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.bindMode === AttachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === DetachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\n\n\t\t} else {\n\n\t\t\twarn( 'SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies the bone transform associated with the given index to the given\n\t * vertex position. Returns the updated vector.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * the skinned mesh's world matrix will be used instead.\n\t * @return {Vector3} The updated vertex position.\n\t */\n\tapplyBoneTransform( index, target ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.copy( target ).applyMatrix4( this.bindMatrix );\n\n\t\ttarget.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix4.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\ttarget.addScaledVector( _vector3.copy( _basePosition ).applyMatrix4( _matrix4 ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n}\n\n/**\n * A bone which is part of a {@link Skeleton}. The skeleton in turn is used by\n * the {@link SkinnedMesh}.\n *\n * ```js\n * const root = new THREE.Bone();\n * const child = new THREE.Bone();\n *\n * root.add( child );\n * child.position.y = 5;\n * ```\n *\n * @augments Object3D\n */\nclass Bone extends Object3D {\n\n\t/**\n\t * Constructs a new bone.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBone = true;\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n}\n\n/**\n * Creates a texture directly from raw buffer data.\n *\n * The interpretation of the data depends on type and format: If the type is\n * `UnsignedByteType`, a `Uint8Array` will be useful for addressing the\n * texel data. If the format is `RGBAFormat`, data needs four values for\n * one texel; Red, Green, Blue and Alpha (typically the opacity).\n *\n * @augments Texture\n */\nclass DataTexture extends Texture {\n\n\t/**\n\t * Constructs a new data texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=NearestFilter] - The mag filter value.\n\t * @param {number} [minFilter=NearestFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDataTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number}}\n\t\t */\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nconst _offsetMatrix = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * Class for representing the armatures in `three.js`. The skeleton\n * is defined by a hierarchy of bones.\n *\n * ```js\n * const bones = [];\n *\n * const shoulder = new THREE.Bone();\n * const elbow = new THREE.Bone();\n * const hand = new THREE.Bone();\n *\n * shoulder.add( elbow );\n * elbow.add( hand );\n *\n * bones.push( shoulder , elbow, hand);\n *\n * shoulder.position.y = -5;\n * elbow.position.y = 0;\n * hand.position.y = 5;\n *\n * const armSkeleton = new THREE.Skeleton( bones );\n * ```\n */\nclass Skeleton {\n\n\t/**\n\t * Constructs a new skeleton.\n\t *\n\t * @param {Array} [bones] - An array of bones.\n\t * @param {Array} [boneInverses] - An array of bone inverse matrices.\n\t * If not provided, these matrices will be computed automatically via {@link Skeleton#calculateInverses}.\n\t */\n\tconstructor( bones = [], boneInverses = [] ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An array of bones defining the skeleton.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t/**\n\t\t * An array of bone inverse matrices.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.boneInverses = boneInverses;\n\n\t\t/**\n\t\t * An array buffer holding the bone data.\n\t\t * Input data for {@link Skeleton#boneTexture}.\n\t\t *\n\t\t * @type {?Float32Array}\n\t\t * @default null\n\t\t */\n\t\tthis.boneMatrices = null;\n\n\t\t/**\n\t\t * A texture holding the bone data for use\n\t\t * in the vertex shader.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.boneTexture = null;\n\n\t\tthis.init();\n\n\t}\n\n\t/**\n\t * Initializes the skeleton. This method gets automatically called by the constructor\n\t * but depending on how the skeleton is created it might be necessary to call this method\n\t * manually.\n\t */\n\tinit() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\twarn( 'Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bone inverse matrices. This method resets {@link Skeleton#boneInverses}\n\t * and fills it with new matrices.\n\t */\n\tcalculateInverses() {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tpose() {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tupdate() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new skeleton with copied values from this instance.\n\t *\n\t * @return {Skeleton} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t}\n\n\t/**\n\t * Computes a data texture for passing bone data to the vertex shader.\n\t *\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tcomputeBoneTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tboneMatrices.set( this.boneMatrices ); // copy current values\n\n\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\tboneTexture.needsUpdate = true;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the skeleton's bone array and returns the first with a\n\t * matching name.\n\t *\n\t * @param {string} name - The name of the bone.\n\t * @return {Bone|undefined} The found bone. `undefined` if no bone has been found.\n\t */\n\tgetBoneByName( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setups the skeleton by the given JSON and bones.\n\t *\n\t * @param {Object} json - The skeleton as serialized JSON.\n\t * @param {Object} bones - An array of bones.\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tfromJSON( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\twarn( 'Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the skeleton into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized skeleton.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * An instanced version of a buffer attribute.\n *\n * @augments BufferAttribute\n */\nclass InstancedBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new instanced buffer attribute.\n\t *\n\t * @param {TypedArray} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t * @param {number} [meshPerAttribute=1] - How often a value of this buffer attribute should be repeated.\n\t */\n\tconstructor( array, itemSize, normalized, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, itemSize, normalized );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedBufferAttribute = true;\n\n\t\t/**\n\t\t * Defines how often a value of this buffer attribute should be repeated. A\n\t\t * value of one means that each value of the instanced attribute is used for\n\t\t * a single instance. A value of two means that each value is used for two\n\t\t * consecutive instances (and so on).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _instanceLocalMatrix = /*@__PURE__*/ new Matrix4();\nconst _instanceWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _box3 = /*@__PURE__*/ new Box3();\nconst _identity = /*@__PURE__*/ new Matrix4();\nconst _mesh$1 = /*@__PURE__*/ new Mesh();\nconst _sphere$4 = /*@__PURE__*/ new Sphere();\n\n/**\n * A special version of a mesh with instanced rendering support. Use\n * this class if you have to render a large number of objects with the same\n * geometry and material(s) but with different world transformations. The usage\n * of 'InstancedMesh' will help you to reduce the number of draw calls and thus\n * improve the overall rendering performance in your application.\n *\n * @augments Mesh\n */\nclass InstancedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new instanced mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array} [material] - The mesh material.\n\t * @param {number} count - The number of instances.\n\t */\n\tconstructor( geometry, material, count ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedMesh = true;\n\n\t\t/**\n\t\t * Represents the local transformation of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMatrixAt}.\n\t\t *\n\t\t * @type {InstancedBufferAttribute}\n\t\t */\n\t\tthis.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );\n\n\t\t/**\n\t\t * Represents the color of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setColorAt}.\n\t\t *\n\t\t * @type {?InstancedBufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.instanceColor = null;\n\n\t\t/**\n\t\t * Represents the morph target weights of all instances. You have to set its\n\t\t * {@link Texture#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMorphAt}.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.morphTexture = null;\n\n\t\t/**\n\t\t * The number of instances.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * The bounding box of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.setMatrixAt( i, _identity );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the instanced mesh, and updates {@link InstancedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * You may need to recompute the bounding box if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_box3.copy( geometry.boundingBox ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingBox.union( _box3 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the instanced mesh, and updates {@link InstancedMesh#boundingSphere}\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_sphere$4.copy( geometry.boundingSphere ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingSphere.union( _sphere$4 );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\n\t\tif ( source.morphTexture !== null ) this.morphTexture = source.morphTexture.clone();\n\t\tif ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();\n\n\t\tthis.count = source.count;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the color of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t */\n\tgetColorAt( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Gets the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t */\n\tgetMatrixAt( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Gets the morph target weights of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object - The target object that is used to store the method's result.\n\t */\n\tgetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tconst len = objectInfluences.length + 1; // All influences + the baseInfluenceSum\n\n\t\tconst dataIndex = index * len + 1; // Skip the baseInfluenceSum at the beginning\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tobjectInfluences[ i ] = array[ dataIndex + i ];\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh$1.geometry = this.geometry;\n\t\t_mesh$1.material = this.material;\n\n\t\tif ( _mesh$1.material === undefined ) return;\n\n\t\t// test with bounding sphere first\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$4.copy( this.boundingSphere );\n\t\t_sphere$4.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$4 ) === false ) return;\n\n\t\t// now test each instance\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh$1.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh$1.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceColor} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The instance color.\n\t */\n\tsetColorAt( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ).fill( 1 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceMatrix} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The local transformation.\n\t */\n\tsetMatrixAt( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Sets the morph target weights to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#morphTexture} to `true` after updating all the influences.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object - A mesh which `morphTargetInfluences` property containing the morph target weights\n\t * of a single instance.\n\t */\n\tsetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst len = objectInfluences.length + 1; // morphBaseInfluence + all influences\n\n\t\tif ( this.morphTexture === null ) {\n\n\t\t\tthis.morphTexture = new DataTexture( new Float32Array( len * this.count ), len, this.count, RedFormat, FloatType );\n\n\t\t}\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tlet morphInfluencesSum = 0;\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t}\n\n\t\tconst morphBaseInfluence = this.geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\tconst dataIndex = len * index;\n\n\t\tarray[ dataIndex ] = morphBaseInfluence;\n\n\t\tarray.set( objectInfluences, dataIndex + 1 );\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\tif ( this.morphTexture !== null ) {\n\n\t\t\tthis.morphTexture.dispose();\n\t\t\tthis.morphTexture = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\n/**\n * A two dimensional surface that extends infinitely in 3D space, represented\n * in [Hessian normal form](http://mathworld.wolfram.com/HessianNormalForm.html)\n * by a unit length normal vector and a constant.\n */\nclass Plane {\n\n\t/**\n\t * Constructs a new plane.\n\t *\n\t * @param {Vector3} [normal=(1,0,0)] - A unit length vector defining the normal of the plane.\n\t * @param {number} [constant=0] - The signed distance from the origin to the plane.\n\t */\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPlane = true;\n\n\t\t/**\n\t\t * A unit length vector defining the normal of the plane.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.normal = normal;\n\n\t\t/**\n\t\t * The signed distance from the origin to the plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.constant = constant;\n\n\t}\n\n\t/**\n\t * Sets the plane components by copying the given values.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {number} constant - The constant.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane components by defining `x`, `y`, `z` as the\n\t * plane normal and `w` as the constant.\n\t *\n\t * @param {number} x - The value for the normal's x component.\n\t * @param {number} y - The value for the normal's y component.\n\t * @param {number} z - The value for the normal's z component.\n\t * @param {number} w - The constant value.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from the given normal and coplanar point (that is a point\n\t * that lies onto the plane).\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Vector3} point - A coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from three coplanar points. The winding order is\n\t * assumed to be counter-clockwise, and determines the direction of\n\t * the plane normal.\n\t *\n\t * @param {Vector3} a - The first coplanar point.\n\t * @param {Vector3} b - The second coplanar point.\n\t * @param {Vector3} c - The third coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given plane to this instance.\n\t *\n\t * @param {Plane} plane - The plane to copy.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Normalizes the plane normal and adjusts the constant accordingly.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Negates both the plane normal and the constant.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnegate() {\n\n\t\tthis.constant *= -1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given point to this plane.\n\t *\n\t * @param {Vector3} point - The point to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given sphere to this plane.\n\t *\n\t * @param {Sphere} sphere - The sphere to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\t/**\n\t * Projects a the given point onto the plane.\n\t *\n\t * @param {Vector3} point - The point to project.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The projected point on the plane.\n\t */\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the intersection point of the passed line and the plane. Returns\n\t * `null` if the line does not intersect. Returns the line's starting point if\n\t * the line is coplanar with the plane.\n\t *\n\t * @param {Line3} line - The line to compute the intersection for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( line.start ).addScaledVector( direction, t );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given line segment intersects with (passes through) the plane.\n\t *\n\t * @param {Line3} line - The line to test.\n\t * @return {boolean} Whether the given line segment intersects with the plane or not.\n\t */\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with the plane.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with the plane or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with the plane.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with the plane or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns a coplanar vector to the plane, by calculating the\n\t * projection of the normal at the origin onto the plane.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The coplanar point.\n\t */\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\t/**\n\t * Apply a 4x4 matrix to the plane. The matrix must be an affine, homogeneous transform.\n\t *\n\t * The optional normal matrix can be pre-computed like so:\n\t * ```js\n\t * const optionalNormalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );\n\t * ```\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @param {Matrix4} [optionalNormalMatrix] - A pre-computed normal matrix.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the plane by the distance defined by the given offset vector.\n\t * Note that this only affects the plane constant and will not affect the normal vector.\n\t *\n\t * @param {Vector3} offset - The offset vector.\n\t * @return {Plane} A reference to this plane.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this plane is equal with the given one.\n\t *\n\t * @param {Plane} plane - The plane to test for equality.\n\t * @return {boolean} Whether this plane is equal with the given one.\n\t */\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\t/**\n\t * Returns a new plane with copied values from this instance.\n\t *\n\t * @return {Plane} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _sphere$3 = /*@__PURE__*/ new Sphere();\nconst _defaultSpriteCenter = /*@__PURE__*/ new Vector2( 0.5, 0.5 );\nconst _vector$6 = /*@__PURE__*/ new Vector3();\n\n/**\n * Frustums are used to determine what is inside the camera's field of view.\n * They help speed up the rendering process - objects which lie outside a camera's\n * frustum can safely be excluded from rendering.\n *\n * This class is mainly intended for use internally by a renderer.\n */\nclass Frustum {\n\n\t/**\n\t * Constructs a new frustum.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t */\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\t/**\n\t\t * This array holds the planes that enclose the frustum.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\t/**\n\t * Sets the frustum planes by copying the given planes.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given frustum to this instance.\n\t *\n\t * @param {Frustum} frustum - The frustum to copy.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the frustum planes from the given projection matrix.\n\t *\n\t * @param {Matrix4} m - The projection matrix.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} coordinateSystem - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tsetFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tplanes[ 4 ].setComponents( me2, me6, me10, me14 ).normalize(); // far\n\t\t\tplanes[ 5 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // near\n\n\t\t} else {\n\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // far\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); // near\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tplanes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize(); // near\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting this frustum.\n\t *\n\t * Note that the 3D object must have a geometry so that the bounding sphere can be calculated.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @return {boolean} Whether the 3D object's bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsObject( object ) {\n\n\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( object.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t} else {\n\n\t\t\tconst geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t}\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting this frustum.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @return {boolean} Whether the sprite is intersecting this frustum or not.\n\t */\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$3.center.set( 0, 0, 0 );\n\n\t\tconst offset = _defaultSpriteCenter.distanceTo( sprite.center );\n\n\t\t_sphere$3.radius = 0.7071067811865476 + offset;\n\t\t_sphere$3.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting this frustum.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting this frustum.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box is intersecting this frustum or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$6.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$6.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$6.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$6 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within the frustum.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the point lies within this frustum or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns a new frustum with copied values from this instance.\n\t *\n\t * @return {Frustum} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _projScreenMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _frustum$1 = /*@__PURE__*/ new Frustum();\n\n/**\n * FrustumArray is used to determine if an object is visible in at least one camera\n * from an array of cameras. This is particularly useful for multi-view renderers.\n*/\nclass FrustumArray {\n\n\t/**\n\t * Constructs a new frustum array.\n\t *\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The coordinate system to use.\n\t\t *\n\t\t * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}\n\t\t * @default WebGLCoordinateSystem\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the 3D object is visible in any camera.\n\t */\n\tintersectsObject( object, cameraArray ) {\n\n\t\tif ( ! cameraArray.isArrayCamera || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsObject( object ) ) {\n\n\t\t\t\treturn true; // Object is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the sprite is visible in any camera.\n\t */\n\tintersectsSprite( sprite, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsSprite( sprite ) ) {\n\n\t\t\t\treturn true; // Sprite is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the sphere is visible in any camera.\n\t */\n\tintersectsSphere( sphere, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsSphere( sphere ) ) {\n\n\t\t\t\treturn true; // Sphere is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the box is visible in any camera.\n\t */\n\tintersectsBox( box, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsBox( box ) ) {\n\n\t\t\t\treturn true; // Box is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within any frustum\n\t * from the camera array.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the point is visible in any camera.\n\t */\n\tcontainsPoint( point, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$2.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$2,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.containsPoint( point ) ) {\n\n\t\t\t\treturn true; // Point is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns a new frustum array with copied values from this instance.\n\t *\n\t * @return {FrustumArray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FrustumArray();\n\n\t}\n\n}\n\nfunction ascIdSort( a, b ) {\n\n\treturn a - b;\n\n}\n\nfunction sortOpaque( a, b ) {\n\n\treturn a.z - b.z;\n\n}\n\nfunction sortTransparent( a, b ) {\n\n\treturn b.z - a.z;\n\n}\n\nclass MultiDrawRenderList {\n\n\tconstructor() {\n\n\t\tthis.index = 0;\n\t\tthis.pool = [];\n\t\tthis.list = [];\n\n\t}\n\n\tpush( start, count, z, index ) {\n\n\t\tconst pool = this.pool;\n\t\tconst list = this.list;\n\t\tif ( this.index >= pool.length ) {\n\n\t\t\tpool.push( {\n\n\t\t\t\tstart: -1,\n\t\t\t\tcount: -1,\n\t\t\t\tz: -1,\n\t\t\t\tindex: -1,\n\n\t\t\t} );\n\n\t\t}\n\n\t\tconst item = pool[ this.index ];\n\t\tlist.push( item );\n\t\tthis.index ++;\n\n\t\titem.start = start;\n\t\titem.count = count;\n\t\titem.z = z;\n\t\titem.index = index;\n\n\t}\n\n\treset() {\n\n\t\tthis.list.length = 0;\n\t\tthis.index = 0;\n\n\t}\n\n}\n\nconst _matrix$1 = /*@__PURE__*/ new Matrix4();\nconst _whiteColor = /*@__PURE__*/ new Color( 1, 1, 1 );\nconst _frustum = /*@__PURE__*/ new Frustum();\nconst _frustumArray = /*@__PURE__*/ new FrustumArray();\nconst _box$1 = /*@__PURE__*/ new Box3();\nconst _sphere$2 = /*@__PURE__*/ new Sphere();\nconst _vector$5 = /*@__PURE__*/ new Vector3();\nconst _forward$1 = /*@__PURE__*/ new Vector3();\nconst _temp = /*@__PURE__*/ new Vector3();\nconst _renderList = /*@__PURE__*/ new MultiDrawRenderList();\nconst _mesh = /*@__PURE__*/ new Mesh();\nconst _batchIntersects = [];\n\n// copies data from attribute \"src\" into \"target\" starting at \"targetOffset\"\nfunction copyAttributeData( src, target, targetOffset = 0 ) {\n\n\tconst itemSize = target.itemSize;\n\tif ( src.isInterleavedBufferAttribute || src.array.constructor !== target.array.constructor ) {\n\n\t\t// use the component getters and setters if the array data cannot\n\t\t// be copied directly\n\t\tconst vertexCount = src.count;\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\ttarget.setComponent( i + targetOffset, c, src.getComponent( i, c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// faster copy approach using typed array set function\n\t\ttarget.array.set( src.array, targetOffset * itemSize );\n\n\t}\n\n\ttarget.needsUpdate = true;\n\n}\n\n// safely copies array contents to a potentially smaller array\nfunction copyArrayContents( src, target ) {\n\n\tif ( src.constructor !== target.constructor ) {\n\n\t\t// if arrays are of a different type (eg due to index size increasing) then data must be per-element copied\n\t\tconst len = Math.min( src.length, target.length );\n\t\tfor ( let i = 0; i < len; i ++ ) {\n\n\t\t\ttarget[ i ] = src[ i ];\n\n\t\t}\n\n\t} else {\n\n\t\t// if the arrays use the same data layout we can use a fast block copy\n\t\tconst len = Math.min( src.length, target.length );\n\t\ttarget.set( new src.constructor( src.buffer, 0, len ) );\n\n\t}\n\n}\n\n/**\n * A special version of a mesh with multi draw batch rendering support. Use\n * this class if you have to render a large number of objects with the same\n * material but with different geometries or world transformations. The usage of\n * `BatchedMesh` will help you to reduce the number of draw calls and thus improve the overall\n * rendering performance in your application.\n *\n * ```js\n * const box = new THREE.BoxGeometry( 1, 1, 1 );\n * const sphere = new THREE.SphereGeometry( 1, 12, 12 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n *\n * // initialize and add geometries into the batched mesh\n * const batchedMesh = new BatchedMesh( 10, 5000, 10000, material );\n * const boxGeometryId = batchedMesh.addGeometry( box );\n * const sphereGeometryId = batchedMesh.addGeometry( sphere );\n *\n * // create instances of those geometries\n * const boxInstancedId1 = batchedMesh.addInstance( boxGeometryId );\n * const boxInstancedId2 = batchedMesh.addInstance( boxGeometryId );\n *\n * const sphereInstancedId1 = batchedMesh.addInstance( sphereGeometryId );\n * const sphereInstancedId2 = batchedMesh.addInstance( sphereGeometryId );\n *\n * // position the geometries\n * batchedMesh.setMatrixAt( boxInstancedId1, boxMatrix1 );\n * batchedMesh.setMatrixAt( boxInstancedId2, boxMatrix2 );\n *\n * batchedMesh.setMatrixAt( sphereInstancedId1, sphereMatrix1 );\n * batchedMesh.setMatrixAt( sphereInstancedId2, sphereMatrix2 );\n *\n * scene.add( batchedMesh );\n * ```\n *\n * @augments Mesh\n */\nclass BatchedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new batched mesh.\n\t *\n\t * @param {number} maxInstanceCount - The maximum number of individual instances planned to be added and rendered.\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries.\n\t * @param {number} [maxIndexCount=maxVertexCount*2] - The maximum number of indices to be used by all unique geometries\n\t * @param {Material|Array} [material] - The mesh material.\n\t */\n\tconstructor( maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {\n\n\t\tsuper( new BufferGeometry(), material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBatchedMesh = true;\n\n\t\t/**\n\t\t * When set ot `true`, the individual objects of a batch are frustum culled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.perObjectFrustumCulled = true;\n\n\t\t/**\n\t\t * When set to `true`, the individual objects of a batch are sorted to improve overdraw-related artifacts.\n\t\t * If the material is marked as \"transparent\" objects are rendered back to front and if not then they are\n\t\t * rendered front to back.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t/**\n\t\t * The bounding box of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered\n\t\t * sort with.\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.customSort = null;\n\n\t\t// stores visible, active, and geometry id per instance and reserved buffer ranges for geometries\n\t\tthis._instanceInfo = [];\n\t\tthis._geometryInfo = [];\n\n\t\t// instance, geometry ids that have been set as inactive, and are available to be overwritten\n\t\tthis._availableInstanceIds = [];\n\t\tthis._availableGeometryIds = [];\n\n\t\t// used to track where the next point is that geometry should be inserted\n\t\tthis._nextIndexStart = 0;\n\t\tthis._nextVertexStart = 0;\n\t\tthis._geometryCount = 0;\n\n\t\t// flags\n\t\tthis._visibilityChanged = true;\n\t\tthis._geometryInitialized = false;\n\n\t\t// cached user options\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\t// buffers for multi draw\n\t\tthis._multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawCount = 0;\n\t\tthis._multiDrawInstances = null;\n\n\t\t// Local matrix per geometry by using data texture\n\t\tthis._matricesTexture = null;\n\t\tthis._indirectTexture = null;\n\t\tthis._colorsTexture = null;\n\n\t\tthis._initMatricesTexture();\n\t\tthis._initIndirectTexture();\n\n\t}\n\n\t/**\n\t * The maximum number of individual instances that can be stored in the batch.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget maxInstanceCount() {\n\n\t\treturn this._maxInstanceCount;\n\n\t}\n\n\t/**\n\t * The instance count.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget instanceCount() {\n\n\t\treturn this._instanceInfo.length - this._availableInstanceIds.length;\n\n\t}\n\n\t/**\n\t * The number of unused vertices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedVertexCount() {\n\n\t\treturn this._maxVertexCount - this._nextVertexStart;\n\n\t}\n\n\t/**\n\t * The number of unused indices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedIndexCount() {\n\n\t\treturn this._maxIndexCount - this._nextIndexStart;\n\n\t}\n\n\t_initMatricesTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 matrices * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 matrices * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 matrices * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst matricesArray = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tconst matricesTexture = new DataTexture( matricesArray, size, size, RGBAFormat, FloatType );\n\n\t\tthis._matricesTexture = matricesTexture;\n\n\t}\n\n\t_initIndirectTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\tconst indirectArray = new Uint32Array( size * size );\n\t\tconst indirectTexture = new DataTexture( indirectArray, size, size, RedIntegerFormat, UnsignedIntType );\n\n\t\tthis._indirectTexture = indirectTexture;\n\n\t}\n\n\t_initColorsTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\t// 4 floats per RGBA pixel initialized to white\n\t\tconst colorsArray = new Float32Array( size * size * 4 ).fill( 1 );\n\t\tconst colorsTexture = new DataTexture( colorsArray, size, size, RGBAFormat, FloatType );\n\t\tcolorsTexture.colorSpace = ColorManagement.workingColorSpace;\n\n\t\tthis._colorsTexture = colorsTexture;\n\n\t}\n\n\t_initializeGeometry( reference ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst maxVertexCount = this._maxVertexCount;\n\t\tconst maxIndexCount = this._maxIndexCount;\n\t\tif ( this._geometryInitialized === false ) {\n\n\t\t\tfor ( const attributeName in reference.attributes ) {\n\n\t\t\t\tconst srcAttribute = reference.getAttribute( attributeName );\n\t\t\t\tconst { array, itemSize, normalized } = srcAttribute;\n\n\t\t\t\tconst dstArray = new array.constructor( maxVertexCount * itemSize );\n\t\t\t\tconst dstAttribute = new BufferAttribute( dstArray, itemSize, normalized );\n\n\t\t\t\tgeometry.setAttribute( attributeName, dstAttribute );\n\n\t\t\t}\n\n\t\t\tif ( reference.getIndex() !== null ) {\n\n\t\t\t\t// Reserve last u16 index for primitive restart.\n\t\t\t\tconst indexArray = maxVertexCount > 65535\n\t\t\t\t\t? new Uint32Array( maxIndexCount )\n\t\t\t\t\t: new Uint16Array( maxIndexCount );\n\n\t\t\t\tgeometry.setIndex( new BufferAttribute( indexArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tthis._geometryInitialized = true;\n\n\t\t}\n\n\t}\n\n\t// Make sure the geometry is compatible with the existing combined geometry attributes\n\t_validateGeometry( geometry ) {\n\n\t\t// check to ensure the geometries are using consistent attributes and indices\n\t\tconst batchGeometry = this.geometry;\n\t\tif ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: All geometries must consistently have \"index\".' );\n\n\t\t}\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\tif ( ! geometry.hasAttribute( attributeName ) ) {\n\n\t\t\t\tthrow new Error( `THREE.BatchedMesh: Added geometry missing \"${ attributeName }\". All geometries must have consistent attributes.` );\n\n\t\t\t}\n\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tif ( srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized ) {\n\n\t\t\t\tthrow new Error( 'THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the instance defined by the given ID.\n\t *\n\t * @param {number} instanceId - The instance to validate.\n\t */\n\tvalidateInstanceId( instanceId ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tif ( instanceId < 0 || instanceId >= instanceInfo.length || instanceInfo[ instanceId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid instanceId ${instanceId}. Instance is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the geometry defined by the given ID.\n\t *\n\t * @param {number} geometryId - The geometry to validate.\n\t */\n\tvalidateGeometryId( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId < 0 || geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid geometryId ${geometryId}. Geometry is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered sort with.\n\t *\n\t * @param {Function} func - The custom sort function.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetCustomSort( func ) {\n\n\t\tthis.customSort = func;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box, updating {@link BatchedMesh#boundingBox}.\n\t * Bounding boxes aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst boundingBox = this.boundingBox;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingBox.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingBox.union( _box$1 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere, updating {@link BatchedMesh#boundingSphere}.\n\t * Bounding spheres aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingSphere.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingSphere.union( _sphere$2 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds a new instance to the batch using the geometry of the given ID and returns\n\t * a new id referring to the new instance to be used by other functions.\n\t *\n\t * @param {number} geometryId - The ID of a previously added geometry via {@link BatchedMesh#addGeometry}.\n\t * @return {number} The instance ID.\n\t */\n\taddInstance( geometryId ) {\n\n\t\tconst atCapacity = this._instanceInfo.length >= this.maxInstanceCount;\n\n\t\t// ensure we're not over geometry\n\t\tif ( atCapacity && this._availableInstanceIds.length === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum item count reached.' );\n\n\t\t}\n\n\t\tconst instanceInfo = {\n\t\t\tvisible: true,\n\t\t\tactive: true,\n\t\t\tgeometryIndex: geometryId,\n\t\t};\n\n\t\tlet drawId = null;\n\n\t\t// Prioritize using previously freed instance ids\n\t\tif ( this._availableInstanceIds.length > 0 ) {\n\n\t\t\tthis._availableInstanceIds.sort( ascIdSort );\n\n\t\t\tdrawId = this._availableInstanceIds.shift();\n\t\t\tthis._instanceInfo[ drawId ] = instanceInfo;\n\n\t\t} else {\n\n\t\t\tdrawId = this._instanceInfo.length;\n\t\t\tthis._instanceInfo.push( instanceInfo );\n\n\t\t}\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\t_matrix$1.identity().toArray( matricesTexture.image.data, drawId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\tconst colorsTexture = this._colorsTexture;\n\t\tif ( colorsTexture ) {\n\n\t\t\t_whiteColor.toArray( colorsTexture.image.data, drawId * 4 );\n\t\t\tcolorsTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn drawId;\n\n\t}\n\n\t/**\n\t * Adds the given geometry to the batch and returns the associated\n\t * geometry id referring to it to be used in other functions.\n\t *\n\t * @param {BufferGeometry} geometry - The geometry to add.\n\t * @param {number} [reservedVertexCount=-1] - Optional parameter specifying the amount of\n\t * vertex buffer space to reserve for the added geometry. This is necessary if it is planned\n\t * to set a new geometry at this index at a later time that is larger than the original geometry.\n\t * Defaults to the length of the given geometry vertex buffer.\n\t * @param {number} [reservedIndexCount=-1] - Optional parameter specifying the amount of index\n\t * buffer space to reserve for the added geometry. This is necessary if it is planned to set a\n\t * new geometry at this index at a later time that is larger than the original geometry. Defaults to\n\t * the length of the given geometry index buffer.\n\t * @return {number} The geometry ID.\n\t */\n\taddGeometry( geometry, reservedVertexCount = -1, reservedIndexCount = -1 ) {\n\n\t\tthis._initializeGeometry( geometry );\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst geometryInfo = {\n\t\t\t// geometry information\n\t\t\tvertexStart: -1,\n\t\t\tvertexCount: -1,\n\t\t\treservedVertexCount: -1,\n\n\t\t\tindexStart: -1,\n\t\t\tindexCount: -1,\n\t\t\treservedIndexCount: -1,\n\n\t\t\t// draw range information\n\t\t\tstart: -1,\n\t\t\tcount: -1,\n\n\t\t\t// state\n\t\t\tboundingBox: null,\n\t\t\tboundingSphere: null,\n\t\t\tactive: true,\n\t\t};\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tgeometryInfo.vertexStart = this._nextVertexStart;\n\t\tgeometryInfo.reservedVertexCount = reservedVertexCount === -1 ? geometry.getAttribute( 'position' ).count : reservedVertexCount;\n\n\t\tconst index = geometry.getIndex();\n\t\tconst hasIndex = index !== null;\n\t\tif ( hasIndex ) {\n\n\t\t\tgeometryInfo.indexStart = this._nextIndexStart;\n\t\t\tgeometryInfo.reservedIndexCount = reservedIndexCount === -1 ? index.count : reservedIndexCount;\n\n\t\t}\n\n\t\tif (\n\t\t\tgeometryInfo.indexStart !== -1 &&\n\t\t\tgeometryInfo.indexStart + geometryInfo.reservedIndexCount > this._maxIndexCount ||\n\t\t\tgeometryInfo.vertexStart + geometryInfo.reservedVertexCount > this._maxVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.' );\n\n\t\t}\n\n\t\t// update id\n\t\tlet geometryId;\n\t\tif ( this._availableGeometryIds.length > 0 ) {\n\n\t\t\tthis._availableGeometryIds.sort( ascIdSort );\n\n\t\t\tgeometryId = this._availableGeometryIds.shift();\n\t\t\tgeometryInfoList[ geometryId ] = geometryInfo;\n\n\n\t\t} else {\n\n\t\t\tgeometryId = this._geometryCount;\n\t\t\tthis._geometryCount ++;\n\t\t\tgeometryInfoList.push( geometryInfo );\n\n\t\t}\n\n\t\t// update the geometry\n\t\tthis.setGeometryAt( geometryId, geometry );\n\n\t\t// increment the next geometry position\n\t\tthis._nextIndexStart = geometryInfo.indexStart + geometryInfo.reservedIndexCount;\n\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Replaces the geometry at the given ID with the provided geometry. Throws an error if there\n\t * is not enough space reserved for geometry. Calling this will change all instances that are\n\t * rendering that geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry that should be replaced with the given geometry.\n\t * @param {BufferGeometry} geometry - The new geometry.\n\t * @return {number} The geometry ID.\n\t */\n\tsetGeometryAt( geometryId, geometry ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum geometry count reached.' );\n\n\t\t}\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst batchGeometry = this.geometry;\n\t\tconst hasIndex = batchGeometry.getIndex() !== null;\n\t\tconst dstIndex = batchGeometry.getIndex();\n\t\tconst srcIndex = geometry.getIndex();\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif (\n\t\t\thasIndex &&\n\t\t\tsrcIndex.count > geometryInfo.reservedIndexCount ||\n\t\t\tgeometry.attributes.position.count > geometryInfo.reservedVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space not large enough for provided geometry.' );\n\n\t\t}\n\n\t\t// copy geometry buffer data over\n\t\tconst vertexStart = geometryInfo.vertexStart;\n\t\tconst reservedVertexCount = geometryInfo.reservedVertexCount;\n\t\tgeometryInfo.vertexCount = geometry.getAttribute( 'position' ).count;\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\t// copy attribute data\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tcopyAttributeData( srcAttribute, dstAttribute, vertexStart );\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tconst itemSize = srcAttribute.itemSize;\n\t\t\tfor ( let i = srcAttribute.count, l = reservedVertexCount; i < l; i ++ ) {\n\n\t\t\t\tconst index = vertexStart + i;\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tdstAttribute.setComponent( index, c, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdstAttribute.needsUpdate = true;\n\t\t\tdstAttribute.addUpdateRange( vertexStart * itemSize, reservedVertexCount * itemSize );\n\n\t\t}\n\n\t\t// copy index\n\t\tif ( hasIndex ) {\n\n\t\t\tconst indexStart = geometryInfo.indexStart;\n\t\t\tconst reservedIndexCount = geometryInfo.reservedIndexCount;\n\t\t\tgeometryInfo.indexCount = geometry.getIndex().count;\n\n\t\t\t// copy index data over\n\t\t\tfor ( let i = 0; i < srcIndex.count; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart + srcIndex.getX( i ) );\n\n\t\t\t}\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tfor ( let i = srcIndex.count, l = reservedIndexCount; i < l; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart );\n\n\t\t\t}\n\n\t\t\tdstIndex.needsUpdate = true;\n\t\t\tdstIndex.addUpdateRange( indexStart, geometryInfo.reservedIndexCount );\n\n\t\t}\n\n\t\t// update the draw range\n\t\tgeometryInfo.start = hasIndex ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\t\tgeometryInfo.count = hasIndex ? geometryInfo.indexCount : geometryInfo.vertexCount;\n\n\t\t// store the bounding boxes\n\t\tgeometryInfo.boundingBox = null;\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tgeometryInfo.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\tgeometryInfo.boundingSphere = null;\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tgeometryInfo.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Deletes the geometry defined by the given ID from this batch. Any instances referencing\n\t * this geometry will also be removed as a side effect.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteGeometry( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t// delete any instances associated with this geometry\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active && instanceInfo[ i ].geometryIndex === geometryId ) {\n\n\t\t\t\tthis.deleteInstance( i );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometryInfoList[ geometryId ].active = false;\n\t\tthis._availableGeometryIds.push( geometryId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes an existing instance from the batch using the given ID.\n\t *\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteInstance( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tthis._instanceInfo[ instanceId ].active = false;\n\t\tthis._availableInstanceIds.push( instanceId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Repacks the sub geometries in [name] to remove any unused space remaining from\n\t * previously deleted geometry, freeing up space to add new geometry.\n\t *\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\toptimize() {\n\n\t\t// track the next indices to copy data to\n\t\tlet nextVertexStart = 0;\n\t\tlet nextIndexStart = 0;\n\n\t\t// Iterate over all geometry ranges in order sorted from earliest in the geometry buffer to latest\n\t\t// in the geometry buffer. Because draw range objects can be reused there is no guarantee of their order.\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst indices = geometryInfoList\n\t\t\t.map( ( e, i ) => i )\n\t\t\t.sort( ( a, b ) => {\n\n\t\t\t\treturn geometryInfoList[ a ].vertexStart - geometryInfoList[ b ].vertexStart;\n\n\t\t\t} );\n\n\t\tconst geometry = this.geometry;\n\t\tfor ( let i = 0, l = geometryInfoList.length; i < l; i ++ ) {\n\n\t\t\t// if a geometry range is inactive then don't copy anything\n\t\t\tconst index = indices[ i ];\n\t\t\tconst geometryInfo = geometryInfoList[ index ];\n\t\t\tif ( geometryInfo.active === false ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// if a geometry contains an index buffer then shift it, as well\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\tif ( geometryInfo.indexStart !== nextIndexStart ) {\n\n\t\t\t\t\tconst { indexStart, vertexStart, reservedIndexCount } = geometryInfo;\n\t\t\t\t\tconst index = geometry.index;\n\t\t\t\t\tconst array = index.array;\n\n\t\t\t\t\t// shift the index pointers based on how the vertex data will shift\n\t\t\t\t\t// adjusting the index must happen first so the original vertex start value is available\n\t\t\t\t\tconst elementDelta = nextVertexStart - vertexStart;\n\t\t\t\t\tfor ( let j = indexStart; j < indexStart + reservedIndexCount; j ++ ) {\n\n\t\t\t\t\t\tarray[ j ] = array[ j ] + elementDelta;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tindex.array.copyWithin( nextIndexStart, indexStart, indexStart + reservedIndexCount );\n\t\t\t\t\tindex.addUpdateRange( nextIndexStart, reservedIndexCount );\n\n\t\t\t\t\tgeometryInfo.indexStart = nextIndexStart;\n\n\t\t\t\t}\n\n\t\t\t\tnextIndexStart += geometryInfo.reservedIndexCount;\n\n\t\t\t}\n\n\t\t\t// if a geometry needs to be moved then copy attribute data to overwrite unused space\n\t\t\tif ( geometryInfo.vertexStart !== nextVertexStart ) {\n\n\t\t\t\tconst { vertexStart, reservedVertexCount } = geometryInfo;\n\t\t\t\tconst attributes = geometry.attributes;\n\t\t\t\tfor ( const key in attributes ) {\n\n\t\t\t\t\tconst attribute = attributes[ key ];\n\t\t\t\t\tconst { array, itemSize } = attribute;\n\t\t\t\t\tarray.copyWithin( nextVertexStart * itemSize, vertexStart * itemSize, ( vertexStart + reservedVertexCount ) * itemSize );\n\t\t\t\t\tattribute.addUpdateRange( nextVertexStart * itemSize, reservedVertexCount * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tgeometryInfo.vertexStart = nextVertexStart;\n\n\t\t\t}\n\n\t\t\tnextVertexStart += geometryInfo.reservedVertexCount;\n\t\t\tgeometryInfo.start = geometry.index ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\n\t\t\t// step the next geometry points to the shifted position\n\t\t\tthis._nextIndexStart = geometry.index ? geometryInfo.indexStart + geometryInfo.reservedIndexCount : 0;\n\t\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the bounding box for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding box for.\n\t * @param {Box3} target - The target object that is used to store the method's result.\n\t * @return {?Box3} The geometry's bounding box. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingBoxAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding box\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingBox === null ) {\n\n\t\t\tconst box = new Box3();\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\tbox.expandByPoint( _vector$5.fromBufferAttribute( position, iv ) );\n\n\t\t\t}\n\n\t\t\tgeometryInfo.boundingBox = box;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingBox );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the bounding sphere for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding sphere for.\n\t * @param {Sphere} target - The target object that is used to store the method's result.\n\t * @return {?Sphere} The geometry's bounding sphere. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingSphereAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding sphere\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingSphere === null ) {\n\n\t\t\tconst sphere = new Sphere();\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 );\n\t\t\t_box$1.getCenter( sphere.center );\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet maxRadiusSq = 0;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\t_vector$5.fromBufferAttribute( position, iv );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, sphere.center.distanceToSquared( _vector$5 ) );\n\n\t\t\t}\n\n\t\t\tsphere.radius = Math.sqrt( maxRadiusSq );\n\t\t\tgeometryInfo.boundingSphere = sphere;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingSphere );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance.\n\t * Negatively scaled matrices are not supported.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the matrix of.\n\t * @param {Matrix4} matrix - A 4x4 matrix representing the local transformation of a single instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst matricesArray = this._matricesTexture.image.data;\n\t\tmatrix.toArray( matricesArray, instanceId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the matrix of.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t * @return {Matrix4} The instance's local transformation matrix.\n\t */\n\tgetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn matrix.fromArray( this._matricesTexture.image.data, instanceId * 16 );\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the color of.\n\t * @param {Color} color - The color to set the instance to.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._colorsTexture === null ) {\n\n\t\t\tthis._initColorsTexture();\n\n\t\t}\n\n\t\tcolor.toArray( this._colorsTexture.image.data, instanceId * 4 );\n\t\tthis._colorsTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the color of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the color of.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t * @return {Color} The instance's color.\n\t */\n\tgetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn color.fromArray( this._colorsTexture.image.data, instanceId * 4 );\n\n\t}\n\n\t/**\n\t * Sets the visibility of the instance.\n\t *\n\t * @param {number} instanceId - The id of the instance to set the visibility of.\n\t * @param {boolean} visible - Whether the instance is visible or not.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetVisibleAt( instanceId, visible ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._instanceInfo[ instanceId ].visible === visible ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis._instanceInfo[ instanceId ].visible = visible;\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the visibility state of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the visibility state of.\n\t * @return {boolean} Whether the instance is visible or not.\n\t */\n\tgetVisibleAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].visible;\n\n\t}\n\n\t/**\n\t * Sets the geometry ID of the instance at the given index.\n\t *\n\t * @param {number} instanceId - The ID of the instance to set the geometry ID of.\n\t * @param {number} geometryId - The geometry ID to be use by the instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetGeometryIdAt( instanceId, geometryId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tthis._instanceInfo[ instanceId ].geometryIndex = geometryId;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the geometry ID of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the geometry ID of.\n\t * @return {number} The instance's geometry ID.\n\t */\n\tgetGeometryIdAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].geometryIndex;\n\n\t}\n\n\t/**\n\t * Get the range representing the subset of triangles related to the attached geometry,\n\t * indicating the starting offset and count, or `null` if invalid.\n\t *\n\t * @param {number} geometryId - The id of the geometry to get the range of.\n\t * @param {Object} [target] - The target object that is used to store the method's result.\n\t * @return {{\n\t * \tvertexStart:number,vertexCount:number,reservedVertexCount:number,\n\t * \tindexStart:number,indexCount:number,reservedIndexCount:number,\n\t * \tstart:number,count:number\n\t * }} The result object with range data.\n\t */\n\tgetGeometryRangeAt( geometryId, target = {} ) {\n\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\ttarget.vertexStart = geometryInfo.vertexStart;\n\t\ttarget.vertexCount = geometryInfo.vertexCount;\n\t\ttarget.reservedVertexCount = geometryInfo.reservedVertexCount;\n\n\t\ttarget.indexStart = geometryInfo.indexStart;\n\t\ttarget.indexCount = geometryInfo.indexCount;\n\t\ttarget.reservedIndexCount = geometryInfo.reservedIndexCount;\n\n\t\ttarget.start = geometryInfo.start;\n\t\ttarget.count = geometryInfo.count;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Resizes the necessary buffers to support the provided number of instances.\n\t * If the provided arguments shrink the number of instances but there are not enough\n\t * unused Ids at the end of the list then an error is thrown.\n\t *\n\t * @param {number} maxInstanceCount - The max number of individual instances that can be added and rendered by the batch.\n\t*/\n\tsetInstanceCount( maxInstanceCount ) {\n\n\t\t// shrink the available instances as much as possible\n\t\tconst availableInstanceIds = this._availableInstanceIds;\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tavailableInstanceIds.sort( ascIdSort );\n\t\twhile ( availableInstanceIds[ availableInstanceIds.length - 1 ] === instanceInfo.length - 1 ) {\n\n\t\t\tinstanceInfo.pop();\n\t\t\tavailableInstanceIds.pop();\n\n\t\t}\n\n\t\t// throw an error if it can't be shrunk to the desired size\n\t\tif ( maxInstanceCount < instanceInfo.length ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Instance ids outside the range ${ maxInstanceCount } are being used. Cannot shrink instance count.` );\n\n\t\t}\n\n\t\t// copy the multi draw counts\n\t\tconst multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tconst multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tcopyArrayContents( this._multiDrawCounts, multiDrawCounts );\n\t\tcopyArrayContents( this._multiDrawStarts, multiDrawStarts );\n\n\t\tthis._multiDrawCounts = multiDrawCounts;\n\t\tthis._multiDrawStarts = multiDrawStarts;\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\n\t\t// update texture data for instance sampling\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst colorsTexture = this._colorsTexture;\n\n\t\tindirectTexture.dispose();\n\t\tthis._initIndirectTexture();\n\t\tcopyArrayContents( indirectTexture.image.data, this._indirectTexture.image.data );\n\n\t\tmatricesTexture.dispose();\n\t\tthis._initMatricesTexture();\n\t\tcopyArrayContents( matricesTexture.image.data, this._matricesTexture.image.data );\n\n\t\tif ( colorsTexture ) {\n\n\t\t\tcolorsTexture.dispose();\n\t\t\tthis._initColorsTexture();\n\t\t\tcopyArrayContents( colorsTexture.image.data, this._colorsTexture.image.data );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resizes the available space in the batch's vertex and index buffer attributes to the provided sizes.\n\t * If the provided arguments shrink the geometry buffers but there is not enough unused space at the\n\t * end of the geometry attributes then an error is thrown.\n\t *\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries to resize to.\n\t * @param {number} maxIndexCount - The maximum number of indices to be used by all unique geometries to resize to.\n\t*/\n\tsetGeometrySize( maxVertexCount, maxIndexCount ) {\n\n\t\t// Check if we can shrink to the requested vertex attribute size\n\t\tconst validRanges = [ ...this._geometryInfo ].filter( info => info.active );\n\t\tconst requiredVertexLength = Math.max( ...validRanges.map( range => range.vertexStart + range.reservedVertexCount ) );\n\t\tif ( requiredVertexLength > maxVertexCount ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Geometry vertex values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t}\n\n\t\t// Check if we can shrink to the requested index attribute size\n\t\tif ( this.geometry.index ) {\n\n\t\t\tconst requiredIndexLength = Math.max( ...validRanges.map( range => range.indexStart + range.reservedIndexCount ) );\n\t\t\tif ( requiredIndexLength > maxIndexCount ) {\n\n\t\t\t\tthrow new Error( `BatchedMesh: Geometry index values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\t// dispose of the previous geometry\n\t\tconst oldGeometry = this.geometry;\n\t\toldGeometry.dispose();\n\n\t\t// recreate the geometry needed based on the previous variant\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\tif ( this._geometryInitialized ) {\n\n\t\t\tthis._geometryInitialized = false;\n\t\t\tthis.geometry = new BufferGeometry();\n\t\t\tthis._initializeGeometry( oldGeometry );\n\n\t\t}\n\n\t\t// copy data from the previous geometry\n\t\tconst geometry = this.geometry;\n\t\tif ( oldGeometry.index ) {\n\n\t\t\tcopyArrayContents( oldGeometry.index.array, geometry.index.array );\n\n\t\t}\n\n\t\tfor ( const key in oldGeometry.attributes ) {\n\n\t\t\tcopyArrayContents( oldGeometry.attributes[ key ].array, geometry.attributes[ key ].array );\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst batchGeometry = this.geometry;\n\n\t\t// iterate over each geometry\n\t\t_mesh.material = this.material;\n\t\t_mesh.geometry.index = batchGeometry.index;\n\t\t_mesh.geometry.attributes = batchGeometry.attributes;\n\t\tif ( _mesh.geometry.boundingBox === null ) {\n\n\t\t\t_mesh.geometry.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( _mesh.geometry.boundingSphere === null ) {\n\n\t\t\t_mesh.geometry.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( ! instanceInfo[ i ].visible || ! instanceInfo[ i ].active ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t_mesh.geometry.setDrawRange( geometryInfo.start, geometryInfo.count );\n\n\t\t\t// get the intersects\n\t\t\tthis.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );\n\t\t\tthis.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );\n\t\t\tthis.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );\n\t\t\t_mesh.raycast( raycaster, _batchIntersects );\n\n\t\t\t// add batch id to the intersects\n\t\t\tfor ( let j = 0, l = _batchIntersects.length; j < l; j ++ ) {\n\n\t\t\t\tconst intersect = _batchIntersects[ j ];\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersect.batchId = i;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_batchIntersects.length = 0;\n\n\t\t}\n\n\t\t_mesh.material = null;\n\t\t_mesh.geometry.index = null;\n\t\t_mesh.geometry.attributes = {};\n\t\t_mesh.geometry.setDrawRange( 0, Infinity );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.geometry = source.geometry.clone();\n\t\tthis.perObjectFrustumCulled = source.perObjectFrustumCulled;\n\t\tthis.sortObjects = source.sortObjects;\n\t\tthis.boundingBox = source.boundingBox !== null ? source.boundingBox.clone() : null;\n\t\tthis.boundingSphere = source.boundingSphere !== null ? source.boundingSphere.clone() : null;\n\n\t\tthis._geometryInfo = source._geometryInfo.map( info => ( {\n\t\t\t...info,\n\n\t\t\tboundingBox: info.boundingBox !== null ? info.boundingBox.clone() : null,\n\t\t\tboundingSphere: info.boundingSphere !== null ? info.boundingSphere.clone() : null,\n\t\t} ) );\n\t\tthis._instanceInfo = source._instanceInfo.map( info => ( { ...info } ) );\n\n\t\tthis._availableInstanceIds = source._availableInstanceIds.slice();\n\t\tthis._availableGeometryIds = source._availableGeometryIds.slice();\n\n\t\tthis._nextIndexStart = source._nextIndexStart;\n\t\tthis._nextVertexStart = source._nextVertexStart;\n\t\tthis._geometryCount = source._geometryCount;\n\n\t\tthis._maxInstanceCount = source._maxInstanceCount;\n\t\tthis._maxVertexCount = source._maxVertexCount;\n\t\tthis._maxIndexCount = source._maxIndexCount;\n\n\t\tthis._geometryInitialized = source._geometryInitialized;\n\t\tthis._multiDrawCounts = source._multiDrawCounts.slice();\n\t\tthis._multiDrawStarts = source._multiDrawStarts.slice();\n\n\t\tthis._indirectTexture = source._indirectTexture.clone();\n\t\tthis._indirectTexture.image.data = this._indirectTexture.image.data.slice();\n\n\t\tthis._matricesTexture = source._matricesTexture.clone();\n\t\tthis._matricesTexture.image.data = this._matricesTexture.image.data.slice();\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture = source._colorsTexture.clone();\n\t\t\tthis._colorsTexture.image.data = this._colorsTexture.image.data.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// Assuming the geometry is not shared with other meshes\n\t\tthis.geometry.dispose();\n\n\t\tthis._matricesTexture.dispose();\n\t\tthis._matricesTexture = null;\n\n\t\tthis._indirectTexture.dispose();\n\t\tthis._indirectTexture = null;\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture.dispose();\n\t\t\tthis._colorsTexture = null;\n\n\t\t}\n\n\t}\n\n\tonBeforeRender( renderer, scene, camera, geometry, material/*, _group*/ ) {\n\n\t\t// if visibility has not changed and frustum culling and object sorting is not required\n\t\t// then skip iterating over all items\n\t\tif ( ! this._visibilityChanged && ! this.perObjectFrustumCulled && ! this.sortObjects ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// the indexed version of the multi draw function requires specifying the start\n\t\t// offset in bytes.\n\t\tconst index = geometry.getIndex();\n\t\tconst bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst multiDrawStarts = this._multiDrawStarts;\n\t\tconst multiDrawCounts = this._multiDrawCounts;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst indirectArray = indirectTexture.image.data;\n\n\t\tconst frustum = camera.isArrayCamera ? _frustumArray : _frustum;\n\t\t// prepare the frustum in the local frame\n\t\tif ( perObjectFrustumCulled && ! camera.isArrayCamera ) {\n\n\t\t\t_matrix$1\n\t\t\t\t.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse )\n\t\t\t\t.multiply( this.matrixWorld );\n\n\t\t\t_frustum.setFromProjectionMatrix(\n\t\t\t\t_matrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t}\n\n\t\tlet multiDrawCount = 0;\n\t\tif ( this.sortObjects ) {\n\n\t\t\t// get the camera position in the local frame\n\t\t\t_matrix$1.copy( this.matrixWorld ).invert();\n\t\t\t_vector$5.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _matrix$1 );\n\t\t\t_forward$1.set( 0, 0, -1 ).transformDirection( camera.matrixWorld ).transformDirection( _matrix$1 );\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\tculled = ! frustum.intersectsSphere( _sphere$2, camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\t// get the distance from camera used for sorting\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tconst z = _temp.subVectors( _sphere$2.center, _vector$5 ).dot( _forward$1 );\n\t\t\t\t\t\t_renderList.push( geometryInfo.start, geometryInfo.count, z, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Sort the draw ranges and prep for rendering\n\t\t\tconst list = _renderList.list;\n\t\t\tconst customSort = this.customSort;\n\t\t\tif ( customSort === null ) {\n\n\t\t\t\tlist.sort( material.transparent ? sortTransparent : sortOpaque );\n\n\t\t\t} else {\n\n\t\t\t\tcustomSort.call( this, list, camera );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = list.length; i < l; i ++ ) {\n\n\t\t\t\tconst item = list[ i ];\n\t\t\t\tmultiDrawStarts[ multiDrawCount ] = item.start * bytesPerElement;\n\t\t\t\tmultiDrawCounts[ multiDrawCount ] = item.count;\n\t\t\t\tindirectArray[ multiDrawCount ] = item.index;\n\t\t\t\tmultiDrawCount ++;\n\n\t\t\t}\n\n\t\t\t_renderList.reset();\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\t\t\t\tculled = ! frustum.intersectsSphere( _sphere$2, camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tmultiDrawStarts[ multiDrawCount ] = geometryInfo.start * bytesPerElement;\n\t\t\t\t\t\tmultiDrawCounts[ multiDrawCount ] = geometryInfo.count;\n\t\t\t\t\t\tindirectArray[ multiDrawCount ] = i;\n\t\t\t\t\t\tmultiDrawCount ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tindirectTexture.needsUpdate = true;\n\t\tthis._multiDrawCount = multiDrawCount;\n\t\tthis._visibilityChanged = false;\n\n\t}\n\n\tonBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial/* , group */ ) {\n\n\t\tthis.onBeforeRender( renderer, null, shadowCamera, geometry, depthMaterial );\n\n\t}\n\n}\n\n/**\n * A material for rendering line primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n * ```\n *\n * @augments Material\n */\nclass LineBasicMaterial extends Material {\n\n\t/**\n\t * Constructs a new line basic material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineBasicMaterial = true;\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * Sets the color of the lines using data from a texture. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * Controls line thickness or lines.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}. WebGL and WebGPU\n\t\t * ignore this setting and always render line primitives with a\n\t\t * width of one pixel.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.linewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of line ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('butt'|'round'|'square')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.linecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of line joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.linejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vStart = /*@__PURE__*/ new Vector3();\nconst _vEnd = /*@__PURE__*/ new Vector3();\n\nconst _inverseMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _ray$1 = /*@__PURE__*/ new Ray();\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\n\nconst _intersectPointOnRay = /*@__PURE__*/ new Vector3();\nconst _intersectPointOnSegment = /*@__PURE__*/ new Vector3();\n\n/**\n * A continuous line. The line are rendered by connecting consecutive\n * vertices with straight lines.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0x0000ff } );\n *\n * const points = [];\n * points.push( new THREE.Vector3( - 10, 0, 0 ) );\n * points.push( new THREE.Vector3( 0, 10, 0 ) );\n * points.push( new THREE.Vector3( 10, 0, 0 ) );\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments Object3D\n */\nclass Line extends Object3D {\n\n\t/**\n\t * Constructs a new line.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLine = true;\n\n\t\tthis.type = 'Line';\n\n\t\t/**\n\t\t * The line geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default LineBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes an array of distance values which are necessary for rendering dashed lines.\n\t * For each vertex in the geometry, the method calculates the cumulative length from the\n\t * current point to the very beginning of the line.\n\t *\n\t * @return {Line} A reference to this line.\n\t */\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t_vStart.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t_vEnd.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i ] += _vStart.distanceTo( _vEnd );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\twarn( 'Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere );\n\t\t_sphere$1.applyMatrix4( matrixWorld );\n\t\t_sphere$1.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst a = index.getX( i );\n\t\t\t\tconst b = index.getX( i + 1 );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst a = index.getX( end - 1 );\n\t\t\t\tconst b = index.getX( start );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, i, i + 1, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, end - 1, start, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Line#morphTargetDictionary} and {@link Line#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection( object, raycaster, ray, thresholdSq, a, b, i ) {\n\n\tconst positionAttribute = object.geometry.attributes.position;\n\n\t_vStart.fromBufferAttribute( positionAttribute, a );\n\t_vEnd.fromBufferAttribute( positionAttribute, b );\n\n\tconst distSq = ray.distanceSqToSegment( _vStart, _vEnd, _intersectPointOnRay, _intersectPointOnSegment );\n\n\tif ( distSq > thresholdSq ) return;\n\n\t_intersectPointOnRay.applyMatrix4( object.matrixWorld ); // Move back to world space for distance calculation\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectPointOnRay );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\treturn {\n\n\t\tdistance: distance,\n\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t// point: raycaster.ray.at( distance ),\n\t\tpoint: _intersectPointOnSegment.clone().applyMatrix4( object.matrixWorld ),\n\t\tindex: i,\n\t\tface: null,\n\t\tfaceIndex: null,\n\t\tbarycoord: null,\n\t\tobject: object\n\n\t};\n\n}\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\n/**\n * A series of lines drawn between pairs of vertices.\n *\n * @augments Line\n */\nclass LineSegments extends Line {\n\n\t/**\n\t * Constructs a new line segments.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineSegments = true;\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [];\n\n\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t_start.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t_end.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\twarn( 'LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A continuous line. This is nearly the same as {@link Line} the only difference\n * is that the last vertex is connected with the first vertex in order to close\n * the line to form a loop.\n *\n * @augments Line\n */\nclass LineLoop extends Line {\n\n\t/**\n\t * Constructs a new line loop.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineLoop = true;\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n}\n\n/**\n * A material for rendering point primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const vertices = [];\n *\n * for ( let i = 0; i < 10000; i ++ ) {\n * \tconst x = THREE.MathUtils.randFloatSpread( 2000 );\n * \tconst y = THREE.MathUtils.randFloatSpread( 2000 );\n * \tconst z = THREE.MathUtils.randFloatSpread( 2000 );\n *\n * \tvertices.push( x, y, z );\n * }\n *\n * const geometry = new THREE.BufferGeometry();\n * geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) );\n * const material = new THREE.PointsMaterial( { color: 0x888888 } );\n * const points = new THREE.Points( geometry, material );\n * scene.add( points );\n * ```\n *\n * @augments Material\n */\nclass PointsMaterial extends Material {\n\n\t/**\n\t * Constructs a new points material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointsMaterial = true;\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Defines the size of the points in pixels.\n\t\t *\n\t\t * Might be capped if the value exceeds hardware dependent parameters like [gl.ALIASED_POINT_SIZE_RANGE](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParamete).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = 1;\n\n\t\t/**\n\t\t * Specifies whether size of individual points is attenuated by the camera depth (perspective camera only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position$2 = /*@__PURE__*/ new Vector3();\n\n/**\n * A class for displaying points or point clouds.\n *\n * @augments Object3D\n */\nclass Points extends Object3D {\n\n\t/**\n\t * Constructs a new point cloud.\n\t *\n\t * @param {BufferGeometry} [geometry] - The points geometry.\n\t * @param {Material|Array} [material] - The points material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPoints = true;\n\n\t\tthis.type = 'Points';\n\n\t\t/**\n\t\t * The points geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array}\n\t\t * @default PointsMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this point cloud.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\t\t_sphere.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\tconst a = index.getX( i );\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\ttestPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\ttestPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Points#morphTargetDictionary} and {@link Points#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tfaceIndex: null,\n\t\t\tbarycoord: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * A texture for use with a video.\n *\n * ```js\n * // assuming you have created a HTML video element with id=\"video\"\n * const video = document.getElementById( 'video' );\n * const texture = new THREE.VideoTexture( video );\n * ```\n *\n * Note: When using video textures with {@link WebGPURenderer}, {@link Texture#colorSpace} must be\n * set to THREE.SRGBColorSpace.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments Texture\n */\nclass VideoTexture extends Texture {\n\n\t/**\n\t * Constructs a new video texture.\n\t *\n\t * @param {HTMLVideoElement} video - The video element to use as a data source for the texture.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( video, mapping, wrapS, wrapT, magFilter = LinearFilter, minFilter = LinearFilter, format, type, anisotropy ) {\n\n\t\tsuper( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVideoTexture = true;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * The video frame request callback identifier, which is a positive integer.\n\t\t *\n\t\t * Value of 0 represents no scheduled rVFC.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t */\n\t\tthis._requestVideoFrameCallbackId = 0;\n\n\t\tconst scope = this;\n\n\t\tfunction updateVideo() {\n\n\t\t\tscope.needsUpdate = true;\n\t\t\tscope._requestVideoFrameCallbackId = video.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\t\tthis._requestVideoFrameCallbackId = video.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t}\n\n\t/**\n\t * This method is called automatically by the renderer and sets {@link Texture#needsUpdate}\n\t * to `true` every time a new frame is available.\n\t *\n\t * Only relevant if `requestVideoFrameCallback` is not supported in the browser.\n\t */\n\tupdate() {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this._requestVideoFrameCallbackId !== 0 ) {\n\n\t\t\tthis.source.data.cancelVideoFrameCallback( this._requestVideoFrameCallbackId );\n\n\t\t\tthis._requestVideoFrameCallbackId = 0;\n\n\t\t}\n\n\t\tsuper.dispose();\n\n\t}\n\n}\n\n/**\n * This class can be used as an alternative way to define video data. Instead of using\n * an instance of `HTMLVideoElement` like with `VideoTexture`, `VideoFrameTexture` expects each frame is\n * defined manually via {@link VideoFrameTexture#setFrame}. A typical use case for this module is when\n * video frames are decoded with the WebCodecs API.\n *\n * ```js\n * const texture = new THREE.VideoFrameTexture();\n * texture.setFrame( frame );\n * ```\n *\n * @augments VideoTexture\n */\nclass VideoFrameTexture extends VideoTexture {\n\n\t/**\n\t * Constructs a new video frame texture.\n\t *\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( {}, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVideoFrameTexture = true;\n\n\t}\n\n\t/**\n\t * This method overwritten with an empty implementation since\n\t * this type of texture is updated via `setFrame()`.\n\t */\n\tupdate() {}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this ); // restoring Texture.clone()\n\n\t}\n\n\t/**\n\t * Sets the current frame of the video. This will automatically update the texture\n\t * so the data can be used for rendering.\n\t *\n\t * @param {VideoFrame} frame - The video frame.\n\t */\n\tsetFrame( frame ) {\n\n\t\tthis.image = frame;\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * This class can only be used in combination with `copyFramebufferToTexture()` methods\n * of renderers. It extracts the contents of the current bound framebuffer and provides it\n * as a texture for further usage.\n *\n * ```js\n * const pixelRatio = window.devicePixelRatio;\n * const textureSize = 128 * pixelRatio;\n *\n * const frameTexture = new FramebufferTexture( textureSize, textureSize );\n *\n * // calculate start position for copying part of the frame data\n * const vector = new Vector2();\n * vector.x = ( window.innerWidth * pixelRatio / 2 ) - ( textureSize / 2 );\n * vector.y = ( window.innerHeight * pixelRatio / 2 ) - ( textureSize / 2 );\n *\n * renderer.render( scene, camera );\n *\n * // copy part of the rendered frame into the framebuffer texture\n * renderer.copyFramebufferToTexture( frameTexture, vector );\n * ```\n *\n * @augments Texture\n */\nclass FramebufferTexture extends Texture {\n\n\t/**\n\t * Constructs a new framebuffer texture.\n\t *\n\t * @param {number} [width] - The width of the texture.\n\t * @param {number} [height] - The height of the texture.\n\t */\n\tconstructor( width, height ) {\n\n\t\tsuper( { width, height } );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFramebufferTexture = true;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default to disable filtering.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default to disable filtering.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * Creates a texture based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments Texture\n */\nclass CompressedTexture extends Texture {\n\n\t/**\n\t * Constructs a new compressed texture.\n\t *\n\t * @param {Array} mipmaps - This array holds for all mipmaps (including the bases mip)\n\t * the data and dimensions.\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedTexture = true;\n\n\t\t/**\n\t\t * The image property of a compressed texture just defines its dimensions.\n\t\t *\n\t\t * @type {{width:number,height:number}}\n\t\t */\n\t\tthis.image = { width: width, height: height };\n\n\t\t/**\n\t\t * This array holds for all mipmaps (including the bases mip) the data and dimensions.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.mipmaps = mipmaps;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default since it is not possible to\n\t\t * flip compressed textures.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default since it is not\n\t\t * possible to generate mipmaps for compressed data. Mipmaps\n\t\t * must be embedded in the compressed texture file.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n}\n\n/**\n * Creates a texture 2D array based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments CompressedTexture\n */\nclass CompressedArrayTexture extends CompressedTexture {\n\n\t/**\n\t * Constructs a new compressed array texture.\n\t *\n\t * @param {Array} mipmaps - This array holds for all mipmaps (including the bases mip)\n\t * the data and dimensions.\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} depth - The depth of the texture.\n\t * @param {number} [format=RGBAFormat] - The min filter value.\n\t * @param {number} [type=UnsignedByteType] - The min filter value.\n\t */\n\tconstructor( mipmaps, width, height, depth, format, type ) {\n\n\t\tsuper( mipmaps, width, height, format, type );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedArrayTexture = true;\n\n\t\t/**\n\t\t * The image property of a compressed texture just defines its dimensions.\n\t\t *\n\t\t * @name CompressedArrayTexture#image\n\t\t * @type {{width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image.depth = depth;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t *\n\t\t * @type {Set}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\t/**\n\t * Describes that a specific layer of the texture needs to be updated.\n\t * Normally when {@link Texture#needsUpdate} is set to `true`, the\n\t * entire compressed texture array is sent to the GPU. Marking specific\n\t * layers will only transmit subsets of all mipmaps associated with a\n\t * specific depth in the array which is often much more performant.\n\t *\n\t * @param {number} layerIndex - The layer index that should be updated.\n\t */\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\t/**\n\t * Resets the layer updates registry.\n\t */\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\n/**\n * Creates a cube texture based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments CompressedTexture\n */\nclass CompressedCubeTexture extends CompressedTexture {\n\n\t/**\n\t * Constructs a new compressed texture.\n\t *\n\t * @param {Array} images - An array of compressed textures.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t */\n\tconstructor( images, format, type ) {\n\n\t\tsuper( undefined, images[ 0 ].width, images[ 0 ].height, format, type, CubeReflectionMapping );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedCubeTexture = true;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.image = images;\n\n\t}\n\n}\n\n/**\n * Creates a texture from a canvas element.\n *\n * This is almost the same as the base texture class, except that it sets {@link Texture#needsUpdate}\n * to `true` immediately since a canvas can directly be used for rendering.\n *\n * @augments Texture\n */\nclass CanvasTexture extends Texture {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {HTMLCanvasElement} [canvas] - The HTML canvas element.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCanvasTexture = true;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * This class can be used to automatically save the depth information of a\n * rendering into a texture.\n *\n * @augments Texture\n */\nclass DepthTexture extends Texture {\n\n\t/**\n\t * Constructs a new depth texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} [type=UnsignedIntType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {number} [format=DepthFormat] - The texture format.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( width, height, type = UnsignedIntType, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, format = DepthFormat, depth = 1 ) {\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tconst image = { width: width, height: height, depth: depth };\n\n\t\tsuper( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDepthTexture = true;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * Code corresponding to the depth compare function.\n\t\t *\n\t\t * @type {?(NeverCompare|LessCompare|EqualCompare|LessEqualCompare|GreaterCompare|NotEqualCompare|GreaterEqualCompare|AlwaysCompare)}\n\t\t * @default null\n\t\t */\n\t\tthis.compareFunction = null;\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.source = new Source( Object.assign( {}, source.image ) ); // see #30540\n\t\tthis.compareFunction = source.compareFunction;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.compareFunction !== null ) data.compareFunction = this.compareFunction;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents a texture created externally with the same renderer context.\n *\n * This may be a texture from a protected media stream, device camera feed,\n * or other data feeds like a depth sensor.\n *\n * Note that this class is only supported in {@link WebGLRenderer}, and in\n * the {@link WebGPURenderer} WebGPU backend.\n *\n * @augments Texture\n */\nclass ExternalTexture extends Texture {\n\n\t/**\n\t * Creates a new raw texture.\n\t *\n\t * @param {?(WebGLTexture|GPUTexture)} [sourceTexture=null] - The external texture.\n\t */\n\tconstructor( sourceTexture = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The external source texture.\n\t\t *\n\t\t * @type {?(WebGLTexture|GPUTexture)}\n\t\t * @default null\n\t\t */\n\t\tthis.sourceTexture = sourceTexture;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isExternalTexture = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sourceTexture = source.sourceTexture;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a capsule.\n *\n * ```js\n * const geometry = new THREE.CapsuleGeometry( 1, 1, 4, 8, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const capsule = new THREE.Mesh( geometry, material );\n * scene.add( capsule );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CapsuleGeometry\n */\nclass CapsuleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new capsule geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the capsule.\n\t * @param {number} [height=1] - Height of the middle section.\n\t * @param {number} [capSegments=4] - Number of curve segments used to build each cap.\n\t * @param {number} [radialSegments=8] - Number of segmented faces around the circumference of the capsule. Must be an integer >= 3.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the middle section. Must be an integer >= 1.\n\t */\n\tconstructor( radius = 1, height = 1, capSegments = 4, radialSegments = 8, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t};\n\n\t\theight = Math.max( 0, height );\n\t\tcapSegments = Math.max( 1, Math.floor( capSegments ) );\n\t\tradialSegments = Math.max( 3, Math.floor( radialSegments ) );\n\t\theightSegments = Math.max( 1, Math.floor( heightSegments ) );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst halfHeight = height / 2;\n\t\tconst capArcLength = ( Math.PI / 2 ) * radius;\n\t\tconst cylinderPartLength = height;\n\t\tconst totalArcLength = 2 * capArcLength + cylinderPartLength;\n\n\t\tconst numVerticalSegments = capSegments * 2 + heightSegments;\n\t\tconst verticesPerRow = radialSegments + 1;\n\n\t\tconst normal = new Vector3();\n\t\tconst vertex = new Vector3();\n\n\t\t// generate vertices, normals, and uvs\n\n\t\tfor ( let iy = 0; iy <= numVerticalSegments; iy ++ ) {\n\n\t\t\tlet currentArcLength = 0;\n\t\t\tlet profileY = 0;\n\t\t\tlet profileRadius = 0;\n\t\t\tlet normalYComponent = 0;\n\n\t\t\tif ( iy <= capSegments ) {\n\n\t\t\t\t// bottom cap\n\t\t\t\tconst segmentProgress = iy / capSegments;\n\t\t\t\tconst angle = ( segmentProgress * Math.PI ) / 2;\n\t\t\t\tprofileY = - halfHeight - radius * Math.cos( angle );\n\t\t\t\tprofileRadius = radius * Math.sin( angle );\n\t\t\t\tnormalYComponent = - radius * Math.cos( angle );\n\t\t\t\tcurrentArcLength = segmentProgress * capArcLength;\n\n\t\t\t} else if ( iy <= capSegments + heightSegments ) {\n\n\t\t\t\t// middle section\n\t\t\t\tconst segmentProgress = ( iy - capSegments ) / heightSegments;\n\t\t\t\tprofileY = - halfHeight + segmentProgress * height;\n\t\t\t\tprofileRadius = radius;\n\t\t\t\tnormalYComponent = 0;\n\t\t\t\tcurrentArcLength = capArcLength + segmentProgress * cylinderPartLength;\n\n\t\t\t} else {\n\n\t\t\t\t// top cap\n\t\t\t\tconst segmentProgress =\n\t\t\t\t\t( iy - capSegments - heightSegments ) / capSegments;\n\t\t\t\tconst angle = ( segmentProgress * Math.PI ) / 2;\n\t\t\t\tprofileY = halfHeight + radius * Math.sin( angle );\n\t\t\t\tprofileRadius = radius * Math.cos( angle );\n\t\t\t\tnormalYComponent = radius * Math.sin( angle );\n\t\t\t\tcurrentArcLength =\n\t\t\t\t\tcapArcLength + cylinderPartLength + segmentProgress * capArcLength;\n\n\t\t\t}\n\n\t\t\tconst v = Math.max( 0, Math.min( 1, currentArcLength / totalArcLength ) );\n\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / radialSegments;\n\n\t\t\t} else if ( iy === numVerticalSegments ) {\n\n\t\t\t\tuOffset = -0.5 / radialSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= radialSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / radialSegments;\n\t\t\t\tconst theta = u * Math.PI * 2;\n\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - profileRadius * cosTheta;\n\t\t\t\tvertex.y = profileY;\n\t\t\t\tvertex.z = profileRadius * sinTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set(\n\t\t\t\t\t- profileRadius * cosTheta,\n\t\t\t\t\tnormalYComponent,\n\t\t\t\t\tprofileRadius * sinTheta\n\t\t\t\t);\n\t\t\t\tnormal.normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, v );\n\n\t\t\t}\n\n\t\t\tif ( iy > 0 ) {\n\n\t\t\t\tconst prevIndexRow = ( iy - 1 ) * verticesPerRow;\n\t\t\t\tfor ( let ix = 0; ix < radialSegments; ix ++ ) {\n\n\t\t\t\t\tconst i1 = prevIndexRow + ix;\n\t\t\t\t\tconst i2 = prevIndexRow + ix + 1;\n\t\t\t\t\tconst i3 = iy * verticesPerRow + ix;\n\t\t\t\t\tconst i4 = iy * verticesPerRow + ix + 1;\n\n\t\t\t\t\tindices.push( i1, i2, i3 );\n\t\t\t\t\tindices.push( i2, i4, i3 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CapsuleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.height, data.capSegments, data.radialSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A simple shape of Euclidean geometry. It is constructed from a\n * number of triangular segments that are oriented around a central point and\n * extend as far out as a given radius. It is built counter-clockwise from a\n * start angle and a given central angle. It can also be used to create\n * regular polygons, where the number of segments determines the number of\n * sides.\n *\n * ```js\n * const geometry = new THREE.CircleGeometry( 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const circle = new THREE.Mesh( geometry, material );\n * scene.add( circle )\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CircleGeometry\n */\nclass CircleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new circle geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the circle.\n\t * @param {number} [segments=32] - Number of segments (triangles), minimum = `3`.\n\t * @param {number} [thetaStart=0] - Start angle for first segment in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta,\n\t * of the circular sector in radians. The default value results in a complete circle.\n\t */\n\tconstructor( radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CircleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cylinder.\n *\n * ```js\n * const geometry = new THREE.CylinderGeometry( 5, 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cylinder = new THREE.Mesh( geometry, material );\n * scene.add( cylinder );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CylinderGeometry\n */\nclass CylinderGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new cylinder geometry.\n\t *\n\t * @param {number} [radiusTop=1] - Radius of the cylinder at the top.\n\t * @param {number} [radiusBottom=1] - Radius of the cylinder at the bottom.\n\t * @param {number} [height=1] - Height of the cylinder.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cylinder.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cylinder.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cylinder is open or capped.\n\t * @param {number} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cylinder.\n\t */\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tif ( radiusTop > 0 || y !== 0 ) {\n\n\t\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( radiusBottom > 0 || y !== heightSegments - 1 ) {\n\n\t\t\t\t\t\tindices.push( b, c, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : -1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CylinderGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cone.\n *\n * ```js\n * const geometry = new THREE.ConeGeometry( 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cone = new THREE.Mesh(geometry, material );\n * scene.add( cone );\n * ```\n *\n * @augments CylinderGeometry\n * @demo scenes/geometry-browser.html#ConeGeometry\n */\nclass ConeGeometry extends CylinderGeometry {\n\n\t/**\n\t * Constructs a new cone geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the cone base.\n\t * @param {number} [height=1] - Height of the cone.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cone.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cone.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cone is open or capped.\n\t * @param {number} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cone.\n\t */\n\tconstructor( radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {ConeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A polyhedron is a solid in three dimensions with flat faces. This class\n * will take an array of vertices, project them onto a sphere, and then\n * divide them up to the desired level of detail.\n *\n * @augments BufferGeometry\n */\nclass PolyhedronGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new polyhedron geometry.\n\t *\n\t * @param {Array} [vertices] - A flat array of vertices describing the base shape.\n\t * @param {Array} [indices] - A flat array of indices describing the base shape.\n\t * @param {number} [radius=1] - The radius of the shape.\n\t * @param {number} [detail=0] - How many levels to subdivide the geometry. The more detail, the smoother the shape.\n\t */\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivision with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PolyhedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a dodecahedron.\n *\n * ```js\n * const geometry = new THREE.DodecahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const dodecahedron = new THREE.Mesh( geometry, material );\n * scene.add( dodecahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#DodecahedronGeometry\n */\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new dodecahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the dodecahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a dodecahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t-1, -1, -1,\t-1, -1, 1,\n\t\t\t-1, 1, -1, -1, 1, 1,\n\t\t\t1, -1, -1, 1, -1, 1,\n\t\t\t1, 1, -1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {DodecahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1$1 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\nconst _triangle = /*@__PURE__*/ new Triangle();\n\n/**\n * Can be used as a helper object to view the edges of a geometry.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry();\n * const edges = new THREE.EdgesGeometry( geometry );\n * const line = new THREE.LineSegments( edges );\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass EdgesGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new edges geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t * @param {number} [thresholdAngle=1] - An edge is only rendered if the angle (in degrees)\n\t * between the face normals of the adjoining faces exceeds this value.\n\t */\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1$1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0.x, _v0.y, _v0.z );\n\t\t\t\t\tvertices.push( _v1$1.x, _v1$1.y, _v1$1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An abstract base class for creating an analytic curve object that contains methods\n * for interpolation.\n *\n * @abstract\n */\nclass Curve {\n\n\t/**\n\t * Constructs a new curve.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Curve';\n\n\t\t/**\n\t\t * This value determines the amount of divisions when calculating the\n\t\t * cumulative segment lengths of a curve via {@link Curve#getLengths}. To ensure\n\t\t * precision when using methods like {@link Curve#getSpacedPoints}, it is\n\t\t * recommended to increase the value of this property if the curve is very large.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 200\n\t\t */\n\t\tthis.arcLengthDivisions = 200;\n\n\t\t/**\n\t\t * Must be set to `true` if the curve parameters have changed.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\t/**\n\t\t * An internal cache that holds precomputed curve length values.\n\t\t *\n\t\t * @private\n\t\t * @type {?Array}\n\t\t * @default null\n\t\t */\n\t\tthis.cacheArcLengths = null;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor.\n\t *\n\t * @abstract\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( /* t, optionalTarget */ ) {\n\n\t\twarn( 'Curve: .getPoint() not implemented.' );\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor. Unlike {@link Curve#getPoint}, this method honors the length\n\t * of the curve which equidistant samples.\n\t *\n\t * @param {number} u - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPointAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPoint} and returns an array of points representing\n\t * the curve shape.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get sequence of points using getPointAt( u )\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPointAt} and returns an array of points representing\n\t * the curve shape. Unlike {@link Curve#getPoints}, this method returns equi-spaced points across the entire\n\t * curve.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetSpacedPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t/**\n\t * Returns the total arc length of the curve.\n\t *\n\t * @return {number} The length of the curve.\n\t */\n\tgetLength() {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t}\n\n\t/**\n\t * Returns an array of cumulative segment lengths of the curve.\n\t *\n\t * @param {number} [divisions=this.arcLengthDivisions] - The number of divisions.\n\t * @return {Array} An array holding the cumulative segment lengths.\n\t */\n\tgetLengths( divisions = this.arcLengthDivisions ) {\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t}\n\n\t/**\n\t * Update the cumulative segment distance cache. The method must be called\n\t * every time curve parameters are changed. If an updated curve is part of a\n\t * composed curve like {@link CurvePath}, this method must be called on the\n\t * composed curve, too.\n\t */\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t}\n\n\t/**\n\t * Given an interpolation factor in the range `[0,1]`, this method returns an updated\n\t * interpolation factor in the same range that can be ued to sample equidistant points\n\t * from a curve.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {?number} distance - An optional distance on the curve.\n\t * @return {number} The updated interpolation factor.\n\t */\n\tgetUtoTmapping( u, distance = null ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns a unit vector tangent for the given interpolation factor.\n\t * If the derived curve does not implement its tangent derivation,\n\t * two points a small delta apart will be used to find its gradient\n\t * which seems to give a reasonable approximation.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t */\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\t/**\n\t * Same as {@link Curve#getTangent} but with equidistant samples.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t * @see {@link Curve#getPointAt}\n\t */\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * Generates the Frenet Frames. Requires a curve definition in 3D space. Used\n\t * in geometries like {@link TubeGeometry} or {@link ExtrudeGeometry}.\n\t *\n\t * @param {number} segments - The number of segments.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @return {{tangents: Array, normals: Array, binormals: Array}} The Frenet Frames.\n\t */\n\tcomputeFrenetFrames( segments, closed = false ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), -1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), -1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a new curve with copied values from this instance.\n\t *\n\t * @return {Curve} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given curve to this instance.\n\t *\n\t * @param {Curve} source - The curve to copy.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the curve into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized curve.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Deserializes the curve from the given JSON.\n\t *\n\t * @param {Object} json - The JSON holding the serialized curve.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an ellipse.\n *\n * ```js\n * const curve = new THREE.EllipseCurve(\n * \t0, 0,\n * \t10, 10,\n * \t0, 2 * Math.PI,\n * \tfalse,\n * \t0\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const ellipse = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass EllipseCurve extends Curve {\n\n\t/**\n\t * Constructs a new ellipse curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t */\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEllipseCurve = true;\n\n\t\tthis.type = 'EllipseCurve';\n\n\t\t/**\n\t\t * The X center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aX = aX;\n\n\t\t/**\n\t\t * The Y center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aY = aY;\n\n\t\t/**\n\t\t * The radius of the ellipse in the x direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#yRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.xRadius = xRadius;\n\n\t\t/**\n\t\t * The radius of the ellipse in the y direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#xRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.yRadius = yRadius;\n\n\t\t/**\n\t\t * The start angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aStartAngle = aStartAngle;\n\n\t\t/**\n\t\t * The end angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI*2\n\t\t */\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\t/**\n\t\t * Whether the ellipse is drawn clockwise or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.aClockwise = aClockwise;\n\n\t\t/**\n\t\t * The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aRotation = aRotation;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an arc.\n *\n * @augments EllipseCurve\n */\nclass ArcCurve extends EllipseCurve {\n\n\t/**\n\t * Constructs a new arc curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [aRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t */\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArcCurve = true;\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\nfunction CubicPoly() {\n\n\t/**\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t* cusps and self-intersections in non-uniform catmull rom curves.\n\t* http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t*\n\t* curve.type accepts centripetal(default), chordal and catmullrom\n\t* curve.tension is used for catmullrom which defaults to 0.5\n\t*/\n\n\t/*\n\tBased on an optimized c++ solution in\n\t- http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t- http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t * p(0) = x0, p(1) = x1\n\t * and\n\t * p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = -3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = /*@__PURE__*/ new Vector3();\nconst px = /*@__PURE__*/ new CubicPoly();\nconst py = /*@__PURE__*/ new CubicPoly();\nconst pz = /*@__PURE__*/ new CubicPoly();\n\n/**\n * A curve representing a Catmull-Rom spline.\n *\n * ```js\n * //Create a closed wavey loop\n * const curve = new THREE.CatmullRomCurve3( [\n * \tnew THREE.Vector3( -10, 0, 10 ),\n * \tnew THREE.Vector3( -5, 5, 5 ),\n * \tnew THREE.Vector3( 0, 0, 0 ),\n * \tnew THREE.Vector3( 5, -5, 5 ),\n * \tnew THREE.Vector3( 10, 0, 10 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CatmullRomCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Catmull-Rom curve.\n\t *\n\t * @param {Array} [points] - An array of 3D points defining the curve.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @param {('centripetal'|'chordal'|'catmullrom')} [curveType='centripetal'] - The curve type.\n\t * @param {number} [tension=0.5] - Tension of the curve.\n\t */\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCatmullRomCurve3 = true;\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\t/**\n\t\t * An array of 3D points defining the curve.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.points = points;\n\n\t\t/**\n\t\t * Whether the curve is closed or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.closed = closed;\n\n\t\t/**\n\t\t * The curve type.\n\t\t *\n\t\t * @type {('centripetal'|'chordal'|'catmullrom')}\n\t\t * @default 'centripetal'\n\t\t */\n\t\tthis.curveType = curveType;\n\n\t\t/**\n\t\t * Tension of the curve.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.tension = tension;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Interpolations contains spline and Bézier functions internally used by concrete curve classes.\n *\n * Bezier Curves formulas obtained from: https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n *\n * @module Interpolations\n */\n\n/**\n * Computes a point on a Catmull-Rom spline.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Catmull-Rom spline.\n */\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( -3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\n/**\n * Computes a point on a Quadratic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @return {number} The calculated point on a Quadratic Bezier curve.\n */\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\n/**\n * Computes a point on a Cubic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Cubic Bezier curve.\n */\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\n/**\n * A curve representing a 2D Cubic Bezier curve.\n *\n * ```js\n * const curve = new THREE.CubicBezierCurve(\n * \tnew THREE.Vector2( - 0, 0 ),\n * \tnew THREE.Vector2( - 5, 15 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CubicBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The first control point.\n\t * @param {Vector2} [v2] - The second control point.\n\t * @param {Vector2} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve = true;\n\n\t\tthis.type = 'CubicBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Cubic Bezier curve.\n *\n * @augments Curve\n */\nclass CubicBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The first control point.\n\t * @param {Vector3} [v2] - The second control point.\n\t * @param {Vector3} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve3 = true;\n\n\t\tthis.type = 'CubicBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D line segment.\n *\n * @augments Curve\n */\nclass LineCurve extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector2} [v1] - The start point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve = true;\n\n\t\tthis.type = 'LineCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector2() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D line segment.\n *\n * @augments Curve\n */\nclass LineCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector3} [v1] - The start point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.type = 'LineCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D Quadratic Bezier curve.\n *\n * ```js\n * const curve = new THREE.QuadraticBezierCurve(\n * \tnew THREE.Vector2( - 10, 0 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * )\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The control point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve = true;\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Quadratic Bezier curve.\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The control point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve3 = true;\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D spline curve.\n *\n * ```js\n * // Create a sine-like wave\n * const curve = new THREE.SplineCurve( [\n * \tnew THREE.Vector2( -10, 0 ),\n * \tnew THREE.Vector2( -5, 5 ),\n * \tnew THREE.Vector2( 0, 0 ),\n * \tnew THREE.Vector2( 5, -5 ),\n * \tnew THREE.Vector2( 10, 0 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const splineObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass SplineCurve extends Curve {\n\n\t/**\n\t * Constructs a new 2D spline curve.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the curve.\n\t */\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSplineCurve = true;\n\n\t\tthis.type = 'SplineCurve';\n\n\t\t/**\n\t\t * An array of 2D points defining the curve.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.points = points;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**\n * A base class extending {@link Curve}. `CurvePath` is simply an\n * array of connected curves, but retains the API of a curve.\n *\n * @augments Curve\n */\nclass CurvePath extends Curve {\n\n\t/**\n\t * Constructs a new curve path.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\t/**\n\t\t * An array of curves defining the\n\t\t * path.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.curves = [];\n\n\t\t/**\n\t\t * Whether the path should automatically be closed\n\t\t * by a line curve.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoClose = false;\n\n\t}\n\n\t/**\n\t * Adds a curve to this curve path.\n\t *\n\t * @param {Curve} curve - The curve to add.\n\t */\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\t/**\n\t * Adds a line curve to close the path.\n\t *\n\t * @return {CurvePath} A reference to this curve path.\n\t */\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tconst lineType = ( startPoint.isVector2 === true ) ? 'LineCurve' : 'LineCurve3';\n\t\t\tthis.curves.push( new Curves[ lineType ]( endPoint, startPoint ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definitions)\n\t * for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {?(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( t, optionalTarget ) {\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 } The curve lengths.\n\t */\n\tgetCurveLengths() {\n\n\t\t// Compute lengths and cache them\n\t\t// We cannot overwrite getLengths() because UtoT mapping uses it.\n\t\t// We use cache values if curves and cache array are same length\n\n\t\tif ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {\n\n\t\t\treturn this.cacheLengths;\n\n\t\t}\n\n\t\t// Get length of sub-curve\n\t\t// Push sums into cached array\n\n\t\tconst lengths = [];\n\t\tlet sums = 0;\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tsums += this.curves[ i ].getLength();\n\t\t\tlengths.push( sums );\n\n\t\t}\n\n\t\tthis.cacheLengths = lengths;\n\n\t\treturn lengths;\n\n\t}\n\n\tgetSpacedPoints( divisions = 40 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let i = 0; i <= divisions; i ++ ) {\n\n\t\t\tpoints.push( this.getPoint( i / divisions ) );\n\n\t\t}\n\n\t\tif ( this.autoClose ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tgetPoints( divisions = 12 ) {\n\n\t\tconst points = [];\n\t\tlet last;\n\n\t\tfor ( let i = 0, curves = this.curves; i < curves.length; i ++ ) {\n\n\t\t\tconst curve = curves[ i ];\n\t\t\tconst resolution = curve.isEllipseCurve ? divisions * 2\n\t\t\t\t: ( curve.isLineCurve || curve.isLineCurve3 ) ? 1\n\t\t\t\t\t: curve.isSplineCurve ? divisions * curve.points.length\n\t\t\t\t\t\t: divisions;\n\n\t\t\tconst pts = curve.getPoints( resolution );\n\n\t\t\tfor ( let j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\tconst point = pts[ j ];\n\n\t\t\t\tif ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates\n\n\t\t\t\tpoints.push( point );\n\t\t\t\tlast = point;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A 2D path representation. The class provides methods for creating paths\n * and contours of 2D shapes similar to the 2D Canvas API.\n *\n * ```js\n * const path = new THREE.Path();\n *\n * path.lineTo( 0, 0.8 );\n * path.quadraticCurveTo( 0, 1, 0.2, 1 );\n * path.lineTo( 1, 1 );\n *\n * const points = path.getPoints();\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments CurvePath\n */\nclass Path extends CurvePath {\n\n\t/**\n\t * Constructs a new path.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the path.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Path';\n\n\t\t/**\n\t\t * The current offset of the path. Any new curve added will start here.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a path from the given list of points. The points are added\n\t * to the path as instances of {@link LineCurve}.\n\t *\n\t * @param {Array} points - An array of 2D points.\n\t * @return {Path} A reference to this path.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Moves {@link Path#currentPoint} to the given point.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {Path} A reference to this path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array} pts - An array of points in 2D space.\n\t * @return {Path} A reference to this path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an arc as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} [aY=0] - The y coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} [aRadius=1] - The radius of the arc.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned arc as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the arc.\n\t * @param {number} [aY=0] - The y coordinate of the center of the arc.\n\t * @param {number} [aRadius=1] - The radius of the arc.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an ellipse as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} [aY=0] - The y coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x axis.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y axis.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned ellipse as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the absolute center of the ellipse.\n\t * @param {number} [aY=0] - The y coordinate of the absolute center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x axis.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y axis.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Defines an arbitrary 2d shape plane using paths with optional holes. It\n * can be used with {@link ExtrudeGeometry}, {@link ShapeGeometry}, to get\n * points, or to get triangulated faces.\n *\n * ```js\n * const heartShape = new THREE.Shape();\n *\n * heartShape.moveTo( 25, 25 );\n * heartShape.bezierCurveTo( 25, 25, 20, 0, 0, 0 );\n * heartShape.bezierCurveTo( - 30, 0, - 30, 35, - 30, 35 );\n * heartShape.bezierCurveTo( - 30, 55, - 10, 77, 25, 95 );\n * heartShape.bezierCurveTo( 60, 77, 80, 55, 80, 35 );\n * heartShape.bezierCurveTo( 80, 35, 80, 0, 50, 0 );\n * heartShape.bezierCurveTo( 35, 0, 25, 25, 25, 25 );\n *\n * const extrudeSettings = {\n * \tdepth: 8,\n * \tbevelEnabled: true,\n * \tbevelSegments: 2,\n * \tsteps: 2,\n * \tbevelSize: 1,\n * \tbevelThickness: 1\n * };\n *\n * const geometry = new THREE.ExtrudeGeometry( heartShape, extrudeSettings );\n * const mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial() );\n * ```\n *\n * @augments Path\n */\nclass Shape extends Path {\n\n\t/**\n\t * Constructs a new shape.\n\t *\n\t * @param {Array} [points] - An array of 2D points defining the shape.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\t/**\n\t\t * The UUID of the shape.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\t/**\n\t\t * Defines the holes in the shape. Hole definitions must use the\n\t\t * opposite winding order (CW/CCW) than the outer shape.\n\t\t *\n\t\t * @type {Array}\n\t\t * @readonly\n\t\t */\n\t\tthis.holes = [];\n\n\t}\n\n\t/**\n\t * Returns an array representing each contour of the holes\n\t * as a list of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {Array>} The holes as a series of 2D points.\n\t */\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t}\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\t/**\n\t * Returns an object that holds contour data for the shape and its holes as\n\t * arrays of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {{shape:Array,holes:Array>}} An object with contour data.\n\t */\n\textractPoints( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* eslint-disable */\n// copy of mapbox/earcut version 3.0.2\n// https://github.com/mapbox/earcut/tree/v3.0.2\n\nfunction earcut(data, holeIndices, dim = 2) {\n\n const hasHoles = holeIndices && holeIndices.length;\n const outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n let outerNode = linkedList(data, 0, outerLen, dim, true);\n const triangles = [];\n\n if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n let minX, minY, invSize;\n\n if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n if (data.length > 80 * dim) {\n minX = data[0];\n minY = data[1];\n let maxX = minX;\n let maxY = minY;\n\n for (let i = dim; i < outerLen; i += dim) {\n const x = data[i];\n const y = data[i + 1];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n\n // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n invSize = Math.max(maxX - minX, maxY - minY);\n invSize = invSize !== 0 ? 32767 / invSize : 0;\n }\n\n earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);\n\n return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n let last;\n\n if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n for (let i = start; i < end; i += dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n } else {\n for (let i = end - dim; i >= start; i -= dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n }\n\n if (last && equals(last, last.next)) {\n removeNode(last);\n last = last.next;\n }\n\n return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n if (!start) return start;\n if (!end) end = start;\n\n let p = start,\n again;\n do {\n again = false;\n\n if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n removeNode(p);\n p = end = p.prev;\n if (p === p.next) break;\n again = true;\n\n } else {\n p = p.next;\n }\n } while (again || p !== end);\n\n return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n if (!ear) return;\n\n // interlink polygon nodes in z-order\n if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n let stop = ear;\n\n // iterate through ears, slicing them one by one\n while (ear.prev !== ear.next) {\n const prev = ear.prev;\n const next = ear.next;\n\n if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n triangles.push(prev.i, ear.i, next.i); // cut off the triangle\n\n removeNode(ear);\n\n // skipping the next vertex leads to less sliver triangles\n ear = next.next;\n stop = next.next;\n\n continue;\n }\n\n ear = next;\n\n // if we looped through the whole remaining polygon and can't find any more ears\n if (ear === stop) {\n // try filtering points and slicing again\n if (!pass) {\n earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n // if this didn't work, try curing all small self-intersections locally\n } else if (pass === 1) {\n ear = cureLocalIntersections(filterPoints(ear), triangles);\n earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n // as a last resort, try splitting the remaining polygon into two\n } else if (pass === 2) {\n splitEarcut(ear, triangles, dim, minX, minY, invSize);\n }\n\n break;\n }\n }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n const a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n // now make sure we don't have other points inside the potential ear\n const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n // triangle bbox\n const x0 = Math.min(ax, bx, cx),\n y0 = Math.min(ay, by, cy),\n x1 = Math.max(ax, bx, cx),\n y1 = Math.max(ay, by, cy);\n\n let p = c.next;\n while (p !== a) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) &&\n area(p.prev, p, p.next) >= 0) return false;\n p = p.next;\n }\n\n return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n const a = ear.prev,\n b = ear,\n c = ear.next;\n\n if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n // triangle bbox\n const x0 = Math.min(ax, bx, cx),\n y0 = Math.min(ay, by, cy),\n x1 = Math.max(ax, bx, cx),\n y1 = Math.max(ay, by, cy);\n\n // z-order range for the current triangle bbox;\n const minZ = zOrder(x0, y0, minX, minY, invSize),\n maxZ = zOrder(x1, y1, minX, minY, invSize);\n\n let p = ear.prevZ,\n n = ear.nextZ;\n\n // look for points inside the triangle in both directions\n while (p && p.z >= minZ && n && n.z <= maxZ) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n\n if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n\n // look for remaining points in decreasing z-order\n while (p && p.z >= minZ) {\n if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n p = p.prevZ;\n }\n\n // look for remaining points in increasing z-order\n while (n && n.z <= maxZ) {\n if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n n = n.nextZ;\n }\n\n return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles) {\n let p = start;\n do {\n const a = p.prev,\n b = p.next.next;\n\n if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n triangles.push(a.i, p.i, b.i);\n\n // remove two nodes involved\n removeNode(p);\n removeNode(p.next);\n\n p = start = b;\n }\n p = p.next;\n } while (p !== start);\n\n return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n // look for a valid diagonal that divides the polygon into two\n let a = start;\n do {\n let b = a.next.next;\n while (b !== a.prev) {\n if (a.i !== b.i && isValidDiagonal(a, b)) {\n // split the polygon in two by the diagonal\n let c = splitPolygon(a, b);\n\n // filter colinear points around the cuts\n a = filterPoints(a, a.next);\n c = filterPoints(c, c.next);\n\n // run earcut on each half\n earcutLinked(a, triangles, dim, minX, minY, invSize, 0);\n earcutLinked(c, triangles, dim, minX, minY, invSize, 0);\n return;\n }\n b = b.next;\n }\n a = a.next;\n } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n const queue = [];\n\n for (let i = 0, len = holeIndices.length; i < len; i++) {\n const start = holeIndices[i] * dim;\n const end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n const list = linkedList(data, start, end, dim, false);\n if (list === list.next) list.steiner = true;\n queue.push(getLeftmost(list));\n }\n\n queue.sort(compareXYSlope);\n\n // process holes from left to right\n for (let i = 0; i < queue.length; i++) {\n outerNode = eliminateHole(queue[i], outerNode);\n }\n\n return outerNode;\n}\n\nfunction compareXYSlope(a, b) {\n let result = a.x - b.x;\n // when the left-most point of 2 holes meet at a vertex, sort the holes counterclockwise so that when we find\n // the bridge to the outer shell is always the point that they meet at.\n if (result === 0) {\n result = a.y - b.y;\n if (result === 0) {\n const aSlope = (a.next.y - a.y) / (a.next.x - a.x);\n const bSlope = (b.next.y - b.y) / (b.next.x - b.x);\n result = aSlope - bSlope;\n }\n }\n return result;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole(hole, outerNode) {\n const bridge = findHoleBridge(hole, outerNode);\n if (!bridge) {\n return outerNode;\n }\n\n const bridgeReverse = splitPolygon(bridge, hole);\n\n // filter collinear points around the cuts\n filterPoints(bridgeReverse, bridgeReverse.next);\n return filterPoints(bridge, bridge.next);\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n let p = outerNode;\n const hx = hole.x;\n const hy = hole.y;\n let qx = -Infinity;\n let m;\n\n // find a segment intersected by a ray from the hole's leftmost point to the left;\n // segment's endpoint with lesser x will be potential connection point\n // unless they intersect at a vertex, then choose the vertex\n if (equals(hole, p)) return p;\n do {\n if (equals(hole, p.next)) return p.next;\n else if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n if (x <= hx && x > qx) {\n qx = x;\n m = p.x < p.next.x ? p : p.next;\n if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint\n }\n }\n p = p.next;\n } while (p !== outerNode);\n\n if (!m) return null;\n\n // look for points inside the triangle of hole point, segment intersection and endpoint;\n // if there are no points found, we have a valid connection;\n // otherwise choose the point of the minimum angle with the ray as connection point\n\n const stop = m;\n const mx = m.x;\n const my = m.y;\n let tanMin = Infinity;\n\n p = m;\n\n do {\n if (hx >= p.x && p.x >= mx && hx !== p.x &&\n pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n const tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n if (locallyInside(p, hole) &&\n (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n m = p;\n tanMin = tan;\n }\n }\n\n p = p.next;\n } while (p !== stop);\n\n return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n let p = start;\n do {\n if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n p.prevZ = p.prev;\n p.nextZ = p.next;\n p = p.next;\n } while (p !== start);\n\n p.prevZ.nextZ = null;\n p.prevZ = null;\n\n sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n let numMerges;\n let inSize = 1;\n\n do {\n let p = list;\n let e;\n list = null;\n let tail = null;\n numMerges = 0;\n\n while (p) {\n numMerges++;\n let q = p;\n let pSize = 0;\n for (let i = 0; i < inSize; i++) {\n pSize++;\n q = q.nextZ;\n if (!q) break;\n }\n let qSize = inSize;\n\n while (pSize > 0 || (qSize > 0 && q)) {\n\n if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n e = p;\n p = p.nextZ;\n pSize--;\n } else {\n e = q;\n q = q.nextZ;\n qSize--;\n }\n\n if (tail) tail.nextZ = e;\n else list = e;\n\n e.prevZ = tail;\n tail = e;\n }\n\n p = q;\n }\n\n tail.nextZ = null;\n inSize *= 2;\n\n } while (numMerges > 1);\n\n return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n // coords are transformed into non-negative 15-bit integer range\n x = (x - minX) * invSize | 0;\n y = (y - minY) * invSize | 0;\n\n x = (x | (x << 8)) & 0x00FF00FF;\n x = (x | (x << 4)) & 0x0F0F0F0F;\n x = (x | (x << 2)) & 0x33333333;\n x = (x | (x << 1)) & 0x55555555;\n\n y = (y | (y << 8)) & 0x00FF00FF;\n y = (y | (y << 4)) & 0x0F0F0F0F;\n y = (y | (y << 2)) & 0x33333333;\n y = (y | (y << 1)) & 0x55555555;\n\n return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n let p = start,\n leftmost = start;\n do {\n if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n p = p.next;\n } while (p !== start);\n\n return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n return (cx - px) * (ay - py) >= (ax - px) * (cy - py) &&\n (ax - px) * (by - py) >= (bx - px) * (ay - py) &&\n (bx - px) * (cy - py) >= (cx - px) * (by - py);\n}\n\n// check if a point lies within a convex triangle but false if its equal to the first point of the triangle\nfunction pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, px, py) {\n return !(ax === px && ay === py) && pointInTriangle(ax, ay, bx, by, cx, cy, px, py);\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // doesn't intersect other edges\n (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n const o1 = sign(area(p1, q1, p2));\n const o2 = sign(area(p1, q1, q2));\n const o3 = sign(area(p2, q2, p1));\n const o4 = sign(area(p2, q2, q1));\n\n if (o1 !== o2 && o3 !== o4) return true; // general case\n\n if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n let p = a;\n do {\n if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n intersects(p, p.next, a, b)) return true;\n p = p.next;\n } while (p !== a);\n\n return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n return area(a.prev, a, a.next) < 0 ?\n area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n let p = a;\n let inside = false;\n const px = (a.x + b.x) / 2;\n const py = (a.y + b.y) / 2;\n do {\n if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n inside = !inside;\n p = p.next;\n } while (p !== a);\n\n return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n const a2 = createNode(a.i, a.x, a.y),\n b2 = createNode(b.i, b.x, b.y),\n an = a.next,\n bp = b.prev;\n\n a.next = b;\n b.prev = a;\n\n a2.next = an;\n an.prev = a2;\n\n b2.next = a2;\n a2.prev = b2;\n\n bp.next = b2;\n b2.prev = bp;\n\n return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n const p = createNode(i, x, y);\n\n if (!last) {\n p.prev = p;\n p.next = p;\n\n } else {\n p.next = last.next;\n p.prev = last;\n last.next.prev = p;\n last.next = p;\n }\n return p;\n}\n\nfunction removeNode(p) {\n p.next.prev = p.prev;\n p.prev.next = p.next;\n\n if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction createNode(i, x, y) {\n return {\n i, // vertex index in coordinates array\n x, y, // vertex coordinates\n prev: null, // previous and next vertex nodes in a polygon ring\n next: null,\n z: 0, // z-order curve value\n prevZ: null, // previous and next nodes in z-order\n nextZ: null,\n steiner: false // indicates whether this is a steiner point\n };\n}\n\nfunction signedArea(data, start, end, dim) {\n let sum = 0;\n for (let i = start, j = end - dim; i < end; i += dim) {\n sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n j = i;\n }\n return sum;\n}\n\n/**\n * An implementation of the earcut polygon triangulation algorithm.\n * The code is a port of [mapbox/earcut](https://github.com/mapbox/earcut).\n *\n * @see https://github.com/mapbox/earcut\n */\nclass Earcut {\n\n\t/**\n\t * Triangulates the given shape definition by returning an array of triangles.\n\t *\n\t * @param {Array} data - An array with 2D points.\n\t * @param {Array} holeIndices - An array with indices defining holes.\n\t * @param {number} [dim=2] - The number of coordinates per vertex in the input array.\n\t * @return {Array} An array representing the triangulated faces. Each face is defined by three consecutive numbers\n\t * representing vertex indices.\n\t */\n\tstatic triangulate( data, holeIndices, dim = 2 ) {\n\n\t\treturn earcut( data, holeIndices, dim );\n\n\t}\n\n}\n\n/**\n * A class containing utility functions for shapes.\n *\n * @hideconstructor\n */\nclass ShapeUtils {\n\n\t/**\n\t * Calculate area of a ( 2D ) contour polygon.\n\t *\n\t * @param {Array} contour - An array of 2D points.\n\t * @return {number} The area.\n\t */\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given contour uses a clockwise winding order.\n\t *\n\t * @param {Array} pts - An array of 2D points defining a polygon.\n\t * @return {boolean} Whether the given contour uses a clockwise winding order or not.\n\t */\n\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\t/**\n\t * Triangulates the given shape definition.\n\t *\n\t * @param {Array} contour - An array of 2D points defining the contour.\n\t * @param {Array>} holes - An array that holds arrays of 2D points defining the holes.\n\t * @return {Array>} An array that holds for each face definition an array with three indices.\n\t */\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n}\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * ```js\n * const length = 12, width = 8;\n *\n * const shape = new THREE.Shape();\n * shape.moveTo( 0,0 );\n * shape.lineTo( 0, width );\n * shape.lineTo( length, width );\n * shape.lineTo( length, 0 );\n * shape.lineTo( 0, 0 );\n *\n * const geometry = new THREE.ExtrudeGeometry( shape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#ExtrudeGeometry\n */\nclass ExtrudeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new extrude geometry.\n\t *\n\t * @param {Shape|Array} [shapes] - A shape or an array of shapes.\n\t * @param {ExtrudeGeometry~Options} [options] - The extrude settings.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( -0.5, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tconst depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t\t// log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/**Merges index-adjacent points that are within a threshold distance of each other. Array is modified in-place. Threshold distance is empirical, and scaled based on the magnitude of point coordinates.\n\t\t\t * @param {Array} points\n\t\t\t*/\n\t\t\tfunction mergeOverlappingPoints( points ) {\n\n\t\t\t\tconst THRESHOLD = 1e-10;\n\t\t\t\tconst THRESHOLD_SQ = THRESHOLD * THRESHOLD;\n\t\t\t\tlet prevPos = points[ 0 ];\n\t\t\t\tfor ( let i = 1; i <= points.length; i ++ ) {\n\n\t\t\t\t\tconst currentIndex = i % points.length;\n\t\t\t\t\tconst currentPos = points[ currentIndex ];\n\t\t\t\t\tconst dx = currentPos.x - prevPos.x;\n\t\t\t\t\tconst dy = currentPos.y - prevPos.y;\n\t\t\t\t\tconst distSq = dx * dx + dy * dy;\n\n\t\t\t\t\tconst scalingFactorSqrt = Math.max(\n\t\t\t\t\t\tMath.abs( currentPos.x ),\n\t\t\t\t\t\tMath.abs( currentPos.y ),\n\t\t\t\t\t\tMath.abs( prevPos.x ),\n\t\t\t\t\t\tMath.abs( prevPos.y )\n\t\t\t\t\t);\n\t\t\t\t\tconst thresholdSqScaled = THRESHOLD_SQ * scalingFactorSqrt * scalingFactorSqrt;\n\t\t\t\t\tif ( distSq <= thresholdSqScaled ) {\n\n\t\t\t\t\t\tpoints.splice( currentIndex, 1 );\n\t\t\t\t\t\ti --;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tprevPos = currentPos;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmergeOverlappingPoints( vertices );\n\t\t\tholes.forEach( mergeOverlappingPoints );\n\n\t\t\tconst numHoles = holes.length;\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0; h < numHoles; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) error( 'ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn pt.clone().addScaledVector( vec, size );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t// but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t// log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = numHoles; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\t\t\tlet faces;\n\n\t\t\tif ( bevelSegments === 0 ) {\n\n\t\t\t\tfaces = ShapeUtils.triangulateShape( contour, holes );\n\n\t\t\t} else {\n\n\t\t\t\tconst contractedContourVertices = [];\n\t\t\t\tconst expandedHoleVertices = [];\n\n\t\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t\t// contract shape\n\n\t\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\t\t\t\t\t\tif ( t === 0 ) contractedContourVertices.push( vert );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// expand holes\n\n\t\t\t\t\tfor ( let h = 0, hl = numHoles; h < hl; h ++ ) {\n\n\t\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\t\t\t\t\t\tconst oneHoleVertices = [];\n\t\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\t\t\t\t\t\t\tif ( t === 0 ) oneHoleVertices.push( vert );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( t === 0 ) expandedHoleVertices.push( oneHoleVertices );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfaces = ShapeUtils.triangulateShape( contractedContourVertices, expandedHoleVertices );\n\n\t\t\t}\n\n\t\t\tconst flen = faces.length;\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t///// Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array} shapes - An array of shapes.\n\t * @return {ExtrudeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tdata.options = Object.assign( {}, options );\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\n/**\n * A geometry class for representing an icosahedron.\n *\n * ```js\n * const geometry = new THREE.IcosahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const icosahedron = new THREE.Mesh( geometry, material );\n * scene.add( icosahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#IcosahedronGeometry\n */\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new icosahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the icosahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a icosahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t-1, t, 0, \t1, t, 0, \t-1, - t, 0, \t1, - t, 0,\n\t\t\t0, -1, t, \t0, 1, t,\t0, -1, - t, \t0, 1, - t,\n\t\t\tt, 0, -1, \tt, 0, 1, \t- t, 0, -1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {IcosahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * Creates meshes with axial symmetry like vases. The lathe rotates around the Y axis.\n *\n * ```js\n * const points = [];\n * for ( let i = 0; i < 10; i ++ ) {\n * \tpoints.push( new THREE.Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );\n * }\n * const geometry = new THREE.LatheGeometry( points );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const lathe = new THREE.Mesh( geometry, material );\n * scene.add( lathe );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#LatheGeometry\n */\nclass LatheGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new lathe geometry.\n\t *\n\t * @param {Array} [points] - An array of points in 2D space. The x-coordinate of each point\n\t * must be greater than zero.\n\t * @param {number} [segments=12] - The number of circumference segments to generate.\n\t * @param {number} [phiStart=0] - The starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The radian (0 to 2PI) range of the lathed section 2PI is a\n\t * closed lathe, less than 2PI is a portion.\n\t */\n\tconstructor( points = [ new Vector2( 0, -0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {LatheGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an octahedron.\n *\n * ```js\n * const geometry = new THREE.OctahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const octahedron = new THREE.Mesh( geometry, material );\n * scene.add( octahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#OctahedronGeometry\n */\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new octahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the octahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a octahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t-1, 0, 0,\t0, 1, 0,\n\t\t\t0, -1, 0, \t0, 0, 1,\t0, 0, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {OctahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a plane.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const plane = new THREE.Mesh( geometry, material );\n * scene.add( plane );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#PlaneGeometry\n */\nclass PlaneGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new plane geometry.\n\t *\n\t * @param {number} [width=1] - The width along the X axis.\n\t * @param {number} [height=1] - The height along the Y axis\n\t * @param {number} [widthSegments=1] - The number of segments along the X axis.\n\t * @param {number} [heightSegments=1] - The number of segments along the Y axis.\n\t */\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PlaneGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A class for generating a two-dimensional ring geometry.\n *\n * ```js\n * const geometry = new THREE.RingGeometry( 1, 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#RingGeometry\n */\nclass RingGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new ring geometry.\n\t *\n\t * @param {number} [innerRadius=0.5] - The inner radius of the ring.\n\t * @param {number} [outerRadius=1] - The outer radius of the ring.\n\t * @param {number} [thetaSegments=32] - Number of segments. A higher number means the ring will be more round. Minimum is `3`.\n\t * @param {number} [phiSegments=1] - Number of segments per ring segment. Minimum is `1`.\n\t * @param {number} [thetaStart=0] - Starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {RingGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * Creates an one-sided polygonal geometry from one or more path shapes.\n *\n * ```js\n * const arcShape = new THREE.Shape()\n *\t.moveTo( 5, 1 )\n *\t.absarc( 1, 1, 4, 0, Math.PI * 2, false );\n *\n * const geometry = new THREE.ShapeGeometry( arcShape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#ShapeGeometry\n */\nclass ShapeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new shape geometry.\n\t *\n\t * @param {Shape|Array} [shapes] - A shape or an array of shapes.\n\t * @param {number} [curveSegments=12] - Number of segments per shape.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array} shapes - An array of shapes.\n\t * @return {ShapeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\n/**\n * A class for generating a sphere geometry.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry( 15, 32, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const sphere = new THREE.Mesh( geometry, material );\n * scene.add( sphere );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#SphereGeometry\n */\nclass SphereGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new sphere geometry.\n\t *\n\t * @param {number} [radius=1] - The sphere radius.\n\t * @param {number} [widthSegments=32] - The number of horizontal segments. Minimum value is `3`.\n\t * @param {number} [heightSegments=16] - The number of vertical segments. Minimum value is `2`.\n\t * @param {number} [phiStart=0] - The horizontal starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The horizontal sweep angle size.\n\t * @param {number} [thetaStart=0] - The vertical starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI] - The vertical sweep angle size.\n\t */\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 && thetaStart === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy === heightSegments && thetaEnd === Math.PI ) {\n\n\t\t\t\tuOffset = -0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {SphereGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an tetrahedron.\n *\n * ```js\n * const geometry = new THREE.TetrahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const tetrahedron = new THREE.Mesh( geometry, material );\n * scene.add( tetrahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#TetrahedronGeometry\n */\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new tetrahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the tetrahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a tetrahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t-1, -1, 1, \t-1, 1, -1, \t1, -1, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TetrahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an torus.\n *\n * ```js\n * const geometry = new THREE.TorusGeometry( 10, 3, 16, 100 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torus = new THREE.Mesh( geometry, material );\n * scene.add( torus );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TorusGeometry\n */\nclass TorusGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus, from the center of the torus to the center of the tube.\n\t * @param {number} [tube=0.4] - Radius of the tube. Must be smaller than `radius`.\n\t * @param {number} [radialSegments=12] - The number of radial segments.\n\t * @param {number} [tubularSegments=48] - The number of tubular segments.\n\t * @param {number} [arc=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\n/**\n * Creates a torus knot, the particular shape of which is defined by a pair\n * of coprime integers, p and q. If p and q are not coprime, the result will\n * be a torus link.\n *\n * ```js\n * const geometry = new THREE.TorusKnotGeometry( 10, 3, 100, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torusKnot = new THREE.Mesh( geometry, material );\n * scene.add( torusKnot );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TorusKnotGeometry\n */\nclass TorusKnotGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus knot geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus knot.\n\t * @param {number} [tube=0.4] - Radius of the tube.\n\t * @param {number} [tubularSegments=64] - The number of tubular segments.\n\t * @param {number} [radialSegments=8] - The number of radial segments.\n\t * @param {number} [p=2] - This value determines, how many times the geometry winds around its axis of rotational symmetry.\n\t * @param {number} [q=3] - This value determines, how many times the geometry winds around a circle in the interior of the torus.\n\t */\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusKnotGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\n/**\n * Creates a tube that extrudes along a 3D curve.\n *\n * ```js\n * class CustomSinCurve extends THREE.Curve {\n *\n * \tgetPoint( t, optionalTarget = new THREE.Vector3() ) {\n *\n * \t\tconst tx = t * 3 - 1.5;\n * \t\tconst ty = Math.sin( 2 * Math.PI * t );\n * \t\tconst tz = 0;\n *\n * \t\treturn optionalTarget.set( tx, ty, tz );\n * \t}\n *\n * }\n *\n * const path = new CustomSinCurve( 10 );\n * const geometry = new THREE.TubeGeometry( path, 20, 2, 8, false );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TubeGeometry\n */\nclass TubeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new tube geometry.\n\t *\n\t * @param {Curve} [path=QuadraticBezierCurve3] - A 3D curve defining the path of the tube.\n\t * @param {number} [tubularSegments=64] - The number of segments that make up the tube.\n\t * @param {number} [radius=1] -The radius of the tube.\n\t * @param {number} [radialSegments=8] - The number of segments that make up the cross-section.\n\t * @param {boolean} [closed=false] - Whether the tube is closed or not.\n\t */\n\tconstructor( path = new QuadraticBezierCurve3( new Vector3( -1, -1, 0 ), new Vector3( -1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TubeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\n/**\n * Can be used as a helper object to visualize a geometry as a wireframe.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry();\n *\n * const wireframe = new THREE.WireframeGeometry( geometry );\n *\n * const line = new THREE.LineSegments( wireframe );\n * line.material.depthWrite = false;\n * line.material.opacity = 0.25;\n * line.material.transparent = true;\n *\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass WireframeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new wireframe geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t */\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tCapsuleGeometry: CapsuleGeometry,\n\tCircleGeometry: CircleGeometry,\n\tConeGeometry: ConeGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tLatheGeometry: LatheGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tRingGeometry: RingGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tSphereGeometry: SphereGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTubeGeometry: TubeGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\n/**\n * This material can receive shadows, but otherwise is completely transparent.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 2000, 2000 );\n * geometry.rotateX( - Math.PI / 2 );\n *\n * const material = new THREE.ShadowMaterial();\n * material.opacity = 0.2;\n *\n * const plane = new THREE.Mesh( geometry, material );\n * plane.position.y = -200;\n * plane.receiveShadow = true;\n * scene.add( plane );\n * ```\n *\n * @augments Material\n */\nclass ShadowMaterial extends Material {\n\n\t/**\n\t * Constructs a new shadow material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShadowMaterial = true;\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.color = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Overwritten since shadow materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This class works just like {@link ShaderMaterial}, except that definitions\n * of built-in uniforms and attributes are not automatically prepended to the\n * GLSL shader code.\n *\n * `RawShaderMaterial` can only be used with {@link WebGLRenderer}.\n *\n * @augments ShaderMaterial\n */\nclass RawShaderMaterial extends ShaderMaterial {\n\n\t/**\n\t * Constructs a new raw shader material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRawShaderMaterial = true;\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\n/**\n * A standard physically based material, using Metallic-Roughness workflow.\n *\n * Physically based rendering (PBR) has recently become the standard in many\n * 3D applications, such as [Unity](https://blogs.unity3d.com/2014/10/29/physically-based-shading-in-unity-5-a-primer/),\n * [Unreal](https://docs.unrealengine.com/latest/INT/Engine/Rendering/Materials/PhysicallyBased/) and\n * [3D Studio Max](http://area.autodesk.com/blogs/the-3ds-max-blog/what039s-new-for-rendering-in-3ds-max-2017).\n *\n * This approach differs from older approaches in that instead of using\n * approximations for the way in which light interacts with a surface, a\n * physically correct model is used. The idea is that, instead of tweaking\n * materials to look good under specific lighting, a material can be created\n * that will react 'correctly' under all lighting scenarios.\n *\n * In practice this gives a more accurate and realistic looking result than\n * the {@link MeshLambertMaterial} or {@link MeshPhongMaterial}, at the cost of\n * being somewhat more computationally expensive. `MeshStandardMaterial` uses per-fragment\n * shading.\n *\n * Note that for best results you should always specify an environment map when using this material.\n *\n * For a non-technical introduction to the concept of PBR and how to set up a\n * PBR material, check out these articles by the people at [marmoset](https://www.marmoset.co):\n *\n * - [Basic Theory of Physically Based Rendering](https://www.marmoset.co/posts/basic-theory-of-physically-based-rendering/)\n * - [Physically Based Rendering and You Can Too](https://www.marmoset.co/posts/physically-based-rendering-and-you-can-too/)\n *\n * Technical details of the approach used in three.js (and most other PBR systems) can be found is this\n * [paper from Disney](https://media.disneyanimation.com/uploads/production/publication_asset/48/asset/s2012_pbs_disney_brdf_notes_v3.pdf)\n * (pdf), by Brent Burley.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshStandardMaterial\n */\nclass MeshStandardMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh standard material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshStandardMaterial = true;\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * How rough the material appears. `0.0` means a smooth mirror reflection, `1.0`\n\t\t * means fully diffuse. If `roughnessMap` is also provided,\n\t\t * both values are multiplied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.roughness = 1.0;\n\n\t\t/**\n\t\t * How much the material is like a metal. Non-metallic materials such as wood\n\t\t * or stone use `0.0`, metallic use `1.0`, with nothing (usually) in between.\n\t\t * A value between `0.0` and `1.0` could be used for a rusty metal look.\n\t\t * If `metalnessMap` is also provided, both values are multiplied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.metalness = 0.0;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The green channel of this texture is used to alter the roughness of the\n\t\t * material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.roughnessMap = null;\n\n\t\t/**\n\t\t * The blue channel of this texture is used to alter the metalness of the\n\t\t * material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.metalnessMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map. To ensure a physically correct rendering, environment maps\n\t\t * are internally pre-processed with {@link PMREMGenerator}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * Scales the effect of the environment map by multiplying its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.envMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An extension of the {@link MeshStandardMaterial}, providing more advanced\n * physically-based rendering properties:\n *\n * - Anisotropy: Ability to represent the anisotropic property of materials\n * as observable with brushed metals.\n * - Clearcoat: Some materials — like car paints, carbon fiber, and wet surfaces — require\n * a clear, reflective layer on top of another layer that may be irregular or rough.\n * Clearcoat approximates this effect, without the need for a separate transparent surface.\n * - Iridescence: Allows to render the effect where hue varies depending on the viewing\n * angle and illumination angle. This can be seen on soap bubbles, oil films, or on the\n * wings of many insects.\n * - Physically-based transparency: One limitation of {@link Material#opacity} is that highly\n * transparent materials are less reflective. Physically-based transmission provides a more\n * realistic option for thin, transparent surfaces like glass.\n * - Advanced reflectivity: More flexible reflectivity for non-metallic materials.\n * - Sheen: Can be used for representing cloth and fabric materials.\n *\n * As a result of these complex shading features, `MeshPhysicalMaterial` has a\n * higher performance cost, per pixel, than other three.js materials. Most\n * effects are disabled by default, and add cost as they are enabled. For\n * best results, always specify an environment map when using this material.\n *\n * @augments MeshStandardMaterial\n * @demo scenes/material-browser.html#MeshPhysicalMaterial\n */\nclass MeshPhysicalMaterial extends MeshStandardMaterial {\n\n\t/**\n\t * Constructs a new mesh physical material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhysicalMaterial = true;\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\t/**\n\t\t * The rotation of the anisotropy in tangent, bitangent space, measured in radians\n\t\t * counter-clockwise from the tangent. When `anisotropyMap` is present, this\n\t\t * property provides additional rotation to the vectors in the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.anisotropyRotation = 0;\n\n\t\t/**\n\t\t * Red and green channels represent the anisotropy direction in `[-1, 1]` tangent,\n\t\t * bitangent space, to be rotated by `anisotropyRotation`. The blue channel\n\t\t * contains strength as `[0, 1]` to be multiplied by `anisotropy`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.anisotropyMap = null;\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `clearcoat`,\n\t\t * for per-pixel control over a coating's intensity.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatMap = null;\n\n\t\t/**\n\t\t * Roughness of the clear coat layer, from `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.clearcoatRoughness = 0.0;\n\n\t\t/**\n\t\t * The green channel of this texture is multiplied against\n\t\t * `clearcoatRoughness`, for per-pixel control over a coating's roughness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatRoughnessMap = null;\n\n\t\t/**\n\t\t * How much `clearcoatNormalMap` affects the clear coat layer, from\n\t\t * `(0,0)` to `(1,1)`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * Can be used to enable independent normals for the clear coat layer.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatNormalMap = null;\n\n\t\t/**\n\t\t * Index-of-refraction for non-metallic materials, from `1.0` to `2.333`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.5\n\t\t */\n\t\tthis.ior = 1.5;\n\n\t\t/**\n\t\t * Degree of reflectivity, from `0.0` to `1.0`. Default is `0.5`, which\n\t\t * corresponds to an index-of-refraction of `1.5`.\n\t\t *\n\t\t * This models the reflectivity of non-metallic materials. It has no effect\n\t\t * when `metalness` is `1.0`\n\t\t *\n\t\t * @name MeshPhysicalMaterial#reflectivity\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tObject.defineProperty( this, 'reflectivity', {\n\t\t\tget: function () {\n\n\t\t\t\treturn ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) );\n\n\t\t\t},\n\t\t\tset: function ( reflectivity ) {\n\n\t\t\t\tthis.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity );\n\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `iridescence`, for per-pixel\n\t\t * control over iridescence.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceMap = null;\n\n\t\t/**\n\t\t * Strength of the iridescence RGB color shift effect, represented by an index-of-refraction.\n\t\t * Between `1.0` to `2.333`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.3\n\t\t */\n\t\tthis.iridescenceIOR = 1.3;\n\n\t\t/**\n\t\t *Array of exactly 2 elements, specifying minimum and maximum thickness of the iridescence layer.\n\t\t Thickness of iridescence layer has an equivalent effect of the one `thickness` has on `ior`.\n\t\t *\n\t\t * @type {Array}\n\t\t * @default [100,400]\n\t\t */\n\t\tthis.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t/**\n\t\t * A texture that defines the thickness of the iridescence layer, stored in the green channel.\n\t\t * Minimum and maximum values of thickness are defined by `iridescenceThicknessRange` array:\n\t\t * - `0.0` in the green channel will result in thickness equal to first element of the array.\n\t\t * - `1.0` in the green channel will result in thickness equal to second element of the array.\n\t\t * - Values in-between will linearly interpolate between the elements of the array.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceThicknessMap = null;\n\n\t\t/**\n\t\t * The sheen tint.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.sheenColor = new Color( 0x000000 );\n\n\t\t/**\n\t\t * The RGB channels of this texture are multiplied against `sheenColor`, for per-pixel control\n\t\t * over sheen tint.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenColorMap = null;\n\n\t\t/**\n\t\t * Roughness of the sheen layer, from `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.sheenRoughness = 1.0;\n\n\t\t/**\n\t\t * The alpha channel of this texture is multiplied against `sheenRoughness`, for per-pixel control\n\t\t * over sheen roughness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenRoughnessMap = null;\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `transmission`, for per-pixel control over\n\t\t * optical transparency.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.transmissionMap = null;\n\n\t\t/**\n\t\t * The thickness of the volume beneath the surface. The value is given in the\n\t\t * coordinate space of the mesh. If the value is `0` the material is\n\t\t * thin-walled. Otherwise the material is a volume boundary.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.thickness = 0;\n\n\t\t/**\n\t\t * A texture that defines the thickness, stored in the green channel. This will\n\t\t * be multiplied by `thickness`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.thicknessMap = null;\n\n\t\t/**\n\t\t * Density of the medium given as the average distance that light travels in\n\t\t * the medium before interacting with a particle. The value is given in world\n\t\t * space units, and must be greater than zero.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.attenuationDistance = Infinity;\n\n\t\t/**\n\t\t * The color that white light turns into due to absorption when reaching the\n\t\t * attenuation distance.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.attenuationColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * A float that scales the amount of specular reflection for non-metals only.\n\t\t * When set to zero, the model is effectively Lambertian. From `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.specularIntensity = 1.0;\n\n\t\t/**\n\t\t * The alpha channel of this texture is multiplied against `specularIntensity`,\n\t\t * for per-pixel control over specular intensity.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularIntensityMap = null;\n\n\t\t/**\n\t\t * Tints the specular reflection at normal incidence for non-metals only.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.specularColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * The RGB channels of this texture are multiplied against `specularColor`,\n\t\t * for per-pixel control over specular color.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularColorMap = null;\n\n\t\tthis._anisotropy = 0;\n\t\tthis._clearcoat = 0;\n\t\tthis._dispersion = 0;\n\t\tthis._iridescence = 0;\n\t\tthis._sheen = 0.0;\n\t\tthis._transmission = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * The anisotropy strength, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget anisotropy() {\n\n\t\treturn this._anisotropy;\n\n\t}\n\n\tset anisotropy( value ) {\n\n\t\tif ( this._anisotropy > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._anisotropy = value;\n\n\t}\n\n\t/**\n\t * Represents the intensity of the clear coat layer, from `0.0` to `1.0`. Use\n\t * clear coat related properties to enable multilayer materials that have a\n\t * thin translucent layer over the base layer.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget clearcoat() {\n\n\t\treturn this._clearcoat;\n\n\t}\n\n\tset clearcoat( value ) {\n\n\t\tif ( this._clearcoat > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._clearcoat = value;\n\n\t}\n\t/**\n\t * The intensity of the iridescence layer, simulating RGB color shift based on the angle between\n\t * the surface and the viewer, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget iridescence() {\n\n\t\treturn this._iridescence;\n\n\t}\n\n\tset iridescence( value ) {\n\n\t\tif ( this._iridescence > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._iridescence = value;\n\n\t}\n\n\t/**\n\t * Defines the strength of the angular separation of colors (chromatic aberration) transmitting\n\t * through a relatively clear volume. Any value zero or larger is valid, the typical range of\n\t * realistic values is `[0, 1]`. This property can be only be used with transmissive objects.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget dispersion() {\n\n\t\treturn this._dispersion;\n\n\t}\n\n\tset dispersion( value ) {\n\n\t\tif ( this._dispersion > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._dispersion = value;\n\n\t}\n\n\t/**\n\t * The intensity of the sheen layer, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget sheen() {\n\n\t\treturn this._sheen;\n\n\t}\n\n\tset sheen( value ) {\n\n\t\tif ( this._sheen > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._sheen = value;\n\n\t}\n\n\t/**\n\t * Degree of transmission (or optical transparency), from `0.0` to `1.0`.\n\t *\n\t * Thin, transparent or semitransparent, plastic or glass materials remain\n\t * largely reflective even if they are fully transmissive. The transmission\n\t * property can be used to model these materials.\n\t *\n\t * When transmission is non-zero, `opacity` should be set to `1`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget transmission() {\n\n\t\treturn this._transmission;\n\n\t}\n\n\tset transmission( value ) {\n\n\t\tif ( this._transmission > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._transmission = value;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.anisotropy = source.anisotropy;\n\t\tthis.anisotropyRotation = source.anisotropyRotation;\n\t\tthis.anisotropyMap = source.anisotropyMap;\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\t\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\t\tthis.dispersion = source.dispersion;\n\t\tthis.ior = source.ior;\n\n\t\tthis.iridescence = source.iridescence;\n\t\tthis.iridescenceMap = source.iridescenceMap;\n\t\tthis.iridescenceIOR = source.iridescenceIOR;\n\t\tthis.iridescenceThicknessRange = [ ...source.iridescenceThicknessRange ];\n\t\tthis.iridescenceThicknessMap = source.iridescenceThicknessMap;\n\n\t\tthis.sheen = source.sheen;\n\t\tthis.sheenColor.copy( source.sheenColor );\n\t\tthis.sheenColorMap = source.sheenColorMap;\n\t\tthis.sheenRoughness = source.sheenRoughness;\n\t\tthis.sheenRoughnessMap = source.sheenRoughnessMap;\n\n\t\tthis.transmission = source.transmission;\n\t\tthis.transmissionMap = source.transmissionMap;\n\n\t\tthis.thickness = source.thickness;\n\t\tthis.thicknessMap = source.thicknessMap;\n\t\tthis.attenuationDistance = source.attenuationDistance;\n\t\tthis.attenuationColor.copy( source.attenuationColor );\n\n\t\tthis.specularIntensity = source.specularIntensity;\n\t\tthis.specularIntensityMap = source.specularIntensityMap;\n\t\tthis.specularColor.copy( source.specularColor );\n\t\tthis.specularColorMap = source.specularColorMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for shiny surfaces with specular highlights.\n *\n * The material uses a non-physically based [Blinn-Phong](https://en.wikipedia.org/wiki/Blinn-Phong_shading_model)\n * model for calculating reflectance. Unlike the Lambertian model used in the\n * {@link MeshLambertMaterial} this can simulate shiny surfaces with specular\n * highlights (such as varnished wood). `MeshPhongMaterial` uses per-fragment shading.\n *\n * Performance will generally be greater when using this material over the\n * {@link MeshStandardMaterial} or {@link MeshPhysicalMaterial}, at the cost of\n * some graphical accuracy.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshPhongMaterial\n */\nclass MeshPhongMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh phong material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhongMaterial = true;\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * Specular color of the material. The default color is set to `0x111111` (very dark grey)\n\t\t *\n\t\t * This defines how shiny the material is and the color of its shine.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.specular = new Color( 0x111111 );\n\n\t\t/**\n\t\t * How shiny the specular highlight is; a higher value gives a sharper highlight.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 30\n\t\t */\n\t\tthis.shininess = 30;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The specular map value affects both how much the specular surface\n\t\t * highlight contributes and how much of the environment map affects the\n\t\t * surface.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material implementing toon shading.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshToonMaterial\n */\nclass MeshToonMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh toon material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshToonMaterial = true;\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * Gradient map for toon shading. It's required to set\n\t\t * {@link Texture#minFilter} and {@link Texture#magFilter} to {@linkNearestFilter}\n\t\t * when using this type of texture.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.gradientMap = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material that maps the normal vectors to RGB colors.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshNormalMaterial\n */\nclass MeshNormalMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh normal material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshNormalMaterial = true;\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for non-shiny surfaces, without specular highlights.\n *\n * The material uses a non-physically based [Lambertian](https://en.wikipedia.org/wiki/Lambertian_reflectance)\n * model for calculating reflectance. This can simulate some surfaces (such\n * as untreated wood or stone) well, but cannot simulate shiny surfaces with\n * specular highlights (such as varnished wood). `MeshLambertMaterial` uses per-fragment\n * shading.\n *\n * Due to the simplicity of the reflectance and illumination models,\n * performance will be greater when using this material over the\n * {@link MeshPhongMaterial}, {@link MeshStandardMaterial} or\n * {@link MeshPhysicalMaterial}, at the cost of some graphical accuracy.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshLambertMaterial\n */\nclass MeshLambertMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh lambert material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshLambertMaterial = true;\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Specular map used by the material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for drawing geometry by depth. Depth is based off of the camera\n * near and far plane. White is nearest, black is farthest.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshDepthMaterial\n */\nclass MeshDepthMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh depth material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshDepthMaterial = true;\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\t/**\n\t\t * Type for depth packing.\n\t\t *\n\t\t * @type {(BasicDepthPacking|RGBADepthPacking|RGBDepthPacking|RGDepthPacking)}\n\t\t * @default BasicDepthPacking\n\t\t */\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material used internally for implementing shadow mapping with\n * point lights.\n *\n * Can also be used to customize the shadow casting of an object by assigning\n * an instance of `MeshDistanceMaterial` to {@link Object3D#customDistanceMaterial}.\n * The following examples demonstrates this approach in order to ensure\n * transparent parts of objects do not cast shadows.\n *\n * @augments Material\n */\nclass MeshDistanceMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh distance material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshDistanceMaterial = true;\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This material is defined by a MatCap (or Lit Sphere) texture, which encodes the\n * material color and shading.\n *\n * `MeshMatcapMaterial` does not respond to lights since the matcap image file encodes\n * baked lighting. It will cast a shadow onto an object that receives shadows\n * (and shadow clipping works), but it will not self-shadow or receive\n * shadows.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshMatcapMaterial\n */\nclass MeshMatcapMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh matcap material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshMatcapMaterial = true;\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.type = 'MeshMatcapMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The matcap map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.matcap = null;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.matcap = source.matcap;\n\n\t\tthis.map = source.map;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for rendering line primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const material = new THREE.LineDashedMaterial( {\n * \tcolor: 0xffffff,\n * \tscale: 1,\n * \tdashSize: 3,\n * \tgapSize: 1,\n * } );\n * ```\n *\n * @augments LineBasicMaterial\n */\nclass LineDashedMaterial extends LineBasicMaterial {\n\n\t/**\n\t * Constructs a new line dashed material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineDashedMaterial = true;\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\t/**\n\t\t * The scale of the dashed part of a line.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.scale = 1;\n\n\t\t/**\n\t\t * The size of the dash. This is both the gap with the stroke.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 3\n\t\t */\n\t\tthis.dashSize = 3;\n\n\t\t/**\n\t\t * The size of the gap.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Converts an array to a specific type.\n *\n * @param {TypedArray|Array} array - The array to convert.\n * @param {TypedArray.constructor} type - The constructor of a typed array that defines the new type.\n * @return {TypedArray} The converted array.\n */\nfunction convertArray( array, type ) {\n\n\tif ( ! array || array.constructor === type ) return array;\n\n\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\treturn new type( array ); // create typed array\n\n\t}\n\n\treturn Array.prototype.slice.call( array ); // create Array\n\n}\n\n/**\n * Returns `true` if the given object is a typed array.\n *\n * @param {any} object - The object to check.\n * @return {boolean} Whether the given object is a typed array.\n */\nfunction isTypedArray( object ) {\n\n\treturn ArrayBuffer.isView( object ) && ! ( object instanceof DataView );\n\n}\n\n/**\n * Returns an array by which times and values can be sorted.\n *\n * @param {Array} times - The keyframe time values.\n * @return {Array} The array.\n */\nfunction getKeyframeOrder( times ) {\n\n\tfunction compareTime( i, j ) {\n\n\t\treturn times[ i ] - times[ j ];\n\n\t}\n\n\tconst n = times.length;\n\tconst result = new Array( n );\n\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\tresult.sort( compareTime );\n\n\treturn result;\n\n}\n\n/**\n * Sorts the given array by the previously computed order via `getKeyframeOrder()`.\n *\n * @param {Array} values - The values to sort.\n * @param {number} stride - The stride.\n * @param {Array} order - The sort order.\n * @return {Array} The sorted values.\n */\nfunction sortedArray( values, stride, order ) {\n\n\tconst nValues = values.length;\n\tconst result = new values.constructor( nValues );\n\n\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\tconst srcOffset = order[ i ] * stride;\n\n\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * Used for parsing AOS keyframe formats.\n *\n * @param {Array} jsonKeys - A list of JSON keyframes.\n * @param {Array} times - This array will be filled with keyframe times by this function.\n * @param {Array} values - This array will be filled with keyframe values by this function.\n * @param {string} valuePropertyName - The name of the property to use.\n */\nfunction flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\tlet i = 1, key = jsonKeys[ 0 ];\n\n\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\tkey = jsonKeys[ i ++ ];\n\n\t}\n\n\tif ( key === undefined ) return; // no data\n\n\tlet value = key[ valuePropertyName ];\n\tif ( value === undefined ) return; // no data\n\n\tif ( Array.isArray( value ) ) {\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( ...value ); // push all elements\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else if ( value.toArray !== undefined ) {\n\n\t\t// ...assume THREE.Math-ish\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else {\n\n\t\t// otherwise push as-is\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( value );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t}\n\n}\n\n/**\n * Creates a new clip, containing only the segment of the original clip between the given frames.\n *\n * @param {AnimationClip} sourceClip - The values to sort.\n * @param {string} name - The name of the clip.\n * @param {number} startFrame - The start frame.\n * @param {number} endFrame - The end frame.\n * @param {number} [fps=30] - The FPS.\n * @return {AnimationClip} The new sub clip.\n */\nfunction subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\tconst clip = sourceClip.clone();\n\n\tclip.name = name;\n\n\tconst tracks = [];\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tconst track = clip.tracks[ i ];\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( times.length === 0 ) continue;\n\n\t\ttrack.times = convertArray( times, track.times.constructor );\n\t\ttrack.values = convertArray( values, track.values.constructor );\n\n\t\ttracks.push( track );\n\n\t}\n\n\tclip.tracks = tracks;\n\n\t// find minimum .times value across all tracks in the trimmed clip\n\n\tlet minStartTime = Infinity;\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t}\n\n\t}\n\n\t// shift all tracks such that clip begins at t=0\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tclip.tracks[ i ].shift( -1 * minStartTime );\n\n\t}\n\n\tclip.resetDuration();\n\n\treturn clip;\n\n}\n\n/**\n * Converts the keyframes of the given animation clip to an additive format.\n *\n * @param {AnimationClip} targetClip - The clip to make additive.\n * @param {number} [referenceFrame=0] - The reference frame.\n * @param {AnimationClip} [referenceClip=targetClip] - The reference clip.\n * @param {number} [fps=30] - The FPS.\n * @return {AnimationClip} The updated clip which is now additive.\n */\nfunction makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\tif ( fps <= 0 ) fps = 30;\n\n\tconst numTracks = referenceClip.tracks.length;\n\tconst referenceTime = referenceFrame / fps;\n\n\t// Make each track's values relative to the values at the reference frame\n\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t// Skip this track if it's non-numeric\n\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t} );\n\n\t\tif ( targetTrack === undefined ) continue;\n\n\t\tlet referenceOffset = 0;\n\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t}\n\n\t\tlet targetOffset = 0;\n\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t}\n\n\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\tlet referenceValue;\n\n\t\t// Find the value to subtract out of the track\n\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else {\n\n\t\t\t// Interpolate to the reference value\n\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\treferenceValue = interpolant.resultBuffer.slice( startIndex, endIndex );\n\n\t\t}\n\n\t\t// Conjugate the quaternion\n\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t}\n\n\t\t// Subtract the reference value from all of the track values\n\n\t\tconst numTimes = targetTrack.times.length;\n\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart,\n\t\t\t\t\treferenceValue,\n\t\t\t\t\t0,\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\treturn targetClip;\n\n}\n\n/**\n * A class with various methods to assist with animations.\n *\n * @hideconstructor\n */\nclass AnimationUtils {\n\n\t/**\n\t * Converts an array to a specific type\n\t *\n\t * @static\n\t * @param {TypedArray|Array} array - The array to convert.\n\t * @param {TypedArray.constructor} type - The constructor of a type array.\n\t * @return {TypedArray} The converted array\n\t */\n\tstatic convertArray( array, type ) {\n\n\t\treturn convertArray( array, type );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given object is a typed array.\n\t *\n\t * @static\n\t * @param {any} object - The object to check.\n\t * @return {boolean} Whether the given object is a typed array.\n\t */\n\tstatic isTypedArray( object ) {\n\n\t\treturn isTypedArray( object );\n\n\t}\n\n\t/**\n\t * Returns an array by which times and values can be sorted.\n\t *\n\t * @static\n\t * @param {Array} times - The keyframe time values.\n\t * @return {Array} The array.\n\t */\n\tstatic getKeyframeOrder( times ) {\n\n\t\treturn getKeyframeOrder( times );\n\n\t}\n\n\t/**\n\t * Sorts the given array by the previously computed order via `getKeyframeOrder()`.\n\t *\n\t * @static\n\t * @param {Array} values - The values to sort.\n\t * @param {number} stride - The stride.\n\t * @param {Array} order - The sort order.\n\t * @return {Array} The sorted values.\n\t */\n\tstatic sortedArray( values, stride, order ) {\n\n\t\treturn sortedArray( values, stride, order );\n\n\t}\n\n\t/**\n\t * Used for parsing AOS keyframe formats.\n\t *\n\t * @static\n\t * @param {Array} jsonKeys - A list of JSON keyframes.\n\t * @param {Array} times - This array will be filled with keyframe times by this method.\n\t * @param {Array} values - This array will be filled with keyframe values by this method.\n\t * @param {string} valuePropertyName - The name of the property to use.\n\t */\n\tstatic flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\t\tflattenJSON( jsonKeys, times, values, valuePropertyName );\n\n\t}\n\n\t/**\n\t * Creates a new clip, containing only the segment of the original clip between the given frames.\n\t *\n\t * @static\n\t * @param {AnimationClip} sourceClip - The values to sort.\n\t * @param {string} name - The name of the clip.\n\t * @param {number} startFrame - The start frame.\n\t * @param {number} endFrame - The end frame.\n\t * @param {number} [fps=30] - The FPS.\n\t * @return {AnimationClip} The new sub clip.\n\t */\n\tstatic subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\t\treturn subclip( sourceClip, name, startFrame, endFrame, fps );\n\n\t}\n\n\t/**\n\t * Converts the keyframes of the given animation clip to an additive format.\n\t *\n\t * @static\n\t * @param {AnimationClip} targetClip - The clip to make additive.\n\t * @param {number} [referenceFrame=0] - The reference frame.\n\t * @param {AnimationClip} [referenceClip=targetClip] - The reference clip.\n\t * @param {number} [fps=30] - The FPS.\n\t * @return {AnimationClip} The updated clip which is now additive.\n\t */\n\tstatic makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\t\treturn makeClipAdditive( targetClip, referenceFrame, referenceClip, fps );\n\n\t}\n\n}\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References: {@link http://www.oodesign.com/template-method-pattern.html}\n *\n * @abstract\n */\nclass Interpolant {\n\n\t/**\n\t * Constructs a new interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\t/**\n\t\t * The parameter positions.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.parameterPositions = parameterPositions;\n\n\t\t/**\n\t\t * A cache index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._cachedIndex = 0;\n\n\t\t/**\n\t\t * The result buffer.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.resultBuffer = resultBuffer !== undefined ? resultBuffer : new sampleValues.constructor( sampleSize );\n\n\t\t/**\n\t\t * The sample values.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.sampleValues = sampleValues;\n\n\t\t/**\n\t\t * The value size.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.valueSize = sampleSize;\n\n\t\t/**\n\t\t * The interpolation settings.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.settings = null;\n\n\t\t/**\n\t\t * The default settings object.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.DefaultSettings_ = {};\n\n\t}\n\n\t/**\n\t * Evaluate the interpolant at position `t`.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tevaluate( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t}\n\n\t/**\n\t * Returns the interpolation settings.\n\t *\n\t * @return {Object} The interpolation settings.\n\t */\n\tgetSettings_() {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @param {number} index - An index into the sample value buffer.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tcopySampleValue_( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @abstract\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t * @param {number} t1 - The next interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tinterpolate_( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t}\n\n\t/**\n\t * Optional method that is executed when the interval has changed.\n\t *\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t */\n\tintervalChanged_( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n}\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n *\n * @augments Interpolant\n */\nclass CubicInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new cubic interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t\tthis.DefaultSettings_ = {\n\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\n\t\t};\n\n\t}\n\n\tintervalChanged_( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( -1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\tconst s1 = ( -1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A basic linear interpolant.\n *\n * @augments Interpolant\n */\nclass LinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new linear interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * Interpolant that evaluates to the sample value at the position preceding\n * the parameter.\n *\n * @augments Interpolant\n */\nclass DiscreteInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new discrete interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n}\n\n/**\n * Represents s a timed sequence of keyframes, which are composed of lists of\n * times and related values, and which are used to animate a specific property\n * of an object.\n */\nclass KeyframeTrack {\n\n\t/**\n\t * Constructs a new keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\t\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\t\t/**\n\t\t * The track's name can refer to morph targets or bones or\n\t\t * possibly other values within an animated object. See {@link PropertyBinding#parseTrackName}\n\t\t * for the forms of strings that can be parsed for property binding.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * The keyframe times.\n\t\t *\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.times = convertArray( times, this.TimeBufferType );\n\n\t\t/**\n\t\t * The keyframe values.\n\t\t *\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.values = convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t}\n\n\t/**\n\t * Converts the keyframe track to JSON.\n\t *\n\t * @static\n\t * @param {KeyframeTrack} track - The keyframe track to serialize.\n\t * @return {Object} The serialized keyframe track as JSON.\n\t */\n\tstatic toJSON( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== this.toJSON ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': convertArray( track.times, Array ),\n\t\t\t\t'values': convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n\t/**\n\t * Factory method for creating a new discrete interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {DiscreteInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodDiscrete( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Factory method for creating a new linear interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {LinearInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Factory method for creating a new smooth interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {CubicInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodSmooth( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Defines the interpolation factor method for this keyframe track.\n\t *\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} interpolation - The interpolation type.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tsetInterpolation( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = 'unsupported interpolation for ' +\n\t\t\t\tthis.ValueTypeName + ' keyframe track named ' + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\twarn( 'KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current interpolation type.\n\t *\n\t * @return {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} The interpolation type.\n\t */\n\tgetInterpolation() {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the value size.\n\t *\n\t * @return {number} The value size.\n\t */\n\tgetValueSize() {\n\n\t\treturn this.values.length / this.times.length;\n\n\t}\n\n\t/**\n\t * Moves all keyframes either forward or backward in time.\n\t *\n\t * @param {number} timeOffset - The offset to move the time values.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tshift( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scale all keyframe times by a factor (useful for frame - seconds conversions).\n\t *\n\t * @param {number} timeScale - The time scale.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tscale( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes keyframes before and after animation without changing any values within the defined time range.\n\t *\n\t * Note: The method does not shift around keys to the start of the track time, because for interpolated\n\t * keys this will change their values\n\t *\n\t * @param {number} startTime - The start time.\n\t * @param {number} endTime - The end time.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\ttrim( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== -1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = times.slice( from, to );\n\t\t\tthis.values = this.values.slice( from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs minimal validation on the keyframe track. Returns `true` if the values\n\t * are valid.\n\t *\n\t * @return {boolean} Whether the keyframes are valid or not.\n\t */\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\terror( 'KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\terror( 'KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\terror( 'KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\terror( 'KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\terror( 'KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t/**\n\t * Optimizes this keyframe track by removing equivalent sequential keys (which are\n\t * common in morph target sequences).\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\toptimize() {\n\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = this.times.slice(),\n\t\t\tvalues = this.values.slice(),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = times.slice( 0, writeIndex );\n\t\t\tthis.values = values.slice( 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new keyframe track with copied values from this instance.\n\t *\n\t * @return {KeyframeTrack} A clone of this instance.\n\t */\n\tclone() {\n\n\t\tconst times = this.times.slice();\n\t\tconst values = this.values.slice();\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default ''\n */\nKeyframeTrack.prototype.ValueTypeName = '';\n\n/**\n * The time buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Float32Array.constructor\n */\nKeyframeTrack.prototype.TimeBufferType = Float32Array;\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Float32Array.constructor\n */\nKeyframeTrack.prototype.ValueBufferType = Float32Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateLinear\n */\nKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\n\n/**\n * A track for boolean keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new boolean keyframe track.\n\t *\n\t * This keyframe track type has no `interpolation` parameter because the\n\t * interpolation is always discrete.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t */\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'bool'\n */\nBooleanKeyframeTrack.prototype.ValueTypeName = 'bool';\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Array.constructor\n */\nBooleanKeyframeTrack.prototype.ValueBufferType = Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateDiscrete\n */\nBooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for color keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass ColorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new color keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'color'\n */\nColorKeyframeTrack.prototype.ValueTypeName = 'color';\n\n/**\n * A track for numeric keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass NumberKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new number keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'number'\n */\nNumberKeyframeTrack.prototype.ValueTypeName = 'number';\n\n/**\n * Spherical linear unit quaternion interpolant.\n *\n * @augments Interpolant\n */\nclass QuaternionLinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new SLERP interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A track for Quaternion keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new Quaternion keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n\t/**\n\t * Overwritten so the method returns Quaternion based interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {QuaternionLinearInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'quaternion'\n */\nQuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';\n// ValueBufferType is inherited\n// DefaultInterpolation is inherited;\nQuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for string keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass StringKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new string keyframe track.\n\t *\n\t * This keyframe track type has no `interpolation` parameter because the\n\t * interpolation is always discrete.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t */\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'string'\n */\nStringKeyframeTrack.prototype.ValueTypeName = 'string';\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Array.constructor\n */\nStringKeyframeTrack.prototype.ValueBufferType = Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateDiscrete\n */\nStringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for vector keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass VectorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new vector keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array} times - A list of keyframe times.\n\t * @param {Array} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {String}\n * @default 'vector'\n */\nVectorKeyframeTrack.prototype.ValueTypeName = 'vector';\n\n/**\n * A reusable set of keyframe tracks which represent an animation.\n */\nclass AnimationClip {\n\n\t/**\n\t * Constructs a new animation clip.\n\t *\n\t * Note: Instead of instantiating an AnimationClip directly with the constructor, you can\n\t * use the static interface of this class for creating clips. In most cases though, animation clips\n\t * will automatically be created by loaders when importing animated 3D assets.\n\t *\n\t * @param {string} [name=''] - The clip's name.\n\t * @param {number} [duration=-1] - The clip's duration in seconds. If a negative value is passed,\n\t * the duration will be calculated from the passed keyframes.\n\t * @param {Array} tracks - An array of keyframe tracks.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode=NormalAnimationBlendMode] - Defines how the animation\n\t * is blended/combined when two or more animations are simultaneously played.\n\t */\n\tconstructor( name = '', duration = -1, tracks = [], blendMode = NormalAnimationBlendMode ) {\n\n\t\t/**\n\t\t * The clip's name.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * An array of keyframe tracks.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.tracks = tracks;\n\n\t\t/**\n\t\t * The clip's duration in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.duration = duration;\n\n\t\t/**\n\t\t * Defines how the animation is blended/combined when two or more animations\n\t\t * are simultaneously played.\n\t\t *\n\t\t * @type {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)}\n\t\t */\n\t\tthis.blendMode = blendMode;\n\n\t\t/**\n\t\t * The UUID of the animation clip.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the animation clip.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Factory method for creating an animation clip from the given JSON.\n\t *\n\t * @static\n\t * @param {Object} json - The serialized animation clip.\n\t * @return {AnimationClip} The new animation clip.\n\t */\n\tstatic parse( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new this( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\tclip.userData = JSON.parse( json.userData || '{}' );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Serializes the given animation clip into JSON.\n\t *\n\t * @static\n\t * @param {AnimationClip} clip - The animation clip to serialize.\n\t * @return {Object} The JSON object.\n\t */\n\tstatic toJSON( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode,\n\t\t\t'userData': JSON.stringify( clip.userData ),\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t}\n\n\t/**\n\t * Returns a new animation clip from the passed morph targets array of a\n\t * geometry, taking a name and the number of frames per second.\n\t *\n\t * Note: The fps parameter is required, but the animation speed can be\n\t * overridden via {@link AnimationAction#setDuration}.\n\t *\n\t * @static\n\t * @param {string} name - The name of the animation clip.\n\t * @param {Array} morphTargetSequence - A sequence of morph targets.\n\t * @param {number} fps - The Frames-Per-Second value.\n\t * @param {boolean} noLoop - Whether the clip should be no loop or not.\n\t * @return {AnimationClip} The new animation clip.\n\t */\n\tstatic CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = getKeyframeOrder( times );\n\t\t\ttimes = sortedArray( times, 1, order );\n\t\t\tvalues = sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new this( name, -1, tracks );\n\n\t}\n\n\t/**\n\t * Searches for an animation clip by name, taking as its first parameter\n\t * either an array of clips, or a mesh or geometry that contains an\n\t * array named \"animations\" property.\n\t *\n\t * @static\n\t * @param {(Array|Object3D)} objectOrClipArray - The array or object to search through.\n\t * @param {string} name - The name to search for.\n\t * @return {?AnimationClip} The found animation clip. Returns `null` if no clip has been found.\n\t */\n\tstatic findByName( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Returns an array of new AnimationClips created from the morph target\n\t * sequences of a geometry, trying to sort morph target names into\n\t * animation-group-based patterns like \"Walk_001, Walk_002, Run_001, Run_002...\".\n\t *\n\t * See {@link MD2Loader#parse} as an example for how the method should be used.\n\t *\n\t * @static\n\t * @param {Array} morphTargets - A sequence of morph targets.\n\t * @param {number} fps - The Frames-Per-Second value.\n\t * @param {boolean} noLoop - Whether the clip should be no loop or not.\n\t * @return {Array} An array of new animation clips.\n\t */\n\tstatic CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t}\n\n\t/**\n\t * Parses the `animation.hierarchy` format and returns a new animation clip.\n\t *\n\t * @static\n\t * @deprecated since r175.\n\t * @param {Object} animation - A serialized animation clip as JSON.\n\t * @param {Array} bones - An array of bones.\n\t * @return {?AnimationClip} The new animation clip.\n\t */\n\tstatic parseAnimation( animation, bones ) {\n\n\t\twarn( 'AnimationClip: parseAnimation() is deprecated and will be removed with r185' );\n\n\t\tif ( ! animation ) {\n\n\t\t\terror( 'AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tflattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || -1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = -1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * fps;\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new this( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Sets the duration of this clip to the duration of its longest keyframe track.\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\tresetDuration() {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Trims all tracks to the clip's duration.\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\ttrim() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs minimal validation on each track in the clip. Returns `true` if all\n\t * tracks are valid.\n\t *\n\t * @return {boolean} Whether the clip's keyframes are valid or not.\n\t */\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t/**\n\t * Optimizes each track by removing equivalent sequential keys (which are\n\t * common in morph target sequences).\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\toptimize() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new animation clip with copied values from this instance.\n\t *\n\t * @return {AnimationClip} A clone of this instance.\n\t */\n\tclone() {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\tconst clip = new this.constructor( this.name, this.duration, tracks, this.blendMode );\n\n\t\tclip.userData = JSON.parse( JSON.stringify( this.userData ) );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Serializes this animation clip into JSON.\n\t *\n\t * @return {Object} The JSON object.\n\t */\n\ttoJSON() {\n\n\t\treturn this.constructor.toJSON( this );\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tflattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\n/**\n * @class\n * @classdesc A simple caching system, used internally by {@link FileLoader}.\n * To enable caching across all loaders that use {@link FileLoader}, add `THREE.Cache.enabled = true.` once in your app.\n * @hideconstructor\n */\nconst Cache = {\n\n\t/**\n\t * Whether caching is enabled or not.\n\t *\n\t * @static\n\t * @type {boolean}\n\t * @default false\n\t */\n\tenabled: false,\n\n\t/**\n\t * A dictionary that holds cached files.\n\t *\n\t * @static\n\t * @type {Object}\n\t */\n\tfiles: {},\n\n\t/**\n\t * Adds a cache entry with a key to reference the file. If this key already\n\t * holds a file, it is overwritten.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t * @param {Object} file - The file to be cached.\n\t */\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// log( 'Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\t/**\n\t * Gets the cached value for the given key.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t * @return {Object|undefined} The cached file. If the key does not exist `undefined` is returned.\n\t */\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// log( 'Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\t/**\n\t * Removes the cached file associated with the given key.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t */\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\t/**\n\t * Remove all values from the cache.\n\t *\n\t * @static\n\t */\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\n/**\n * Handles and keeps track of loaded and pending data. A default global\n * instance of this class is created and used by loaders if not supplied\n * manually.\n *\n * In general that should be sufficient, however there are times when it can\n * be useful to have separate loaders - for example if you want to show\n * separate loading bars for objects and textures.\n *\n * ```js\n * const manager = new THREE.LoadingManager();\n * manager.onLoad = () => console.log( 'Loading complete!' );\n *\n * const loader1 = new OBJLoader( manager );\n * const loader2 = new ColladaLoader( manager );\n * ```\n */\nclass LoadingManager {\n\n\t/**\n\t * Constructs a new loading manager.\n\t *\n\t * @param {Function} [onLoad] - Executes when all items have been loaded.\n\t * @param {Function} [onProgress] - Executes when single items have been loaded.\n\t * @param {Function} [onError] - Executes when an error occurs.\n\t */\n\tconstructor( onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet isLoading = false;\n\t\tlet itemsLoaded = 0;\n\t\tlet itemsTotal = 0;\n\t\tlet urlModifier = undefined;\n\t\tconst handlers = [];\n\n\t\t// Refer to #5689 for the reason why we don't set .onStart\n\t\t// in the constructor\n\n\t\t/**\n\t\t * Executes when an item starts loading.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onStart = undefined;\n\n\t\t/**\n\t\t * Executes when all items have been loaded.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onLoad = onLoad;\n\n\t\t/**\n\t\t * Executes when single items have been loaded.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onProgress = onProgress;\n\n\t\t/**\n\t\t * Executes when an error occurs.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onError = onError;\n\n\t\t/**\n\t\t * Used for aborting ongoing requests in loaders using this manager.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController | null}\n\t\t */\n\t\tthis._abortController = null;\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * starts loading an item.\n\t\t *\n\t\t * @param {string} url - The URL to load.\n\t\t */\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * ended loading an item.\n\t\t *\n\t\t * @param {string} url - The URL of the loaded item.\n\t\t */\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * encounters an error when loading an item.\n\t\t *\n\t\t * @param {string} url - The URL of the item that produces an error.\n\t\t */\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Given a URL, uses the URL modifier callback (if any) and returns a\n\t\t * resolved URL. If no URL modifier is set, returns the original URL.\n\t\t *\n\t\t * @param {string} url - The URL to load.\n\t\t * @return {string} The resolved URL.\n\t\t */\n\t\tthis.resolveURL = function ( url ) {\n\n\t\t\tif ( urlModifier ) {\n\n\t\t\t\treturn urlModifier( url );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t};\n\n\t\t/**\n\t\t * If provided, the callback will be passed each resource URL before a\n\t\t * request is sent. The callback may return the original URL, or a new URL to\n\t\t * override loading behavior. This behavior can be used to load assets from\n\t\t * .ZIP files, drag-and-drop APIs, and Data URIs.\n\t\t *\n\t\t * ```js\n\t\t * const blobs = {'fish.gltf': blob1, 'diffuse.png': blob2, 'normal.png': blob3};\n\t\t *\n\t\t * const manager = new THREE.LoadingManager();\n\t\t *\n\t\t * // Initialize loading manager with URL callback.\n\t\t * const objectURLs = [];\n\t\t * manager.setURLModifier( ( url ) => {\n\t\t *\n\t\t * \turl = URL.createObjectURL( blobs[ url ] );\n\t\t * \tobjectURLs.push( url );\n\t\t * \treturn url;\n\t\t *\n\t\t * } );\n\t\t *\n\t\t * // Load as usual, then revoke the blob URLs.\n\t\t * const loader = new GLTFLoader( manager );\n\t\t * loader.load( 'fish.gltf', (gltf) => {\n\t\t *\n\t\t * \tscene.add( gltf.scene );\n\t\t * \tobjectURLs.forEach( ( url ) => URL.revokeObjectURL( url ) );\n\t\t *\n\t\t * } );\n\t\t * ```\n\t\t *\n\t\t * @param {function(string):string} transform - URL modifier callback. Called with an URL and must return a resolved URL.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.setURLModifier = function ( transform ) {\n\n\t\t\turlModifier = transform;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Registers a loader with the given regular expression. Can be used to\n\t\t * define what loader should be used in order to load specific files. A\n\t\t * typical use case is to overwrite the default loader for textures.\n\t\t *\n\t\t * ```js\n\t\t * // add handler for TGA textures\n\t\t * manager.addHandler( /\\.tga$/i, new TGALoader() );\n\t\t * ```\n\t\t *\n\t\t * @param {string} regex - A regular expression.\n\t\t * @param {Loader} loader - A loader that should handle matched cases.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.addHandler = function ( regex, loader ) {\n\n\t\t\thandlers.push( regex, loader );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Removes the loader for the given regular expression.\n\t\t *\n\t\t * @param {string} regex - A regular expression.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.removeHandler = function ( regex ) {\n\n\t\t\tconst index = handlers.indexOf( regex );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\thandlers.splice( index, 2 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to retrieve the registered loader for the given file path.\n\t\t *\n\t\t * @param {string} file - The file path.\n\t\t * @return {?Loader} The registered loader. Returns `null` if no loader was found.\n\t\t */\n\t\tthis.getHandler = function ( file ) {\n\n\t\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tconst regex = handlers[ i ];\n\t\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to abort ongoing loading requests in loaders using this manager.\n\t\t * The abort only works if the loaders implement {@link Loader#abort} and `AbortSignal.any()`\n\t\t * is supported in the browser.\n\t\t *\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.abort = function () {\n\n\n\t\t\tthis.abortController.abort();\n\t\t\tthis._abortController = null;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}\n\n\t// TODO: Revert this back to a single member variable once this issue has been fixed\n\t// https://github.com/cloudflare/workerd/issues/3657\n\n\t/**\n\t * Used for aborting ongoing requests in loaders using this manager.\n\t *\n\t * @type {AbortController}\n\t */\n\tget abortController() {\n\n\t\tif ( ! this._abortController ) {\n\n\t\t\tthis._abortController = new AbortController();\n\n\t\t}\n\n\t\treturn this._abortController;\n\n\t}\n\n}\n\n/**\n * The global default loading manager.\n *\n * @constant\n * @type {LoadingManager}\n */\nconst DefaultLoadingManager = /*@__PURE__*/ new LoadingManager();\n\n/**\n * Abstract base class for loaders.\n *\n * @abstract\n */\nclass Loader {\n\n\t/**\n\t * Constructs a new loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\t/**\n\t\t * The loading manager.\n\t\t *\n\t\t * @type {LoadingManager}\n\t\t * @default DefaultLoadingManager\n\t\t */\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t/**\n\t\t * The crossOrigin string to implement CORS for loading the url from a\n\t\t * different domain that allows CORS.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'anonymous'\n\t\t */\n\t\tthis.crossOrigin = 'anonymous';\n\n\t\t/**\n\t\t * Whether the XMLHttpRequest uses credentials.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.withCredentials = false;\n\n\t\t/**\n\t\t * The base path from which the asset will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = '';\n\n\t\t/**\n\t\t * The base path from which additional resources like textures will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.resourcePath = '';\n\n\t\t/**\n\t\t * The [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header)\n\t\t * used in HTTP request.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.requestHeader = {};\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for loading assets from the backend.\n\t *\n\t * @abstract\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {Function} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t */\n\tload( /* url, onLoad, onProgress, onError */ ) {}\n\n\t/**\n\t * A async version of {@link Loader#load}.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @return {Promise} A Promise that resolves when the asset has been loaded.\n\t */\n\tloadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for parsing the asset into three.js entities.\n\t *\n\t * @abstract\n\t * @param {any} data - The data to parse.\n\t */\n\tparse( /* data */ ) {}\n\n\t/**\n\t * Sets the `crossOrigin` String to implement CORS for loading the URL\n\t * from a different domain that allows CORS.\n\t *\n\t * @param {string} crossOrigin - The `crossOrigin` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetCrossOrigin( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Whether the XMLHttpRequest uses credentials such as cookies, authorization\n\t * headers or TLS client certificates, see [XMLHttpRequest.withCredentials](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials).\n\t *\n\t * Note: This setting has no effect if you are loading files locally or from the same domain.\n\t *\n\t * @param {boolean} value - The `withCredentials` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetWithCredentials( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for the asset.\n\t *\n\t * @param {string} path - The base path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for dependent resources like textures.\n\t *\n\t * @param {string} resourcePath - The resource path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetResourcePath( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given request header.\n\t *\n\t * @param {Object} requestHeader - A [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header)\n\t * for configuring the HTTP request.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetRequestHeader( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method can be implemented in loaders for aborting ongoing requests.\n\t *\n\t * @abstract\n\t * @return {Loader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Callback for onProgress in loaders.\n *\n * @callback onProgressCallback\n * @param {ProgressEvent} event - An instance of `ProgressEvent` that represents the current loading status.\n */\n\n/**\n * Callback for onError in loaders.\n *\n * @callback onErrorCallback\n * @param {Error} error - The error which occurred during the loading process.\n */\n\n/**\n * The default material name that is used by loaders\n * when creating materials for loaded 3D objects.\n *\n * Note: Not all loaders might honor this setting.\n *\n * @static\n * @type {string}\n * @default '__DEFAULT'\n */\nLoader.DEFAULT_MATERIAL_NAME = '__DEFAULT';\n\nconst loading = {};\n\nclass HttpError extends Error {\n\n\tconstructor( message, response ) {\n\n\t\tsuper( message );\n\t\tthis.response = response;\n\n\t}\n\n}\n\n/**\n * A low level class for loading resources with the Fetch API, used internally by\n * most loaders. It can also be used directly to load any file type that does\n * not have a loader.\n *\n * This loader supports caching. If you want to use it, add `THREE.Cache.enabled = true;`\n * once to your application.\n *\n * ```js\n * const loader = new THREE.FileLoader();\n * const data = await loader.loadAsync( 'example.txt' );\n * ```\n *\n * @augments Loader\n */\nclass FileLoader extends Loader {\n\n\t/**\n\t * Constructs a new file loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * The expected mime type. Valid values can be found\n\t\t * [here](hhttps://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#mimetype)\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.mimeType = '';\n\n\t\t/**\n\t\t * The expected response type.\n\t\t *\n\t\t * @type {('arraybuffer'|'blob'|'document'|'json'|'')}\n\t\t * @default ''\n\t\t */\n\t\tthis.responseType = '';\n\n\t\t/**\n\t\t * Used for aborting requests.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController}\n\t\t */\n\t\tthis._abortController = new AbortController();\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded response to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(any)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t * @return {any|undefined} The cached resource if available.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst cached = Cache.get( `file:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tsetTimeout( () => {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Initialise array for duplicate requests\n\t\tloading[ url ] = [];\n\n\t\tloading[ url ].push( {\n\t\t\tonLoad: onLoad,\n\t\t\tonProgress: onProgress,\n\t\t\tonError: onError,\n\t\t} );\n\n\t\t// create request\n\t\tconst req = new Request( url, {\n\t\t\theaders: new Headers( this.requestHeader ),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin',\n\t\t\tsignal: ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal\n\t\t} );\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch( req )\n\t\t\t.then( response => {\n\n\t\t\t\tif ( response.status === 200 || response.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( response.status === 0 ) {\n\n\t\t\t\t\t\twarn( 'FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {\n\n\t\t\t\t\t\treturn response;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\t\tconst reader = response.body.getReader();\n\n\t\t\t\t\t// Nginx needs X-File-Size check\n\t\t\t\t\t// https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n\t\t\t\t\tconst contentLength = response.headers.get( 'X-File-Size' ) || response.headers.get( 'Content-Length' );\n\t\t\t\t\tconst total = contentLength ? parseInt( contentLength ) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream( {\n\t\t\t\t\t\tstart( controller ) {\n\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\n\t\t\t\t\t\t\t\treader.read().then( ( { done, value } ) => {\n\n\t\t\t\t\t\t\t\t\tif ( done ) {\n\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\t\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue( value );\n\t\t\t\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}, ( e ) => {\n\n\t\t\t\t\t\t\t\t\tcontroller.error( e );\n\n\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn new Response( stream );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new HttpError( `fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( response => {\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\treturn response.blob();\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then( text => {\n\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString( text, mimeType );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( mimeType === '' ) {\n\n\t\t\t\t\t\t\treturn response.text();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec( mimeType );\n\t\t\t\t\t\t\tconst label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder( label );\n\t\t\t\t\t\t\treturn response.arrayBuffer().then( ab => decoder.decode( ab ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( data => {\n\n\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\tCache.add( `file:${url}`, data );\n\n\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( data );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( err => {\n\n\t\t\t\t// Abort errors and other errors are handled the same\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tif ( callbacks === undefined ) {\n\n\t\t\t\t\t// When onLoad was called and url was deleted in `loading`\n\t\t\t\t\tthis.manager.itemError( url );\n\t\t\t\t\tthrow err;\n\n\t\t\t\t}\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t} )\n\t\t\t.finally( () => {\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\tthis.manager.itemStart( url );\n\n\t}\n\n\t/**\n\t * Sets the expected response type.\n\t *\n\t * @param {('arraybuffer'|'blob'|'document'|'json'|'')} value - The response type.\n\t * @return {FileLoader} A reference to this file loader.\n\t */\n\tsetResponseType( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the expected mime type of the loaded file.\n\t *\n\t * @param {string} value - The mime type.\n\t * @return {FileLoader} A reference to this file loader.\n\t */\n\tsetMimeType( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Aborts ongoing fetch requests.\n\t *\n\t * @return {FileLoader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\tthis._abortController.abort();\n\t\tthis._abortController = new AbortController();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Class for loading animation clips in the JSON format. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.AnimationLoader();\n * const animations = await loader.loadAsync( 'animations/animation.js' );\n * ```\n *\n * @augments Loader\n */\nclass AnimationLoader extends Loader {\n\n\t/**\n\t * Constructs a new animation loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded animations as an array\n\t * holding instances of {@link AnimationClip} to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Array)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns an array of animation clips.\n\t *\n\t * @param {Object} json - The serialized animation clips.\n\t * @return {Array} The parsed animation clips.\n\t */\n\tparse( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n}\n\n/**\n * Abstract base class for loading compressed texture formats S3TC, ASTC or ETC.\n * Textures are internally loaded via {@link FileLoader}.\n *\n * Derived classes have to implement the `parse()` method which holds the parsing\n * for the respective format.\n *\n * @abstract\n * @augments Loader\n */\nclass CompressedTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new compressed texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded compressed texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(CompressedTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CompressedTexture} The compressed texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.image = images;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\nconst _loading = new WeakMap();\n\n/**\n * A loader for loading images. The class loads images with the HTML `Image` API.\n *\n * ```js\n * const loader = new THREE.ImageLoader();\n * const image = await loader.loadAsync( 'image.png' );\n * ```\n * Please note that `ImageLoader` has dropped support for progress\n * events in `r84`. For an `ImageLoader` that supports progress events, see\n * [this thread](https://github.com/mrdoob/three.js/issues/10439#issuecomment-275785639).\n *\n * @augments Loader\n */\nclass ImageLoader extends Loader {\n\n\t/**\n\t * Constructs a new image loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded image\n\t * to the `onLoad()` callback. The method also returns a new `Image` object which can\n\t * directly be used for texture creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Image)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {Image} The image.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( `image:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tif ( cached.complete === true ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tlet arr = _loading.get( cached );\n\n\t\t\t\tif ( arr === undefined ) {\n\n\t\t\t\t\tarr = [];\n\t\t\t\t\t_loading.set( cached, arr );\n\n\t\t\t\t}\n\n\t\t\t\tarr.push( { onLoad, onError } );\n\n\t\t\t}\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = createElementNS( 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\t//\n\n\t\t\tconst callbacks = _loading.get( this ) || [];\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i ++ ) {\n\n\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\tif ( callback.onLoad ) callback.onLoad( this );\n\n\t\t\t}\n\n\t\t\t_loading.delete( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tCache.remove( `image:${url}` );\n\n\t\t\t//\n\n\t\t\tconst callbacks = _loading.get( this ) || [];\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i ++ ) {\n\n\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t}\n\n\t\t\t_loading.delete( this );\n\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.slice( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tCache.add( `image:${url}`, image );\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t}\n\n}\n\n/**\n * Class for loading cube textures. Images are internally loaded via {@link ImageLoader}.\n *\n * The loader returns an instance of {@link CubeTexture} and expects the cube map to\n * be defined as six separate images representing the sides of a cube. Other cube map definitions\n * like vertical and horizontal cross, column and row layouts are not supported.\n *\n * Note that, by convention, cube maps are specified in a coordinate system\n * in which positive-x is to the right when looking up the positive-z axis --\n * in other words, using a left-handed coordinate system. Since three.js uses\n * a right-handed coordinate system, environment maps used in three.js will\n * have pos-x and neg-x swapped.\n *\n * The loaded cube texture is in sRGB color space. Meaning {@link Texture#colorSpace}\n * is set to `SRGBColorSpace` by default.\n *\n * ```js\n * const loader = new THREE.CubeTextureLoader().setPath( 'textures/cubeMaps/' );\n * const cubeTexture = await loader.loadAsync( [\n * \t'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'\n * ] );\n * scene.background = cubeTexture;\n * ```\n *\n * @augments Loader\n */\nclass CubeTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new cube texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the fully loaded cube texture\n\t * to the `onLoad()` callback. The method also returns a new cube texture object which can\n\t * directly be used for material creation. If you do it this way, the cube texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {Array} urls - Array of 6 URLs to images, one for each side of the\n\t * cube texture. The urls should be specified in the following order: pos-x,\n\t * neg-x, pos-y, neg-y, pos-z, neg-z. An array of data URIs are allowed as well.\n\t * @param {function(CubeTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CubeTexture} The cube texture.\n\t */\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\t\ttexture.colorSpace = SRGBColorSpace;\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for loading binary texture formats RGBE, EXR or TGA.\n * Textures are internally loaded via {@link FileLoader}.\n *\n * Derived classes have to implement the `parse()` method which holds the parsing\n * for the respective format.\n *\n * @abstract\n * @augments Loader\n */\nclass DataTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new data texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded data texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(DataTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {DataTexture} The data texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tlet texData;\n\n\t\t\ttry {\n\n\t\t\t\ttexData = scope.parse( buffer );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) {\n\n\t\t\t\t\tonError( error );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = texData.colorSpace;\n\n\t\t\t}\n\n\t\t\tif ( texData.flipY !== undefined ) {\n\n\t\t\t\ttexture.flipY = texData.flipY;\n\n\t\t\t}\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\tif ( texData.generateMipmaps !== undefined ) {\n\n\t\t\t\ttexture.generateMipmaps = texData.generateMipmaps;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Class for loading textures. Images are internally\n * loaded via {@link ImageLoader}.\n *\n * ```js\n * const loader = new THREE.TextureLoader();\n * const texture = await loader.loadAsync( 'textures/land_ocean_ice_cloud_2048.jpg' );\n *\n * const material = new THREE.MeshBasicMaterial( { map:texture } );\n * ```\n * Please note that `TextureLoader` has dropped support for progress\n * events in `r84`. For a `TextureLoader` that supports progress events, see\n * [this thread](https://github.com/mrdoob/three.js/issues/10439#issuecomment-293260145).\n *\n * @augments Loader\n */\nclass TextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the fully loaded texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Texture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {Texture} The texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for lights - all other light types inherit the\n * properties and methods described here.\n *\n * @abstract\n * @augments Object3D\n */\nclass Light extends Object3D {\n\n\t/**\n\t * Constructs a new light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLight = true;\n\n\t\tthis.type = 'Light';\n\n\t\t/**\n\t\t * The light's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The light's intensity.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = intensity;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// Empty here in base class; some subclasses override.\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\t\tif ( this.target !== undefined ) data.object.target = this.target.uuid;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * A light source positioned directly above the scene, with color fading from\n * the sky color to the ground color.\n *\n * This light cannot be used to cast shadows.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass HemisphereLight extends Light {\n\n\t/**\n\t * Constructs a new hemisphere light.\n\t *\n\t * @param {(number|Color|string)} [skyColor=0xffffff] - The light's sky color.\n\t * @param {(number|Color|string)} [groundColor=0xffffff] - The light's ground color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( skyColor, groundColor, intensity ) {\n\n\t\tsuper( skyColor, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isHemisphereLight = true;\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The light's ground color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();\nconst _lookTarget$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * Abstract base class for light shadow classes. These classes\n * represent the shadow configuration for different light types.\n *\n * @abstract\n */\nclass LightShadow {\n\n\t/**\n\t * Constructs a new light shadow.\n\t *\n\t * @param {Camera} camera - The light's view of the world.\n\t */\n\tconstructor( camera ) {\n\n\t\t/**\n\t\t * The light's view of the world.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The intensity of the shadow. The default is `1`.\n\t\t * Valid values are in the range `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = 1;\n\n\t\t/**\n\t\t * Shadow map bias, how much to add or subtract from the normalized depth\n\t\t * when deciding whether a surface is in shadow.\n\t\t *\n\t\t * The default is `0`. Very tiny adjustments here (in the order of `0.0001`)\n\t\t * may help reduce artifacts in shadows.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.bias = 0;\n\n\t\t/**\n\t\t * Defines how much the position used to query the shadow map is offset along\n\t\t * the object normal. The default is `0`. Increasing this value can be used to\n\t\t * reduce shadow acne especially in large scenes where light shines onto\n\t\t * geometry at a shallow angle. The cost is that shadows may appear distorted.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.normalBias = 0;\n\n\t\t/**\n\t\t * Setting this to values greater than 1 will blur the edges of the shadow.\n\t\t * High values will cause unwanted banding effects in the shadows - a greater\n\t\t * map size will allow for a higher value to be used here before these effects\n\t\t * become visible.\n\t\t *\n\t\t * The property has no effect when the shadow map type is `PCFSoftShadowMap` and\n\t\t * and it is recommended to increase softness by decreasing the shadow map size instead.\n\t\t *\n\t\t * The property has no effect when the shadow map type is `BasicShadowMap`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = 1;\n\n\t\t/**\n\t\t * The amount of samples to use when blurring a VSM shadow map.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 8\n\t\t */\n\t\tthis.blurSamples = 8;\n\n\t\t/**\n\t\t * Defines the width and height of the shadow map. Higher values give better quality\n\t\t * shadows at the cost of computation time. Values must be powers of two.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (512,512)\n\t\t */\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\t/**\n\t\t * The type of shadow texture. The default is `UnsignedByteType`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.mapType = UnsignedByteType;\n\n\t\t/**\n\t\t * The depth map generated using the internal camera; a location beyond a\n\t\t * pixel's depth is in shadow. Computed internally during rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The distribution map generated using the internal camera; an occlusion is\n\t\t * calculated based on the distribution of depths. Computed internally during\n\t\t * rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.mapPass = null;\n\n\t\t/**\n\t\t * Model to shadow camera space, to compute location and depth in shadow map.\n\t\t * This is computed internally during rendering.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Enables automatic updates of the light's shadow. If you do not require dynamic\n\t\t * lighting / shadows, you may set this to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t\t/**\n\t\t * When set to `true`, shadow maps will be updated in the next `render` call.\n\t\t * If you have set {@link LightShadow#autoUpdate} to `false`, you will need to\n\t\t * set this property to `true` and then make a render call to update the light's shadow.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\t/**\n\t * Used internally by the renderer to get the number of viewports that need\n\t * to be rendered for this shadow.\n\t *\n\t * @return {number} The viewport count.\n\t */\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\t/**\n\t * Gets the shadow cameras frustum. Used internally by the renderer to cull objects.\n\t *\n\t * @return {Frustum} The shadow camera frustum.\n\t */\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\t/**\n\t * Update the matrices for the camera and shadow, used internally by the renderer.\n\t *\n\t * @param {Light} light - The light for which the shadow is being rendered.\n\t */\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld$1 );\n\n\t\t_lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget$1 );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix$1, shadowCamera.coordinateSystem, shadowCamera.reversedDepth );\n\n\t\tif ( shadowCamera.reversedDepth ) {\n\n\t\t\tshadowMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 1.0, 0.0,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tshadowMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t}\n\n\t\tshadowMatrix.multiply( _projScreenMatrix$1 );\n\n\t}\n\n\t/**\n\t * Returns a viewport definition for the given viewport index.\n\t *\n\t * @param {number} viewportIndex - The viewport index.\n\t * @return {Vector4} The viewport.\n\t */\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\t/**\n\t * Returns the frame extends.\n\t *\n\t * @return {Vector2} The frame extends.\n\t */\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Copies the values of the given light shadow instance to this instance.\n\t *\n\t * @param {LightShadow} source - The light shadow to copy.\n\t * @return {LightShadow} A reference to this light shadow instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.intensity = source.intensity;\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.needsUpdate = source.needsUpdate;\n\t\tthis.normalBias = source.normalBias;\n\t\tthis.blurSamples = source.blurSamples;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new light shadow instance with copied values from this instance.\n\t *\n\t * @return {LightShadow} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the light shadow into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized light shadow.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.intensity !== 1 ) object.intensity = this.intensity;\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass SpotLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new spot light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLightShadow = true;\n\n\t\t/**\n\t\t * Used to focus the shadow camera. The camera's field of view is set as a\n\t\t * percentage of the spotlight's field-of-view. Range is `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.focus = 1;\n\n\t\t/**\n\t\t * Texture aspect ratio.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = ( this.mapSize.width / this.mapSize.height ) * this.aspect;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tsuper.updateMatrices( light );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.focus = source.focus;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This light gets emitted from a single point in one direction, along a cone\n * that increases in size the further from the light it gets.\n *\n * This light can cast shadows - see the {@link SpotLightShadow} for details.\n *\n * ```js\n * // white spotlight shining from the side, modulated by a texture\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 100, 1000, 100 );\n * spotLight.map = new THREE.TextureLoader().load( url );\n *\n * spotLight.castShadow = true;\n * spotLight.shadow.mapSize.width = 1024;\n * spotLight.shadow.mapSize.height = 1024;\n * spotLight.shadow.camera.near = 500;\n * spotLight.shadow.camera.far = 4000;\n * spotLight.shadow.camera.fov = 30;s\n * ```\n *\n * @augments Light\n */\nclass SpotLight extends Light {\n\n\t/**\n\t * Constructs a new spot light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [angle=Math.PI/3] - Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t * @param {number} [penumbra=0] - Percent of the spotlight cone that is attenuated due to penumbra. Value range is `[0,1]`.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLight = true;\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The spot light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * Maximum range of the light. `0` means no limit.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI/3\n\t\t */\n\t\tthis.angle = angle;\n\n\t\t/**\n\t\t * Percent of the spotlight cone that is attenuated due to penumbra.\n\t\t * Value range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.penumbra = penumbra;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * A texture used to modulate the color of the light. The spot light\n\t\t * color is mixed with the RGB value of this texture, with a ratio\n\t\t * corresponding to its alpha value. The cookie-like masking effect is\n\t\t * reproduced using pixel values (0, 0, 0, 1-cookie_value).\n\t\t *\n\t\t * *Warning*: This property is disabled if {@link Object3D#castShadow} is set to `false`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {SpotLightShadow}\n\t\t */\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)\n\t\treturn this.intensity * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / Math.PI;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\n/**\n * Represents the shadow configuration of point lights.\n *\n * @augments LightShadow\n */\nclass PointLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new point light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLightShadow = true;\n\n\t\tthis._frameExtents = new Vector2( 4, 2 );\n\n\t\tthis._viewportCount = 6;\n\n\t\tthis._viewports = [\n\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t// following orientation:\n\t\t\t//\n\t\t\t// xzXZ\n\t\t\t// y Y\n\t\t\t//\n\t\t\t// X - Positive x direction\n\t\t\t// x - Negative x direction\n\t\t\t// Y - Positive y direction\n\t\t\t// y - Negative y direction\n\t\t\t// Z - Positive z direction\n\t\t\t// z - Negative z direction\n\n\t\t\t// positive X\n\t\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t\t// negative X\n\t\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t\t// positive Z\n\t\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t\t// negative Z\n\t\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t\t// positive Y\n\t\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t\t// negative Y\n\t\t\tnew Vector4( 1, 0, 1, 1 )\n\t\t];\n\n\t\tthis._cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( -1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, -1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, -1, 0 )\n\t\t];\n\n\t\tthis._cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, -1 )\n\t\t];\n\n\t}\n\n\t/**\n\t * Update the matrices for the camera and shadow, used internally by the renderer.\n\t *\n\t * @param {Light} light - The light for which the shadow is being rendered.\n\t * @param {number} [viewportIndex=0] - The viewport index.\n\t */\n\tupdateMatrices( light, viewportIndex = 0 ) {\n\n\t\tconst camera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( far !== camera.far ) {\n\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.copy( camera.position );\n\t\t_lookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( _lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );\n\n\t}\n\n}\n\n/**\n * A light that gets emitted from a single point in all directions. A common\n * use case for this is to replicate the light emitted from a bare\n * lightbulb.\n *\n * This light can cast shadows - see the {@link PointLightShadow} for details.\n *\n * ```js\n * const light = new THREE.PointLight( 0xff0000, 1, 100 );\n * light.position.set( 50, 50, 50 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass PointLight extends Light {\n\n\t/**\n\t * Constructs a new point light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLight = true;\n\n\t\tthis.type = 'PointLight';\n\n\t\t/**\n\t\t * When distance is zero, light will attenuate according to inverse-square\n\t\t * law to infinite distance. When distance is non-zero, light will attenuate\n\t\t * according to inverse-square law until near the distance cutoff, where it\n\t\t * will then attenuate quickly and smoothly to 0. Inherently, cutoffs are not\n\t\t * physically correct.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {PointLightShadow}\n\t\t */\n\t\tthis.shadow = new PointLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)\n\t\treturn this.intensity * 4 * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Camera that uses [orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection).\n *\n * In this projection mode, an object's size in the rendered image stays\n * constant regardless of its distance from the camera. This can be useful\n * for rendering 2D scenes and UI elements, amongst other things.\n *\n * ```js\n * const camera = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass OrthographicCamera extends Camera {\n\n\t/**\n\t * Constructs a new orthographic camera.\n\t *\n\t * @param {number} [left=-1] - The left plane of the camera's frustum.\n\t * @param {number} [right=1] - The right plane of the camera's frustum.\n\t * @param {number} [top=1] - The top plane of the camera's frustum.\n\t * @param {number} [bottom=-1] - The bottom plane of the camera's frustum.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isOrthographicCamera = true;\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * The left plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.left = left;\n\n\t\t/**\n\t\t * The right plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.right = right;\n\n\t\t/**\n\t\t * The top plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.top = top;\n\n\t\t/**\n\t\t * The bottom plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.bottom = bottom;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link OrthographicCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link PerspectiveCamera}, `0` is a\n\t\t * valid value for an orthographic camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link OrthographicCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t * @see {@link PerspectiveCamera#setViewOffset}\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far, this.coordinateSystem, this.reversedDepth );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass DirectionalLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new directional light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new OrthographicCamera( -5, 5, 5, -5, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLightShadow = true;\n\n\t}\n\n}\n\n/**\n * A light that gets emitted in a specific direction. This light will behave\n * as though it is infinitely far away and the rays produced from it are all\n * parallel. The common use case for this is to simulate daylight; the sun is\n * far enough away that its position can be considered to be infinite, and\n * all light rays coming from it are parallel.\n *\n * A common point of confusion for directional lights is that setting the\n * rotation has no effect. This is because three.js's DirectionalLight is the\n * equivalent to what is often called a 'Target Direct Light' in other\n * applications.\n *\n * This means that its direction is calculated as pointing from the light's\n * {@link Object3D#position} to the {@link DirectionalLight#target} position\n * (as opposed to a 'Free Direct Light' that just has a rotation\n * component).\n *\n * This light can cast shadows - see the {@link DirectionalLightShadow} for details.\n *\n * ```js\n * // White directional light at half intensity shining from the top.\n * const directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );\n * scene.add( directionalLight );\n * ```\n *\n * @augments Light\n */\nclass DirectionalLight extends Light {\n\n\t/**\n\t * Constructs a new directional light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLight = true;\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The directional light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {DirectionalLightShadow}\n\t\t */\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.target = source.target.clone();\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This light globally illuminates all objects in the scene equally.\n *\n * It cannot be used to cast shadows as it does not have a direction.\n *\n * ```js\n * const light = new THREE.AmbientLight( 0x404040 ); // soft white light\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass AmbientLight extends Light {\n\n\t/**\n\t * Constructs a new ambient light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAmbientLight = true;\n\n\t\tthis.type = 'AmbientLight';\n\n\t}\n\n}\n\n/**\n * This class emits light uniformly across the face a rectangular plane.\n * This light type can be used to simulate light sources such as bright\n * windows or strip lighting.\n *\n * Important Notes:\n *\n * - There is no shadow support.\n * - Only PBR materials are supported.\n * - You have to include `RectAreaLightUniformsLib` (`WebGLRenderer`) or `RectAreaLightTexturesLib` (`WebGPURenderer`)\n * into your app and init the uniforms/textures.\n *\n * ```js\n * RectAreaLightUniformsLib.init(); // only relevant for WebGLRenderer\n * THREE.RectAreaLightNode.setLTC( RectAreaLightTexturesLib.init() ); // only relevant for WebGPURenderer\n *\n * const intensity = 1; const width = 10; const height = 10;\n * const rectLight = new THREE.RectAreaLight( 0xffffff, intensity, width, height );\n * rectLight.position.set( 5, 5, 0 );\n * rectLight.lookAt( 0, 0, 0 );\n * scene.add( rectLight )\n * ```\n *\n * @augments Light\n */\nclass RectAreaLight extends Light {\n\n\t/**\n\t * Constructs a new area light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t * @param {number} [width=10] - The width of the light.\n\t * @param {number} [height=10] - The height of the light.\n\t */\n\tconstructor( color, intensity, width = 10, height = 10 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRectAreaLight = true;\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\t/**\n\t\t * The width of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.height = height;\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( this.width * this.height * Math.PI );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents a third-order spherical harmonics (SH). Light probes use this class\n * to encode lighting information.\n *\n * - Primary reference: {@link https://graphics.stanford.edu/papers/envmap/envmap.pdf}\n * - Secondary reference: {@link https://www.ppsloan.org/publications/StupidSH36.pdf}\n */\nclass SphericalHarmonics3 {\n\n\t/**\n\t * Constructs a new spherical harmonics.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphericalHarmonics3 = true;\n\n\t\t/**\n\t\t * An array holding the (9) SH coefficients.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given SH coefficients to this instance by copying\n\t * the values.\n\t *\n\t * @param {Array} coefficients - The SH coefficients.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets all SH coefficients to `0`.\n\t *\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the radiance in the direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The radiance.\n\t */\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the irradiance (radiance convolved with cosine lobe) in the\n\t * direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The irradiance.\n\t */\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Adds the given SH to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * A convenience method for performing {@link SphericalHarmonics3#add} and\n\t * {@link SphericalHarmonics3#scale} at once.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this SH by the given scale factor.\n\t *\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linear interpolates between the given SH and this instance by the given\n\t * alpha factor.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to interpolate with.\n\t * @param {number} alpha - The alpha factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this spherical harmonics is equal with the given one.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to test for equality.\n\t * @return {boolean} Whether this spherical harmonics is equal with the given one.\n\t */\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical harmonics to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to copy.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\t/**\n\t * Returns a new spherical harmonics with copied values from this instance.\n\t *\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Sets the SH coefficients of this instance from the given array.\n\t *\n\t * @param {Array} array - An array holding the SH coefficients.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns an array with the SH coefficients, or copies them into the provided\n\t * array. The coefficients are represented as numbers.\n\t *\n\t * @param {Array} [array=[]] - The target array.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {Array} An array with flat SH coefficients.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Computes the SH basis for the given normal vector.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Array} shBasis - The target array holding the SH basis.\n\t */\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\n/**\n * Light probes are an alternative way of adding light to a 3D scene. Unlike\n * classical light sources (e.g. directional, point or spot lights), light\n * probes do not emit light. Instead they store information about light\n * passing through 3D space. During rendering, the light that hits a 3D\n * object is approximated by using the data from the light probe.\n *\n * Light probes are usually created from (radiance) environment maps. The\n * class {@link LightProbeGenerator} can be used to create light probes from\n * cube textures or render targets. However, light estimation data could also\n * be provided in other forms e.g. by WebXR. This enables the rendering of\n * augmented reality content that reacts to real world lighting.\n *\n * The current probe implementation in three.js supports so-called diffuse\n * light probes. This type of light probe is functionally equivalent to an\n * irradiance environment map.\n *\n * @augments Light\n */\nclass LightProbe extends Light {\n\n\t/**\n\t * Constructs a new light probe.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics which represents encoded lighting information.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( sh = new SphericalHarmonics3(), intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLightProbe = true;\n\n\t\t/**\n\t\t * A light probe uses spherical harmonics to encode lighting information.\n\t\t *\n\t\t * @type {SphericalHarmonics3}\n\t\t */\n\t\tthis.sh = sh;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deserializes the light prove from the given JSON.\n\t *\n\t * @param {Object} json - The JSON holding the serialized light probe.\n\t * @return {LightProbe} A reference to this light probe.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();\n\t\tthis.sh.fromArray( json.sh );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Class for loading geometries. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.MaterialLoader();\n * const material = await loader.loadAsync( 'material.json' );\n * ```\n * This loader does not support node materials. Use {@link NodeMaterialLoader} instead.\n *\n * @augments Loader\n */\nclass MaterialLoader extends Loader {\n\n\t/**\n\t * Constructs a new material loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * A dictionary holding textures used by the material.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.textures = {};\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded material to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Material)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns a material.\n\t *\n\t * @param {Object} json - The serialized material.\n\t * @return {Material} The parsed material.\n\t */\n\tparse( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\twarn( 'MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tconst material = this.createMaterialFromType( json.type );\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = json.sheen;\n\t\tif ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );\n\t\tif ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;\n\t\tif ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.dispersion !== undefined ) material.dispersion = json.dispersion;\n\t\tif ( json.iridescence !== undefined ) material.iridescence = json.iridescence;\n\t\tif ( json.iridescenceIOR !== undefined ) material.iridescenceIOR = json.iridescenceIOR;\n\t\tif ( json.iridescenceThicknessRange !== undefined ) material.iridescenceThicknessRange = json.iridescenceThicknessRange;\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.thickness !== undefined ) material.thickness = json.thickness;\n\t\tif ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;\n\t\tif ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );\n\t\tif ( json.anisotropy !== undefined ) material.anisotropy = json.anisotropy;\n\t\tif ( json.anisotropyRotation !== undefined ) material.anisotropyRotation = json.anisotropyRotation;\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.alphaHash !== undefined ) material.alphaHash = json.alphaHash;\n\t\tif ( json.depthFunc !== undefined ) material.depthFunc = json.depthFunc;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\tif ( json.blendSrc !== undefined ) material.blendSrc = json.blendSrc;\n\t\tif ( json.blendDst !== undefined ) material.blendDst = json.blendDst;\n\t\tif ( json.blendEquation !== undefined ) material.blendEquation = json.blendEquation;\n\t\tif ( json.blendSrcAlpha !== undefined ) material.blendSrcAlpha = json.blendSrcAlpha;\n\t\tif ( json.blendDstAlpha !== undefined ) material.blendDstAlpha = json.blendDstAlpha;\n\t\tif ( json.blendEquationAlpha !== undefined ) material.blendEquationAlpha = json.blendEquationAlpha;\n\t\tif ( json.blendColor !== undefined && material.blendColor !== undefined ) material.blendColor.setHex( json.blendColor );\n\t\tif ( json.blendAlpha !== undefined ) material.blendAlpha = json.blendAlpha;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== undefined ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;\n\t\tif ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;\n\t\tif ( json.forceSinglePass !== undefined ) material.forceSinglePass = json.forceSinglePass;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\tif ( json.glslVersion !== undefined ) material.glslVersion = json.glslVersion;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.lights !== undefined ) material.lights = json.lights;\n\t\tif ( json.clipping !== undefined ) material.clipping = json.clipping;\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\t\tif ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );\n\t\tif ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapRotation !== undefined ) material.envMapRotation.fromArray( json.envMapRotation );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.iridescenceMap !== undefined ) material.iridescenceMap = getTexture( json.iridescenceMap );\n\t\tif ( json.iridescenceThicknessMap !== undefined ) material.iridescenceThicknessMap = getTexture( json.iridescenceThicknessMap );\n\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\t\tif ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );\n\n\t\tif ( json.anisotropyMap !== undefined ) material.anisotropyMap = getTexture( json.anisotropyMap );\n\n\t\tif ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );\n\t\tif ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );\n\n\t\treturn material;\n\n\t}\n\n\t/**\n\t * Textures are not embedded in the material JSON so they have\n\t * to be injected before the loading process starts.\n\t *\n\t * @param {Object} value - A dictionary holding textures for material properties.\n\t * @return {MaterialLoader} A reference to this material loader.\n\t */\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a material for the given type.\n\t *\n\t * @param {string} type - The material type.\n\t * @return {Material} The new material.\n\t */\n\tcreateMaterialFromType( type ) {\n\n\t\treturn MaterialLoader.createMaterialFromType( type );\n\n\t}\n\n\t/**\n\t * Creates a material for the given type.\n\t *\n\t * @static\n\t * @param {string} type - The material type.\n\t * @return {Material} The new material.\n\t */\n\tstatic createMaterialFromType( type ) {\n\n\t\tconst materialLib = {\n\t\t\tShadowMaterial,\n\t\t\tSpriteMaterial,\n\t\t\tRawShaderMaterial,\n\t\t\tShaderMaterial,\n\t\t\tPointsMaterial,\n\t\t\tMeshPhysicalMaterial,\n\t\t\tMeshStandardMaterial,\n\t\t\tMeshPhongMaterial,\n\t\t\tMeshToonMaterial,\n\t\t\tMeshNormalMaterial,\n\t\t\tMeshLambertMaterial,\n\t\t\tMeshDepthMaterial,\n\t\t\tMeshDistanceMaterial,\n\t\t\tMeshBasicMaterial,\n\t\t\tMeshMatcapMaterial,\n\t\t\tLineDashedMaterial,\n\t\t\tLineBasicMaterial,\n\t\t\tMaterial\n\t\t};\n\n\t\treturn new materialLib[ type ]();\n\n\t}\n\n}\n\n/**\n * A class with loader utility functions.\n */\nclass LoaderUtils {\n\n\t/**\n\t * Extracts the base URL from the given URL.\n\t *\n\t * @param {string} url -The URL to extract the base URL from.\n\t * @return {string} The extracted base URL.\n\t */\n\tstatic extractUrlBase( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === -1 ) return './';\n\n\t\treturn url.slice( 0, index + 1 );\n\n\t}\n\n\t/**\n\t * Resolves relative URLs against the given path. Absolute paths, data urls,\n\t * and blob URLs will be returned as is. Invalid URLs will return an empty\n\t * string.\n\t *\n\t * @param {string} url -The URL to resolve.\n\t * @param {string} path - The base path for relative URLs to be resolved against.\n\t * @return {string} The resolved URL.\n\t */\n\tstatic resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n}\n\n/**\n * An instanced version of a geometry.\n */\nclass InstancedBufferGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new instanced buffer geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedBufferGeometry = true;\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\n\t\t/**\n\t\t * The instance count.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.instanceCount = Infinity;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Class for loading geometries. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.BufferGeometryLoader();\n * const geometry = await loader.loadAsync( 'models/json/pressure.json' );\n *\n * const material = new THREE.MeshBasicMaterial( { color: 0xF5F5F5 } );\n * const object = new THREE.Mesh( geometry, material );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n */\nclass BufferGeometryLoader extends Loader {\n\n\t/**\n\t * Constructs a new geometry loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded geometry to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns a geometry.\n\t *\n\t * @param {Object} json - The serialized geometry.\n\t * @return {BufferGeometry} The parsed geometry.\n\t */\n\tparse( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tif ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );\n\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tgeometry.boundingSphere = new Sphere().fromJSON( boundingSphere );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * A loader for loading a JSON resource in the [JSON Object/Scene format](https://github.com/mrdoob/three.js/wiki/JSON-Object-Scene-format-4).\n * The files are internally loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.ObjectLoader();\n * const obj = await loader.loadAsync( 'models/json/example.json' );\n * scene.add( obj );\n *\n * // Alternatively, to parse a previously loaded JSON structure\n * const object = await loader.parseAsync( a_json_object );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n */\nclass ObjectLoader extends Loader {\n\n\t/**\n\t * Constructs a new object loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded 3D object to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Object3D)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\terror( 'ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( new Error( 'THREE.ObjectLoader: Can\\'t load ' + url ) );\n\n\t\t\t\terror( 'ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Async version of {@link ObjectLoader#load}.\n\t *\n\t * @async\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @return {Promise} A Promise that resolves with the loaded 3D object.\n\t */\n\tasync loadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await loader.loadAsync( url, onProgress );\n\n\t\tconst json = JSON.parse( text );\n\n\t\tconst metadata = json.metadata;\n\n\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\tthrow new Error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\n\t\t}\n\n\t\treturn await scope.parseAsync( json );\n\n\t}\n\n\t/**\n\t * Parses the given JSON. This is used internally by {@link ObjectLoader#load}\n\t * but can also be used directly to parse a previously loaded JSON structure.\n\t *\n\t * @param {Object} json - The serialized 3D object.\n\t * @param {onLoad} onLoad - Executed when all resources (e.g. textures) have been fully loaded.\n\t * @return {Object3D} The parsed 3D object.\n\t */\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ].data instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\t/**\n\t * Async version of {@link ObjectLoader#parse}.\n\t *\n\t * @param {Object} json - The serialized 3D object.\n\t * @return {Promise} A Promise that resolves with the parsed 3D object.\n\t */\n\tasync parseAsync( json ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = await this.parseImagesAsync( json.images );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\treturn object;\n\n\t}\n\n\t// internals\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( data.type in Geometries ) {\n\n\t\t\t\t\t\t\tgeometry = Geometries[ data.type ].fromJSON( data, shapes );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\twarn( `ObjectLoader: Unsupported geometry type \"${ data.type }\"` );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t}\n\n\tparseMaterials( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tasync parseImagesAsync( json ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tloader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\twarn( 'ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tconst source = images[ data.image ];\n\t\t\t\tconst image = source.data;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\t\t\t\tif ( data.channel !== undefined ) texture.channel = data.channel;\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.internalFormat !== undefined ) texture.internalFormat = data.internalFormat;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.colorSpace !== undefined ) texture.colorSpace = data.colorSpace;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.generateMipmaps !== undefined ) texture.generateMipmaps = data.generateMipmaps;\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\t\t\t\tif ( data.compareFunction !== undefined ) texture.compareFunction = data.compareFunction;\n\n\t\t\t\tif ( data.userData !== undefined ) texture.userData = data.userData;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tparseObject( data, geometries, materials, textures, animations ) {\n\n\t\tlet object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\twarn( 'ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tfunction getTexture( uuid ) {\n\n\t\t\tif ( textures[ uuid ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined texture', uuid );\n\n\t\t\t}\n\n\t\t\treturn textures[ uuid ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.background = getTexture( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.environment !== undefined ) {\n\n\t\t\t\t\tobject.environment = getTexture( data.environment );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.fog.name !== '' ) {\n\n\t\t\t\t\t\tobject.fog.name = data.fog.name;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.backgroundBlurriness !== undefined ) object.backgroundBlurriness = data.backgroundBlurriness;\n\t\t\t\tif ( data.backgroundIntensity !== undefined ) object.backgroundIntensity = data.backgroundIntensity;\n\t\t\t\tif ( data.backgroundRotation !== undefined ) object.backgroundRotation.fromArray( data.backgroundRotation );\n\n\t\t\t\tif ( data.environmentIntensity !== undefined ) object.environmentIntensity = data.environmentIntensity;\n\t\t\t\tif ( data.environmentRotation !== undefined ) object.environmentRotation.fromArray( data.environmentRotation );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tobject = new LightProbe().fromJSON( data );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\t\t\t\tif ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'BatchedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new BatchedMesh( data.maxInstanceCount, data.maxVertexCount, data.maxIndexCount, material );\n\t\t\t\tobject.geometry = geometry;\n\t\t\t\tobject.perObjectFrustumCulled = data.perObjectFrustumCulled;\n\t\t\t\tobject.sortObjects = data.sortObjects;\n\n\t\t\t\tobject._drawRanges = data.drawRanges;\n\t\t\t\tobject._reservedRanges = data.reservedRanges;\n\n\t\t\t\tobject._geometryInfo = data.geometryInfo.map( info => {\n\n\t\t\t\t\tlet box = null;\n\t\t\t\t\tlet sphere = null;\n\t\t\t\t\tif ( info.boundingBox !== undefined ) {\n\n\t\t\t\t\t\tbox = new Box3().fromJSON( info.boundingBox );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( info.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\tsphere = new Sphere().fromJSON( info.boundingSphere );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...info,\n\t\t\t\t\t\tboundingBox: box,\n\t\t\t\t\t\tboundingSphere: sphere\n\t\t\t\t\t};\n\n\t\t\t\t} );\n\t\t\t\tobject._instanceInfo = data.instanceInfo;\n\n\t\t\t\tobject._availableInstanceIds = data._availableInstanceIds;\n\t\t\t\tobject._availableGeometryIds = data._availableGeometryIds;\n\n\t\t\t\tobject._nextIndexStart = data.nextIndexStart;\n\t\t\t\tobject._nextVertexStart = data.nextVertexStart;\n\t\t\t\tobject._geometryCount = data.geometryCount;\n\n\t\t\t\tobject._maxInstanceCount = data.maxInstanceCount;\n\t\t\t\tobject._maxVertexCount = data.maxVertexCount;\n\t\t\t\tobject._maxIndexCount = data.maxIndexCount;\n\n\t\t\t\tobject._geometryInitialized = data.geometryInitialized;\n\n\t\t\t\tobject._matricesTexture = getTexture( data.matricesTexture.uuid );\n\n\t\t\t\tobject._indirectTexture = getTexture( data.indirectTexture.uuid );\n\n\t\t\t\tif ( data.colorsTexture !== undefined ) {\n\n\t\t\t\t\tobject._colorsTexture = getTexture( data.colorsTexture.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.boundingSphere !== undefined ) {\n\n\t\t\t\t\tobject.boundingSphere = new Sphere().fromJSON( data.boundingSphere );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.boundingBox !== undefined ) {\n\n\t\t\t\t\tobject.boundingBox = new Box3().fromJSON( data.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.up !== undefined ) object.up.fromArray( data.up );\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.intensity !== undefined ) object.shadow.intensity = data.shadow.intensity;\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance, level.hysteresis );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tbindLightTargets( object ) {\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isDirectionalLight || child.isSpotLight ) {\n\n\t\t\t\tconst uuid = child.target;\n\n\t\t\t\tconst target = object.getObjectByProperty( 'uuid', uuid );\n\n\t\t\t\tif ( target !== undefined ) {\n\n\t\t\t\t\tchild.target = target;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.target = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nconst _errorMap = new WeakMap();\n\n/**\n * A loader for loading images as an [ImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap).\n * An `ImageBitmap` provides an asynchronous and resource efficient pathway to prepare\n * textures for rendering.\n *\n * Note that {@link Texture#flipY} and {@link Texture#premultiplyAlpha} are ignored with image bitmaps.\n * They needs these configuration on bitmap creation unlike regular images need them on uploading to GPU.\n *\n * You need to set the equivalent options via {@link ImageBitmapLoader#setOptions} instead.\n *\n * Also note that unlike {@link FileLoader}, this loader avoids multiple concurrent requests to the same URL only if `Cache` is enabled.\n *\n * ```js\n * const loader = new THREE.ImageBitmapLoader();\n * loader.setOptions( { imageOrientation: 'flipY' } ); // set options if needed\n * const imageBitmap = await loader.loadAsync( 'image.png' );\n *\n * const texture = new THREE.Texture( imageBitmap );\n * texture.needsUpdate = true;\n * ```\n *\n * @augments Loader\n */\nclass ImageBitmapLoader extends Loader {\n\n\t/**\n\t * Constructs a new image bitmap loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isImageBitmapLoader = true;\n\n\t\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\t\twarn( 'ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t\t}\n\n\t\tif ( typeof fetch === 'undefined' ) {\n\n\t\t\twarn( 'ImageBitmapLoader: fetch() not supported.' );\n\n\t\t}\n\n\t\t/**\n\t\t * Represents the loader options.\n\t\t *\n\t\t * @type {Object}\n\t\t * @default {premultiplyAlpha:'none'}\n\t\t */\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\n\t\t/**\n\t\t * Used for aborting requests.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController}\n\t\t */\n\t\tthis._abortController = new AbortController();\n\n\t}\n\n\t/**\n\t * Sets the given loader options. The structure of the object must match the `options` parameter of\n\t * [createImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/Window/createImageBitmap).\n\t *\n\t * @param {Object} options - The loader options to set.\n\t * @return {ImageBitmapLoader} A reference to this image bitmap loader.\n\t */\n\tsetOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded image bitmap to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(ImageBitmap)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {ImageBitmap|undefined} The image bitmap.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( `image-bitmap:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\t// If cached is a promise, wait for it to resolve\n\t\t\tif ( cached.then ) {\n\n\t\t\t\tcached.then( imageBitmap => {\n\n\t\t\t\t\t// check if there is an error for the cached promise\n\n\t\t\t\t\tif ( _errorMap.has( cached ) === true ) {\n\n\t\t\t\t\t\tif ( onError ) onError( _errorMap.get( cached ) );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t\treturn imageBitmap;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// If cached is not a promise (i.e., it's already an imageBitmap)\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\t\tfetchOptions.signal = ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal;\n\n\t\tconst promise = fetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( `image-bitmap:${url}`, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t\treturn imageBitmap;\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\t_errorMap.set( promise, e );\n\n\t\t\tCache.remove( `image-bitmap:${url}` );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tCache.add( `image-bitmap:${url}`, promise );\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n\t/**\n\t * Aborts ongoing fetch requests.\n\t *\n\t * @return {ImageBitmapLoader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\tthis._abortController.abort();\n\t\tthis._abortController = new AbortController();\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _context;\n\n/**\n * Manages the global audio context in the engine.\n *\n * @hideconstructor\n */\nclass AudioContext {\n\n\t/**\n\t * Returns the global native audio context.\n\t *\n\t * @return {AudioContext} The native audio context.\n\t */\n\tstatic getContext() {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t}\n\n\t/**\n\t * Allows to set the global native audio context from outside.\n\t *\n\t * @param {AudioContext} value - The native context to set.\n\t */\n\tstatic setContext( value ) {\n\n\t\t_context = value;\n\n\t}\n\n}\n\n/**\n * Class for loading audio buffers. Audios are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const audioListener = new THREE.AudioListener();\n * const ambientSound = new THREE.Audio( audioListener );\n *\n * const loader = new THREE.AudioLoader();\n * const audioBuffer = await loader.loadAsync( 'audio/ambient_ocean.ogg' );\n *\n * ambientSound.setBuffer( audioBuffer );\n * ambientSound.play();\n * ```\n *\n * @augments Loader\n */\nclass AudioLoader extends Loader {\n\n\t/**\n\t * Constructs a new audio loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded audio buffer\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(AudioBuffer)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} ).catch( handleError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\thandleError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\tfunction handleError( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\terror( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\n\t\t}\n\n\t}\n\n}\n\nconst _eyeRight = /*@__PURE__*/ new Matrix4();\nconst _eyeLeft = /*@__PURE__*/ new Matrix4();\nconst _projectionMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * A special type of camera that uses two perspective cameras with\n * stereoscopic projection. Can be used for rendering stereo effects\n * like [3D Anaglyph](https://en.wikipedia.org/wiki/Anaglyph_3D) or\n * [Parallax Barrier](https://en.wikipedia.org/wiki/parallax_barrier).\n */\nclass StereoCamera {\n\n\t/**\n\t * Constructs a new stereo camera.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'StereoCamera';\n\n\t\t/**\n\t\t * The aspect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t\t/**\n\t\t * The eye separation which represents the distance\n\t\t * between the left and right camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.064\n\t\t */\n\t\tthis.eyeSep = 0.064;\n\n\t\t/**\n\t\t * The camera representing the left eye. This is added to layer `1` so objects to be\n\t\t * rendered by the left camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The camera representing the right eye. This is added to layer `2` so objects to be\n\t\t * rendered by the right camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t\tthis._cache = {\n\t\t\tfocus: null,\n\t\t\tfov: null,\n\t\t\taspect: null,\n\t\t\tnear: null,\n\t\t\tfar: null,\n\t\t\tzoom: null,\n\t\t\teyeSep: null\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the stereo camera based on the given perspective camera.\n\t *\n\t * @param {PerspectiveCamera} camera - The perspective camera.\n\t */\n\tupdate( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy( camera.projectionMatrix );\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( _projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( _projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n}\n\n/**\n * This type of camera can be used in order to efficiently render a scene with a\n * predefined set of cameras. This is an important performance aspect for\n * rendering VR scenes.\n *\n * An instance of `ArrayCamera` always has an array of sub cameras. It's mandatory\n * to define for each sub camera the `viewport` property which determines the\n * part of the viewport that is rendered with this camera.\n *\n * @augments PerspectiveCamera\n */\nclass ArrayCamera extends PerspectiveCamera {\n\n\t/**\n\t * Constructs a new array camera.\n\t *\n\t * @param {Array} [array=[]] - An array of perspective sub cameras.\n\t */\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArrayCamera = true;\n\n\t\t/**\n\t\t * Whether this camera is used with multiview rendering or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isMultiViewCamera = false;\n\n\t\t/**\n\t\t * An array of perspective sub cameras.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\n/**\n * Class for keeping track of time.\n */\nclass Clock {\n\n\t/**\n\t * Constructs a new clock.\n\t *\n\t * @param {boolean} [autoStart=true] - Whether to automatically start the clock when\n\t * `getDelta()` is called for the first time.\n\t */\n\tconstructor( autoStart = true ) {\n\n\t\t/**\n\t\t * If set to `true`, the clock starts automatically when `getDelta()` is called\n\t\t * for the first time.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoStart = autoStart;\n\n\t\t/**\n\t\t * Holds the time at which the clock's `start()` method was last called.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.startTime = 0;\n\n\t\t/**\n\t\t * Holds the time at which the clock's `start()`, `getElapsedTime()` or\n\t\t * `getDelta()` methods were last called.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.oldTime = 0;\n\n\t\t/**\n\t\t * Keeps track of the total time that the clock has been running.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.elapsedTime = 0;\n\n\t\t/**\n\t\t * Whether the clock is running or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.running = false;\n\n\t}\n\n\t/**\n\t * Starts the clock. When `autoStart` is set to `true`, the method is automatically\n\t * called by the class.\n\t */\n\tstart() {\n\n\t\tthis.startTime = performance.now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\t/**\n\t * Stops the clock.\n\t */\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time.\n\t */\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\t/**\n\t * Returns the delta time in seconds.\n\t *\n\t * @return {number} The delta time.\n\t */\n\tgetDelta() {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = performance.now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n}\n\nconst _position$1 = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\n\nconst _forward = /*@__PURE__*/ new Vector3();\nconst _up = /*@__PURE__*/ new Vector3();\n\n/**\n * The class represents a virtual listener of the all positional and non-positional audio effects\n * in the scene. A three.js application usually creates a single listener. It is a mandatory\n * constructor parameter for audios entities like {@link Audio} and {@link PositionalAudio}.\n *\n * In most cases, the listener object is a child of the camera. So the 3D transformation of the\n * camera represents the 3D transformation of the listener.\n *\n * @augments Object3D\n */\nclass AudioListener extends Object3D {\n\n\t/**\n\t * Constructs a new audio listener.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\t/**\n\t\t * The native audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = AudioContext.getContext();\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\t/**\n\t\t * An optional filter.\n\t\t *\n\t\t * Defined via {@link AudioListener#setFilter}.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.filter = null;\n\n\t\t/**\n\t\t * Time delta values required for `linearRampToValueAtTime()` usage.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\t/**\n\t * Returns the listener's input node.\n\t *\n\t * This method is used by other audio nodes to connect to this listener.\n\t *\n\t * @return {GainNode} The input node.\n\t */\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Removes the current filter from this listener.\n\t *\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tremoveFilter() {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filter.\n\t *\n\t * @return {?AudioNode} The filter.\n\t */\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\t/**\n\t * Sets the given filter to this listener.\n\t *\n\t * @param {AudioNode} value - The filter to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetFilter( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the applications master volume.\n\t *\n\t * @return {number} The master volume.\n\t */\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the applications master volume. This volume setting affects\n\t * all audio nodes in the scene.\n\t *\n\t * @param {number} value - The master volume to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );\n\n\t\t// the initial forward and up directions must be orthogonal\n\t\t_forward.set( 0, 0, -1 ).applyQuaternion( _quaternion$1 );\n\t\t_up.set( 0, 1, 0 ).applyQuaternion( _quaternion$1 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$1.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$1.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _forward.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _forward.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _forward.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( _up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( _up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( _up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$1.x, _position$1.y, _position$1.z );\n\t\t\tlistener.setOrientation( _forward.x, _forward.y, _forward.z, _up.x, _up.y, _up.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a non-positional ( global ) audio object.\n *\n * This and related audio modules make use of the [Web Audio API](https://www.w3.org/TR/webaudio-1.1/).\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create a global audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop( true );\n * \tsound.setVolume( 0.5 );\n * \tsound.play();\n * });\n * ```\n *\n * @augments Object3D\n */\nclass Audio extends Object3D {\n\n\t/**\n\t * Constructs a new audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AudioListener}\n\t\t * @readonly\n\t\t */\n\t\tthis.listener = listener;\n\n\t\t/**\n\t\t * The audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = listener.context;\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\t/**\n\t\t * Whether to start playback automatically or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoplay = false;\n\n\t\t/**\n\t\t * A reference to an audio buffer.\n\t\t *\n\t\t * Defined via {@link Audio#setBuffer}.\n\t\t *\n\t\t * @type {?AudioBuffer}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.buffer = null;\n\n\t\t/**\n\t\t * Modify pitch, measured in cents. +/- 100 is a semitone.\n\t\t * +/- 1200 is an octave.\n\t\t *\n\t\t * Defined via {@link Audio#setDetune}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.detune = 0;\n\n\t\t/**\n\t\t * Whether the audio should loop or not.\n\t\t *\n\t\t * Defined via {@link Audio#setLoop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.loop = false;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * start, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopStart = 0;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * stop, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopEnd = 0;\n\n\t\t/**\n\t\t * An offset to the time within the audio buffer the playback\n\t\t * should begin, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.offset = 0;\n\n\t\t/**\n\t\t * Overrides the default duration of the audio.\n\t\t *\n\t\t * @type {undefined|number}\n\t\t * @default undefined\n\t\t */\n\t\tthis.duration = undefined;\n\n\t\t/**\n\t\t * The playback speed.\n\t\t *\n\t\t * Defined via {@link Audio#setPlaybackRate}.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 1\n\t\t */\n\t\tthis.playbackRate = 1;\n\n\t\t/**\n\t\t * Indicates whether the audio is playing or not.\n\t\t *\n\t\t * This flag will be automatically set when using {@link Audio#play},\n\t\t * {@link Audio#pause}, {@link Audio#stop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPlaying = false;\n\n\t\t/**\n\t\t * Indicates whether the audio playback can be controlled\n\t\t * with method like {@link Audio#play} or {@link Audio#pause}.\n\t\t *\n\t\t * This flag will be automatically set when audio sources are\n\t\t * defined.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.hasPlaybackControl = true;\n\n\t\t/**\n\t\t * Holds a reference to the current audio source.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @readonly\n\t\t * @default null\n\t\t */\n\t\tthis.source = null;\n\n\t\t/**\n\t\t * Defines the source type.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {('empty'|'audioNode'|'mediaNode'|'mediaStreamNode'|'buffer')}\n\t\t * @readonly\n\t\t * @default 'empty'\n\t\t */\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\t/**\n\t\t * Can be used to apply a variety of low-order filters to create\n\t\t * more complex sound effects e.g. via `BiquadFilterNode`.\n\t\t *\n\t\t * The property is automatically set by {@link Audio#setFilters}.\n\t\t *\n\t\t * @type {Array}\n\t\t * @readonly\n\t\t */\n\t\tthis.filters = [];\n\n\t}\n\n\t/**\n\t * Returns the output audio node.\n\t *\n\t * @return {GainNode} The output node.\n\t */\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Sets the given audio node as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `audioNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {AudioNode} audioNode - The audio node like an instance of `OscillatorNode`.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetNodeSource( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media element as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {HTMLMediaElement} mediaElement - The media element.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media stream as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaStreamNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {MediaStream} mediaStream - The media stream.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given audio buffer as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `buffer` and {@link Audio#hasPlaybackControl} to `true`.\n\t *\n\t * @param {AudioBuffer} audioBuffer - The audio buffer.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetBuffer( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should start playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tplay( delay = 0 ) {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\twarn( 'Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\t/**\n\t * Pauses the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tpause() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should stop playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tstop( delay = 0 ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tif ( this.source !== null ) {\n\n\t\t\tthis.source.stop( this.context.currentTime + delay );\n\t\t\tthis.source.onended = null;\n\n\t\t}\n\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio} A reference to this instance.\n\t */\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._connected === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filters.\n\t *\n\t * @return {Array} The list of filters.\n\t */\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\t/**\n\t * Sets an array of filters and connects them with the audio source.\n\t *\n\t * @param {Array} [value] - A list of filters.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines the detuning of oscillation in cents.\n\t *\n\t * @param {number} value - The detuning of oscillation in cents.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.isPlaying === true && this.source.detune !== undefined ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the detuning of oscillation in cents.\n\t *\n\t * @return {number} The detuning of oscillation in cents.\n\t */\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\t/**\n\t * Returns the first filter in the list of filters.\n\t *\n\t * @return {AudioNode|undefined} The first filter in the list of filters.\n\t */\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\t/**\n\t * Applies a single filter node to the audio.\n\t *\n\t * @param {AudioNode} [filter] - The filter to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\t/**\n\t * Sets the playback rate.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [value] - The playback rate to set.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetPlaybackRate( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current playback rate.\n\n\t * @return {number} The playback rate.\n\t */\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\t/**\n\t * Automatically called when playback finished.\n\t */\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\t\tthis._progress = 0;\n\n\t}\n\n\t/**\n\t * Returns the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {boolean} Whether the audio should loop or not.\n\t */\n\tgetLoop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t}\n\n\t/**\n\t * Sets the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {boolean} value - Whether the audio should loop or not.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetLoop( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop start value which defines where in the audio buffer the replay should\n\t * start, in seconds.\n\t *\n\t * @param {number} value - The loop start value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop end value which defines where in the audio buffer the replay should\n\t * stop, in seconds.\n\t *\n\t * @param {number} value - The loop end value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the volume.\n\t *\n\t * @return {number} The volume.\n\t */\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the volume.\n\t *\n\t * @param {number} value - The volume to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.sourceType !== 'buffer' ) {\n\n\t\t\twarn( 'Audio: Audio source type cannot be copied.' );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.autoplay = source.autoplay;\n\n\t\tthis.buffer = source.buffer;\n\t\tthis.detune = source.detune;\n\t\tthis.loop = source.loop;\n\t\tthis.loopStart = source.loopStart;\n\t\tthis.loopEnd = source.loopEnd;\n\t\tthis.offset = source.offset;\n\t\tthis.duration = source.duration;\n\t\tthis.playbackRate = source.playbackRate;\n\t\tthis.hasPlaybackControl = source.hasPlaybackControl;\n\t\tthis.sourceType = source.sourceType;\n\n\t\tthis.filters = source.filters.slice();\n\n\t\treturn this;\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor( this.listener ).copy( this, recursive );\n\n\t}\n\n}\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\n/**\n * Represents a positional audio object.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create the PositionalAudio object (passing in the listener)\n * const sound = new THREE.PositionalAudio( listener );\n *\n * // load a sound and set it as the PositionalAudio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/song.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setRefDistance( 20 );\n * \tsound.play();\n * });\n *\n * // create an object for the sound to play from\n * const sphere = new THREE.SphereGeometry( 20, 32, 16 );\n * const material = new THREE.MeshPhongMaterial( { color: 0xff2200 } );\n * const mesh = new THREE.Mesh( sphere, material );\n * scene.add( mesh );\n *\n * // finally add the sound to the mesh\n * mesh.add( sound );\n *\n * @augments Audio\n */\nclass PositionalAudio extends Audio {\n\n\t/**\n\t * Constructs a positional audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\t/**\n\t\t * The panner node represents the location, direction, and behavior of an audio\n\t\t * source in 3D space.\n\t\t *\n\t\t * @type {PannerNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tconnect() {\n\n\t\tsuper.connect();\n\n\t\tthis.panner.connect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tsuper.disconnect();\n\n\t\tthis.panner.disconnect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\t/**\n\t * Returns the current reference distance.\n\t *\n\t * @return {number} The reference distance.\n\t */\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\t/**\n\t * Defines the reference distance for reducing volume as the audio source moves\n\t * further from the listener – i.e. the distance at which the volume reduction\n\t * starts taking effect.\n\t *\n\t * @param {number} value - The reference distance to set.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current rolloff factor.\n\t *\n\t * @return {number} The rolloff factor.\n\t */\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\t/**\n\t * Defines how quickly the volume is reduced as the source moves away from the listener.\n\t *\n\t * @param {number} value - The rolloff factor.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current distance model.\n\t *\n\t * @return {('linear'|'inverse'|'exponential')} The distance model.\n\t */\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\t/**\n\t * Defines which algorithm to use to reduce the volume of the audio source\n\t * as it moves away from the listener.\n\t *\n\t * Read [the spec](https://www.w3.org/TR/webaudio-1.1/#enumdef-distancemodeltype)\n\t * for more details.\n\t *\n\t * @param {('linear'|'inverse'|'exponential')} value - The distance model to set.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current max distance.\n\t *\n\t * @return {number} The max distance.\n\t */\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\t/**\n\t * Defines the maximum distance between the audio source and the listener,\n\t * after which the volume is not reduced any further.\n\t *\n\t * This value is used only by the `linear` distance model.\n\t *\n\t * @param {number} value - The max distance.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the directional cone in which the audio can be listened.\n\t *\n\t * @param {number} coneInnerAngle - An angle, in degrees, of a cone inside of which there will be no volume reduction.\n\t * @param {number} coneOuterAngle - An angle, in degrees, of a cone outside of which the volume will be reduced by a constant value, defined by the `coneOuterGain` parameter.\n\t * @param {number} coneOuterGain - The amount of volume reduction outside the cone defined by the `coneOuterAngle`. When set to `0`, no sound can be heard.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position.x, _position.y, _position.z );\n\t\t\tpanner.setOrientation( _orientation.x, _orientation.y, _orientation.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class can be used to analyse audio data.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create an Audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop(true);\n * \tsound.setVolume(0.5);\n * \tsound.play();\n * });\n *\n * // create an AudioAnalyser, passing in the sound and desired fftSize\n * const analyser = new THREE.AudioAnalyser( sound, 32 );\n *\n * // get the average frequency of the sound\n * const data = analyser.getAverageFrequency();\n * ```\n */\nclass AudioAnalyser {\n\n\t/**\n\t * Constructs a new audio analyzer.\n\t *\n\t * @param {Audio} audio - The audio to analyze.\n\t * @param {number} [fftSize=2048] - The window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data.\n\t */\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AnalyserNode}\n\t\t */\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\t/**\n\t\t * Holds the analyzed data.\n\t\t *\n\t\t * @type {Uint8Array}\n\t\t */\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\t/**\n\t * Returns an array with frequency data of the audio.\n\t *\n\t * Each item in the array represents the decibel value for a specific frequency.\n\t * The frequencies are spread linearly from 0 to 1/2 of the sample rate.\n\t * For example, for 48000 sample rate, the last item of the array will represent\n\t * the decibel value for 24000 Hz.\n\t *\n\t * @return {Uint8Array} The frequency data.\n\t */\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\t/**\n\t * Returns the average of the frequencies returned by {@link AudioAnalyser#getFrequencyData}.\n\t *\n\t * @return {number} The average frequency.\n\t */\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n}\n\n/**\n * Buffered scene graph property that allows weighted accumulation; used internally.\n */\nclass PropertyMixer {\n\n\t/**\n\t * Constructs a new property mixer.\n\t *\n\t * @param {PropertyBinding} binding - The property binding.\n\t * @param {string} typeName - The keyframe track type name.\n\t * @param {number} valueSize - The keyframe track value size.\n\t */\n\tconstructor( binding, typeName, valueSize ) {\n\n\t\t/**\n\t\t * The property binding.\n\t\t *\n\t\t * @type {PropertyBinding}\n\t\t */\n\t\tthis.binding = binding;\n\n\t\t/**\n\t\t * The keyframe track value size.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.valueSize = valueSize;\n\n\t\tlet mixFunction,\n\t\t\tmixFunctionAdditive,\n\t\t\tsetIdentity;\n\n\t\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\t\t//\n\t\t// 'add' is used for additive cumulative results\n\t\t//\n\t\t// 'work' is optional and is only present for quaternion types. It is used\n\t\t// to store intermediate quaternion multiplication results\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\t\tthis._workIndex = 5;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tmixFunction = this._select;\n\n\t\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t\t// additive is not relevant for non-numeric types\n\t\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\t\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t\t}\n\n\t\tthis._mixBufferRegion = mixFunction;\n\t\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\t\tthis._origIndex = 3;\n\t\tthis._addIndex = 4;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.cumulativeWeight = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.useCount = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\t/**\n\t * Accumulates data in the `incoming` region into `accu`.\n\t *\n\t * @param {number} accuIndex - The accumulation index.\n\t * @param {number} weight - The weight.\n\t */\n\taccumulate( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t}\n\n\t/**\n\t * Accumulates data in the `incoming` region into `add`.\n\t *\n\t * @param {number} weight - The weight.\n\t */\n\taccumulateAdditive( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t}\n\n\t/**\n\t * Applies the state of `accu` to the binding when accus differ.\n\t *\n\t * @param {number} accuIndex - The accumulation index.\n\t */\n\tapply( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Remembers the state of the bound property and copy it to both accus.\n\t */\n\tsaveOriginalState() {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t}\n\n\t/**\n\t * Applies the state previously taken via {@link PropertyMixer#saveOriginalState} to the binding.\n\t */\n\trestoreOriginalState() {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t}\n\n\t// internals\n\n\t_setAdditiveIdentityNumeric() {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\t_setAdditiveIdentityQuaternion() {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t}\n\n\t_setAdditiveIdentityOther() {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t}\n\n\n\t// mix functions\n\n\t_select( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_slerp( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t}\n\n\t_slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t}\n\n\t_lerp( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n\t_lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n}\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /*@__PURE__*/ /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /*@__PURE__*/ /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /*@__PURE__*/ /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /*@__PURE__*/ /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones', 'map' ];\n\nclass Composite {\n\n\tconstructor( targetGroup, path, optionalParsedPath ) {\n\n\t\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tgetValue( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t}\n\n\tsetValue( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n}\n\n// Note: This class uses a State pattern on a per-method basis:\n// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n// prototype version of these methods with one that represents\n// the bound state. When the property is not found, the methods\n// become no-ops.\n\n\n/**\n * This holds a reference to a real property in the scene graph; used internally.\n */\nclass PropertyBinding {\n\n\t/**\n\t * Constructs a new property binding.\n\t *\n\t * @param {Object} rootNode - The root node.\n\t * @param {string} path - The path.\n\t * @param {?Object} [parsedPath] - The parsed path.\n\t */\n\tconstructor( rootNode, path, parsedPath ) {\n\n\t\t/**\n\t\t * The object path to the animated property.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = path;\n\n\t\t/**\n\t\t * An object holding information about the path.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\t/**\n\t\t * The object owns the animated property.\n\t\t *\n\t\t * @type {?Object}\n\t\t */\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName );\n\n\t\t/**\n\t\t * The root node.\n\t\t *\n\t\t * @type {Object3D|Skeleton}\n\t\t */\n\t\tthis.rootNode = rootNode;\n\n\t\t// initial state of these methods that calls 'bind'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n\n\t/**\n\t * Factory method for creating a property binding from the given parameters.\n\t *\n\t * @static\n\t * @param {Object} root - The root node.\n\t * @param {string} path - The path.\n\t * @param {?Object} [parsedPath] - The parsed path.\n\t * @return {PropertyBinding|Composite} The created property binding or composite.\n\t */\n\tstatic create( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name - Node name to be sanitized.\n\t * @return {string} The sanitized node name.\n\t */\n\tstatic sanitizeNodeName( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t}\n\n\t/**\n\t * Parses the given track name (an object path to an animated property) and\n\t * returns an object with information about the path. Matches strings in the following forms:\n\t *\n\t * - nodeName.property\n\t * - nodeName.property[accessor]\n\t * - nodeName.material.property[accessor]\n\t * - uuid.property[accessor]\n\t * - uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t * - parentName/nodeName.property\n\t * - parentName/parentName/nodeName.property[index]\n\t * - .bone[Armature.DEF_cog].position\n\t * - scene:helium_balloon_model:helium_balloon_model.position\n\t *\n\t * @static\n\t * @param {string} trackName - The track name to parse.\n\t * @return {Object} The parsed track name as an object.\n\t */\n\tstatic parseTrackName( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( matches === null ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== -1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== -1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t}\n\n\t/**\n\t * Searches for a node in the hierarchy of the given root object by the given\n\t * node name.\n\t *\n\t * @static\n\t * @param {Object} root - The root object.\n\t * @param {string|number} nodeName - The name of the node.\n\t * @return {?Object} The found node. Returns `null` if no object was found.\n\t */\n\tstatic findNode( root, nodeName ) {\n\n\t\tif ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tconst subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable() {}\n\t_setValue_unavailable() {}\n\n\t// Getters\n\n\t_getValue_direct( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.targetObject[ this.propertyName ];\n\n\t}\n\n\t_getValue_array( buffer, offset ) {\n\n\t\tconst source = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t}\n\n\t}\n\n\t_getValue_arrayElement( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t}\n\n\t_getValue_toArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t}\n\n\t// Direct\n\n\t_setValue_direct( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// EntireArray\n\n\t_setValue_array( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t}\n\n\t_setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// ArrayElement\n\n\t_setValue_arrayElement( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// HasToFromArray\n\n\t_setValue_fromArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t}\n\n\t_setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t_getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t}\n\n\t_setValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t}\n\n\t/**\n\t * Creates a getter / setter pair for the property tracked by this binding.\n\t */\n\tbind() {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName );\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\twarn( 'PropertyBinding: No target node found for track: ' + this.path + '.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map':\n\n\t\t\t\t\tif ( 'map' in targetObject ) {\n\n\t\t\t\t\t\ttargetObject = targetObject.map;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.map ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material.map as node.material does not have a map.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.map;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\terror( 'PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.isMaterial === true ) {\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.isObject3D === true ) {\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === 'morphTargetInfluences' ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t}\n\n\t/**\n\t * Unbinds the property.\n\t */\n\tunbind() {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n}\n\nPropertyBinding.Composite = Composite;\n\nPropertyBinding.prototype.BindingType = {\n\tDirect: 0,\n\tEntireArray: 1,\n\tArrayElement: 2,\n\tHasFromToArray: 3\n};\n\nPropertyBinding.prototype.Versioning = {\n\tNone: 0,\n\tNeedsUpdate: 1,\n\tMatrixWorldNeedsUpdate: 2\n};\n\nPropertyBinding.prototype.GetterByBindingType = [\n\n\tPropertyBinding.prototype._getValue_direct,\n\tPropertyBinding.prototype._getValue_array,\n\tPropertyBinding.prototype._getValue_arrayElement,\n\tPropertyBinding.prototype._getValue_toArray,\n\n];\n\nPropertyBinding.prototype.SetterByBindingTypeAndVersioning = [\n\n\t[\n\t\t// Direct\n\t\tPropertyBinding.prototype._setValue_direct,\n\t\tPropertyBinding.prototype._setValue_direct_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// EntireArray\n\n\t\tPropertyBinding.prototype._setValue_array,\n\t\tPropertyBinding.prototype._setValue_array_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// ArrayElement\n\t\tPropertyBinding.prototype._setValue_arrayElement,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// HasToFromArray\n\t\tPropertyBinding.prototype._setValue_fromArray,\n\t\tPropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,\n\n\t]\n\n];\n\n/**\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n * - Instead pass this object as 'root'.\n * - You can also add and remove objects later when the mixer is running.\n *\n * Note:\n *\n * - Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the all objects in the group.\n * - A single property can either be controlled through a target group or directly, but not both.\n */\nclass AnimationObjectGroup {\n\n\t/**\n\t * Constructs a new animation group.\n\t *\n\t * @param {...Object3D} arguments - An arbitrary number of 3D objects that share the same animation state.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAnimationObjectGroup = true;\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0; // threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tconst indices = {};\n\t\tthis._indicesByUUID = indices; // for bookkeeping\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = []; // inside: string\n\t\tthis._parsedPaths = []; // inside: { we don't care, here }\n\t\tthis._bindings = []; // inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._objects.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tget bindingsPerObject() {\n\n\t\t\t\treturn scope._bindings.length;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * Adds an arbitrary number of objects to this animation group.\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to add.\n\t */\n\tadd() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\terror( 'AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t/**\n\t * Removes an arbitrary number of objects to this animation group\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to remove.\n\t */\n\tremove() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for the passed 3D objects of this animation group.\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to uncache.\n\t */\n\tuncache() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t}\n\n\tunsubscribe_( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * An instance of `AnimationAction` schedules the playback of an animation which is\n * stored in {@link AnimationClip}.\n */\nclass AnimationAction {\n\n\t/**\n\t * Constructs a new animation action.\n\t *\n\t * @param {AnimationMixer} mixer - The mixer that is controlled by this action.\n\t * @param {AnimationClip} clip - The animation clip that holds the actual keyframes.\n\t * @param {?Object3D} [localRoot=null] - The root object on which this action is performed.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode.\n\t */\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\n\t\t/**\n\t\t * Defines how the animation is blended/combined when two or more animations\n\t\t * are simultaneously played.\n\t\t *\n\t\t * @type {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)}\n\t\t */\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants; // bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\t/**\n\t\t * The loop mode, set via {@link AnimationAction#setLoop}.\n\t\t *\n\t\t * @type {(LoopRepeat|LoopOnce|LoopPingPong)}\n\t\t * @default LoopRepeat\n\t\t */\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t/**\n\t\t * The local time of this action (in seconds, starting with `0`).\n\t\t *\n\t\t * The value gets clamped or wrapped to `[0,clip.duration]` (according to the\n\t\t * loop state).\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * Scaling factor for the {@link AnimationAction#time}. A value of `0` causes the\n\t\t * animation to pause. Negative values cause the animation to play backwards.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\t/**\n\t\t * The degree of influence of this action (in the interval `[0, 1]`). Values\n\t\t * between `0` (no impact) and `1` (full impact) can be used to blend between\n\t\t * several actions.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\t/**\n\t\t * The number of repetitions of the performed clip over the course of this action.\n\t\t * Can be set via {@link AnimationAction#setLoop}.\n\t\t *\n\t\t * Setting this number has no effect if {@link AnimationAction#loop} is set to\n\t\t * `THREE:LoopOnce`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.repetitions = Infinity;\n\n\t\t/**\n\t\t * If set to `true`, the playback of the action is paused.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.paused = false;\n\n\t\t/**\n\t\t * If set to `false`, the action is disabled so it has no impact.\n\t\t *\n\t\t * When the action is re-enabled, the animation continues from its current\n\t\t * time (setting `enabled` to `false` doesn't reset the action).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * If set to true the animation will automatically be paused on its last frame.\n\t\t *\n\t\t * If set to false, {@link AnimationAction#enabled} will automatically be switched\n\t\t * to `false` when the last loop of the action has finished, so that this action has\n\t\t * no further impact.\n\t\t *\n\t\t * Note: This member has no impact if the action is interrupted (it\n\t\t * has only an effect if its last loop has really finished).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clampWhenFinished = false;\n\n\t\t/**\n\t\t * Enables smooth interpolation without separate clips for start, loop and end.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.zeroSlopeAtStart = true;\n\n\t\t/**\n\t\t * Enables smooth interpolation without separate clips for start, loop and end.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.zeroSlopeAtEnd = true;\n\n\t}\n\n\t/**\n\t * Starts the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\t/**\n\t * Resets the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = -1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\t/**\n\t * Returns `true` if the animation is running.\n\t *\n\t * @return {boolean} Whether the animation is running or not.\n\t */\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t/**\n\t * Returns `true` when {@link AnimationAction#play} has been called.\n\t *\n\t * @return {boolean} Whether the animation is scheduled or not.\n\t */\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\t/**\n\t * Defines the time when the animation should start.\n\t *\n\t * @param {number} time - The start time in seconds.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Configures the loop settings for this action.\n\t *\n\t * @param {(LoopRepeat|LoopOnce|LoopPingPong)} mode - The loop mode.\n\t * @param {number} repetitions - The number of repetitions.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetLoop( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the effective weight of this action.\n\t *\n\t * An action has no effect and thus an effective weight of zero when the\n\t * action is disabled.\n\t *\n\t * @param {number} weight - The weight to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetEffectiveWeight( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t}\n\n\t/**\n\t * Returns the effective weight of this action.\n\t *\n\t * @return {number} The effective weight.\n\t */\n\tgetEffectiveWeight() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\t/**\n\t * Fades the animation in by increasing its weight gradually from `0` to `1`,\n\t * within the passed time interval.\n\t *\n\t * @param {number} duration - The duration of the fade.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\t/**\n\t * Fades the animation out by decreasing its weight gradually from `1` to `0`,\n\t * within the passed time interval.\n\t *\n\t * @param {number} duration - The duration of the fade.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\t/**\n\t * Causes this action to fade in and the given action to fade out,\n\t * within the passed time interval.\n\t *\n\t * @param {AnimationAction} fadeOutAction - The animation action to fade out.\n\t * @param {number} duration - The duration of the fade.\n\t * @param {boolean} [warp=false] - Whether warping should be used or not.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tcrossFadeFrom( fadeOutAction, duration, warp = false ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp === true ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Causes this action to fade out and the given action to fade in,\n\t * within the passed time interval.\n\t *\n\t * @param {AnimationAction} fadeInAction - The animation action to fade in.\n\t * @param {number} duration - The duration of the fade.\n\t * @param {boolean} [warp=false] - Whether warping should be used or not.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tcrossFadeTo( fadeInAction, duration, warp = false ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\t/**\n\t * Stops any fading which is applied to this action.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstopFading() {\n\n\t\tconst weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the effective time scale of this action.\n\t *\n\t * An action has no effect and thus an effective time scale of zero when the\n\t * action is paused.\n\t *\n\t * @param {number} timeScale - The time scale to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetEffectiveTimeScale( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Returns the effective time scale of this action.\n\t *\n\t * @return {number} The effective time scale.\n\t */\n\tgetEffectiveTimeScale() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\t/**\n\t * Sets the duration for a single loop of this action.\n\t *\n\t * @param {number} duration - The duration to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Synchronizes this action with the passed other action.\n\t *\n\t * @param {AnimationAction} action - The action to sync with.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsyncWith( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Decelerates this animation's speed to `0` within the passed time interval.\n\t *\n\t * @param {number} duration - The duration.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\thalt( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\t/**\n\t * Changes the playback speed, within the passed time interval, by modifying\n\t * {@link AnimationAction#timeScale} gradually from `startTimeScale` to\n\t * `endTimeScale`.\n\t *\n\t * @param {number} startTimeScale - The start time scale.\n\t * @param {number} endTimeScale - The end time scale.\n\t * @param {number} duration - The duration.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops any scheduled warping which is applied to this action.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstopWarping() {\n\n\t\tconst timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the animation mixer of this animation action.\n\t *\n\t * @return {AnimationMixer} The animation mixer.\n\t */\n\tgetMixer() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\t/**\n\t * Returns the animation clip of this animation action.\n\t *\n\t * @return {AnimationClip} The animation clip.\n\t */\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\t/**\n\t * Returns the root object of this animation action.\n\t *\n\t * @return {Object3D} The root object.\n\t */\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\tdeltaTime = 0;\n\n\t\t\t} else {\n\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t}\n\n\t_updateTimeScale( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t}\n\n\t_updateTime( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === -1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_scheduleFading( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _controlInterpolantsResultBuffer = new Float32Array( 1 );\n\n/**\n * `AnimationMixer` is a player for animations on a particular object in\n * the scene. When multiple objects in the scene are animated independently,\n * one `AnimationMixer` may be used for each object.\n */\nclass AnimationMixer extends EventDispatcher {\n\n\t/**\n\t * Constructs a new animation mixer.\n\t *\n\t * @param {Object3D} root - The object whose animations shall be played by this mixer.\n\t */\n\tconstructor( root ) {\n\n\t\tsuper();\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\t/**\n\t\t * The global mixer time (in seconds; starting with `0` on the mixer's creation).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * A scaling factor for the global time.\n\t\t *\n\t\t * Note: Setting this member to `0` and later back to `1` is a\n\t\t * possibility to pause/unpause all actions that are controlled by this\n\t\t * mixer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\t_bindAction( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t}\n\n\t_activateAction( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t}\n\n\t_deactivateAction( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t}\n\n\t// Memory manager\n\n\t_initMemoryManager() {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t}\n\n\t_addInactiveAction( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t}\n\n\t_removeInactiveAction( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t}\n\n\t_removeInactiveBindingsForAction( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_lendAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions >| inactive actions ]\n\t\t// s a\n\t\t// <-swap->\n\t\t// a s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t}\n\n\t_takeBackAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions |< inactive actions ]\n\t\t// a s\n\t\t// <-swap->\n\t\t// s a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t}\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t}\n\n\t_removeInactiveBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t}\n\n\t_lendBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t}\n\n\t_takeBackBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t}\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant() {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, _controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t}\n\n\t_takeBackControlInterpolant( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t}\n\n\t/**\n\t * Returns an instance of {@link AnimationAction} for the passed clip.\n\t *\n\t * If an action fitting the clip and root parameters doesn't yet exist, it\n\t * will be created by this method. Calling this method several times with the\n\t * same clip and root parameters always returns the same action.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode.\n\t * @return {?AnimationAction} The animation action.\n\t */\n\tclipAction( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t}\n\n\t/**\n\t * Returns an existing animation action for the passed clip.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t * @return {?AnimationAction} The animation action. Returns `null` if no action was found.\n\t */\n\texistingAction( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Deactivates all previously scheduled actions on this mixer.\n\t *\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tstopAllAction() {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Advances the global mixer time and updates the animation.\n\t *\n\t * This is usually done in the render loop by passing the delta\n\t * time from {@link Clock} or {@link Timer}.\n\t *\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tupdate( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the global mixer to a specific time and updates the animation accordingly.\n\t *\n\t * This is useful when you need to jump to an exact time in an animation. The\n\t * input parameter will be scaled by {@link AnimationMixer#timeScale}\n\t *\n\t * @param {number} time - The time to set in seconds.\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tsetTime( time ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( time ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t}\n\n\t/**\n\t * Returns this mixer's root object.\n\t *\n\t * @return {Object3D} The mixer's root object.\n\t */\n\tgetRoot() {\n\n\t\treturn this._root;\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for a clip. Before using this method make\n\t * sure to call {@link AnimationAction#stop} for all related actions.\n\t *\n\t * @param {AnimationClip} clip - The clip to uncache.\n\t */\n\tuncacheClip( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for a root object. Before using this\n\t * method make sure to call {@link AnimationAction#stop} for all related\n\t * actions or alternatively {@link AnimationMixer#stopAllAction} when the\n\t * mixer operates on a single root.\n\t *\n\t * @param {Object3D} root - The root object to uncache.\n\t */\n\tuncacheRoot( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for an action. The action is identified by the\n\t * given clip and an optional root object. Before using this method make\n\t * sure to call {@link AnimationAction#stop} to deactivate the action.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t */\n\tuncacheAction( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a 3D render target.\n *\n * @augments RenderTarget\n */\nclass RenderTarget3D extends RenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderTarget3D = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {Data3DTexture}\n\t\t */\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Represents a uniform which is a global shader variable. They are passed to shader programs.\n *\n * When declaring a uniform of a {@link ShaderMaterial}, it is declared by value or by object.\n * ```js\n * uniforms: {\n * \ttime: { value: 1.0 },\n * \tresolution: new Uniform( new Vector2() )\n * };\n * ```\n * Since this class can only be used in context of {@link ShaderMaterial}, it is only supported\n * in {@link WebGLRenderer}.\n */\nclass Uniform {\n\n\t/**\n\t * Constructs a new uniform.\n\t *\n\t * @param {any} value - The uniform value.\n\t */\n\tconstructor( value ) {\n\n\t\t/**\n\t\t * The uniform value.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.value = value;\n\n\t}\n\n\t/**\n\t * Returns a new uniform with copied values from this instance.\n\t * If the value has a `clone()` method, the value is cloned as well.\n\t *\n\t * @return {Uniform} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nlet _id = 0;\n\n/**\n * A class for managing multiple uniforms in a single group. The renderer will process\n * such a definition as a single UBO.\n *\n * Since this class can only be used in context of {@link ShaderMaterial}, it is only supported\n * in {@link WebGLRenderer}.\n *\n * @augments EventDispatcher\n */\nclass UniformsGroup extends EventDispatcher {\n\n\t/**\n\t * Constructs a new uniforms group.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isUniformsGroup = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name UniformsGroup#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id ++ } );\n\n\t\t/**\n\t\t * The name of the uniforms group.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The buffer usage.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * An array holding the uniforms.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.uniforms = [];\n\n\t}\n\n\t/**\n\t * Adds the given uniform to this uniforms group.\n\t *\n\t * @param {Uniform} uniform - The uniform to add.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tadd( uniform ) {\n\n\t\tthis.uniforms.push( uniform );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given uniform from this uniforms group.\n\t *\n\t * @param {Uniform} uniform - The uniform to remove.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tremove( uniform ) {\n\n\t\tconst index = this.uniforms.indexOf( uniform );\n\n\t\tif ( index !== -1 ) this.uniforms.splice( index, 1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the name of this uniforms group.\n\t *\n\t * @param {string} name - The name to set.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the usage of this uniforms group.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Copies the values of the given uniforms group to this instance.\n\t *\n\t * @param {UniformsGroup} source - The uniforms group to copy.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.usage = source.usage;\n\n\t\tconst uniformsSource = source.uniforms;\n\n\t\tthis.uniforms.length = 0;\n\n\t\tfor ( let i = 0, l = uniformsSource.length; i < l; i ++ ) {\n\n\t\t\tconst uniforms = Array.isArray( uniformsSource[ i ] ) ? uniformsSource[ i ] : [ uniformsSource[ i ] ];\n\n\t\t\tfor ( let j = 0; j < uniforms.length; j ++ ) {\n\n\t\t\t\tthis.uniforms.push( uniforms[ j ].clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new uniforms group with copied values from this instance.\n\t *\n\t * @return {UniformsGroup} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * An instanced version of an interleaved buffer.\n *\n * @augments InterleavedBuffer\n */\nclass InstancedInterleavedBuffer extends InterleavedBuffer {\n\n\t/**\n\t * Constructs a new instanced interleaved buffer.\n\t *\n\t * @param {TypedArray} array - A typed array with a shared buffer storing attribute data.\n\t * @param {number} stride - The number of typed-array elements per vertex.\n\t * @param {number} [meshPerAttribute=1] - Defines how often a value of this interleaved buffer should be repeated.\n\t */\n\tconstructor( array, stride, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, stride );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedInterleavedBuffer = true;\n\n\t\t/**\n\t\t * Defines how often a value of this buffer attribute should be repeated,\n\t\t * see {@link InstancedBufferAttribute#meshPerAttribute}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tconst ib = super.clone( data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tconst json = super.toJSON( data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n}\n\n/**\n * An alternative version of a buffer attribute with more control over the VBO.\n *\n * The renderer does not construct a VBO for this kind of attribute. Instead, it uses\n * whatever VBO is passed in constructor and can later be altered via the `buffer` property.\n *\n * The most common use case for this class is when some kind of GPGPU calculation interferes\n * or even produces the VBOs in question.\n *\n * Notice that this class can only be used with {@link WebGLRenderer}.\n */\nclass GLBufferAttribute {\n\n\t/**\n\t * Constructs a new GL buffer attribute.\n\t *\n\t * @param {WebGLBuffer} buffer - The native WebGL buffer.\n\t * @param {number} type - The native data type (e.g. `gl.FLOAT`).\n\t * @param {number} itemSize - The item size.\n\t * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter.\n\t * @param {number} count - The expected number of vertices in VBO.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( buffer, type, itemSize, elementSize, count, normalized = false ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGLBufferAttribute = true;\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The native WebGL buffer.\n\t\t *\n\t\t * @type {WebGLBuffer}\n\t\t */\n\t\tthis.buffer = buffer;\n\n\t\t/**\n\t\t * The native data type.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * The item size, see {@link BufferAttribute#itemSize}.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * The corresponding size (in bytes) for the given `type` parameter.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.elementSize = elementSize;\n\n\t\t/**\n\t\t * The expected number of vertices in VBO.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * Applies to integer data only. Indicates how the underlying data in the buffer maps to\n\t\t * the values in the GLSL code. For instance, if `buffer` contains data of `gl.UNSIGNED_SHORT`,\n\t\t * and `normalized` is `true`, the values `0 - +65535` in the buffer data will be mapped to\n\t\t * `0.0f - +1.0f` in the GLSL attribute. If `normalized` is `false`, the values will be converted\n\t\t * to floats unmodified, i.e. `65535` becomes `65535.0f`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the given native WebGL buffer.\n\t *\n\t * @param {WebGLBuffer} buffer - The buffer to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetBuffer( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given native data type and element size.\n\t *\n\t * @param {number} type - The native data type (e.g. `gl.FLOAT`).\n\t * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetType( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the item size.\n\t *\n\t * @param {number} itemSize - The item size.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetItemSize( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the count (the expected number of vertices in VBO).\n\t *\n\t * @param {number} count - The count.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * This class is designed to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3d space the mouse is over)\n * amongst other things.\n */\nclass Raycaster {\n\n\t/**\n\t * Constructs a new raycaster.\n\t *\n\t * @param {Vector3} origin - The origin vector where the ray casts from.\n\t * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray.\n\t * @param {number} [near=0] - All results returned are further away than near. Near can't be negative.\n\t * @param {number} [far=Infinity] - All results returned are closer than far. Far can't be lower than near.\n\t */\n\tconstructor( origin, direction, near = 0, far = Infinity ) {\n\n\t\t/**\n\t\t * The ray used for raycasting.\n\t\t *\n\t\t * @type {Ray}\n\t\t */\n\t\tthis.ray = new Ray( origin, direction );\n\n\t\t/**\n\t\t * All results returned are further away than near. Near can't be negative.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * All results returned are further away than near. Near can't be negative.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * The camera to use when raycasting against view-dependent objects such as\n\t\t * billboarded objects like sprites. This field can be set manually or\n\t\t * is set when calling `setFromCamera()`.\n\t\t *\n\t\t * @type {?Camera}\n\t\t * @default null\n\t\t */\n\t\tthis.camera = null;\n\n\t\t/**\n\t\t * Allows to selectively ignore 3D objects when performing intersection tests.\n\t\t * The following code example ensures that only 3D objects on layer `1` will be\n\t\t * honored by raycaster.\n\t\t * ```js\n\t\t * raycaster.layers.set( 1 );\n\t\t * object.layers.enable( 1 );\n\t\t * ```\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\n\t\t/**\n\t\t * A parameter object that configures the raycasting. It has the structure:\n\t\t *\n\t\t * ```\n\t\t * {\n\t\t * \tMesh: {},\n\t\t * \tLine: { threshold: 1 },\n\t\t * \tLOD: {},\n\t\t * \tPoints: { threshold: 1 },\n\t\t * \tSprite: {}\n\t\t * }\n\t\t * ```\n\t\t * Where `threshold` is the precision of the raycaster when intersecting objects, in world units.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: { threshold: 1 },\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the ray with a new origin and direction by copying the values from the arguments.\n\t *\n\t * @param {Vector3} origin - The origin vector where the ray casts from.\n\t * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray.\n\t */\n\tset( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t}\n\n\t/**\n\t * Uses the given coordinates and camera to compute a new origin and direction for the internal ray.\n\t *\n\t * @param {Vector2} coords - 2D coordinates of the mouse, in normalized device coordinates (NDC).\n\t * X and Y components should be between `-1` and `1`.\n\t * @param {Camera} camera - The camera from which the ray should originate.\n\t */\n\tsetFromCamera( coords, camera ) {\n\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( camera.isOrthographicCamera ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, -1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\terror( 'Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Uses the given WebXR controller to compute a new origin and direction for the internal ray.\n\t *\n\t * @param {WebXRController} controller - The controller to copy the position and direction from.\n\t * @return {Raycaster} A reference to this raycaster.\n\t */\n\tsetFromXRController( controller ) {\n\n\t\t_matrix.identity().extractRotation( controller.matrixWorld );\n\n\t\tthis.ray.origin.setFromMatrixPosition( controller.matrixWorld );\n\t\tthis.ray.direction.set( 0, 0, -1 ).applyMatrix4( _matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The intersection point of a raycaster intersection test.\n\t * @typedef {Object} Raycaster~Intersection\n\t * @property {number} distance - The distance from the ray's origin to the intersection point.\n\t * @property {number} distanceToRay - Some 3D objects e.g. {@link Points} provide the distance of the\n\t * intersection to the nearest point on the ray. For other objects it will be `undefined`.\n\t * @property {Vector3} point - The intersection point, in world coordinates.\n\t * @property {Object} face - The face that has been intersected.\n\t * @property {number} faceIndex - The face index.\n\t * @property {Object3D} object - The 3D object that has been intersected.\n\t * @property {Vector2} uv - U,V coordinates at point of intersection.\n\t * @property {Vector2} uv1 - Second set of U,V coordinates at point of intersection.\n\t * @property {Vector3} uv1 - Interpolated normal vector at point of intersection.\n\t * @property {number} instanceId - The index number of the instance where the ray\n\t * intersects the {@link InstancedMesh}.\n\t */\n\n\t/**\n\t * Checks all intersection between the ray and the object with or without the\n\t * descendants. Intersections are returned sorted by distance, closest first.\n\t *\n\t * `Raycaster` delegates to the `raycast()` method of the passed 3D object, when\n\t * evaluating whether the ray intersects the object or not. This allows meshes to respond\n\t * differently to ray casting than lines or points.\n\t *\n\t * Note that for meshes, faces must be pointed towards the origin of the ray in order\n\t * to be detected; intersections of the ray passing through the back of a face will not\n\t * be detected. To raycast against both faces of an object, you'll want to set {@link Material#side}\n\t * to `THREE.DoubleSide`.\n\t *\n\t * @param {Object3D} object - The 3D object to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {Array} [intersects=[]] The target array that holds the result of the method.\n\t * @return {Array} An array holding the intersection points.\n\t */\n\tintersectObject( object, recursive = true, intersects = [] ) {\n\n\t\tintersect( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n\t/**\n\t * Checks all intersection between the ray and the objects with or without\n\t * the descendants. Intersections are returned sorted by distance, closest first.\n\t *\n\t * @param {Array} objects - The 3D objects to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {Array} [intersects=[]] The target array that holds the result of the method.\n\t * @return {Array} An array holding the intersection points.\n\t */\n\tintersectObjects( objects, recursive = true, intersects = [] ) {\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersect( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersect( object, raycaster, intersects, recursive ) {\n\n\tlet propagate = true;\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tconst result = object.raycast( raycaster, intersects );\n\n\t\tif ( result === false ) propagate = false;\n\n\t}\n\n\tif ( propagate === true && recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersect( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class is an alternative to {@link Clock} with a different API design and behavior.\n * The goal is to avoid the conceptual flaws that became apparent in `Clock` over time.\n *\n * - `Timer` has an `update()` method that updates its internal state. That makes it possible to\n * call `getDelta()` and `getElapsed()` multiple times per simulation step without getting different values.\n * - The class can make use of the Page Visibility API to avoid large time delta values when the app\n * is inactive (e.g. tab switched or browser hidden).\n *\n * ```js\n * const timer = new Timer();\n * timer.connect( document ); // use Page Visibility API\n * ```\n */\nclass Timer {\n\n\t/**\n\t * Constructs a new timer.\n\t */\n\tconstructor() {\n\n\t\tthis._previousTime = 0;\n\t\tthis._currentTime = 0;\n\t\tthis._startTime = performance.now();\n\n\t\tthis._delta = 0;\n\t\tthis._elapsed = 0;\n\n\t\tthis._timescale = 1;\n\n\t\tthis._document = null;\n\t\tthis._pageVisibilityHandler = null;\n\n\t}\n\n\t/**\n\t * Connect the timer to the given document.Calling this method is not mandatory to\n\t * use the timer but enables the usage of the Page Visibility API to avoid large time\n\t * delta values.\n\t *\n\t * @param {Document} document - The document.\n\t */\n\tconnect( document ) {\n\n\t\tthis._document = document;\n\n\t\t// use Page Visibility API to avoid large time delta values\n\n\t\tif ( document.hidden !== undefined ) {\n\n\t\t\tthis._pageVisibilityHandler = handleVisibilityChange.bind( this );\n\n\t\t\tdocument.addEventListener( 'visibilitychange', this._pageVisibilityHandler, false );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disconnects the timer from the DOM and also disables the usage of the Page Visibility API.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._pageVisibilityHandler !== null ) {\n\n\t\t\tthis._document.removeEventListener( 'visibilitychange', this._pageVisibilityHandler );\n\t\t\tthis._pageVisibilityHandler = null;\n\n\t\t}\n\n\t\tthis._document = null;\n\n\t}\n\n\t/**\n\t * Returns the time delta in seconds.\n\t *\n\t * @return {number} The time delta in second.\n\t */\n\tgetDelta() {\n\n\t\treturn this._delta / 1000;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time in second.\n\t */\n\tgetElapsed() {\n\n\t\treturn this._elapsed / 1000;\n\n\t}\n\n\t/**\n\t * Returns the timescale.\n\t *\n\t * @return {number} The timescale.\n\t */\n\tgetTimescale() {\n\n\t\treturn this._timescale;\n\n\t}\n\n\t/**\n\t * Sets the given timescale which scale the time delta computation\n\t * in `update()`.\n\t *\n\t * @param {number} timescale - The timescale to set.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tsetTimescale( timescale ) {\n\n\t\tthis._timescale = timescale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Resets the time computation for the current simulation step.\n\t *\n\t * @return {Timer} A reference to this timer.\n\t */\n\treset() {\n\n\t\tthis._currentTime = performance.now() - this._startTime;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Can be used to free all internal resources. Usually called when\n\t * the timer instance isn't required anymore.\n\t */\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t/**\n\t * Updates the internal state of the timer. This method should be called\n\t * once per simulation step and before you perform queries against the timer\n\t * (e.g. via `getDelta()`).\n\t *\n\t * @param {number} timestamp - The current time in milliseconds. Can be obtained\n\t * from the `requestAnimationFrame` callback argument. If not provided, the current\n\t * time will be determined with `performance.now`.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tupdate( timestamp ) {\n\n\t\tif ( this._pageVisibilityHandler !== null && this._document.hidden === true ) {\n\n\t\t\tthis._delta = 0;\n\n\t\t} else {\n\n\t\t\tthis._previousTime = this._currentTime;\n\t\t\tthis._currentTime = ( timestamp !== undefined ? timestamp : performance.now() ) - this._startTime;\n\n\t\t\tthis._delta = ( this._currentTime - this._previousTime ) * this._timescale;\n\t\t\tthis._elapsed += this._delta; // _elapsed is the accumulation of all previous deltas\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction handleVisibilityChange() {\n\n\tif ( this._document.hidden === false ) this.reset();\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Spherical coordinates](https://en.wikipedia.org/wiki/Spherical_coordinate_system).\n */\nclass Spherical {\n\n\t/**\n\t * Constructs a new spherical.\n\t *\n\t * @param {number} [radius=1] - The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t * @param {number} [phi=0] - The polar angle in radians from the y (up) axis.\n\t * @param {number} [theta=0] - The equator/azimuthal angle in radians around the y (up) axis.\n\t */\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\t/**\n\t\t * The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * The polar angle in radians from the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.phi = phi;\n\n\t\t/**\n\t\t * The equator/azimuthal angle in radians around the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t}\n\n\t/**\n\t * Sets the spherical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The polar angle.\n\t * @param {number} theta - The azimuthal angle.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical to this instance.\n\t *\n\t * @param {Spherical} other - The spherical to copy.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Restricts the polar angle [page:.phi phi] to be between `0.000001` and pi -\n\t * `0.000001`.\n\t *\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = clamp( this.phi, EPS, Math.PI - EPS );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The y value.\n\t * @param {number} z - The z value.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( clamp( y / this.radius, -1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new spherical with copied values from this instance.\n\t *\n\t * @return {Spherical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Cylindrical coordinates](https://en.wikipedia.org/wiki/Cylindrical_coordinate_system).\n */\nclass Cylindrical {\n\n\t/**\n\t * Constructs a new cylindrical.\n\t *\n\t * @param {number} [radius=1] - The distance from the origin to a point in the x-z plane.\n\t * @param {number} [theta=0] - A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t * @param {number} [y=0] - The height above the x-z plane.\n\t */\n\tconstructor( radius = 1, theta = 0, y = 0 ) {\n\n\t\t/**\n\t\t * The distance from the origin to a point in the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t\t/**\n\t\t * The height above the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle.\n\t * @param {number} y - The height value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tset( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given cylindrical to this instance.\n\t *\n\t * @param {Cylindrical} other - The cylindrical to copy.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The x value.\n\t * @param {number} z - The x value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new cylindrical with copied values from this instance.\n\t *\n\t * @return {Cylindrical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 2x2 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix2#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix2#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix2();\n * m.set( 11, 12,\n * 21, 22 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21,\n * 12, 22 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix2 {\n\n\t/**\n\t * Constructs a new 2x2 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t */\n\tconstructor( n11, n12, n21, n22 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix2.prototype.isMatrix2 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.elements = [\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n21, n22 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 2x2 identity matrix.\n\t *\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} n11 - 1-1 matrix element.\n\t * @param {number} n12 - 1-2 matrix element.\n\t * @param {number} n21 - 2-1 matrix element.\n\t * @param {number} n22 - 2-2 matrix element.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tset( n11, n12, n21, n22 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 2 ] = n12;\n\t\tte[ 1 ] = n21; te[ 3 ] = n22;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$4 = /*@__PURE__*/ new Vector2();\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 2D space.\n */\nclass Box2 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector2} [min=(Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector2} [max=(-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox2 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector2} min - The lower boundary of the box.\n\t * @param {Vector2} max - The upper boundary of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array} points - An array holding 2D position data as instances of {@link Vector2}.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector2} center - The center of the box.\n\t * @param {Vector2} size - The x and y dimensions of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box2} box - The box to copy.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 2D.\n\t *\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector2} point - The point that should be included by the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions.\n\t *\n\t * @param {Vector2} vector - The vector that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector2} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width and height.\n\t *\n\t * @param {Vector2} point - A point in 2D space.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} A point as a proportion of this box's width and height.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector2} point - The point to clamp.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector2} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$4 ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box2} box - The bounding box to intersect with.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box2} box - The bounding box that will be unioned with this instance.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 2D space.\n\t *\n\t * @param {Vector2} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box2} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\nconst _d1 = /*@__PURE__*/ new Vector3();\nconst _d2 = /*@__PURE__*/ new Vector3();\nconst _r = /*@__PURE__*/ new Vector3();\nconst _c1 = /*@__PURE__*/ new Vector3();\nconst _c2 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical line segment in 3D space represented by a start and end point.\n */\nclass Line3 {\n\n\t/**\n\t * Constructs a new line segment.\n\t *\n\t * @param {Vector3} [start=(0,0,0)] - Start of the line segment.\n\t * @param {Vector3} [end=(0,0,0)] - End of the line segment.\n\t */\n\tconstructor( start = new Vector3(), end = new Vector3() ) {\n\n\t\t/**\n\t\t * Start of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.start = start;\n\n\t\t/**\n\t\t * End of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.end = end;\n\n\t}\n\n\t/**\n\t * Sets the start and end values by copying the given vectors.\n\t *\n\t * @param {Vector3} start - The start point.\n\t * @param {Vector3} end - The end point.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tset( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given line segment to this instance.\n\t *\n\t * @param {Line3} line - The line segment to copy.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tcopy( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the center of the line segment.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the delta vector of the line segment's start and end point.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tdelta( target ) {\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\t/**\n\t * Returns the squared Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The squared Euclidean distance.\n\t */\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\t/**\n\t * Returns the Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The Euclidean distance.\n\t */\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\t/**\n\t * Returns a vector at a certain position along the line segment.\n\t *\n\t * @param {number} t - A value between `[0,1]` to represent a position along the line segment.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tat( t, target ) {\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns a point parameter based on the closest point as projected on the line segment.\n\t *\n\t * @param {Vector3} point - The point for which to return a point parameter.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @return {number} The point parameter.\n\t */\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns the closest point on the line for a given point.\n\t *\n\t * @param {Vector3} point - The point to compute the closest point on the line for.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the line.\n\t */\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns the closest squared distance between this line segment and the given one.\n\t *\n\t * @param {Line3} line - The line segment to compute the closest squared distance to.\n\t * @param {Vector3} [c1] - The closest point on this line segment.\n\t * @param {Vector3} [c2] - The closest point on the given line segment.\n\t * @return {number} The squared distance between this line segment and the given one.\n\t */\n\tdistanceSqToLine3( line, c1 = _c1, c2 = _c2 ) {\n\n\t\t// from Real-Time Collision Detection by Christer Ericson, chapter 5.1.9\n\n\t\t// Computes closest points C1 and C2 of S1(s)=P1+s*(Q1-P1) and\n\t\t// S2(t)=P2+t*(Q2-P2), returning s and t. Function result is squared\n\t\t// distance between between S1(s) and S2(t)\n\n\t\tconst EPSILON = 1e-8 * 1e-8; // must be squared since we compare squared length\n\t\tlet s, t;\n\n\t\tconst p1 = this.start;\n\t\tconst p2 = line.start;\n\t\tconst q1 = this.end;\n\t\tconst q2 = line.end;\n\n\t\t_d1.subVectors( q1, p1 ); // Direction vector of segment S1\n\t\t_d2.subVectors( q2, p2 ); // Direction vector of segment S2\n\t\t_r.subVectors( p1, p2 );\n\n\t\tconst a = _d1.dot( _d1 ); // Squared length of segment S1, always nonnegative\n\t\tconst e = _d2.dot( _d2 ); // Squared length of segment S2, always nonnegative\n\t\tconst f = _d2.dot( _r );\n\n\t\t// Check if either or both segments degenerate into points\n\n\t\tif ( a <= EPSILON && e <= EPSILON ) {\n\n\t\t\t// Both segments degenerate into points\n\n\t\t\tc1.copy( p1 );\n\t\t\tc2.copy( p2 );\n\n\t\t\tc1.sub( c2 );\n\n\t\t\treturn c1.dot( c1 );\n\n\t\t}\n\n\t\tif ( a <= EPSILON ) {\n\n\t\t\t// First segment degenerates into a point\n\n\t\t\ts = 0;\n\t\t\tt = f / e; // s = 0 => t = (b*s + f) / e = f / e\n\t\t\tt = clamp( t, 0, 1 );\n\n\n\t\t} else {\n\n\t\t\tconst c = _d1.dot( _r );\n\n\t\t\tif ( e <= EPSILON ) {\n\n\t\t\t\t// Second segment degenerates into a point\n\n\t\t\t\tt = 0;\n\t\t\t\ts = clamp( - c / a, 0, 1 ); // t = 0 => s = (b*t - c) / a = -c / a\n\n\t\t\t} else {\n\n\t\t\t\t// The general nondegenerate case starts here\n\n\t\t\t\tconst b = _d1.dot( _d2 );\n\t\t\t\tconst denom = a * e - b * b; // Always nonnegative\n\n\t\t\t\t// If segments not parallel, compute closest point on L1 to L2 and\n\t\t\t\t// clamp to segment S1. Else pick arbitrary s (here 0)\n\n\t\t\t\tif ( denom !== 0 ) {\n\n\t\t\t\t\ts = clamp( ( b * f - c * e ) / denom, 0, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ts = 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Compute point on L2 closest to S1(s) using\n\t\t\t\t// t = Dot((P1 + D1*s) - P2,D2) / Dot(D2,D2) = (b*s + f) / e\n\n\t\t\t\tt = ( b * s + f ) / e;\n\n\t\t\t\t// If t in [0,1] done. Else clamp t, recompute s for the new value\n\t\t\t\t// of t using s = Dot((P2 + D2*t) - P1,D1) / Dot(D1,D1)= (t*b - c) / a\n\t\t\t\t// and clamp s to [0, 1]\n\n\t\t\t\tif ( t < 0 ) {\n\n\t\t\t\t\tt = 0.;\n\t\t\t\t\ts = clamp( - c / a, 0, 1 );\n\n\t\t\t\t} else if ( t > 1 ) {\n\n\t\t\t\t\tt = 1;\n\t\t\t\t\ts = clamp( ( b - c ) / a, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tc1.copy( p1 ).add( _d1.multiplyScalar( s ) );\n\t\tc2.copy( p2 ).add( _d2.multiplyScalar( t ) );\n\n\t\tc1.sub( c2 );\n\n\t\treturn c1.dot( c1 );\n\n\t}\n\n\t/**\n\t * Applies a 4x4 transformation matrix to this line segment.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this line segment is equal with the given one.\n\t *\n\t * @param {Line3} line - The line segment to test for equality.\n\t * @return {boolean} Whether this line segment is equal with the given one.\n\t */\n\tequals( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n\t/**\n\t * Returns a new line segment with copied values from this instance.\n\t *\n\t * @return {Line3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * This displays a cone shaped helper object for a {@link SpotLight}.\n *\n * ```js\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 10, 10, 10 );\n * scene.add( spotLight );\n *\n * const spotLightHelper = new THREE.SpotLightHelper( spotLight );\n * scene.add( spotLightHelper );\n * ```\n *\n * @augments Object3D\n */\nclass SpotLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new spot light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {SpotLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'SpotLightHelper';\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t-1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, -1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t// update the local matrix based on the parent and light target transforms\n\t\tif ( this.parent ) {\n\n\t\t\tthis.parent.updateWorldMatrix( true );\n\n\t\t\tthis.matrix\n\t\t\t\t.copy( this.parent.matrixWorld )\n\t\t\t\t.invert()\n\t\t\t\t.multiply( this.light.matrixWorld );\n\n\t\t} else {\n\n\t\t\tthis.matrix.copy( this.light.matrixWorld );\n\n\t\t}\n\n\t\tthis.matrixWorld.copy( this.light.matrixWorld );\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n/**\n * A helper object to assist with visualizing a {@link Skeleton}.\n *\n * ```js\n * const helper = new THREE.SkeletonHelper( skinnedMesh );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass SkeletonHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new skeleton helper.\n\t *\n\t * @param {Object3D} object - Usually an instance of {@link SkinnedMesh}. However, any 3D object\n\t * can be used if it represents a hierarchy of bones (see {@link Bone}).\n\t */\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( 0, 0, 0 );\n\t\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.type = 'SkeletonHelper';\n\n\t\t/**\n\t\t * The object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.root = object;\n\n\t\t/**\n\t\t * The list of bones that the helper visualizes.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t// colors\n\n\t\tconst color1 = new Color( 0x0000ff );\n\t\tconst color2 = new Color( 0x00ff00 );\n\n\t\tthis.setColors( color1, color2 );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} color1 - The first line color for each bone.\n\t * @param {Color} color2 - The second line color for each bone.\n\t * @return {SkeletonHelper} A reference to this helper.\n\t */\n\tsetColors( color1, color2 ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\tfor ( let i = 0; i < colorAttribute.count; i += 2 ) {\n\n\t\t\tcolorAttribute.setXYZ( i, color1.r, color1.g, color1.b );\n\t\t\tcolorAttribute.setXYZ( i + 1, color2.r, color2.g, color2.b );\n\n\t\t}\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object.isBone === true ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push( ...getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\n/**\n * This displays a helper object consisting of a spherical mesh for\n * visualizing an instance of {@link PointLight}.\n *\n * ```js\n * const pointLight = new THREE.PointLight( 0xff0000, 1, 100 );\n * pointLight.position.set( 10, 10, 10 );\n * scene.add( pointLight );\n *\n * const sphereSize = 1;\n * const pointLightHelper = new THREE.PointLightHelper( pointLight, sphereSize );\n * scene.add( pointLightHelper );\n * ```\n *\n * @augments Mesh\n */\nclass PointLightHelper extends Mesh {\n\n\t/**\n\t * Constructs a new point light helper.\n\t *\n\t * @param {PointLight} light - The light to be visualized.\n\t * @param {number} [sphereSize=1] - The size of the sphere helper.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {HemisphereLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t}\n\n}\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\n/**\n * Creates a visual aid consisting of a spherical mesh for a\n * given {@link HemisphereLight}.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * const helper = new THREE.HemisphereLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass HemisphereLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new hemisphere light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The size of the mesh used to visualize the light.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {HemisphereLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'HemisphereLightHelper';\n\n\t\tconst geometry = new OctahedronGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tconst mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tmesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\n/**\n * The helper is an object to define grids. Grids are two-dimensional\n * arrays of lines.\n *\n * ```js\n * const size = 10;\n * const divisions = 10;\n *\n * const gridHelper = new THREE.GridHelper( size, divisions );\n * scene.add( gridHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass GridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new grid helper.\n\t *\n\t * @param {number} [size=10] - The size of the grid.\n\t * @param {number} [divisions=10] - The number of divisions across the grid.\n\t * @param {number|Color|string} [color1=0x444444] - The color of the center line.\n\t * @param {number|Color|string} [color2=0x888888] - The color of the lines of the grid.\n\t */\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This helper is an object to define polar grids. Grids are\n * two-dimensional arrays of lines.\n *\n * ```js\n * const radius = 10;\n * const sectors = 16;\n * const rings = 8;\n * const divisions = 64;\n *\n * const helper = new THREE.PolarGridHelper( radius, sectors, rings, divisions );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass PolarGridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new polar grid helper.\n\t *\n\t * @param {number} [radius=10] - The radius of the polar grid. This can be any positive number.\n\t * @param {number} [sectors=16] - The number of sectors the grid will be divided into. This can be any positive integer.\n\t * @param {number} [rings=16] - The number of rings. This can be any positive integer.\n\t * @param {number} [divisions=64] - The number of line segments used for each circle. This can be any positive integer.\n\t * @param {number|Color|string} [color1=0x444444] - The first color used for grid elements.\n\t * @param {number|Color|string} [color2=0x888888] - The second color used for grid elements.\n\t */\n\tconstructor( radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the sectors\n\n\t\tif ( sectors > 1 ) {\n\n\t\t\tfor ( let i = 0; i < sectors; i ++ ) {\n\n\t\t\t\tconst v = ( i / sectors ) * ( Math.PI * 2 );\n\n\t\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( x, 0, z );\n\n\t\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// create the rings\n\n\t\tfor ( let i = 0; i < rings; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / rings * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Helper object to assist with visualizing a {@link DirectionalLight}'s\n * effect on the scene. This consists of plane and a line representing the\n * light's position and direction.\n *\n * ```js\n * const light = new THREE.DirectionalLight( 0xFFFFFF );\n * scene.add( light );\n *\n * const helper = new THREE.DirectionalLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass DirectionalLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new directional light helper.\n\t *\n\t * @param {DirectionalLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The dimensions of the plane.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {DirectionalLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'DirectionalLightHelper';\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\t/**\n\t\t * Contains the line showing the location of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\t/**\n\t\t * Represents the target line of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t_v1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3.subVectors( _v2, _v1 );\n\n\t\tthis.lightPlane.lookAt( _v2 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( _v2 );\n\t\tthis.targetLine.scale.z = _v3.length();\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\n/**\n * This helps with visualizing what a camera contains in its frustum. It\n * visualizes the frustum of a camera using a line segments.\n *\n * Based on frustum visualization in [lightgl.js shadowmap example](https://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html).\n *\n * `CameraHelper` must be a child of the scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );\n * const helper = new THREE.CameraHelper( camera );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass CameraHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Camera} camera - The camera to visualize.\n\t */\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2' );\n\t\taddLine( 'n2', 'n4' );\n\t\taddLine( 'n4', 'n3' );\n\t\taddLine( 'n3', 'n1' );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2' );\n\t\taddLine( 'f2', 'f4' );\n\t\taddLine( 'f4', 'f3' );\n\t\taddLine( 'f3', 'f1' );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1' );\n\t\taddLine( 'n2', 'f2' );\n\t\taddLine( 'n3', 'f3' );\n\t\taddLine( 'n4', 'f4' );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1' );\n\t\taddLine( 'p', 'n2' );\n\t\taddLine( 'p', 'n3' );\n\t\taddLine( 'p', 'n4' );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2' );\n\t\taddLine( 'u2', 'u3' );\n\t\taddLine( 'u3', 'u1' );\n\n\t\t// target\n\n\t\taddLine( 'c', 't' );\n\t\taddLine( 'p', 'c' );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2' );\n\t\taddLine( 'cn3', 'cn4' );\n\n\t\taddLine( 'cf1', 'cf2' );\n\t\taddLine( 'cf3', 'cf4' );\n\n\t\tfunction addLine( a, b ) {\n\n\t\t\taddPoint( a );\n\t\t\taddPoint( b );\n\n\t\t}\n\n\t\tfunction addPoint( id ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\n\n\t\t/**\n\t\t * The camera being visualized.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * This contains the points used to visualize the camera.\n\t\t *\n\t\t * @type {Object>}\n\t\t */\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\tthis.setColors( colorFrustum, colorCone, colorUp, colorTarget, colorCross );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} frustum - The frustum line color.\n\t * @param {Color} cone - The cone line color.\n\t * @param {Color} up - The up line color.\n\t * @param {Color} target - The target line color.\n\t * @param {Color} cross - The cross line color.\n\t * @return {CameraHelper} A reference to this helper.\n\t */\n\tsetColors( frustum, cone, up, target, cross ) {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\t// near\n\n\t\tcolorAttribute.setXYZ( 0, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 1, frustum.r, frustum.g, frustum.b ); // n1, n2\n\t\tcolorAttribute.setXYZ( 2, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 3, frustum.r, frustum.g, frustum.b ); // n2, n4\n\t\tcolorAttribute.setXYZ( 4, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 5, frustum.r, frustum.g, frustum.b ); // n4, n3\n\t\tcolorAttribute.setXYZ( 6, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 7, frustum.r, frustum.g, frustum.b ); // n3, n1\n\n\t\t// far\n\n\t\tcolorAttribute.setXYZ( 8, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 9, frustum.r, frustum.g, frustum.b ); // f1, f2\n\t\tcolorAttribute.setXYZ( 10, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 11, frustum.r, frustum.g, frustum.b ); // f2, f4\n\t\tcolorAttribute.setXYZ( 12, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 13, frustum.r, frustum.g, frustum.b ); // f4, f3\n\t\tcolorAttribute.setXYZ( 14, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 15, frustum.r, frustum.g, frustum.b ); // f3, f1\n\n\t\t// sides\n\n\t\tcolorAttribute.setXYZ( 16, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 17, frustum.r, frustum.g, frustum.b ); // n1, f1\n\t\tcolorAttribute.setXYZ( 18, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 19, frustum.r, frustum.g, frustum.b ); // n2, f2\n\t\tcolorAttribute.setXYZ( 20, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 21, frustum.r, frustum.g, frustum.b ); // n3, f3\n\t\tcolorAttribute.setXYZ( 22, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 23, frustum.r, frustum.g, frustum.b ); // n4, f4\n\n\t\t// cone\n\n\t\tcolorAttribute.setXYZ( 24, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 25, cone.r, cone.g, cone.b ); // p, n1\n\t\tcolorAttribute.setXYZ( 26, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 27, cone.r, cone.g, cone.b ); // p, n2\n\t\tcolorAttribute.setXYZ( 28, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 29, cone.r, cone.g, cone.b ); // p, n3\n\t\tcolorAttribute.setXYZ( 30, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 31, cone.r, cone.g, cone.b ); // p, n4\n\n\t\t// up\n\n\t\tcolorAttribute.setXYZ( 32, up.r, up.g, up.b ); colorAttribute.setXYZ( 33, up.r, up.g, up.b ); // u1, u2\n\t\tcolorAttribute.setXYZ( 34, up.r, up.g, up.b ); colorAttribute.setXYZ( 35, up.r, up.g, up.b ); // u2, u3\n\t\tcolorAttribute.setXYZ( 36, up.r, up.g, up.b ); colorAttribute.setXYZ( 37, up.r, up.g, up.b ); // u3, u1\n\n\t\t// target\n\n\t\tcolorAttribute.setXYZ( 38, target.r, target.g, target.b ); colorAttribute.setXYZ( 39, target.r, target.g, target.b ); // c, t\n\t\tcolorAttribute.setXYZ( 40, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 41, cross.r, cross.g, cross.b ); // p, c\n\n\t\t// cross\n\n\t\tcolorAttribute.setXYZ( 42, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 43, cross.r, cross.g, cross.b ); // cn1, cn2\n\t\tcolorAttribute.setXYZ( 44, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 45, cross.r, cross.g, cross.b ); // cn3, cn4\n\n\t\tcolorAttribute.setXYZ( 46, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 47, cross.r, cross.g, cross.b ); // cf1, cf2\n\t\tcolorAttribute.setXYZ( 48, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 49, cross.r, cross.g, cross.b ); // cf3, cf4\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the helper based on the projection matrix of the camera.\n\t */\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\tlet nearZ, farZ;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// Adjust z values based on coordinate system\n\n\t\tif ( this.camera.reversedDepth === true ) {\n\n\t\t\tnearZ = 1;\n\t\t\tfarZ = 0;\n\n\t\t} else {\n\n\t\t\tif ( this.camera.coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tnearZ = -1;\n\t\t\t\tfarZ = 1;\n\n\t\t\t} else if ( this.camera.coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tnearZ = 0;\n\t\t\t\tfarZ = 1;\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.CameraHelper.update(): Invalid coordinate system: ' + this.camera.coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// center / target\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, nearZ );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, farZ );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, nearZ );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, nearZ );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, nearZ );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, nearZ );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, farZ );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, farZ );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, farZ );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, farZ );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, nearZ );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, farZ );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, farZ );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, farZ );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, farZ );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, nearZ );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, nearZ );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, nearZ );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, nearZ );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box = /*@__PURE__*/ new Box3();\n\n/**\n * Helper object to graphically show the world-axis-aligned bounding box\n * around an object. The actual bounding box is handled with {@link Box3},\n * this is just a visual helper for debugging. It can be automatically\n * resized with {@link BoxHelper#update} when the object it's created from\n * is transformed. Note that the object must have a geometry for this to work,\n * so it won't work with sprites.\n *\n * ```js\n * const sphere = new THREE.SphereGeometry();\n * const object = new THREE.Mesh( sphere, new THREE.MeshBasicMaterial( 0xff0000 ) );\n * const box = new THREE.BoxHelper( object, 0xffff00 );\n * scene.add( box );\n * ```\n *\n * @augments LineSegments\n */\nclass BoxHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new box helper.\n\t *\n\t * @param {Object3D} [object] - The 3D object to show the world-axis-aligned bounding box.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The 3D object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Updates the helper's geometry to match the dimensions of the object,\n\t * including any children.\n\t */\n\tupdate() {\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\t_box.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box.isEmpty() ) return;\n\n\t\tconst min = _box.min;\n\t\tconst max = _box.max;\n\n\t\t/*\n\t\t\t5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tconst position = this.geometry.attributes.position;\n\t\tconst array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\t/**\n\t * Updates the wireframe box for the passed object.\n\t *\n\t * @param {Object3D} object - The 3D object to create the helper for.\n\t * @return {BoxHelper} A reference to this instance.\n\t */\n\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Box3}.\n *\n * ```js\n * const box = new THREE.Box3();\n * box.setFromCenterAndSize( new THREE.Vector3( 1, 1, 1 ), new THREE.Vector3( 2, 1, 3 ) );\n *\n * const helper = new THREE.Box3Helper( box, 0xffff00 );\n * scene.add( helper )\n * ```\n *\n * @augments LineSegments\n */\nclass Box3Helper extends LineSegments {\n\n\t/**\n\t * Constructs a new box3 helper.\n\t *\n\t * @param {Box3} box - The box to visualize.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\t\tconst positions = [ 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1 ];\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The box being visualized.\n\t\t *\n\t\t * @type {Box3}\n\t\t */\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Plane}.\n *\n * ```js\n * const plane = new THREE.Plane( new THREE.Vector3( 1, 1, 0.2 ), 3 );\n * const helper = new THREE.PlaneHelper( plane, 1, 0xffff00 );\n * scene.add( helper );\n * ```\n *\n * @augments Line\n */\nclass PlaneHelper extends Line {\n\n\t/**\n\t * Constructs a new plane helper.\n\t *\n\t * @param {Plane} plane - The plane to be visualized.\n\t * @param {number} [size=1] - The side length of plane helper.\n\t * @param {number|Color|string} [hex=0xffff00] - The helper's color.\n\t */\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\t/**\n\t\t * The plane being visualized.\n\t\t *\n\t\t * @type {Plane}\n\t\t */\n\t\tthis.plane = plane;\n\n\t\t/**\n\t\t * The side length of plane helper.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tthis.position.set( 0, 0, 0 );\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, 1 );\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tthis.translateZ( - this.plane.constant );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\n/**\n * An 3D arrow object for visualizing directions.\n *\n * ```js\n * const dir = new THREE.Vector3( 1, 2, 0 );\n *\n * //normalize the direction vector (convert to vector of length 1)\n * dir.normalize();\n *\n * const origin = new THREE.Vector3( 0, 0, 0 );\n * const length = 1;\n * const hex = 0xffff00;\n *\n * const arrowHelper = new THREE.ArrowHelper( dir, origin, length, hex );\n * scene.add( arrowHelper );\n * ```\n *\n * @augments Object3D\n */\nclass ArrowHelper extends Object3D {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Vector3} [dir=(0, 0, 1)] - The (normalized) direction vector.\n\t * @param {Vector3} [origin=(0, 0, 0)] - Point at which the arrow starts.\n\t * @param {number} [length=1] - Length of the arrow in world units.\n\t * @param {(number|Color|string)} [color=0xffff00] - Color of the arrow.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tconstructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new ConeGeometry( 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, -0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\t/**\n\t\t * The line part of the arrow helper.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\t/**\n\t\t * The cone part of the arrow helper.\n\t\t *\n\t\t * @type {Mesh}\n\t\t */\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\t/**\n\t * Sets the direction of the helper.\n\t *\n\t * @param {Vector3} dir - The normalized direction vector.\n\t */\n\tsetDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < -0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the length of the helper.\n\t *\n\t * @param {number} length - Length of the arrow in world units.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tsetLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t}\n\n\t/**\n\t * Sets the color of the helper.\n\t *\n\t * @param {number|Color|string} color - The color to set.\n\t */\n\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.line.geometry.dispose();\n\t\tthis.line.material.dispose();\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n}\n\n/**\n * An axis object to visualize the 3 axes in a simple way.\n * The X axis is red. The Y axis is green. The Z axis is blue.\n *\n * ```js\n * const axesHelper = new THREE.AxesHelper( 5 );\n * scene.add( axesHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass AxesHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new axes helper.\n\t *\n\t * @param {number} [size=1] - Size of the lines representing the axes.\n\t */\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n\t/**\n\t * Defines the colors of the axes helper.\n\t *\n\t * @param {number|Color|string} xAxisColor - The color for the x axis.\n\t * @param {number|Color|string} yAxisColor - The color for the y axis.\n\t * @param {number|Color|string} zAxisColor - The color for the z axis.\n\t * @return {AxesHelper} A reference to this axes helper.\n\t */\n\tsetColors( xAxisColor, yAxisColor, zAxisColor ) {\n\n\t\tconst color = new Color();\n\t\tconst array = this.geometry.attributes.color.array;\n\n\t\tcolor.set( xAxisColor );\n\t\tcolor.toArray( array, 0 );\n\t\tcolor.toArray( array, 3 );\n\n\t\tcolor.set( yAxisColor );\n\t\tcolor.toArray( array, 6 );\n\t\tcolor.toArray( array, 9 );\n\n\t\tcolor.set( zAxisColor );\n\t\tcolor.toArray( array, 12 );\n\t\tcolor.toArray( array, 15 );\n\n\t\tthis.geometry.attributes.color.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This class is used to convert a series of paths to an array of\n * shapes. It is specifically used in context of fonts and SVG.\n */\nclass ShapePath {\n\n\t/**\n\t * Constructs a new shape path.\n\t */\n\tconstructor() {\n\n\t\tthis.type = 'ShapePath';\n\n\t\t/**\n\t\t * The color of the shape.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color();\n\n\t\t/**\n\t\t * The paths that have been generated for this shape.\n\t\t *\n\t\t * @type {Array}\n\t\t * @default null\n\t\t */\n\t\tthis.subPaths = [];\n\n\t\t/**\n\t\t * The current path that is being generated.\n\t\t *\n\t\t * @type {?Path}\n\t\t * @default null\n\t\t */\n\t\tthis.currentPath = null;\n\n\t}\n\n\t/**\n\t * Creates a new path and moves it current point to the given one.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array} pts - An array of points in 2D space.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts the paths into an array of shapes.\n\t *\n\t * @param {boolean} isCCW - By default solid shapes are defined clockwise (CW) and holes are defined counterclockwise (CCW).\n\t * If this flag is set to `true`, then those are flipped.\n\t * @return {Array} An array of shapes.\n\t */\n\ttoShapes( isCCW ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tlet toChange = 0;\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange ++;\n\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( toChange > 0 && ambiguous === false ) {\n\n\t\t\t\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n}\n\n/**\n * Abstract base class for controls.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Controls extends EventDispatcher {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Object3D} object - The object that is managed by the controls.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The object that is managed by the controls.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * The HTML element used for event listeners.\n\t\t *\n\t\t * @type {?HTMLElement}\n\t\t * @default null\n\t\t */\n\t\tthis.domElement = domElement;\n\n\t\t/**\n\t\t * Whether the controls responds to user input or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * The internal state of the controls.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.state = -1;\n\n\t\t/**\n\t\t * This object defines the keyboard input of the controls.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.keys = {};\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to the available mouse buttons.\n\t\t * It depends on the control implementation what kind of mouse buttons and actions are supported.\n\t\t *\n\t\t * @type {{LEFT: ?number, MIDDLE: ?number, RIGHT: ?number}}\n\t\t */\n\t\tthis.mouseButtons = { LEFT: null, MIDDLE: null, RIGHT: null };\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to what kind of touch interaction.\n\t\t * It depends on the control implementation what kind of touch interaction and actions are supported.\n\t\t *\n\t\t * @type {{ONE: ?number, TWO: ?number}}\n\t\t */\n\t\tthis.touches = { ONE: null, TWO: null };\n\n\t}\n\n\t/**\n\t * Connects the controls to the DOM. This method has so called \"side effects\" since\n\t * it adds the module's event listeners to the DOM.\n\t *\n\t * @param {HTMLElement} element - The DOM element to connect to.\n\t */\n\tconnect( element ) {\n\n\t\tif ( element === undefined ) {\n\n\t\t\twarn( 'Controls: connect() now requires an element.' ); // @deprecated, the warning can be removed with r185\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.domElement !== null ) this.disconnect();\n\n\t\tthis.domElement = element;\n\n\t}\n\n\t/**\n\t * Disconnects the controls from the DOM.\n\t */\n\tdisconnect() {}\n\n\t/**\n\t * Call this method if you no longer want use to the controls. It frees all internal\n\t * resources and removes all event listeners.\n\t */\n\tdispose() {}\n\n\t/**\n\t * Controls should implement this method if they have to update their internal state\n\t * per simulation step.\n\t *\n\t * @param {number} [delta] - The time delta in seconds.\n\t */\n\tupdate( /* delta */ ) {}\n\n}\n\n/**\n * Scales the texture as large as possible within its surface without cropping\n * or stretching the texture. The method preserves the original aspect ratio of\n * the texture. Akin to CSS `object-fit: contain`\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction contain( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t} else {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Scales the texture to the smallest possible size to fill the surface, leaving\n * no empty space. The method preserves the original aspect ratio of the texture.\n * Akin to CSS `object-fit: cover`.\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction cover( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t} else {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n *\n * @param {Texture} texture - The texture.\n * @return {Texture} The updated texture.\n */\nfunction fill( texture ) {\n\n\ttexture.repeat.x = 1;\n\ttexture.repeat.y = 1;\n\n\ttexture.offset.x = 0;\n\ttexture.offset.y = 0;\n\n\treturn texture;\n\n}\n\n/**\n * Determines how many bytes must be used to represent the texture.\n *\n * @param {number} width - The width of the texture.\n * @param {number} height - The height of the texture.\n * @param {number} format - The texture's format.\n * @param {number} type - The texture's type.\n * @return {number} The byte length.\n */\nfunction getByteLength( width, height, format, type ) {\n\n\tconst typeByteLength = getTextureTypeByteLength( type );\n\n\tswitch ( format ) {\n\n\t\t// https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml\n\t\tcase AlphaFormat:\n\t\t\treturn width * height;\n\t\tcase RedFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RedIntegerFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGIntegerFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBFormat:\n\t\t\treturn ( ( width * height * 3 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAIntegerFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/\n\t\tcase RGB_S3TC_DXT1_Format:\n\t\tcase RGBA_S3TC_DXT1_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_S3TC_DXT3_Format:\n\t\tcase RGBA_S3TC_DXT5_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/\n\t\tcase RGB_PVRTC_2BPPV1_Format:\n\t\tcase RGBA_PVRTC_2BPPV1_Format:\n\t\t\treturn ( Math.max( width, 16 ) * Math.max( height, 8 ) ) / 4;\n\t\tcase RGB_PVRTC_4BPPV1_Format:\n\t\tcase RGBA_PVRTC_4BPPV1_Format:\n\t\t\treturn ( Math.max( width, 8 ) * Math.max( height, 8 ) ) / 2;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/\n\t\tcase RGB_ETC1_Format:\n\t\tcase RGB_ETC2_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_ETC2_EAC_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/\n\t\tcase RGBA_ASTC_4x4_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x4_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x5_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x5_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x6_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x5_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_8x6_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x8_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x5_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_10x6_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_10x8_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x10_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x10_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x12_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 11 ) / 12 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/\n\t\tcase RGBA_BPTC_Format:\n\t\tcase RGB_BPTC_SIGNED_Format:\n\t\tcase RGB_BPTC_UNSIGNED_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_rgtc/\n\t\tcase RED_RGTC1_Format:\n\t\tcase SIGNED_RED_RGTC1_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 8;\n\t\tcase RED_GREEN_RGTC2_Format:\n\t\tcase SIGNED_RED_GREEN_RGTC2_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t}\n\n\tthrow new Error(\n\t\t`Unable to determine texture byte length for ${format} format.`,\n\t);\n\n}\n\nfunction getTextureTypeByteLength( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase UnsignedByteType:\n\t\tcase ByteType:\n\t\t\treturn { byteLength: 1, components: 1 };\n\t\tcase UnsignedShortType:\n\t\tcase ShortType:\n\t\tcase HalfFloatType:\n\t\t\treturn { byteLength: 2, components: 1 };\n\t\tcase UnsignedShort4444Type:\n\t\tcase UnsignedShort5551Type:\n\t\t\treturn { byteLength: 2, components: 4 };\n\t\tcase UnsignedIntType:\n\t\tcase IntType:\n\t\tcase FloatType:\n\t\t\treturn { byteLength: 4, components: 1 };\n\t\tcase UnsignedInt5999Type:\n\t\tcase UnsignedInt101111Type:\n\t\t\treturn { byteLength: 4, components: 3 };\n\n\t}\n\n\tthrow new Error( `Unknown texture type ${type}.` );\n\n}\n\n/**\n * A class containing utility functions for textures.\n *\n * @hideconstructor\n */\nclass TextureUtils {\n\n\t/**\n\t * Scales the texture as large as possible within its surface without cropping\n\t * or stretching the texture. The method preserves the original aspect ratio of\n\t * the texture. Akin to CSS `object-fit: contain`\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic contain( texture, aspect ) {\n\n\t\treturn contain( texture, aspect );\n\n\t}\n\n\t/**\n\t * Scales the texture to the smallest possible size to fill the surface, leaving\n\t * no empty space. The method preserves the original aspect ratio of the texture.\n\t * Akin to CSS `object-fit: cover`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic cover( texture, aspect ) {\n\n\t\treturn cover( texture, aspect );\n\n\t}\n\n\t/**\n\t * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic fill( texture ) {\n\n\t\treturn fill( texture );\n\n\t}\n\n\t/**\n\t * Determines how many bytes must be used to represent the texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} format - The texture's format.\n\t * @param {number} type - The texture's type.\n\t * @return {number} The byte length.\n\t */\n\tstatic getByteLength( width, height, format, type ) {\n\n\t\treturn getByteLength( width, height, format, type );\n\n\t}\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\n}\n\nif ( typeof window !== 'undefined' ) {\n\n\tif ( window.__THREE__ ) {\n\n\t\twarn( 'WARNING: Multiple instances of Three.js being imported.' );\n\n\t} else {\n\n\t\twindow.__THREE__ = REVISION;\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, ConstantAlphaFactor, ConstantColorFactor, Controls, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExternalTexture, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, FrustumArray, GLBufferAttribute, GLSL1, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, Path, PerspectiveCamera, Plane, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RAD2DEG, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBDepthPacking, RGBFormat, RGBIntegerFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGDepthPacking, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RenderTarget, RenderTarget3D, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, Scene, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry, Texture, TextureLoader, TextureUtils, Timer, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsUtils, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGPUCoordinateSystem, WebXRController, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, arrayNeedsUint32, cloneUniforms, createCanvasElement, createElementNS, error, getByteLength, getConsoleFunction, getUnlitUniformColorSpace, log, mergeUniforms, probeAsync, setConsoleFunction, warn, warnOnce };\n","/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nimport { Matrix3, Vector2, Color, mergeUniforms, Vector3, CubeUVReflectionMapping, Mesh, BoxGeometry, ShaderMaterial, BackSide, cloneUniforms, Euler, Matrix4, ColorManagement, SRGBTransfer, PlaneGeometry, FrontSide, getUnlitUniformColorSpace, IntType, warn, HalfFloatType, UnsignedByteType, FloatType, RGBAFormat, Plane, EquirectangularReflectionMapping, EquirectangularRefractionMapping, WebGLCubeRenderTarget, CubeReflectionMapping, CubeRefractionMapping, BufferGeometry, OrthographicCamera, PerspectiveCamera, NoToneMapping, MeshBasicMaterial, error, NoBlending, WebGLRenderTarget, BufferAttribute, LinearSRGBColorSpace, LinearFilter, warnOnce, Uint32BufferAttribute, Uint16BufferAttribute, arrayNeedsUint32, Vector4, DataArrayTexture, CubeTexture, Data3DTexture, LessEqualCompare, DepthTexture, Texture, GLSL3, PCFShadowMap, PCFSoftShadowMap, VSMShadowMap, CustomToneMapping, NeutralToneMapping, AgXToneMapping, ACESFilmicToneMapping, CineonToneMapping, ReinhardToneMapping, LinearToneMapping, LinearTransfer, AddOperation, MixOperation, MultiplyOperation, UniformsUtils, DoubleSide, NormalBlending, TangentSpaceNormalMap, ObjectSpaceNormalMap, Layers, Frustum, MeshDepthMaterial, RGBADepthPacking, MeshDistanceMaterial, NearestFilter, LessEqualDepth, ReverseSubtractEquation, SubtractEquation, AddEquation, OneMinusConstantAlphaFactor, ConstantAlphaFactor, OneMinusConstantColorFactor, ConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, DstAlphaFactor, DstColorFactor, SrcAlphaSaturateFactor, SrcAlphaFactor, SrcColorFactor, OneFactor, ZeroFactor, NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceNone, CullFaceBack, CullFaceFront, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, MinEquation, MaxEquation, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NotEqualCompare, GreaterCompare, GreaterEqualCompare, EqualCompare, LessCompare, AlwaysCompare, NeverCompare, NoColorSpace, DepthStencilFormat, getByteLength, DepthFormat, UnsignedIntType, UnsignedInt248Type, UnsignedShortType, createElementNS, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt5999Type, UnsignedInt101111Type, ByteType, ShortType, AlphaFormat, RGBFormat, RedFormat, RedIntegerFormat, RGFormat, RGIntegerFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, ExternalTexture, EventDispatcher, ArrayCamera, WebXRController, RAD2DEG, DataTexture, createCanvasElement, SRGBColorSpace, REVISION, log, WebGLCoordinateSystem, probeAsync } from './three.core.js';\nexport { AdditiveAnimationBlendMode, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxHelper, BufferGeometryLoader, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CircleGeometry, Clock, ColorKeyframeTrack, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, Controls, CubeCamera, CubeTextureLoader, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceFrontBack, Curve, CurvePath, CylinderGeometry, Cylindrical, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualStencilFunc, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, Fog, FogExp2, FramebufferTexture, FrustumArray, GLBufferAttribute, GLSL1, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NeverStencilFunc, NormalAnimationBlendMode, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, OctahedronGeometry, Path, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RGBDepthPacking, RGBIntegerFormat, RGDepthPacking, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RenderTarget, RenderTarget3D, ReplaceStencilOp, RingGeometry, Scene, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, TOUCH, TetrahedronGeometry, TextureLoader, TextureUtils, Timer, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGPUCoordinateSystem, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroSlopeEnding, ZeroStencilOp, getConsoleFunction, setConsoleFunction } from './three.core.js';\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl ) {\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\t\tconst size = array.byteLength;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( typeof Float16Array !== 'undefined' && array instanceof Float16Array ) {\n\n\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version,\n\t\t\tsize: size\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRanges = attribute.updateRanges;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\t// Not using update ranges\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.bufferSubData`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif ( range.start <= previousRange.start + previousRange.count + 1 ) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tgl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, range.start, range.count );\n\n\t\t\t}\n\n\t\t\tattribute.clearUpdateRanges();\n\n\t\t}\n\n\t\tattribute.onUploadCallback();\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tif ( data.size !== attribute.array.byteLength ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLAttributes: The size of the buffer attribute\\'s array buffer does not match the original size. Resizing buffer attributes is not supported.' );\n\n\t\t\t}\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\nvar alphahash_fragment = \"#ifdef USE_ALPHAHASH\\n\\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\\n#endif\";\n\nvar alphahash_pars_fragment = \"#ifdef USE_ALPHAHASH\\n\\tconst float ALPHA_HASH_SCALE = 0.05;\\n\\tfloat hash2D( vec2 value ) {\\n\\t\\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\\n\\t}\\n\\tfloat hash3D( vec3 value ) {\\n\\t\\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\\n\\t}\\n\\tfloat getAlphaHashThreshold( vec3 position ) {\\n\\t\\tfloat maxDeriv = max(\\n\\t\\t\\tlength( dFdx( position.xyz ) ),\\n\\t\\t\\tlength( dFdy( position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\\n\\t\\tvec2 pixScales = vec2(\\n\\t\\t\\texp2( floor( log2( pixScale ) ) ),\\n\\t\\t\\texp2( ceil( log2( pixScale ) ) )\\n\\t\\t);\\n\\t\\tvec2 alpha = vec2(\\n\\t\\t\\thash3D( floor( pixScales.x * position.xyz ) ),\\n\\t\\t\\thash3D( floor( pixScales.y * position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat lerpFactor = fract( log2( pixScale ) );\\n\\t\\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\\n\\t\\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\\n\\t\\tvec3 cases = vec3(\\n\\t\\t\\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\\n\\t\\t\\t( x - 0.5 * a ) / ( 1.0 - a ),\\n\\t\\t\\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\\n\\t\\t);\\n\\t\\tfloat threshold = ( x < ( 1.0 - a ) )\\n\\t\\t\\t? ( ( x < a ) ? cases.x : cases.y )\\n\\t\\t\\t: cases.z;\\n\\t\\treturn clamp( threshold , 1.0e-6, 1.0 );\\n\\t}\\n#endif\";\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef USE_ALPHATEST\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\tdiffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\\n\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\tif ( diffuseColor.a < alphaTest ) discard;\\n\\t#endif\\n#endif\";\n\nvar alphatest_pars_fragment = \"#ifdef USE_ALPHATEST\\n\\tuniform float alphaTest;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_CLEARCOAT ) \\n\\t\\tclearcoatSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_SHEEN ) \\n\\t\\tsheenSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar batching_pars_vertex = \"#ifdef USE_BATCHING\\n\\t#if ! defined( GL_ANGLE_multi_draw )\\n\\t#define gl_DrawID _gl_DrawID\\n\\tuniform int _gl_DrawID;\\n\\t#endif\\n\\tuniform highp sampler2D batchingTexture;\\n\\tuniform highp usampler2D batchingIdTexture;\\n\\tmat4 getBatchingMatrix( const in float i ) {\\n\\t\\tint size = textureSize( batchingTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n\\tfloat getIndirectIndex( const in int i ) {\\n\\t\\tint size = textureSize( batchingIdTexture, 0 ).x;\\n\\t\\tint x = i % size;\\n\\t\\tint y = i / size;\\n\\t\\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\\n\\t}\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tuniform sampler2D batchingColorTexture;\\n\\tvec3 getBatchingColor( const in float i ) {\\n\\t\\tint size = textureSize( batchingColorTexture, 0 ).x;\\n\\t\\tint j = int( i );\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\\n\\t}\\n#endif\";\n\nvar batching_vertex = \"#ifdef USE_BATCHING\\n\\tmat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\\n#ifdef USE_ALPHAHASH\\n\\tvPosition = vec3( position );\\n#endif\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"float G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n} // validated\";\n\nvar iridescence_fragment = \"#ifdef USE_IRIDESCENCE\\n\\tconst mat3 XYZ_TO_REC709 = mat3(\\n\\t\\t 3.2404542, -0.9692660, 0.0556434,\\n\\t\\t-1.5371385, 1.8760108, -0.2040259,\\n\\t\\t-0.4985314, 0.0415560, 1.0572252\\n\\t);\\n\\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\\n\\t\\tvec3 sqrtF0 = sqrt( fresnel0 );\\n\\t\\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\\n\\t}\\n\\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\\n\\t}\\n\\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\\n\\t}\\n\\tvec3 evalSensitivity( float OPD, vec3 shift ) {\\n\\t\\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\\n\\t\\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\\n\\t\\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\\n\\t\\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\\n\\t\\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\\n\\t\\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\\n\\t\\txyz /= 1.0685e-7;\\n\\t\\tvec3 rgb = XYZ_TO_REC709 * xyz;\\n\\t\\treturn rgb;\\n\\t}\\n\\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\\n\\t\\tvec3 I;\\n\\t\\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\\n\\t\\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\\n\\t\\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\\n\\t\\tif ( cosTheta2Sq < 0.0 ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t}\\n\\t\\tfloat cosTheta2 = sqrt( cosTheta2Sq );\\n\\t\\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\\n\\t\\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\\n\\t\\tfloat T121 = 1.0 - R12;\\n\\t\\tfloat phi12 = 0.0;\\n\\t\\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\\n\\t\\tfloat phi21 = PI - phi12;\\n\\t\\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\\t\\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\\n\\t\\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\\n\\t\\tvec3 phi23 = vec3( 0.0 );\\n\\t\\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\\n\\t\\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\\n\\t\\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\\n\\t\\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\\n\\t\\tvec3 phi = vec3( phi21 ) + phi23;\\n\\t\\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\\n\\t\\tvec3 r123 = sqrt( R123 );\\n\\t\\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\\n\\t\\tvec3 C0 = R12 + Rs;\\n\\t\\tI = C0;\\n\\t\\tvec3 Cm = Rs - T121;\\n\\t\\tfor ( int m = 1; m <= 2; ++ m ) {\\n\\t\\t\\tCm *= r123;\\n\\t\\t\\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\\n\\t\\t\\tI += Cm * Sm;\\n\\t\\t}\\n\\t\\treturn max( I, vec3( 0.0 ) );\\n\\t}\\n#endif\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vBumpMapUv );\\n\\t\\tvec2 dSTdy = dFdy( vBumpMapUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\\n\\t\\tvec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\\n\\t\\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\t\\tfloat distanceToPlane, distanceGradient;\\n\\t\\tfloat clipOpacity = 1.0;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\tif ( clipOpacity == 0.0 ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tfloat unionClipOpacity = 1.0;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\t\\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tclipOpacity *= 1.0 - unionClipOpacity;\\n\\t\\t#endif\\n\\t\\tdiffuseColor.a *= clipOpacity;\\n\\t\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tbool clipped = true;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tif ( clipped ) discard;\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tdiffuseColor *= vColor;\\n#elif defined( USE_COLOR )\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvColor = vec4( 1.0 );\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvColor = vec3( 1.0 );\\n#endif\\n#ifdef USE_COLOR\\n\\tvColor *= color;\\n#endif\\n#ifdef USE_INSTANCING_COLOR\\n\\tvColor.xyz *= instanceColor.xyz;\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\\n\\tvColor.xyz *= batchingColor.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nvec3 pow2( const in vec3 x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract( sin( sn ) * c );\\n}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\n#ifdef USE_ALPHAHASH\\n\\tvarying vec3 vPosition;\\n#endif\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n} // validated\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_minMipLevel 4.0\\n\\t#define cubeUV_minTileSize 16.0\\n\\tfloat getFace( vec3 direction ) {\\n\\t\\tvec3 absDirection = abs( direction );\\n\\t\\tfloat face = - 1.0;\\n\\t\\tif ( absDirection.x > absDirection.z ) {\\n\\t\\t\\tif ( absDirection.x > absDirection.y )\\n\\t\\t\\t\\tface = direction.x > 0.0 ? 0.0 : 3.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t} else {\\n\\t\\t\\tif ( absDirection.z > absDirection.y )\\n\\t\\t\\t\\tface = direction.z > 0.0 ? 2.0 : 5.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t}\\n\\t\\treturn face;\\n\\t}\\n\\tvec2 getUV( vec3 direction, float face ) {\\n\\t\\tvec2 uv;\\n\\t\\tif ( face == 0.0 ) {\\n\\t\\t\\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 1.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\\n\\t\\t} else if ( face == 2.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\\n\\t\\t} else if ( face == 3.0 ) {\\n\\t\\t\\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 4.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\\n\\t\\t} else {\\n\\t\\t\\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\\n\\t\\t}\\n\\t\\treturn 0.5 * ( uv + 1.0 );\\n\\t}\\n\\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\\n\\t\\tfloat face = getFace( direction );\\n\\t\\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\\n\\t\\tmipInt = max( mipInt, cubeUV_minMipLevel );\\n\\t\\tfloat faceSize = exp2( mipInt );\\n\\t\\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\\n\\t\\tif ( face > 2.0 ) {\\n\\t\\t\\tuv.y += faceSize;\\n\\t\\t\\tface -= 3.0;\\n\\t\\t}\\n\\t\\tuv.x += face * faceSize;\\n\\t\\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\\n\\t\\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\\n\\t\\tuv.x *= CUBEUV_TEXEL_WIDTH;\\n\\t\\tuv.y *= CUBEUV_TEXEL_HEIGHT;\\n\\t\\t#ifdef texture2DGradEXT\\n\\t\\t\\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( envMap, uv ).rgb;\\n\\t\\t#endif\\n\\t}\\n\\t#define cubeUV_r0 1.0\\n\\t#define cubeUV_m0 - 2.0\\n\\t#define cubeUV_r1 0.8\\n\\t#define cubeUV_m1 - 1.0\\n\\t#define cubeUV_r4 0.4\\n\\t#define cubeUV_m4 2.0\\n\\t#define cubeUV_r5 0.305\\n\\t#define cubeUV_m5 3.0\\n\\t#define cubeUV_r6 0.21\\n\\t#define cubeUV_m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= cubeUV_r1 ) {\\n\\t\\t\\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\\n\\t\\t} else if ( roughness >= cubeUV_r4 ) {\\n\\t\\t\\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\\n\\t\\t} else if ( roughness >= cubeUV_r5 ) {\\n\\t\\t\\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\\n\\t\\t} else if ( roughness >= cubeUV_r6 ) {\\n\\t\\t\\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\\n\\t\\t} else {\\n\\t\\t\\tmip = - 2.0 * log2( 1.16 * roughness );\\t\\t}\\n\\t\\treturn mip;\\n\\t}\\n\\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\\n\\t\\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\\n\\t\\tfloat mipF = fract( mip );\\n\\t\\tfloat mipInt = floor( mip );\\n\\t\\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\\n\\t\\tif ( mipF == 0.0 ) {\\n\\t\\t\\treturn vec4( color0, 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\\n\\t\\t\\treturn vec4( mix( color0, color1, mipF ), 1.0 );\\n\\t\\t}\\n\\t}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = objectTangent;\\n#endif\\n#ifdef USE_BATCHING\\n\\tmat3 bm = mat3( batchingMatrix );\\n\\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\\n\\ttransformedNormal = bm * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = bm * transformedTangent;\\n\\t#endif\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmat3 im = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\\n\\ttransformedNormal = im * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = im * transformedTangent;\\n\\t#endif\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\\n\\t\\temissiveColor = sRGBTransferEOTF( emissiveColor );\\n\\t#endif\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar colorspace_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar colorspace_pars_fragment = \"vec4 LinearTransferOETF( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 sRGBTransferEOTF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\\n}\\nvec4 sRGBTransferOETF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\";\n\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\tuniform mat3 envMapRotation;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tvFogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float vFogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float vFogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn vec3( texture2D( gradientMap, coord ).r );\\n\\t#else\\n\\t\\tvec2 fw = fwidth( coord ) * 0.5;\\n\\t\\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\\n\\t#endif\\n}\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_fragment = \"LambertMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_lambert_pars_fragment = \"varying vec3 vViewPosition;\\nstruct LambertMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Lambert\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Lambert\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\n#if defined( USE_LIGHT_PROBES )\\n\\tuniform vec3 lightProbe[ 9 ];\\n#endif\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\\n\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\treturn irradiance;\\n}\\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\tif ( cutoffDistance > 0.0 ) {\\n\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t}\\n\\treturn distanceFalloff;\\n}\\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\\n\\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\\n\\t\\tlight.color = directionalLight.color;\\n\\t\\tlight.direction = directionalLight.direction;\\n\\t\\tlight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = pointLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tlight.color = pointLight.color;\\n\\t\\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = spotLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat angleCos = dot( light.direction, spotLight.direction );\\n\\t\\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\tif ( spotAttenuation > 0.0 ) {\\n\\t\\t\\tfloat lightDistance = length( lVector );\\n\\t\\t\\tlight.color = spotLight.color * spotAttenuation;\\n\\t\\t\\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t\\t} else {\\n\\t\\t\\tlight.color = vec3( 0.0 );\\n\\t\\t\\tlight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\\n\\t\\tfloat dotNL = dot( normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tvec3 getIBLIrradiance( const in vec3 normal ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\\n\\t\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 reflectVec = reflect( - viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, pow4( roughness ) ) );\\n\\t\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\\n\\t\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\\n\\t\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\t\\tvec3 bentNormal = cross( bitangent, viewDir );\\n\\t\\t\\t\\tbentNormal = normalize( cross( bentNormal, bitangent ) );\\n\\t\\t\\t\\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\\n\\t\\t\\t\\treturn getIBLRadiance( viewDir, bentNormal, roughness );\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\\nmaterial.roughness = min( material.roughness, 1.0 );\\n#ifdef IOR\\n\\tmaterial.ior = ior;\\n\\t#ifdef USE_SPECULAR\\n\\t\\tfloat specularIntensityFactor = specularIntensity;\\n\\t\\tvec3 specularColorFactor = specularColor;\\n\\t\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\t\\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\\n\\t\\t#endif\\n\\t\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\t\\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\\n\\t\\t#endif\\n\\t\\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\\n\\t#else\\n\\t\\tfloat specularIntensityFactor = 1.0;\\n\\t\\tvec3 specularColorFactor = vec3( 1.0 );\\n\\t\\tmaterial.specularF90 = 1.0;\\n\\t#endif\\n\\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.specularF90 = 1.0;\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\tmaterial.clearcoatF0 = vec3( 0.04 );\\n\\tmaterial.clearcoatF90 = 1.0;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_DISPERSION\\n\\tmaterial.dispersion = dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tmaterial.iridescence = iridescence;\\n\\tmaterial.iridescenceIOR = iridescenceIOR;\\n\\t#ifdef USE_IRIDESCENCEMAP\\n\\t\\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\t\\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\\n\\t#else\\n\\t\\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\\n\\t#endif\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheenColor;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\\n\\t#endif\\n\\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\\n\\t\\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\\n\\t\\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\\n\\t#else\\n\\t\\tvec2 anisotropyV = anisotropyVector;\\n\\t#endif\\n\\tmaterial.anisotropy = length( anisotropyV );\\n\\tif( material.anisotropy == 0.0 ) {\\n\\t\\tanisotropyV = vec2( 1.0, 0.0 );\\n\\t} else {\\n\\t\\tanisotropyV /= material.anisotropy;\\n\\t\\tmaterial.anisotropy = saturate( material.anisotropy );\\n\\t}\\n\\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\\n\\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\\n\\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\\n#endif\";\n\nvar lights_physical_pars_fragment = \"uniform sampler2D dfgLUT;\\nstruct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat roughness;\\n\\tvec3 specularColor;\\n\\tfloat specularF90;\\n\\tfloat dispersion;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat clearcoat;\\n\\t\\tfloat clearcoatRoughness;\\n\\t\\tvec3 clearcoatF0;\\n\\t\\tfloat clearcoatF90;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tfloat iridescence;\\n\\t\\tfloat iridescenceIOR;\\n\\t\\tfloat iridescenceThickness;\\n\\t\\tvec3 iridescenceFresnel;\\n\\t\\tvec3 iridescenceF0;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tvec3 sheenColor;\\n\\t\\tfloat sheenRoughness;\\n\\t#endif\\n\\t#ifdef IOR\\n\\t\\tfloat ior;\\n\\t#endif\\n\\t#ifdef USE_TRANSMISSION\\n\\t\\tfloat transmission;\\n\\t\\tfloat transmissionAlpha;\\n\\t\\tfloat thickness;\\n\\t\\tfloat attenuationDistance;\\n\\t\\tvec3 attenuationColor;\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat anisotropy;\\n\\t\\tfloat alphaT;\\n\\t\\tvec3 anisotropyT;\\n\\t\\tvec3 anisotropyB;\\n\\t#endif\\n};\\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\\nvec3 sheenSpecularDirect = vec3( 0.0 );\\nvec3 sheenSpecularIndirect = vec3(0.0 );\\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\\n float x2 = x * x;\\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\\n}\\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\n#ifdef USE_ANISOTROPY\\n\\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\\n\\t\\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\\n\\t\\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\\n\\t\\tfloat v = 0.5 / ( gv + gl );\\n\\t\\treturn saturate(v);\\n\\t}\\n\\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\\n\\t\\tfloat a2 = alphaT * alphaB;\\n\\t\\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\\n\\t\\thighp float v2 = dot( v, v );\\n\\t\\tfloat w2 = a2 / v2;\\n\\t\\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\\n\\t}\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\\n\\t\\tvec3 f0 = material.clearcoatF0;\\n\\t\\tfloat f90 = material.clearcoatF90;\\n\\t\\tfloat roughness = material.clearcoatRoughness;\\n\\t\\tfloat alpha = pow2( roughness );\\n\\t\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\t\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\t\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\t\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\t\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\t\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t\\treturn F * ( V * D );\\n\\t}\\n#endif\\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 f0 = material.specularColor;\\n\\tfloat f90 = material.specularF90;\\n\\tfloat roughness = material.roughness;\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tF = mix( F, material.iridescenceFresnel, material.iridescence );\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat dotTL = dot( material.anisotropyT, lightDir );\\n\\t\\tfloat dotTV = dot( material.anisotropyT, viewDir );\\n\\t\\tfloat dotTH = dot( material.anisotropyT, halfDir );\\n\\t\\tfloat dotBL = dot( material.anisotropyB, lightDir );\\n\\t\\tfloat dotBV = dot( material.anisotropyB, viewDir );\\n\\t\\tfloat dotBH = dot( material.anisotropyB, halfDir );\\n\\t\\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\\n\\t\\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\\n\\t#else\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t#endif\\n\\treturn F * ( V * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie( float roughness, float dotNH ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tfloat invAlpha = 1.0 / alpha;\\n\\tfloat cos2h = dotNH * dotNH;\\n\\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\\n\\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\\n}\\nfloat V_Neubelt( float dotNV, float dotNL ) {\\n\\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\\n}\\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat D = D_Charlie( sheenRoughness, dotNH );\\n\\tfloat V = V_Neubelt( dotNV, dotNL );\\n\\treturn sheenColor * ( D * V );\\n}\\n#endif\\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat r2 = roughness * roughness;\\n\\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\\n\\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\\n\\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\\n\\treturn saturate( DG * RECIPROCAL_PI );\\n}\\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 uv = vec2( roughness, dotNV );\\n\\treturn texture2D( dfgLUT, uv ).rg;\\n}\\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\treturn specularColor * fab.x + specularF90 * fab.y;\\n}\\n#ifdef USE_IRIDESCENCE\\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#else\\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#endif\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\\n\\t#else\\n\\t\\tvec3 Fr = specularColor;\\n\\t#endif\\n\\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\\n\\tfloat Ess = fab.x + fab.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 dfgV = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNV * dotNV), 0.0, dotNV), material.roughness );\\n\\tvec2 dfgL = DFGApprox( vec3(0.0, 0.0, 1.0), vec3(sqrt(1.0 - dotNL * dotNL), 0.0, dotNL), material.roughness );\\n\\tvec3 FssEss_V = material.specularColor * dfgV.x + material.specularF90 * dfgV.y;\\n\\tvec3 FssEss_L = material.specularColor * dfgL.x + material.specularF90 * dfgL.y;\\n\\tfloat Ess_V = dfgV.x + dfgV.y;\\n\\tfloat Ess_L = dfgL.x + dfgL.y;\\n\\tfloat Ems_V = 1.0 - Ess_V;\\n\\tfloat Ems_L = 1.0 - Ess_L;\\n\\tvec3 Favg = material.specularColor + ( 1.0 - material.specularColor ) * 0.047619;\\n\\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg * Favg + EPSILON );\\n\\tfloat compensationFactor = Ems_V * Ems_L;\\n\\tvec3 multiScatter = Fms * compensationFactor;\\n\\treturn singleScatter + multiScatter;\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometryNormal;\\n\\t\\tvec3 viewDir = geometryViewDir;\\n\\t\\tvec3 position = geometryPosition;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.roughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3( 0, 1, 0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = dotNLcc * directLight.color;\\n\\t\\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\\n\\t#endif\\n\\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\\n\\t#endif\\n\\tvec3 singleScattering = vec3( 0.0 );\\n\\tvec3 multiScattering = vec3( 0.0 );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\\n\\t#else\\n\\t\\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\\n\\t#endif\\n\\tvec3 totalScattering = singleScattering + multiScattering;\\n\\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\\n\\treflectedLight.indirectSpecular += radiance * singleScattering;\\n\\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\";\n\nvar lights_fragment_begin = \"\\nvec3 geometryPosition = - vViewPosition;\\nvec3 geometryNormal = normal;\\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\nvec3 geometryClearcoatNormal = vec3( 0.0 );\\n#ifdef USE_CLEARCOAT\\n\\tgeometryClearcoatNormal = clearcoatNormal;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\\n\\tif ( material.iridescenceThickness == 0.0 ) {\\n\\t\\tmaterial.iridescence = 0.0;\\n\\t} else {\\n\\t\\tmaterial.iridescence = saturate( material.iridescence );\\n\\t}\\n\\tif ( material.iridescence > 0.0 ) {\\n\\t\\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\\n\\t\\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\\n\\t}\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointLightInfo( pointLight, geometryPosition, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tvec4 spotColor;\\n\\tvec3 spotLightCoord;\\n\\tbool inSpotLightMap;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\\n\\t\\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\\n\\t\\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\\n\\t\\t#else\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#endif\\n\\t\\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\\n\\t\\t\\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\\n\\t\\t\\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\\n\\t\\t\\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\\n\\t\\t\\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\\n\\t\\t#endif\\n\\t\\t#undef SPOT_LIGHT_MAP_INDEX\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalLightInfo( directionalLight, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#if defined( USE_LIGHT_PROBES )\\n\\t\\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearcoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getIBLIrradiance( geometryNormal );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\\n\\t#else\\n\\t\\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\\n\\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\\n\\tvFragDepth = 1.0 + gl_Position.w;\\n\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\\n\\t#endif\\n\\tdiffuseColor *= sampledDiffuseColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t#if defined( USE_POINTS_UV )\\n\\t\\tvec2 uv = vUv;\\n\\t#else\\n\\t\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tdiffuseColor *= texture2D( map, uv );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_POINTS_UV )\\n\\tvarying vec2 vUv;\\n#else\\n\\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t\\tuniform mat3 uvTransform;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphinstance_vertex = \"#ifdef USE_INSTANCING_MORPH\\n\\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\\n\\t}\\n#endif\";\n\nvar morphcolor_vertex = \"#if defined( USE_MORPHCOLORS )\\n\\tvColor *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\\n\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_INSTANCING_MORPH\\n\\t\\tuniform float morphTargetBaseInfluence;\\n\\t\\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\t#endif\\n\\tuniform sampler2DArray morphTargetsTexture;\\n\\tuniform ivec2 morphTargetsTextureSize;\\n\\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\\n\\t\\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\\n\\t\\tint y = texelIndex / morphTargetsTextureSize.x;\\n\\t\\tint x = texelIndex - y * morphTargetsTextureSize.x;\\n\\t\\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\\n\\t\\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\\n\\t}\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar normal_fragment_begin = \"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\\n#ifdef FLAT_SHADED\\n\\tvec3 fdx = dFdx( vViewPosition );\\n\\tvec3 fdy = dFdy( vViewPosition );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal *= faceDirection;\\n\\t#endif\\n#endif\\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\\n\\t\\t#if defined( USE_NORMALMAP )\\n\\t\\t\\tvNormalMapUv\\n\\t\\t#elif defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tvClearcoatNormalMapUv\\n\\t\\t#else\\n\\t\\t\\tvUv\\n\\t\\t#endif\\n\\t\\t);\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn[0] *= faceDirection;\\n\\t\\ttbn[1] *= faceDirection;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn2[0] *= faceDirection;\\n\\t\\ttbn2[1] *= faceDirection;\\n\\t#endif\\n#endif\\nvec3 nonPerturbedNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\tnormal = normalize( tbn * mapN );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\\n#endif\";\n\nvar normal_pars_fragment = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_pars_vertex = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_vertex = \"#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\\n\\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( uv.st );\\n\\t\\tvec2 st1 = dFdy( uv.st );\\n\\t\\tvec3 N = surf_norm;\\n\\t\\tvec3 q1perp = cross( q1, N );\\n\\t\\tvec3 q0perp = cross( N, q0 );\\n\\t\\tvec3 T = q1perp * st0.x + q0perp * st1.x;\\n\\t\\tvec3 B = q1perp * st0.y + q0perp * st1.y;\\n\\t\\tfloat det = max( dot( T, T ), dot( B, B ) );\\n\\t\\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\\n\\t\\treturn mat3( T * scale, B * scale, N );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = nonPerturbedNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\";\n\nvar iridescence_pars_fragment = \"#ifdef USE_IRIDESCENCEMAP\\n\\tuniform sampler2D iridescenceMap;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform sampler2D iridescenceThicknessMap;\\n#endif\";\n\nvar opaque_fragment = \"#ifdef OPAQUE\\ndiffuseColor.a = 1.0;\\n#endif\\n#ifdef USE_TRANSMISSION\\ndiffuseColor.a *= material.transmissionAlpha;\\n#endif\\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\\nconst float Inv255 = 1. / 255.;\\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec4( 0., 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec4( 1., 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat af = modf( v * PackFactors.a, vuf );\\n\\tfloat bf = modf( vuf * ShiftRight8, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\\n}\\nvec3 packDepthToRGB( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec3( 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec3( 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat bf = modf( v * PackFactors.b, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\\n}\\nvec2 packDepthToRG( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec2( 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec2( 1., 1. );\\n\\tfloat vuf;\\n\\tfloat gf = modf( v * 256., vuf );\\n\\treturn vec2( vuf * Inv255, gf );\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors4 );\\n}\\nfloat unpackRGBToDepth( const in vec3 v ) {\\n\\treturn dot( v, UnpackFactors3 );\\n}\\nfloat unpackRGToDepth( const in vec2 v ) {\\n\\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\\n}\\nvec4 pack2HalfToRGBA( const in vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\\n}\\nvec2 unpackRGBATo2Half( const in vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn depth * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * depth - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_BATCHING\\n\\tmvPosition = batchingMatrix * mvPosition;\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef DITHERING\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#if NUM_SPOT_LIGHT_MAPS > 0\\n\\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\tfloat depth = unpackRGBAToDepth( texture2D( depths, uv ) );\\n\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\treturn step( depth, compare );\\n\\t\\t#else\\n\\t\\t\\treturn step( compare, depth );\\n\\t\\t#endif\\n\\t}\\n\\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\\n\\t\\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\\n\\t}\\n\\tfloat VSMShadow( sampler2D shadow, vec2 uv, float compare ) {\\n\\t\\tfloat occlusion = 1.0;\\n\\t\\tvec2 distribution = texture2DDistribution( shadow, uv );\\n\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\tfloat hard_shadow = step( distribution.x, compare );\\n\\t\\t#else\\n\\t\\t\\tfloat hard_shadow = step( compare, distribution.x );\\n\\t\\t#endif\\n\\t\\tif ( hard_shadow != 1.0 ) {\\n\\t\\t\\tfloat distance = compare - distribution.x;\\n\\t\\t\\tfloat variance = max( 0.00000, distribution.y * distribution.y );\\n\\t\\t\\tfloat softness_probability = variance / (variance + distance * distance );\\t\\t\\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\\t\\t\\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\\n\\t\\t}\\n\\t\\treturn occlusion;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx = texelSize.x;\\n\\t\\t\\tfloat dy = texelSize.y;\\n\\t\\t\\tvec2 uv = shadowCoord.xy;\\n\\t\\t\\tvec2 f = fract( uv * shadowMapSize + 0.5 );\\n\\t\\t\\tuv -= f * texelSize;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t f.y )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\t\\n\\t\\tfloat lightToPositionLength = length( lightToPosition );\\n\\t\\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\\n\\t\\t\\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\t\\tdp += shadowBias;\\n\\t\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\t\\tshadow = (\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\\n\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\tvec4 shadowWorldPosition;\\n#endif\\n#if defined( USE_SHADOWMAP )\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if NUM_SPOT_LIGHT_COORDS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition;\\n\\t\\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t\\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\\n\\t\\t#endif\\n\\t\\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\tuniform highp sampler2D boneTexture;\\n\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\tint size = textureSize( boneTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn saturate( toneMappingExposure * color );\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 CineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3( 1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108, 1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605, 1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\\n\\tvec3( 1.6605, - 0.1246, - 0.0182 ),\\n\\tvec3( - 0.5876, 1.1329, - 0.1006 ),\\n\\tvec3( - 0.0728, - 0.0083, 1.1187 )\\n);\\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\\n\\tvec3( 0.6274, 0.0691, 0.0164 ),\\n\\tvec3( 0.3293, 0.9195, 0.0880 ),\\n\\tvec3( 0.0433, 0.0113, 0.8956 )\\n);\\nvec3 agxDefaultContrastApprox( vec3 x ) {\\n\\tvec3 x2 = x * x;\\n\\tvec3 x4 = x2 * x2;\\n\\treturn + 15.5 * x4 * x2\\n\\t\\t- 40.14 * x4 * x\\n\\t\\t+ 31.96 * x4\\n\\t\\t- 6.868 * x2 * x\\n\\t\\t+ 0.4298 * x2\\n\\t\\t+ 0.1191 * x\\n\\t\\t- 0.00232;\\n}\\nvec3 AgXToneMapping( vec3 color ) {\\n\\tconst mat3 AgXInsetMatrix = mat3(\\n\\t\\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\\n\\t\\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\\n\\t\\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\\n\\t);\\n\\tconst mat3 AgXOutsetMatrix = mat3(\\n\\t\\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\\n\\t\\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\\n\\t\\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\\n\\t);\\n\\tconst float AgxMinEv = - 12.47393;\\tconst float AgxMaxEv = 4.026069;\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\\n\\tcolor = AgXInsetMatrix * color;\\n\\tcolor = max( color, 1e-10 );\\tcolor = log2( color );\\n\\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\tcolor = agxDefaultContrastApprox( color );\\n\\tcolor = AgXOutsetMatrix * color;\\n\\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\\n\\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\treturn color;\\n}\\nvec3 NeutralToneMapping( vec3 color ) {\\n\\tconst float StartCompression = 0.8 - 0.04;\\n\\tconst float Desaturation = 0.15;\\n\\tcolor *= toneMappingExposure;\\n\\tfloat x = min( color.r, min( color.g, color.b ) );\\n\\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\\n\\tcolor -= offset;\\n\\tfloat peak = max( color.r, max( color.g, color.b ) );\\n\\tif ( peak < StartCompression ) return color;\\n\\tfloat d = 1. - StartCompression;\\n\\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\\n\\tcolor *= newPeak / peak;\\n\\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\\n\\treturn mix( color, vec3( newPeak ), g );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmission_fragment = \"#ifdef USE_TRANSMISSION\\n\\tmaterial.transmission = transmission;\\n\\tmaterial.transmissionAlpha = 1.0;\\n\\tmaterial.thickness = thickness;\\n\\tmaterial.attenuationDistance = attenuationDistance;\\n\\tmaterial.attenuationColor = attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\\n\\t#endif\\n\\tvec3 pos = vWorldPosition;\\n\\tvec3 v = normalize( cameraPosition - pos );\\n\\tvec3 n = inverseTransformDirection( normal, viewMatrix );\\n\\tvec4 transmitted = getIBLVolumeRefraction(\\n\\t\\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\\n\\t\\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\\n\\t\\tmaterial.attenuationColor, material.attenuationDistance );\\n\\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\\n\\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\\n#endif\";\n\nvar transmission_pars_fragment = \"#ifdef USE_TRANSMISSION\\n\\tuniform float transmission;\\n\\tuniform float thickness;\\n\\tuniform float attenuationDistance;\\n\\tuniform vec3 attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tuniform sampler2D transmissionMap;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tuniform sampler2D thicknessMap;\\n\\t#endif\\n\\tuniform vec2 transmissionSamplerSize;\\n\\tuniform sampler2D transmissionSamplerMap;\\n\\tuniform mat4 modelMatrix;\\n\\tuniform mat4 projectionMatrix;\\n\\tvarying vec3 vWorldPosition;\\n\\tfloat w0( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w1( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\\n\\t}\\n\\tfloat w2( float a ){\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w3( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * a );\\n\\t}\\n\\tfloat g0( float a ) {\\n\\t\\treturn w0( a ) + w1( a );\\n\\t}\\n\\tfloat g1( float a ) {\\n\\t\\treturn w2( a ) + w3( a );\\n\\t}\\n\\tfloat h0( float a ) {\\n\\t\\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\\n\\t}\\n\\tfloat h1( float a ) {\\n\\t\\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\\n\\t}\\n\\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\\n\\t\\tuv = uv * texelSize.zw + 0.5;\\n\\t\\tvec2 iuv = floor( uv );\\n\\t\\tvec2 fuv = fract( uv );\\n\\t\\tfloat g0x = g0( fuv.x );\\n\\t\\tfloat g1x = g1( fuv.x );\\n\\t\\tfloat h0x = h0( fuv.x );\\n\\t\\tfloat h1x = h1( fuv.x );\\n\\t\\tfloat h0y = h0( fuv.y );\\n\\t\\tfloat h1y = h1( fuv.y );\\n\\t\\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\\n\\t\\t\\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\\n\\t}\\n\\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\\n\\t\\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\\n\\t\\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\\n\\t\\tvec2 fLodSizeInv = 1.0 / fLodSize;\\n\\t\\tvec2 cLodSizeInv = 1.0 / cLodSize;\\n\\t\\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\\n\\t\\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\\n\\t\\treturn mix( fSample, cSample, fract( lod ) );\\n\\t}\\n\\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\\n\\t\\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\\n\\t\\tvec3 modelScale;\\n\\t\\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\\n\\t\\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\\n\\t\\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\\n\\t\\treturn normalize( refractionVector ) * thickness * modelScale;\\n\\t}\\n\\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\\n\\t\\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\\n\\t}\\n\\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\\n\\t\\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\\n\\t\\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\\n\\t}\\n\\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tif ( isinf( attenuationDistance ) ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\\n\\t\\t\\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\\t\\t\\treturn transmittance;\\n\\t\\t}\\n\\t}\\n\\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\\n\\t\\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\\n\\t\\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\\n\\t\\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tvec4 transmittedLight;\\n\\t\\tvec3 transmittance;\\n\\t\\t#ifdef USE_DISPERSION\\n\\t\\t\\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\\n\\t\\t\\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\\n\\t\\t\\tfor ( int i = 0; i < 3; i ++ ) {\\n\\t\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\\n\\t\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\t\\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\\n\\t\\t\\t\\ttransmittedLight[ i ] = transmissionSample[ i ];\\n\\t\\t\\t\\ttransmittedLight.a += transmissionSample.a;\\n\\t\\t\\t\\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\\n\\t\\t\\t}\\n\\t\\t\\ttransmittedLight.a /= 3.0;\\n\\t\\t#else\\n\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\\n\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\\n\\t\\t\\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\\n\\t\\t#endif\\n\\t\\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\\n\\t\\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\\n\\t\\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\\n\\t\\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\\n\\t}\\n#endif\";\n\nvar uv_pars_fragment = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform mat3 mapTransform;\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform mat3 alphaMapTransform;\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tuniform mat3 lightMapTransform;\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tuniform mat3 aoMapTransform;\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tuniform mat3 bumpMapTransform;\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tuniform mat3 normalMapTransform;\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tuniform mat3 displacementMapTransform;\\n\\tvarying vec2 vDisplacementMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tuniform mat3 emissiveMapTransform;\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tuniform mat3 metalnessMapTransform;\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tuniform mat3 roughnessMapTransform;\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tuniform mat3 anisotropyMapTransform;\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tuniform mat3 clearcoatMapTransform;\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform mat3 clearcoatNormalMapTransform;\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform mat3 clearcoatRoughnessMapTransform;\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tuniform mat3 sheenColorMapTransform;\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tuniform mat3 sheenRoughnessMapTransform;\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tuniform mat3 iridescenceMapTransform;\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform mat3 iridescenceThicknessMapTransform;\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tuniform mat3 specularMapTransform;\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tuniform mat3 specularColorMapTransform;\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tuniform mat3 specularIntensityMapTransform;\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvUv = vec3( uv, 1 ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_BATCHING\\n\\t\\tworldPosition = batchingMatrix * worldPosition;\\n\\t#endif\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nconst vertex$h = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nconst fragment$h = \"uniform sampler2D t2D;\\nuniform float backgroundIntensity;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tvec4 texColor = texture2D( t2D, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$g = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$g = \"#ifdef ENVMAP_TYPE_CUBE\\n\\tuniform samplerCube envMap;\\n#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\tuniform sampler2D envMap;\\n#endif\\nuniform float flipEnvMap;\\nuniform float backgroundBlurriness;\\nuniform float backgroundIntensity;\\nuniform mat3 backgroundRotation;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\\n\\t#else\\n\\t\\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$f = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$f = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\nvoid main() {\\n\\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\\n\\tgl_FragColor = texColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$e = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nconst fragment$e = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\tfloat fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\\n\\t#else\\n\\t\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\\n\\t#endif\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#elif DEPTH_PACKING == 3202\\n\\t\\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\\n\\t#elif DEPTH_PACKING == 3203\\n\\t\\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\\n\\t#endif\\n}\";\n\nconst vertex$d = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nconst fragment$d = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main () {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nconst vertex$c = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$c = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$b = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$b = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$a = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$a = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$9 = \"#define LAMBERT\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$9 = \"#define LAMBERT\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$8 = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nconst fragment$8 = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$7 = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$7 = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), diffuseColor.a );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\";\n\nconst vertex$6 = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$6 = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$5 = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifdef USE_TRANSMISSION\\n\\tvarying vec3 vWorldPosition;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n#ifdef USE_TRANSMISSION\\n\\tvWorldPosition = worldPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$5 = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define IOR\\n\\t#define USE_SPECULAR\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef IOR\\n\\tuniform float ior;\\n#endif\\n#ifdef USE_SPECULAR\\n\\tuniform float specularIntensity;\\n\\tuniform vec3 specularColor;\\n\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\tuniform sampler2D specularColorMap;\\n\\t#endif\\n\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\tuniform sampler2D specularIntensityMap;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_DISPERSION\\n\\tuniform float dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tuniform float iridescence;\\n\\tuniform float iridescenceIOR;\\n\\tuniform float iridescenceThicknessMinimum;\\n\\tuniform float iridescenceThicknessMaximum;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheenColor;\\n\\tuniform float sheenRoughness;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tuniform sampler2D sheenColorMap;\\n\\t#endif\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tuniform sampler2D sheenRoughnessMap;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\tuniform vec2 anisotropyVector;\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tuniform sampler2D anisotropyMap;\\n\\t#endif\\n#endif\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\t#include \\n\\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\t\\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecularDirect + sheenSpecularIndirect;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\\n\\t\\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\t\\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$4 = \"#define TOON\\nvarying vec3 vViewPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$4 = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$3 = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#ifdef USE_POINTS_UV\\n\\tvarying vec2 vUv;\\n\\tuniform mat3 uvTransform;\\n#endif\\nvoid main() {\\n\\t#ifdef USE_POINTS_UV\\n\\t\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$3 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$2 = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$2 = \"uniform vec3 color;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst vertex$1 = \"uniform float rotation;\\nuniform vec2 center;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 mvPosition = modelViewMatrix[ 3 ];\\n\\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst fragment$1 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst ShaderChunk = {\n\talphahash_fragment: alphahash_fragment,\n\talphahash_pars_fragment: alphahash_pars_fragment,\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbatching_pars_vertex: batching_pars_vertex,\n\tbatching_vertex: batching_vertex,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tiridescence_fragment: iridescence_fragment,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tcolorspace_fragment: colorspace_fragment,\n\tcolorspace_pars_fragment: colorspace_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_fragment: lights_lambert_fragment,\n\tlights_lambert_pars_fragment: lights_lambert_pars_fragment,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphinstance_vertex: morphinstance_vertex,\n\tmorphcolor_vertex: morphcolor_vertex,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\tiridescence_pars_fragment: iridescence_pars_fragment,\n\topaque_fragment: opaque_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: vertex$h,\n\tbackground_frag: fragment$h,\n\tbackgroundCube_vert: vertex$g,\n\tbackgroundCube_frag: fragment$g,\n\tcube_vert: vertex$f,\n\tcube_frag: fragment$f,\n\tdepth_vert: vertex$e,\n\tdepth_frag: fragment$e,\n\tdistanceRGBA_vert: vertex$d,\n\tdistanceRGBA_frag: fragment$d,\n\tequirect_vert: vertex$c,\n\tequirect_frag: fragment$c,\n\tlinedashed_vert: vertex$b,\n\tlinedashed_frag: fragment$b,\n\tmeshbasic_vert: vertex$a,\n\tmeshbasic_frag: fragment$a,\n\tmeshlambert_vert: vertex$9,\n\tmeshlambert_frag: fragment$9,\n\tmeshmatcap_vert: vertex$8,\n\tmeshmatcap_frag: fragment$8,\n\tmeshnormal_vert: vertex$7,\n\tmeshnormal_frag: fragment$7,\n\tmeshphong_vert: vertex$6,\n\tmeshphong_frag: fragment$6,\n\tmeshphysical_vert: vertex$5,\n\tmeshphysical_frag: fragment$5,\n\tmeshtoon_vert: vertex$4,\n\tmeshtoon_frag: fragment$4,\n\tpoints_vert: vertex$3,\n\tpoints_frag: fragment$3,\n\tshadow_vert: vertex$2,\n\tshadow_frag: fragment$2,\n\tsprite_vert: vertex$1,\n\tsprite_frag: fragment$1\n};\n\n// Uniforms library for shared webgl shaders\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\t\tspecularMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tenvMapRotation: { value: /*@__PURE__*/ new Matrix3() },\n\t\tflipEnvMap: { value: -1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // physical\n\t\trefractionRatio: { value: 0.98 }, // basic, lambert, phong\n\t\tdfgLUT: { value: null } // DFG LUT for physically-based rendering\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 },\n\t\taoMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 },\n\t\tlightMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tnormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null },\n\t\temissiveMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null },\n\t\tmetalnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null },\n\t\troughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: /*@__PURE__*/ new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotLightMap: { value: [] },\n\t\tspotShadowMap: { value: [] },\n\t\tspotLightMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: /*@__PURE__*/ new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t\tbackgroundIntensity: { value: 1 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\n\tbackgroundCube: {\n\n\t\tuniforms: {\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: -1 },\n\t\t\tbackgroundBlurriness: { value: 0 },\n\t\t\tbackgroundIntensity: { value: 1 },\n\t\t\tbackgroundRotation: { value: /*@__PURE__*/ new Matrix3() }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.backgroundCube_vert,\n\t\tfragmentShader: ShaderChunk.backgroundCube_frag\n\n\t},\n\n\tcube: {\n\n\t\tuniforms: {\n\t\t\ttCube: { value: null },\n\t\t\ttFlip: { value: -1 },\n\t\t\topacity: { value: 1.0 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: /*@__PURE__*/ new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: /*@__PURE__*/ new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tclearcoatNormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tdispersion: { value: 0 },\n\t\t\tiridescence: { value: 0 },\n\t\t\tiridescenceMap: { value: null },\n\t\t\tiridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tiridescenceIOR: { value: 1.3 },\n\t\t\tiridescenceThicknessMinimum: { value: 100 },\n\t\t\tiridescenceThicknessMaximum: { value: 400 },\n\t\t\tiridescenceThicknessMap: { value: null },\n\t\t\tiridescenceThicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\tsheenRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tthicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tspecularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t\tspecularColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularIntensityMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tanisotropyVector: { value: /*@__PURE__*/ new Vector2() },\n\t\t\tanisotropyMap: { value: null },\n\t\t\tanisotropyMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nconst _rgb = { r: 0, b: 0, g: 0 };\nconst _e1$1 = /*@__PURE__*/ new Euler();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction getBackground( scene ) {\n\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tconst usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background\n\t\t\tbackground = ( usePMREM ? cubeuvmaps : cubemaps ).get( background );\n\n\t\t}\n\n\t\treturn background;\n\n\t}\n\n\tfunction render( scene ) {\n\n\t\tlet forceClear = false;\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tconst environmentBlendMode = renderer.xr.getEnvironmentBlendMode();\n\n\t\tif ( environmentBlendMode === 'additive' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 1, premultipliedAlpha );\n\n\t\t} else if ( environmentBlendMode === 'alpha-blend' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 0, premultipliedAlpha );\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\t// buffers might not be writable which is required to ensure a correct clear\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t}\n\n\tfunction addToRenderList( renderList, scene ) {\n\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.backgroundCube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.backgroundCube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// add \"envMap\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\t_e1$1.copy( scene.backgroundRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1$1.x *= -1; _e1$1.y *= -1; _e1$1.z *= -1;\n\n\t\t\tif ( background.isCubeTexture && background.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1$1.y *= -1;\n\t\t\t\t_e1$1.z *= -1;\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? -1 : 1;\n\t\t\tboxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness;\n\t\t\tboxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tboxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4( _m1$1.makeRotationFromEuler( _e1$1 ) );\n\t\t\tboxMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tboxMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// add \"map\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\t\t\tplaneMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tplaneMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tplaneMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tcolor.getRGB( _rgb, getUnlitUniformColorSpace( renderer ) );\n\n\t\tstate.buffers.color.setClear( _rgb.r, _rgb.g, _rgb.b, alpha, premultipliedAlpha );\n\n\t}\n\n\tfunction dispose() {\n\n\t\tif ( boxMesh !== undefined ) {\n\n\t\t\tboxMesh.geometry.dispose();\n\t\t\tboxMesh.material.dispose();\n\n\t\t\tboxMesh = undefined;\n\n\t\t}\n\n\t\tif ( planeMesh !== undefined ) {\n\n\t\t\tplaneMesh.geometry.dispose();\n\t\t\tplaneMesh.material.dispose();\n\n\t\t\tplaneMesh = undefined;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render,\n\t\taddToRenderList: addToRenderList,\n\t\tdispose: dispose\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, attributes ) {\n\n\tconst maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\tlet forceUpdate = false;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tconst state = getBindingState( geometry, program, material );\n\n\t\tif ( currentState !== state ) {\n\n\t\t\tcurrentState = state;\n\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t}\n\n\t\tupdateBuffers = needsUpdate( object, geometry, program, index );\n\n\t\tif ( updateBuffers ) saveCache( object, geometry, program, index );\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tif ( updateBuffers || forceUpdate ) {\n\n\t\t\tforceUpdate = false;\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\treturn gl.createVertexArray();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\treturn gl.bindVertexArray( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\treturn gl.deleteVertexArray( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( object, geometry, program, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tconst cachedAttribute = cachedAttributes[ name ];\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\t\tif ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( object, geometry, program, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet attribute = attributes[ name ];\n\n\t\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tconst data = {};\n\t\t\t\tdata.attribute = attribute;\n\n\t\t\t\tif ( attribute && attribute.data ) {\n\n\t\t\t\t\tdata.data = attribute.data;\n\n\t\t\t\t}\n\n\t\t\t\tcache[ name ] = data;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tgl.vertexAttribDivisor( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset, integer ) {\n\n\t\tif ( integer === true ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\t// check for integer attributes\n\n\t\t\t\t\tconst integer = ( type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType );\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\t\tforceUpdate = true;\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatibility\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawArraysInstanced( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ], counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters, utils ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction textureFormatReadable( textureFormat ) {\n\n\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction textureTypeReadable( textureType ) {\n\n\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );\n\n\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\ttextureType !== FloatType && ! halfFloatSupportedByExt ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\twarn( 'WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\tconst reversedDepthBuffer = parameters.reversedDepthBuffer === true && extensions.has( 'EXT_clip_control' );\n\n\tconst maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tconst maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tconst maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tconst maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tconst maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tconst maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tconst maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tconst maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\n\tconst maxSamples = gl.getParameter( gl.MAX_SAMPLES );\n\n\treturn {\n\n\t\tisWebGL2: true, // keeping this for backwards compatibility\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\ttextureFormatReadable: textureFormatReadable,\n\t\ttextureTypeReadable: textureTypeReadable,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\treversedDepthBuffer: reversedDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\n\t};\n\n\tthis.setGlobalState = function ( planes, camera ) {\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips.\n// Used for scene blur in fromScene() method.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\n// Used for scene blur in fromScene() method.\nconst MAX_SAMPLES = 20;\n\n// GGX VNDF importance sampling configuration\nconst GGX_SAMPLES = 256;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\nlet _oldActiveCubeFace = 0;\nlet _oldActiveMipmapLevel = 0;\nlet _oldXrEnabled = false;\n\nconst _origin = /*@__PURE__*/ new Vector3();\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * The prefiltering uses GGX VNDF (Visible Normal Distribution Function)\n * importance sampling based on \"Sampling the GGX Distribution of Visible Normals\"\n * (Heitz, 2018) to generate environment maps that accurately match the GGX BRDF\n * used in material rendering for physically-based image-based lighting.\n */\nclass PMREMGenerator {\n\n\t/**\n\t * Constructs a new PMREM generator.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t */\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\t\tthis._lodMeshes = [];\n\n\t\tthis._backgroundBox = null;\n\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\n\t\tthis._blurMaterial = null;\n\t\tthis._ggxMaterial = null;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety.\n\t *\n\t * @param {Scene} scene - The scene to be captured.\n\t * @param {number} [sigma=0] - The blur radius in radians.\n\t * @param {number} [near=0.1] - The near plane distance.\n\t * @param {number} [far=100] - The far plane distance.\n\t * @param {Object} [options={}] - The configuration options.\n\t * @param {number} [options.size=256] - The texture size of the PMREM.\n\t * @param {Vector3} [options.renderTarget=origin] - The position of the internal cube camera that renders the scene.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100, options = {} ) {\n\n\t\tconst {\n\t\t\tsize = 256,\n\t\t\tposition = _origin,\n\t\t} = options;\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tthis._setSize( size );\n\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} equirectangular - The equirectangular texture to be converted.\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} cubemap - The cubemap texture to be converted.\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tthis._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tthis._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\n\t\tif ( this._backgroundBox !== null ) {\n\n\t\t\tthis._backgroundBox.geometry.dispose();\n\t\t\tthis._backgroundBox.material.dispose();\n\n\t\t}\n\n\t}\n\n\t// private interface\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\t\tif ( this._ggxMaterial !== null ) this._ggxMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodMeshes.length; i ++ ) {\n\n\t\t\tthis._lodMeshes[ i ].geometry.dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel );\n\t\tthis._renderer.xr.enabled = _oldXrEnabled;\n\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets();\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height, params );\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( width, height, params );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, width, height );\n\t\t\tthis._ggxMaterial = _getGGXShader( _lodMax, width, height );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst mesh = new Mesh( new BufferGeometry(), material );\n\t\tthis._renderer.compile( mesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, -1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, -1, -1, -1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\t// https://github.com/mrdoob/three.js/issues/31413#issuecomment-3095966812\n\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tif ( reversedDepthBuffer ) {\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\t\trenderer.clearDepth();\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t}\n\n\t\tif ( this._backgroundBox === null ) {\n\n\t\t\tthis._backgroundBox = new Mesh(\n\t\t\t\tnew BoxGeometry(),\n\t\t\t\tnew MeshBasicMaterial( {\n\t\t\t\t\tname: 'PMREM.Background',\n\t\t\t\t\tside: BackSide,\n\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\tdepthTest: false,\n\t\t\t\t} )\n\t\t\t);\n\n\t\t}\n\n\t\tconst backgroundBox = this._backgroundBox;\n\t\tconst backgroundMaterial = backgroundBox.material;\n\n\t\tlet useSolidColor = false;\n\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x + forwardSign[ i ], position.y, position.z );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y + forwardSign[ i ], position.z );\n\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y, position.z + forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\n\t\t\t}\n\n\t\t\tthis._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\n\t\tconst mesh = this._lodMeshes[ 0 ];\n\t\tmesh.material = material;\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tconst n = this._lodMeshes.length;\n\n\t\t// Use GGX VNDF importance sampling\n\t\tfor ( let i = 1; i < n; i ++ ) {\n\n\t\t\tthis._applyGGXFilter( cubeUVRenderTarget, i - 1, i );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * Applies GGX VNDF importance sampling filter to generate a prefiltered environment map.\n\t * Uses Monte Carlo integration with VNDF importance sampling to accurately represent the\n\t * GGX BRDF for physically-based rendering. Reads from the previous LOD level and\n\t * applies incremental roughness filtering to avoid over-blurring.\n\t *\n\t * @private\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn - Source LOD level to read from\n\t * @param {number} lodOut - Target LOD level to write to\n\t */\n\t_applyGGXFilter( cubeUVRenderTarget, lodIn, lodOut ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tconst ggxMaterial = this._ggxMaterial;\n\t\tconst ggxMesh = this._lodMeshes[ lodOut ];\n\t\tggxMesh.material = ggxMaterial;\n\n\t\tconst ggxUniforms = ggxMaterial.uniforms;\n\n\t\t// Calculate incremental roughness between LOD levels\n\t\tconst targetRoughness = lodOut / ( this._lodMeshes.length - 1 );\n\t\tconst sourceRoughness = lodIn / ( this._lodMeshes.length - 1 );\n\t\tconst incrementalRoughness = Math.sqrt( targetRoughness * targetRoughness - sourceRoughness * sourceRoughness );\n\n\t\t// Apply blur strength mapping for better quality across the roughness range\n\t\tconst blurStrength = 0.05 + targetRoughness * 0.95;\n\t\tconst adjustedRoughness = incrementalRoughness * blurStrength;\n\n\t\t// Calculate viewport position based on output LOD level\n\t\tconst { _lodMax } = this;\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t// Read from previous LOD with incremental roughness\n\t\tggxUniforms[ 'envMap' ].value = cubeUVRenderTarget.texture;\n\t\tggxUniforms[ 'roughness' ].value = adjustedRoughness;\n\t\tggxUniforms[ 'mipInt' ].value = _lodMax - lodIn; // Sample from input LOD\n\n\t\t_setViewport( pingPongRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( pingPongRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t\t// Copy from pingPong back to cubeUV (simple direct copy)\n\t\tggxUniforms[ 'envMap' ].value = pingPongRenderTarget.texture;\n\t\tggxUniforms[ 'roughness' ].value = 0.0; // Direct copy\n\t\tggxUniforms[ 'mipInt' ].value = _lodMax - lodOut; // Read from the level we just wrote\n\n\t\t_setViewport( cubeUVRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t *\n\t * Used for initial scene blur in fromScene() method when sigma > 0.\n\t *\n\t * @private\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn\n\t * @param {number} lodOut\n\t * @param {number} sigma\n\t * @param {Vector3} [poleAxis]\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\terror(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = this._lodMeshes[ lodOut ];\n\t\tblurMesh.material = blurMaterial;\n\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\twarn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\n\n\nfunction _createPlanes( lodMax ) {\n\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\tconst lodMeshes = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : -1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodMeshes.push( new Mesh( planes, null ) );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodMeshes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height, params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getGGXShader( lodMax, width, height ) {\n\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'PMREMGGXConvolution',\n\n\t\tdefines: {\n\t\t\t'GGX_SAMPLES': GGX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'roughness': { value: 0.0 },\n\t\t\t'mipInt': { value: 0 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// \"Sampling the GGX Distribution of Visible Normals\"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 3.2: Transform view direction to hemisphere configuration\n\t\t\t\tvec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z));\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tfloat lensq = Vh.x * Vh.x + Vh.y * Vh.y;\n\t\t\t\tvec3 T1 = lensq > 0.0 ? vec3(-Vh.y, Vh.x, 0.0) / sqrt(lensq) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(Vh, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + Vh.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * Vh;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = new Float32Array( MAX_SAMPLES );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: {\n\t\t\t'n': MAX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCubemapMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: -1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\tconst currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0;\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) {\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( renderTarget !== undefined ) {\n\n\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tconst extension = gl.getExtension( name );\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function () {\n\n\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\t\t\tgetExtension( 'WEBGL_clip_cull_distance' );\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\t\t\tgetExtension( 'WEBGL_render_shared_exponent' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\twarnOnce( 'WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else if ( geometryPosition !== undefined ) {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawElementsInstanced( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawElementsWEBGL( mode, counts, 0, type, starts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ] / bytesPerElement, counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawElementsInstancedWEBGL( mode, counts, 0, type, starts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase gl.TRIANGLES:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINES:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_STRIP:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_LOOP:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase gl.POINTS:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\terror( 'WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector4();\n\n\tfunction update( object, geometry, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\t// the following encodes morph targets into an array of data textures. Each layer represents a single morph target.\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet entry = morphTextures.get( geometry );\n\n\t\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\t\t\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\t\tlet vertexDataCount = 0;\n\n\t\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\t\tlet height = 1;\n\n\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t}\n\n\t\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\t\tconst texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\t\ttexture.type = FloatType;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\t// fill buffer\n\n\t\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 8 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 9 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 10 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tentry = {\n\t\t\t\tcount: morphTargetsCount,\n\t\t\t\ttexture: texture,\n\t\t\t\tsize: new Vector2( width, height )\n\t\t\t};\n\n\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\tfunction disposeTexture() {\n\n\t\t\t\ttexture.dispose();\n\n\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t}\n\n\t\t//\n\t\tif ( object.isInstancedMesh === true && object.morphTexture !== null ) {\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTexture', object.morphTexture, textures );\n\n\t\t} else {\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t}\n\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tif ( updateMap.get( object ) !== frame ) {\n\n\t\t\t\tattributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );\n\n\t\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\t\tattributes.update( object.instanceColor, gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t\tupdateMap.set( object, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( updateMap.get( skeleton ) !== frame ) {\n\n\t\t\t\tskeleton.update();\n\n\t\t\t\tupdateMap.set( skeleton, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\n\nconst emptyTexture = /*@__PURE__*/ new Texture();\n\nconst emptyShadowTexture = /*@__PURE__*/ new DepthTexture( 1, 1 );\n\nconst emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture();\nconst empty3dTexture = /*@__PURE__*/ new Data3DTexture();\nconst emptyCubeTexture = /*@__PURE__*/ new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array or THREE.VectorN)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2i( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3i( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4i( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array or THREE.VectorN)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2ui( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3ui( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4ui( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\tlet emptyTexture2D;\n\n\tif ( this.type === gl.SAMPLER_2D_SHADOW ) {\n\n\t\temptyShadowTexture.compareFunction = LessEqualCompare; // #28670\n\t\temptyTexture2D = emptyShadowTexture;\n\n\t} else {\n\n\t\temptyTexture2D = emptyTexture;\n\n\t}\n\n\ttextures.setTexture2D( v || emptyTexture2D, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || empty3dTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyArrayTexture, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nclass SingleUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass PureArrayUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass StructuredUniform {\n\n\tconstructor( id ) {\n\n\t\tthis.id = id;\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\tsetValue( gl, value, textures ) {\n\n\t\tconst seq = this.seq;\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t\t}\n\n\t}\n\n}\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n// - followed by an optional right bracket (found when array index)\n// - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nclass WebGLUniforms {\n\n\tconstructor( gl, program ) {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t\tconst n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tsetValue( gl, name, value, textures ) {\n\n\t\tconst u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n\t}\n\n\tsetOptional( gl, object, name ) {\n\n\t\tconst v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t}\n\n\tstatic upload( gl, seq, values, textures ) {\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tstatic seqWithValue( seq, values ) {\n\n\t\tconst r = [];\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n}\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\n// From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/\nconst COMPLETION_STATUS_KHR = 0x91B1;\n\nlet programIdCount = 0;\n\nfunction handleSource( string, errorLine ) {\n\n\tconst lines = string.split( '\\n' );\n\tconst lines2 = [];\n\n\tconst from = Math.max( errorLine - 6, 0 );\n\tconst to = Math.min( errorLine + 6, lines.length );\n\n\tfor ( let i = from; i < to; i ++ ) {\n\n\t\tconst line = i + 1;\n\t\tlines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` );\n\n\t}\n\n\treturn lines2.join( '\\n' );\n\n}\n\nconst _m0 = /*@__PURE__*/ new Matrix3();\n\nfunction getEncodingComponents( colorSpace ) {\n\n\tColorManagement._getMatrix( _m0, ColorManagement.workingColorSpace, colorSpace );\n\n\tconst encodingMatrix = `mat3( ${ _m0.elements.map( ( v ) => v.toFixed( 4 ) ) } )`;\n\n\tswitch ( ColorManagement.getTransfer( colorSpace ) ) {\n\n\t\tcase LinearTransfer:\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t\tcase SRGBTransfer:\n\t\t\treturn [ encodingMatrix, 'sRGBTransferOETF' ];\n\n\t\tdefault:\n\t\t\twarn( 'WebGLProgram: Unsupported color space: ', colorSpace );\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );\n\n\tconst shaderInfoLog = gl.getShaderInfoLog( shader ) || '';\n\tconst errors = shaderInfoLog.trim();\n\n\tif ( status && errors === '' ) return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\tif ( errorMatches ) {\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt( errorMatches[ 1 ] );\n\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t} else {\n\n\t\treturn errors;\n\n\t}\n\n}\n\nfunction getTexelEncodingFunction( functionName, colorSpace ) {\n\n\tconst components = getEncodingComponents( colorSpace );\n\n\treturn [\n\n\t\t`vec4 ${functionName}( vec4 value ) {`,\n\n\t\t`\treturn ${components[ 1 ]}( vec4( value.rgb * ${components[ 0 ]}, value.a ) );`,\n\n\t\t'}',\n\n\t].join( '\\n' );\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'Cineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase AgXToneMapping:\n\t\t\ttoneMappingName = 'AgX';\n\t\t\tbreak;\n\n\t\tcase NeutralToneMapping:\n\t\t\ttoneMappingName = 'Neutral';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\twarn( 'WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\n\nfunction getLuminanceFunction() {\n\n\tColorManagement.getLuminanceCoefficients( _v0 );\n\n\tconst r = _v0.x.toFixed( 4 );\n\tconst g = _v0.y.toFixed( 4 );\n\tconst b = _v0.z.toFixed( 4 );\n\n\treturn [\n\n\t\t'float luminance( const in vec3 rgb ) {',\n\n\t\t`\tconst vec3 weights = vec3( ${ r }, ${ g }, ${ b } );`,\n\n\t\t'\treturn dot( weights, rgb );',\n\n\t\t'}'\n\n\t].join( '\\n' );\n\n}\n\nfunction generateVertexExtensions( parameters ) {\n\n\tconst chunks = [\n\t\tparameters.extensionClipCullDistance ? '#extension GL_ANGLE_clip_cull_distance : require' : '',\n\t\tparameters.extensionMultiDraw ? '#extension GL_ANGLE_multi_draw : require' : '',\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === gl.FLOAT_MAT2 ) locationSize = 2;\n\t\tif ( info.type === gl.FLOAT_MAT3 ) locationSize = 3;\n\t\tif ( info.type === gl.FLOAT_MAT4 ) locationSize = 4;\n\n\t\t// log( 'WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\tconst numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps;\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nconst shaderChunkMap = new Map();\n\nfunction includeReplacer( match, include ) {\n\n\tlet string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tconst newInclude = shaderChunkMap.get( include );\n\n\t\tif ( newInclude !== undefined ) {\n\n\t\t\tstring = ShaderChunk[ newInclude ];\n\t\t\twarn( 'WebGLRenderer: Shader chunk \"%s\" has been deprecated. Use \"%s\" instead.', include, newInclude );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t}\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string.replace( unrollLoopPattern, loopReplacer );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = `precision ${parameters.precision} float;\n\tprecision ${parameters.precision} int;\n\tprecision ${parameters.precision} sampler2D;\n\tprecision ${parameters.precision} samplerCube;\n\tprecision ${parameters.precision} sampler3D;\n\tprecision ${parameters.precision} sampler2DArray;\n\tprecision ${parameters.precision} sampler2DShadow;\n\tprecision ${parameters.precision} samplerCubeShadow;\n\tprecision ${parameters.precision} sampler2DArrayShadow;\n\tprecision ${parameters.precision} isampler2D;\n\tprecision ${parameters.precision} isampler3D;\n\tprecision ${parameters.precision} isamplerCube;\n\tprecision ${parameters.precision} isampler2DArray;\n\tprecision ${parameters.precision} usampler2D;\n\tprecision ${parameters.precision} usampler3D;\n\tprecision ${parameters.precision} usamplerCube;\n\tprecision ${parameters.precision} usampler2DArray;\n\t`;\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction generateCubeUVSize( parameters ) {\n\n\tconst imageHeight = parameters.envMapCubeUVHeight;\n\n\tif ( imageHeight === null ) return null;\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\tconst envMapCubeUVSize = generateCubeUVSize( parameters );\n\n\tconst customVertexExtensions = generateVertexExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.extensionClipCullDistance ? '#define USE_CLIP_DISTANCE' : '',\n\t\t\tparameters.batching ? '#define USE_BATCHING' : '',\n\t\t\tparameters.batchingColor ? '#define USE_BATCHING_COLOR' : '',\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\t\t\tparameters.instancingMorph ? '#define USE_INSTANCING_MORPH' : '',\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.displacementMap ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\t//\n\n\t\t\tparameters.mapUv ? '#define MAP_UV ' + parameters.mapUv : '',\n\t\t\tparameters.alphaMapUv ? '#define ALPHAMAP_UV ' + parameters.alphaMapUv : '',\n\t\t\tparameters.lightMapUv ? '#define LIGHTMAP_UV ' + parameters.lightMapUv : '',\n\t\t\tparameters.aoMapUv ? '#define AOMAP_UV ' + parameters.aoMapUv : '',\n\t\t\tparameters.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + parameters.emissiveMapUv : '',\n\t\t\tparameters.bumpMapUv ? '#define BUMPMAP_UV ' + parameters.bumpMapUv : '',\n\t\t\tparameters.normalMapUv ? '#define NORMALMAP_UV ' + parameters.normalMapUv : '',\n\t\t\tparameters.displacementMapUv ? '#define DISPLACEMENTMAP_UV ' + parameters.displacementMapUv : '',\n\n\t\t\tparameters.metalnessMapUv ? '#define METALNESSMAP_UV ' + parameters.metalnessMapUv : '',\n\t\t\tparameters.roughnessMapUv ? '#define ROUGHNESSMAP_UV ' + parameters.roughnessMapUv : '',\n\n\t\t\tparameters.anisotropyMapUv ? '#define ANISOTROPYMAP_UV ' + parameters.anisotropyMapUv : '',\n\n\t\t\tparameters.clearcoatMapUv ? '#define CLEARCOATMAP_UV ' + parameters.clearcoatMapUv : '',\n\t\t\tparameters.clearcoatNormalMapUv ? '#define CLEARCOAT_NORMALMAP_UV ' + parameters.clearcoatNormalMapUv : '',\n\t\t\tparameters.clearcoatRoughnessMapUv ? '#define CLEARCOAT_ROUGHNESSMAP_UV ' + parameters.clearcoatRoughnessMapUv : '',\n\n\t\t\tparameters.iridescenceMapUv ? '#define IRIDESCENCEMAP_UV ' + parameters.iridescenceMapUv : '',\n\t\t\tparameters.iridescenceThicknessMapUv ? '#define IRIDESCENCE_THICKNESSMAP_UV ' + parameters.iridescenceThicknessMapUv : '',\n\n\t\t\tparameters.sheenColorMapUv ? '#define SHEEN_COLORMAP_UV ' + parameters.sheenColorMapUv : '',\n\t\t\tparameters.sheenRoughnessMapUv ? '#define SHEEN_ROUGHNESSMAP_UV ' + parameters.sheenRoughnessMapUv : '',\n\n\t\t\tparameters.specularMapUv ? '#define SPECULARMAP_UV ' + parameters.specularMapUv : '',\n\t\t\tparameters.specularColorMapUv ? '#define SPECULAR_COLORMAP_UV ' + parameters.specularColorMapUv : '',\n\t\t\tparameters.specularIntensityMapUv ? '#define SPECULAR_INTENSITYMAP_UV ' + parameters.specularIntensityMapUv : '',\n\n\t\t\tparameters.transmissionMapUv ? '#define TRANSMISSIONMAP_UV ' + parameters.transmissionMapUv : '',\n\t\t\tparameters.thicknessMapUv ? '#define THICKNESSMAP_UV ' + parameters.thicknessMapUv : '',\n\n\t\t\t//\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphColors ) ? '#define USE_MORPHCOLORS' : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGARITHMIC_DEPTH_BUFFER' : '',\n\t\t\tparameters.reversedDepthBuffer ? '#define USE_REVERSED_DEPTH_BUFFER' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_MORPH',\n\n\t\t\t'\tuniform sampler2D morphTexture;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_UV1',\n\n\t\t\t'\tattribute vec2 uv1;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV2',\n\n\t\t\t'\tattribute vec2 uv2;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV3',\n\n\t\t\t'\tattribute vec2 uv3;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.alphaToCoverage ? '#define ALPHA_TO_COVERAGE' : '',\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.dispersion ? '#define USE_DISPERSION' : '',\n\n\t\t\tparameters.iridescence ? '#define USE_IRIDESCENCE' : '',\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\t\t\tparameters.decodeVideoTextureEmissive ? '#define DECODE_VIDEO_TEXTURE_EMISSIVE' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGARITHMIC_DEPTH_BUFFER' : '',\n\t\t\tparameters.reversedDepthBuffer ? '#define USE_REVERSED_DEPTH_BUFFER' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.opaque ? '#define OPAQUE' : '',\n\n\t\t\tShaderChunk[ 'colorspace_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputColorSpace ),\n\t\t\tgetLuminanceFunction(),\n\n\t\t\tparameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\tcustomVertexExtensions,\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// log( '*VERTEX*', vertexGlsl );\n\t// log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\tfunction onFirstUse( self ) {\n\n\t\t// check for link errors\n\t\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\t\tconst programInfoLog = gl.getProgramInfoLog( program ) || '';\n\t\t\tconst vertexShaderInfoLog = gl.getShaderInfoLog( glVertexShader ) || '';\n\t\t\tconst fragmentShaderInfoLog = gl.getShaderInfoLog( glFragmentShader ) || '';\n\n\t\t\tconst programLog = programInfoLog.trim();\n\t\t\tconst vertexLog = vertexShaderInfoLog.trim();\n\t\t\tconst fragmentLog = fragmentShaderInfoLog.trim();\n\n\t\t\tlet runnable = true;\n\t\t\tlet haveDiagnostics = true;\n\n\t\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\t\trunnable = false;\n\n\t\t\t\tif ( typeof renderer.debug.onShaderError === 'function' ) {\n\n\t\t\t\t\trenderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// default error reporting\n\n\t\t\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\t\t\terror(\n\t\t\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\\n\\n' +\n\t\t\t\t\t\t'Material Name: ' + self.name + '\\n' +\n\t\t\t\t\t\t'Material Type: ' + self.type + '\\n\\n' +\n\t\t\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\t\t\tfragmentErrors\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( programLog !== '' ) {\n\n\t\t\t\twarn( 'WebGLProgram: Program Info Log:', programLog );\n\n\t\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\t\thaveDiagnostics = false;\n\n\t\t\t}\n\n\t\t\tif ( haveDiagnostics ) {\n\n\t\t\t\tself.diagnostics = {\n\n\t\t\t\t\trunnable: runnable,\n\n\t\t\t\t\tprogramLog: programLog,\n\n\t\t\t\t\tvertexShader: {\n\n\t\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t\t},\n\n\t\t\t\t\tfragmentShader: {\n\n\t\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Clean up\n\n\t\t// Crashes in iOS9 and iOS10. #18402\n\t\t// gl.detachShader( program, glVertexShader );\n\t\t// gl.detachShader( program, glFragmentShader );\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t}\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t// Populates cachedUniforms and cachedAttributes\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t// Populates cachedAttributes and cachedUniforms\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// indicate when the program is ready to be used. if the KHR_parallel_shader_compile extension isn't supported,\n\t// flag the program as ready immediately. It may cause a stall when it's first used.\n\n\tlet programReady = ( parameters.rendererExtensionParallelShaderCompile === false );\n\n\tthis.isReady = function () {\n\n\t\tif ( programReady === false ) {\n\n\t\t\tprogramReady = gl.getProgramParameter( program, COMPLETION_STATUS_KHR );\n\n\t\t}\n\n\t\treturn programReady;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.type = parameters.shaderType;\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nlet _id = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\t\tlet set = cache.get( material );\n\n\t\tif ( set === undefined ) {\n\n\t\t\tset = new Set();\n\t\t\tcache.set( material, set );\n\n\t\t}\n\n\t\treturn set;\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\t\tlet stage = cache.get( code );\n\n\t\tif ( stage === undefined ) {\n\n\t\t\tstage = new WebGLShaderStage( code );\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn stage;\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor( code ) {\n\n\t\tthis.id = _id ++;\n\n\t\tthis.code = code;\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst _activeChannels = new Set();\n\tconst programs = [];\n\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst SUPPORTS_VERTEX_TEXTURES = capabilities.vertexTextures;\n\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getChannel( value ) {\n\n\t\t_activeChannels.add( value );\n\n\t\tif ( value === 0 ) return 'uv';\n\n\t\treturn `uv${ value }`;\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst geometry = object.geometry;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\twarn( 'WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet morphTextureStride = 0;\n\n\t\tif ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1;\n\t\tif ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2;\n\t\tif ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3;\n\n\t\t//\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tconst IS_INSTANCEDMESH = object.isInstancedMesh === true;\n\t\tconst IS_BATCHEDMESH = object.isBatchedMesh === true;\n\n\t\tconst HAS_MAP = !! material.map;\n\t\tconst HAS_MATCAP = !! material.matcap;\n\t\tconst HAS_ENVMAP = !! envMap;\n\t\tconst HAS_AOMAP = !! material.aoMap;\n\t\tconst HAS_LIGHTMAP = !! material.lightMap;\n\t\tconst HAS_BUMPMAP = !! material.bumpMap;\n\t\tconst HAS_NORMALMAP = !! material.normalMap;\n\t\tconst HAS_DISPLACEMENTMAP = !! material.displacementMap;\n\t\tconst HAS_EMISSIVEMAP = !! material.emissiveMap;\n\n\t\tconst HAS_METALNESSMAP = !! material.metalnessMap;\n\t\tconst HAS_ROUGHNESSMAP = !! material.roughnessMap;\n\n\t\tconst HAS_ANISOTROPY = material.anisotropy > 0;\n\t\tconst HAS_CLEARCOAT = material.clearcoat > 0;\n\t\tconst HAS_DISPERSION = material.dispersion > 0;\n\t\tconst HAS_IRIDESCENCE = material.iridescence > 0;\n\t\tconst HAS_SHEEN = material.sheen > 0;\n\t\tconst HAS_TRANSMISSION = material.transmission > 0;\n\n\t\tconst HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !! material.anisotropyMap;\n\n\t\tconst HAS_CLEARCOATMAP = HAS_CLEARCOAT && !! material.clearcoatMap;\n\t\tconst HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !! material.clearcoatNormalMap;\n\t\tconst HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !! material.clearcoatRoughnessMap;\n\n\t\tconst HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !! material.iridescenceMap;\n\t\tconst HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !! material.iridescenceThicknessMap;\n\n\t\tconst HAS_SHEEN_COLORMAP = HAS_SHEEN && !! material.sheenColorMap;\n\t\tconst HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !! material.sheenRoughnessMap;\n\n\t\tconst HAS_SPECULARMAP = !! material.specularMap;\n\t\tconst HAS_SPECULAR_COLORMAP = !! material.specularColorMap;\n\t\tconst HAS_SPECULAR_INTENSITYMAP = !! material.specularIntensityMap;\n\n\t\tconst HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !! material.transmissionMap;\n\t\tconst HAS_THICKNESSMAP = HAS_TRANSMISSION && !! material.thicknessMap;\n\n\t\tconst HAS_GRADIENTMAP = !! material.gradientMap;\n\n\t\tconst HAS_ALPHAMAP = !! material.alphaMap;\n\n\t\tconst HAS_ALPHATEST = material.alphaTest > 0;\n\n\t\tconst HAS_ALPHAHASH = !! material.alphaHash;\n\n\t\tconst HAS_EXTENSIONS = !! material.extensions;\n\n\t\tlet toneMapping = NoToneMapping;\n\n\t\tif ( material.toneMapped ) {\n\n\t\t\tif ( currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\ttoneMapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst parameters = {\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderType: material.type,\n\t\t\tshaderName: material.name,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tbatching: IS_BATCHEDMESH,\n\t\t\tbatchingColor: IS_BATCHEDMESH && object._colorsTexture !== null,\n\t\t\tinstancing: IS_INSTANCEDMESH,\n\t\t\tinstancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,\n\t\t\tinstancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null,\n\n\t\t\tsupportsVertexTextures: SUPPORTS_VERTEX_TEXTURES,\n\t\t\toutputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ),\n\t\t\talphaToCoverage: !! material.alphaToCoverage,\n\n\t\t\tmap: HAS_MAP,\n\t\t\tmatcap: HAS_MATCAP,\n\t\t\tenvMap: HAS_ENVMAP,\n\t\t\tenvMapMode: HAS_ENVMAP && envMap.mapping,\n\t\t\tenvMapCubeUVHeight: envMapCubeUVHeight,\n\t\t\taoMap: HAS_AOMAP,\n\t\t\tlightMap: HAS_LIGHTMAP,\n\t\t\tbumpMap: HAS_BUMPMAP,\n\t\t\tnormalMap: HAS_NORMALMAP,\n\t\t\tdisplacementMap: SUPPORTS_VERTEX_TEXTURES && HAS_DISPLACEMENTMAP,\n\t\t\temissiveMap: HAS_EMISSIVEMAP,\n\n\t\t\tnormalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap,\n\t\t\tnormalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tmetalnessMap: HAS_METALNESSMAP,\n\t\t\troughnessMap: HAS_ROUGHNESSMAP,\n\n\t\t\tanisotropy: HAS_ANISOTROPY,\n\t\t\tanisotropyMap: HAS_ANISOTROPYMAP,\n\n\t\t\tclearcoat: HAS_CLEARCOAT,\n\t\t\tclearcoatMap: HAS_CLEARCOATMAP,\n\t\t\tclearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP,\n\t\t\tclearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP,\n\n\t\t\tdispersion: HAS_DISPERSION,\n\n\t\t\tiridescence: HAS_IRIDESCENCE,\n\t\t\tiridescenceMap: HAS_IRIDESCENCEMAP,\n\t\t\tiridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP,\n\n\t\t\tsheen: HAS_SHEEN,\n\t\t\tsheenColorMap: HAS_SHEEN_COLORMAP,\n\t\t\tsheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP,\n\n\t\t\tspecularMap: HAS_SPECULARMAP,\n\t\t\tspecularColorMap: HAS_SPECULAR_COLORMAP,\n\t\t\tspecularIntensityMap: HAS_SPECULAR_INTENSITYMAP,\n\n\t\t\ttransmission: HAS_TRANSMISSION,\n\t\t\ttransmissionMap: HAS_TRANSMISSIONMAP,\n\t\t\tthicknessMap: HAS_THICKNESSMAP,\n\n\t\t\tgradientMap: HAS_GRADIENTMAP,\n\n\t\t\topaque: material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false,\n\n\t\t\talphaMap: HAS_ALPHAMAP,\n\t\t\talphaTest: HAS_ALPHATEST,\n\t\t\talphaHash: HAS_ALPHAHASH,\n\n\t\t\tcombine: material.combine,\n\n\t\t\t//\n\n\t\t\tmapUv: HAS_MAP && getChannel( material.map.channel ),\n\t\t\taoMapUv: HAS_AOMAP && getChannel( material.aoMap.channel ),\n\t\t\tlightMapUv: HAS_LIGHTMAP && getChannel( material.lightMap.channel ),\n\t\t\tbumpMapUv: HAS_BUMPMAP && getChannel( material.bumpMap.channel ),\n\t\t\tnormalMapUv: HAS_NORMALMAP && getChannel( material.normalMap.channel ),\n\t\t\tdisplacementMapUv: HAS_DISPLACEMENTMAP && getChannel( material.displacementMap.channel ),\n\t\t\temissiveMapUv: HAS_EMISSIVEMAP && getChannel( material.emissiveMap.channel ),\n\n\t\t\tmetalnessMapUv: HAS_METALNESSMAP && getChannel( material.metalnessMap.channel ),\n\t\t\troughnessMapUv: HAS_ROUGHNESSMAP && getChannel( material.roughnessMap.channel ),\n\n\t\t\tanisotropyMapUv: HAS_ANISOTROPYMAP && getChannel( material.anisotropyMap.channel ),\n\n\t\t\tclearcoatMapUv: HAS_CLEARCOATMAP && getChannel( material.clearcoatMap.channel ),\n\t\t\tclearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel( material.clearcoatNormalMap.channel ),\n\t\t\tclearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel( material.clearcoatRoughnessMap.channel ),\n\n\t\t\tiridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel( material.iridescenceMap.channel ),\n\t\t\tiridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel( material.iridescenceThicknessMap.channel ),\n\n\t\t\tsheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel( material.sheenColorMap.channel ),\n\t\t\tsheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel( material.sheenRoughnessMap.channel ),\n\n\t\t\tspecularMapUv: HAS_SPECULARMAP && getChannel( material.specularMap.channel ),\n\t\t\tspecularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel( material.specularColorMap.channel ),\n\t\t\tspecularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel( material.specularIntensityMap.channel ),\n\n\t\t\ttransmissionMapUv: HAS_TRANSMISSIONMAP && getChannel( material.transmissionMap.channel ),\n\t\t\tthicknessMapUv: HAS_THICKNESSMAP && getChannel( material.thicknessMap.channel ),\n\n\t\t\talphaMapUv: HAS_ALPHAMAP && getChannel( material.alphaMap.channel ),\n\n\t\t\t//\n\n\t\t\tvertexTangents: !! geometry.attributes.tangent && ( HAS_NORMALMAP || HAS_ANISOTROPY ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,\n\n\t\t\tpointsUvs: object.isPoints === true && !! geometry.attributes.uv && ( HAS_MAP || HAS_ALPHAMAP ),\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog === true,\n\t\t\tfogExp2: ( !! fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: ( material.flatShading === true && material.wireframe === false ),\n\n\t\t\tsizeAttenuation: material.sizeAttenuation === true,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\t\treversedDepthBuffer: reversedDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true,\n\n\t\t\tmorphTargets: geometry.morphAttributes.position !== undefined,\n\t\t\tmorphNormals: geometry.morphAttributes.normal !== undefined,\n\t\t\tmorphColors: geometry.morphAttributes.color !== undefined,\n\t\t\tmorphTargetsCount: morphTargetsCount,\n\t\t\tmorphTextureStride: morphTextureStride,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumSpotLightMaps: lights.spotLightMap.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\t\t\tnumSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps,\n\n\t\t\tnumLightProbes: lights.numLightProbes,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: toneMapping,\n\n\t\t\tdecodeVideoTexture: HAS_MAP && ( material.map.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.map.colorSpace ) === SRGBTransfer ),\n\t\t\tdecodeVideoTextureEmissive: HAS_EMISSIVEMAP && ( material.emissiveMap.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.emissiveMap.colorSpace ) === SRGBTransfer ),\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tuseDepthPacking: material.depthPacking >= 0,\n\t\t\tdepthPacking: material.depthPacking || 0,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has( 'WEBGL_clip_cull_distance' ),\n\t\t\textensionMultiDraw: ( HAS_EXTENSIONS && material.extensions.multiDraw === true || IS_BATCHEDMESH ) && extensions.has( 'WEBGL_multi_draw' ),\n\n\t\t\trendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\t// the usage of getChannel() determines the active texture channels for this shader\n\n\t\tparameters.vertexUv1s = _activeChannels.has( 1 );\n\t\tparameters.vertexUv2s = _activeChannels.has( 2 );\n\t\tparameters.vertexUv3s = _activeChannels.has( 3 );\n\n\t\t_activeChannels.clear();\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputColorSpace );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputColorSpace );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.envMapCubeUVHeight );\n\t\tarray.push( parameters.mapUv );\n\t\tarray.push( parameters.alphaMapUv );\n\t\tarray.push( parameters.lightMapUv );\n\t\tarray.push( parameters.aoMapUv );\n\t\tarray.push( parameters.bumpMapUv );\n\t\tarray.push( parameters.normalMapUv );\n\t\tarray.push( parameters.displacementMapUv );\n\t\tarray.push( parameters.emissiveMapUv );\n\t\tarray.push( parameters.metalnessMapUv );\n\t\tarray.push( parameters.roughnessMapUv );\n\t\tarray.push( parameters.anisotropyMapUv );\n\t\tarray.push( parameters.clearcoatMapUv );\n\t\tarray.push( parameters.clearcoatNormalMapUv );\n\t\tarray.push( parameters.clearcoatRoughnessMapUv );\n\t\tarray.push( parameters.iridescenceMapUv );\n\t\tarray.push( parameters.iridescenceThicknessMapUv );\n\t\tarray.push( parameters.sheenColorMapUv );\n\t\tarray.push( parameters.sheenRoughnessMapUv );\n\t\tarray.push( parameters.specularMapUv );\n\t\tarray.push( parameters.specularColorMapUv );\n\t\tarray.push( parameters.specularIntensityMapUv );\n\t\tarray.push( parameters.transmissionMapUv );\n\t\tarray.push( parameters.thicknessMapUv );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.morphAttributeCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numSpotLightMaps );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.numSpotLightShadowsWithMaps );\n\t\tarray.push( parameters.numLightProbes );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\t\tarray.push( parameters.depthPacking );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingMorph )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.normalMapObjectSpace )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.normalMapTangentSpace )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.iridescence )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.vertexUv1s )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.vertexUv2s )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.vertexUv3s )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.anisotropy )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.alphaHash )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.batching )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.dispersion )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.batchingColor )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.gradientMap )\n\t\t\t_programLayers.enable( 22 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.reversedDepthBuffer )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.morphColors )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.useDepthPacking )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.opaque )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.pointsUvs )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.decodeVideoTextureEmissive )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.alphaToCoverage )\n\t\t\t_programLayers.enable( 21 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction has( object ) {\n\n\t\treturn properties.has( object );\n\n\t}\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\thas: has,\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tconst listArray = lists.get( scene );\n\t\tlet list;\n\n\t\tif ( listArray === undefined ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= listArray.length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlistArray.push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = listArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingAndTexturingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 2 : 0 ) - ( lightA.castShadow ? 2 : 0 ) + ( lightB.map ? 1 : 0 ) - ( lightA.map ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: -1,\n\t\t\tpointLength: -1,\n\t\t\tspotLength: -1,\n\t\t\trectAreaLength: -1,\n\t\t\themiLength: -1,\n\n\t\t\tnumDirectionalShadows: -1,\n\t\t\tnumPointShadows: -1,\n\t\t\tnumSpotShadows: -1,\n\t\t\tnumSpotMaps: -1,\n\n\t\t\tnumLightProbes: -1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotLightMap: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotLightMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: [],\n\t\tnumSpotLightShadowsWithMaps: 0,\n\t\tnumLightProbes: 0\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\t\tlet numSpotMaps = 0;\n\t\tlet numSpotShadowsWithMaps = 0;\n\n\t\tlet numLightProbes = 0;\n\n\t\t// ordering : [shadow casting + map texturing, map texturing, shadow casting, none ]\n\t\tlights.sort( shadowCastingAndTexturingLightsFirst );\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity;\n\t\t\t\tg += color.g * intensity;\n\t\t\t\tb += color.b * intensity;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t\tnumLightProbes ++;\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\tif ( light.map ) {\n\n\t\t\t\t\tstate.spotLightMap[ numSpotMaps ] = light.map;\n\t\t\t\t\tnumSpotMaps ++;\n\n\t\t\t\t\t// make sure the lightMatrix is up to date\n\t\t\t\t\t// TODO : do it if required only\n\t\t\t\t\tshadow.updateMatrices( light );\n\n\t\t\t\t\tif ( light.castShadow ) numSpotShadowsWithMaps ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spotLightMatrix[ spotLength ] = shadow.matrix;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ||\n\t\t\thash.numSpotMaps !== numSpotMaps ||\n\t\t\thash.numLightProbes !== numLightProbes ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps;\n\t\t\tstate.spotLightMap.length = numSpotMaps;\n\t\t\tstate.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps;\n\t\t\tstate.numLightProbes = numLightProbes;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\t\t\thash.numSpotMaps = numSpotMaps;\n\n\t\t\thash.numLightProbes = numLightProbes;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions ) {\n\n\tconst lights = new WebGLLights( extensions );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init( camera ) {\n\n\t\tstate.camera = camera;\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights() {\n\n\t\tlights.setup( lightsArray );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tcamera: null,\n\n\t\tlights: lights,\n\n\t\ttransmissionRenderTarget: {}\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tconst renderStateArray = renderStates.get( scene );\n\t\tlet renderState;\n\n\t\tif ( renderStateArray === undefined ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStateArray.length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\t\trenderStateArray.push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStateArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst vertex = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nconst fragment = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\n#include \\nvoid main() {\\n\\tconst float samples = float( VSM_SAMPLES );\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\\n\\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\\n\\tfor ( float i = 0.0; i < samples; i ++ ) {\\n\\t\\tfloat uvOffset = uvStart + i * uvStride;\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\\n\\t\\t\\tmean += distribution.x;\\n\\t\\t\\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n\\t\\t#else\\n\\t\\t\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean / samples;\\n\\tsquared_mean = squared_mean / samples;\\n\\tfloat std_dev = sqrt( squared_mean - mean * mean );\\n\\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\\n}\";\n\nfunction WebGLShadowMap( renderer, objects, capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = capabilities.maxTextureSize;\n\n\tconst shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vertex,\n\t\tfragmentShader: fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ -1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\tlet _previousType = this.type;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst activeCubeFace = renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst _state = renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\n\t\tif ( _state.buffers.depth.getReversed() === true ) {\n\n\t\t\t_state.buffers.color.setClear( 0, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\n\t\t}\n\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// check for shadow map type changes\n\n\t\tconst toVSM = ( _previousType !== VSMShadowMap && this.type === VSMShadowMap );\n\t\tconst fromVSM = ( _previousType === VSMShadowMap && this.type !== VSMShadowMap );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\twarn( 'WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null || toVSM === true || fromVSM === true ) {\n\n\t\t\t\tconst pars = ( this.type !== VSMShadowMap ) ? { minFilter: NearestFilter, magFilter: NearestFilter } : {};\n\n\t\t\t\tif ( shadow.map !== null ) {\n\n\t\t\t\t\tshadow.map.dispose();\n\n\t\t\t\t}\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\trenderer.setRenderTarget( shadow.map );\n\t\t\trenderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( shadow.isPointLightShadow !== true && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\t_previousType = this.type;\n\n\t\tscope.needsUpdate = false;\n\n\t\trenderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( shadow.mapPass === null ) {\n\n\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.mapPass );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.map );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, material, light, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t\tif ( ( renderer.localClippingEnabled && material.clipShadows === true && Array.isArray( material.clippingPlanes ) && material.clippingPlanes.length !== 0 ) ||\n\t\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t\t( material.alphaMap && material.alphaTest > 0 ) ||\n\t\t\t\t( material.map && material.alphaTest > 0 ) ||\n\t\t\t\t( material.alphaToCoverage === true ) ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\t\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = ( material.alphaToCoverage === true ) ? 0.5 : material.alphaTest; // approximate alphaToCoverage by using a fixed alphaTest value\n\t\tresult.map = material.map;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tconst materialProperties = renderer.properties.get( result );\n\t\t\tmaterialProperties.light = light;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, groupMaterial, light, type );\n\n\t\t\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, material, light, type );\n\n\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t// make sure to remove the unique distance/depth materials used for shadow map rendering\n\n\t\tfor ( const id in _materialCache ) {\n\n\t\t\tconst cache = _materialCache[ id ];\n\n\t\t\tconst uuid = event.target.uuid;\n\n\t\t\tif ( uuid in cache ) {\n\n\t\t\t\tconst shadowMaterial = cache[ uuid ];\n\t\t\t\tshadowMaterial.dispose();\n\t\t\t\tdelete cache[ uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nconst reversedFuncs = {\n\t[ NeverDepth ]: AlwaysDepth,\n\t[ LessDepth ]: GreaterDepth,\n\t[ EqualDepth ]: NotEqualDepth,\n\t[ LessEqualDepth ]: GreaterEqualDepth,\n\n\t[ AlwaysDepth ]: NeverDepth,\n\t[ GreaterDepth ]: LessDepth,\n\t[ NotEqualDepth ]: EqualDepth,\n\t[ GreaterEqualDepth ]: LessEqualDepth,\n};\n\nfunction WebGLState( gl, extensions ) {\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( -1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentReversed = false;\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetReversed: function ( reversed ) {\n\n\t\t\t\tif ( currentReversed !== reversed ) {\n\n\t\t\t\t\tconst ext = extensions.get( 'EXT_clip_control' );\n\n\t\t\t\t\tif ( reversed ) {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.ZERO_TO_ONE_EXT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.NEGATIVE_ONE_TO_ONE_EXT );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentReversed = reversed;\n\n\t\t\t\t\tconst oldDepth = currentDepthClear;\n\t\t\t\t\tcurrentDepthClear = null;\n\t\t\t\t\tthis.setClear( oldDepth );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tgetReversed: function () {\n\n\t\t\t\treturn currentReversed;\n\n\t\t\t},\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentReversed ) depthFunc = reversedFuncs[ depthFunc ];\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tif ( currentReversed ) {\n\n\t\t\t\t\t\tdepth = 1 - depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\t\t\t\tcurrentReversed = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t currentStencilRef !== stencilRef ||\n\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tconst uboBindings = new WeakMap();\n\tconst uboProgramMap = new WeakMap();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentBlendColor = new Color( 0, 0, 0 );\n\tlet currentBlendAlpha = 0;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( gl.SCISSOR_BOX );\n\tconst viewportParam = gl.getParameter( gl.VIEWPORT );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count, dimensions ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tif ( type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tgl.texImage3D( target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t} else {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\temptyTextures[ gl.TEXTURE_2D_ARRAY ] = createTexture( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1 );\n\temptyTextures[ gl.TEXTURE_3D ] = createTexture( gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( gl.DEPTH_TEST );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( gl.CULL_FACE );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\t// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER\n\n\t\t\tif ( target === gl.DRAW_FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\tif ( target === gl.FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tdrawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t}\n\n\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== gl.BACK ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = gl.BACK;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t}\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: gl.FUNC_ADD,\n\t\t[ SubtractEquation ]: gl.FUNC_SUBTRACT,\n\t\t[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT\n\t};\n\n\tequationToGL[ MinEquation ] = gl.MIN;\n\tequationToGL[ MaxEquation ] = gl.MAX;\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: gl.ZERO,\n\t\t[ OneFactor ]: gl.ONE,\n\t\t[ SrcColorFactor ]: gl.SRC_COLOR,\n\t\t[ SrcAlphaFactor ]: gl.SRC_ALPHA,\n\t\t[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,\n\t\t[ DstColorFactor ]: gl.DST_COLOR,\n\t\t[ DstAlphaFactor ]: gl.DST_ALPHA,\n\t\t[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,\n\t\t[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,\n\t\t[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA,\n\t\t[ ConstantColorFactor ]: gl.CONSTANT_COLOR,\n\t\t[ OneMinusConstantColorFactor ]: gl.ONE_MINUS_CONSTANT_COLOR,\n\t\t[ ConstantAlphaFactor ]: gl.CONSTANT_ALPHA,\n\t\t[ OneMinusConstantAlphaFactor ]: gl.ONE_MINUS_CONSTANT_ALPHA\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( gl.BLEND );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( gl.BLEND );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE, gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: SubtractiveBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: MultiplyBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\t\t\t\tcurrentBlendColor.set( 0, 0, 0 );\n\t\t\t\tcurrentBlendAlpha = 0;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tif ( blendColor.equals( currentBlendColor ) === false || blendAlpha !== currentBlendAlpha ) {\n\n\t\t\tgl.blendColor( blendColor.r, blendColor.g, blendColor.b, blendAlpha );\n\n\t\t\tcurrentBlendColor.copy( blendColor );\n\t\t\tcurrentBlendAlpha = blendAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = false;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( gl.CULL_FACE )\n\t\t\t: enable( gl.CULL_FACE );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( gl.SAMPLE_ALPHA_TO_COVERAGE )\n\t\t\t: disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture, webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\twebglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\t} else {\n\n\t\t\t\twebglSlot = currentTextureSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ webglSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ webglSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D( ...arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\tfunction updateUBOMapping( uniformsGroup, program ) {\n\n\t\tlet mapping = uboProgramMap.get( program );\n\n\t\tif ( mapping === undefined ) {\n\n\t\t\tmapping = new WeakMap();\n\n\t\t\tuboProgramMap.set( program, mapping );\n\n\t\t}\n\n\t\tlet blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( blockIndex === undefined ) {\n\n\t\t\tblockIndex = gl.getUniformBlockIndex( program, uniformsGroup.name );\n\n\t\t\tmapping.set( uniformsGroup, blockIndex );\n\n\t\t}\n\n\t}\n\n\tfunction uniformBlockBinding( uniformsGroup, program ) {\n\n\t\tconst mapping = uboProgramMap.get( program );\n\t\tconst blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( uboBindings.get( program ) !== blockIndex ) {\n\n\t\t\t// bind shader specific block index to global block point\n\t\t\tgl.uniformBlockBinding( program, blockIndex, uniformsGroup.__bindingPointIndex );\n\n\t\t\tuboBindings.set( program, blockIndex );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( gl.BLEND );\n\t\tgl.disable( gl.CULL_FACE );\n\t\tgl.disable( gl.DEPTH_TEST );\n\t\tgl.disable( gl.POLYGON_OFFSET_FILL );\n\t\tgl.disable( gl.SCISSOR_TEST );\n\t\tgl.disable( gl.STENCIL_TEST );\n\t\tgl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\tgl.blendFunc( gl.ONE, gl.ZERO );\n\t\tgl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );\n\t\tgl.blendColor( 0, 0, 0, 0 );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( gl.LESS );\n\n\t\tdepthBuffer.setReversed( false );\n\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( gl.ALWAYS, 0, 0xffffffff );\n\t\tgl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( gl.BACK );\n\t\tgl.frontFace( gl.CCW );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( gl.TEXTURE0 );\n\n\t\tgl.bindFramebuffer( gl.FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentBlendColor = new Color( 0, 0, 0 );\n\t\tcurrentBlendAlpha = 0;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\tcompressedTexImage3D: compressedTexImage3D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tupdateUBOMapping: updateUBOMapping,\n\t\tuniformBlockBinding: uniformBlockBinding,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\t\tcompressedTexSubImage3D: compressedTexSubImage3D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;\n\tconst supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );\n\n\tconst _imageDimensions = new Vector2();\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\tconst _sources = new WeakMap(); // maps WebglTexture objects to instances of Source\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\tconst dimensions = getDimensions( image );\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( dimensions.width > maxSize || dimensions.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( dimensions.width, dimensions.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ||\n\t\t\t\t( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) ) {\n\n\t\t\t\tconst width = Math.floor( scale * dimensions.width );\n\t\t\t\tconst height = Math.floor( scale * dimensions.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\twarn( 'WebGLRenderer: Texture has been resized from (' + dimensions.width + 'x' + dimensions.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\twarn( 'WebGLRenderer: Image in DataTexture is too big (' + dimensions.width + 'x' + dimensions.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture ) {\n\n\t\treturn texture.generateMipmaps;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getTargetType( texture ) {\n\n\t\tif ( texture.isWebGLCubeRenderTarget ) return _gl.TEXTURE_CUBE_MAP;\n\t\tif ( texture.isWebGL3DRenderTarget ) return _gl.TEXTURE_3D;\n\t\tif ( texture.isWebGLArrayRenderTarget || texture.isCompressedArrayTexture ) return _gl.TEXTURE_2D_ARRAY;\n\t\treturn _gl.TEXTURE_2D;\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false ) {\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\twarn( 'WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === _gl.RED ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.R32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RED_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.R8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.R16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.R32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RG16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RG32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RG8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RG16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RG32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGB8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGB16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGB32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGB8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGB16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGB32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGBA8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGBA16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGBA32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGBA8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGBA16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGBA32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_INT_5_9_9_9_REV ) internalFormat = _gl.RGB9_E5;\n\t\t\tif ( glType === _gl.UNSIGNED_INT_10F_11F_11F_REV ) internalFormat = _gl.R11F_G11F_B10F;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA ) {\n\n\t\t\tconst transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer( colorSpace );\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( transfer === SRGBTransfer ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1;\n\n\t\t}\n\n\t\tif ( internalFormat === _gl.R16F || internalFormat === _gl.R32F ||\n\t\t\tinternalFormat === _gl.RG16F || internalFormat === _gl.RG32F ||\n\t\t\tinternalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getInternalDepthFormat( useStencil, depthType ) {\n\n\t\tlet glInternalFormat;\n\t\tif ( useStencil ) {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH32F_STENCIL8;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\t\t\t\twarn( 'DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.' );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn glInternalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t// check if it's necessary to remove the WebGLTexture object\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures ) {\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\t\t\twebglTexture.usedTimes --;\n\n\t\t\t// the WebGLTexture object is not used anymore, remove it\n\n\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\tdeleteTexture( texture );\n\n\t\t\t}\n\n\t\t\t// remove the weak map entry if no WebGLTexture uses the source anymore\n\n\t\t\tif ( Object.keys( webglTextures ).length === 0 ) {\n\n\t\t\t\t_sources.delete( source );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deleteTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\t\tdelete webglTextures[ textureProperties.__cacheKey ];\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\tproperties.remove( renderTarget.depthTexture );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) {\n\n\t\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) {\n\n\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) {\n\n\t\t\t\tfor ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\tinfo.memory.textures --;\n\n\t\t\t}\n\n\t\t\tproperties.remove( textures[ i ] );\n\n\t\t}\n\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\twarn( 'WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tfunction getTextureCacheKey( texture ) {\n\n\t\tconst array = [];\n\n\t\tarray.push( texture.wrapS );\n\t\tarray.push( texture.wrapT );\n\t\tarray.push( texture.wrapR || 0 );\n\t\tarray.push( texture.magFilter );\n\t\tarray.push( texture.minFilter );\n\t\tarray.push( texture.anisotropy );\n\t\tarray.push( texture.internalFormat );\n\t\tarray.push( texture.format );\n\t\tarray.push( texture.type );\n\t\tarray.push( texture.generateMipmaps );\n\t\tarray.push( texture.premultiplyAlpha );\n\t\tarray.push( texture.flipY );\n\t\tarray.push( texture.unpackAlignment );\n\t\tarray.push( texture.colorSpace );\n\n\t\treturn array.join();\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.isExternalTexture !== true && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === null ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Texture marked for update but no image data found.' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t} else if ( texture.isExternalTexture ) {\n\n\t\t\ttextureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t} else if ( texture.isExternalTexture ) {\n\n\t\t\ttextureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: _gl.REPEAT,\n\t\t[ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE,\n\t\t[ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: _gl.NEAREST,\n\t\t[ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST,\n\t\t[ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR,\n\n\t\t[ LinearFilter ]: _gl.LINEAR,\n\t\t[ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST,\n\t\t[ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR\n\t};\n\n\tconst compareToGL = {\n\t\t[ NeverCompare ]: _gl.NEVER,\n\t\t[ AlwaysCompare ]: _gl.ALWAYS,\n\t\t[ LessCompare ]: _gl.LESS,\n\t\t[ LessEqualCompare ]: _gl.LEQUAL,\n\t\t[ EqualCompare ]: _gl.EQUAL,\n\t\t[ GreaterEqualCompare ]: _gl.GEQUAL,\n\t\t[ GreaterCompare ]: _gl.GREATER,\n\t\t[ NotEqualCompare ]: _gl.NOTEQUAL\n\t};\n\n\tfunction setTextureParameters( textureType, texture ) {\n\n\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false &&\n\t\t\t( texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter ||\n\t\t\ttexture.minFilter === LinearFilter || texture.minFilter === LinearMipmapNearestFilter || texture.minFilter === NearestMipmapLinearFilter || texture.minFilter === LinearMipmapLinearFilter ) ) {\n\n\t\t\twarn( 'WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device.' );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );\n\n\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] );\n\n\t\tif ( texture.compareFunction ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[ texture.compareFunction ] );\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tif ( texture.magFilter === NearestFilter ) return;\n\t\t\tif ( texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter ) return;\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tlet forceUpload = false;\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t}\n\n\t\t// create Source <-> WebGLTextures mapping if necessary\n\n\t\tconst source = texture.source;\n\t\tlet webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures === undefined ) {\n\n\t\t\twebglTextures = {};\n\t\t\t_sources.set( source, webglTextures );\n\n\t\t}\n\n\t\t// check if there is already a WebGLTexture object for the given texture parameters\n\n\t\tconst textureCacheKey = getTextureCacheKey( texture );\n\n\t\tif ( textureCacheKey !== textureProperties.__cacheKey ) {\n\n\t\t\t// if not, create a new instance of WebGLTexture\n\n\t\t\tif ( webglTextures[ textureCacheKey ] === undefined ) {\n\n\t\t\t\t// create new entry\n\n\t\t\t\twebglTextures[ textureCacheKey ] = {\n\t\t\t\t\ttexture: _gl.createTexture(),\n\t\t\t\t\tusedTimes: 0\n\t\t\t\t};\n\n\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t// when a new instance of WebGLTexture was created, a texture upload is required\n\t\t\t\t// even if the image contents are identical\n\n\t\t\t\tforceUpload = true;\n\n\t\t\t}\n\n\t\t\twebglTextures[ textureCacheKey ].usedTimes ++;\n\n\t\t\t// every time the texture cache key changes, it's necessary to check if an instance of\n\t\t\t// WebGLTexture can be deleted in order to avoid a memory leak.\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\n\t\t\tif ( webglTexture !== undefined ) {\n\n\t\t\t\twebglTextures[ textureProperties.__cacheKey ].usedTimes --;\n\n\t\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\t\tdeleteTexture( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// store references to cache key and WebGLTexture object\n\n\t\t\ttextureProperties.__cacheKey = textureCacheKey;\n\t\t\ttextureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;\n\n\t\t}\n\n\t\treturn forceUpload;\n\n\t}\n\n\tfunction getRow( index, rowLength, componentStride ) {\n\n\t\treturn Math.floor( Math.floor( index / componentStride ) / rowLength );\n\n\t}\n\n\tfunction updateTexture( texture, image, glFormat, glType ) {\n\n\t\tconst componentStride = 4; // only RGBA supported\n\n\t\tconst updateRanges = texture.updateRanges;\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.texSubImage2D`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// Only merge if in the same row and overlapping/adjacent\n\t\t\t\tconst previousEnd = previousRange.start + previousRange.count;\n\t\t\t\tconst currentRow = getRow( range.start, image.width, componentStride );\n\t\t\t\tconst previousRow = getRow( previousRange.start, image.width, componentStride );\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif (\n\t\t\t\t\trange.start <= previousEnd + 1 &&\n\t\t\t\t\tcurrentRow === previousRow &&\n\t\t\t\t\tgetRow( range.start + range.count - 1, image.width, componentStride ) === currentRow // ensure range doesn't spill\n\t\t\t\t) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tconst pixelStart = Math.floor( range.start / componentStride );\n\t\t\t\tconst pixelCount = Math.ceil( range.count / componentStride );\n\n\t\t\t\tconst x = pixelStart % image.width;\n\t\t\t\tconst y = Math.floor( pixelStart / image.width );\n\n\t\t\t\t// Assumes update ranges refer to contiguous memory\n\t\t\t\tconst width = pixelCount;\n\t\t\t\tconst height = 1;\n\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, x );\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, y );\n\n\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, x, y, width, height, glFormat, glType, image.data );\n\n\t\t\t}\n\n\t\t\ttexture.clearUpdateRanges();\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\n\t\t}\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = _gl.TEXTURE_2D;\n\n\t\tif ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) textureType = _gl.TEXTURE_2D_ARRAY;\n\t\tif ( texture.isData3DTexture ) textureType = _gl.TEXTURE_3D;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tlet image = resizeImage( texture.image, false, capabilities.maxTextureSize );\n\t\t\timage = verifyColorSpace( texture, image );\n\n\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\n\t\t\tconst glType = utils.convert( texture.type );\n\t\t\tlet glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture );\n\n\t\t\tsetTextureParameters( textureType, texture );\n\n\t\t\tlet mipmap;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tconst levels = getMipLevels( texture, image );\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\tglInternalFormat = getInternalDepthFormat( texture.format === DepthStencilFormat, texture.type );\n\n\t\t\t\t//\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tupdateTexture( texture, image, glFormat, glType );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tif ( texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst layerByteLength = getByteLength( mipmap.width, mipmap.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tconst layerData = mipmap.data.subarray(\n\t\t\t\t\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData );\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataArrayTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\tconst layerByteLength = getByteLength( image.width, image.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\tconst layerData = image.data.subarray(\n\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / image.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlet width = image.width, height = image.height;\n\n\t\t\t\t\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t\t\t\t\twidth >>= 1;\n\t\t\t\t\t\t\theight >>= 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tconst dimensions = getDimensions( mipmaps[ 0 ] );\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tconst dimensions = getDimensions( image );\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( textureType );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tconst isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], true, capabilities.maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tglFormat = utils.convert( texture.format, texture.colorSpace ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tlet levels = getMipLevels( texture, image );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\t\tconst dimensions = getDimensions( cubeImage[ 0 ] );\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget, level ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tconst width = Math.max( 1, renderTarget.width >> level );\n\t\t\tconst height = Math.max( 1, renderTarget.height >> level );\n\n\t\t\tif ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, level );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t// retrieve the depth attachment types\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tconst depthType = depthTexture && depthTexture.isDepthTexture ? depthTexture.type : null;\n\t\t\tconst glInternalFormat = getInternalDepthFormat( renderTarget.stencilBuffer, depthType );\n\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t// set up the attachment\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\tconst isUseMultisampledRTT = useMultisampledRTT( renderTarget );\n\t\t\tif ( isUseMultisampledRTT ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( isMultisample ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\tconst textureProperties = properties.get( renderTarget.depthTexture );\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! textureProperties.__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = textureProperties.__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\t// if the bound depth texture has changed\n\t\tif ( renderTargetProperties.__boundDepthTexture !== renderTarget.depthTexture ) {\n\n\t\t\t// fire the dispose event to get rid of stored state associated with the previously bound depth buffer\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tif ( renderTargetProperties.__depthDisposeCallback ) {\n\n\t\t\t\trenderTargetProperties.__depthDisposeCallback();\n\n\t\t\t}\n\n\t\t\t// set up dispose listeners to track when the currently attached buffer is implicitly unbound\n\t\t\tif ( depthTexture ) {\n\n\t\t\t\tconst disposeEvent = () => {\n\n\t\t\t\t\tdelete renderTargetProperties.__boundDepthTexture;\n\t\t\t\t\tdelete renderTargetProperties.__depthDisposeCallback;\n\t\t\t\t\tdepthTexture.removeEventListener( 'dispose', disposeEvent );\n\n\t\t\t\t};\n\n\t\t\t\tdepthTexture.addEventListener( 'dispose', disposeEvent );\n\t\t\t\trenderTargetProperties.__depthDisposeCallback = disposeEvent;\n\n\t\t\t}\n\n\t\t\trenderTargetProperties.__boundDepthTexture = depthTexture;\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer[ 0 ], renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer[ i ] === undefined ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer[ i ];\n\t\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ 0 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer === undefined ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer;\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\tif ( ! isMultipleRenderTargets ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = [];\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = [];\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tconst texture = textures[ i ];\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, renderTarget.isXRRenderTarget === true );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindTexture( glTextureType, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( glTextureType, attachment );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, glTextureType, 0 );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment ) ) {\n\n\t\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture );\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tconst targetType = getTargetType( renderTarget );\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( targetType, webglTexture );\n\t\t\t\tgenerateMipmap( targetType );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst invalidationArrayRead = [];\n\tconst invalidationArrayDraw = [];\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( renderTarget.samples > 0 ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tconst textures = renderTarget.textures;\n\t\t\t\tconst width = renderTarget.width;\n\t\t\t\tconst height = renderTarget.height;\n\t\t\t\tlet mask = _gl.COLOR_BUFFER_BIT;\n\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\t\t\t// If MRT we need to remove FBO attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null );\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ 0 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTarget.resolveDepthBuffer ) {\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t\t\t\t// resolving stencil is slow with a D3D backend. disable it for all transmission render targets (see #27799)\n\n\t\t\t\t\t\tif ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );\n\n\t\t\t\t\tif ( supportsInvalidateFramebuffer === true ) {\n\n\t\t\t\t\t\tinvalidationArrayRead.length = 0;\n\t\t\t\t\t\tinvalidationArrayDraw.length = 0;\n\n\t\t\t\t\t\tinvalidationArrayRead.push( _gl.COLOR_ATTACHMENT0 + i );\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false ) {\n\n\t\t\t\t\t\t\tinvalidationArrayRead.push( depthStyle );\n\t\t\t\t\t\t\tinvalidationArrayDraw.push( depthStyle );\n\n\t\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, invalidationArrayDraw );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArrayRead );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t\t// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t} else {\n\n\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false && supportsInvalidateFramebuffer ) {\n\n\t\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn Math.min( capabilities.maxSamples, renderTarget.samples );\n\n\t}\n\n\tfunction useMultisampledRTT( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\treturn renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst colorSpace = texture.colorSpace;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true ) return image;\n\n\t\tif ( colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( ColorManagement.getTransfer( colorSpace ) === SRGBTransfer ) {\n\n\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\twarn( 'WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\terror( 'WebGLTextures: Unsupported texture color space:', colorSpace );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction getDimensions( image ) {\n\n\t\tif ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) {\n\n\t\t\t// if intrinsic data are not available, fallback to width/height\n\n\t\t\t_imageDimensions.width = image.naturalWidth || image.width;\n\t\t\t_imageDimensions.height = image.naturalHeight || image.height;\n\n\t\t} else if ( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) {\n\n\t\t\t_imageDimensions.width = image.displayWidth;\n\t\t\t_imageDimensions.height = image.displayHeight;\n\n\t\t} else {\n\n\t\t\t_imageDimensions.width = image.width;\n\t\t\t_imageDimensions.height = image.height;\n\n\t\t}\n\n\t\treturn _imageDimensions;\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\tthis.useMultisampledRTT = useMultisampledRTT;\n\n}\n\nfunction WebGLUtils( gl, extensions ) {\n\n\tfunction convert( p, colorSpace = NoColorSpace ) {\n\n\t\tlet extension;\n\n\t\tconst transfer = ColorManagement.getTransfer( colorSpace );\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\t\tif ( p === UnsignedInt5999Type ) return gl.UNSIGNED_INT_5_9_9_9_REV;\n\t\tif ( p === UnsignedInt101111Type ) return gl.UNSIGNED_INT_10F_11F_11F_REV;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\t\tif ( p === HalfFloatType ) return gl.HALF_FLOAT;\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBFormat ) return gl.RGB;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedFormat ) return gl.RED;\n\t\tif ( p === RedIntegerFormat ) return gl.RED_INTEGER;\n\t\tif ( p === RGFormat ) return gl.RG;\n\t\tif ( p === RGIntegerFormat ) return gl.RG_INTEGER;\n\t\tif ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( transfer === SRGBTransfer ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC\n\n\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\t\t\t\tif ( p === RGB_BPTC_SIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;\n\t\t\t\tif ( p === RGB_BPTC_UNSIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// RGTC\n\n\t\tif ( p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_rgtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RED_RGTC1_Format ) return extension.COMPRESSED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT;\n\t\t\t\tif ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) return gl.UNSIGNED_INT_24_8;\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nconst _occlusion_vertex = `\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}`;\n\nconst _occlusion_fragment = `\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}`;\n\n/**\n * A XR module that manages the access to the Depth Sensing API.\n */\nclass WebXRDepthSensing {\n\n\t/**\n\t * Constructs a new depth sensing module.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * An opaque texture representing the depth of the user's environment.\n\t\t *\n\t\t * @type {?ExternalTexture}\n\t\t */\n\t\tthis.texture = null;\n\n\t\t/**\n\t\t * A plane mesh for visualizing the depth texture.\n\t\t *\n\t\t * @type {?Mesh}\n\t\t */\n\t\tthis.mesh = null;\n\n\t\t/**\n\t\t * The depth near value.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.depthNear = 0;\n\n\t\t/**\n\t\t * The depth near far.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.depthFar = 0;\n\n\t}\n\n\t/**\n\t * Inits the depth sensing module\n\t *\n\t * @param {XRWebGLDepthInformation} depthData - The XR depth data.\n\t * @param {XRRenderState} renderState - The XR render state.\n\t */\n\tinit( depthData, renderState ) {\n\n\t\tif ( this.texture === null ) {\n\n\t\t\tconst texture = new ExternalTexture( depthData.texture );\n\n\t\t\tif ( ( depthData.depthNear !== renderState.depthNear ) || ( depthData.depthFar !== renderState.depthFar ) ) {\n\n\t\t\t\tthis.depthNear = depthData.depthNear;\n\t\t\t\tthis.depthFar = depthData.depthFar;\n\n\t\t\t}\n\n\t\t\tthis.texture = texture;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a plane mesh that visualizes the depth texture.\n\t *\n\t * @param {ArrayCamera} cameraXR - The XR camera.\n\t * @return {?Mesh} The plane mesh.\n\t */\n\tgetMesh( cameraXR ) {\n\n\t\tif ( this.texture !== null ) {\n\n\t\t\tif ( this.mesh === null ) {\n\n\t\t\t\tconst viewport = cameraXR.cameras[ 0 ].viewport;\n\t\t\t\tconst material = new ShaderMaterial( {\n\t\t\t\t\tvertexShader: _occlusion_vertex,\n\t\t\t\t\tfragmentShader: _occlusion_fragment,\n\t\t\t\t\tuniforms: {\n\t\t\t\t\t\tdepthColor: { value: this.texture },\n\t\t\t\t\t\tdepthWidth: { value: viewport.z },\n\t\t\t\t\t\tdepthHeight: { value: viewport.w }\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tthis.mesh = new Mesh( new PlaneGeometry( 20, 20 ), material );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this.mesh;\n\n\t}\n\n\t/**\n\t * Resets the module\n\t */\n\treset() {\n\n\t\tthis.texture = null;\n\t\tthis.mesh = null;\n\n\t}\n\n\t/**\n\t * Returns a texture representing the depth of the user's environment.\n\t *\n\t * @return {?ExternalTexture} The depth texture.\n\t */\n\tgetDepthTexture() {\n\n\t\treturn this.texture;\n\n\t}\n\n}\n\n/**\n * This class represents an abstraction of the WebXR Device API and is\n * internally used by {@link WebGLRenderer}. `WebXRManager` also provides a public\n * interface that allows users to enable/disable XR and perform XR related\n * tasks like for instance retrieving controllers.\n *\n * @augments EventDispatcher\n * @hideconstructor\n */\nclass WebXRManager extends EventDispatcher {\n\n\t/**\n\t * Constructs a new WebGL renderer.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGL2RenderingContext} gl - The rendering context.\n\t */\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\t// Set default foveation to maximum.\n\t\tlet foveation = 1.0;\n\t\tlet customReferenceSpace = null;\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet xrFrame = null;\n\n\t\tconst supportsGlBinding = typeof XRWebGLBinding !== 'undefined';\n\n\t\tconst depthSensing = new WebXRDepthSensing();\n\t\tconst cameraAccessTextures = {};\n\t\tconst attributes = gl.getContextAttributes();\n\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst controllerInputSources = [];\n\n\t\tconst currentSize = new Vector2();\n\t\tlet currentPixelRatio = null;\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraXR = new ArrayCamera();\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\t/**\n\t\t * Whether the manager's XR camera should be automatically updated or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.cameraAutoUpdate = true;\n\n\t\t/**\n\t\t * This flag notifies the renderer to be ready for XR rendering. Set it to `true`\n\t\t * if you are going to use XR in your app.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.enabled = false;\n\n\t\t/**\n\t\t * Whether XR presentation is active or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPresenting = false;\n\n\t\t/**\n\t\t * Returns a group representing the `target ray` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `target ray` space.\n\t\t */\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns a group representing the `grip` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * Note: If you want to show something in the user's hand AND offer a\n\t\t * pointing ray at the same time, you'll want to attached the handheld object\n\t\t * to the group returned by `getControllerGrip()` and the ray to the\n\t\t * group returned by `getController()`. The idea is to have two\n\t\t * different groups in two different coordinate spaces for the same WebXR\n\t\t * controller.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `grip` space.\n\t\t */\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns a group representing the `hand` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `hand` space.\n\t\t */\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controllerIndex = controllerInputSources.indexOf( event.inputSource );\n\n\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\tif ( controller !== undefined ) {\n\n\t\t\t\tcontroller.update( event.inputSource, event.frame, customReferenceSpace || referenceSpace );\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tsession.removeEventListener( 'select', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeeze', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezestart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezeend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'end', onSessionEnd );\n\t\t\tsession.removeEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\n\t\t\t\tif ( inputSource === null ) continue;\n\n\t\t\t\tcontrollerInputSources[ i ] = null;\n\n\t\t\t\tcontrollers[ i ].disconnect( inputSource );\n\n\t\t\t}\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\tdepthSensing.reset();\n\t\t\tfor ( const key in cameraAccessTextures ) {\n\n\t\t\t\tdelete cameraAccessTextures[ key ];\n\n\t\t\t}\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\trenderer.setPixelRatio( currentPixelRatio );\n\t\t\trenderer.setSize( currentSize.width, currentSize.height, false );\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\t/**\n\t\t * Sets the framebuffer scale factor.\n\t\t *\n\t\t * This method can not be used during a XR session.\n\t\t *\n\t\t * @param {number} value - The framebuffer scale factor.\n\t\t */\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\twarn( 'WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the reference space type. Can be used to configure a spatial relationship with the user's physical\n\t\t * environment. Depending on how the user moves in 3D space, setting an appropriate reference space can\n\t\t * improve tracking. Default is `local-floor`. Valid values can be found here\n\t\t * https://developer.mozilla.org/en-US/docs/Web/API/XRReferenceSpace#reference_space_types.\n\t\t *\n\t\t * This method can not be used during a XR session.\n\t\t *\n\t\t * @param {string} value - The reference space type.\n\t\t */\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\twarn( 'WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the XR reference space.\n\t\t *\n\t\t * @return {XRReferenceSpace} The XR reference space.\n\t\t */\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn customReferenceSpace || referenceSpace;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom XR reference space.\n\t\t *\n\t\t * @param {XRReferenceSpace} space - The XR reference space.\n\t\t */\n\t\tthis.setReferenceSpace = function ( space ) {\n\n\t\t\tcustomReferenceSpace = space;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current base layer.\n\t\t *\n\t\t * This is an `XRProjectionLayer` when the targeted XR device supports the\n\t\t * WebXR Layers API, or an `XRWebGLLayer` otherwise.\n\t\t *\n\t\t * @return {?(XRWebGLLayer|XRProjectionLayer)} The XR base layer.\n\t\t */\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR binding.\n\t\t *\n\t\t * Creates a new binding if needed and the browser is\n\t\t * capable of doing so.\n\t\t *\n\t\t * @return {?XRWebGLBinding} The XR binding. Returns `null` if one cannot be created.\n\t\t */\n\t\tthis.getBinding = function () {\n\n\t\t\tif ( glBinding === null && supportsGlBinding ) {\n\n\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t}\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR frame.\n\t\t *\n\t\t * @return {?XRFrame} The XR frame. Returns `null` when used outside a XR session.\n\t\t */\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR session.\n\t\t *\n\t\t * @return {?XRSession} The XR session. Returns `null` when used outside a XR session.\n\t\t */\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\t/**\n\t\t * After a XR session has been requested usually with one of the `*Button` modules, it\n\t\t * is injected into the renderer with this method. This method triggers the start of\n\t\t * the actual XR rendering.\n\t\t *\n\t\t * @async\n\t\t * @param {XRSession} value - The XR session to set.\n\t\t * @return {Promise} A Promise that resolves when the session has been set.\n\t\t */\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tcurrentPixelRatio = renderer.getPixelRatio();\n\t\t\t\trenderer.getSize( currentSize );\n\n\n\t\t\t\t// Check that the browser implements the necessary APIs to use an\n\t\t\t\t// XRProjectionLayer rather than an XRWebGLLayer\n\t\t\t\tconst supportsLayers = supportsGlBinding && 'createProjectionLayer' in XRWebGLBinding.prototype;\n\n\t\t\t\tif ( ! supportsLayers ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: attributes.antialias,\n\t\t\t\t\t\talpha: true,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glBaseLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glBaseLayer.ignoreDepthValues === false )\n\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: gl.RGBA8,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = this.getBinding();\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glProjLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glProjLayer.ignoreDepthValues === false )\n\t\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\tthis.setFoveation( foveation );\n\n\t\t\t\tcustomReferenceSpace = null;\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the environment blend mode from the current XR session.\n\t\t *\n\t\t * @return {'opaque'|'additive'|'alpha-blend'|undefined} The environment blend mode. Returns `undefined` when used outside of a XR session.\n\t\t */\n\t\tthis.getEnvironmentBlendMode = function () {\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\treturn session.environmentBlendMode;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current depth texture computed via depth sensing.\n\t\t *\n\t\t * See {@link WebXRDepthSensing#getDepthTexture}.\n\t\t *\n\t\t * @return {?Texture} The depth texture.\n\t\t */\n\t\tthis.getDepthTexture = function () {\n\n\t\t\treturn depthSensing.getDepthTexture();\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst index = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( index >= 0 ) {\n\n\t\t\t\t\tcontrollerInputSources[ index ] = null;\n\t\t\t\t\tcontrollers[ index ].disconnect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\n\t\t\t\tlet controllerIndex = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\t\t// Assign input source a controller that currently has no input source\n\n\t\t\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\t\t\tif ( i >= controllerInputSources.length ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources.push( inputSource );\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t} else if ( controllerInputSources[ i ] === null ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources[ i ] = inputSource;\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// If all controllers do currently receive input we ignore new ones\n\n\t\t\t\t\tif ( controllerIndex === -1 ) break;\n\n\t\t\t\t}\n\n\t\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.connect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t *\n\t\t * @param {ArrayCamera} camera - The camera to update.\n\t\t * @param {PerspectiveCamera} cameraL - The left camera.\n\t\t * @param {PerspectiveCamera} cameraR - The right camera.\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Check if the projection uses an infinite far plane.\n\t\t\tif ( projL[ 10 ] === -1 ) {\n\n\t\t\t\t// Use the projection matrix from the left eye.\n\t\t\t\t// The camera offset is sufficient to include the view volumes\n\t\t\t\t// of both eyes (assuming symmetric projections).\n\t\t\t\tcamera.projectionMatrix.copy( cameraL.projectionMatrix );\n\t\t\t\tcamera.projectionMatrixInverse.copy( cameraL.projectionMatrixInverse );\n\n\t\t\t} else {\n\n\t\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t\t// although must now be relative to the new union camera.\n\t\t\t\tconst near2 = near + zOffset;\n\t\t\t\tconst far2 = far + zOffset;\n\t\t\t\tconst left2 = left - xOffset;\n\t\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\t/**\n\t\t * Updates the state of the XR camera. Use this method on app level if you\n\t\t * set `cameraAutoUpdate` to `false`. The method requires the non-XR\n\t\t * camera of the scene as a parameter. The passed in camera's transformation\n\t\t * is automatically adjusted to the position of the XR camera when calling\n\t\t * this method.\n\t\t *\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tlet depthNear = camera.near;\n\t\t\tlet depthFar = camera.far;\n\n\t\t\tif ( depthSensing.texture !== null ) {\n\n\t\t\t\tif ( depthSensing.depthNear > 0 ) depthNear = depthSensing.depthNear;\n\t\t\t\tif ( depthSensing.depthFar > 0 ) depthFar = depthSensing.depthFar;\n\n\t\t\t}\n\n\t\t\tcameraXR.near = cameraR.near = cameraL.near = depthNear;\n\t\t\tcameraXR.far = cameraR.far = cameraL.far = depthFar;\n\n\t\t\tif ( _currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraXR.near,\n\t\t\t\t\tdepthFar: cameraXR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraXR.near;\n\t\t\t\t_currentDepthFar = cameraXR.far;\n\n\t\t\t}\n\n\t\t\t// inherit camera layers and enable eye layers (1 = left, 2 = right)\n\t\t\tcameraXR.layers.mask = camera.layers.mask | 0b110;\n\t\t\tcameraL.layers.mask = cameraXR.layers.mask & 0b011;\n\t\t\tcameraR.layers.mask = cameraXR.layers.mask & 0b101;\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraXR.cameras;\n\n\t\t\tupdateCamera( cameraXR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraXR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraXR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t\t// update user camera and its children\n\n\t\t\tupdateUserCamera( camera, cameraXR, parent );\n\n\t\t};\n\n\t\tfunction updateUserCamera( camera, cameraXR, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrix.copy( cameraXR.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrix.copy( parent.matrixWorld );\n\t\t\t\tcamera.matrix.invert();\n\t\t\t\tcamera.matrix.multiply( cameraXR.matrixWorld );\n\n\t\t\t}\n\n\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.updateMatrixWorld( true );\n\n\t\t\tcamera.projectionMatrix.copy( cameraXR.projectionMatrix );\n\t\t\tcamera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse );\n\n\t\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t\tcamera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] );\n\t\t\t\tcamera.zoom = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Returns an instance of {@link ArrayCamera} which represents the XR camera\n\t\t * of the active XR session. For each view it holds a separate camera object.\n\t\t *\n\t\t * The camera's `fov` is currently not used and does not reflect the fov of\n\t\t * the XR camera. If you need the fov on app level, you have to compute in\n\t\t * manually from the XR camera's projection matrices.\n\t\t *\n\t\t * @return {ArrayCamera} The XR camera.\n\t\t */\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraXR;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the amount of foveation used by the XR compositor for the projection layer.\n\t\t *\n\t\t * @return {number|undefined} The amount of foveation.\n\t\t */\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer === null && glBaseLayer === null ) {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\treturn foveation;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the foveation value.\n\t\t *\n\t\t * @param {number} value - A number in the range `[0,1]` where `0` means no foveation (full resolution)\n\t\t * and `1` means maximum foveation (the edges render at lower resolution).\n\t\t */\n\t\tthis.setFoveation = function ( value ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tfoveation = value;\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns `true` if depth sensing is supported.\n\t\t *\n\t\t * @return {boolean} Whether depth sensing is supported or not.\n\t\t */\n\t\tthis.hasDepthSensing = function () {\n\n\t\t\treturn depthSensing.texture !== null;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the depth sensing mesh.\n\t\t *\n\t\t * See {@link WebXRDepthSensing#getMesh}.\n\t\t *\n\t\t * @return {Mesh} The depth sensing mesh.\n\t\t */\n\t\tthis.getDepthSensingMesh = function () {\n\n\t\t\treturn depthSensing.getMesh( cameraXR );\n\n\t\t};\n\n\t\t/**\n\t\t * Retrieves an opaque texture from the view-aligned {@link XRCamera}.\n\t\t * Only available during the current animation loop.\n\t\t *\n\t\t * @param {XRCamera} xrCamera - The camera to query.\n\t\t * @return {?Texture} An opaque texture representing the current raw camera frame.\n\t\t */\n\t\tthis.getCameraTexture = function ( xrCamera ) {\n\n\t\t\treturn cameraAccessTextures[ xrCamera ];\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( customReferenceSpace || referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraXRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraXR's camera list\n\n\t\t\t\tif ( views.length !== cameraXR.cameras.length ) {\n\n\t\t\t\t\tcameraXR.cameras.length = 0;\n\t\t\t\t\tcameraXRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet camera = cameras[ i ];\n\n\t\t\t\t\tif ( camera === undefined ) {\n\n\t\t\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\t\t\tcamera.layers.enable( i );\n\t\t\t\t\t\tcamera.viewport = new Vector4();\n\t\t\t\t\t\tcameras[ i ] = camera;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraXR.matrix.copy( camera.matrix );\n\t\t\t\t\t\tcameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraXRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraXR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tconst enabledFeatures = session.enabledFeatures;\n\t\t\t\tconst gpuDepthSensingEnabled = enabledFeatures &&\n\t\t\t\t\tenabledFeatures.includes( 'depth-sensing' ) &&\n\t\t\t\t\tsession.depthUsage == 'gpu-optimized';\n\n\t\t\t\tif ( gpuDepthSensingEnabled && supportsGlBinding ) {\n\n\t\t\t\t\tglBinding = scope.getBinding();\n\n\t\t\t\t\tconst depthData = glBinding.getDepthInformation( views[ 0 ] );\n\n\t\t\t\t\tif ( depthData && depthData.isValid && depthData.texture ) {\n\n\t\t\t\t\t\tdepthSensing.init( depthData, session.renderState );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst cameraAccessEnabled = enabledFeatures &&\n\t\t\t\t enabledFeatures.includes( 'camera-access' );\n\n\t\t\t\tif ( cameraAccessEnabled && supportsGlBinding ) {\n\n\t\t\t\t\trenderer.state.unbindTexture();\n\n\t\t\t\t\tglBinding = scope.getBinding();\n\n\t\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\t\tconst camera = views[ i ].camera;\n\n\t\t\t\t\t\tif ( camera ) {\n\n\t\t\t\t\t\t\tlet cameraTex = cameraAccessTextures[ camera ];\n\n\t\t\t\t\t\t\tif ( ! cameraTex ) {\n\n\t\t\t\t\t\t\t\tcameraTex = new ExternalTexture();\n\t\t\t\t\t\t\t\tcameraAccessTextures[ camera ] = cameraTex;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst glTexture = glBinding.getCameraImage( camera );\n\t\t\t\t\t\t\tcameraTex.sourceTexture = glTexture;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\t\t\t\tconst controller = controllers[ i ];\n\n\t\t\t\tif ( inputSource !== null && controller !== undefined ) {\n\n\t\t\t\t\tcontroller.update( inputSource, frame, customReferenceSpace || referenceSpace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\tif ( frame.detectedPlanes ) {\n\n\t\t\t\tscope.dispatchEvent( { type: 'planesdetected', data: frame } );\n\n\t\t\t}\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nconst _e1 = /*@__PURE__*/ new Euler();\nconst _m1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLMaterials( renderer, properties ) {\n\n\tfunction refreshTransformUniform( map, uniform ) {\n\n\t\tif ( map.matrixAutoUpdate === true ) {\n\n\t\t\tmap.updateMatrix();\n\n\t\t}\n\n\t\tuniform.value.copy( map.matrix );\n\n\t}\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tfog.color.getRGB( uniforms.fogColor.value, getUnlitUniformColorSpace( renderer ) );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\n\t\t\trefreshTransformUniform( material.bumpMap, uniforms.bumpMapTransform );\n\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.bumpScale.value *= -1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\n\t\t\trefreshTransformUniform( material.normalMap, uniforms.normalMapTransform );\n\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.normalScale.value.negate();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\n\t\t\trefreshTransformUniform( material.displacementMap, uniforms.displacementMapTransform );\n\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\trefreshTransformUniform( material.emissiveMap, uniforms.emissiveMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t\trefreshTransformUniform( material.specularMap, uniforms.specularMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst envMap = materialProperties.envMap;\n\t\tconst envMapRotation = materialProperties.envMapRotation;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\t_e1.copy( envMapRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1.x *= -1; _e1.y *= -1; _e1.z *= -1;\n\n\t\t\tif ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1.y *= -1;\n\t\t\t\t_e1.z *= -1;\n\n\t\t\t}\n\n\t\t\tuniforms.envMapRotation.value.setFromMatrix4( _m1.makeRotationFromEuler( _e1 ) );\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\trefreshTransformUniform( material.lightMap, uniforms.lightMapTransform );\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\trefreshTransformUniform( material.aoMap, uniforms.aoMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.uvTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\trefreshTransformUniform( material.metalnessMap, uniforms.metalnessMapTransform );\n\n\t\t}\n\n\t\tuniforms.roughness.value = material.roughness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\trefreshTransformUniform( material.roughnessMap, uniforms.roughnessMapTransform );\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenColorMap, uniforms.sheenColorMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatMap, uniforms.clearcoatMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform );\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.dispersion > 0 ) {\n\n\t\t\tuniforms.dispersion.value = material.dispersion;\n\n\t\t}\n\n\t\tif ( material.iridescence > 0 ) {\n\n\t\t\tuniforms.iridescence.value = material.iridescence;\n\t\t\tuniforms.iridescenceIOR.value = material.iridescenceIOR;\n\t\t\tuniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[ 0 ];\n\t\t\tuniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[ 1 ];\n\n\t\t\tif ( material.iridescenceMap ) {\n\n\t\t\t\tuniforms.iridescenceMap.value = material.iridescenceMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceMap, uniforms.iridescenceMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\t\tuniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t\trefreshTransformUniform( material.transmissionMap, uniforms.transmissionMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.thicknessMap, uniforms.thicknessMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tif ( material.anisotropy > 0 ) {\n\n\t\t\tuniforms.anisotropyVector.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) );\n\n\t\t\tif ( material.anisotropyMap ) {\n\n\t\t\t\tuniforms.anisotropyMap.value = material.anisotropyMap;\n\n\t\t\t\trefreshTransformUniform( material.anisotropyMap, uniforms.anisotropyMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t\trefreshTransformUniform( material.specularColorMap, uniforms.specularColorMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t\trefreshTransformUniform( material.specularIntensityMap, uniforms.specularIntensityMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tconst light = properties.get( material ).light;\n\n\t\tuniforms.referencePosition.value.setFromMatrixPosition( light.matrixWorld );\n\t\tuniforms.nearDistance.value = light.shadow.camera.near;\n\t\tuniforms.farDistance.value = light.shadow.camera.far;\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction WebGLUniformsGroups( gl, info, capabilities, state ) {\n\n\tlet buffers = {};\n\tlet updateList = {};\n\tlet allocatedBindingPoints = [];\n\n\tconst maxBindingPoints = gl.getParameter( gl.MAX_UNIFORM_BUFFER_BINDINGS ); // binding points are global whereas block indices are per shader program\n\n\tfunction bind( uniformsGroup, program ) {\n\n\t\tconst webglProgram = program.program;\n\t\tstate.uniformBlockBinding( uniformsGroup, webglProgram );\n\n\t}\n\n\tfunction update( uniformsGroup, program ) {\n\n\t\tlet buffer = buffers[ uniformsGroup.id ];\n\n\t\tif ( buffer === undefined ) {\n\n\t\t\tprepareUniformsGroup( uniformsGroup );\n\n\t\t\tbuffer = createBuffer( uniformsGroup );\n\t\t\tbuffers[ uniformsGroup.id ] = buffer;\n\n\t\t\tuniformsGroup.addEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\t}\n\n\t\t// ensure to update the binding points/block indices mapping for this program\n\n\t\tconst webglProgram = program.program;\n\t\tstate.updateUBOMapping( uniformsGroup, webglProgram );\n\n\t\t// update UBO once per frame\n\n\t\tconst frame = info.render.frame;\n\n\t\tif ( updateList[ uniformsGroup.id ] !== frame ) {\n\n\t\t\tupdateBufferData( uniformsGroup );\n\n\t\t\tupdateList[ uniformsGroup.id ] = frame;\n\n\t\t}\n\n\t}\n\n\tfunction createBuffer( uniformsGroup ) {\n\n\t\t// the setup of an UBO is independent of a particular shader program but global\n\n\t\tconst bindingPointIndex = allocateBindingPointIndex();\n\t\tuniformsGroup.__bindingPointIndex = bindingPointIndex;\n\n\t\tconst buffer = gl.createBuffer();\n\t\tconst size = uniformsGroup.__size;\n\t\tconst usage = uniformsGroup.usage;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\t\tgl.bufferData( gl.UNIFORM_BUFFER, size, usage );\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\t\tgl.bindBufferBase( gl.UNIFORM_BUFFER, bindingPointIndex, buffer );\n\n\t\treturn buffer;\n\n\t}\n\n\tfunction allocateBindingPointIndex() {\n\n\t\tfor ( let i = 0; i < maxBindingPoints; i ++ ) {\n\n\t\t\tif ( allocatedBindingPoints.indexOf( i ) === -1 ) {\n\n\t\t\t\tallocatedBindingPoints.push( i );\n\t\t\t\treturn i;\n\n\t\t\t}\n\n\t\t}\n\n\t\terror( 'WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.' );\n\n\t\treturn 0;\n\n\t}\n\n\tfunction updateBufferData( uniformsGroup ) {\n\n\t\tconst buffer = buffers[ uniformsGroup.id ];\n\t\tconst uniforms = uniformsGroup.uniforms;\n\t\tconst cache = uniformsGroup.__cache;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\n\t\tfor ( let i = 0, il = uniforms.length; i < il; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tif ( hasUniformChanged( uniform, i, j, cache ) === true ) {\n\n\t\t\t\t\tconst offset = uniform.__offset;\n\n\t\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\t\tlet arrayOffset = 0;\n\n\t\t\t\t\tfor ( let k = 0; k < values.length; k ++ ) {\n\n\t\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\t\t// TODO add integer and struct support\n\t\t\t\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value;\n\t\t\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data );\n\n\t\t\t\t\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t\t\t\t\t// manually converting 3x3 to 3x4\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value.elements[ 0 ];\n\t\t\t\t\t\t\tuniform.__data[ 1 ] = value.elements[ 1 ];\n\t\t\t\t\t\t\tuniform.__data[ 2 ] = value.elements[ 2 ];\n\t\t\t\t\t\t\tuniform.__data[ 3 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 4 ] = value.elements[ 3 ];\n\t\t\t\t\t\t\tuniform.__data[ 5 ] = value.elements[ 4 ];\n\t\t\t\t\t\t\tuniform.__data[ 6 ] = value.elements[ 5 ];\n\t\t\t\t\t\t\tuniform.__data[ 7 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 8 ] = value.elements[ 6 ];\n\t\t\t\t\t\t\tuniform.__data[ 9 ] = value.elements[ 7 ];\n\t\t\t\t\t\t\tuniform.__data[ 10 ] = value.elements[ 8 ];\n\t\t\t\t\t\t\tuniform.__data[ 11 ] = 0;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvalue.toArray( uniform.__data, arrayOffset );\n\n\t\t\t\t\t\t\tarrayOffset += info.storage / Float32Array.BYTES_PER_ELEMENT;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\n\t}\n\n\tfunction hasUniformChanged( uniform, index, indexArray, cache ) {\n\n\t\tconst value = uniform.value;\n\t\tconst indexString = index + '_' + indexArray;\n\n\t\tif ( cache[ indexString ] === undefined ) {\n\n\t\t\t// cache entry does not exist so far\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tcache[ indexString ] = value;\n\n\t\t\t} else {\n\n\t\t\t\tcache[ indexString ] = value.clone();\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\tconst cachedObject = cache[ indexString ];\n\n\t\t\t// compare current value with cached entry\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tif ( cachedObject !== value ) {\n\n\t\t\t\t\tcache[ indexString ] = value;\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( cachedObject.equals( value ) === false ) {\n\n\t\t\t\t\tcachedObject.copy( value );\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction prepareUniformsGroup( uniformsGroup ) {\n\n\t\t// determine total buffer size according to the STD140 layout\n\t\t// Hint: STD140 is the only supported layout in WebGL 2\n\n\t\tconst uniforms = uniformsGroup.uniforms;\n\n\t\tlet offset = 0; // global buffer offset in bytes\n\t\tconst chunkSize = 16; // size of a chunk in bytes\n\n\t\tfor ( let i = 0, l = uniforms.length; i < l; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\tfor ( let k = 0, kl = values.length; k < kl; k ++ ) {\n\n\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\tconst chunkOffset = offset % chunkSize; // offset in the current chunk\n\t\t\t\t\tconst chunkPadding = chunkOffset % info.boundary; // required padding to match boundary\n\t\t\t\t\tconst chunkStart = chunkOffset + chunkPadding; // the start position in the current chunk for the data\n\n\t\t\t\t\toffset += chunkPadding;\n\n\t\t\t\t\t// Check for chunk overflow\n\t\t\t\t\tif ( chunkStart !== 0 && ( chunkSize - chunkStart ) < info.storage ) {\n\n\t\t\t\t\t\t// Add padding and adjust offset\n\t\t\t\t\t\toffset += ( chunkSize - chunkStart );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following two properties will be used for partial buffer updates\n\t\t\t\t\tuniform.__data = new Float32Array( info.storage / Float32Array.BYTES_PER_ELEMENT );\n\t\t\t\t\tuniform.__offset = offset;\n\n\t\t\t\t\t// Update the global offset\n\t\t\t\t\toffset += info.storage;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ensure correct final padding\n\n\t\tconst chunkOffset = offset % chunkSize;\n\n\t\tif ( chunkOffset > 0 ) offset += ( chunkSize - chunkOffset );\n\n\t\t//\n\n\t\tuniformsGroup.__size = offset;\n\t\tuniformsGroup.__cache = {};\n\n\t\treturn this;\n\n\t}\n\n\tfunction getUniformSize( value ) {\n\n\t\tconst info = {\n\t\t\tboundary: 0, // bytes\n\t\t\tstorage: 0 // bytes\n\t\t};\n\n\t\t// determine sizes according to STD140\n\n\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t// float/int/bool\n\n\t\t\tinfo.boundary = 4;\n\t\t\tinfo.storage = 4;\n\n\t\t} else if ( value.isVector2 ) {\n\n\t\t\t// vec2\n\n\t\t\tinfo.boundary = 8;\n\t\t\tinfo.storage = 8;\n\n\t\t} else if ( value.isVector3 || value.isColor ) {\n\n\t\t\t// vec3\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 12; // evil: vec3 must start on a 16-byte boundary but it only consumes 12 bytes\n\n\t\t} else if ( value.isVector4 ) {\n\n\t\t\t// vec4\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 16;\n\n\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t// mat3 (in STD140 a 3x3 matrix is represented as 3x4)\n\n\t\t\tinfo.boundary = 48;\n\t\t\tinfo.storage = 48;\n\n\t\t} else if ( value.isMatrix4 ) {\n\n\t\t\t// mat4\n\n\t\t\tinfo.boundary = 64;\n\t\t\tinfo.storage = 64;\n\n\t\t} else if ( value.isTexture ) {\n\n\t\t\twarn( 'WebGLRenderer: Texture samplers can not be part of an uniforms group.' );\n\n\t\t} else {\n\n\t\t\twarn( 'WebGLRenderer: Unsupported uniform value type.', value );\n\n\t\t}\n\n\t\treturn info;\n\n\t}\n\n\tfunction onUniformsGroupsDispose( event ) {\n\n\t\tconst uniformsGroup = event.target;\n\n\t\tuniformsGroup.removeEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\tconst index = allocatedBindingPoints.indexOf( uniformsGroup.__bindingPointIndex );\n\t\tallocatedBindingPoints.splice( index, 1 );\n\n\t\tgl.deleteBuffer( buffers[ uniformsGroup.id ] );\n\n\t\tdelete buffers[ uniformsGroup.id ];\n\t\tdelete updateList[ uniformsGroup.id ];\n\n\t}\n\n\tfunction dispose() {\n\n\t\tfor ( const id in buffers ) {\n\n\t\t\tgl.deleteBuffer( buffers[ id ] );\n\n\t\t}\n\n\t\tallocatedBindingPoints = [];\n\t\tbuffers = {};\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tbind: bind,\n\t\tupdate: update,\n\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Precomputed DFG LUT for Image-Based Lighting\n * Resolution: 32x32\n * Samples: 4096 per texel\n * Format: RG16F (2 half floats per texel: scale, bias)\n */\n\n\nconst DATA = new Uint16Array( [\n\t0x2cd9, 0x3b64, 0x2d0e, 0x3b43, 0x2e20, 0x3aa7, 0x3061, 0x39fb, 0x325e, 0x397c, 0x3454, 0x3908, 0x357d, 0x3893, 0x3698, 0x381e, 0x379d, 0x375b, 0x3845, 0x3689, 0x38af, 0x35ca, 0x390d, 0x351e, 0x395f, 0x3484, 0x39a8, 0x33f9, 0x39e6, 0x330a, 0x3a1c, 0x3239, 0x3a4b, 0x3183, 0x3a73, 0x30e5, 0x3a95, 0x305b, 0x3ab1, 0x2fc6, 0x3ac9, 0x2ef7, 0x3ade, 0x2e43, 0x3aee, 0x2da7, 0x3afc, 0x2d1f, 0x3b07, 0x2ca9, 0x3b10, 0x2c42, 0x3b17, 0x2bd1, 0x3b1c, 0x2b34, 0x3b1f, 0x2aaa, 0x3b22, 0x2a31, 0x3b23, 0x29c7, 0x3b23, 0x2968,\n\t0x32d4, 0x3a4b, 0x32dc, 0x3a45, 0x3308, 0x3a26, 0x3378, 0x39d0, 0x3425, 0x394a, 0x34c9, 0x38be, 0x359c, 0x383e, 0x3688, 0x3796, 0x3778, 0x36c4, 0x382f, 0x3603, 0x3898, 0x3553, 0x38f7, 0x34b3, 0x394b, 0x3424, 0x3994, 0x334c, 0x39d3, 0x326c, 0x3a08, 0x31a9, 0x3a35, 0x30fe, 0x3a5a, 0x306a, 0x3a78, 0x2fd1, 0x3a90, 0x2ef1, 0x3aa2, 0x2e2e, 0x3ab0, 0x2d86, 0x3aba, 0x2cf3, 0x3ac1, 0x2c74, 0x3ac4, 0x2c05, 0x3ac4, 0x2b49, 0x3ac2, 0x2aa1, 0x3abd, 0x2a0c, 0x3ab7, 0x298b, 0x3aaf, 0x2918, 0x3aa6, 0x28b3, 0x3a9b, 0x285a,\n\t0x3559, 0x3954, 0x355a, 0x3951, 0x3566, 0x3944, 0x3582, 0x391e, 0x35b6, 0x38d3, 0x360a, 0x386a, 0x3684, 0x37ed, 0x3720, 0x370d, 0x37d3, 0x3641, 0x3847, 0x3588, 0x38a3, 0x34e2, 0x38fa, 0x344d, 0x3948, 0x3391, 0x398d, 0x32a6, 0x39c8, 0x31d6, 0x39fa, 0x3121, 0x3a22, 0x3082, 0x3a43, 0x2ff0, 0x3a5c, 0x2f01, 0x3a6f, 0x2e32, 0x3a7c, 0x2d7e, 0x3a84, 0x2ce2, 0x3a87, 0x2c5b, 0x3a87, 0x2bcc, 0x3a83, 0x2b00, 0x3a7b, 0x2a4e, 0x3a71, 0x29b3, 0x3a66, 0x292c, 0x3a58, 0x28b4, 0x3a4b, 0x284b, 0x3a3d, 0x27dc, 0x3a2e, 0x2739,\n\t0x3709, 0x387c, 0x370a, 0x387b, 0x3710, 0x3874, 0x3720, 0x385f, 0x373d, 0x3834, 0x376a, 0x37e1, 0x37ac, 0x3732, 0x3805, 0x3675, 0x383f, 0x35bc, 0x3883, 0x3511, 0x38cb, 0x3476, 0x3912, 0x33d8, 0x3955, 0x32e2, 0x3991, 0x3208, 0x39c6, 0x3149, 0x39f1, 0x30a1, 0x3a15, 0x300f, 0x3a30, 0x2f21, 0x3a44, 0x2e45, 0x3a51, 0x2d87, 0x3a59, 0x2ce2, 0x3a5b, 0x2c53, 0x3a58, 0x2bb0, 0x3a52, 0x2ada, 0x3a49, 0x2a1f, 0x3a40, 0x297d, 0x3a34, 0x28f0, 0x3a25, 0x2874, 0x3a13, 0x2807, 0x3a00, 0x274e, 0x39eb, 0x26a6, 0x39d5, 0x2611,\n\t0x3840, 0x3780, 0x3840, 0x377e, 0x3842, 0x3776, 0x3846, 0x375e, 0x384f, 0x372a, 0x385b, 0x36d3, 0x386c, 0x3659, 0x3885, 0x35c7, 0x38a8, 0x352d, 0x38d4, 0x3497, 0x3906, 0x340c, 0x393b, 0x331a, 0x3970, 0x323a, 0x39a0, 0x3172, 0x39cb, 0x30c3, 0x39ef, 0x302a, 0x3a0c, 0x2f4a, 0x3a21, 0x2e63, 0x3a2f, 0x2d9b, 0x3a37, 0x2ced, 0x3a39, 0x2c57, 0x3a37, 0x2baa, 0x3a34, 0x2ac9, 0x3a2c, 0x2a05, 0x3a20, 0x295d, 0x3a11, 0x28ca, 0x39ff, 0x2849, 0x39eb, 0x27b2, 0x39d5, 0x26ed, 0x39be, 0x2640, 0x39a5, 0x25aa, 0x398b, 0x2523,\n\t0x38e2, 0x363b, 0x38e2, 0x363b, 0x38e3, 0x3635, 0x38e6, 0x3626, 0x38ea, 0x3606, 0x38f0, 0x35cd, 0x38f8, 0x3579, 0x3903, 0x350e, 0x3915, 0x3495, 0x392d, 0x3418, 0x394c, 0x3340, 0x3970, 0x3261, 0x3995, 0x3197, 0x39b8, 0x30e4, 0x39d8, 0x3046, 0x39f3, 0x2f76, 0x3a08, 0x2e86, 0x3a16, 0x2db5, 0x3a1e, 0x2cff, 0x3a22, 0x2c61, 0x3a24, 0x2bb3, 0x3a20, 0x2ac7, 0x3a17, 0x29fc, 0x3a0a, 0x294c, 0x39fa, 0x28b2, 0x39e7, 0x282e, 0x39d1, 0x2773, 0x39b9, 0x26a9, 0x399f, 0x25fa, 0x3985, 0x255f, 0x3968, 0x24d6, 0x394a, 0x245d,\n\t0x396e, 0x3524, 0x396e, 0x3524, 0x396e, 0x3520, 0x396f, 0x3517, 0x3971, 0x3502, 0x3973, 0x34dd, 0x3975, 0x34a5, 0x3978, 0x3458, 0x397e, 0x33f9, 0x3987, 0x3332, 0x3997, 0x326b, 0x39aa, 0x31ac, 0x39c0, 0x30fb, 0x39d7, 0x305c, 0x39eb, 0x2f9e, 0x39fc, 0x2ea7, 0x3a07, 0x2dcf, 0x3a0f, 0x2d13, 0x3a16, 0x2c70, 0x3a17, 0x2bc4, 0x3a14, 0x2ad0, 0x3a0a, 0x29fc, 0x39fd, 0x2945, 0x39ed, 0x28a6, 0x39d9, 0x281d, 0x39c2, 0x274a, 0x39a9, 0x267c, 0x398e, 0x25c7, 0x3971, 0x2528, 0x3952, 0x249e, 0x3931, 0x2425, 0x3910, 0x2374,\n\t0x39e5, 0x3436, 0x39e5, 0x3435, 0x39e5, 0x3434, 0x39e5, 0x342e, 0x39e5, 0x3420, 0x39e5, 0x3408, 0x39e3, 0x33c4, 0x39e1, 0x3359, 0x39df, 0x32d3, 0x39de, 0x323a, 0x39e1, 0x319a, 0x39e7, 0x30fb, 0x39f0, 0x3065, 0x39f9, 0x2fb6, 0x3a02, 0x2ec0, 0x3a08, 0x2de6, 0x3a0d, 0x2d26, 0x3a12, 0x2c7e, 0x3a13, 0x2bda, 0x3a0e, 0x2adc, 0x3a05, 0x2a02, 0x39f8, 0x2945, 0x39e7, 0x28a1, 0x39d3, 0x2813, 0x39bc, 0x2730, 0x39a2, 0x265c, 0x3985, 0x25a3, 0x3966, 0x2501, 0x3945, 0x2475, 0x3923, 0x23f3, 0x3901, 0x231c, 0x38dd, 0x225e,\n\t0x3a4b, 0x32d6, 0x3a4a, 0x32d6, 0x3a4a, 0x32d4, 0x3a4a, 0x32cc, 0x3a48, 0x32bb, 0x3a47, 0x329d, 0x3a43, 0x326b, 0x3a3d, 0x3222, 0x3a36, 0x31c2, 0x3a2e, 0x314f, 0x3a28, 0x30d2, 0x3a23, 0x3052, 0x3a20, 0x2fab, 0x3a1e, 0x2ec2, 0x3a1b, 0x2def, 0x3a19, 0x2d31, 0x3a1a, 0x2c89, 0x3a18, 0x2beb, 0x3a11, 0x2aea, 0x3a07, 0x2a0a, 0x39fa, 0x2948, 0x39e9, 0x28a1, 0x39d4, 0x280f, 0x39bd, 0x2721, 0x39a2, 0x2647, 0x3985, 0x258b, 0x3964, 0x24e5, 0x3942, 0x2455, 0x391f, 0x23b3, 0x38fb, 0x22d8, 0x38d4, 0x2219, 0x38ad, 0x2172,\n\t0x3aa0, 0x3180, 0x3aa0, 0x3180, 0x3aa0, 0x317f, 0x3a9f, 0x317b, 0x3a9d, 0x3170, 0x3a99, 0x315d, 0x3a95, 0x313d, 0x3a8d, 0x310c, 0x3a82, 0x30ca, 0x3a76, 0x3077, 0x3a69, 0x3019, 0x3a5c, 0x2f68, 0x3a4f, 0x2e9e, 0x3a42, 0x2dde, 0x3a37, 0x2d2b, 0x3a30, 0x2c89, 0x3a29, 0x2bef, 0x3a1f, 0x2af0, 0x3a12, 0x2a0f, 0x3a03, 0x294a, 0x39f1, 0x28a0, 0x39dc, 0x280c, 0x39c5, 0x2717, 0x39a9, 0x2638, 0x398b, 0x2578, 0x396a, 0x24d0, 0x3947, 0x243f, 0x3923, 0x2380, 0x38fc, 0x22a4, 0x38d4, 0x21e4, 0x38ac, 0x213c, 0x3883, 0x20a8,\n\t0x3ae8, 0x3062, 0x3ae8, 0x3062, 0x3ae7, 0x3061, 0x3ae6, 0x305f, 0x3ae4, 0x305a, 0x3ae0, 0x304f, 0x3ada, 0x303b, 0x3ad1, 0x301b, 0x3ac5, 0x2fdd, 0x3ab6, 0x2f6a, 0x3aa4, 0x2ede, 0x3a91, 0x2e45, 0x3a7c, 0x2da5, 0x3a67, 0x2d0a, 0x3a57, 0x2c77, 0x3a48, 0x2bdc, 0x3a38, 0x2ae5, 0x3a27, 0x2a0a, 0x3a16, 0x2947, 0x3a02, 0x289d, 0x39eb, 0x2808, 0x39d3, 0x270d, 0x39b6, 0x262b, 0x3997, 0x256a, 0x3976, 0x24bf, 0x3952, 0x242b, 0x392d, 0x2358, 0x3904, 0x227a, 0x38db, 0x21b8, 0x38b2, 0x2110, 0x3887, 0x207d, 0x385b, 0x1ff6,\n\t0x3b23, 0x2ee8, 0x3b23, 0x2ee8, 0x3b22, 0x2ee8, 0x3b21, 0x2ee7, 0x3b1f, 0x2ee3, 0x3b1a, 0x2ed6, 0x3b14, 0x2ec1, 0x3b0b, 0x2e99, 0x3afe, 0x2e60, 0x3aee, 0x2e12, 0x3ad8, 0x2dad, 0x3ac1, 0x2d3d, 0x3aa5, 0x2cc3, 0x3a8b, 0x2c48, 0x3a76, 0x2ba2, 0x3a60, 0x2ac0, 0x3a49, 0x29f2, 0x3a32, 0x2938, 0x3a1b, 0x2893, 0x3a02, 0x27ff, 0x39e8, 0x26ff, 0x39ca, 0x261e, 0x39aa, 0x255b, 0x3988, 0x24b0, 0x3964, 0x241c, 0x393d, 0x2336, 0x3913, 0x2257, 0x38e9, 0x2195, 0x38be, 0x20eb, 0x3891, 0x2059, 0x3864, 0x1fae, 0x3837, 0x1ecd,\n\t0x3b54, 0x2d61, 0x3b54, 0x2d61, 0x3b53, 0x2d61, 0x3b52, 0x2d62, 0x3b4f, 0x2d61, 0x3b4b, 0x2d5c, 0x3b45, 0x2d51, 0x3b3b, 0x2d3d, 0x3b2e, 0x2d1a, 0x3b1d, 0x2ce7, 0x3b06, 0x2ca3, 0x3aeb, 0x2c52, 0x3acb, 0x2bee, 0x3ab0, 0x2b31, 0x3a94, 0x2a74, 0x3a77, 0x29bf, 0x3a5a, 0x2915, 0x3a3f, 0x287a, 0x3a22, 0x27de, 0x3a05, 0x26e4, 0x39e5, 0x2609, 0x39c3, 0x2547, 0x39a0, 0x249f, 0x397b, 0x240c, 0x3953, 0x2314, 0x3928, 0x2238, 0x38fd, 0x2175, 0x38d0, 0x20cb, 0x38a2, 0x2038, 0x3873, 0x1f71, 0x3844, 0x1e90, 0x3815, 0x1dce,\n\t0x3b7c, 0x2c22, 0x3b7c, 0x2c22, 0x3b7b, 0x2c23, 0x3b7a, 0x2c25, 0x3b77, 0x2c27, 0x3b73, 0x2c26, 0x3b6d, 0x2c23, 0x3b64, 0x2c1a, 0x3b57, 0x2c07, 0x3b46, 0x2bd1, 0x3b2e, 0x2b79, 0x3b0f, 0x2b07, 0x3aef, 0x2a86, 0x3ad1, 0x29f8, 0x3ab0, 0x2967, 0x3a8e, 0x28d7, 0x3a6d, 0x284e, 0x3a4c, 0x279f, 0x3a2b, 0x26b7, 0x3a08, 0x25e5, 0x39e4, 0x252c, 0x39be, 0x2488, 0x3998, 0x23f0, 0x396f, 0x22f2, 0x3943, 0x2215, 0x3917, 0x2155, 0x38e8, 0x20ae, 0x38b9, 0x201c, 0x3888, 0x1f38, 0x3857, 0x1e5a, 0x3826, 0x1d9a, 0x37eb, 0x1cf0,\n\t0x3b9c, 0x2a43, 0x3b9c, 0x2a43, 0x3b9b, 0x2a46, 0x3b9a, 0x2a4a, 0x3b98, 0x2a50, 0x3b93, 0x2a54, 0x3b8e, 0x2a59, 0x3b85, 0x2a56, 0x3b79, 0x2a45, 0x3b67, 0x2a24, 0x3b4f, 0x29ee, 0x3b2f, 0x29a4, 0x3b10, 0x294b, 0x3aef, 0x28e5, 0x3ac9, 0x2877, 0x3aa4, 0x2809, 0x3a7e, 0x2739, 0x3a59, 0x266d, 0x3a34, 0x25af, 0x3a0c, 0x2503, 0x39e4, 0x2468, 0x39bb, 0x23bb, 0x3990, 0x22c6, 0x3963, 0x21f0, 0x3936, 0x2133, 0x3906, 0x208f, 0x38d5, 0x1ffd, 0x38a3, 0x1f04, 0x3870, 0x1e28, 0x383d, 0x1d69, 0x380b, 0x1cc3, 0x37b0, 0x1c32,\n\t0x3bb5, 0x28aa, 0x3bb5, 0x28ab, 0x3bb5, 0x28ad, 0x3bb4, 0x28b2, 0x3bb2, 0x28b9, 0x3bae, 0x28c2, 0x3ba8, 0x28ca, 0x3ba0, 0x28d1, 0x3b94, 0x28cd, 0x3b83, 0x28c1, 0x3b6a, 0x28a3, 0x3b4b, 0x2876, 0x3b2d, 0x283d, 0x3b09, 0x27ea, 0x3ae1, 0x274b, 0x3ab9, 0x26a6, 0x3a8f, 0x25fe, 0x3a67, 0x255d, 0x3a3d, 0x24c5, 0x3a11, 0x2439, 0x39e6, 0x2371, 0x39b9, 0x228d, 0x398a, 0x21c1, 0x395a, 0x210b, 0x3929, 0x206c, 0x38f7, 0x1fc1, 0x38c3, 0x1ecb, 0x388f, 0x1df6, 0x385a, 0x1d3a, 0x3825, 0x1c99, 0x37e1, 0x1c08, 0x3779, 0x1b1b,\n\t0x3bc9, 0x26d3, 0x3bc9, 0x26d4, 0x3bc9, 0x26d9, 0x3bc8, 0x26e3, 0x3bc6, 0x26ef, 0x3bc2, 0x2705, 0x3bbd, 0x271a, 0x3bb6, 0x2731, 0x3baa, 0x273c, 0x3b9a, 0x273d, 0x3b81, 0x2726, 0x3b65, 0x26f7, 0x3b46, 0x26af, 0x3b20, 0x2650, 0x3af7, 0x25e1, 0x3acd, 0x256a, 0x3aa1, 0x24eb, 0x3a75, 0x246f, 0x3a46, 0x23ee, 0x3a17, 0x230d, 0x39e9, 0x223e, 0x39b7, 0x2183, 0x3985, 0x20d8, 0x3953, 0x2043, 0x391e, 0x1f7a, 0x38e9, 0x1e8d, 0x38b3, 0x1dbf, 0x387c, 0x1d0b, 0x3845, 0x1c6c, 0x380e, 0x1bc4, 0x37b0, 0x1ad2, 0x3745, 0x19fd,\n\t0x3bd9, 0x24e4, 0x3bd9, 0x24e5, 0x3bd9, 0x24e8, 0x3bd8, 0x24f2, 0x3bd5, 0x24fe, 0x3bd2, 0x2512, 0x3bce, 0x252b, 0x3bc6, 0x2544, 0x3bbc, 0x255a, 0x3bac, 0x256b, 0x3b93, 0x2569, 0x3b7a, 0x2557, 0x3b5b, 0x252f, 0x3b34, 0x24f7, 0x3b0c, 0x24ad, 0x3adf, 0x2458, 0x3ab1, 0x23f8, 0x3a82, 0x233f, 0x3a4f, 0x2286, 0x3a1e, 0x21d5, 0x39eb, 0x2130, 0x39b6, 0x2098, 0x3982, 0x200e, 0x394b, 0x1f25, 0x3914, 0x1e45, 0x38dc, 0x1d83, 0x38a3, 0x1cd6, 0x386b, 0x1c3d, 0x3831, 0x1b71, 0x37f2, 0x1a87, 0x3782, 0x19bc, 0x3714, 0x1909,\n\t0x3be5, 0x22d8, 0x3be5, 0x22d9, 0x3be4, 0x22df, 0x3be4, 0x22ef, 0x3be1, 0x2305, 0x3bde, 0x232a, 0x3bda, 0x2358, 0x3bd4, 0x2392, 0x3bcb, 0x23ca, 0x3bbb, 0x23f4, 0x3ba3, 0x2405, 0x3b8c, 0x2405, 0x3b6c, 0x23ec, 0x3b47, 0x23ae, 0x3b1d, 0x2353, 0x3af0, 0x22e2, 0x3ac0, 0x2261, 0x3a8e, 0x21d9, 0x3a5a, 0x214e, 0x3a26, 0x20c7, 0x39ee, 0x2045, 0x39b7, 0x1f97, 0x397f, 0x1eba, 0x3945, 0x1df0, 0x390b, 0x1d3a, 0x38d0, 0x1c9a, 0x3895, 0x1c0a, 0x385a, 0x1b18, 0x381f, 0x1a39, 0x37c9, 0x1975, 0x3756, 0x18cc, 0x36e6, 0x1836,\n\t0x3bed, 0x20a8, 0x3bed, 0x20a9, 0x3bed, 0x20ae, 0x3bed, 0x20bb, 0x3beb, 0x20cf, 0x3be8, 0x20ef, 0x3be4, 0x2119, 0x3bde, 0x214f, 0x3bd6, 0x2189, 0x3bc6, 0x21b8, 0x3bb1, 0x21de, 0x3b9a, 0x21f2, 0x3b7b, 0x21f2, 0x3b57, 0x21d8, 0x3b2d, 0x21a4, 0x3b00, 0x215f, 0x3acf, 0x2108, 0x3a99, 0x20a8, 0x3a64, 0x2043, 0x3a2c, 0x1fba, 0x39f2, 0x1ef3, 0x39b8, 0x1e36, 0x397c, 0x1d86, 0x3940, 0x1ce5, 0x3903, 0x1c52, 0x38c6, 0x1b9e, 0x3888, 0x1ab3, 0x384a, 0x19e4, 0x380e, 0x192b, 0x37a3, 0x188b, 0x372d, 0x17f7, 0x36ba, 0x1701,\n\t0x3bf4, 0x1e23, 0x3bf4, 0x1e25, 0x3bf4, 0x1e2d, 0x3bf3, 0x1e41, 0x3bf1, 0x1e64, 0x3bef, 0x1e9c, 0x3beb, 0x1ee1, 0x3be6, 0x1f40, 0x3bde, 0x1fa7, 0x3bce, 0x2001, 0x3bbd, 0x202f, 0x3ba6, 0x204e, 0x3b88, 0x205f, 0x3b64, 0x205b, 0x3b3b, 0x2044, 0x3b0e, 0x201f, 0x3adb, 0x1fcf, 0x3aa6, 0x1f4e, 0x3a6e, 0x1ec1, 0x3a33, 0x1e2b, 0x39f7, 0x1d95, 0x39ba, 0x1d06, 0x397b, 0x1c7d, 0x393c, 0x1bfc, 0x38fc, 0x1b13, 0x38bc, 0x1a40, 0x387c, 0x1983, 0x383c, 0x18da, 0x37fa, 0x1842, 0x377f, 0x177f, 0x3706, 0x1695, 0x3691, 0x15c8,\n\t0x3bf8, 0x1bca, 0x3bf8, 0x1bcc, 0x3bf8, 0x1bd8, 0x3bf8, 0x1bf7, 0x3bf6, 0x1c1b, 0x3bf4, 0x1c45, 0x3bf1, 0x1c83, 0x3bec, 0x1cce, 0x3be4, 0x1d21, 0x3bd5, 0x1d78, 0x3bc5, 0x1dd1, 0x3bb0, 0x1e17, 0x3b93, 0x1e4a, 0x3b70, 0x1e5f, 0x3b48, 0x1e57, 0x3b1b, 0x1e35, 0x3ae7, 0x1df6, 0x3ab2, 0x1da4, 0x3a77, 0x1d44, 0x3a3a, 0x1cdb, 0x39fc, 0x1c6e, 0x39bb, 0x1c03, 0x397a, 0x1b35, 0x3938, 0x1a72, 0x38f5, 0x19bb, 0x38b3, 0x1914, 0x3870, 0x187d, 0x382e, 0x17eb, 0x37db, 0x16f9, 0x375c, 0x1621, 0x36e1, 0x1565, 0x3669, 0x14be,\n\t0x3bfb, 0x18b9, 0x3bfb, 0x18ba, 0x3bfb, 0x18c3, 0x3bfb, 0x18da, 0x3bf9, 0x190a, 0x3bf7, 0x1948, 0x3bf5, 0x19ac, 0x3bf0, 0x1a20, 0x3be9, 0x1ab3, 0x3bdb, 0x1b49, 0x3bcd, 0x1be6, 0x3bb7, 0x1c34, 0x3b9c, 0x1c6d, 0x3b7a, 0x1c8e, 0x3b54, 0x1c9e, 0x3b26, 0x1c96, 0x3af2, 0x1c75, 0x3abc, 0x1c47, 0x3a80, 0x1c09, 0x3a42, 0x1b85, 0x3a01, 0x1aec, 0x39be, 0x1a50, 0x397a, 0x19b5, 0x3935, 0x1921, 0x38f0, 0x1895, 0x38aa, 0x1814, 0x3866, 0x173a, 0x3821, 0x1665, 0x37be, 0x15a4, 0x373c, 0x14f9, 0x36be, 0x1460, 0x3644, 0x13b3,\n\t0x3bfd, 0x156b, 0x3bfd, 0x156c, 0x3bfd, 0x1578, 0x3bfd, 0x1598, 0x3bfc, 0x15dd, 0x3bfa, 0x163c, 0x3bf7, 0x16cb, 0x3bf3, 0x177b, 0x3beb, 0x1833, 0x3be0, 0x18ad, 0x3bd2, 0x192e, 0x3bbd, 0x19a6, 0x3ba4, 0x1a0c, 0x3b83, 0x1a5a, 0x3b5d, 0x1a8c, 0x3b30, 0x1a9b, 0x3afd, 0x1a86, 0x3ac6, 0x1a5c, 0x3a89, 0x1a11, 0x3a49, 0x19b7, 0x3a06, 0x194f, 0x39c1, 0x18e3, 0x397a, 0x1873, 0x3933, 0x1805, 0x38eb, 0x173a, 0x38a3, 0x1676, 0x385c, 0x15bf, 0x3816, 0x1519, 0x37a2, 0x1482, 0x371d, 0x13f7, 0x369c, 0x1306, 0x3620, 0x1231,\n\t0x3bff, 0x11cb, 0x3bff, 0x11cd, 0x3bfe, 0x11dd, 0x3bfe, 0x1219, 0x3bfd, 0x126b, 0x3bfb, 0x12e9, 0x3bf9, 0x13c5, 0x3bf5, 0x1460, 0x3bee, 0x150f, 0x3be3, 0x15c9, 0x3bd6, 0x168a, 0x3bc3, 0x174f, 0x3baa, 0x1806, 0x3b8b, 0x184f, 0x3b66, 0x1888, 0x3b39, 0x18a6, 0x3b07, 0x18ad, 0x3acf, 0x189c, 0x3a92, 0x1876, 0x3a50, 0x1840, 0x3a0c, 0x17fd, 0x39c4, 0x176a, 0x397b, 0x16ce, 0x3931, 0x1634, 0x38e6, 0x1599, 0x389c, 0x1508, 0x3852, 0x147f, 0x380a, 0x1401, 0x3788, 0x131c, 0x36ff, 0x124a, 0x367c, 0x1190, 0x35fe, 0x10ea,\n\t0x3bff, 0x0daa, 0x3bff, 0x0dad, 0x3bff, 0x0dc0, 0x3bff, 0x0e0e, 0x3bfe, 0x0e87, 0x3bfc, 0x0f14, 0x3bfb, 0x1029, 0x3bf7, 0x10d1, 0x3bf0, 0x11d3, 0x3be6, 0x12c9, 0x3bd9, 0x13fc, 0x3bc7, 0x1499, 0x3bb0, 0x152a, 0x3b92, 0x15ab, 0x3b6e, 0x1615, 0x3b42, 0x165a, 0x3b10, 0x1681, 0x3ad8, 0x1683, 0x3a9a, 0x1665, 0x3a57, 0x1629, 0x3a11, 0x15dd, 0x39c8, 0x1580, 0x397c, 0x1518, 0x3930, 0x14ae, 0x38e3, 0x1441, 0x3896, 0x13b1, 0x384a, 0x12e9, 0x37ff, 0x122f, 0x376f, 0x1182, 0x36e3, 0x10e5, 0x365e, 0x1057, 0x35de, 0x0fac,\n\t0x3c00, 0x08ea, 0x3c00, 0x08ed, 0x3c00, 0x0902, 0x3c00, 0x0961, 0x3bff, 0x09f3, 0x3bfd, 0x0abc, 0x3bfb, 0x0c1f, 0x3bf8, 0x0d15, 0x3bf1, 0x0e5b, 0x3be8, 0x0fb4, 0x3bdc, 0x10b0, 0x3bcb, 0x1190, 0x3bb5, 0x126c, 0x3b97, 0x132c, 0x3b74, 0x13de, 0x3b4a, 0x1432, 0x3b18, 0x145e, 0x3ae0, 0x1472, 0x3aa2, 0x146f, 0x3a5f, 0x1456, 0x3a17, 0x142e, 0x39cc, 0x13ee, 0x397e, 0x136b, 0x392f, 0x12e1, 0x38df, 0x124f, 0x3890, 0x11bd, 0x3842, 0x1131, 0x37eb, 0x10ac, 0x3757, 0x102e, 0x36c9, 0x0f76, 0x3640, 0x0ea3, 0x35bf, 0x0de4,\n\t0x3c00, 0x039b, 0x3c00, 0x039d, 0x3c00, 0x03b2, 0x3c00, 0x041c, 0x3bff, 0x04be, 0x3bfd, 0x05d6, 0x3bfc, 0x0764, 0x3bf8, 0x08e2, 0x3bf2, 0x0a67, 0x3bea, 0x0c1b, 0x3bde, 0x0d41, 0x3bcd, 0x0e5f, 0x3bb8, 0x0f8c, 0x3b9c, 0x1057, 0x3b7a, 0x10e5, 0x3b51, 0x1155, 0x3b20, 0x11a5, 0x3ae8, 0x11da, 0x3aaa, 0x11ef, 0x3a66, 0x11e5, 0x3a1d, 0x11c1, 0x39d0, 0x1185, 0x3980, 0x113b, 0x392e, 0x10e5, 0x38dc, 0x1087, 0x388b, 0x1028, 0x383b, 0x0f94, 0x37d9, 0x0edb, 0x3741, 0x0e2c, 0x36af, 0x0d89, 0x3625, 0x0cf2, 0x35a1, 0x0c69,\n\t0x3c00, 0x0107, 0x3c00, 0x0108, 0x3c00, 0x0110, 0x3c00, 0x0145, 0x3bff, 0x0197, 0x3bfe, 0x0224, 0x3bfc, 0x030c, 0x3bf8, 0x0478, 0x3bf3, 0x062c, 0x3beb, 0x0833, 0x3be0, 0x0979, 0x3bd0, 0x0aeb, 0x3bbc, 0x0c3d, 0x3ba0, 0x0d01, 0x3b80, 0x0dbd, 0x3b57, 0x0e69, 0x3b27, 0x0eeb, 0x3af0, 0x0f53, 0x3ab1, 0x0f8a, 0x3a6c, 0x0f9f, 0x3a22, 0x0f8b, 0x39d4, 0x0f5b, 0x3982, 0x0f0f, 0x392f, 0x0eac, 0x38da, 0x0e3d, 0x3886, 0x0dc9, 0x3834, 0x0d51, 0x37c7, 0x0cd9, 0x372c, 0x0c65, 0x3697, 0x0bef, 0x360a, 0x0b20, 0x3585, 0x0a62,\n\t0x3c00, 0x0031, 0x3c00, 0x0031, 0x3c00, 0x0034, 0x3c00, 0x004b, 0x3bff, 0x006f, 0x3bfe, 0x00c9, 0x3bfc, 0x011b, 0x3bf9, 0x0207, 0x3bf4, 0x02d6, 0x3bec, 0x0415, 0x3be1, 0x0587, 0x3bd2, 0x0703, 0x3bbf, 0x087d, 0x3ba5, 0x096a, 0x3b85, 0x0a59, 0x3b5d, 0x0b32, 0x3b2e, 0x0bee, 0x3af7, 0x0c44, 0x3ab8, 0x0c7c, 0x3a73, 0x0c9c, 0x3a28, 0x0ca4, 0x39d8, 0x0c98, 0x3985, 0x0c77, 0x392f, 0x0c4a, 0x38d9, 0x0c10, 0x3882, 0x0ba0, 0x382e, 0x0b14, 0x37b6, 0x0a84, 0x3717, 0x09f5, 0x3680, 0x0969, 0x35f0, 0x08e6, 0x356a, 0x086a,\n\t0x3c00, 0x0004, 0x3c00, 0x0004, 0x3c00, 0x0004, 0x3c00, 0x000d, 0x3bff, 0x0021, 0x3bfe, 0x003b, 0x3bfd, 0x0070, 0x3bf9, 0x00c7, 0x3bf4, 0x012e, 0x3bed, 0x01c8, 0x3be3, 0x0274, 0x3bd4, 0x033b, 0x3bc1, 0x043a, 0x3ba8, 0x0534, 0x3b89, 0x0641, 0x3b62, 0x073b, 0x3b34, 0x0815, 0x3afd, 0x087c, 0x3abf, 0x08d0, 0x3a7a, 0x090a, 0x3a2e, 0x092c, 0x39dd, 0x0936, 0x3988, 0x0928, 0x3930, 0x0907, 0x38d7, 0x08d7, 0x387f, 0x089b, 0x3828, 0x0855, 0x37a7, 0x080b, 0x3704, 0x077b, 0x366a, 0x06e1, 0x35d8, 0x0649, 0x3550, 0x05b8,\n\t0x3c00, 0x0000, 0x3c00, 0x0000, 0x3c00, 0x0000, 0x3c00, 0x0003, 0x3bff, 0x0012, 0x3bfe, 0x001a, 0x3bfd, 0x0035, 0x3bfa, 0x0050, 0x3bf4, 0x0061, 0x3bed, 0x00a5, 0x3be4, 0x00ee, 0x3bd6, 0x0146, 0x3bc3, 0x01ab, 0x3bab, 0x0211, 0x3b8d, 0x028e, 0x3b67, 0x0303, 0x3b39, 0x0375, 0x3b04, 0x03e2, 0x3ac6, 0x0441, 0x3a80, 0x0492, 0x3a34, 0x04cd, 0x39e1, 0x04f2, 0x398b, 0x0504, 0x3931, 0x0502, 0x38d6, 0x04ec, 0x387c, 0x04c7, 0x3822, 0x0496, 0x3798, 0x045c, 0x36f2, 0x041a, 0x3655, 0x03d5, 0x35c1, 0x038e, 0x3537, 0x0347\n] );\n\nlet lut = null;\n\nfunction getDFGLUT() {\n\n\tif ( lut === null ) {\n\n\t\tlut = new DataTexture( DATA, 32, 32, RGFormat, HalfFloatType );\n\t\tlut.minFilter = LinearFilter;\n\t\tlut.magFilter = LinearFilter;\n\t\tlut.wrapS = ClampToEdgeWrapping;\n\t\tlut.wrapT = ClampToEdgeWrapping;\n\t\tlut.generateMipmaps = false;\n\t\tlut.needsUpdate = true;\n\n\t}\n\n\treturn lut;\n\n}\n\n/**\n * This renderer uses WebGL 2 to display scenes.\n *\n * WebGL 1 is not supported since `r163`.\n */\nclass WebGLRenderer {\n\n\t/**\n\t * Constructs a new WebGL renderer.\n\t *\n\t * @param {WebGLRenderer~Options} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tconst {\n\t\t\tcanvas = createCanvasElement(),\n\t\t\tcontext = null,\n\t\t\tdepth = true,\n\t\t\tstencil = false,\n\t\t\talpha = false,\n\t\t\tantialias = false,\n\t\t\tpremultipliedAlpha = true,\n\t\t\tpreserveDrawingBuffer = false,\n\t\t\tpowerPreference = 'default',\n\t\t\tfailIfMajorPerformanceCaveat = false,\n\t\t\treversedDepthBuffer = false,\n\t\t} = parameters;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLRenderer = true;\n\n\t\tlet _alpha;\n\n\t\tif ( context !== null ) {\n\n\t\t\tif ( typeof WebGLRenderingContext !== 'undefined' && context instanceof WebGLRenderingContext ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer: WebGL 1 is not supported since r163.' );\n\n\t\t\t}\n\n\t\t\t_alpha = context.getContextAttributes().alpha;\n\n\t\t} else {\n\n\t\t\t_alpha = alpha;\n\n\t\t}\n\n\t\tconst INTEGER_FORMATS = new Set( [\n\t\t\tRGBAIntegerFormat,\n\t\t\tRGIntegerFormat,\n\t\t\tRedIntegerFormat\n\t\t] );\n\n\t\tconst UNSIGNED_TYPES = new Set( [\n\t\t\tUnsignedByteType,\n\t\t\tUnsignedIntType,\n\t\t\tUnsignedShortType,\n\t\t\tUnsignedInt248Type,\n\t\t\tUnsignedShort4444Type,\n\t\t\tUnsignedShort5551Type\n\t\t] );\n\n\t\tconst uintClearColor = new Uint32Array( 4 );\n\t\tconst intClearColor = new Int32Array( 4 );\n\n\t\tlet currentRenderList = null;\n\t\tlet currentRenderState = null;\n\n\t\t// render() can be called from within a callback triggered by another render.\n\t\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\t\tconst renderListStack = [];\n\t\tconst renderStateStack = [];\n\n\t\t// public properties\n\n\t\t/**\n\t\t * A canvas where the renderer draws its output.This is automatically created by the renderer\n\t\t * in the constructor (if not provided already); you just need to add it to your page like so:\n\t\t * ```js\n\t\t * document.body.appendChild( renderer.domElement );\n\t\t * ```\n\t\t *\n\t\t * @type {HTMLCanvasElement|OffscreenCanvas}\n\t\t */\n\t\tthis.domElement = canvas;\n\n\t\t/**\n\t\t * A object with debug configuration settings.\n\t\t *\n\t\t * - `checkShaderErrors`: If it is `true`, defines whether material shader programs are\n\t\t * checked for errors during compilation and linkage process. It may be useful to disable\n\t\t * this check in production for performance gain. It is strongly recommended to keep these\n\t\t * checks enabled during development. If the shader does not compile and link - it will not\n\t\t * work and associated material will not render.\n\t\t * - `onShaderError(gl, program, glVertexShader,glFragmentShader)`: A callback function that\n\t\t * can be used for custom error reporting. The callback receives the WebGL context, an instance\n\t\t * of WebGLProgram as well two instances of WebGLShader representing the vertex and fragment shader.\n\t\t * Assigning a custom function disables the default error reporting.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.debug = {\n\n\t\t\t/**\n\t\t\t * Enables error checking and reporting when shader programs are being compiled.\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tcheckShaderErrors: true,\n\t\t\t/**\n\t\t\t * Callback for custom error reporting.\n\t\t\t * @type {?Function}\n\t\t\t */\n\t\t\tonShaderError: null\n\t\t};\n\n\t\t// clearing\n\n\t\t/**\n\t\t * Whether the renderer should automatically clear its output before rendering a frame or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClear = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the color buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearColor = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearDepth = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\t/**\n\t\t * Whether the renderer should sort objects or not.\n\t\t *\n\t\t * Note: Sorting is used to attempt to properly render objects that have some\n\t\t * degree of transparency. By definition, sorting objects may not work in all\n\t\t * cases. Depending on the needs of application, it may be necessary to turn\n\t\t * off sorting and use other methods to deal with transparency rendering e.g.\n\t\t * manually determining each object's rendering order.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\t/**\n\t\t * User-defined clipping planes specified in world space. These planes apply globally.\n\t\t * Points in space whose dot product with the plane is negative are cut away.\n\t\t *\n\t\t * @type {Array}\n\t\t */\n\t\tthis.clippingPlanes = [];\n\n\t\t/**\n\t\t * Whether the renderer respects object-level clipping planes or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.localClippingEnabled = false;\n\n\t\t// tone mapping\n\n\t\t/**\n\t\t * The tone mapping technique of the renderer.\n\t\t *\n\t\t * @type {(NoToneMapping|LinearToneMapping|ReinhardToneMapping|CineonToneMapping|ACESFilmicToneMapping|CustomToneMapping|AgXToneMapping|NeutralToneMapping)}\n\t\t * @default NoToneMapping\n\t\t */\n\t\tthis.toneMapping = NoToneMapping;\n\n\t\t/**\n\t\t * Exposure level of tone mapping.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.toneMappingExposure = 1.0;\n\n\t\t// transmission\n\n\t\t/**\n\t\t * The normalized resolution scale for the transmission render target, measured in percentage\n\t\t * of viewport dimensions. Lowering this value can result in significant performance improvements\n\t\t * when using {@link MeshPhysicalMaterial#transmission}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.transmissionResolutionScale = 1.0;\n\n\t\t// internal properties\n\n\t\tconst _this = this;\n\n\t\tlet _isContextLost = false;\n\n\t\t// internal state cache\n\n\t\tthis._outputColorSpace = SRGBColorSpace;\n\n\t\tlet _currentActiveCubeFace = 0;\n\t\tlet _currentActiveMipmapLevel = 0;\n\t\tlet _currentRenderTarget = null;\n\t\tlet _currentMaterialId = -1;\n\n\t\tlet _currentCamera = null;\n\n\t\tconst _currentViewport = new Vector4();\n\t\tconst _currentScissor = new Vector4();\n\t\tlet _currentScissorTest = null;\n\n\t\tconst _currentClearColor = new Color( 0x000000 );\n\t\tlet _currentClearAlpha = 0;\n\n\t\t//\n\n\t\tlet _width = canvas.width;\n\t\tlet _height = canvas.height;\n\n\t\tlet _pixelRatio = 1;\n\t\tlet _opaqueSort = null;\n\t\tlet _transparentSort = null;\n\n\t\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\t\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\t\tlet _scissorTest = false;\n\n\t\t// frustum\n\n\t\tconst _frustum = new Frustum();\n\n\t\t// clipping\n\n\t\tlet _clippingEnabled = false;\n\t\tlet _localClippingEnabled = false;\n\n\t\t// camera matrices cache\n\n\t\tconst _projScreenMatrix = new Matrix4();\n\n\t\tconst _vector3 = new Vector3();\n\n\t\tconst _vector4 = new Vector4();\n\n\t\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\t\tlet _renderBackground = false;\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\t// initialize\n\n\t\tlet _gl = context;\n\n\t\tfunction getContext( contextName, contextAttributes ) {\n\n\t\t\treturn canvas.getContext( contextName, contextAttributes );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\tconst contextAttributes = {\n\t\t\t\talpha: true,\n\t\t\t\tdepth,\n\t\t\t\tstencil,\n\t\t\t\tantialias,\n\t\t\t\tpremultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer,\n\t\t\t\tpowerPreference,\n\t\t\t\tfailIfMajorPerformanceCaveat,\n\t\t\t};\n\n\t\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\t\tif ( 'setAttribute' in canvas ) canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t\tcanvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tconst contextName = 'webgl2';\n\n\t\t\t\t_gl = getContext( contextName, contextAttributes );\n\n\t\t\t\tif ( _gl === null ) {\n\n\t\t\t\t\tif ( getContext( contextName ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} catch ( error ) {\n\n\t\t\terror( 'WebGLRenderer: ' + error.message );\n\t\t\tthrow error;\n\n\t\t}\n\n\t\tlet extensions, capabilities, state, info;\n\t\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\t\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\t\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\t\tlet utils, bindingStates, uniformsGroups;\n\n\t\tfunction initGLContext() {\n\n\t\t\textensions = new WebGLExtensions( _gl );\n\t\t\textensions.init();\n\n\t\t\tutils = new WebGLUtils( _gl, extensions );\n\n\t\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters, utils );\n\n\t\t\tstate = new WebGLState( _gl, extensions );\n\n\t\t\tif ( capabilities.reversedDepthBuffer && reversedDepthBuffer ) {\n\n\t\t\t\tstate.buffers.depth.setReversed( true );\n\n\t\t\t}\n\n\t\t\tinfo = new WebGLInfo( _gl );\n\t\t\tproperties = new WebGLProperties();\n\t\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\t\tattributes = new WebGLAttributes( _gl );\n\t\t\tbindingStates = new WebGLBindingStates( _gl, attributes );\n\t\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\t\tclipping = new WebGLClipping( properties );\n\t\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\t\tmaterials = new WebGLMaterials( _this, properties );\n\t\t\trenderLists = new WebGLRenderLists();\n\t\t\trenderStates = new WebGLRenderStates( extensions );\n\t\t\tbackground = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha );\n\t\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\t\t\tuniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );\n\n\t\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info );\n\t\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info );\n\n\t\t\tinfo.programs = programCache.programs;\n\n\t\t\t/**\n\t\t\t * Holds details about the capabilities of the current rendering context.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#capabilities\n\t\t\t * @type {WebGLRenderer~Capabilities}\n\t\t\t */\n\t\t\t_this.capabilities = capabilities;\n\n\t\t\t/**\n\t\t\t * Provides methods for retrieving and testing WebGL extensions.\n\t\t\t *\n\t\t\t * - `get(extensionName:string)`: Used to check whether a WebGL extension is supported\n\t\t\t * and return the extension object if available.\n\t\t\t * - `has(extensionName:string)`: returns `true` if the extension is supported.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#extensions\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.extensions = extensions;\n\n\t\t\t/**\n\t\t\t * Used to track properties of other objects like native WebGL objects.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#properties\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.properties = properties;\n\n\t\t\t/**\n\t\t\t * Manages the render lists of the renderer.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#renderLists\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.renderLists = renderLists;\n\n\n\n\t\t\t/**\n\t\t\t * Interface for managing shadows.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#shadowMap\n\t\t\t * @type {WebGLRenderer~ShadowMap}\n\t\t\t */\n\t\t\t_this.shadowMap = shadowMap;\n\n\t\t\t/**\n\t\t\t * Interface for managing the WebGL state.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#state\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.state = state;\n\n\t\t\t/**\n\t\t\t * Holds a series of statistical information about the GPU memory\n\t\t\t * and the rendering process. Useful for debugging and monitoring.\n\t\t\t *\n\t\t\t * By default these data are reset at each render call but when having\n\t\t\t * multiple render passes per frame (e.g. when using post processing) it can\n\t\t\t * be preferred to reset with a custom pattern. First, set `autoReset` to\n\t\t\t * `false`.\n\t\t\t * ```js\n\t\t\t * renderer.info.autoReset = false;\n\t\t\t * ```\n\t\t\t * Call `reset()` whenever you have finished to render a single frame.\n\t\t\t * ```js\n\t\t\t * renderer.info.reset();\n\t\t\t * ```\n\t\t\t *\n\t\t\t * @name WebGLRenderer#info\n\t\t\t * @type {WebGLRenderer~Info}\n\t\t\t */\n\t\t\t_this.info = info;\n\n\t\t}\n\n\t\tinitGLContext();\n\n\t\t// xr\n\n\t\tconst xr = new WebXRManager( _this, _gl );\n\n\t\t/**\n\t\t * A reference to the XR manager.\n\t\t *\n\t\t * @type {WebXRManager}\n\t\t */\n\t\tthis.xr = xr;\n\n\t\t/**\n\t\t * Returns the rendering context.\n\t\t *\n\t\t * @return {WebGL2RenderingContext} The rendering context.\n\t\t */\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the rendering context attributes.\n\t\t *\n\t\t * @return {WebGLContextAttributes} The rendering context attributes.\n\t\t */\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\t/**\n\t\t * Simulates a loss of the WebGL context. This requires support for the `WEBGL_lose_context` extension.\n\t\t */\n\t\tthis.forceContextLoss = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.loseContext();\n\n\t\t};\n\n\t\t/**\n\t\t * Simulates a restore of the WebGL context. This requires support for the `WEBGL_lose_context` extension.\n\t\t */\n\t\tthis.forceContextRestore = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.restoreContext();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the pixel ratio.\n\t\t *\n\t\t * @return {number} The pixel ratio.\n\t\t */\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the given pixel ratio and resizes the canvas if necessary.\n\t\t *\n\t\t * @param {number} value - The pixel ratio.\n\t\t */\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _width, _height, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the renderer's size in logical pixels. This method does not honor the pixel ratio.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The renderer's size in logical pixels.\n\t\t */\n\t\tthis.getSize = function ( target ) {\n\n\t\t\treturn target.set( _width, _height );\n\n\t\t};\n\n\t\t/**\n\t\t * Resizes the output canvas to (width, height) with device pixel ratio taken\n\t\t * into account, and also sets the viewport to fit that size, starting in (0,\n\t\t * 0). Setting `updateStyle` to false prevents any style changes to the output canvas.\n\t\t *\n\t\t * @param {number} width - The width in logical pixels.\n\t\t * @param {number} height - The height in logical pixels.\n\t\t * @param {boolean} [updateStyle=true] - Whether to update the `style` attribute of the canvas or not.\n\t\t */\n\t\tthis.setSize = function ( width, height, updateStyle = true ) {\n\n\t\t\tif ( xr.isPresenting ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\tcanvas.width = Math.floor( width * _pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * _pixelRatio );\n\n\t\t\tif ( updateStyle === true ) {\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the drawing buffer size in physical pixels. This method honors the pixel ratio.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The drawing buffer size.\n\t\t */\n\t\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t\t};\n\n\t\t/**\n\t\t * This method allows to define the drawing buffer size by specifying\n\t\t * width, height and pixel ratio all at once. The size of the drawing\n\t\t * buffer is computed with this formula:\n\t\t * ```js\n\t\t * size.x = width * pixelRatio;\n\t\t * size.y = height * pixelRatio;\n\t\t * ```\n\t\t *\n\t\t * @param {number} width - The width in logical pixels.\n\t\t * @param {number} height - The height in logical pixels.\n\t\t * @param {number} pixelRatio - The pixel ratio.\n\t\t */\n\t\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_pixelRatio = pixelRatio;\n\n\t\t\tcanvas.width = Math.floor( width * pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * pixelRatio );\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current viewport definition.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The current viewport definition.\n\t\t */\n\t\tthis.getCurrentViewport = function ( target ) {\n\n\t\t\treturn target.copy( _currentViewport );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the viewport definition.\n\t\t *\n\t\t * @param {Vector4} target - The method writes the result in this target object.\n\t\t * @return {Vector4} The viewport definition.\n\t\t */\n\t\tthis.getViewport = function ( target ) {\n\n\t\t\treturn target.copy( _viewport );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the viewport to render from `(x, y)` to `(x + width, y + height)`.\n\t\t *\n\t\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the viewport origin in logical pixel unit.\n\t\t * Or alternatively a four-component vector specifying all the parameters of the viewport.\n\t\t * @param {number} y - The vertical coordinate for the lower left corner of the viewport origin in logical pixel unit.\n\t\t * @param {number} width - The width of the viewport in logical pixel unit.\n\t\t * @param {number} height - The height of the viewport in logical pixel unit.\n\t\t */\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_viewport.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the scissor region.\n\t\t *\n\t\t * @param {Vector4} target - The method writes the result in this target object.\n\t\t * @return {Vector4} The scissor region.\n\t\t */\n\t\tthis.getScissor = function ( target ) {\n\n\t\t\treturn target.copy( _scissor );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the scissor region to render from `(x, y)` to `(x + width, y + height)`.\n\t\t *\n\t\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the scissor region origin in logical pixel unit.\n\t\t * Or alternatively a four-component vector specifying all the parameters of the scissor region.\n\t\t * @param {number} y - The vertical coordinate for the lower left corner of the scissor region origin in logical pixel unit.\n\t\t * @param {number} width - The width of the scissor region in logical pixel unit.\n\t\t * @param {number} height - The height of the scissor region in logical pixel unit.\n\t\t */\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_scissor.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns `true` if the scissor test is enabled.\n\t\t *\n\t\t * @return {boolean} Whether the scissor test is enabled or not.\n\t\t */\n\t\tthis.getScissorTest = function () {\n\n\t\t\treturn _scissorTest;\n\n\t\t};\n\n\t\t/**\n\t\t * Enable or disable the scissor test. When this is enabled, only the pixels\n\t\t * within the defined scissor area will be affected by further renderer\n\t\t * actions.\n\t\t *\n\t\t * @param {boolean} boolean - Whether the scissor test is enabled or not.\n\t\t */\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom opaque sort function for the render lists. Pass `null`\n\t\t * to use the default `painterSortStable` function.\n\t\t *\n\t\t * @param {?Function} method - The opaque sort function.\n\t\t */\n\t\tthis.setOpaqueSort = function ( method ) {\n\n\t\t\t_opaqueSort = method;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom transparent sort function for the render lists. Pass `null`\n\t\t * to use the default `reversePainterSortStable` function.\n\t\t *\n\t\t * @param {?Function} method - The opaque sort function.\n\t\t */\n\t\tthis.setTransparentSort = function ( method ) {\n\n\t\t\t_transparentSort = method;\n\n\t\t};\n\n\t\t// Clearing\n\n\t\t/**\n\t\t * Returns the clear color.\n\t\t *\n\t\t * @param {Color} target - The method writes the result in this target object.\n\t\t * @return {Color} The clear color.\n\t\t */\n\t\tthis.getClearColor = function ( target ) {\n\n\t\t\treturn target.copy( background.getClearColor() );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear color and alpha.\n\t\t *\n\t\t * @param {Color} color - The clear color.\n\t\t * @param {number} [alpha=1] - The clear alpha.\n\t\t */\n\t\tthis.setClearColor = function () {\n\n\t\t\tbackground.setClearColor( ...arguments );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the clear alpha. Ranges within `[0,1]`.\n\t\t *\n\t\t * @return {number} The clear alpha.\n\t\t */\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn background.getClearAlpha();\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear alpha.\n\t\t *\n\t\t * @param {number} alpha - The clear alpha.\n\t\t */\n\t\tthis.setClearAlpha = function () {\n\n\t\t\tbackground.setClearAlpha( ...arguments );\n\n\t\t};\n\n\t\t/**\n\t\t * Tells the renderer to clear its color, depth or stencil drawing buffer(s).\n\t\t * This method initializes the buffers to the current clear color values.\n\t\t *\n\t\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t\t */\n\t\tthis.clear = function ( color = true, depth = true, stencil = true ) {\n\n\t\t\tlet bits = 0;\n\n\t\t\tif ( color ) {\n\n\t\t\t\t// check if we're trying to clear an integer target\n\t\t\t\tlet isIntegerFormat = false;\n\t\t\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t\t\tconst targetFormat = _currentRenderTarget.texture.format;\n\t\t\t\t\tisIntegerFormat = INTEGER_FORMATS.has( targetFormat );\n\n\t\t\t\t}\n\n\t\t\t\t// use the appropriate clear functions to clear the target if it's a signed\n\t\t\t\t// or unsigned integer target\n\t\t\t\tif ( isIntegerFormat ) {\n\n\t\t\t\t\tconst targetType = _currentRenderTarget.texture.type;\n\t\t\t\t\tconst isUnsignedType = UNSIGNED_TYPES.has( targetType );\n\n\t\t\t\t\tconst clearColor = background.getClearColor();\n\t\t\t\t\tconst a = background.getClearAlpha();\n\t\t\t\t\tconst r = clearColor.r;\n\t\t\t\t\tconst g = clearColor.g;\n\t\t\t\t\tconst b = clearColor.b;\n\n\t\t\t\t\tif ( isUnsignedType ) {\n\n\t\t\t\t\t\tuintClearColor[ 0 ] = r;\n\t\t\t\t\t\tuintClearColor[ 1 ] = g;\n\t\t\t\t\t\tuintClearColor[ 2 ] = b;\n\t\t\t\t\t\tuintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferuiv( _gl.COLOR, 0, uintClearColor );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tintClearColor[ 0 ] = r;\n\t\t\t\t\t\tintClearColor[ 1 ] = g;\n\t\t\t\t\t\tintClearColor[ 2 ] = b;\n\t\t\t\t\t\tintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferiv( _gl.COLOR, 0, intClearColor );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbits |= _gl.COLOR_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( depth ) {\n\n\t\t\t\tbits |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t}\n\n\t\t\tif ( stencil ) {\n\n\t\t\t\tbits |= _gl.STENCIL_BUFFER_BIT;\n\t\t\t\tthis.state.buffers.stencil.setMask( 0xffffffff );\n\n\t\t\t}\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the color buffer. Equivalent to calling `renderer.clear( true, false, false )`.\n\t\t */\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the depth buffer. Equivalent to calling `renderer.clear( false, true, false )`.\n\t\t */\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the stencil buffer. Equivalent to calling `renderer.clear( false, false, true )`.\n\t\t */\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\t/**\n\t\t * Frees the GPU-related resources allocated by this instance. Call this\n\t\t * method whenever this instance is no longer used in your app.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\tcanvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tbackground.dispose();\n\t\t\trenderLists.dispose();\n\t\t\trenderStates.dispose();\n\t\t\tproperties.dispose();\n\t\t\tcubemaps.dispose();\n\t\t\tcubeuvmaps.dispose();\n\t\t\tobjects.dispose();\n\t\t\tbindingStates.dispose();\n\t\t\tuniformsGroups.dispose();\n\t\t\tprogramCache.dispose();\n\n\t\t\txr.dispose();\n\n\t\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t\tanimation.stop();\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tlog( 'WebGLRenderer: Context Lost.' );\n\n\t\t\t_isContextLost = true;\n\n\t\t}\n\n\t\tfunction onContextRestore( /* event */ ) {\n\n\t\t\tlog( 'WebGLRenderer: Context Restored.' );\n\n\t\t\t_isContextLost = false;\n\n\t\t\tconst infoAutoReset = info.autoReset;\n\t\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\t\tconst shadowMapType = shadowMap.type;\n\n\t\t\tinitGLContext();\n\n\t\t\tinfo.autoReset = infoAutoReset;\n\t\t\tshadowMap.enabled = shadowMapEnabled;\n\t\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\t\tshadowMap.type = shadowMapType;\n\n\t\t}\n\n\t\tfunction onContextCreationError( event ) {\n\n\t\t\terror( 'WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage );\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tconst material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReferences( material );\n\n\t\t\tproperties.remove( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\t\tconst programs = properties.get( material ).programs;\n\n\t\t\tif ( programs !== undefined ) {\n\n\t\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t\t//\n\n\t\t\tlet index = geometry.index;\n\t\t\tlet rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\n\t\t\t\tif ( index === undefined ) return;\n\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst drawRange = geometry.drawRange;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet drawStart = drawRange.start * rangeFactor;\n\t\t\tlet drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor;\n\n\t\t\tif ( group !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, group.start * rangeFactor );\n\t\t\t\tdrawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor );\n\n\t\t\t}\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, index.count );\n\n\t\t\t} else if ( position !== undefined && position !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, position.count );\n\n\t\t\t}\n\n\t\t\tconst drawCount = drawEnd - drawStart;\n\n\t\t\tif ( drawCount < 0 || drawCount === Infinity ) return;\n\n\t\t\t//\n\n\t\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\t\tlet attribute;\n\t\t\tlet renderer = bufferRenderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tattribute = attributes.get( index );\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( attribute );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tif ( object._multiDrawInstances !== null ) {\n\n\t\t\t\t\t// @deprecated, r174\n\t\t\t\t\twarnOnce( 'WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );\n\t\t\t\t\trenderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( ! extensions.get( 'WEBGL_multi_draw' ) ) {\n\n\t\t\t\t\t\tconst starts = object._multiDrawStarts;\n\t\t\t\t\t\tconst counts = object._multiDrawCounts;\n\t\t\t\t\t\tconst drawCount = object._multiDrawCount;\n\t\t\t\t\t\tconst bytesPerElement = index ? attributes.get( index ).bytesPerElement : 1;\n\t\t\t\t\t\tconst uniforms = properties.get( material ).currentProgram.getUniforms();\n\t\t\t\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\t\t\t\tuniforms.setValue( _gl, '_gl_DrawID', i );\n\t\t\t\t\t\t\trenderer.render( starts[ i ] / bytesPerElement, counts[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\trenderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isInstancedMesh ) {\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tconst maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity;\n\t\t\t\tconst instanceCount = Math.min( geometry.instanceCount, maxInstanceCount );\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Compile\n\n\t\tfunction prepareMaterial( material, scene, object ) {\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Compiles all materials in the scene with the camera. This is useful to precompile shaders\n\t\t * before the first rendering. If you want to add a 3D object to an existing scene, use the third\n\t\t * optional parameter for applying the target scene.\n\t\t *\n\t\t * Note that the (target) scene's lighting and environment must be configured before calling this method.\n\t\t *\n\t\t * @param {Object3D} scene - The scene or another type of 3D object to precompile.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {?Scene} [targetScene=null] - The target scene.\n\t\t * @return {Set} The precompiled materials.\n\t\t */\n\t\tthis.compile = function ( scene, camera, targetScene = null ) {\n\n\t\t\tif ( targetScene === null ) targetScene = scene;\n\n\t\t\tcurrentRenderState = renderStates.get( targetScene );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t// gather lights from both the target scene and the new object that will be added to the scene.\n\n\t\t\ttargetScene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( scene !== targetScene ) {\n\n\t\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tcurrentRenderState.setupLights();\n\n\t\t\t// Only initialize materials in the new scene, not the targetScene.\n\n\t\t\tconst materials = new Set();\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tif ( ! ( object.isMesh || object.isPoints || object.isLine || object.isSprite ) ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( material ) {\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\t\tprepareMaterial( material2, targetScene, object );\n\t\t\t\t\t\t\tmaterials.add( material2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tprepareMaterial( material, targetScene, object );\n\t\t\t\t\t\tmaterials.add( material );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tcurrentRenderState = renderStateStack.pop();\n\n\t\t\treturn materials;\n\n\t\t};\n\n\t\t// compileAsync\n\n\t\t/**\n\t\t * Asynchronous version of {@link WebGLRenderer#compile}.\n\t\t *\n\t\t * This method makes use of the `KHR_parallel_shader_compile` WebGL extension. Hence,\n\t\t * it is recommended to use this version of `compile()` whenever possible.\n\t\t *\n\t\t * @async\n\t\t * @param {Object3D} scene - The scene or another type of 3D object to precompile.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {?Scene} [targetScene=null] - The target scene.\n\t\t * @return {Promise} A Promise that resolves when the given scene can be rendered without unnecessary stalling due to shader compilation.\n\t\t */\n\t\tthis.compileAsync = function ( scene, camera, targetScene = null ) {\n\n\t\t\tconst materials = this.compile( scene, camera, targetScene );\n\n\t\t\t// Wait for all the materials in the new object to indicate that they're\n\t\t\t// ready to be used before resolving the promise.\n\n\t\t\treturn new Promise( ( resolve ) => {\n\n\t\t\t\tfunction checkMaterialsReady() {\n\n\t\t\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\t\t\tconst materialProperties = properties.get( material );\n\t\t\t\t\t\tconst program = materialProperties.currentProgram;\n\n\t\t\t\t\t\tif ( program.isReady() ) {\n\n\t\t\t\t\t\t\t// remove any programs that report they're ready to use from the list\n\t\t\t\t\t\t\tmaterials.delete( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\t// once the list of compiling materials is empty, call the callback\n\n\t\t\t\t\tif ( materials.size === 0 ) {\n\n\t\t\t\t\t\tresolve( scene );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// if some materials are still not ready, wait a bit and check again\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extensions.get( 'KHR_parallel_shader_compile' ) !== null ) {\n\n\t\t\t\t\t// If we can check the compilation status of the materials without\n\t\t\t\t\t// blocking then do so right away.\n\n\t\t\t\t\tcheckMaterialsReady();\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise start by waiting a bit to give the materials we just\n\t\t\t\t\t// initialized a chance to finish.\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time ) {\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t\t}\n\n\t\tfunction onXRSessionStart() {\n\n\t\t\tanimation.stop();\n\n\t\t}\n\n\t\tfunction onXRSessionEnd() {\n\n\t\t\tanimation.start();\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tif ( typeof self !== 'undefined' ) animation.setContext( self );\n\n\t\t/**\n\t\t * Applications are advised to always define the animation loop\n\t\t * with this method and not manually with `requestAnimationFrame()`\n\t\t * for best compatibility.\n\t\t *\n\t\t * @param {?onAnimationCallback} callback - The application's animation loop.\n\t\t */\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\t\t\txr.setAnimationLoop( callback );\n\n\t\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t\t};\n\n\t\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t// Rendering\n\n\t\t/**\n\t\t * Renders the given scene (or other type of 3D object) using the given camera.\n\t\t *\n\t\t * The render is done to a previously specified render target set by calling {@link WebGLRenderer#setRenderTarget}\n\t\t * or to the canvas as usual.\n\t\t *\n\t\t * By default render buffers are cleared before rendering but you can prevent\n\t\t * this by setting the property `autoClear` to `false`. If you want to prevent\n\t\t * only certain buffers being cleared you can `autoClearColor`, `autoClearDepth`\n\t\t * or `autoClearStencil` to `false`. To force a clear, use {@link WebGLRenderer#clear}.\n\t\t *\n\t\t * @param {Object3D} scene - The scene to render.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\terror( 'WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( _isContextLost === true ) return;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix, WebGLCoordinateSystem, camera.reversedDepth );\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled );\n\n\t\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\t\tcurrentRenderList.init();\n\n\t\t\trenderListStack.push( currentRenderList );\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tconst depthSensingMesh = _this.xr.getDepthSensingMesh();\n\n\t\t\t\tif ( depthSensingMesh !== null ) {\n\n\t\t\t\t\tprojectObject( depthSensingMesh, camera, - Infinity, _this.sortObjects );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\t\tcurrentRenderList.finish();\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t\t}\n\n\t\t\t_renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false;\n\t\t\tif ( _renderBackground ) {\n\n\t\t\t\tbackground.addToRenderList( currentRenderList, scene );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tthis.info.render.frame ++;\n\n\t\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t\t//\n\n\t\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t\t// render scene\n\n\t\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\n\t\t\tcurrentRenderState.setupLights();\n\n\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\tconst cameras = camera.cameras;\n\n\t\t\t\tif ( transmissiveObjects.length > 0 ) {\n\n\t\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\t\trenderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );\n\n\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _currentRenderTarget !== null && _currentActiveMipmapLevel === 0 ) {\n\n\t\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t\t// _gl.finish();\n\n\t\t\tbindingStates.resetDefaultState();\n\t\t\t_currentMaterialId = -1;\n\t\t\t_currentCamera = null;\n\n\t\t\trenderStateStack.pop();\n\n\t\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, currentRenderState.state.camera );\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderState = null;\n\n\t\t\t}\n\n\t\t\trenderListStack.pop();\n\n\t\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderList = null;\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tconst visible = object.layers.test( camera.layers );\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isGroup ) {\n\n\t\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\t_vector4.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( object.boundingSphere.center );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( geometry.boundingSphere.center );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_vector4\n\t\t\t\t\t\t\t\t.applyMatrix4( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst children = object.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\t\tconst { opaque: opaqueObjects, transmissive: transmissiveObjects, transparent: transparentObjects } = currentRenderList;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\tstate.setPolygonOffset( false );\n\n\t\t}\n\n\t\tfunction renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tif ( overrideMaterial !== null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( currentRenderState.state.transmissionRenderTarget[ camera.id ] === undefined ) {\n\n\t\t\t\tcurrentRenderState.state.transmissionRenderTarget[ camera.id ] = new WebGLRenderTarget( 1, 1, {\n\t\t\t\t\tgenerateMipmaps: true,\n\t\t\t\t\ttype: ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) ) ? HalfFloatType : UnsignedByteType,\n\t\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\t\tsamples: 4,\n\t\t\t\t\tstencilBuffer: stencil,\n\t\t\t\t\tresolveDepthBuffer: false,\n\t\t\t\t\tresolveStencilBuffer: false,\n\t\t\t\t\tcolorSpace: ColorManagement.workingColorSpace,\n\t\t\t\t} );\n\n\t\t\t\t// debug\n\n\t\t\t\t/*\n\t\t\t\tconst geometry = new PlaneGeometry();\n\t\t\t\tconst material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } );\n\n\t\t\t\tconst mesh = new Mesh( geometry, material );\n\t\t\t\tscene.add( mesh );\n\t\t\t\t*/\n\n\t\t\t}\n\n\t\t\tconst transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[ camera.id ];\n\n\t\t\tconst activeViewport = camera.viewport || _currentViewport;\n\t\t\ttransmissionRenderTarget.setSize( activeViewport.z * _this.transmissionResolutionScale, activeViewport.w * _this.transmissionResolutionScale );\n\n\t\t\t//\n\n\t\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t\tconst currentActiveCubeFace = _this.getActiveCubeFace();\n\t\t\tconst currentActiveMipmapLevel = _this.getActiveMipmapLevel();\n\n\t\t\t_this.setRenderTarget( transmissionRenderTarget );\n\n\t\t\t_this.getClearColor( _currentClearColor );\n\t\t\t_currentClearAlpha = _this.getClearAlpha();\n\t\t\tif ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 );\n\n\t\t\t_this.clear();\n\n\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\t\tconst currentToneMapping = _this.toneMapping;\n\t\t\t_this.toneMapping = NoToneMapping;\n\n\t\t\t// Remove viewport from camera to avoid nested render calls resetting viewport to it (e.g Reflector).\n\t\t\t// Transmission render pass requires viewport to match the transmissionRenderTarget.\n\t\t\tconst currentCameraViewport = camera.viewport;\n\t\t\tif ( camera.viewport !== undefined ) camera.viewport = undefined;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === false ) { // see #28131\n\n\t\t\t\tlet renderTargetNeedsUpdate = false;\n\n\t\t\t\tfor ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst renderItem = transmissiveObjects[ i ];\n\n\t\t\t\t\tconst { object, geometry, material, group } = renderItem;\n\n\t\t\t\t\tif ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tconst currentSide = material.side;\n\n\t\t\t\t\t\tmaterial.side = BackSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t\t\tmaterial.side = currentSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderTargetNeedsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetNeedsUpdate === true ) {\n\n\t\t\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_this.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\t\t_this.setClearColor( _currentClearColor, _currentClearAlpha );\n\n\t\t\tif ( currentCameraViewport !== undefined ) camera.viewport = currentCameraViewport;\n\n\t\t\t_this.toneMapping = currentToneMapping;\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\t\tconst { object, geometry, group } = renderItem;\n\t\t\t\tlet material = renderItem.material;\n\n\t\t\t\tif ( material.allowOverride === true && overrideMaterial !== null ) {\n\n\t\t\t\t\tmaterial = overrideMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t}\n\n\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t\t}\n\n\t\tfunction getProgram( material, scene, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tconst lights = currentRenderState.state.lights;\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tconst lightsStateVersion = lights.state.version;\n\n\t\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\t\tlet programs = materialProperties.programs;\n\n\t\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tmaterialProperties.fog = scene.fog;\n\t\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\t\t\tmaterialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation;\n\n\t\t\tif ( programs === undefined ) {\n\n\t\t\t\t// new material\n\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\tprograms = new Map();\n\t\t\t\tmaterialProperties.programs = programs;\n\n\t\t\t}\n\n\t\t\tlet program = programs.get( programCacheKey );\n\n\t\t\tif ( program !== undefined ) {\n\n\t\t\t\t// early out if program and light state is identical\n\n\t\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\t\treturn program;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t\t}\n\n\t\t\tconst uniforms = materialProperties.uniforms;\n\n\t\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t\t}\n\n\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\t\tuniforms.spotLightMatrix.value = lights.state.spotLightMatrix;\n\t\t\t\tuniforms.spotLightMap.value = lights.state.spotLightMap;\n\t\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tmaterialProperties.currentProgram = program;\n\t\t\tmaterialProperties.uniformsList = null;\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction getUniformList( materialProperties ) {\n\n\t\t\tif ( materialProperties.uniformsList === null ) {\n\n\t\t\t\tconst progUniforms = materialProperties.currentProgram.getUniforms();\n\t\t\t\tmaterialProperties.uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, materialProperties.uniforms );\n\n\t\t\t}\n\n\t\t\treturn materialProperties.uniformsList;\n\n\t\t}\n\n\t\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tmaterialProperties.outputColorSpace = parameters.outputColorSpace;\n\t\t\tmaterialProperties.batching = parameters.batching;\n\t\t\tmaterialProperties.batchingColor = parameters.batchingColor;\n\t\t\tmaterialProperties.instancing = parameters.instancing;\n\t\t\tmaterialProperties.instancingColor = parameters.instancingColor;\n\t\t\tmaterialProperties.instancingMorph = parameters.instancingMorph;\n\t\t\tmaterialProperties.skinning = parameters.skinning;\n\t\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\t\tmaterialProperties.morphColors = parameters.morphColors;\n\t\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t\t}\n\n\t\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\ttextures.resetTextureUnits();\n\n\t\t\tconst fog = scene.fog;\n\t\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tconst colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace );\n\t\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\t\tconst vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 );\n\t\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\t\tconst morphColors = !! geometry.morphAttributes.color;\n\n\t\t\tlet toneMapping = NoToneMapping;\n\n\t\t\tif ( material.toneMapped ) {\n\n\t\t\t\tif ( _currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\t\ttoneMapping = _this.toneMapping;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tconst materialProperties = properties.get( material );\n\t\t\tconst lights = currentRenderState.state.lights;\n\n\t\t\tif ( _clippingEnabled === true ) {\n\n\t\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\t\tconst useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet needsProgramChange = false;\n\n\t\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.outputColorSpace !== colorSpace ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batching === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isBatchedMesh && materialProperties.batching === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === true && object.colorTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === false && object.colorTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === true && object.morphTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === false && object.morphTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( material.fog === true && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphColors !== morphColors ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tneedsProgramChange = true;\n\t\t\t\tmaterialProperties.__version = material.version;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet program = materialProperties.currentProgram;\n\n\t\t\tif ( needsProgramChange === true ) {\n\n\t\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t\tlet refreshProgram = false;\n\t\t\tlet refreshMaterial = false;\n\t\t\tlet refreshLights = false;\n\n\t\t\tconst p_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\t\t// common camera uniforms\n\n\t\t\t\tconst reversedDepthBuffer = state.buffers.depth.getReversed();\n\n\t\t\t\tif ( reversedDepthBuffer && camera.reversedDepth !== true ) {\n\n\t\t\t\t\tcamera._reversedDepth = true;\n\t\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl, _vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// consider moving isOrthographic to UniformLib and WebGLMaterials, see https://github.com/mrdoob/three.js/pull/26467#issuecomment-1645185067\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t\t}\n\n\t\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tconst skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingTexture', object._matricesTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingIdTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingIdTexture', object._indirectTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingColorTexture' );\n\t\t\t\tif ( object._colorsTexture !== null ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'batchingColorTexture', object._colorsTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\t\tif ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined ) ) {\n\n\t\t\t\tmorphtargets.update( object, geometry, program );\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t\t}\n\n\t\t\t// https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512\n\n\t\t\tif ( material.isMeshGouraudMaterial && material.envMap !== null ) {\n\n\t\t\t\tm_uniforms.envMap.value = envMap;\n\n\t\t\t\tm_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) {\n\n\t\t\t\tm_uniforms.envMapIntensity.value = scene.environmentIntensity;\n\n\t\t\t}\n\n\t\t\t// Set DFG LUT for physically-based materials\n\t\t\tif ( m_uniforms.dfgLUT !== undefined ) {\n\n\t\t\t\tm_uniforms.dfgLUT.value = getDFGLUT();\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog === true ) {\n\n\t\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[ camera.id ] );\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\n\t\t\t}\n\n\t\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\t\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t\t}\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\t// UBOs\n\n\t\t\tif ( material.isShaderMaterial || material.isRawShaderMaterial ) {\n\n\t\t\t\tconst groups = material.uniformsGroups;\n\n\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\t\tuniformsGroups.update( group, program );\n\t\t\t\t\tuniformsGroups.bind( group, program );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\tfunction materialNeedsLights( material ) {\n\n\t\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t\t}\n\n\t\t/**\n\t\t * Returns the active cube face.\n\t\t *\n\t\t * @return {number} The active cube face.\n\t\t */\n\t\tthis.getActiveCubeFace = function () {\n\n\t\t\treturn _currentActiveCubeFace;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the active mipmap level.\n\t\t *\n\t\t * @return {number} The active mipmap level.\n\t\t */\n\t\tthis.getActiveMipmapLevel = function () {\n\n\t\t\treturn _currentActiveMipmapLevel;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the active render target.\n\t\t *\n\t\t * @return {?WebGLRenderTarget} The active render target. Returns `null` if no render target\n\t\t * is currently set.\n\t\t */\n\t\tthis.getRenderTarget = function () {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = renderTarget.resolveDepthBuffer === false;\n\t\t\tif ( renderTargetProperties.__autoAllocateDepthBuffer === false ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\trenderTargetProperties.__useRenderToTexture = false;\n\n\t\t\t}\n\n\t\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = renderTargetProperties.__autoAllocateDepthBuffer ? undefined : depthTexture;\n\n\t\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\t};\n\n\t\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t\t};\n\n\t\tconst _scratchFrameBuffer = _gl.createFramebuffer();\n\n\t\t/**\n\t\t * Sets the active rendertarget.\n\t\t *\n\t\t * @param {?WebGLRenderTarget} renderTarget - The render target to set. When `null` is given,\n\t\t * the canvas is set as the active render target instead.\n\t\t * @param {number} [activeCubeFace=0] - The active cube face when using a cube render target.\n\t\t * Indicates the z layer to render in to when using 3D or array render targets.\n\t\t * @param {number} [activeMipmapLevel=0] - The active mipmap level.\n\t\t */\n\t\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\t\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\t\tlet useDefaultFramebuffer = true;\n\t\t\tlet framebuffer = null;\n\t\t\tlet isCube = false;\n\t\t\tlet isRenderTarget3D = false;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\t\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t\t} else if ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\t// check if the depth texture is already bound to the frame buffer and that it's been initialized\n\t\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\t\t\tif ( renderTargetProperties.__boundDepthTexture !== depthTexture ) {\n\n\t\t\t\t\t\t// check if the depth texture is compatible\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tdepthTexture !== null &&\n\t\t\t\t\t\t\tproperties.has( depthTexture ) &&\n\t\t\t\t\t\t\t( renderTarget.width !== depthTexture.image.width || renderTarget.height !== depthTexture.image.height )\n\t\t\t\t\t\t) {\n\n\t\t\t\t\t\t\tthrow new Error( 'WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Swap the depth buffer to the currently attached one\n\t\t\t\t\t\ttextures.setupDepthRenderbuffer( renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst texture = renderTarget.texture;\n\n\t\t\t\tif ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer[ activeCubeFace ] ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ][ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tisCube = true;\n\n\t\t\t\t} else if ( ( renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t} else {\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t}\n\n\t\t\t// Use a scratch frame buffer if rendering to a mip level to avoid depth buffers\n\t\t\t// being bound that are different sizes.\n\t\t\tif ( activeMipmapLevel !== 0 ) {\n\n\t\t\t\tframebuffer = _scratchFrameBuffer;\n\n\t\t\t}\n\n\t\t\tconst framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( framebufferBound && useDefaultFramebuffer ) {\n\n\t\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport );\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\t\tconst layer = activeCubeFace;\n\n\t\t\t\tfor ( let i = 0; i < renderTarget.textures.length; i ++ ) {\n\n\t\t\t\t\tconst textureProperties = properties.get( renderTarget.textures[ i ] );\n\n\t\t\t\t\t_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, textureProperties.__webglTexture, activeMipmapLevel, layer );\n\n\t\t\t\t}\n\n\t\t\t} else if ( renderTarget !== null && activeMipmapLevel !== 0 ) {\n\n\t\t\t\t// Only bind the frame buffer if we are using a scratch frame buffer to render to a mipmap.\n\t\t\t\t// If we rebind the texture when using a multi sample buffer then an error about inconsistent samples will be thrown.\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t}\n\n\t\t\t_currentMaterialId = -1; // reset current material to ensure correct uniform bindings\n\n\t\t};\n\n\t\t/**\n\t\t * Reads the pixel data from the given render target into the given buffer.\n\t\t *\n\t\t * @param {WebGLRenderTarget} renderTarget - The render target to read from.\n\t\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t\t * @param {number} width - The width of the copy region.\n\t\t * @param {number} height - The height of the copy region.\n\t\t * @param {TypedArray} buffer - The result buffer.\n\t\t * @param {number} [activeCubeFaceIndex] - The active cube face index.\n\t\t * @param {number} [textureIndex=0] - The texture index of an MRT render target.\n\t\t */\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tconst texture = renderTarget.textures[ textureIndex ];\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t// when using MRT, select the correct color buffer for the subsequent read command\n\n\t\t\t\t\t\tif ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Asynchronous, non-blocking version of {@link WebGLRenderer#readRenderTargetPixels}.\n\t\t *\n\t\t * It is recommended to use this version of `readRenderTargetPixels()` whenever possible.\n\t\t *\n\t\t * @async\n\t\t * @param {WebGLRenderTarget} renderTarget - The render target to read from.\n\t\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t\t * @param {number} width - The width of the copy region.\n\t\t * @param {number} height - The height of the copy region.\n\t\t * @param {TypedArray} buffer - The result buffer.\n\t\t * @param {number} [activeCubeFaceIndex] - The active cube face index.\n\t\t * @param {number} [textureIndex=0] - The texture index of an MRT render target.\n\t\t * @return {Promise} A Promise that resolves when the read has been finished. The resolve provides the read data as a typed array.\n\t\t */\n\t\tthis.readRenderTargetPixelsAsync = async function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t// set the active frame buffer to the one we want to read\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\tconst texture = renderTarget.textures[ textureIndex ];\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst glBuffer = _gl.createBuffer();\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.bufferData( _gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ );\n\n\t\t\t\t\t// when using MRT, select the correct color buffer for the subsequent read command\n\n\t\t\t\t\tif ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );\n\n\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), 0 );\n\n\t\t\t\t\t// reset the frame buffer to the currently set buffer before waiting\n\t\t\t\t\tconst currFramebuffer = _currentRenderTarget !== null ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, currFramebuffer );\n\n\t\t\t\t\t// check if the commands have finished every 8 ms\n\t\t\t\t\tconst sync = _gl.fenceSync( _gl.SYNC_GPU_COMMANDS_COMPLETE, 0 );\n\n\t\t\t\t\t_gl.flush();\n\n\t\t\t\t\tawait probeAsync( _gl, sync, 4 );\n\n\t\t\t\t\t// read the data and delete the buffer\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.getBufferSubData( _gl.PIXEL_PACK_BUFFER, 0, buffer );\n\t\t\t\t\t_gl.deleteBuffer( glBuffer );\n\t\t\t\t\t_gl.deleteSync( sync );\n\n\t\t\t\t\treturn buffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Copies pixels from the current bound framebuffer into the given texture.\n\t\t *\n\t\t * @param {FramebufferTexture} texture - The texture.\n\t\t * @param {?Vector2} [position=null] - The start position of the copy operation.\n\t\t * @param {number} [level=0] - The mip level. The default represents the base mip.\n\t\t */\n\t\tthis.copyFramebufferToTexture = function ( texture, position = null, level = 0 ) {\n\n\t\t\tconst levelScale = Math.pow( 2, - level );\n\t\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\t\tconst x = position !== null ? position.x : 0;\n\t\t\tconst y = position !== null ? position.y : 0;\n\n\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t_gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, x, y, width, height );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tconst _srcFramebuffer = _gl.createFramebuffer();\n\t\tconst _dstFramebuffer = _gl.createFramebuffer();\n\n\t\t/**\n\t\t * Copies data of the given source texture into a destination texture.\n\t\t *\n\t\t * When using render target textures as `srcTexture` and `dstTexture`, you must make sure both render targets are initialized\n\t\t * {@link WebGLRenderer#initRenderTarget}.\n\t\t *\n\t\t * @param {Texture} srcTexture - The source texture.\n\t\t * @param {Texture} dstTexture - The destination texture.\n\t\t * @param {?(Box2|Box3)} [srcRegion=null] - A bounding box which describes the source region. Can be two or three-dimensional.\n\t\t * @param {?(Vector2|Vector3)} [dstPosition=null] - A vector that represents the origin of the destination region. Can be two or three-dimensional.\n\t\t * @param {number} [srcLevel=0] - The source mipmap level to copy.\n\t\t * @param {?number} [dstLevel=null] - The destination mipmap level.\n\t\t */\n\t\tthis.copyTextureToTexture = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = null ) {\n\n\t\t\t// support the previous signature with just a single dst mipmap level\n\t\t\tif ( dstLevel === null ) {\n\n\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t// @deprecated, r171\n\t\t\t\t\twarnOnce( 'WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels.' );\n\t\t\t\t\tdstLevel = srcLevel;\n\t\t\t\t\tsrcLevel = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdstLevel = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// gather the necessary dimensions to copy\n\t\t\tlet width, height, depth, minX, minY, minZ;\n\t\t\tlet dstX, dstY, dstZ;\n\t\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ dstLevel ] : srcTexture.image;\n\t\t\tif ( srcRegion !== null ) {\n\n\t\t\t\twidth = srcRegion.max.x - srcRegion.min.x;\n\t\t\t\theight = srcRegion.max.y - srcRegion.min.y;\n\t\t\t\tdepth = srcRegion.isBox3 ? srcRegion.max.z - srcRegion.min.z : 1;\n\t\t\t\tminX = srcRegion.min.x;\n\t\t\t\tminY = srcRegion.min.y;\n\t\t\t\tminZ = srcRegion.isBox3 ? srcRegion.min.z : 0;\n\n\t\t\t} else {\n\n\t\t\t\tconst levelScale = Math.pow( 2, - srcLevel );\n\t\t\t\twidth = Math.floor( image.width * levelScale );\n\t\t\t\theight = Math.floor( image.height * levelScale );\n\t\t\t\tif ( srcTexture.isDataArrayTexture ) {\n\n\t\t\t\t\tdepth = image.depth;\n\n\t\t\t\t} else if ( srcTexture.isData3DTexture ) {\n\n\t\t\t\t\tdepth = Math.floor( image.depth * levelScale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdepth = 1;\n\n\t\t\t\t}\n\n\t\t\t\tminX = 0;\n\t\t\t\tminY = 0;\n\t\t\t\tminZ = 0;\n\n\t\t\t}\n\n\t\t\tif ( dstPosition !== null ) {\n\n\t\t\t\tdstX = dstPosition.x;\n\t\t\t\tdstY = dstPosition.y;\n\t\t\t\tdstZ = dstPosition.z;\n\n\t\t\t} else {\n\n\t\t\t\tdstX = 0;\n\t\t\t\tdstY = 0;\n\t\t\t\tdstZ = 0;\n\n\t\t\t}\n\n\t\t\t// Set up the destination target\n\t\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\t\tconst glType = utils.convert( dstTexture.type );\n\t\t\tlet glTarget;\n\n\t\t\tif ( dstTexture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_3D;\n\n\t\t\t} else if ( dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D;\n\n\t\t\t}\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\t\t// used for copying data from cpu\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\t\t\tconst currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ );\n\n\t\t\t// set up the src texture\n\t\t\tconst isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture;\n\t\t\tconst isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture;\n\t\t\tif ( srcTexture.isDepthTexture ) {\n\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\t\t\t\tconst srcRenderTargetProperties = properties.get( srcTextureProperties.__renderTarget );\n\t\t\t\tconst dstRenderTargetProperties = properties.get( dstTextureProperties.__renderTarget );\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, srcRenderTargetProperties.__webglFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, dstRenderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// if the source or destination are a 3d target then a layer needs to be bound\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( srcTexture ).__webglTexture, srcLevel, minZ + i );\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( dstTexture ).__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.DEPTH_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else if ( srcLevel !== 0 || srcTexture.isRenderTargetTexture || properties.has( srcTexture ) ) {\n\n\t\t\t\t// get the appropriate frame buffers\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\n\t\t\t\t// bind the frame buffer targets\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, _srcFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, _dstFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// assign the correct layers and mip maps to the frame buffers\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, srcTextureProperties.__webglTexture, srcLevel, minZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, srcTextureProperties.__webglTexture, srcLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, dstTextureProperties.__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, dstTextureProperties.__webglTexture, dstLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// copy the data using the fastest function that can achieve the copy\n\t\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.COLOR_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t\t} else if ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.copyTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ + i, minX, minY, width, height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.copyTexSubImage2D( glTarget, dstLevel, dstX, dstY, minX, minY, width, height );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// unbind read, draw buffers\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t// copy data into the 3d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// copy data into the 2d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, image.width, image.height, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// reset values\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );\n\n\t\t\t// Generate mipmaps only when copying level 0\n\t\t\tif ( dstLevel === 0 && dstTexture.generateMipmaps ) {\n\n\t\t\t\t_gl.generateMipmap( glTarget );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the given WebGLRenderTarget memory. Useful for initializing a render target so data\n\t\t * can be copied into it using {@link WebGLRenderer#copyTextureToTexture} before it has been\n\t\t * rendered to.\n\t\t *\n\t\t * @param {WebGLRenderTarget} target - The render target.\n\t\t */\n\t\tthis.initRenderTarget = function ( target ) {\n\n\t\t\tif ( properties.get( target ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( target );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the given texture. Useful for preloading a texture rather than waiting until first\n\t\t * render (which can cause noticeable lags due to decode and GPU upload overhead).\n\t\t *\n\t\t * @param {Texture} texture - The texture.\n\t\t */\n\t\tthis.initTexture = function ( texture ) {\n\n\t\t\tif ( texture.isCubeTexture ) {\n\n\t\t\t\ttextures.setTextureCube( texture, 0 );\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( texture, 0 );\n\n\t\t\t} else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( texture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to reset the internal WebGL state. This method is mostly\n\t\t * relevant for applications which share a single WebGL context across\n\t\t * multiple WebGL libraries.\n\t\t */\n\t\tthis.resetState = function () {\n\n\t\t\t_currentActiveCubeFace = 0;\n\t\t\t_currentActiveMipmapLevel = 0;\n\t\t\t_currentRenderTarget = null;\n\n\t\t\tstate.reset();\n\t\t\tbindingStates.reset();\n\n\t\t};\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Defines the coordinate system of the renderer.\n\t *\n\t * In `WebGLRenderer`, the value is always `WebGLCoordinateSystem`.\n\t *\n\t * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}\n\t * @default WebGLCoordinateSystem\n\t * @readonly\n\t */\n\tget coordinateSystem() {\n\n\t\treturn WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * Defines the output color space of the renderer.\n\t *\n\t * @type {SRGBColorSpace|LinearSRGBColorSpace}\n\t * @default SRGBColorSpace\n\t */\n\tget outputColorSpace() {\n\n\t\treturn this._outputColorSpace;\n\n\t}\n\n\tset outputColorSpace( colorSpace ) {\n\n\t\tthis._outputColorSpace = colorSpace;\n\n\t\tconst gl = this.getContext();\n\t\tgl.drawingBufferColorSpace = ColorManagement._getDrawingBufferColorSpace( colorSpace );\n\t\tgl.unpackColorSpace = ColorManagement._getUnpackColorSpace();\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, ArrayCamera, BackSide, BoxGeometry, BufferAttribute, BufferGeometry, ByteType, CineonToneMapping, ClampToEdgeWrapping, Color, ColorManagement, ConstantAlphaFactor, ConstantColorFactor, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CustomToneMapping, Data3DTexture, DataArrayTexture, DataTexture, DepthFormat, DepthStencilFormat, DepthTexture, DoubleSide, DstAlphaFactor, DstColorFactor, EqualCompare, EqualDepth, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExternalTexture, FloatType, FrontSide, Frustum, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, HalfFloatType, IntType, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NoBlending, NoColorSpace, NoToneMapping, NormalBlending, NotEqualCompare, NotEqualDepth, ObjectSpaceNormalMap, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PerspectiveCamera, Plane, PlaneGeometry, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReverseSubtractEquation, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, SRGBTransfer, ShaderChunk, ShaderLib, ShaderMaterial, ShortType, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, SubtractEquation, SubtractiveBlending, TangentSpaceNormalMap, Texture, Uint16BufferAttribute, Uint32BufferAttribute, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WebXRController, ZeroFactor, createCanvasElement, error, log, warn, warnOnce };\n","import * as E from \"three\";\nimport { Controls as Na, Vector3 as Z, MOUSE as fn, TOUCH as cn, Quaternion as Ri, Spherical as fr, Vector2 as ce, Ray as Js, Plane as Ui, MathUtils as Lo, Mesh as Qs, OrthographicCamera as Bo, BufferGeometry as Fi, Float32BufferAttribute as dr, ShaderMaterial as et, UniformsUtils as yt, WebGLRenderTarget as dn, HalfFloatType as pn, NoBlending as pt, Clock as Oa, Color as je, Matrix4 as Ae, DataTexture as Io, RepeatWrapping as Zt, MeshNormalMaterial as Ua, AddEquation as Hn, ZeroFactor as Gn, DstAlphaFactor as pr, DstColorFactor as mr, CustomBlending as Fa, DepthTexture as Va, DepthStencilFormat as ja, UnsignedInt248Type as Ha, NearestFilter as Di, RGBAFormat as Ga, UnsignedByteType as Wa, AdditiveBlending as Xa, MeshBasicMaterial as hn, RawShaderMaterial as qa, ColorManagement as Li, SRGBTransfer as Ka, LinearToneMapping as Za, ReinhardToneMapping as Ya, CineonToneMapping as $a, ACESFilmicToneMapping as Ja, AgXToneMapping as Qa, NeutralToneMapping as el, CustomToneMapping as tl, Loader as zo, FileLoader as Bi, SRGBColorSpace as Rt, LinearSRGBColorSpace as lt, BufferAttribute as at, InterleavedBuffer as No, InterleavedBufferAttribute as Oo, TrianglesDrawMode as nl, TriangleFanDrawMode as Rs, TriangleStripDrawMode as Uo, LoaderUtils as In, MeshPhysicalMaterial as ht, SpotLight as il, PointLight as sl, DirectionalLight as rl, InstancedMesh as ol, InstancedBufferAttribute as al, Object3D as Fo, TextureLoader as ll, ImageBitmapLoader as cl, LinearMipmapLinearFilter as Vo, NearestMipmapLinearFilter as hl, LinearMipmapNearestFilter as ul, NearestMipmapNearestFilter as fl, LinearFilter as Ds, MirroredRepeatWrapping as dl, ClampToEdgeWrapping as pl, PointsMaterial as ml, Material as Zi, LineBasicMaterial as gl, MeshStandardMaterial as jo, DoubleSide as Vi, PropertyBinding as yl, SkinnedMesh as wl, LineSegments as _l, Line as xl, LineLoop as bl, Points as vl, Group as Yi, PerspectiveCamera as Sl, Skeleton as Tl, AnimationClip as El, Bone as Ml, InterpolateDiscrete as Al, InterpolateLinear as Ho, Texture as gr, VectorKeyframeTrack as yr, NumberKeyframeTrack as wr, QuaternionKeyframeTrack as _r, FrontSide as Ls, Interpolant as Cl, Box3 as nt, Sphere as Pl, Line3 as Ze, Triangle as Oe, BackSide as kl, REVISION as Go, Vector4 as $t, Matrix3 as Rl } from \"three\";\nclass Dl {\n engine;\n scene;\n constructor(e) {\n this.engine = e, this.scene = new E.Scene();\n let t = new E.Group();\n t.name = \"groupEdge\", this.scene.add(t);\n }\n}\nclass Ll {\n engine;\n // 透视相机\n perspectiveCamera;\n // 正交相机\n orthographicCamera;\n constructor(e) {\n this.engine = e, this.perspectiveCamera = new E.PerspectiveCamera(\n 60,\n this.engine.container.clientWidth / this.engine.container.clientHeight,\n 0.1,\n 1e3\n ), this.perspectiveCamera.position.set(2, 2, 2), this.perspectiveCamera.lookAt(0, 0, 0);\n const t = 50, n = this.engine.container.clientWidth / this.engine.container.clientHeight;\n this.orthographicCamera = new E.OrthographicCamera(t * n / -2, t * n / 2, t / 2, t / -2, 0.1, 1e3);\n }\n // 切换当前相机\n switchCurrentCamera() {\n this.engine.camera === this.perspectiveCamera ? this.switchToOrthographicCamera() : this.switchToPerspectiveCamera();\n }\n // 透视相机\n switchToPerspectiveCamera() {\n const e = this.engine.camera.position.clone(), t = this.engine.controls.target.clone();\n this.engine.camera = this.perspectiveCamera, this.engine.scene.camera = this.perspectiveCamera, this.perspectiveCamera.position.copy(e), this.perspectiveCamera.lookAt(t), this.engine.controlModule.orbitControls.object = this.perspectiveCamera, this.engine.controlModule.firstPersonControls.camera = this.perspectiveCamera, this.engine.composerModule.init();\n }\n // 正交相机\n switchToOrthographicCamera() {\n const e = this.engine.camera.position.clone(), t = this.engine.controls.target.clone();\n this.engine.camera = this.orthographicCamera, this.engine.scene.camera = this.orthographicCamera, this.orthographicCamera.position.copy(e), this.orthographicCamera.lookAt(t), this.engine.controlModule.orbitControls.object = this.orthographicCamera, this.engine.controlModule.firstPersonControls.camera = this.orthographicCamera, this.engine.composerModule.init();\n }\n // 获取当前相机类型\n getCameraType() {\n return this.engine.camera === this.perspectiveCamera ? \"perspective\" : this.engine.camera === this.orthographicCamera ? \"orthographic\" : \"perspective\";\n }\n // 获取当前相机姿态\n getCameraPose() {\n const e = this.engine.camera, t = this.getCameraType(), n = {\n type: t,\n position: {\n x: e.position.x,\n y: e.position.y,\n z: e.position.z\n },\n rotation: {\n x: e.rotation.x,\n y: e.rotation.y,\n z: e.rotation.z\n },\n quaternion: {\n x: e.quaternion.x,\n y: e.quaternion.y,\n z: e.quaternion.z,\n w: e.quaternion.w\n }\n };\n return this.engine.controls && this.engine.controls.target && (n.target = {\n x: this.engine.controls.target.x,\n y: this.engine.controls.target.y,\n z: this.engine.controls.target.z\n }), t === \"orthographic\" && (n.zoom = e.zoom), n;\n }\n // 通过相机姿态还原相机位置\n restoreCameraPose(e) {\n this.getCameraType() !== e.type && (e.type === \"perspective\" ? this.switchToPerspectiveCamera() : this.switchToOrthographicCamera());\n const n = this.engine.camera;\n n.position.set(e.position.x, e.position.y, e.position.z), e.quaternion ? n.quaternion.set(\n e.quaternion.x,\n e.quaternion.y,\n e.quaternion.z,\n e.quaternion.w\n ) : e.rotation && n.rotation.set(e.rotation.x, e.rotation.y, e.rotation.z), e.target && this.engine.controls && this.engine.controls.target && this.engine.controls.target.set(\n e.target.x,\n e.target.y,\n e.target.z\n ), e.type === \"orthographic\" && e.zoom !== void 0 && (n.zoom = e.zoom, n.updateProjectionMatrix()), n.updateMatrix(), n.updateMatrixWorld(!0), this.engine.controls && this.engine.controls.update && this.engine.controls.update();\n }\n}\nclass Bl {\n engine;\n deviceType;\n constructor(e) {\n this.engine = e, this.deviceType = \"PC\";\n }\n // 获取设备类型\n getDeviceType() {\n return this.deviceType;\n }\n // 获取容器尺寸\n getContainerSize() {\n return {\n width: this.engine.container.clientWidth,\n height: this.engine.container.clientHeight\n };\n }\n}\nclass Il {\n engine;\n renderer;\n constructor(e) {\n this.engine = e, this.renderer = null;\n }\n createRenderer() {\n const { width: e, height: t } = this.engine.deviceModule.getContainerSize();\n return this.renderer = new E.WebGLRenderer({\n antialias: this.engine.options.antialias ?? !0,\n alpha: !0,\n premultipliedAlpha: !1,\n stencil: !0\n }), this.renderer.setClearColor(0, 0), this.renderer.setSize(e, t), this.renderer.setPixelRatio(window.devicePixelRatio), this.renderer.shadowMap.enabled = !0, this.renderer.shadowMap.type = E.PCFSoftShadowMap, this.renderer.localClippingEnabled = !0, this.renderer.outputColorSpace = E.SRGBColorSpace, this.renderer.toneMapping = E.ACESFilmicToneMapping, this.renderer.toneMappingExposure = 1.5, this.engine.container.appendChild(this.renderer.domElement), this.renderer;\n }\n disposeRenderer() {\n this.renderer?.dispose();\n }\n}\nconst xr = { type: \"change\" }, er = { type: \"start\" }, Wo = { type: \"end\" }, Wn = new Js(), br = new Ui(), zl = Math.cos(70 * Lo.DEG2RAD), be = new Z(), ze = 2 * Math.PI, de = {\n NONE: -1,\n ROTATE: 0,\n DOLLY: 1,\n PAN: 2,\n TOUCH_ROTATE: 3,\n TOUCH_PAN: 4,\n TOUCH_DOLLY_PAN: 5,\n TOUCH_DOLLY_ROTATE: 6\n}, $i = 1e-6;\nclass Nl extends Na {\n /**\n * Constructs a new controls instance.\n *\n * @param {Object3D} object - The object that is managed by the controls.\n * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n */\n constructor(e, t, n = null) {\n super(t, n), this.engine = e, this.state = de.NONE, this.target = new Z(), this.cursor = new Z(), this.origin = new Z(0, 0, 0), this.showOriginIcon = !0, this.originPosition = {\n x: 0,\n y: 0\n }, this.minDistance = 0, this.maxDistance = 1 / 0, this.minZoom = 0, this.maxZoom = 1 / 0, this.minTargetRadius = 0, this.maxTargetRadius = 1 / 0, this.minPolarAngle = 0, this.maxPolarAngle = Math.PI, this.minAzimuthAngle = -1 / 0, this.maxAzimuthAngle = 1 / 0, this.enableDamping = !1, this.dampingFactor = 0.05, this.enableZoom = !0, this.zoomSpeed = 1, this.enableRotate = !0, this.rotateSpeed = 1, this.keyRotateSpeed = 1, this.enablePan = !0, this.panSpeed = 1, this.screenSpacePanning = !0, this.keyPanSpeed = 7, this.zoomToCursor = !1, this.autoRotate = !1, this.autoRotateSpeed = 2, this.keys = { LEFT: \"ArrowLeft\", UP: \"ArrowUp\", RIGHT: \"ArrowRight\", BOTTOM: \"ArrowDown\" }, this.mouseButtons = { LEFT: fn.ROTATE, MIDDLE: fn.DOLLY, RIGHT: fn.PAN }, this.touches = { ONE: cn.ROTATE, TWO: cn.DOLLY_PAN }, this.target0 = this.target.clone(), this.position0 = this.object.position.clone(), this.zoom0 = this.object.zoom, this._domElementKeyEvents = null, this._lastPosition = new Z(), this._lastQuaternion = new Ri(), this._lastTargetPosition = new Z(), this._quat = new Ri().setFromUnitVectors(t.up, new Z(0, 1, 0)), this._quatInverse = this._quat.clone().invert(), this._spherical = new fr(), this._sphericalDelta = new fr(), this._scale = 1, this._panOffset = new Z(), this._rotateStart = new ce(), this._rotateEnd = new ce(), this._rotateDelta = new ce(), this._panStart = new ce(), this._panEnd = new ce(), this._panDelta = new ce(), this._dollyStart = new ce(), this._dollyEnd = new ce(), this._dollyDelta = new ce(), this._dollyDirection = new Z(), this._mouse = new ce(), this._performCursorZoom = !1, this._pointers = [], this._pointerPositions = {}, this._controlActive = !1, this._onPointerMove = Ul.bind(this), this._onPointerDown = Ol.bind(this), this._onPointerUp = Fl.bind(this), this._onContextMenu = ql.bind(this), this._onMouseWheel = Hl.bind(this), this._onKeyDown = Gl.bind(this), this._onTouchStart = Wl.bind(this), this._onTouchMove = Xl.bind(this), this._onMouseDown = Vl.bind(this), this._onMouseMove = jl.bind(this), this._interceptControlDown = Kl.bind(this), this._interceptControlUp = Zl.bind(this), this.domElement !== null && this.connect(this.domElement), this.update();\n }\n connect(e) {\n super.connect(e), this.domElement.addEventListener(\"pointerdown\", this._onPointerDown), this.domElement.addEventListener(\"pointercancel\", this._onPointerUp), this.domElement.addEventListener(\"contextmenu\", this._onContextMenu), this.domElement.addEventListener(\"wheel\", this._onMouseWheel, { passive: !1 }), this.domElement.getRootNode().addEventListener(\"keydown\", this._interceptControlDown, { passive: !0, capture: !0 }), this.domElement.style.touchAction = \"none\";\n }\n disconnect() {\n this.domElement.removeEventListener(\"pointerdown\", this._onPointerDown), this.domElement.removeEventListener(\"pointermove\", this._onPointerMove), this.domElement.removeEventListener(\"pointerup\", this._onPointerUp), this.domElement.removeEventListener(\"pointercancel\", this._onPointerUp), this.domElement.removeEventListener(\"wheel\", this._onMouseWheel), this.domElement.removeEventListener(\"contextmenu\", this._onContextMenu), this.stopListenToKeyEvents(), this.domElement.getRootNode().removeEventListener(\"keydown\", this._interceptControlDown, { capture: !0 }), this.domElement.style.touchAction = \"auto\";\n }\n dispose() {\n this.disconnect();\n }\n /**\n * Get the current vertical rotation, in radians.\n *\n * @return {number} The current vertical rotation, in radians.\n */\n getPolarAngle() {\n return this._spherical.phi;\n }\n /**\n * Get the current horizontal rotation, in radians.\n *\n * @return {number} The current horizontal rotation, in radians.\n */\n getAzimuthalAngle() {\n return this._spherical.theta;\n }\n /**\n * Returns the distance from the camera to the target.\n *\n * @return {number} The distance from the camera to the target.\n */\n getDistance() {\n return this.object.position.distanceTo(this.target);\n }\n /**\n * Adds key event listeners to the given DOM element.\n * `window` is a recommended argument for using this method.\n *\n * @param {HTMLElement} domElement - The DOM element\n */\n listenToKeyEvents(e) {\n e.addEventListener(\"keydown\", this._onKeyDown), this._domElementKeyEvents = e;\n }\n /**\n * Removes the key event listener previously defined with `listenToKeyEvents()`.\n */\n stopListenToKeyEvents() {\n this._domElementKeyEvents !== null && (this._domElementKeyEvents.removeEventListener(\"keydown\", this._onKeyDown), this._domElementKeyEvents = null);\n }\n /**\n * Save the current state of the controls. This can later be recovered with `reset()`.\n */\n saveState() {\n this.target0.copy(this.target), this.position0.copy(this.object.position), this.zoom0 = this.object.zoom;\n }\n /**\n * Reset the controls to their state from either the last time the `saveState()`\n * was called, or the initial state.\n */\n reset() {\n this.target.copy(this.target0), this.object.position.copy(this.position0), this.object.zoom = this.zoom0, this.object.updateProjectionMatrix(), this.dispatchEvent(xr), this.update(), this.state = de.NONE;\n }\n update(e = null) {\n this.engine && this.engine.interactionManager && this.engine.interactionManager.origin && this.origin.copy(this.engine.interactionManager.origin);\n const t = this.object.position;\n be.copy(t).sub(this.target), be.applyQuaternion(this._quat), this._spherical.setFromVector3(be), this.autoRotate && this.state === de.NONE && this._rotateLeft(this._getAutoRotationAngle(e)), this.enableDamping ? (this._spherical.theta += this._sphericalDelta.theta * this.dampingFactor, this._spherical.phi += this._sphericalDelta.phi * this.dampingFactor) : (this._spherical.theta += this._sphericalDelta.theta, this._spherical.phi += this._sphericalDelta.phi);\n let n = this.minAzimuthAngle, i = this.maxAzimuthAngle;\n isFinite(n) && isFinite(i) && (n < -Math.PI ? n += ze : n > Math.PI && (n -= ze), i < -Math.PI ? i += ze : i > Math.PI && (i -= ze), n <= i ? this._spherical.theta = Math.max(n, Math.min(i, this._spherical.theta)) : this._spherical.theta = this._spherical.theta > (n + i) / 2 ? Math.max(n, this._spherical.theta) : Math.min(i, this._spherical.theta)), this._spherical.phi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, this._spherical.phi)), this._spherical.makeSafe(), this.enableDamping === !0 ? this.target.addScaledVector(this._panOffset, this.dampingFactor) : this.target.add(this._panOffset), this.target.sub(this.cursor), this.target.clampLength(this.minTargetRadius, this.maxTargetRadius), this.target.add(this.cursor);\n let o = !1;\n if (this.zoomToCursor && this._performCursorZoom || this.object.isOrthographicCamera)\n this._spherical.radius = this._clampDistance(this._spherical.radius);\n else {\n const r = this._spherical.radius;\n this._spherical.radius = this._clampDistance(this._spherical.radius * this._scale), o = r != this._spherical.radius;\n }\n if (be.setFromSpherical(this._spherical), be.applyQuaternion(this._quatInverse), this.engine && this.engine.DeviceType === \"PC\") {\n const r = new Z();\n if (r.copy(this.origin).sub(this.target), r.lengthSq() > 1e-4 && (this._sphericalDelta.theta !== 0 || this._sphericalDelta.phi !== 0)) {\n const l = this.enableDamping ? this.dampingFactor * 3 : 1, h = new Z(0, 1, 0), c = new Z();\n this.object.getWorldDirection(c);\n const u = c.clone().cross(h).normalize(), d = new Z().copy(this.object.position).sub(this.origin);\n d.applyAxisAngle(h, Math.PI * this._sphericalDelta.theta * l), d.applyAxisAngle(u, Math.PI * this._sphericalDelta.phi * l), t.copy(this.origin).add(d);\n const p = new Z().copy(this.target).sub(this.origin);\n p.applyAxisAngle(h, Math.PI * this._sphericalDelta.theta * l), p.applyAxisAngle(u, Math.PI * this._sphericalDelta.phi * l), this.target.copy(this.origin).add(p);\n } else if (this._panOffset.lengthSq() === 0 && this._sphericalDelta.phi === 0 && this._sphericalDelta.theta === 0) {\n if (this._scale !== 1) {\n const l = new Z();\n this.object.getWorldDirection(l);\n const h = this._spherical.radius * 0.05 * (this._scale - 1);\n t.add(l.multiplyScalar(h));\n }\n } else\n t.copy(this.target).add(be);\n this.object.lookAt(this.target);\n } else\n t.copy(this.target).add(be), this.object.lookAt(this.target);\n if (this.enableDamping === !0 ? (this._sphericalDelta.theta *= 1 - this.dampingFactor, this._sphericalDelta.phi *= 1 - this.dampingFactor, this._panOffset.multiplyScalar(1 - this.dampingFactor)) : (this._sphericalDelta.set(0, 0, 0), this._panOffset.set(0, 0, 0)), this.zoomToCursor && this._performCursorZoom) {\n let r = null;\n if (this.object.isPerspectiveCamera) {\n const a = be.length();\n r = this._clampDistance(a * this._scale);\n const l = a - r;\n this.object.position.addScaledVector(this._dollyDirection, l), this.object.updateMatrixWorld(), o = !!l;\n } else if (this.object.isOrthographicCamera) {\n const a = new Z(this._mouse.x, this._mouse.y, 0);\n a.unproject(this.object);\n const l = this.object.zoom;\n this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / this._scale)), this.object.updateProjectionMatrix(), o = l !== this.object.zoom;\n const h = new Z(this._mouse.x, this._mouse.y, 0);\n h.unproject(this.object), this.object.position.sub(h).add(a), this.object.updateMatrixWorld(), r = be.length();\n } else\n console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.\"), this.zoomToCursor = !1;\n r !== null && (this.screenSpacePanning ? this.target.set(0, 0, -1).transformDirection(this.object.matrix).multiplyScalar(r).add(this.object.position) : (Wn.origin.copy(this.object.position), Wn.direction.set(0, 0, -1).transformDirection(this.object.matrix), Math.abs(this.object.up.dot(Wn.direction)) < zl ? this.object.lookAt(this.target) : (br.setFromNormalAndCoplanarPoint(this.object.up, this.target), Wn.intersectPlane(br, this.target))));\n } else if (this.object.isOrthographicCamera) {\n const r = this.object.zoom;\n this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / this._scale)), r !== this.object.zoom && (this.object.updateProjectionMatrix(), o = !0);\n }\n return this._scale = 1, this._performCursorZoom = !1, o || this._lastPosition.distanceToSquared(this.object.position) > $i || 8 * (1 - this._lastQuaternion.dot(this.object.quaternion)) > $i || this._lastTargetPosition.distanceToSquared(this.target) > $i ? (this.dispatchEvent(xr), this._lastPosition.copy(this.object.position), this._lastQuaternion.copy(this.object.quaternion), this._lastTargetPosition.copy(this.target), !0) : !1;\n }\n _getAutoRotationAngle(e) {\n return e !== null ? ze / 60 * this.autoRotateSpeed * e : ze / 60 / 60 * this.autoRotateSpeed;\n }\n _getZoomScale(e) {\n const t = Math.abs(e * 0.01);\n return Math.pow(0.95, this.zoomSpeed * t);\n }\n _rotateLeft(e) {\n this._sphericalDelta.theta -= e;\n }\n _rotateUp(e) {\n this._sphericalDelta.phi -= e;\n }\n _panLeft(e, t) {\n be.setFromMatrixColumn(t, 0), be.multiplyScalar(-e), this._panOffset.add(be);\n }\n _panUp(e, t) {\n this.screenSpacePanning === !0 ? be.setFromMatrixColumn(t, 1) : (be.setFromMatrixColumn(t, 0), be.crossVectors(this.object.up, be)), be.multiplyScalar(e), this._panOffset.add(be);\n }\n // deltaX and deltaY are in pixels; right and down are positive\n _pan(e, t) {\n const n = this.domElement;\n if (this.object.isPerspectiveCamera) {\n const i = this.object.position;\n be.copy(i).sub(this.target);\n let o = be.length();\n o *= Math.tan(this.object.fov / 2 * Math.PI / 180), this._panLeft(2 * e * o / n.clientHeight, this.object.matrix), this._panUp(2 * t * o / n.clientHeight, this.object.matrix);\n } else this.object.isOrthographicCamera ? (this._panLeft(e * (this.object.right - this.object.left) / this.object.zoom / n.clientWidth, this.object.matrix), this._panUp(t * (this.object.top - this.object.bottom) / this.object.zoom / n.clientHeight, this.object.matrix)) : (console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.\"), this.enablePan = !1);\n }\n _dollyOut(e) {\n this.object.isPerspectiveCamera || this.object.isOrthographicCamera ? this._scale /= e : (console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\"), this.enableZoom = !1);\n }\n _dollyIn(e) {\n this.object.isPerspectiveCamera || this.object.isOrthographicCamera ? this._scale *= e : (console.warn(\"WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.\"), this.enableZoom = !1);\n }\n _updateZoomParameters(e, t) {\n if (!this.zoomToCursor)\n return;\n this._performCursorZoom = !0;\n const n = this.domElement.getBoundingClientRect(), i = e - n.left, o = t - n.top, r = n.width, a = n.height;\n this._mouse.x = i / r * 2 - 1, this._mouse.y = -(o / a) * 2 + 1, this._dollyDirection.set(this._mouse.x, this._mouse.y, 1).unproject(this.object).sub(this.object.position).normalize();\n }\n _clampDistance(e) {\n return Math.max(this.minDistance, Math.min(this.maxDistance, e));\n }\n //\n // event callbacks - update the object state\n //\n _handleMouseDownRotate(e) {\n this._rotateStart.set(e.clientX, e.clientY);\n }\n _handleMouseDownDolly(e) {\n this._updateZoomParameters(e.clientX, e.clientX), this._dollyStart.set(e.clientX, e.clientY);\n }\n _handleMouseDownPan(e) {\n this._panStart.set(e.clientX, e.clientY);\n }\n _handleMouseMoveRotate(e) {\n this._rotateEnd.set(e.clientX, e.clientY), this._rotateDelta.subVectors(this._rotateEnd, this._rotateStart).multiplyScalar(this.rotateSpeed);\n const t = this.domElement;\n this._rotateLeft(ze * this._rotateDelta.x / t.clientHeight), this._rotateUp(ze * this._rotateDelta.y / t.clientHeight), this._rotateStart.copy(this._rotateEnd), this.update();\n }\n _handleMouseMoveDolly(e) {\n this._dollyEnd.set(e.clientX, e.clientY), this._dollyDelta.subVectors(this._dollyEnd, this._dollyStart), this._dollyDelta.y > 0 ? this._dollyOut(this._getZoomScale(this._dollyDelta.y)) : this._dollyDelta.y < 0 && this._dollyIn(this._getZoomScale(this._dollyDelta.y)), this._dollyStart.copy(this._dollyEnd), this.update();\n }\n _handleMouseMovePan(e) {\n this._panEnd.set(e.clientX, e.clientY), this._panDelta.subVectors(this._panEnd, this._panStart).multiplyScalar(this.panSpeed), this._pan(this._panDelta.x, this._panDelta.y), this._panStart.copy(this._panEnd), this.update();\n }\n _handleMouseWheel(e) {\n this._updateZoomParameters(e.clientX, e.clientY), e.deltaY < 0 ? this._dollyIn(this._getZoomScale(e.deltaY)) : e.deltaY > 0 && this._dollyOut(this._getZoomScale(e.deltaY)), this.update();\n }\n _handleKeyDown(e) {\n let t = !1;\n switch (e.code) {\n case this.keys.UP:\n e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateUp(ze * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(0, this.keyPanSpeed), t = !0;\n break;\n case this.keys.BOTTOM:\n e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateUp(-ze * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(0, -this.keyPanSpeed), t = !0;\n break;\n case this.keys.LEFT:\n e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateLeft(ze * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(this.keyPanSpeed, 0), t = !0;\n break;\n case this.keys.RIGHT:\n e.ctrlKey || e.metaKey || e.shiftKey ? this.enableRotate && this._rotateLeft(-ze * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(-this.keyPanSpeed, 0), t = !0;\n break;\n }\n t && (e.preventDefault(), this.update());\n }\n _handleTouchStartRotate(e) {\n if (this._pointers.length === 1)\n this._rotateStart.set(e.pageX, e.pageY);\n else {\n const t = this._getSecondPointerPosition(e), n = 0.5 * (e.pageX + t.x), i = 0.5 * (e.pageY + t.y);\n this._rotateStart.set(n, i);\n }\n }\n _handleTouchStartPan(e) {\n if (this._pointers.length === 1)\n this._panStart.set(e.pageX, e.pageY);\n else {\n const t = this._getSecondPointerPosition(e), n = 0.5 * (e.pageX + t.x), i = 0.5 * (e.pageY + t.y);\n this._panStart.set(n, i);\n }\n }\n _handleTouchStartDolly(e) {\n const t = this._getSecondPointerPosition(e), n = e.pageX - t.x, i = e.pageY - t.y, o = Math.sqrt(n * n + i * i);\n this._dollyStart.set(0, o);\n }\n _handleTouchStartDollyPan(e) {\n this.enableZoom && this._handleTouchStartDolly(e), this.enablePan && this._handleTouchStartPan(e);\n }\n _handleTouchStartDollyRotate(e) {\n this.enableZoom && this._handleTouchStartDolly(e), this.enableRotate && this._handleTouchStartRotate(e);\n }\n _handleTouchMoveRotate(e) {\n if (this._pointers.length == 1)\n this._rotateEnd.set(e.pageX, e.pageY);\n else {\n const n = this._getSecondPointerPosition(e), i = 0.5 * (e.pageX + n.x), o = 0.5 * (e.pageY + n.y);\n this._rotateEnd.set(i, o);\n }\n this._rotateDelta.subVectors(this._rotateEnd, this._rotateStart).multiplyScalar(this.rotateSpeed);\n const t = this.domElement;\n this._rotateLeft(ze * this._rotateDelta.x / t.clientHeight), this._rotateUp(ze * this._rotateDelta.y / t.clientHeight), this._rotateStart.copy(this._rotateEnd);\n }\n _handleTouchMovePan(e) {\n if (this._pointers.length === 1)\n this._panEnd.set(e.pageX, e.pageY);\n else {\n const t = this._getSecondPointerPosition(e), n = 0.5 * (e.pageX + t.x), i = 0.5 * (e.pageY + t.y);\n this._panEnd.set(n, i);\n }\n this._panDelta.subVectors(this._panEnd, this._panStart).multiplyScalar(this.panSpeed), this._pan(this._panDelta.x, this._panDelta.y), this._panStart.copy(this._panEnd);\n }\n _handleTouchMoveDolly(e) {\n const t = this._getSecondPointerPosition(e), n = e.pageX - t.x, i = e.pageY - t.y, o = Math.sqrt(n * n + i * i);\n this._dollyEnd.set(0, o), this._dollyDelta.set(0, Math.pow(this._dollyEnd.y / this._dollyStart.y, this.zoomSpeed)), this._dollyOut(this._dollyDelta.y), this._dollyStart.copy(this._dollyEnd);\n const r = (e.pageX + t.x) * 0.5, a = (e.pageY + t.y) * 0.5;\n this._updateZoomParameters(r, a);\n }\n _handleTouchMoveDollyPan(e) {\n this.enableZoom && this._handleTouchMoveDolly(e), this.enablePan && this._handleTouchMovePan(e);\n }\n _handleTouchMoveDollyRotate(e) {\n this.enableZoom && this._handleTouchMoveDolly(e), this.enableRotate && this._handleTouchMoveRotate(e);\n }\n // pointers\n _addPointer(e) {\n this._pointers.push(e.pointerId);\n }\n _removePointer(e) {\n delete this._pointerPositions[e.pointerId];\n for (let t = 0; t < this._pointers.length; t++)\n if (this._pointers[t] == e.pointerId) {\n this._pointers.splice(t, 1);\n return;\n }\n }\n _isTrackingPointer(e) {\n for (let t = 0; t < this._pointers.length; t++)\n if (this._pointers[t] == e.pointerId) return !0;\n return !1;\n }\n _trackPointer(e) {\n let t = this._pointerPositions[e.pointerId];\n t === void 0 && (t = new ce(), this._pointerPositions[e.pointerId] = t), t.set(e.pageX, e.pageY);\n }\n _getSecondPointerPosition(e) {\n const t = e.pointerId === this._pointers[0] ? this._pointers[1] : this._pointers[0];\n return this._pointerPositions[t];\n }\n //\n _customWheelEvent(e) {\n const t = e.deltaMode, n = {\n clientX: e.clientX,\n clientY: e.clientY,\n deltaY: e.deltaY\n };\n switch (t) {\n case 1:\n n.deltaY *= 16;\n break;\n case 2:\n n.deltaY *= 100;\n break;\n }\n return e.ctrlKey && !this._controlActive && (n.deltaY *= 10), n;\n }\n}\nfunction Ol(s) {\n this.enabled !== !1 && (this._pointers.length === 0 && (this.domElement.setPointerCapture(s.pointerId), this.domElement.addEventListener(\"pointermove\", this._onPointerMove), this.domElement.addEventListener(\"pointerup\", this._onPointerUp)), !this._isTrackingPointer(s) && (this._addPointer(s), s.pointerType === \"touch\" ? this._onTouchStart(s) : this._onMouseDown(s)));\n}\nfunction Ul(s) {\n this.enabled !== !1 && (s.pointerType === \"touch\" ? this._onTouchMove(s) : this._onMouseMove(s));\n}\nfunction Fl(s) {\n switch (this._removePointer(s), this._pointers.length) {\n case 0:\n this.domElement.releasePointerCapture(s.pointerId), this.domElement.removeEventListener(\"pointermove\", this._onPointerMove), this.domElement.removeEventListener(\"pointerup\", this._onPointerUp), this.dispatchEvent(Wo), this.state = de.NONE;\n break;\n case 1:\n const e = this._pointers[0], t = this._pointerPositions[e];\n this._onTouchStart({ pointerId: e, pageX: t.x, pageY: t.y });\n break;\n }\n}\nfunction Vl(s) {\n if (this.showOriginIcon && this.engine && this.engine.ToolUntils) {\n const t = this.engine.scene?.camera || this.object;\n this.originPosition = this.engine.ToolUntils.WorldPointToScreenPoint(this.origin.clone(), t), console.log(\"Origin position:\", this.originPosition, \"Origin:\", this.origin);\n }\n let e;\n switch (s.button) {\n case 0:\n e = this.mouseButtons.LEFT;\n break;\n case 1:\n e = this.mouseButtons.MIDDLE;\n break;\n case 2:\n e = this.mouseButtons.RIGHT;\n break;\n default:\n e = -1;\n }\n switch (e) {\n case fn.DOLLY:\n if (this.enableZoom === !1) return;\n this._handleMouseDownDolly(s), this.state = de.DOLLY;\n break;\n case fn.ROTATE:\n if (s.ctrlKey || s.metaKey || s.shiftKey) {\n if (this.enablePan === !1) return;\n this._handleMouseDownPan(s), this.state = de.PAN;\n } else {\n if (this.enableRotate === !1) return;\n this._handleMouseDownRotate(s), this.state = de.ROTATE;\n }\n break;\n case fn.PAN:\n if (s.ctrlKey || s.metaKey || s.shiftKey) {\n if (this.enableRotate === !1) return;\n this._handleMouseDownRotate(s), this.state = de.ROTATE;\n } else {\n if (this.enablePan === !1) return;\n this._handleMouseDownPan(s), this.state = de.PAN;\n }\n break;\n default:\n this.state = de.NONE;\n }\n this.state !== de.NONE && this.dispatchEvent(er);\n}\nfunction jl(s) {\n switch (this.state) {\n case de.ROTATE:\n if (this.enableRotate === !1) return;\n this._handleMouseMoveRotate(s);\n break;\n case de.DOLLY:\n if (this.enableZoom === !1) return;\n this._handleMouseMoveDolly(s);\n break;\n case de.PAN:\n if (this.enablePan === !1) return;\n this._handleMouseMovePan(s);\n break;\n }\n}\nfunction Hl(s) {\n this.enabled === !1 || this.enableZoom === !1 || this.state !== de.NONE || (s.preventDefault(), this.dispatchEvent(er), this._handleMouseWheel(this._customWheelEvent(s)), this.dispatchEvent(Wo));\n}\nfunction Gl(s) {\n this.enabled !== !1 && this._handleKeyDown(s);\n}\nfunction Wl(s) {\n switch (this._trackPointer(s), this._pointers.length) {\n case 1:\n switch (this.touches.ONE) {\n case cn.ROTATE:\n if (this.enableRotate === !1) return;\n this._handleTouchStartRotate(s), this.state = de.TOUCH_ROTATE;\n break;\n case cn.PAN:\n if (this.enablePan === !1) return;\n this._handleTouchStartPan(s), this.state = de.TOUCH_PAN;\n break;\n default:\n this.state = de.NONE;\n }\n break;\n case 2:\n switch (this.touches.TWO) {\n case cn.DOLLY_PAN:\n if (this.enableZoom === !1 && this.enablePan === !1) return;\n this._handleTouchStartDollyPan(s), this.state = de.TOUCH_DOLLY_PAN;\n break;\n case cn.DOLLY_ROTATE:\n if (this.enableZoom === !1 && this.enableRotate === !1) return;\n this._handleTouchStartDollyRotate(s), this.state = de.TOUCH_DOLLY_ROTATE;\n break;\n default:\n this.state = de.NONE;\n }\n break;\n default:\n this.state = de.NONE;\n }\n this.state !== de.NONE && this.dispatchEvent(er);\n}\nfunction Xl(s) {\n switch (this._trackPointer(s), this.state) {\n case de.TOUCH_ROTATE:\n if (this.enableRotate === !1) return;\n this._handleTouchMoveRotate(s), this.update();\n break;\n case de.TOUCH_PAN:\n if (this.enablePan === !1) return;\n this._handleTouchMovePan(s), this.update();\n break;\n case de.TOUCH_DOLLY_PAN:\n if (this.enableZoom === !1 && this.enablePan === !1) return;\n this._handleTouchMoveDollyPan(s), this.update();\n break;\n case de.TOUCH_DOLLY_ROTATE:\n if (this.enableZoom === !1 && this.enableRotate === !1) return;\n this._handleTouchMoveDollyRotate(s), this.update();\n break;\n default:\n this.state = de.NONE;\n }\n}\nfunction ql(s) {\n this.enabled !== !1 && s.preventDefault();\n}\nfunction Kl(s) {\n s.key === \"Control\" && (this._controlActive = !0, this.domElement.getRootNode().addEventListener(\"keyup\", this._interceptControlUp, { passive: !0, capture: !0 }));\n}\nfunction Zl(s) {\n s.key === \"Control\" && (this._controlActive = !1, this.domElement.getRootNode().removeEventListener(\"keyup\", this._interceptControlUp, { passive: !0, capture: !0 }));\n}\nclass vr {\n constructor(e, t, n, i) {\n this._Engine = e, this.camera = t, this.domElement = n, this._isEnabled = !1, this._rayOriginOffset = new E.Vector3(0, -1, 0), this._camerLocalDirection = new E.Vector3(), this._tmpVector = new E.Vector3(), this._rayCaster = new E.Raycaster(), this._fallingTime = 0, this._euler = new E.Euler(0, 0, 0, \"YZX\"), this._prevMouseX = 0, this._prevMouseY = 0, this.applyGravity = !1, this.gravityMinHeight = !0, this.applyCollision = !0, this.positionEasing = !0, this.lookflag = 1, this.lookSpeed = 8e-3, this.moveSpeed = 0.02, this.playerHeight = 1.4, this.maxRotateX = 0.8, this.g = 9.8, this.bindmousedown = this._Engine && this._Engine.DeviceType !== \"PC\" ? this.onTouchStart.bind(this) : this.onMouseDown.bind(this), this.bindmouseup = this._Engine && this._Engine.DeviceType !== \"PC\" ? this.onTouchEnd.bind(this) : this.onMouseUp.bind(this), this.bindmousemove = this._Engine && this._Engine.DeviceType !== \"PC\" ? this.onTouchMove.bind(this) : this.onMouseMove.bind(this), this.bindonKeyDown = this.onKeyDown.bind(this), this.bindonKeyUp = this.onKeyUp.bind(this), this.bindMousewheel = this.onMousewheel.bind(this), this.needMousewheel = !1, this.moveWheelRun = !0, this.moveWheelStop = !1, this.wheelClock, this.keydown = !1, this.GetEngine = () => e;\n }\n /**\n * @param {Object} colliders set objects for collision detection\n */\n set colliders(e) {\n this._rayCastObjects = e;\n }\n /**\n * @param {boolean} isEnabled set if this camera control is enabled\n */\n set enabled(e) {\n this._isEnabled !== e && (this._isEnabled = e, this._euler.setFromQuaternion(this.camera.quaternion), e ? this.addEvents() : this.removeEvents());\n }\n /**\n * @description: getter if current camera control is enabled.\n */\n get enabled() {\n return this._isEnabled;\n }\n addEvents() {\n const e = this._Engine?.DeviceType, t = e === \"PC\" || !e;\n console.log(\"[FirstPersonCameraControl] addEvents - DeviceType:\", e, \"isPC:\", t), t ? (console.log(\"[FirstPersonCameraControl] 添加鼠标事件监听器 - mousedown, mouseup\"), this.domElement.addEventListener(\"mousedown\", this.bindmousedown, !1), this.domElement.addEventListener(\"mouseup\", this.bindmouseup, !1)) : (console.log(\"[FirstPersonCameraControl] 添加触摸事件监听器\"), this.domElement.addEventListener(\"touchstart\", this.bindmousedown, !1), this.domElement.addEventListener(\"touchend\", this.bindmouseup, !1)), window.addEventListener(\"keydown\", this.bindonKeyDown, !1), window.addEventListener(\"keyup\", this.bindonKeyUp, !1), this.needMousewheel && (document.addEventListener && document.addEventListener(\"DOMMouseScroll\", this.bindMousewheel, !1), window.addEventListener(\"mousewheel\", this.bindMousewheel, !1));\n }\n removeEvents() {\n this._Engine && this._Engine.DeviceType !== \"PC\" ? (this.domElement.removeEventListener(\"touchstart\", this.bindmousedown), this.domElement.removeEventListener(\"touchend\", this.bindmouseup), this.domElement.removeEventListener(\"touchmove\", this.bindmousemove)) : (this.domElement.removeEventListener(\"mousedown\", this.bindmousedown), this.domElement.removeEventListener(\"mouseup\", this.bindmouseup), this.domElement.removeEventListener(\"mousemove\", this.bindmousemove)), window.removeEventListener(\"keydown\", this.bindonKeyDown), window.removeEventListener(\"keyup\", this.bindonKeyUp), this.needMousewheel && (document.addEventListener && document.removeEventListener(\"DOMMouseScroll\", this.bindMousewheel), window.removeEventListener(\"mousewheel\", this.bindMousewheel));\n }\n onMousewheel(e) {\n debugger;\n let t;\n switch (e.wheelDelta ? (e.wheelDelta > 0 && (t = \"up\"), e.wheelDelta < 0 && (t = \"down\")) : e.detail && (e.detail < 0 && (t = \"up\"), e.detail > 0 && (t = \"down\")), t) {\n case \"up\":\n this._camerLocalDirection.z = 1;\n break;\n case \"down\":\n this._camerLocalDirection.z = -1;\n break;\n }\n this.moveWheelRun == !0 ? (this.moveWheelRun = !1, this.moveWheelStop = !0, this.wheelClock = setTimeout(() => {\n this.moveWheelStop == !0 && (this.moveWheelStop = !1, this.moveWheelRun = !0, this._camerLocalDirection.z = 0);\n }, 200)) : (clearTimeout(this.wheelClock), this.wheelClock = setTimeout(() => {\n this.moveWheelStop == !0 && (this.moveWheelStop = !1, this.moveWheelRun = !0, this._camerLocalDirection.z = 0);\n }, 150));\n }\n onMouseDown(e) {\n console.log(\"[FirstPersonCameraControl] onMouseDown 被调用\", e), this.domElement.addEventListener(\"mousemove\", this.bindmousemove, !1), this._prevMouseX = e.screenX, this._prevMouseY = e.screenY;\n }\n onMouseMove(e) {\n if (this._isEnabled == !1)\n return;\n let t = this._prevMouseX ? e.screenX - this._prevMouseX : 0, n = this._prevMouseY ? e.screenY - this._prevMouseY : 0, i = this._euler.x - n * this.lookflag * this.lookSpeed;\n i >= 0 ? i < this.maxRotateX ? this._euler.x = i : this._euler.x = this.maxRotateX : i > -this.maxRotateX ? this._euler.x = i : this._euler.x = -this.maxRotateX, this._euler.y -= t * this.lookSpeed, this.camera.quaternion.setFromEuler(this._euler), this._prevMouseX = e.screenX, this._prevMouseY = e.screenY;\n let o = this.GetEngine();\n o.movefirst = !0;\n var r = new CustomEvent(\"bimengine:camerachange\", {\n detail: \"\"\n });\n window.dispatchEvent(r);\n }\n onMouseUp(e) {\n let t = this.GetEngine();\n t.movefirst = !1, this.domElement.removeEventListener(\"mousemove\", this.bindmousemove);\n }\n onTouchStart(e) {\n this.domElement.addEventListener(\"touchmove\", this.bindmousemove, !1), this._prevMouseX = e.targetTouches[0].clientX, this._prevMouseY = e.targetTouches[0].clientY;\n }\n onTouchMove(e) {\n if (this._isEnabled == !1)\n return;\n let t = this._prevMouseX ? e.targetTouches[0].clientX - this._prevMouseX : 0, n = this._prevMouseY ? e.targetTouches[0].clientY - this._prevMouseY : 0, i = this._euler.x - n * this.lookflag * this.lookSpeed;\n i >= 0 ? i < this.maxRotateX ? this._euler.x = i : this._euler.x = this.maxRotateX : i > -this.maxRotateX ? this._euler.x = i : this._euler.x = -this.maxRotateX, this._euler.y -= t * this.lookSpeed, this.camera.quaternion.setFromEuler(this._euler), this._prevMouseX = e.targetTouches[0].clientX, this._prevMouseY = e.targetTouches[0].clientY;\n let o = this.GetEngine();\n o.movefirst = !0;\n var r = new CustomEvent(\"bimengine:camerachange\", {\n detail: \"\"\n });\n window.dispatchEvent(r);\n }\n onTouchEnd(e) {\n let t = this.GetEngine();\n t.movefirst = !1, this.domElement.removeEventListener(\"touchmove\", this.bindmousemove);\n }\n onKeyDown(e) {\n var t = new CustomEvent(\"bimengine:camerachange\", {\n detail: \"\"\n });\n let n = this.GetEngine();\n switch (n.movefirst = !0, window.dispatchEvent(t), e.keyCode) {\n case 38:\n this.rotateY(-1);\n break;\n case 81:\n this.keydown = !0, this._camerLocalDirection.y = 1;\n break;\n case 69:\n this._camerLocalDirection.y = -1;\n break;\n case 87:\n this._camerLocalDirection.z = 1;\n break;\n case 37:\n this.rotateX(-1);\n break;\n case 65:\n this._camerLocalDirection.x = -1;\n break;\n case 40:\n this.rotateY(1);\n break;\n case 83:\n this._camerLocalDirection.z = -1;\n break;\n case 39:\n this.rotateX(1);\n break;\n case 68:\n this._camerLocalDirection.x = 1;\n break;\n }\n }\n onKeyUp(e) {\n let t = this.GetEngine();\n switch (t.movefirst = !1, e.keyCode) {\n case 38:\n // up\n case 87:\n this._camerLocalDirection.z = 0;\n break;\n case 37:\n // left\n case 65:\n this._camerLocalDirection.x = 0;\n break;\n case 40:\n // down\n case 83:\n this._camerLocalDirection.z = 0;\n break;\n case 39:\n // right\n case 68:\n this._camerLocalDirection.x = 0;\n break;\n case 81:\n case 69:\n this.keydown = !1, this._camerLocalDirection.y = 0;\n break;\n }\n }\n /**\n * @description: rotate camera by left/right\n * @param {Number} value\n * @return: null\n */\n rotateX(e) {\n this._euler.y -= e * this.lookSpeed, this.camera.quaternion.setFromEuler(this._euler);\n }\n /**\n * @description: rotate camera by up/down\n * @param {Number} value\n * @return: null\n */\n rotateY(e) {\n let t = this._euler.x - e * this.lookflag * 0.5 * this.lookSpeed;\n t >= 0 ? t < this.maxRotateX ? this._euler.x = t : this._euler.x = this.maxRotateX : t > -this.maxRotateX ? this._euler.x = t : this._euler.x = -this.maxRotateX, this.camera.quaternion.setFromEuler(this._euler);\n }\n /**\n * @description: update current calcuate each frame.\n */\n update() {\n this.keydown || this.gravityTest(), this.collisionTest();\n }\n gravityTest() {\n if (this.applyGravity) {\n let e = !0;\n this._fallingTime += 0.01, this._tmpVector.set(0, -1, 0);\n const t = this.hitTest();\n if (t) {\n const n = t.point.add(new E.Vector3(0, this.playerHeight, 0));\n if (this.positionEasing) {\n if (n.y >= this.camera.position.y || n.y - this.camera.position.y < 0.2) {\n this.setCameraHeight(this.camera.position.y + (n.y - this.camera.position.y) * 0.08), this._fallingTime = 0, e = !1;\n return;\n }\n } else t.distance < this.playerHeight && (this.setCameraHeight(n.y), this._fallingTime = 0, e = !1);\n }\n e && this.setCameraHeight(this.camera.position.y - this.g * Math.pow(this._fallingTime, 2));\n } else\n this.setCameraHeight(this.camera.position.y);\n }\n collisionTest() {\n this._camerLocalDirection.x !== 0 && this.collisionTestX(), this._camerLocalDirection.z !== 0 && this.collisionTestZ(), this._camerLocalDirection.y !== 0 && this.collisionTestY();\n }\n collisionTestX() {\n let e = this.GetEngine();\n if (e.movefirst = !0, this._tmpVector.setFromMatrixColumn(this.camera.matrix, 0), this._tmpVector.multiplyScalar(this._camerLocalDirection.x), this.applyCollision) {\n const t = this.hitTest();\n if (t && t.distance < 0.3)\n return;\n }\n this.camera.position.addScaledVector(this._tmpVector, this.moveSpeed);\n }\n collisionTestZ() {\n let e = this.GetEngine();\n if (e.movefirst = !0, this._tmpVector.setFromMatrixColumn(this.camera.matrix, 0), this._tmpVector.crossVectors(this.camera.up, this._tmpVector), this._tmpVector.multiplyScalar(this._camerLocalDirection.z), this.applyCollision) {\n const t = this.hitTest();\n if (t && t.distance < 0.3)\n return;\n }\n this.camera.position.addScaledVector(this._tmpVector, this.moveSpeed);\n }\n collisionTestY() {\n let e = this.GetEngine();\n if (e.movefirst = !0, this._tmpVector.setFromMatrixColumn(this.camera.matrix, 0), this._tmpVector = new E.Vector3(0, 1, 0), this._tmpVector.multiplyScalar(this._camerLocalDirection.y), this.applyCollision) {\n const n = this.hitTest();\n if (n && n.distance < 0.3)\n return;\n }\n let t = this.camera.position.clone().addScaledVector(this._tmpVector, this.moveSpeed);\n this.setCameraHeight(t.y);\n }\n // 设置相机Y方向位置\n setCameraHeight(e) {\n let t = this.getMinHeight();\n this.gravityMinHeight && t !== void 0 && e < t ? this.camera.position.y = t : this.camera.position.y = e;\n }\n // 获得所有模型最低点\n getMinHeight() {\n let e, t = this.GetEngine(), n = t.ToolUntils ? t.ToolUntils.GetBoundingBox(t) : null;\n return t && n && (e = n.min.y), e;\n }\n hitTest() {\n const e = this.camera.position.clone().add(this._rayOriginOffset);\n this._rayCaster.ray.origin = e, this._rayCaster.ray.direction = this._tmpVector;\n var n = this.GetEngine().scene.ground;\n return n && n.material.type, null;\n }\n}\nfunction tr(s) {\n const e = {\n self: null,\n // 当前激活的行为对象\n options: null,\n // 行为配置选项\n mouseDownTime: 0,\n // 鼠标按下时的时间戳\n lastClickTime: 0\n // 上次点击时间\n };\n e.init = function(u, d) {\n e.self != null && e.self.disActive != null && e.self.disActive(), e.self = u, d == null && (d = {\n showCatch: !1\n }), e.options = d;\n }, e.render = function() {\n e.self && e.self.render != null && e.self.render();\n }, e.active = function() {\n s.container.addEventListener(\"mousedown\", a), s.container.addEventListener(\"mouseup\", h), s.container.addEventListener(\"mousemove\", l), window.addEventListener(\"keydown\", t), window.addEventListener(\"keyup\", n);\n }, e.disActive = function() {\n s.container.removeEventListener(\"mousedown\", a), s.container.removeEventListener(\"mouseup\", h), s.container.removeEventListener(\"mousemove\", l), window.removeEventListener(\"keydown\", t), window.removeEventListener(\"keyup\", n);\n };\n function t(u) {\n (u.keyCode === 8 || u.keyCode === 46) && e.self && e.self.handelKeyDeleteDown != null && e.self.handelKeyDeleteDown(), u.keyCode === 27 && e.self && e.self.handelKeyEscDown != null && e.self.handelKeyEscDown(), u.keyCode === 13 && e.self && e.self.handelKeyEnterDown != null && e.self.handelKeyEnterDown(), u.keyCode === 32 && e.self && e.self.handelKeySpaceDown != null && e.self.handelKeySpaceDown(), u.key === \"Control\" && e.self && e.self.handelKeyCtrlDown != null && e.self.handelKeyCtrlDown(), u.key === \"Delete\" && e.self && e.self.handelKeyDeleteDown != null && e.self.handelKeyDeleteDown(), u.key === \"Shift\" && e.self && e.self.handelKeyShiftDown != null && e.self.handelKeyShiftDown(), u.key === \"Meta\" && e.self && e.self.handelKeyMetaDown != null && e.self.handelKeyMetaDown();\n }\n function n(u) {\n u.key === \"Alt\" && e.self && e.self.handelKeyAltUp != null && e.self.handelKeyAltUp(), u.key === \"Tab\" && e.self && e.self.handelKeyTabUp != null && e.self.handelKeyTabUp(), u.key === \"Control\" && e.self && e.self.handelKeyCtrlUp != null && e.self.handelKeyCtrlUp(), u.key === \"Shift\" && e.self && e.self.handelKeyShiftUp != null && e.self.handelKeyShiftUp(), u.key === \"Meta\" && e.self && e.self.handelKeyMetaUp != null && e.self.handelKeyMetaUp(), u.key === \"Command\" && e.self && e.self.handelKeyCommandUp != null && e.self.handelKeyCommandUp(), u.key === \"Windows\" && e.self && e.self.handelKeyWindowsUp != null && e.self.handelKeyWindowsUp();\n }\n function i(u) {\n const d = new E.Vector2(), p = s.renderer.domElement.clientWidth, f = s.renderer.domElement.clientHeight;\n return d.x = u.offsetX / p * 2 - 1, d.y = -(u.offsetY / f) * 2 + 1, d;\n }\n function o(u) {\n const d = new E.Raycaster(), p = i(u);\n return d.setFromCamera(p, s.camera), d;\n }\n function r(u, d = !1) {\n const p = o(u);\n if (u.raycaster = p, d) {\n const f = c(p, u);\n u.catch = f;\n }\n }\n function a(u) {\n u.button === 0 && (e.mouseDownTime = Date.now(), e.self && e.self.handleMouseDown != null && (r(u, !0), e.self.handleMouseDown(u)));\n }\n function l(u) {\n e.self && e.self.handleMouseMove != null && (r(u, !0), e.self.handleMouseMove(u));\n }\n function h(u) {\n if (u.button !== 0)\n return;\n const d = Date.now(), p = d - e.mouseDownTime;\n if (e.self && e.self.handleMouseUp != null && (r(u, !1), e.self.handleMouseUp(u)), p < 100 && e.self && e.self.handleMouseClick != null) {\n r(u, !0);\n const f = d - e.lastClickTime;\n console.log(f), f < 200 ? e.self.handleMouseDoubleClick(u) : e.self.handleMouseClick(u), e.lastClickTime = Date.now();\n }\n }\n function c(u, d) {\n s.catchSvg.innerHTML = \"\";\n const p = s.octreeBox.rayInterationModel(u);\n if (p.length === 0)\n return;\n let f = p[0].object.url, m = p[0].object.name, g = s.modelEdge.getModelEdge(f, m);\n g || (g = [0, 0, []]);\n let y = \"face\", w = [], _ = [], x = 5;\n if (g[2].map((C) => C[0]).forEach((C) => {\n let P = new E.Vector3(C.X, C.Z, -C.Y), k = s.worldToScreen.worldToScreen(P), B = Math.sqrt(Math.pow(k.x - d.offsetX, 2) + Math.pow(k.y - d.offsetY, 2));\n B < x && (x = B, w.push({\n point: P,\n distance: B,\n pointxy: k\n }));\n }), w.length > 0 ? (w.sort((C, P) => C.distance - P.distance), y = \"point\") : (g[2].forEach((C) => {\n let P = new E.Vector3(C[0].X, C[0].Z, -C[0].Y), k = new E.Vector3(C[1].X, C[1].Z, -C[1].Y), B = s.worldToScreen.worldToScreen(P), T = s.worldToScreen.worldToScreen(k), D = b(new E.Vector2(d.offsetX, d.offsetY), B, T);\n if (D < x) {\n let v = A(new E.Vector2(d.offsetX, d.offsetY), B, T), I = M(v, P, k);\n _.push({\n distance: D,\n point: I,\n pointxy: s.worldToScreen.worldToScreen(I),\n start: B,\n end: T\n });\n }\n }), _.length > 0 && (_.sort((C, P) => C.distance - P.distance), y = \"line\")), y == \"point\" && e.options.showCatch) {\n const C = s.worldToScreen.worldToScreen(w[0].point);\n console.log(\"捕捉点屏幕坐标:\", C.x, C.y), console.log(\"Canvas尺寸:\", s.renderer.domElement.width, s.renderer.domElement.height), console.log(\"SVG尺寸:\", s.catchSvg.clientWidth, s.catchSvg.clientHeight), s.catchSvg.innerHTML = \"\";\n const P = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n P.setAttribute(\"class\", \"catchPoint\"), P.setAttribute(\"cx\", (C.x + s.reactBoundingClientRect.left).toString()), P.setAttribute(\"cy\", (C.y + s.reactBoundingClientRect.top).toString()), P.setAttribute(\"r\", \"5\"), P.setAttribute(\"fill\", \"rgb(0, 255, 247)\"), s.catchSvg.appendChild(P);\n } else if (y == \"line\" && e.options.showCatch) {\n const C = s.worldToScreen.worldToScreen(_[0].point), P = _[0].start, k = _[0].end;\n console.log(\"捕捉点屏幕坐标:\", C.x, C.y), console.log(\"Canvas尺寸:\", s.renderer.domElement.width, s.renderer.domElement.height), console.log(\"SVG尺寸:\", s.catchSvg.clientWidth, s.catchSvg.clientHeight), s.catchSvg.innerHTML = \"\";\n const B = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n B.setAttribute(\"class\", \"catchLine\"), B.setAttribute(\"x1\", (P.x + s.reactBoundingClientRect.left).toString()), B.setAttribute(\"y1\", (P.y + s.reactBoundingClientRect.top).toString()), B.setAttribute(\"x2\", (k.x + s.reactBoundingClientRect.left).toString()), B.setAttribute(\"y2\", (k.y + s.reactBoundingClientRect.top).toString()), B.setAttribute(\"stroke\", \"rgb(0, 255, 247)\"), B.setAttribute(\"stroke-width\", \"2\"), s.catchSvg.appendChild(B);\n } else if (y == \"face\" && e.options.showCatch) {\n let C = p[0].point.clone(), P = p[0].normal || (p[0].face ? p[0].face.normal : null);\n const k = (P ? P.clone() : new E.Vector3(0, 0, 1)).normalize(), B = Math.abs(k.y) < 0.9 ? new E.Vector3(0, 1, 0) : new E.Vector3(1, 0, 0), T = new E.Vector3().crossVectors(k, B).normalize(), D = new E.Vector3().crossVectors(k, T).normalize(), v = 0.05, H = [\n new E.Vector3().copy(T).add(D).multiplyScalar(v),\n new E.Vector3().copy(T).sub(D).multiplyScalar(v),\n new E.Vector3().copy(T).multiplyScalar(-1).sub(D).multiplyScalar(v),\n new E.Vector3().copy(T).multiplyScalar(-1).add(D).multiplyScalar(v)\n ].map((j) => new E.Vector3().copy(C).add(j)).map((j) => s.worldToScreen.worldToScreen(j));\n s.catchSvg.innerHTML = \"\";\n const ee = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polygon\");\n ee.setAttribute(\"class\", \"catchFace\"), ee.setAttribute(\"points\", H.map((j) => `${j.x + s.reactBoundingClientRect.left},${j.y + s.reactBoundingClientRect.top}`).join(\" \")), ee.setAttribute(\"fill\", \"rgba(1, 238, 255, 0.2)\"), ee.setAttribute(\"stroke\", \"rgb(0, 255, 247)\"), ee.setAttribute(\"stroke-width\", \"1\"), s.catchSvg.appendChild(ee);\n }\n return p[0];\n function b(C, P, k) {\n const B = new E.Vector2().subVectors(k, P), T = B.lengthSq();\n if (T < 1e-10)\n return C.distanceTo(P);\n const D = new E.Vector2().subVectors(C, P), v = E.MathUtils.clamp(D.dot(B) / T, 0, 1), I = new E.Vector2().copy(B).multiplyScalar(v).add(P);\n return C.distanceTo(I);\n }\n function A(C, P, k) {\n const B = new E.Vector2().subVectors(k, P), T = B.lengthSq();\n if (T < 1e-10)\n return 0;\n const D = new E.Vector2().subVectors(C, P);\n return E.MathUtils.clamp(D.dot(B) / T, 0, 1);\n }\n function M(C, P, k) {\n const B = E.MathUtils.clamp(C, 0, 1);\n return new E.Vector3().lerpVectors(P, k, B);\n }\n }\n return e;\n}\nclass Yl {\n engine;\n orbitControls;\n firstPersonControls;\n isActive = !0;\n originDiv = null;\n handelBehaved;\n isDragging = !1;\n isDown = !1;\n containerOffset = { left: 0, top: 0 };\n constructor(e) {\n this.engine = e, this.init(), this.handelBehaved = tr(this.engine), this.handelBehaved.init(this, null), this.handelBehaved.active();\n }\n init() {\n this.orbitControls = new Nl(this.engine, this.engine.camera, this.engine.renderer.domElement), this.orbitControls.showOriginIcon = !0, this.firstPersonControls = new vr(this.engine, this.engine.camera, this.engine.renderer.domElement);\n const e = document.createElement(\"div\");\n this.originDiv = e, e.className = \"originDiv\", e.style.position = \"absolute\", e.style.top = \"0px\", e.style.left = \"0px\", e.style.width = \"30px\", e.style.height = \"30px\", e.style.borderRadius = \"50%\", e.style.pointerEvents = \"none\", e.style.backgroundImage = \"url(./assets/svg/rotate-orbit.svg)\", this.engine.container.appendChild(this.originDiv);\n }\n active() {\n this.isActive = !0, this.orbitControls.enabled = !0;\n }\n disActive() {\n this.isActive = !1, this.orbitControls.enabled = !1;\n }\n // 切换第一人称漫游模式\n switchFirstPersonMode() {\n this.firstPersonControls = new vr(\n this.engine,\n this.engine.camera,\n this.engine.renderer.domElement,\n []\n ), this.orbitControls.enabled = !1, this.firstPersonControls.enabled = !0, this.firstPersonControls.isActive = !0;\n }\n // 切换默认模式\n switchDefaultMode() {\n this.firstPersonControls && (this.firstPersonControls.enabled = !1), this.orbitControls.enabled = !0;\n }\n // 控制鼠标交互\n handleMouseUp(e) {\n this.isDragging = !1, this.isDown = !1;\n }\n handleMouseMove(e) {\n this.isDown ? this.isDragging = !0 : this.isDragging = !1;\n }\n handleMouseDown(e) {\n this.isDown = !0;\n }\n handleMouseClick(e) {\n this.isDragging = !1, this.isDown = !1;\n }\n // 渲染控制器\n update() {\n if (this.firstPersonControls.enabled && this.firstPersonControls.update(), this.orbitControls.enabled) {\n const e = this.engine.controlModule.orbitControls.origin, n = this.engine.worldToScreen.worldToScreen(e);\n this.originDiv && this.isDragging ? (this.originDiv.style.left = n.x - 15 + this.engine.reactBoundingClientRect.left + \"px\", this.originDiv.style.top = n.y - 15 + this.engine.reactBoundingClientRect.top + \"px\", this.originDiv.style.display = \"block\") : this.originDiv && (this.originDiv.style.display = \"none\");\n }\n }\n}\nconst Xt = {\n name: \"CopyShader\",\n uniforms: {\n tDiffuse: { value: null },\n opacity: { value: 1 }\n },\n vertexShader: (\n /* glsl */\n `\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 fragmentShader: (\n /* glsl */\n `\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};\nclass Jt {\n /**\n * Constructs a new pass.\n */\n constructor() {\n this.isPass = !0, this.enabled = !0, this.needsSwap = !0, this.clear = !1, this.renderToScreen = !1;\n }\n /**\n * Sets the size of the pass.\n *\n * @abstract\n * @param {number} width - The width to set.\n * @param {number} height - The height to set.\n */\n setSize() {\n }\n /**\n * This method holds the render logic of a pass. It must be implemented in all derived classes.\n *\n * @abstract\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render() {\n console.error(\"THREE.Pass: .render() must be implemented in derived pass.\");\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n *\n * @abstract\n */\n dispose() {\n }\n}\nconst $l = new Bo(-1, 1, 1, -1, 0, 1);\nclass Jl extends Fi {\n constructor() {\n super(), this.setAttribute(\"position\", new dr([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3)), this.setAttribute(\"uv\", new dr([0, 2, 0, 0, 2, 0], 2));\n }\n}\nconst Ql = new Jl();\nclass ji {\n /**\n * Constructs a new full screen quad.\n *\n * @param {?Material} material - The material to render te full screen quad with.\n */\n constructor(e) {\n this._mesh = new Qs(Ql, e);\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the instance is no longer used in your app.\n */\n dispose() {\n this._mesh.geometry.dispose();\n }\n /**\n * Renders the full screen quad.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n */\n render(e) {\n e.render(this._mesh, $l);\n }\n /**\n * The quad's material.\n *\n * @type {?Material}\n */\n get material() {\n return this._mesh.material;\n }\n set material(e) {\n this._mesh.material = e;\n }\n}\nclass vi extends Jt {\n /**\n * Constructs a new shader pass.\n *\n * @param {Object|ShaderMaterial} [shader] - A shader object holding vertex and fragment shader as well as\n * defines and uniforms. It's also valid to pass a custom shader material.\n * @param {string} [textureID='tDiffuse'] - The name of the texture uniform that should sample\n * the read buffer.\n */\n constructor(e, t = \"tDiffuse\") {\n super(), this.textureID = t, this.uniforms = null, this.material = null, e instanceof et ? (this.uniforms = e.uniforms, this.material = e) : e && (this.uniforms = yt.clone(e.uniforms), this.material = new et({\n name: e.name !== void 0 ? e.name : \"unspecified\",\n defines: Object.assign({}, e.defines),\n uniforms: this.uniforms,\n vertexShader: e.vertexShader,\n fragmentShader: e.fragmentShader\n })), this._fsQuad = new ji(this.material);\n }\n /**\n * Performs the shader pass.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n this.uniforms[this.textureID] && (this.uniforms[this.textureID].value = n.texture), this._fsQuad.material = this.material, this.renderToScreen ? (e.setRenderTarget(null), this._fsQuad.render(e)) : (e.setRenderTarget(t), this.clear && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil), this._fsQuad.render(e));\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n */\n dispose() {\n this.material.dispose(), this._fsQuad.dispose();\n }\n}\nclass Sr extends Jt {\n /**\n * Constructs a new mask pass.\n *\n * @param {Scene} scene - The 3D objects in this scene will define the mask.\n * @param {Camera} camera - The camera.\n */\n constructor(e, t) {\n super(), this.scene = e, this.camera = t, this.clear = !0, this.needsSwap = !1, this.inverse = !1;\n }\n /**\n * Performs a mask pass with the configured scene and camera.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n const i = e.getContext(), o = e.state;\n o.buffers.color.setMask(!1), o.buffers.depth.setMask(!1), o.buffers.color.setLocked(!0), o.buffers.depth.setLocked(!0);\n let r, a;\n this.inverse ? (r = 0, a = 1) : (r = 1, a = 0), o.buffers.stencil.setTest(!0), o.buffers.stencil.setOp(i.REPLACE, i.REPLACE, i.REPLACE), o.buffers.stencil.setFunc(i.ALWAYS, r, 4294967295), o.buffers.stencil.setClear(a), o.buffers.stencil.setLocked(!0), e.setRenderTarget(n), this.clear && e.clear(), e.render(this.scene, this.camera), e.setRenderTarget(t), this.clear && e.clear(), e.render(this.scene, this.camera), o.buffers.color.setLocked(!1), o.buffers.depth.setLocked(!1), o.buffers.color.setMask(!0), o.buffers.depth.setMask(!0), o.buffers.stencil.setLocked(!1), o.buffers.stencil.setFunc(i.EQUAL, 1, 4294967295), o.buffers.stencil.setOp(i.KEEP, i.KEEP, i.KEEP), o.buffers.stencil.setLocked(!0);\n }\n}\nclass ec extends Jt {\n /**\n * Constructs a new clear mask pass.\n */\n constructor() {\n super(), this.needsSwap = !1;\n }\n /**\n * Performs the clear of the currently defined mask.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e) {\n e.state.buffers.stencil.setLocked(!1), e.state.buffers.stencil.setTest(!1);\n }\n}\nclass tc {\n /**\n * Constructs a new effect composer.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} [renderTarget] - This render target and a clone will\n * be used as the internal read and write buffers. If not given, the composer creates\n * the buffers automatically.\n */\n constructor(e, t) {\n if (this.renderer = e, this._pixelRatio = e.getPixelRatio(), t === void 0) {\n const n = e.getSize(new ce());\n this._width = n.width, this._height = n.height, t = new dn(this._width * this._pixelRatio, this._height * this._pixelRatio, { type: pn }), t.texture.name = \"EffectComposer.rt1\";\n } else\n this._width = t.width, this._height = t.height;\n this.renderTarget1 = t, this.renderTarget2 = t.clone(), this.renderTarget2.texture.name = \"EffectComposer.rt2\", this.writeBuffer = this.renderTarget1, this.readBuffer = this.renderTarget2, this.renderToScreen = !0, this.passes = [], this.copyPass = new vi(Xt), this.copyPass.material.blending = pt, this.clock = new Oa();\n }\n /**\n * Swaps the internal read/write buffers.\n */\n swapBuffers() {\n const e = this.readBuffer;\n this.readBuffer = this.writeBuffer, this.writeBuffer = e;\n }\n /**\n * Adds the given pass to the pass chain.\n *\n * @param {Pass} pass - The pass to add.\n */\n addPass(e) {\n this.passes.push(e), e.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio);\n }\n /**\n * Inserts the given pass at a given index.\n *\n * @param {Pass} pass - The pass to insert.\n * @param {number} index - The index into the pass chain.\n */\n insertPass(e, t) {\n this.passes.splice(t, 0, e), e.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio);\n }\n /**\n * Removes the given pass from the pass chain.\n *\n * @param {Pass} pass - The pass to remove.\n */\n removePass(e) {\n const t = this.passes.indexOf(e);\n t !== -1 && this.passes.splice(t, 1);\n }\n /**\n * Returns `true` if the pass for the given index is the last enabled pass in the pass chain.\n *\n * @param {number} passIndex - The pass index.\n * @return {boolean} Whether the pass for the given index is the last pass in the pass chain.\n */\n isLastEnabledPass(e) {\n for (let t = e + 1; t < this.passes.length; t++)\n if (this.passes[t].enabled)\n return !1;\n return !0;\n }\n /**\n * Executes all enabled post-processing passes in order to produce the final frame.\n *\n * @param {number} deltaTime - The delta time in seconds. If not given, the composer computes\n * its own time delta value.\n */\n render(e) {\n e === void 0 && (e = this.clock.getDelta());\n const t = this.renderer.getRenderTarget();\n let n = !1;\n for (let i = 0, o = this.passes.length; i < o; i++) {\n const r = this.passes[i];\n if (r.enabled !== !1) {\n if (r.renderToScreen = this.renderToScreen && this.isLastEnabledPass(i), r.render(this.renderer, this.writeBuffer, this.readBuffer, e, n), r.needsSwap) {\n if (n) {\n const a = this.renderer.getContext(), l = this.renderer.state.buffers.stencil;\n l.setFunc(a.NOTEQUAL, 1, 4294967295), this.copyPass.render(this.renderer, this.writeBuffer, this.readBuffer, e), l.setFunc(a.EQUAL, 1, 4294967295);\n }\n this.swapBuffers();\n }\n Sr !== void 0 && (r instanceof Sr ? n = !0 : r instanceof ec && (n = !1));\n }\n }\n this.renderer.setRenderTarget(t);\n }\n /**\n * Resets the internal state of the EffectComposer.\n *\n * @param {WebGLRenderTarget} [renderTarget] - This render target has the same purpose like\n * the one from the constructor. If set, it is used to setup the read and write buffers.\n */\n reset(e) {\n if (e === void 0) {\n const t = this.renderer.getSize(new ce());\n this._pixelRatio = this.renderer.getPixelRatio(), this._width = t.width, this._height = t.height, e = this.renderTarget1.clone(), e.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio);\n }\n this.renderTarget1.dispose(), this.renderTarget2.dispose(), this.renderTarget1 = e, this.renderTarget2 = e.clone(), this.writeBuffer = this.renderTarget1, this.readBuffer = this.renderTarget2;\n }\n /**\n * Resizes the internal read and write buffers as well as all passes. Similar to {@link WebGLRenderer#setSize},\n * this method honors the current pixel ration.\n *\n * @param {number} width - The width in logical pixels.\n * @param {number} height - The height in logical pixels.\n */\n setSize(e, t) {\n this._width = e, this._height = t;\n const n = this._width * this._pixelRatio, i = this._height * this._pixelRatio;\n this.renderTarget1.setSize(n, i), this.renderTarget2.setSize(n, i);\n for (let o = 0; o < this.passes.length; o++)\n this.passes[o].setSize(n, i);\n }\n /**\n * Sets device pixel ratio. This is usually used for HiDPI device to prevent blurring output.\n * Setting the pixel ratio will automatically resize the composer.\n *\n * @param {number} pixelRatio - The pixel ratio to set.\n */\n setPixelRatio(e) {\n this._pixelRatio = e, this.setSize(this._width, this._height);\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the composer is no longer used in your app.\n */\n dispose() {\n this.renderTarget1.dispose(), this.renderTarget2.dispose(), this.copyPass.dispose();\n }\n}\nclass nc extends Jt {\n /**\n * Constructs a new render pass.\n *\n * @param {Scene} scene - The scene to render.\n * @param {Camera} camera - The camera.\n * @param {?Material} [overrideMaterial=null] - The override material. If set, this material is used\n * for all objects in the scene.\n * @param {?(number|Color|string)} [clearColor=null] - The clear color of the render pass.\n * @param {?number} [clearAlpha=null] - The clear alpha of the render pass.\n */\n constructor(e, t, n = null, i = null, o = null) {\n super(), this.scene = e, this.camera = t, this.overrideMaterial = n, this.clearColor = i, this.clearAlpha = o, this.clear = !0, this.clearDepth = !1, this.needsSwap = !1, this._oldClearColor = new je();\n }\n /**\n * Performs a beauty pass with the configured scene and camera.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n const i = e.autoClear;\n e.autoClear = !1;\n let o, r;\n this.overrideMaterial !== null && (r = this.scene.overrideMaterial, this.scene.overrideMaterial = this.overrideMaterial), this.clearColor !== null && (e.getClearColor(this._oldClearColor), e.setClearColor(this.clearColor, e.getClearAlpha())), this.clearAlpha !== null && (o = e.getClearAlpha(), e.setClearAlpha(this.clearAlpha)), this.clearDepth == !0 && e.clearDepth(), e.setRenderTarget(this.renderToScreen ? null : n), this.clear === !0 && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil), e.render(this.scene, this.camera), this.clearColor !== null && e.setClearColor(this._oldClearColor), this.clearAlpha !== null && e.setClearAlpha(o), this.overrideMaterial !== null && (this.scene.overrideMaterial = r), e.autoClear = i;\n }\n}\nconst Xn = {\n defines: {\n PERSPECTIVE_CAMERA: 1,\n SAMPLES: 16,\n NORMAL_VECTOR_TYPE: 1,\n DEPTH_SWIZZLING: \"x\",\n SCREEN_SPACE_RADIUS: 0,\n SCREEN_SPACE_RADIUS_SCALE: 100,\n SCENE_CLIP_BOX: 0\n },\n uniforms: {\n tNormal: { value: null },\n tDepth: { value: null },\n tNoise: { value: null },\n resolution: { value: new ce() },\n cameraNear: { value: null },\n cameraFar: { value: null },\n cameraProjectionMatrix: { value: new Ae() },\n cameraProjectionMatrixInverse: { value: new Ae() },\n cameraWorldMatrix: { value: new Ae() },\n radius: { value: 0.25 },\n distanceExponent: { value: 1 },\n thickness: { value: 1 },\n distanceFallOff: { value: 1 },\n scale: { value: 1 },\n sceneBoxMin: { value: new Z(-1, -1, -1) },\n sceneBoxMax: { value: new Z(1, 1, 1) }\n },\n vertexShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\t\tvarying vec2 vUv;\n\t\tuniform highp sampler2D tNormal;\n\t\tuniform highp sampler2D tDepth;\n\t\tuniform sampler2D tNoise;\n\t\tuniform vec2 resolution;\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tuniform mat4 cameraProjectionMatrix;\n\t\tuniform mat4 cameraProjectionMatrixInverse;\n\t\tuniform mat4 cameraWorldMatrix;\n\t\tuniform float radius;\n\t\tuniform float distanceExponent;\n\t\tuniform float thickness;\n\t\tuniform float distanceFallOff;\n\t\tuniform float scale;\n\t\t#if SCENE_CLIP_BOX == 1\n\t\t\tuniform vec3 sceneBoxMin;\n\t\t\tuniform vec3 sceneBoxMax;\n\t\t#endif\n\n\t\t#include \n\t\t#include \n\n\t\t#ifndef FRAGMENT_OUTPUT\n\t\t#define FRAGMENT_OUTPUT vec4(vec3(ao), 1.)\n\t\t#endif\n\n\t\tvec3 getViewPosition(const in vec2 screenPosition, const in float depth) {\n\t\t\tvec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);\n\t\t\tvec4 viewSpacePosition = cameraProjectionMatrixInverse * clipSpacePosition;\n\t\t\treturn viewSpacePosition.xyz / viewSpacePosition.w;\n\t\t}\n\n\t\tfloat getDepth(const vec2 uv) {\n\t\t\treturn textureLod(tDepth, uv.xy, 0.0).DEPTH_SWIZZLING;\n\t\t}\n\n\t\tfloat fetchDepth(const ivec2 uv) {\n\t\t\treturn texelFetch(tDepth, uv.xy, 0).DEPTH_SWIZZLING;\n\t\t}\n\n\t\tfloat getViewZ(const in float depth) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\t\treturn perspectiveDepthToViewZ(depth, cameraNear, cameraFar);\n\t\t\t#else\n\t\t\t\treturn orthographicDepthToViewZ(depth, cameraNear, cameraFar);\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 computeNormalFromDepth(const vec2 uv) {\n\t\t\tvec2 size = vec2(textureSize(tDepth, 0));\n\t\t\tivec2 p = ivec2(uv * size);\n\t\t\tfloat c0 = fetchDepth(p);\n\t\t\tfloat l2 = fetchDepth(p - ivec2(2, 0));\n\t\t\tfloat l1 = fetchDepth(p - ivec2(1, 0));\n\t\t\tfloat r1 = fetchDepth(p + ivec2(1, 0));\n\t\t\tfloat r2 = fetchDepth(p + ivec2(2, 0));\n\t\t\tfloat b2 = fetchDepth(p - ivec2(0, 2));\n\t\t\tfloat b1 = fetchDepth(p - ivec2(0, 1));\n\t\t\tfloat t1 = fetchDepth(p + ivec2(0, 1));\n\t\t\tfloat t2 = fetchDepth(p + ivec2(0, 2));\n\t\t\tfloat dl = abs((2.0 * l1 - l2) - c0);\n\t\t\tfloat dr = abs((2.0 * r1 - r2) - c0);\n\t\t\tfloat db = abs((2.0 * b1 - b2) - c0);\n\t\t\tfloat dt = abs((2.0 * t1 - t2) - c0);\n\t\t\tvec3 ce = getViewPosition(uv, c0).xyz;\n\t\t\tvec3 dpdx = (dl < dr) ? ce - getViewPosition((uv - vec2(1.0 / size.x, 0.0)), l1).xyz : -ce + getViewPosition((uv + vec2(1.0 / size.x, 0.0)), r1).xyz;\n\t\t\tvec3 dpdy = (db < dt) ? ce - getViewPosition((uv - vec2(0.0, 1.0 / size.y)), b1).xyz : -ce + getViewPosition((uv + vec2(0.0, 1.0 / size.y)), t1).xyz;\n\t\t\treturn normalize(cross(dpdx, dpdy));\n\t\t}\n\n\t\tvec3 getViewNormal(const vec2 uv) {\n\t\t\t#if NORMAL_VECTOR_TYPE == 2\n\t\t\t\treturn normalize(textureLod(tNormal, uv, 0.).rgb);\n\t\t\t#elif NORMAL_VECTOR_TYPE == 1\n\t\t\t\treturn unpackRGBToNormal(textureLod(tNormal, uv, 0.).rgb);\n\t\t\t#else\n\t\t\t\treturn computeNormalFromDepth(uv);\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 getSceneUvAndDepth(vec3 sampleViewPos) {\n\t\t\tvec4 sampleClipPos = cameraProjectionMatrix * vec4(sampleViewPos, 1.);\n\t\t\tvec2 sampleUv = sampleClipPos.xy / sampleClipPos.w * 0.5 + 0.5;\n\t\t\tfloat sampleSceneDepth = getDepth(sampleUv);\n\t\t\treturn vec3(sampleUv, sampleSceneDepth);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getDepth(vUv.xy);\n\t\t\tif (depth >= 1.0) {\n\t\t\t\tdiscard;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvec3 viewPos = getViewPosition(vUv, depth);\n\t\t\tvec3 viewNormal = getViewNormal(vUv);\n\n\t\t\tfloat radiusToUse = radius;\n\t\t\tfloat distanceFalloffToUse = thickness;\n\t\t\t#if SCREEN_SPACE_RADIUS == 1\n\t\t\t\tfloat radiusScale = getViewPosition(vec2(0.5 + float(SCREEN_SPACE_RADIUS_SCALE) / resolution.x, 0.0), depth).x;\n\t\t\t\tradiusToUse *= radiusScale;\n\t\t\t\tdistanceFalloffToUse *= radiusScale;\n\t\t\t#endif\n\n\t\t\t#if SCENE_CLIP_BOX == 1\n\t\t\t\tvec3 worldPos = (cameraWorldMatrix * vec4(viewPos, 1.0)).xyz;\n\t\t\t\tfloat boxDistance = length(max(vec3(0.0), max(sceneBoxMin - worldPos, worldPos - sceneBoxMax)));\n\t\t\t\tif (boxDistance > radiusToUse) {\n\t\t\t\t\tdiscard;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t#endif\n\n\t\t\tvec2 noiseResolution = vec2(textureSize(tNoise, 0));\n\t\t\tvec2 noiseUv = vUv * resolution / noiseResolution;\n\t\t\tvec4 noiseTexel = textureLod(tNoise, noiseUv, 0.0);\n\t\t\tvec3 randomVec = noiseTexel.xyz * 2.0 - 1.0;\n\t\t\tvec3 tangent = normalize(vec3(randomVec.xy, 0.));\n\t\t\tvec3 bitangent = vec3(-tangent.y, tangent.x, 0.);\n\t\t\tmat3 kernelMatrix = mat3(tangent, bitangent, vec3(0., 0., 1.));\n\n\t\t\tconst int DIRECTIONS = SAMPLES < 30 ? 3 : 5;\n\t\t\tconst int STEPS = (SAMPLES + DIRECTIONS - 1) / DIRECTIONS;\n\t\t\tfloat ao = 0.0;\n\t\t\tfor (int i = 0; i < DIRECTIONS; ++i) {\n\n\t\t\t\tfloat angle = float(i) / float(DIRECTIONS) * PI;\n\t\t\t\tvec4 sampleDir = vec4(cos(angle), sin(angle), 0., 0.5 + 0.5 * noiseTexel.w);\n\t\t\t\tsampleDir.xyz = normalize(kernelMatrix * sampleDir.xyz);\n\n\t\t\t\tvec3 viewDir = normalize(-viewPos.xyz);\n\t\t\t\tvec3 sliceBitangent = normalize(cross(sampleDir.xyz, viewDir));\n\t\t\t\tvec3 sliceTangent = cross(sliceBitangent, viewDir);\n\t\t\t\tvec3 normalInSlice = normalize(viewNormal - sliceBitangent * dot(viewNormal, sliceBitangent));\n\n\t\t\t\tvec3 tangentToNormalInSlice = cross(normalInSlice, sliceBitangent);\n\t\t\t\tvec2 cosHorizons = vec2(dot(viewDir, tangentToNormalInSlice), dot(viewDir, -tangentToNormalInSlice));\n\n\t\t\t\tfor (int j = 0; j < STEPS; ++j) {\n\t\t\t\t\tvec3 sampleViewOffset = sampleDir.xyz * radiusToUse * sampleDir.w * pow(float(j + 1) / float(STEPS), distanceExponent);\n\n\t\t\t\t\tvec3 sampleSceneUvDepth = getSceneUvAndDepth(viewPos + sampleViewOffset);\n\t\t\t\t\tvec3 sampleSceneViewPos = getViewPosition(sampleSceneUvDepth.xy, sampleSceneUvDepth.z);\n\t\t\t\t\tvec3 viewDelta = sampleSceneViewPos - viewPos;\n\t\t\t\t\tif (abs(viewDelta.z) < thickness) {\n\t\t\t\t\t\tfloat sampleCosHorizon = dot(viewDir, normalize(viewDelta));\n\t\t\t\t\t\tcosHorizons.x += max(0., (sampleCosHorizon - cosHorizons.x) * mix(1., 2. / float(j + 2), distanceFallOff));\n\t\t\t\t\t}\n\n\t\t\t\t\tsampleSceneUvDepth = getSceneUvAndDepth(viewPos - sampleViewOffset);\n\t\t\t\t\tsampleSceneViewPos = getViewPosition(sampleSceneUvDepth.xy, sampleSceneUvDepth.z);\n\t\t\t\t\tviewDelta = sampleSceneViewPos - viewPos;\n\t\t\t\t\tif (abs(viewDelta.z) < thickness) {\n\t\t\t\t\t\tfloat sampleCosHorizon = dot(viewDir, normalize(viewDelta));\n\t\t\t\t\t\tcosHorizons.y += max(0., (sampleCosHorizon - cosHorizons.y) * mix(1., 2. / float(j + 2), distanceFallOff));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvec2 sinHorizons = sqrt(1. - cosHorizons * cosHorizons);\n\t\t\t\tfloat nx = dot(normalInSlice, sliceTangent);\n\t\t\t\tfloat ny = dot(normalInSlice, viewDir);\n\t\t\t\tfloat nxb = 1. / 2. * (acos(cosHorizons.y) - acos(cosHorizons.x) + sinHorizons.x * cosHorizons.x - sinHorizons.y * cosHorizons.y);\n\t\t\t\tfloat nyb = 1. / 2. * (2. - cosHorizons.x * cosHorizons.x - cosHorizons.y * cosHorizons.y);\n\t\t\t\tfloat occlusion = nx * nxb + ny * nyb;\n\t\t\t\tao += occlusion;\n\t\t\t}\n\n\t\t\tao = clamp(ao / float(DIRECTIONS), 0., 1.);\n\t\t#if SCENE_CLIP_BOX == 1\n\t\t\tao = mix(ao, 1., smoothstep(0., radiusToUse, boxDistance));\n\t\t#endif\n\t\t\tao = pow(ao, scale);\n\n\t\t\tgl_FragColor = FRAGMENT_OUTPUT;\n\t\t}`\n )\n}, qn = {\n defines: {\n PERSPECTIVE_CAMERA: 1\n },\n uniforms: {\n tDepth: { value: null },\n cameraNear: { value: null },\n cameraFar: { value: null }\n },\n vertexShader: (\n /* glsl */\n `\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\t\tuniform sampler2D tDepth;\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tvarying vec2 vUv;\n\n\t\t#include \n\n\t\tfloat getLinearDepth( const in vec2 screenPosition ) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\t\tfloat fragCoordZ = texture2D( tDepth, screenPosition ).x;\n\t\t\t\tfloat viewZ = perspectiveDepthToViewZ( fragCoordZ, cameraNear, cameraFar );\n\t\t\t\treturn viewZToOrthographicDepth( viewZ, cameraNear, cameraFar );\n\t\t\t#else\n\t\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\t\t\t#endif\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getLinearDepth( vUv );\n\t\t\tgl_FragColor = vec4( vec3( 1.0 - depth ), 1.0 );\n\n\t\t}`\n )\n}, Ji = {\n uniforms: {\n tDiffuse: { value: null },\n intensity: { value: 1 }\n },\n vertexShader: (\n /* glsl */\n `\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\t\tuniform float intensity;\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4(mix(vec3(1.), texel.rgb, intensity), texel.a);\n\t\t}`\n )\n};\nfunction ic(s = 5) {\n const e = Math.floor(s) % 2 === 0 ? Math.floor(s) + 1 : Math.floor(s), t = sc(e), n = t.length, i = new Uint8Array(n * 4);\n for (let r = 0; r < n; ++r) {\n const a = t[r], l = 2 * Math.PI * a / n, h = new Z(\n Math.cos(l),\n Math.sin(l),\n 0\n ).normalize();\n i[r * 4] = (h.x * 0.5 + 0.5) * 255, i[r * 4 + 1] = (h.y * 0.5 + 0.5) * 255, i[r * 4 + 2] = 127, i[r * 4 + 3] = 255;\n }\n const o = new Io(i, e, e);\n return o.wrapS = Zt, o.wrapT = Zt, o.needsUpdate = !0, o;\n}\nfunction sc(s) {\n const e = Math.floor(s) % 2 === 0 ? Math.floor(s) + 1 : Math.floor(s), t = e * e, n = Array(t).fill(0);\n let i = Math.floor(e / 2), o = e - 1;\n for (let r = 1; r <= t; ) {\n if (i === -1 && o === e ? (o = e - 2, i = 0) : (o === e && (o = 0), i < 0 && (i = e - 1)), n[i * e + o] !== 0) {\n o -= 2, i++;\n continue;\n } else\n n[i * e + o] = r++;\n o++, i--;\n }\n return n;\n}\nconst Kn = {\n defines: {\n SAMPLES: 16,\n SAMPLE_VECTORS: Xo(16, 2, 1),\n NORMAL_VECTOR_TYPE: 1,\n DEPTH_VALUE_SOURCE: 0\n },\n uniforms: {\n tDiffuse: { value: null },\n tNormal: { value: null },\n tDepth: { value: null },\n tNoise: { value: null },\n resolution: { value: new ce() },\n cameraProjectionMatrixInverse: { value: new Ae() },\n lumaPhi: { value: 5 },\n depthPhi: { value: 5 },\n normalPhi: { value: 5 },\n radius: { value: 4 },\n index: { value: 0 }\n },\n vertexShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tNormal;\n\t\tuniform sampler2D tDepth;\n\t\tuniform sampler2D tNoise;\n\t\tuniform vec2 resolution;\n\t\tuniform mat4 cameraProjectionMatrixInverse;\n\t\tuniform float lumaPhi;\n\t\tuniform float depthPhi;\n\t\tuniform float normalPhi;\n\t\tuniform float radius;\n\t\tuniform int index;\n\n\t\t#include \n\t\t#include \n\n\t\t#ifndef SAMPLE_LUMINANCE\n\t\t#define SAMPLE_LUMINANCE dot(vec3(0.2125, 0.7154, 0.0721), a)\n\t\t#endif\n\n\t\t#ifndef FRAGMENT_OUTPUT\n\t\t#define FRAGMENT_OUTPUT vec4(denoised, 1.)\n\t\t#endif\n\n\t\tfloat getLuminance(const in vec3 a) {\n\t\t\treturn SAMPLE_LUMINANCE;\n\t\t}\n\n\t\tconst vec3 poissonDisk[SAMPLES] = SAMPLE_VECTORS;\n\n\t\tvec3 getViewPosition(const in vec2 screenPosition, const in float depth) {\n\t\t\tvec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);\n\t\t\tvec4 viewSpacePosition = cameraProjectionMatrixInverse * clipSpacePosition;\n\t\t\treturn viewSpacePosition.xyz / viewSpacePosition.w;\n\t\t}\n\n\t\tfloat getDepth(const vec2 uv) {\n\t\t#if DEPTH_VALUE_SOURCE == 1\n\t\t\treturn textureLod(tDepth, uv.xy, 0.0).a;\n\t\t#else\n\t\t\treturn textureLod(tDepth, uv.xy, 0.0).r;\n\t\t#endif\n\t\t}\n\n\t\tfloat fetchDepth(const ivec2 uv) {\n\t\t\t#if DEPTH_VALUE_SOURCE == 1\n\t\t\t\treturn texelFetch(tDepth, uv.xy, 0).a;\n\t\t\t#else\n\t\t\t\treturn texelFetch(tDepth, uv.xy, 0).r;\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 computeNormalFromDepth(const vec2 uv) {\n\t\t\tvec2 size = vec2(textureSize(tDepth, 0));\n\t\t\tivec2 p = ivec2(uv * size);\n\t\t\tfloat c0 = fetchDepth(p);\n\t\t\tfloat l2 = fetchDepth(p - ivec2(2, 0));\n\t\t\tfloat l1 = fetchDepth(p - ivec2(1, 0));\n\t\t\tfloat r1 = fetchDepth(p + ivec2(1, 0));\n\t\t\tfloat r2 = fetchDepth(p + ivec2(2, 0));\n\t\t\tfloat b2 = fetchDepth(p - ivec2(0, 2));\n\t\t\tfloat b1 = fetchDepth(p - ivec2(0, 1));\n\t\t\tfloat t1 = fetchDepth(p + ivec2(0, 1));\n\t\t\tfloat t2 = fetchDepth(p + ivec2(0, 2));\n\t\t\tfloat dl = abs((2.0 * l1 - l2) - c0);\n\t\t\tfloat dr = abs((2.0 * r1 - r2) - c0);\n\t\t\tfloat db = abs((2.0 * b1 - b2) - c0);\n\t\t\tfloat dt = abs((2.0 * t1 - t2) - c0);\n\t\t\tvec3 ce = getViewPosition(uv, c0).xyz;\n\t\t\tvec3 dpdx = (dl < dr) ? ce - getViewPosition((uv - vec2(1.0 / size.x, 0.0)), l1).xyz\n\t\t\t\t\t\t\t\t\t: -ce + getViewPosition((uv + vec2(1.0 / size.x, 0.0)), r1).xyz;\n\t\t\tvec3 dpdy = (db < dt) ? ce - getViewPosition((uv - vec2(0.0, 1.0 / size.y)), b1).xyz\n\t\t\t\t\t\t\t\t\t: -ce + getViewPosition((uv + vec2(0.0, 1.0 / size.y)), t1).xyz;\n\t\t\treturn normalize(cross(dpdx, dpdy));\n\t\t}\n\n\t\tvec3 getViewNormal(const vec2 uv) {\n\t\t#if NORMAL_VECTOR_TYPE == 2\n\t\t\treturn normalize(textureLod(tNormal, uv, 0.).rgb);\n\t\t#elif NORMAL_VECTOR_TYPE == 1\n\t\t\treturn unpackRGBToNormal(textureLod(tNormal, uv, 0.).rgb);\n\t\t#else\n\t\t\treturn computeNormalFromDepth(uv);\n\t\t#endif\n\t\t}\n\n\t\tvoid denoiseSample(in vec3 center, in vec3 viewNormal, in vec3 viewPos, in vec2 sampleUv, inout vec3 denoised, inout float totalWeight) {\n\t\t\tvec4 sampleTexel = textureLod(tDiffuse, sampleUv, 0.0);\n\t\t\tfloat sampleDepth = getDepth(sampleUv);\n\t\t\tvec3 sampleNormal = getViewNormal(sampleUv);\n\t\t\tvec3 neighborColor = sampleTexel.rgb;\n\t\t\tvec3 viewPosSample = getViewPosition(sampleUv, sampleDepth);\n\n\t\t\tfloat normalDiff = dot(viewNormal, sampleNormal);\n\t\t\tfloat normalSimilarity = pow(max(normalDiff, 0.), normalPhi);\n\t\t\tfloat lumaDiff = abs(getLuminance(neighborColor) - getLuminance(center));\n\t\t\tfloat lumaSimilarity = max(1.0 - lumaDiff / lumaPhi, 0.0);\n\t\t\tfloat depthDiff = abs(dot(viewPos - viewPosSample, viewNormal));\n\t\t\tfloat depthSimilarity = max(1. - depthDiff / depthPhi, 0.);\n\t\t\tfloat w = lumaSimilarity * depthSimilarity * normalSimilarity;\n\n\t\t\tdenoised += w * neighborColor;\n\t\t\ttotalWeight += w;\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getDepth(vUv.xy);\n\t\t\tvec3 viewNormal = getViewNormal(vUv);\n\t\t\tif (depth == 1. || dot(viewNormal, viewNormal) == 0.) {\n\t\t\t\tdiscard;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvec4 texel = textureLod(tDiffuse, vUv, 0.0);\n\t\t\tvec3 center = texel.rgb;\n\t\t\tvec3 viewPos = getViewPosition(vUv, depth);\n\n\t\t\tvec2 noiseResolution = vec2(textureSize(tNoise, 0));\n\t\t\tvec2 noiseUv = vUv * resolution / noiseResolution;\n\t\t\tvec4 noiseTexel = textureLod(tNoise, noiseUv, 0.0);\n \t\tvec2 noiseVec = vec2(sin(noiseTexel[index % 4] * 2. * PI), cos(noiseTexel[index % 4] * 2. * PI));\n \t\tmat2 rotationMatrix = mat2(noiseVec.x, -noiseVec.y, noiseVec.x, noiseVec.y);\n\n\t\t\tfloat totalWeight = 1.0;\n\t\t\tvec3 denoised = texel.rgb;\n\t\t\tfor (int i = 0; i < SAMPLES; i++) {\n\t\t\t\tvec3 sampleDir = poissonDisk[i];\n\t\t\t\tvec2 offset = rotationMatrix * (sampleDir.xy * (1. + sampleDir.z * (radius - 1.)) / resolution);\n\t\t\t\tvec2 sampleUv = vUv + offset;\n\t\t\t\tdenoiseSample(center, viewNormal, viewPos, sampleUv, denoised, totalWeight);\n\t\t\t}\n\n\t\t\tif (totalWeight > 0.) {\n\t\t\t\tdenoised /= totalWeight;\n\t\t\t}\n\t\t\tgl_FragColor = FRAGMENT_OUTPUT;\n\t\t}`\n )\n};\nfunction Xo(s, e, t) {\n const n = rc(\n s,\n e,\n t\n );\n let i = \"vec3[SAMPLES](\";\n for (let o = 0; o < s; o++) {\n const r = n[o];\n i += `vec3(${r.x}, ${r.y}, ${r.z})${o < s - 1 ? \",\" : \")\"}`;\n }\n return i;\n}\nfunction rc(s, e, t) {\n const n = [];\n for (let i = 0; i < s; i++) {\n const o = 2 * Math.PI * e * i / s, r = Math.pow(i / (s - 1), t);\n n.push(new Z(Math.cos(o), Math.sin(o), r));\n }\n return n;\n}\nclass oc {\n /**\n * Constructs a new simplex noise object.\n *\n * @param {Object} [r=Math] - A math utility class that holds a `random()` method. This makes it\n * possible to pass in custom random number generator.\n */\n constructor(e = Math) {\n this.grad3 = [\n [1, 1, 0],\n [-1, 1, 0],\n [1, -1, 0],\n [-1, -1, 0],\n [1, 0, 1],\n [-1, 0, 1],\n [1, 0, -1],\n [-1, 0, -1],\n [0, 1, 1],\n [0, -1, 1],\n [0, 1, -1],\n [0, -1, -1]\n ], this.grad4 = [\n [0, 1, 1, 1],\n [0, 1, 1, -1],\n [0, 1, -1, 1],\n [0, 1, -1, -1],\n [0, -1, 1, 1],\n [0, -1, 1, -1],\n [0, -1, -1, 1],\n [0, -1, -1, -1],\n [1, 0, 1, 1],\n [1, 0, 1, -1],\n [1, 0, -1, 1],\n [1, 0, -1, -1],\n [-1, 0, 1, 1],\n [-1, 0, 1, -1],\n [-1, 0, -1, 1],\n [-1, 0, -1, -1],\n [1, 1, 0, 1],\n [1, 1, 0, -1],\n [1, -1, 0, 1],\n [1, -1, 0, -1],\n [-1, 1, 0, 1],\n [-1, 1, 0, -1],\n [-1, -1, 0, 1],\n [-1, -1, 0, -1],\n [1, 1, 1, 0],\n [1, 1, -1, 0],\n [1, -1, 1, 0],\n [1, -1, -1, 0],\n [-1, 1, 1, 0],\n [-1, 1, -1, 0],\n [-1, -1, 1, 0],\n [-1, -1, -1, 0]\n ], this.p = [];\n for (let t = 0; t < 256; t++)\n this.p[t] = Math.floor(e.random() * 256);\n this.perm = [];\n for (let t = 0; t < 512; t++)\n this.perm[t] = this.p[t & 255];\n this.simplex = [\n [0, 1, 2, 3],\n [0, 1, 3, 2],\n [0, 0, 0, 0],\n [0, 2, 3, 1],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [1, 2, 3, 0],\n [0, 2, 1, 3],\n [0, 0, 0, 0],\n [0, 3, 1, 2],\n [0, 3, 2, 1],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [1, 3, 2, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [1, 2, 0, 3],\n [0, 0, 0, 0],\n [1, 3, 0, 2],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [2, 3, 0, 1],\n [2, 3, 1, 0],\n [1, 0, 2, 3],\n [1, 0, 3, 2],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [2, 0, 3, 1],\n [0, 0, 0, 0],\n [2, 1, 3, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [2, 0, 1, 3],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [3, 0, 1, 2],\n [3, 0, 2, 1],\n [0, 0, 0, 0],\n [3, 1, 2, 0],\n [2, 1, 0, 3],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 0, 0],\n [3, 1, 0, 2],\n [0, 0, 0, 0],\n [3, 2, 0, 1],\n [3, 2, 1, 0]\n ];\n }\n /**\n * A 2D simplex noise method.\n *\n * @param {number} xin - The x coordinate.\n * @param {number} yin - The y coordinate.\n * @return {number} The noise value.\n */\n noise(e, t) {\n let n, i, o;\n const r = 0.5 * (Math.sqrt(3) - 1), a = (e + t) * r, l = Math.floor(e + a), h = Math.floor(t + a), c = (3 - Math.sqrt(3)) / 6, u = (l + h) * c, d = l - u, p = h - u, f = e - d, m = t - p;\n let g, y;\n f > m ? (g = 1, y = 0) : (g = 0, y = 1);\n const w = f - g + c, _ = m - y + c, x = f - 1 + 2 * c, b = m - 1 + 2 * c, A = l & 255, M = h & 255, C = this.perm[A + this.perm[M]] % 12, P = this.perm[A + g + this.perm[M + y]] % 12, k = this.perm[A + 1 + this.perm[M + 1]] % 12;\n let B = 0.5 - f * f - m * m;\n B < 0 ? n = 0 : (B *= B, n = B * B * this._dot(this.grad3[C], f, m));\n let T = 0.5 - w * w - _ * _;\n T < 0 ? i = 0 : (T *= T, i = T * T * this._dot(this.grad3[P], w, _));\n let D = 0.5 - x * x - b * b;\n return D < 0 ? o = 0 : (D *= D, o = D * D * this._dot(this.grad3[k], x, b)), 70 * (n + i + o);\n }\n /**\n * A 3D simplex noise method.\n *\n * @param {number} xin - The x coordinate.\n * @param {number} yin - The y coordinate.\n * @param {number} zin - The z coordinate.\n * @return {number} The noise value.\n */\n noise3d(e, t, n) {\n let i, o, r, a;\n const h = (e + t + n) * 0.3333333333333333, c = Math.floor(e + h), u = Math.floor(t + h), d = Math.floor(n + h), p = 1 / 6, f = (c + u + d) * p, m = c - f, g = u - f, y = d - f, w = e - m, _ = t - g, x = n - y;\n let b, A, M, C, P, k;\n w >= _ ? _ >= x ? (b = 1, A = 0, M = 0, C = 1, P = 1, k = 0) : w >= x ? (b = 1, A = 0, M = 0, C = 1, P = 0, k = 1) : (b = 0, A = 0, M = 1, C = 1, P = 0, k = 1) : _ < x ? (b = 0, A = 0, M = 1, C = 0, P = 1, k = 1) : w < x ? (b = 0, A = 1, M = 0, C = 0, P = 1, k = 1) : (b = 0, A = 1, M = 0, C = 1, P = 1, k = 0);\n const B = w - b + p, T = _ - A + p, D = x - M + p, v = w - C + 2 * p, I = _ - P + 2 * p, q = x - k + 2 * p, H = w - 1 + 3 * p, ee = _ - 1 + 3 * p, j = x - 1 + 3 * p, ne = c & 255, O = u & 255, N = d & 255, te = this.perm[ne + this.perm[O + this.perm[N]]] % 12, J = this.perm[ne + b + this.perm[O + A + this.perm[N + M]]] % 12, K = this.perm[ne + C + this.perm[O + P + this.perm[N + k]]] % 12, fe = this.perm[ne + 1 + this.perm[O + 1 + this.perm[N + 1]]] % 12;\n let pe = 0.6 - w * w - _ * _ - x * x;\n pe < 0 ? i = 0 : (pe *= pe, i = pe * pe * this._dot3(this.grad3[te], w, _, x));\n let se = 0.6 - B * B - T * T - D * D;\n se < 0 ? o = 0 : (se *= se, o = se * se * this._dot3(this.grad3[J], B, T, D));\n let oe = 0.6 - v * v - I * I - q * q;\n oe < 0 ? r = 0 : (oe *= oe, r = oe * oe * this._dot3(this.grad3[K], v, I, q));\n let ue = 0.6 - H * H - ee * ee - j * j;\n return ue < 0 ? a = 0 : (ue *= ue, a = ue * ue * this._dot3(this.grad3[fe], H, ee, j)), 32 * (i + o + r + a);\n }\n /**\n * A 4D simplex noise method.\n *\n * @param {number} x - The x coordinate.\n * @param {number} y - The y coordinate.\n * @param {number} z - The z coordinate.\n * @param {number} w - The w coordinate.\n * @return {number} The noise value.\n */\n noise4d(e, t, n, i) {\n const o = this.grad4, r = this.simplex, a = this.perm, l = (Math.sqrt(5) - 1) / 4, h = (5 - Math.sqrt(5)) / 20;\n let c, u, d, p, f;\n const m = (e + t + n + i) * l, g = Math.floor(e + m), y = Math.floor(t + m), w = Math.floor(n + m), _ = Math.floor(i + m), x = (g + y + w + _) * h, b = g - x, A = y - x, M = w - x, C = _ - x, P = e - b, k = t - A, B = n - M, T = i - C, D = P > k ? 32 : 0, v = P > B ? 16 : 0, I = k > B ? 8 : 0, q = P > T ? 4 : 0, H = k > T ? 2 : 0, ee = B > T ? 1 : 0, j = D + v + I + q + H + ee, ne = r[j][0] >= 3 ? 1 : 0, O = r[j][1] >= 3 ? 1 : 0, N = r[j][2] >= 3 ? 1 : 0, te = r[j][3] >= 3 ? 1 : 0, J = r[j][0] >= 2 ? 1 : 0, K = r[j][1] >= 2 ? 1 : 0, fe = r[j][2] >= 2 ? 1 : 0, pe = r[j][3] >= 2 ? 1 : 0, se = r[j][0] >= 1 ? 1 : 0, oe = r[j][1] >= 1 ? 1 : 0, ue = r[j][2] >= 1 ? 1 : 0, me = r[j][3] >= 1 ? 1 : 0, Se = P - ne + h, De = k - O + h, S = B - N + h, G = T - te + h, V = P - J + 2 * h, L = k - K + 2 * h, R = B - fe + 2 * h, z = T - pe + 2 * h, W = P - se + 3 * h, X = k - oe + 3 * h, U = B - ue + 3 * h, Y = T - me + 3 * h, Q = P - 1 + 4 * h, $ = k - 1 + 4 * h, ie = B - 1 + 4 * h, he = T - 1 + 4 * h, ae = g & 255, Te = y & 255, $e = w & 255, ke = _ & 255, Lt = a[ae + a[Te + a[$e + a[ke]]]] % 32, ye = a[ae + ne + a[Te + O + a[$e + N + a[ke + te]]]] % 32, en = a[ae + J + a[Te + K + a[$e + fe + a[ke + pe]]]] % 32, vn = a[ae + se + a[Te + oe + a[$e + ue + a[ke + me]]]] % 32, Je = a[ae + 1 + a[Te + 1 + a[$e + 1 + a[ke + 1]]]] % 32;\n let vt = 0.6 - P * P - k * k - B * B - T * T;\n vt < 0 ? c = 0 : (vt *= vt, c = vt * vt * this._dot4(o[Lt], P, k, B, T));\n let Bt = 0.6 - Se * Se - De * De - S * S - G * G;\n Bt < 0 ? u = 0 : (Bt *= Bt, u = Bt * Bt * this._dot4(o[ye], Se, De, S, G));\n let It = 0.6 - V * V - L * L - R * R - z * z;\n It < 0 ? d = 0 : (It *= It, d = It * It * this._dot4(o[en], V, L, R, z));\n let zt = 0.6 - W * W - X * X - U * U - Y * Y;\n zt < 0 ? p = 0 : (zt *= zt, p = zt * zt * this._dot4(o[vn], W, X, U, Y));\n let St = 0.6 - Q * Q - $ * $ - ie * ie - he * he;\n return St < 0 ? f = 0 : (St *= St, f = St * St * this._dot4(o[Je], Q, $, ie, he)), 27 * (c + u + d + p + f);\n }\n // private\n _dot(e, t, n) {\n return e[0] * t + e[1] * n;\n }\n _dot3(e, t, n, i) {\n return e[0] * t + e[1] * n + e[2] * i;\n }\n _dot4(e, t, n, i, o) {\n return e[0] * t + e[1] * n + e[2] * i + e[3] * o;\n }\n}\nclass Ne extends Jt {\n /**\n * Constructs a new GTAO pass.\n *\n * @param {Scene} scene - The scene to compute the AO for.\n * @param {Camera} camera - The camera.\n * @param {number} [width=512] - The width of the effect.\n * @param {number} [height=512] - The height of the effect.\n * @param {Object} [parameters] - The pass parameters.\n * @param {Object} [aoParameters] - The AO parameters.\n * @param {Object} [pdParameters] - The denoise parameters.\n */\n constructor(e, t, n = 512, i = 512, o, r, a) {\n super(), this.width = n, this.height = i, this.clear = !0, this.camera = t, this.scene = e, this.output = 0, this._renderGBuffer = !0, this._visibilityCache = [], this.blendIntensity = 1, this.pdRings = 2, this.pdRadiusExponent = 2, this.pdSamples = 16, this.gtaoNoiseTexture = ic(), this.pdNoiseTexture = this._generateNoise(), this.gtaoRenderTarget = new dn(this.width, this.height, { type: pn }), this.pdRenderTarget = this.gtaoRenderTarget.clone(), this.gtaoMaterial = new et({\n defines: Object.assign({}, Xn.defines),\n uniforms: yt.clone(Xn.uniforms),\n vertexShader: Xn.vertexShader,\n fragmentShader: Xn.fragmentShader,\n blending: pt,\n depthTest: !1,\n depthWrite: !1\n }), this.gtaoMaterial.defines.PERSPECTIVE_CAMERA = this.camera.isPerspectiveCamera ? 1 : 0, this.gtaoMaterial.uniforms.tNoise.value = this.gtaoNoiseTexture, this.gtaoMaterial.uniforms.resolution.value.set(this.width, this.height), this.gtaoMaterial.uniforms.cameraNear.value = this.camera.near, this.gtaoMaterial.uniforms.cameraFar.value = this.camera.far, this.normalMaterial = new Ua(), this.normalMaterial.blending = pt, this.pdMaterial = new et({\n defines: Object.assign({}, Kn.defines),\n uniforms: yt.clone(Kn.uniforms),\n vertexShader: Kn.vertexShader,\n fragmentShader: Kn.fragmentShader,\n depthTest: !1,\n depthWrite: !1\n }), this.pdMaterial.uniforms.tDiffuse.value = this.gtaoRenderTarget.texture, this.pdMaterial.uniforms.tNoise.value = this.pdNoiseTexture, this.pdMaterial.uniforms.resolution.value.set(this.width, this.height), this.pdMaterial.uniforms.lumaPhi.value = 10, this.pdMaterial.uniforms.depthPhi.value = 2, this.pdMaterial.uniforms.normalPhi.value = 3, this.pdMaterial.uniforms.radius.value = 8, this.depthRenderMaterial = new et({\n defines: Object.assign({}, qn.defines),\n uniforms: yt.clone(qn.uniforms),\n vertexShader: qn.vertexShader,\n fragmentShader: qn.fragmentShader,\n blending: pt\n }), this.depthRenderMaterial.uniforms.cameraNear.value = this.camera.near, this.depthRenderMaterial.uniforms.cameraFar.value = this.camera.far, this.copyMaterial = new et({\n uniforms: yt.clone(Xt.uniforms),\n vertexShader: Xt.vertexShader,\n fragmentShader: Xt.fragmentShader,\n transparent: !0,\n depthTest: !1,\n depthWrite: !1,\n blendSrc: mr,\n blendDst: Gn,\n blendEquation: Hn,\n blendSrcAlpha: pr,\n blendDstAlpha: Gn,\n blendEquationAlpha: Hn\n }), this.blendMaterial = new et({\n uniforms: yt.clone(Ji.uniforms),\n vertexShader: Ji.vertexShader,\n fragmentShader: Ji.fragmentShader,\n transparent: !0,\n depthTest: !1,\n depthWrite: !1,\n blending: Fa,\n blendSrc: mr,\n blendDst: Gn,\n blendEquation: Hn,\n blendSrcAlpha: pr,\n blendDstAlpha: Gn,\n blendEquationAlpha: Hn\n }), this._fsQuad = new ji(null), this._originalClearColor = new je(), this.setGBuffer(o ? o.depthTexture : void 0, o ? o.normalTexture : void 0), r !== void 0 && this.updateGtaoMaterial(r), a !== void 0 && this.updatePdMaterial(a);\n }\n /**\n * Sets the size of the pass.\n *\n * @param {number} width - The width to set.\n * @param {number} height - The height to set.\n */\n setSize(e, t) {\n this.width = e, this.height = t, this.gtaoRenderTarget.setSize(e, t), this.normalRenderTarget.setSize(e, t), this.pdRenderTarget.setSize(e, t), this.gtaoMaterial.uniforms.resolution.value.set(e, t), this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix), this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse), this.pdMaterial.uniforms.resolution.value.set(e, t), this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse);\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n */\n dispose() {\n this.gtaoNoiseTexture.dispose(), this.pdNoiseTexture.dispose(), this.normalRenderTarget.dispose(), this.gtaoRenderTarget.dispose(), this.pdRenderTarget.dispose(), this.normalMaterial.dispose(), this.pdMaterial.dispose(), this.copyMaterial.dispose(), this.depthRenderMaterial.dispose(), this._fsQuad.dispose();\n }\n /**\n * A texture holding the computed AO.\n *\n * @type {Texture}\n * @readonly\n */\n get gtaoMap() {\n return this.pdRenderTarget.texture;\n }\n /**\n * Configures the GBuffer of this pass. If no arguments are passed,\n * the pass creates an internal render target for holding depth\n * and normal data.\n *\n * @param {DepthTexture} [depthTexture] - The depth texture.\n * @param {DepthTexture} [normalTexture] - The normal texture.\n */\n setGBuffer(e, t) {\n e !== void 0 ? (this.depthTexture = e, this.normalTexture = t, this._renderGBuffer = !1) : (this.depthTexture = new Va(), this.depthTexture.format = ja, this.depthTexture.type = Ha, this.normalRenderTarget = new dn(this.width, this.height, {\n minFilter: Di,\n magFilter: Di,\n type: pn,\n depthTexture: this.depthTexture\n }), this.normalTexture = this.normalRenderTarget.texture, this._renderGBuffer = !0);\n const n = this.normalTexture ? 1 : 0, i = this.depthTexture === this.normalTexture ? \"w\" : \"x\";\n this.gtaoMaterial.defines.NORMAL_VECTOR_TYPE = n, this.gtaoMaterial.defines.DEPTH_SWIZZLING = i, this.gtaoMaterial.uniforms.tNormal.value = this.normalTexture, this.gtaoMaterial.uniforms.tDepth.value = this.depthTexture, this.pdMaterial.defines.NORMAL_VECTOR_TYPE = n, this.pdMaterial.defines.DEPTH_SWIZZLING = i, this.pdMaterial.uniforms.tNormal.value = this.normalTexture, this.pdMaterial.uniforms.tDepth.value = this.depthTexture, this.depthRenderMaterial.uniforms.tDepth.value = this.normalRenderTarget.depthTexture;\n }\n /**\n * Configures the clip box of the GTAO shader with the given AABB.\n *\n * @param {?Box3} box - The AABB enclosing the scene that should receive AO. When passing\n * `null`, to clip box is used.\n */\n setSceneClipBox(e) {\n e ? (this.gtaoMaterial.needsUpdate = this.gtaoMaterial.defines.SCENE_CLIP_BOX !== 1, this.gtaoMaterial.defines.SCENE_CLIP_BOX = 1, this.gtaoMaterial.uniforms.sceneBoxMin.value.copy(e.min), this.gtaoMaterial.uniforms.sceneBoxMax.value.copy(e.max)) : (this.gtaoMaterial.needsUpdate = this.gtaoMaterial.defines.SCENE_CLIP_BOX === 0, this.gtaoMaterial.defines.SCENE_CLIP_BOX = 0);\n }\n /**\n * Updates the GTAO material from the given parameter object.\n *\n * @param {Object} parameters - The GTAO material parameters.\n */\n updateGtaoMaterial(e) {\n e.radius !== void 0 && (this.gtaoMaterial.uniforms.radius.value = e.radius), e.distanceExponent !== void 0 && (this.gtaoMaterial.uniforms.distanceExponent.value = e.distanceExponent), e.thickness !== void 0 && (this.gtaoMaterial.uniforms.thickness.value = e.thickness), e.distanceFallOff !== void 0 && (this.gtaoMaterial.uniforms.distanceFallOff.value = e.distanceFallOff, this.gtaoMaterial.needsUpdate = !0), e.scale !== void 0 && (this.gtaoMaterial.uniforms.scale.value = e.scale), e.samples !== void 0 && e.samples !== this.gtaoMaterial.defines.SAMPLES && (this.gtaoMaterial.defines.SAMPLES = e.samples, this.gtaoMaterial.needsUpdate = !0), e.screenSpaceRadius !== void 0 && (e.screenSpaceRadius ? 1 : 0) !== this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS && (this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS = e.screenSpaceRadius ? 1 : 0, this.gtaoMaterial.needsUpdate = !0);\n }\n /**\n * Updates the Denoise material from the given parameter object.\n *\n * @param {Object} parameters - The denoise parameters.\n */\n updatePdMaterial(e) {\n let t = !1;\n e.lumaPhi !== void 0 && (this.pdMaterial.uniforms.lumaPhi.value = e.lumaPhi), e.depthPhi !== void 0 && (this.pdMaterial.uniforms.depthPhi.value = e.depthPhi), e.normalPhi !== void 0 && (this.pdMaterial.uniforms.normalPhi.value = e.normalPhi), e.radius !== void 0 && e.radius !== this.radius && (this.pdMaterial.uniforms.radius.value = e.radius), e.radiusExponent !== void 0 && e.radiusExponent !== this.pdRadiusExponent && (this.pdRadiusExponent = e.radiusExponent, t = !0), e.rings !== void 0 && e.rings !== this.pdRings && (this.pdRings = e.rings, t = !0), e.samples !== void 0 && e.samples !== this.pdSamples && (this.pdSamples = e.samples, t = !0), t && (this.pdMaterial.defines.SAMPLES = this.pdSamples, this.pdMaterial.defines.SAMPLE_VECTORS = Xo(this.pdSamples, this.pdRings, this.pdRadiusExponent), this.pdMaterial.needsUpdate = !0);\n }\n /**\n * Performs the GTAO pass.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n switch (this._renderGBuffer && (this._overrideVisibility(), this._renderOverride(e, this.normalMaterial, this.normalRenderTarget, 7829503, 1), this._restoreVisibility()), this.gtaoMaterial.uniforms.cameraNear.value = this.camera.near, this.gtaoMaterial.uniforms.cameraFar.value = this.camera.far, this.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy(this.camera.projectionMatrix), this.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse), this.gtaoMaterial.uniforms.cameraWorldMatrix.value.copy(this.camera.matrixWorld), this._renderPass(e, this.gtaoMaterial, this.gtaoRenderTarget, 16777215, 1), this.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy(this.camera.projectionMatrixInverse), this._renderPass(e, this.pdMaterial, this.pdRenderTarget, 16777215, 1), this.output) {\n case Ne.OUTPUT.Off:\n break;\n case Ne.OUTPUT.Diffuse:\n this.copyMaterial.uniforms.tDiffuse.value = n.texture, this.copyMaterial.blending = pt, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t);\n break;\n case Ne.OUTPUT.AO:\n this.copyMaterial.uniforms.tDiffuse.value = this.gtaoRenderTarget.texture, this.copyMaterial.blending = pt, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t);\n break;\n case Ne.OUTPUT.Denoise:\n this.copyMaterial.uniforms.tDiffuse.value = this.pdRenderTarget.texture, this.copyMaterial.blending = pt, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t);\n break;\n case Ne.OUTPUT.Depth:\n this.depthRenderMaterial.uniforms.cameraNear.value = this.camera.near, this.depthRenderMaterial.uniforms.cameraFar.value = this.camera.far, this._renderPass(e, this.depthRenderMaterial, this.renderToScreen ? null : t);\n break;\n case Ne.OUTPUT.Normal:\n this.copyMaterial.uniforms.tDiffuse.value = this.normalRenderTarget.texture, this.copyMaterial.blending = pt, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t);\n break;\n case Ne.OUTPUT.Default:\n this.copyMaterial.uniforms.tDiffuse.value = n.texture, this.copyMaterial.blending = pt, this._renderPass(e, this.copyMaterial, this.renderToScreen ? null : t), this.blendMaterial.uniforms.intensity.value = this.blendIntensity, this.blendMaterial.uniforms.tDiffuse.value = this.pdRenderTarget.texture, this._renderPass(e, this.blendMaterial, this.renderToScreen ? null : t);\n break;\n default:\n console.warn(\"THREE.GTAOPass: Unknown output type.\");\n }\n }\n // internals\n _renderPass(e, t, n, i, o) {\n e.getClearColor(this._originalClearColor);\n const r = e.getClearAlpha(), a = e.autoClear;\n e.setRenderTarget(n), e.autoClear = !1, i != null && (e.setClearColor(i), e.setClearAlpha(o || 0), e.clear()), this._fsQuad.material = t, this._fsQuad.render(e), e.autoClear = a, e.setClearColor(this._originalClearColor), e.setClearAlpha(r);\n }\n _renderOverride(e, t, n, i, o) {\n e.getClearColor(this._originalClearColor);\n const r = e.getClearAlpha(), a = e.autoClear;\n e.setRenderTarget(n), e.autoClear = !1, i = t.clearColor || i, o = t.clearAlpha || o, i != null && (e.setClearColor(i), e.setClearAlpha(o || 0), e.clear()), this.scene.overrideMaterial = t, e.render(this.scene, this.camera), this.scene.overrideMaterial = null, e.autoClear = a, e.setClearColor(this._originalClearColor), e.setClearAlpha(r);\n }\n _overrideVisibility() {\n const e = this.scene, t = this._visibilityCache;\n e.traverse(function(n) {\n (n.isPoints || n.isLine || n.isLine2) && n.visible && (n.visible = !1, t.push(n));\n });\n }\n _restoreVisibility() {\n const e = this._visibilityCache;\n for (let t = 0; t < e.length; t++)\n e[t].visible = !0;\n e.length = 0;\n }\n _generateNoise(e = 64) {\n const t = new oc(), n = e * e * 4, i = new Uint8Array(n);\n for (let r = 0; r < e; r++)\n for (let a = 0; a < e; a++) {\n const l = r, h = a;\n i[(r * e + a) * 4] = (t.noise(l, h) * 0.5 + 0.5) * 255, i[(r * e + a) * 4 + 1] = (t.noise(l + e, h) * 0.5 + 0.5) * 255, i[(r * e + a) * 4 + 2] = (t.noise(l, h + e) * 0.5 + 0.5) * 255, i[(r * e + a) * 4 + 3] = (t.noise(l + e, h + e) * 0.5 + 0.5) * 255;\n }\n const o = new Io(i, e, e, Ga, Wa);\n return o.wrapS = Zt, o.wrapT = Zt, o.needsUpdate = !0, o;\n }\n}\nNe.OUTPUT = {\n Off: -1,\n Default: 0,\n Diffuse: 1,\n Depth: 2,\n Normal: 3,\n AO: 4,\n Denoise: 5\n};\nconst ac = {\n uniforms: {\n tDiffuse: { value: null },\n luminosityThreshold: { value: 1 },\n smoothWidth: { value: 1 },\n defaultColor: { value: new je(0) },\n defaultOpacity: { value: 0 }\n },\n vertexShader: (\n /* glsl */\n `\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`\n ),\n fragmentShader: (\n /* glsl */\n `\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec3 defaultColor;\n\t\tuniform float defaultOpacity;\n\t\tuniform float luminosityThreshold;\n\t\tuniform float smoothWidth;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\n\t\t\tfloat v = luminance( texel.xyz );\n\n\t\t\tvec4 outputColor = vec4( defaultColor.rgb, defaultOpacity );\n\n\t\t\tfloat alpha = smoothstep( luminosityThreshold, luminosityThreshold + smoothWidth, v );\n\n\t\t\tgl_FragColor = mix( outputColor, texel, alpha );\n\n\t\t}`\n )\n};\nclass yn extends Jt {\n /**\n * Constructs a new Unreal Bloom pass.\n *\n * @param {Vector2} [resolution] - The effect's resolution.\n * @param {number} [strength=1] - The Bloom strength.\n * @param {number} radius - The Bloom radius.\n * @param {number} threshold - The luminance threshold limits which bright areas contribute to the Bloom effect.\n */\n constructor(e, t = 1, n, i) {\n super(), this.strength = t, this.radius = n, this.threshold = i, this.resolution = e !== void 0 ? new ce(e.x, e.y) : new ce(256, 256), this.clearColor = new je(0, 0, 0), this.needsSwap = !1, this.renderTargetsHorizontal = [], this.renderTargetsVertical = [], this.nMips = 5;\n let o = Math.round(this.resolution.x / 2), r = Math.round(this.resolution.y / 2);\n this.renderTargetBright = new dn(o, r, { type: pn }), this.renderTargetBright.texture.name = \"UnrealBloomPass.bright\", this.renderTargetBright.texture.generateMipmaps = !1;\n for (let c = 0; c < this.nMips; c++) {\n const u = new dn(o, r, { type: pn });\n u.texture.name = \"UnrealBloomPass.h\" + c, u.texture.generateMipmaps = !1, this.renderTargetsHorizontal.push(u);\n const d = new dn(o, r, { type: pn });\n d.texture.name = \"UnrealBloomPass.v\" + c, d.texture.generateMipmaps = !1, this.renderTargetsVertical.push(d), o = Math.round(o / 2), r = Math.round(r / 2);\n }\n const a = ac;\n this.highPassUniforms = yt.clone(a.uniforms), this.highPassUniforms.luminosityThreshold.value = i, this.highPassUniforms.smoothWidth.value = 0.01, this.materialHighPassFilter = new et({\n uniforms: this.highPassUniforms,\n vertexShader: a.vertexShader,\n fragmentShader: a.fragmentShader\n }), this.separableBlurMaterials = [];\n const l = [6, 10, 14, 18, 22];\n o = Math.round(this.resolution.x / 2), r = Math.round(this.resolution.y / 2);\n for (let c = 0; c < this.nMips; c++)\n this.separableBlurMaterials.push(this._getSeparableBlurMaterial(l[c])), this.separableBlurMaterials[c].uniforms.invSize.value = new ce(1 / o, 1 / r), o = Math.round(o / 2), r = Math.round(r / 2);\n this.compositeMaterial = this._getCompositeMaterial(this.nMips), this.compositeMaterial.uniforms.blurTexture1.value = this.renderTargetsVertical[0].texture, this.compositeMaterial.uniforms.blurTexture2.value = this.renderTargetsVertical[1].texture, this.compositeMaterial.uniforms.blurTexture3.value = this.renderTargetsVertical[2].texture, this.compositeMaterial.uniforms.blurTexture4.value = this.renderTargetsVertical[3].texture, this.compositeMaterial.uniforms.blurTexture5.value = this.renderTargetsVertical[4].texture, this.compositeMaterial.uniforms.bloomStrength.value = t, this.compositeMaterial.uniforms.bloomRadius.value = 0.1;\n const h = [1, 0.8, 0.6, 0.4, 0.2];\n this.compositeMaterial.uniforms.bloomFactors.value = h, this.bloomTintColors = [new Z(1, 1, 1), new Z(1, 1, 1), new Z(1, 1, 1), new Z(1, 1, 1), new Z(1, 1, 1)], this.compositeMaterial.uniforms.bloomTintColors.value = this.bloomTintColors, this.copyUniforms = yt.clone(Xt.uniforms), this.blendMaterial = new et({\n uniforms: this.copyUniforms,\n vertexShader: Xt.vertexShader,\n fragmentShader: Xt.fragmentShader,\n blending: Xa,\n depthTest: !1,\n depthWrite: !1,\n transparent: !0\n }), this._oldClearColor = new je(), this._oldClearAlpha = 1, this._basic = new hn(), this._fsQuad = new ji(null);\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n */\n dispose() {\n for (let e = 0; e < this.renderTargetsHorizontal.length; e++)\n this.renderTargetsHorizontal[e].dispose();\n for (let e = 0; e < this.renderTargetsVertical.length; e++)\n this.renderTargetsVertical[e].dispose();\n this.renderTargetBright.dispose();\n for (let e = 0; e < this.separableBlurMaterials.length; e++)\n this.separableBlurMaterials[e].dispose();\n this.compositeMaterial.dispose(), this.blendMaterial.dispose(), this._basic.dispose(), this._fsQuad.dispose();\n }\n /**\n * Sets the size of the pass.\n *\n * @param {number} width - The width to set.\n * @param {number} height - The height to set.\n */\n setSize(e, t) {\n let n = Math.round(e / 2), i = Math.round(t / 2);\n this.renderTargetBright.setSize(n, i);\n for (let o = 0; o < this.nMips; o++)\n this.renderTargetsHorizontal[o].setSize(n, i), this.renderTargetsVertical[o].setSize(n, i), this.separableBlurMaterials[o].uniforms.invSize.value = new ce(1 / n, 1 / i), n = Math.round(n / 2), i = Math.round(i / 2);\n }\n /**\n * Performs the Bloom pass.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n, i, o) {\n e.getClearColor(this._oldClearColor), this._oldClearAlpha = e.getClearAlpha();\n const r = e.autoClear;\n e.autoClear = !1, e.setClearColor(this.clearColor, 0), o && e.state.buffers.stencil.setTest(!1), this.renderToScreen && (this._fsQuad.material = this._basic, this._basic.map = n.texture, e.setRenderTarget(null), e.clear(), this._fsQuad.render(e)), this.highPassUniforms.tDiffuse.value = n.texture, this.highPassUniforms.luminosityThreshold.value = this.threshold, this._fsQuad.material = this.materialHighPassFilter, e.setRenderTarget(this.renderTargetBright), e.clear(), this._fsQuad.render(e);\n let a = this.renderTargetBright;\n for (let l = 0; l < this.nMips; l++)\n this._fsQuad.material = this.separableBlurMaterials[l], this.separableBlurMaterials[l].uniforms.colorTexture.value = a.texture, this.separableBlurMaterials[l].uniforms.direction.value = yn.BlurDirectionX, e.setRenderTarget(this.renderTargetsHorizontal[l]), e.clear(), this._fsQuad.render(e), this.separableBlurMaterials[l].uniforms.colorTexture.value = this.renderTargetsHorizontal[l].texture, this.separableBlurMaterials[l].uniforms.direction.value = yn.BlurDirectionY, e.setRenderTarget(this.renderTargetsVertical[l]), e.clear(), this._fsQuad.render(e), a = this.renderTargetsVertical[l];\n this._fsQuad.material = this.compositeMaterial, this.compositeMaterial.uniforms.bloomStrength.value = this.strength, this.compositeMaterial.uniforms.bloomRadius.value = this.radius, this.compositeMaterial.uniforms.bloomTintColors.value = this.bloomTintColors, e.setRenderTarget(this.renderTargetsHorizontal[0]), e.clear(), this._fsQuad.render(e), this._fsQuad.material = this.blendMaterial, this.copyUniforms.tDiffuse.value = this.renderTargetsHorizontal[0].texture, o && e.state.buffers.stencil.setTest(!0), this.renderToScreen ? (e.setRenderTarget(null), this._fsQuad.render(e)) : (e.setRenderTarget(n), this._fsQuad.render(e)), e.setClearColor(this._oldClearColor, this._oldClearAlpha), e.autoClear = r;\n }\n // internals\n _getSeparableBlurMaterial(e) {\n const t = [], n = e / 3;\n for (let i = 0; i < e; i++)\n t.push(0.39894 * Math.exp(-0.5 * i * i / (n * n)) / n);\n return new et({\n defines: {\n KERNEL_RADIUS: e\n },\n uniforms: {\n colorTexture: { value: null },\n invSize: { value: new ce(0.5, 0.5) },\n // inverse texture size\n direction: { value: new ce(0.5, 0.5) },\n gaussianCoefficients: { value: t }\n // precomputed Gaussian coefficients\n },\n vertexShader: `varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n fragmentShader: `#include \n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 invSize;\n\t\t\t\tuniform vec2 direction;\n\t\t\t\tuniform float gaussianCoefficients[KERNEL_RADIUS];\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tfloat weightSum = gaussianCoefficients[0];\n\t\t\t\t\tvec3 diffuseSum = texture2D( colorTexture, vUv ).rgb * weightSum;\n\t\t\t\t\tfor( int i = 1; i < KERNEL_RADIUS; i ++ ) {\n\t\t\t\t\t\tfloat x = float(i);\n\t\t\t\t\t\tfloat w = gaussianCoefficients[i];\n\t\t\t\t\t\tvec2 uvOffset = direction * invSize * x;\n\t\t\t\t\t\tvec3 sample1 = texture2D( colorTexture, vUv + uvOffset ).rgb;\n\t\t\t\t\t\tvec3 sample2 = texture2D( colorTexture, vUv - uvOffset ).rgb;\n\t\t\t\t\t\tdiffuseSum += ( sample1 + sample2 ) * w;\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = vec4( diffuseSum, 1.0 );\n\t\t\t\t}`\n });\n }\n _getCompositeMaterial(e) {\n return new et({\n defines: {\n NUM_MIPS: e\n },\n uniforms: {\n blurTexture1: { value: null },\n blurTexture2: { value: null },\n blurTexture3: { value: null },\n blurTexture4: { value: null },\n blurTexture5: { value: null },\n bloomStrength: { value: 1 },\n bloomFactors: { value: null },\n bloomTintColors: { value: null },\n bloomRadius: { value: 0 }\n },\n vertexShader: `varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n fragmentShader: `varying vec2 vUv;\n\t\t\t\tuniform sampler2D blurTexture1;\n\t\t\t\tuniform sampler2D blurTexture2;\n\t\t\t\tuniform sampler2D blurTexture3;\n\t\t\t\tuniform sampler2D blurTexture4;\n\t\t\t\tuniform sampler2D blurTexture5;\n\t\t\t\tuniform float bloomStrength;\n\t\t\t\tuniform float bloomRadius;\n\t\t\t\tuniform float bloomFactors[NUM_MIPS];\n\t\t\t\tuniform vec3 bloomTintColors[NUM_MIPS];\n\n\t\t\t\tfloat lerpBloomFactor(const in float factor) {\n\t\t\t\t\tfloat mirrorFactor = 1.2 - factor;\n\t\t\t\t\treturn mix(factor, mirrorFactor, bloomRadius);\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tgl_FragColor = bloomStrength * ( lerpBloomFactor(bloomFactors[0]) * vec4(bloomTintColors[0], 1.0) * texture2D(blurTexture1, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[1]) * vec4(bloomTintColors[1], 1.0) * texture2D(blurTexture2, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[2]) * vec4(bloomTintColors[2], 1.0) * texture2D(blurTexture3, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[3]) * vec4(bloomTintColors[3], 1.0) * texture2D(blurTexture4, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[4]) * vec4(bloomTintColors[4], 1.0) * texture2D(blurTexture5, vUv) );\n\t\t\t\t}`\n });\n }\n}\nyn.BlurDirectionX = new ce(1, 0);\nyn.BlurDirectionY = new ce(0, 1);\nconst Zn = {\n name: \"OutputShader\",\n uniforms: {\n tDiffuse: { value: null },\n toneMappingExposure: { value: 1 }\n },\n vertexShader: (\n /* glsl */\n `\n\t\tprecision highp float;\n\n\t\tuniform mat4 modelViewMatrix;\n\t\tuniform mat4 projectionMatrix;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\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 fragmentShader: (\n /* glsl */\n `\n\n\t\tprecision highp float;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\t#include \n\t\t#include \n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t// tone mapping\n\n\t\t\t#ifdef LINEAR_TONE_MAPPING\n\n\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( AGX_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\n\t\t\t#endif\n\n\t\t\t// color space\n\n\t\t\t#ifdef SRGB_TRANSFER\n\n\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\n\t\t\t#endif\n\n\t\t}`\n )\n};\nclass lc extends Jt {\n /**\n * Constructs a new output pass.\n */\n constructor() {\n super(), this.uniforms = yt.clone(Zn.uniforms), this.material = new qa({\n name: Zn.name,\n uniforms: this.uniforms,\n vertexShader: Zn.vertexShader,\n fragmentShader: Zn.fragmentShader\n }), this._fsQuad = new ji(this.material), this._outputColorSpace = null, this._toneMapping = null;\n }\n /**\n * Performs the output pass.\n *\n * @param {WebGLRenderer} renderer - The renderer.\n * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n * destination for the pass.\n * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n * previous pass from this buffer.\n * @param {number} deltaTime - The delta time in seconds.\n * @param {boolean} maskActive - Whether masking is active or not.\n */\n render(e, t, n) {\n this.uniforms.tDiffuse.value = n.texture, this.uniforms.toneMappingExposure.value = e.toneMappingExposure, (this._outputColorSpace !== e.outputColorSpace || this._toneMapping !== e.toneMapping) && (this._outputColorSpace = e.outputColorSpace, this._toneMapping = e.toneMapping, this.material.defines = {}, Li.getTransfer(this._outputColorSpace) === Ka && (this.material.defines.SRGB_TRANSFER = \"\"), this._toneMapping === Za ? this.material.defines.LINEAR_TONE_MAPPING = \"\" : this._toneMapping === Ya ? this.material.defines.REINHARD_TONE_MAPPING = \"\" : this._toneMapping === $a ? this.material.defines.CINEON_TONE_MAPPING = \"\" : this._toneMapping === Ja ? this.material.defines.ACES_FILMIC_TONE_MAPPING = \"\" : this._toneMapping === Qa ? this.material.defines.AGX_TONE_MAPPING = \"\" : this._toneMapping === el ? this.material.defines.NEUTRAL_TONE_MAPPING = \"\" : this._toneMapping === tl && (this.material.defines.CUSTOM_TONE_MAPPING = \"\"), this.material.needsUpdate = !0), this.renderToScreen === !0 ? (e.setRenderTarget(null), this._fsQuad.render(e)) : (e.setRenderTarget(t), this.clear && e.clear(e.autoClearColor, e.autoClearDepth, e.autoClearStencil), this._fsQuad.render(e));\n }\n /**\n * Frees the GPU-related resources allocated by this instance. Call this\n * method whenever the pass is no longer used in your app.\n */\n dispose() {\n this.material.dispose(), this._fsQuad.dispose();\n }\n}\nconst cc = {\n name: \"FXAAShader\",\n uniforms: {\n tDiffuse: { value: null },\n resolution: { value: new ce(1 / 1024, 1 / 512) }\n },\n vertexShader: (\n /* glsl */\n `\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 fragmentShader: (\n /* glsl */\n `\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec2 resolution;\n\t\tvarying vec2 vUv;\n\n\t\t#define EDGE_STEP_COUNT 6\n\t\t#define EDGE_GUESS 8.0\n\t\t#define EDGE_STEPS 1.0, 1.5, 2.0, 2.0, 2.0, 4.0\n\t\tconst float edgeSteps[EDGE_STEP_COUNT] = float[EDGE_STEP_COUNT]( EDGE_STEPS );\n\n\t\tfloat _ContrastThreshold = 0.0312;\n\t\tfloat _RelativeThreshold = 0.063;\n\t\tfloat _SubpixelBlending = 1.0;\n\n\t\tvec4 Sample( sampler2D tex2D, vec2 uv ) {\n\n\t\t\treturn texture( tex2D, uv );\n\n\t\t}\n\n\t\tfloat SampleLuminance( sampler2D tex2D, vec2 uv ) {\n\n\t\t\treturn dot( Sample( tex2D, uv ).rgb, vec3( 0.3, 0.59, 0.11 ) );\n\n\t\t}\n\n\t\tfloat SampleLuminance( sampler2D tex2D, vec2 texSize, vec2 uv, float uOffset, float vOffset ) {\n\n\t\t\tuv += texSize * vec2(uOffset, vOffset);\n\t\t\treturn SampleLuminance(tex2D, uv);\n\n\t\t}\n\n\t\tstruct LuminanceData {\n\n\t\t\tfloat m, n, e, s, w;\n\t\t\tfloat ne, nw, se, sw;\n\t\t\tfloat highest, lowest, contrast;\n\n\t\t};\n\n\t\tLuminanceData SampleLuminanceNeighborhood( sampler2D tex2D, vec2 texSize, vec2 uv ) {\n\n\t\t\tLuminanceData l;\n\t\t\tl.m = SampleLuminance( tex2D, uv );\n\t\t\tl.n = SampleLuminance( tex2D, texSize, uv, 0.0, 1.0 );\n\t\t\tl.e = SampleLuminance( tex2D, texSize, uv, 1.0, 0.0 );\n\t\t\tl.s = SampleLuminance( tex2D, texSize, uv, 0.0, -1.0 );\n\t\t\tl.w = SampleLuminance( tex2D, texSize, uv, -1.0, 0.0 );\n\n\t\t\tl.ne = SampleLuminance( tex2D, texSize, uv, 1.0, 1.0 );\n\t\t\tl.nw = SampleLuminance( tex2D, texSize, uv, -1.0, 1.0 );\n\t\t\tl.se = SampleLuminance( tex2D, texSize, uv, 1.0, -1.0 );\n\t\t\tl.sw = SampleLuminance( tex2D, texSize, uv, -1.0, -1.0 );\n\n\t\t\tl.highest = max( max( max( max( l.n, l.e ), l.s ), l.w ), l.m );\n\t\t\tl.lowest = min( min( min( min( l.n, l.e ), l.s ), l.w ), l.m );\n\t\t\tl.contrast = l.highest - l.lowest;\n\t\t\treturn l;\n\n\t\t}\n\n\t\tbool ShouldSkipPixel( LuminanceData l ) {\n\n\t\t\tfloat threshold = max( _ContrastThreshold, _RelativeThreshold * l.highest );\n\t\t\treturn l.contrast < threshold;\n\n\t\t}\n\n\t\tfloat DeterminePixelBlendFactor( LuminanceData l ) {\n\n\t\t\tfloat f = 2.0 * ( l.n + l.e + l.s + l.w );\n\t\t\tf += l.ne + l.nw + l.se + l.sw;\n\t\t\tf *= 1.0 / 12.0;\n\t\t\tf = abs( f - l.m );\n\t\t\tf = clamp( f / l.contrast, 0.0, 1.0 );\n\n\t\t\tfloat blendFactor = smoothstep( 0.0, 1.0, f );\n\t\t\treturn blendFactor * blendFactor * _SubpixelBlending;\n\n\t\t}\n\n\t\tstruct EdgeData {\n\n\t\t\tbool isHorizontal;\n\t\t\tfloat pixelStep;\n\t\t\tfloat oppositeLuminance, gradient;\n\n\t\t};\n\n\t\tEdgeData DetermineEdge( vec2 texSize, LuminanceData l ) {\n\n\t\t\tEdgeData e;\n\t\t\tfloat horizontal =\n\t\t\t\tabs( l.n + l.s - 2.0 * l.m ) * 2.0 +\n\t\t\t\tabs( l.ne + l.se - 2.0 * l.e ) +\n\t\t\t\tabs( l.nw + l.sw - 2.0 * l.w );\n\t\t\tfloat vertical =\n\t\t\t\tabs( l.e + l.w - 2.0 * l.m ) * 2.0 +\n\t\t\t\tabs( l.ne + l.nw - 2.0 * l.n ) +\n\t\t\t\tabs( l.se + l.sw - 2.0 * l.s );\n\t\t\te.isHorizontal = horizontal >= vertical;\n\n\t\t\tfloat pLuminance = e.isHorizontal ? l.n : l.e;\n\t\t\tfloat nLuminance = e.isHorizontal ? l.s : l.w;\n\t\t\tfloat pGradient = abs( pLuminance - l.m );\n\t\t\tfloat nGradient = abs( nLuminance - l.m );\n\n\t\t\te.pixelStep = e.isHorizontal ? texSize.y : texSize.x;\n\n\t\t\tif (pGradient < nGradient) {\n\n\t\t\t\te.pixelStep = -e.pixelStep;\n\t\t\t\te.oppositeLuminance = nLuminance;\n\t\t\t\te.gradient = nGradient;\n\n\t\t\t} else {\n\n\t\t\t\te.oppositeLuminance = pLuminance;\n\t\t\t\te.gradient = pGradient;\n\n\t\t\t}\n\n\t\t\treturn e;\n\n\t\t}\n\n\t\tfloat DetermineEdgeBlendFactor( sampler2D tex2D, vec2 texSize, LuminanceData l, EdgeData e, vec2 uv ) {\n\n\t\t\tvec2 uvEdge = uv;\n\t\t\tvec2 edgeStep;\n\t\t\tif (e.isHorizontal) {\n\n\t\t\t\tuvEdge.y += e.pixelStep * 0.5;\n\t\t\t\tedgeStep = vec2( texSize.x, 0.0 );\n\n\t\t\t} else {\n\n\t\t\t\tuvEdge.x += e.pixelStep * 0.5;\n\t\t\t\tedgeStep = vec2( 0.0, texSize.y );\n\n\t\t\t}\n\n\t\t\tfloat edgeLuminance = ( l.m + e.oppositeLuminance ) * 0.5;\n\t\t\tfloat gradientThreshold = e.gradient * 0.25;\n\n\t\t\tvec2 puv = uvEdge + edgeStep * edgeSteps[0];\n\t\t\tfloat pLuminanceDelta = SampleLuminance( tex2D, puv ) - edgeLuminance;\n\t\t\tbool pAtEnd = abs( pLuminanceDelta ) >= gradientThreshold;\n\n\t\t\tfor ( int i = 1; i < EDGE_STEP_COUNT && !pAtEnd; i++ ) {\n\n\t\t\t\tpuv += edgeStep * edgeSteps[i];\n\t\t\t\tpLuminanceDelta = SampleLuminance( tex2D, puv ) - edgeLuminance;\n\t\t\t\tpAtEnd = abs( pLuminanceDelta ) >= gradientThreshold;\n\n\t\t\t}\n\n\t\t\tif ( !pAtEnd ) {\n\n\t\t\t\tpuv += edgeStep * EDGE_GUESS;\n\n\t\t\t}\n\n\t\t\tvec2 nuv = uvEdge - edgeStep * edgeSteps[0];\n\t\t\tfloat nLuminanceDelta = SampleLuminance( tex2D, nuv ) - edgeLuminance;\n\t\t\tbool nAtEnd = abs( nLuminanceDelta ) >= gradientThreshold;\n\n\t\t\tfor ( int i = 1; i < EDGE_STEP_COUNT && !nAtEnd; i++ ) {\n\n\t\t\t\tnuv -= edgeStep * edgeSteps[i];\n\t\t\t\tnLuminanceDelta = SampleLuminance( tex2D, nuv ) - edgeLuminance;\n\t\t\t\tnAtEnd = abs( nLuminanceDelta ) >= gradientThreshold;\n\n\t\t\t}\n\n\t\t\tif ( !nAtEnd ) {\n\n\t\t\t\tnuv -= edgeStep * EDGE_GUESS;\n\n\t\t\t}\n\n\t\t\tfloat pDistance, nDistance;\n\t\t\tif ( e.isHorizontal ) {\n\n\t\t\t\tpDistance = puv.x - uv.x;\n\t\t\t\tnDistance = uv.x - nuv.x;\n\n\t\t\t} else {\n\n\t\t\t\tpDistance = puv.y - uv.y;\n\t\t\t\tnDistance = uv.y - nuv.y;\n\n\t\t\t}\n\n\t\t\tfloat shortestDistance;\n\t\t\tbool deltaSign;\n\t\t\tif ( pDistance <= nDistance ) {\n\n\t\t\t\tshortestDistance = pDistance;\n\t\t\t\tdeltaSign = pLuminanceDelta >= 0.0;\n\n\t\t\t} else {\n\n\t\t\t\tshortestDistance = nDistance;\n\t\t\t\tdeltaSign = nLuminanceDelta >= 0.0;\n\n\t\t\t}\n\n\t\t\tif ( deltaSign == ( l.m - edgeLuminance >= 0.0 ) ) {\n\n\t\t\t\treturn 0.0;\n\n\t\t\t}\n\n\t\t\treturn 0.5 - shortestDistance / ( pDistance + nDistance );\n\n\t\t}\n\n\t\tvec4 ApplyFXAA( sampler2D tex2D, vec2 texSize, vec2 uv ) {\n\n\t\t\tLuminanceData luminance = SampleLuminanceNeighborhood( tex2D, texSize, uv );\n\t\t\tif ( ShouldSkipPixel( luminance ) ) {\n\n\t\t\t\treturn Sample( tex2D, uv );\n\n\t\t\t}\n\n\t\t\tfloat pixelBlend = DeterminePixelBlendFactor( luminance );\n\t\t\tEdgeData edge = DetermineEdge( texSize, luminance );\n\t\t\tfloat edgeBlend = DetermineEdgeBlendFactor( tex2D, texSize, luminance, edge, uv );\n\t\t\tfloat finalBlend = max( pixelBlend, edgeBlend );\n\n\t\t\tif (edge.isHorizontal) {\n\n\t\t\t\tuv.y += edge.pixelStep * finalBlend;\n\n\t\t\t} else {\n\n\t\t\t\tuv.x += edge.pixelStep * finalBlend;\n\n\t\t\t}\n\n\t\t\treturn Sample( tex2D, uv );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = ApplyFXAA( tDiffuse, resolution.xy, vUv );\n\n\t\t}`\n )\n}, hc = {\n uniforms: {\n tDiffuse: { value: null },\n saturation: { value: 1.2 },\n // 饱和度值,1.0为原始,大于1.0增加饱和度\n contrast: { value: 1.2 }\n // 对比度值,1.0为原始,大于1.0增加对比度\n },\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `,\n fragmentShader: `\n uniform sampler2D tDiffuse;\n uniform float saturation;\n uniform float contrast;\n varying vec2 vUv;\n \n void main() {\n vec4 color = texture2D(tDiffuse, vUv);\n \n // 转换为灰度值用于饱和度调整\n float gray = dot(color.rgb, vec3(0.299, 0.587, 0.114));\n \n // 混合原始颜色和灰度值来调整饱和度\n color.rgb = mix(vec3(gray), color.rgb, saturation);\n \n // 调整对比度\n color.rgb = (color.rgb - 0.5) * contrast + 0.5;\n \n gl_FragColor = color;\n }\n `\n};\nclass uc {\n engine;\n composer;\n saturationPass;\n constructor(e) {\n this.engine = e;\n }\n resize() {\n const { width: e, height: t } = this.engine.deviceModule.getContainerSize(), n = e / t;\n if (this.composer) {\n this.composer.setPixelRatio(n), this.composer.setSize(e, t);\n const i = this.composer.passes.find((o) => o instanceof vi && o.material.uniforms.resolution);\n i && (i.material.uniforms.resolution.value.x = 1 / (e * n), i.material.uniforms.resolution.value.y = 1 / (t * n));\n }\n }\n init() {\n const { width: e, height: t } = this.engine.deviceModule.getContainerSize(), n = this.engine.scene, i = this.engine.camera, o = this.engine.renderer, r = e / t, a = new E.WebGLRenderTarget(e, t, {\n minFilter: E.LinearFilter,\n magFilter: E.LinearFilter,\n format: E.RGBAFormat,\n samples: 4\n // 启用多重采样抗锯齿\n });\n this.composer = new tc(o, a), this.composer.setPixelRatio(r), this.composer.setSize(e, t);\n const l = new nc(n, i);\n this.composer.addPass(l);\n const h = new Ne(n, i, e, t);\n h.output = Ne.OUTPUT.Default, h.blendIntensity = 0.5, h.updateGtaoMaterial && h.updateGtaoMaterial({\n radius: 1,\n // 减小半径以获得更紧密、更逼真的接触阴影 (原为 10)\n distanceExponent: 1,\n // 衰减\n thickness: 1,\n // 厚度\n scale: 1,\n // 缩放\n distanceFallOff: 1,\n // 距离衰减\n screenSpaceRadius: !0\n }), new yn(\n new E.Vector2(e, t),\n 0.1,\n // 强度\n 0.1,\n // 半径\n 0.5\n // 阈值\n ), this.saturationPass = new vi(hc), this.saturationPass.uniforms.saturation.value = 1.3, this.saturationPass.uniforms.contrast.value = 1.1, this.composer.addPass(this.saturationPass);\n const c = new lc();\n this.composer.addPass(c);\n const u = new vi(cc);\n u.material.uniforms.resolution.value.x = 1 / (e * r), u.material.uniforms.resolution.value.y = 1 / (t * r), this.composer.addPass(u);\n }\n}\nvar Yn = typeof globalThis < \"u\" ? globalThis : typeof window < \"u\" ? window : typeof global < \"u\" ? global : typeof self < \"u\" ? self : {};\nfunction qo(s) {\n return s && s.__esModule && Object.prototype.hasOwnProperty.call(s, \"default\") ? s.default : s;\n}\nfunction $n(s) {\n throw new Error('Could not dynamically require \"' + s + '\". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');\n}\nvar Qi = { exports: {} };\nvar Tr;\nfunction fc() {\n return Tr || (Tr = 1, (function(s, e) {\n (function(t) {\n s.exports = t();\n })(function() {\n return (function t(n, i, o) {\n function r(h, c) {\n if (!i[h]) {\n if (!n[h]) {\n var u = typeof $n == \"function\" && $n;\n if (!c && u) return u(h, !0);\n if (a) return a(h, !0);\n var d = new Error(\"Cannot find module '\" + h + \"'\");\n throw d.code = \"MODULE_NOT_FOUND\", d;\n }\n var p = i[h] = { exports: {} };\n n[h][0].call(p.exports, function(f) {\n var m = n[h][1][f];\n return r(m || f);\n }, p, p.exports, t, n, i, o);\n }\n return i[h].exports;\n }\n for (var a = typeof $n == \"function\" && $n, l = 0; l < o.length; l++) r(o[l]);\n return r;\n })({ 1: [function(t, n, i) {\n var o = t(\"./utils\"), r = t(\"./support\"), a = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n i.encode = function(l) {\n for (var h, c, u, d, p, f, m, g = [], y = 0, w = l.length, _ = w, x = o.getTypeOf(l) !== \"string\"; y < l.length; ) _ = w - y, u = x ? (h = l[y++], c = y < w ? l[y++] : 0, y < w ? l[y++] : 0) : (h = l.charCodeAt(y++), c = y < w ? l.charCodeAt(y++) : 0, y < w ? l.charCodeAt(y++) : 0), d = h >> 2, p = (3 & h) << 4 | c >> 4, f = 1 < _ ? (15 & c) << 2 | u >> 6 : 64, m = 2 < _ ? 63 & u : 64, g.push(a.charAt(d) + a.charAt(p) + a.charAt(f) + a.charAt(m));\n return g.join(\"\");\n }, i.decode = function(l) {\n var h, c, u, d, p, f, m = 0, g = 0, y = \"data:\";\n if (l.substr(0, y.length) === y) throw new Error(\"Invalid base64 input, it looks like a data url.\");\n var w, _ = 3 * (l = l.replace(/[^A-Za-z0-9+/=]/g, \"\")).length / 4;\n if (l.charAt(l.length - 1) === a.charAt(64) && _--, l.charAt(l.length - 2) === a.charAt(64) && _--, _ % 1 != 0) throw new Error(\"Invalid base64 input, bad content length.\");\n for (w = r.uint8array ? new Uint8Array(0 | _) : new Array(0 | _); m < l.length; ) h = a.indexOf(l.charAt(m++)) << 2 | (d = a.indexOf(l.charAt(m++))) >> 4, c = (15 & d) << 4 | (p = a.indexOf(l.charAt(m++))) >> 2, u = (3 & p) << 6 | (f = a.indexOf(l.charAt(m++))), w[g++] = h, p !== 64 && (w[g++] = c), f !== 64 && (w[g++] = u);\n return w;\n };\n }, { \"./support\": 30, \"./utils\": 32 }], 2: [function(t, n, i) {\n var o = t(\"./external\"), r = t(\"./stream/DataWorker\"), a = t(\"./stream/Crc32Probe\"), l = t(\"./stream/DataLengthProbe\");\n function h(c, u, d, p, f) {\n this.compressedSize = c, this.uncompressedSize = u, this.crc32 = d, this.compression = p, this.compressedContent = f;\n }\n h.prototype = { getContentWorker: function() {\n var c = new r(o.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new l(\"data_length\")), u = this;\n return c.on(\"end\", function() {\n if (this.streamInfo.data_length !== u.uncompressedSize) throw new Error(\"Bug : uncompressed data size mismatch\");\n }), c;\n }, getCompressedWorker: function() {\n return new r(o.Promise.resolve(this.compressedContent)).withStreamInfo(\"compressedSize\", this.compressedSize).withStreamInfo(\"uncompressedSize\", this.uncompressedSize).withStreamInfo(\"crc32\", this.crc32).withStreamInfo(\"compression\", this.compression);\n } }, h.createWorkerFrom = function(c, u, d) {\n return c.pipe(new a()).pipe(new l(\"uncompressedSize\")).pipe(u.compressWorker(d)).pipe(new l(\"compressedSize\")).withStreamInfo(\"compression\", u);\n }, n.exports = h;\n }, { \"./external\": 6, \"./stream/Crc32Probe\": 25, \"./stream/DataLengthProbe\": 26, \"./stream/DataWorker\": 27 }], 3: [function(t, n, i) {\n var o = t(\"./stream/GenericWorker\");\n i.STORE = { magic: \"\\0\\0\", compressWorker: function() {\n return new o(\"STORE compression\");\n }, uncompressWorker: function() {\n return new o(\"STORE decompression\");\n } }, i.DEFLATE = t(\"./flate\");\n }, { \"./flate\": 7, \"./stream/GenericWorker\": 28 }], 4: [function(t, n, i) {\n var o = t(\"./utils\"), r = (function() {\n for (var a, l = [], h = 0; h < 256; h++) {\n a = h;\n for (var c = 0; c < 8; c++) a = 1 & a ? 3988292384 ^ a >>> 1 : a >>> 1;\n l[h] = a;\n }\n return l;\n })();\n n.exports = function(a, l) {\n return a !== void 0 && a.length ? o.getTypeOf(a) !== \"string\" ? (function(h, c, u, d) {\n var p = r, f = d + u;\n h ^= -1;\n for (var m = d; m < f; m++) h = h >>> 8 ^ p[255 & (h ^ c[m])];\n return -1 ^ h;\n })(0 | l, a, a.length, 0) : (function(h, c, u, d) {\n var p = r, f = d + u;\n h ^= -1;\n for (var m = d; m < f; m++) h = h >>> 8 ^ p[255 & (h ^ c.charCodeAt(m))];\n return -1 ^ h;\n })(0 | l, a, a.length, 0) : 0;\n };\n }, { \"./utils\": 32 }], 5: [function(t, n, i) {\n i.base64 = !1, i.binary = !1, i.dir = !1, i.createFolders = !0, i.date = null, i.compression = null, i.compressionOptions = null, i.comment = null, i.unixPermissions = null, i.dosPermissions = null;\n }, {}], 6: [function(t, n, i) {\n var o = null;\n o = typeof Promise < \"u\" ? Promise : t(\"lie\"), n.exports = { Promise: o };\n }, { lie: 37 }], 7: [function(t, n, i) {\n var o = typeof Uint8Array < \"u\" && typeof Uint16Array < \"u\" && typeof Uint32Array < \"u\", r = t(\"pako\"), a = t(\"./utils\"), l = t(\"./stream/GenericWorker\"), h = o ? \"uint8array\" : \"array\";\n function c(u, d) {\n l.call(this, \"FlateWorker/\" + u), this._pako = null, this._pakoAction = u, this._pakoOptions = d, this.meta = {};\n }\n i.magic = \"\\b\\0\", a.inherits(c, l), c.prototype.processChunk = function(u) {\n this.meta = u.meta, this._pako === null && this._createPako(), this._pako.push(a.transformTo(h, u.data), !1);\n }, c.prototype.flush = function() {\n l.prototype.flush.call(this), this._pako === null && this._createPako(), this._pako.push([], !0);\n }, c.prototype.cleanUp = function() {\n l.prototype.cleanUp.call(this), this._pako = null;\n }, c.prototype._createPako = function() {\n this._pako = new r[this._pakoAction]({ raw: !0, level: this._pakoOptions.level || -1 });\n var u = this;\n this._pako.onData = function(d) {\n u.push({ data: d, meta: u.meta });\n };\n }, i.compressWorker = function(u) {\n return new c(\"Deflate\", u);\n }, i.uncompressWorker = function() {\n return new c(\"Inflate\", {});\n };\n }, { \"./stream/GenericWorker\": 28, \"./utils\": 32, pako: 38 }], 8: [function(t, n, i) {\n function o(p, f) {\n var m, g = \"\";\n for (m = 0; m < f; m++) g += String.fromCharCode(255 & p), p >>>= 8;\n return g;\n }\n function r(p, f, m, g, y, w) {\n var _, x, b = p.file, A = p.compression, M = w !== h.utf8encode, C = a.transformTo(\"string\", w(b.name)), P = a.transformTo(\"string\", h.utf8encode(b.name)), k = b.comment, B = a.transformTo(\"string\", w(k)), T = a.transformTo(\"string\", h.utf8encode(k)), D = P.length !== b.name.length, v = T.length !== k.length, I = \"\", q = \"\", H = \"\", ee = b.dir, j = b.date, ne = { crc32: 0, compressedSize: 0, uncompressedSize: 0 };\n f && !m || (ne.crc32 = p.crc32, ne.compressedSize = p.compressedSize, ne.uncompressedSize = p.uncompressedSize);\n var O = 0;\n f && (O |= 8), M || !D && !v || (O |= 2048);\n var N = 0, te = 0;\n ee && (N |= 16), y === \"UNIX\" ? (te = 798, N |= (function(K, fe) {\n var pe = K;\n return K || (pe = fe ? 16893 : 33204), (65535 & pe) << 16;\n })(b.unixPermissions, ee)) : (te = 20, N |= (function(K) {\n return 63 & (K || 0);\n })(b.dosPermissions)), _ = j.getUTCHours(), _ <<= 6, _ |= j.getUTCMinutes(), _ <<= 5, _ |= j.getUTCSeconds() / 2, x = j.getUTCFullYear() - 1980, x <<= 4, x |= j.getUTCMonth() + 1, x <<= 5, x |= j.getUTCDate(), D && (q = o(1, 1) + o(c(C), 4) + P, I += \"up\" + o(q.length, 2) + q), v && (H = o(1, 1) + o(c(B), 4) + T, I += \"uc\" + o(H.length, 2) + H);\n var J = \"\";\n return J += `\n\\0`, J += o(O, 2), J += A.magic, J += o(_, 2), J += o(x, 2), J += o(ne.crc32, 4), J += o(ne.compressedSize, 4), J += o(ne.uncompressedSize, 4), J += o(C.length, 2), J += o(I.length, 2), { fileRecord: u.LOCAL_FILE_HEADER + J + C + I, dirRecord: u.CENTRAL_FILE_HEADER + o(te, 2) + J + o(B.length, 2) + \"\\0\\0\\0\\0\" + o(N, 4) + o(g, 4) + C + I + B };\n }\n var a = t(\"../utils\"), l = t(\"../stream/GenericWorker\"), h = t(\"../utf8\"), c = t(\"../crc32\"), u = t(\"../signature\");\n function d(p, f, m, g) {\n l.call(this, \"ZipFileWorker\"), this.bytesWritten = 0, this.zipComment = f, this.zipPlatform = m, this.encodeFileName = g, this.streamFiles = p, this.accumulate = !1, this.contentBuffer = [], this.dirRecords = [], this.currentSourceOffset = 0, this.entriesCount = 0, this.currentFile = null, this._sources = [];\n }\n a.inherits(d, l), d.prototype.push = function(p) {\n var f = p.meta.percent || 0, m = this.entriesCount, g = this._sources.length;\n this.accumulate ? this.contentBuffer.push(p) : (this.bytesWritten += p.data.length, l.prototype.push.call(this, { data: p.data, meta: { currentFile: this.currentFile, percent: m ? (f + 100 * (m - g - 1)) / m : 100 } }));\n }, d.prototype.openedSource = function(p) {\n this.currentSourceOffset = this.bytesWritten, this.currentFile = p.file.name;\n var f = this.streamFiles && !p.file.dir;\n if (f) {\n var m = r(p, f, !1, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);\n this.push({ data: m.fileRecord, meta: { percent: 0 } });\n } else this.accumulate = !0;\n }, d.prototype.closedSource = function(p) {\n this.accumulate = !1;\n var f = this.streamFiles && !p.file.dir, m = r(p, f, !0, this.currentSourceOffset, this.zipPlatform, this.encodeFileName);\n if (this.dirRecords.push(m.dirRecord), f) this.push({ data: (function(g) {\n return u.DATA_DESCRIPTOR + o(g.crc32, 4) + o(g.compressedSize, 4) + o(g.uncompressedSize, 4);\n })(p), meta: { percent: 100 } });\n else for (this.push({ data: m.fileRecord, meta: { percent: 0 } }); this.contentBuffer.length; ) this.push(this.contentBuffer.shift());\n this.currentFile = null;\n }, d.prototype.flush = function() {\n for (var p = this.bytesWritten, f = 0; f < this.dirRecords.length; f++) this.push({ data: this.dirRecords[f], meta: { percent: 100 } });\n var m = this.bytesWritten - p, g = (function(y, w, _, x, b) {\n var A = a.transformTo(\"string\", b(x));\n return u.CENTRAL_DIRECTORY_END + \"\\0\\0\\0\\0\" + o(y, 2) + o(y, 2) + o(w, 4) + o(_, 4) + o(A.length, 2) + A;\n })(this.dirRecords.length, m, p, this.zipComment, this.encodeFileName);\n this.push({ data: g, meta: { percent: 100 } });\n }, d.prototype.prepareNextSource = function() {\n this.previous = this._sources.shift(), this.openedSource(this.previous.streamInfo), this.isPaused ? this.previous.pause() : this.previous.resume();\n }, d.prototype.registerPrevious = function(p) {\n this._sources.push(p);\n var f = this;\n return p.on(\"data\", function(m) {\n f.processChunk(m);\n }), p.on(\"end\", function() {\n f.closedSource(f.previous.streamInfo), f._sources.length ? f.prepareNextSource() : f.end();\n }), p.on(\"error\", function(m) {\n f.error(m);\n }), this;\n }, d.prototype.resume = function() {\n return !!l.prototype.resume.call(this) && (!this.previous && this._sources.length ? (this.prepareNextSource(), !0) : this.previous || this._sources.length || this.generatedError ? void 0 : (this.end(), !0));\n }, d.prototype.error = function(p) {\n var f = this._sources;\n if (!l.prototype.error.call(this, p)) return !1;\n for (var m = 0; m < f.length; m++) try {\n f[m].error(p);\n } catch {\n }\n return !0;\n }, d.prototype.lock = function() {\n l.prototype.lock.call(this);\n for (var p = this._sources, f = 0; f < p.length; f++) p[f].lock();\n }, n.exports = d;\n }, { \"../crc32\": 4, \"../signature\": 23, \"../stream/GenericWorker\": 28, \"../utf8\": 31, \"../utils\": 32 }], 9: [function(t, n, i) {\n var o = t(\"../compressions\"), r = t(\"./ZipFileWorker\");\n i.generateWorker = function(a, l, h) {\n var c = new r(l.streamFiles, h, l.platform, l.encodeFileName), u = 0;\n try {\n a.forEach(function(d, p) {\n u++;\n var f = (function(w, _) {\n var x = w || _, b = o[x];\n if (!b) throw new Error(x + \" is not a valid compression method !\");\n return b;\n })(p.options.compression, l.compression), m = p.options.compressionOptions || l.compressionOptions || {}, g = p.dir, y = p.date;\n p._compressWorker(f, m).withStreamInfo(\"file\", { name: d, dir: g, date: y, comment: p.comment || \"\", unixPermissions: p.unixPermissions, dosPermissions: p.dosPermissions }).pipe(c);\n }), c.entriesCount = u;\n } catch (d) {\n c.error(d);\n }\n return c;\n };\n }, { \"../compressions\": 3, \"./ZipFileWorker\": 8 }], 10: [function(t, n, i) {\n function o() {\n if (!(this instanceof o)) return new o();\n if (arguments.length) throw new Error(\"The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.\");\n this.files = /* @__PURE__ */ Object.create(null), this.comment = null, this.root = \"\", this.clone = function() {\n var r = new o();\n for (var a in this) typeof this[a] != \"function\" && (r[a] = this[a]);\n return r;\n };\n }\n (o.prototype = t(\"./object\")).loadAsync = t(\"./load\"), o.support = t(\"./support\"), o.defaults = t(\"./defaults\"), o.version = \"3.10.1\", o.loadAsync = function(r, a) {\n return new o().loadAsync(r, a);\n }, o.external = t(\"./external\"), n.exports = o;\n }, { \"./defaults\": 5, \"./external\": 6, \"./load\": 11, \"./object\": 15, \"./support\": 30 }], 11: [function(t, n, i) {\n var o = t(\"./utils\"), r = t(\"./external\"), a = t(\"./utf8\"), l = t(\"./zipEntries\"), h = t(\"./stream/Crc32Probe\"), c = t(\"./nodejsUtils\");\n function u(d) {\n return new r.Promise(function(p, f) {\n var m = d.decompressed.getContentWorker().pipe(new h());\n m.on(\"error\", function(g) {\n f(g);\n }).on(\"end\", function() {\n m.streamInfo.crc32 !== d.decompressed.crc32 ? f(new Error(\"Corrupted zip : CRC32 mismatch\")) : p();\n }).resume();\n });\n }\n n.exports = function(d, p) {\n var f = this;\n return p = o.extend(p || {}, { base64: !1, checkCRC32: !1, optimizedBinaryString: !1, createFolders: !1, decodeFileName: a.utf8decode }), c.isNode && c.isStream(d) ? r.Promise.reject(new Error(\"JSZip can't accept a stream when loading a zip file.\")) : o.prepareContent(\"the loaded zip file\", d, !0, p.optimizedBinaryString, p.base64).then(function(m) {\n var g = new l(p);\n return g.load(m), g;\n }).then(function(m) {\n var g = [r.Promise.resolve(m)], y = m.files;\n if (p.checkCRC32) for (var w = 0; w < y.length; w++) g.push(u(y[w]));\n return r.Promise.all(g);\n }).then(function(m) {\n for (var g = m.shift(), y = g.files, w = 0; w < y.length; w++) {\n var _ = y[w], x = _.fileNameStr, b = o.resolve(_.fileNameStr);\n f.file(b, _.decompressed, { binary: !0, optimizedBinaryString: !0, date: _.date, dir: _.dir, comment: _.fileCommentStr.length ? _.fileCommentStr : null, unixPermissions: _.unixPermissions, dosPermissions: _.dosPermissions, createFolders: p.createFolders }), _.dir || (f.file(b).unsafeOriginalName = x);\n }\n return g.zipComment.length && (f.comment = g.zipComment), f;\n });\n };\n }, { \"./external\": 6, \"./nodejsUtils\": 14, \"./stream/Crc32Probe\": 25, \"./utf8\": 31, \"./utils\": 32, \"./zipEntries\": 33 }], 12: [function(t, n, i) {\n var o = t(\"../utils\"), r = t(\"../stream/GenericWorker\");\n function a(l, h) {\n r.call(this, \"Nodejs stream input adapter for \" + l), this._upstreamEnded = !1, this._bindStream(h);\n }\n o.inherits(a, r), a.prototype._bindStream = function(l) {\n var h = this;\n (this._stream = l).pause(), l.on(\"data\", function(c) {\n h.push({ data: c, meta: { percent: 0 } });\n }).on(\"error\", function(c) {\n h.isPaused ? this.generatedError = c : h.error(c);\n }).on(\"end\", function() {\n h.isPaused ? h._upstreamEnded = !0 : h.end();\n });\n }, a.prototype.pause = function() {\n return !!r.prototype.pause.call(this) && (this._stream.pause(), !0);\n }, a.prototype.resume = function() {\n return !!r.prototype.resume.call(this) && (this._upstreamEnded ? this.end() : this._stream.resume(), !0);\n }, n.exports = a;\n }, { \"../stream/GenericWorker\": 28, \"../utils\": 32 }], 13: [function(t, n, i) {\n var o = t(\"readable-stream\").Readable;\n function r(a, l, h) {\n o.call(this, l), this._helper = a;\n var c = this;\n a.on(\"data\", function(u, d) {\n c.push(u) || c._helper.pause(), h && h(d);\n }).on(\"error\", function(u) {\n c.emit(\"error\", u);\n }).on(\"end\", function() {\n c.push(null);\n });\n }\n t(\"../utils\").inherits(r, o), r.prototype._read = function() {\n this._helper.resume();\n }, n.exports = r;\n }, { \"../utils\": 32, \"readable-stream\": 16 }], 14: [function(t, n, i) {\n n.exports = { isNode: typeof Buffer < \"u\", newBufferFrom: function(o, r) {\n if (Buffer.from && Buffer.from !== Uint8Array.from) return Buffer.from(o, r);\n if (typeof o == \"number\") throw new Error('The \"data\" argument must not be a number');\n return new Buffer(o, r);\n }, allocBuffer: function(o) {\n if (Buffer.alloc) return Buffer.alloc(o);\n var r = new Buffer(o);\n return r.fill(0), r;\n }, isBuffer: function(o) {\n return Buffer.isBuffer(o);\n }, isStream: function(o) {\n return o && typeof o.on == \"function\" && typeof o.pause == \"function\" && typeof o.resume == \"function\";\n } };\n }, {}], 15: [function(t, n, i) {\n function o(b, A, M) {\n var C, P = a.getTypeOf(A), k = a.extend(M || {}, c);\n k.date = k.date || /* @__PURE__ */ new Date(), k.compression !== null && (k.compression = k.compression.toUpperCase()), typeof k.unixPermissions == \"string\" && (k.unixPermissions = parseInt(k.unixPermissions, 8)), k.unixPermissions && 16384 & k.unixPermissions && (k.dir = !0), k.dosPermissions && 16 & k.dosPermissions && (k.dir = !0), k.dir && (b = y(b)), k.createFolders && (C = g(b)) && w.call(this, C, !0);\n var B = P === \"string\" && k.binary === !1 && k.base64 === !1;\n M && M.binary !== void 0 || (k.binary = !B), (A instanceof u && A.uncompressedSize === 0 || k.dir || !A || A.length === 0) && (k.base64 = !1, k.binary = !0, A = \"\", k.compression = \"STORE\", P = \"string\");\n var T = null;\n T = A instanceof u || A instanceof l ? A : f.isNode && f.isStream(A) ? new m(b, A) : a.prepareContent(b, A, k.binary, k.optimizedBinaryString, k.base64);\n var D = new d(b, T, k);\n this.files[b] = D;\n }\n var r = t(\"./utf8\"), a = t(\"./utils\"), l = t(\"./stream/GenericWorker\"), h = t(\"./stream/StreamHelper\"), c = t(\"./defaults\"), u = t(\"./compressedObject\"), d = t(\"./zipObject\"), p = t(\"./generate\"), f = t(\"./nodejsUtils\"), m = t(\"./nodejs/NodejsStreamInputAdapter\"), g = function(b) {\n b.slice(-1) === \"/\" && (b = b.substring(0, b.length - 1));\n var A = b.lastIndexOf(\"/\");\n return 0 < A ? b.substring(0, A) : \"\";\n }, y = function(b) {\n return b.slice(-1) !== \"/\" && (b += \"/\"), b;\n }, w = function(b, A) {\n return A = A !== void 0 ? A : c.createFolders, b = y(b), this.files[b] || o.call(this, b, null, { dir: !0, createFolders: A }), this.files[b];\n };\n function _(b) {\n return Object.prototype.toString.call(b) === \"[object RegExp]\";\n }\n var x = { load: function() {\n throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n }, forEach: function(b) {\n var A, M, C;\n for (A in this.files) C = this.files[A], (M = A.slice(this.root.length, A.length)) && A.slice(0, this.root.length) === this.root && b(M, C);\n }, filter: function(b) {\n var A = [];\n return this.forEach(function(M, C) {\n b(M, C) && A.push(C);\n }), A;\n }, file: function(b, A, M) {\n if (arguments.length !== 1) return b = this.root + b, o.call(this, b, A, M), this;\n if (_(b)) {\n var C = b;\n return this.filter(function(k, B) {\n return !B.dir && C.test(k);\n });\n }\n var P = this.files[this.root + b];\n return P && !P.dir ? P : null;\n }, folder: function(b) {\n if (!b) return this;\n if (_(b)) return this.filter(function(P, k) {\n return k.dir && b.test(P);\n });\n var A = this.root + b, M = w.call(this, A), C = this.clone();\n return C.root = M.name, C;\n }, remove: function(b) {\n b = this.root + b;\n var A = this.files[b];\n if (A || (b.slice(-1) !== \"/\" && (b += \"/\"), A = this.files[b]), A && !A.dir) delete this.files[b];\n else for (var M = this.filter(function(P, k) {\n return k.name.slice(0, b.length) === b;\n }), C = 0; C < M.length; C++) delete this.files[M[C].name];\n return this;\n }, generate: function() {\n throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n }, generateInternalStream: function(b) {\n var A, M = {};\n try {\n if ((M = a.extend(b || {}, { streamFiles: !1, compression: \"STORE\", compressionOptions: null, type: \"\", platform: \"DOS\", comment: null, mimeType: \"application/zip\", encodeFileName: r.utf8encode })).type = M.type.toLowerCase(), M.compression = M.compression.toUpperCase(), M.type === \"binarystring\" && (M.type = \"string\"), !M.type) throw new Error(\"No output type specified.\");\n a.checkSupport(M.type), M.platform !== \"darwin\" && M.platform !== \"freebsd\" && M.platform !== \"linux\" && M.platform !== \"sunos\" || (M.platform = \"UNIX\"), M.platform === \"win32\" && (M.platform = \"DOS\");\n var C = M.comment || this.comment || \"\";\n A = p.generateWorker(this, M, C);\n } catch (P) {\n (A = new l(\"error\")).error(P);\n }\n return new h(A, M.type || \"string\", M.mimeType);\n }, generateAsync: function(b, A) {\n return this.generateInternalStream(b).accumulate(A);\n }, generateNodeStream: function(b, A) {\n return (b = b || {}).type || (b.type = \"nodebuffer\"), this.generateInternalStream(b).toNodejsStream(A);\n } };\n n.exports = x;\n }, { \"./compressedObject\": 2, \"./defaults\": 5, \"./generate\": 9, \"./nodejs/NodejsStreamInputAdapter\": 12, \"./nodejsUtils\": 14, \"./stream/GenericWorker\": 28, \"./stream/StreamHelper\": 29, \"./utf8\": 31, \"./utils\": 32, \"./zipObject\": 35 }], 16: [function(t, n, i) {\n n.exports = t(\"stream\");\n }, { stream: void 0 }], 17: [function(t, n, i) {\n var o = t(\"./DataReader\");\n function r(a) {\n o.call(this, a);\n for (var l = 0; l < this.data.length; l++) a[l] = 255 & a[l];\n }\n t(\"../utils\").inherits(r, o), r.prototype.byteAt = function(a) {\n return this.data[this.zero + a];\n }, r.prototype.lastIndexOfSignature = function(a) {\n for (var l = a.charCodeAt(0), h = a.charCodeAt(1), c = a.charCodeAt(2), u = a.charCodeAt(3), d = this.length - 4; 0 <= d; --d) if (this.data[d] === l && this.data[d + 1] === h && this.data[d + 2] === c && this.data[d + 3] === u) return d - this.zero;\n return -1;\n }, r.prototype.readAndCheckSignature = function(a) {\n var l = a.charCodeAt(0), h = a.charCodeAt(1), c = a.charCodeAt(2), u = a.charCodeAt(3), d = this.readData(4);\n return l === d[0] && h === d[1] && c === d[2] && u === d[3];\n }, r.prototype.readData = function(a) {\n if (this.checkOffset(a), a === 0) return [];\n var l = this.data.slice(this.zero + this.index, this.zero + this.index + a);\n return this.index += a, l;\n }, n.exports = r;\n }, { \"../utils\": 32, \"./DataReader\": 18 }], 18: [function(t, n, i) {\n var o = t(\"../utils\");\n function r(a) {\n this.data = a, this.length = a.length, this.index = 0, this.zero = 0;\n }\n r.prototype = { checkOffset: function(a) {\n this.checkIndex(this.index + a);\n }, checkIndex: function(a) {\n if (this.length < this.zero + a || a < 0) throw new Error(\"End of data reached (data length = \" + this.length + \", asked index = \" + a + \"). Corrupted zip ?\");\n }, setIndex: function(a) {\n this.checkIndex(a), this.index = a;\n }, skip: function(a) {\n this.setIndex(this.index + a);\n }, byteAt: function() {\n }, readInt: function(a) {\n var l, h = 0;\n for (this.checkOffset(a), l = this.index + a - 1; l >= this.index; l--) h = (h << 8) + this.byteAt(l);\n return this.index += a, h;\n }, readString: function(a) {\n return o.transformTo(\"string\", this.readData(a));\n }, readData: function() {\n }, lastIndexOfSignature: function() {\n }, readAndCheckSignature: function() {\n }, readDate: function() {\n var a = this.readInt(4);\n return new Date(Date.UTC(1980 + (a >> 25 & 127), (a >> 21 & 15) - 1, a >> 16 & 31, a >> 11 & 31, a >> 5 & 63, (31 & a) << 1));\n } }, n.exports = r;\n }, { \"../utils\": 32 }], 19: [function(t, n, i) {\n var o = t(\"./Uint8ArrayReader\");\n function r(a) {\n o.call(this, a);\n }\n t(\"../utils\").inherits(r, o), r.prototype.readData = function(a) {\n this.checkOffset(a);\n var l = this.data.slice(this.zero + this.index, this.zero + this.index + a);\n return this.index += a, l;\n }, n.exports = r;\n }, { \"../utils\": 32, \"./Uint8ArrayReader\": 21 }], 20: [function(t, n, i) {\n var o = t(\"./DataReader\");\n function r(a) {\n o.call(this, a);\n }\n t(\"../utils\").inherits(r, o), r.prototype.byteAt = function(a) {\n return this.data.charCodeAt(this.zero + a);\n }, r.prototype.lastIndexOfSignature = function(a) {\n return this.data.lastIndexOf(a) - this.zero;\n }, r.prototype.readAndCheckSignature = function(a) {\n return a === this.readData(4);\n }, r.prototype.readData = function(a) {\n this.checkOffset(a);\n var l = this.data.slice(this.zero + this.index, this.zero + this.index + a);\n return this.index += a, l;\n }, n.exports = r;\n }, { \"../utils\": 32, \"./DataReader\": 18 }], 21: [function(t, n, i) {\n var o = t(\"./ArrayReader\");\n function r(a) {\n o.call(this, a);\n }\n t(\"../utils\").inherits(r, o), r.prototype.readData = function(a) {\n if (this.checkOffset(a), a === 0) return new Uint8Array(0);\n var l = this.data.subarray(this.zero + this.index, this.zero + this.index + a);\n return this.index += a, l;\n }, n.exports = r;\n }, { \"../utils\": 32, \"./ArrayReader\": 17 }], 22: [function(t, n, i) {\n var o = t(\"../utils\"), r = t(\"../support\"), a = t(\"./ArrayReader\"), l = t(\"./StringReader\"), h = t(\"./NodeBufferReader\"), c = t(\"./Uint8ArrayReader\");\n n.exports = function(u) {\n var d = o.getTypeOf(u);\n return o.checkSupport(d), d !== \"string\" || r.uint8array ? d === \"nodebuffer\" ? new h(u) : r.uint8array ? new c(o.transformTo(\"uint8array\", u)) : new a(o.transformTo(\"array\", u)) : new l(u);\n };\n }, { \"../support\": 30, \"../utils\": 32, \"./ArrayReader\": 17, \"./NodeBufferReader\": 19, \"./StringReader\": 20, \"./Uint8ArrayReader\": 21 }], 23: [function(t, n, i) {\n i.LOCAL_FILE_HEADER = \"PK\u0003\u0004\", i.CENTRAL_FILE_HEADER = \"PK\u0001\u0002\", i.CENTRAL_DIRECTORY_END = \"PK\u0005\u0006\", i.ZIP64_CENTRAL_DIRECTORY_LOCATOR = \"PK\u0006\\x07\", i.ZIP64_CENTRAL_DIRECTORY_END = \"PK\u0006\u0006\", i.DATA_DESCRIPTOR = \"PK\\x07\\b\";\n }, {}], 24: [function(t, n, i) {\n var o = t(\"./GenericWorker\"), r = t(\"../utils\");\n function a(l) {\n o.call(this, \"ConvertWorker to \" + l), this.destType = l;\n }\n r.inherits(a, o), a.prototype.processChunk = function(l) {\n this.push({ data: r.transformTo(this.destType, l.data), meta: l.meta });\n }, n.exports = a;\n }, { \"../utils\": 32, \"./GenericWorker\": 28 }], 25: [function(t, n, i) {\n var o = t(\"./GenericWorker\"), r = t(\"../crc32\");\n function a() {\n o.call(this, \"Crc32Probe\"), this.withStreamInfo(\"crc32\", 0);\n }\n t(\"../utils\").inherits(a, o), a.prototype.processChunk = function(l) {\n this.streamInfo.crc32 = r(l.data, this.streamInfo.crc32 || 0), this.push(l);\n }, n.exports = a;\n }, { \"../crc32\": 4, \"../utils\": 32, \"./GenericWorker\": 28 }], 26: [function(t, n, i) {\n var o = t(\"../utils\"), r = t(\"./GenericWorker\");\n function a(l) {\n r.call(this, \"DataLengthProbe for \" + l), this.propName = l, this.withStreamInfo(l, 0);\n }\n o.inherits(a, r), a.prototype.processChunk = function(l) {\n if (l) {\n var h = this.streamInfo[this.propName] || 0;\n this.streamInfo[this.propName] = h + l.data.length;\n }\n r.prototype.processChunk.call(this, l);\n }, n.exports = a;\n }, { \"../utils\": 32, \"./GenericWorker\": 28 }], 27: [function(t, n, i) {\n var o = t(\"../utils\"), r = t(\"./GenericWorker\");\n function a(l) {\n r.call(this, \"DataWorker\");\n var h = this;\n this.dataIsReady = !1, this.index = 0, this.max = 0, this.data = null, this.type = \"\", this._tickScheduled = !1, l.then(function(c) {\n h.dataIsReady = !0, h.data = c, h.max = c && c.length || 0, h.type = o.getTypeOf(c), h.isPaused || h._tickAndRepeat();\n }, function(c) {\n h.error(c);\n });\n }\n o.inherits(a, r), a.prototype.cleanUp = function() {\n r.prototype.cleanUp.call(this), this.data = null;\n }, a.prototype.resume = function() {\n return !!r.prototype.resume.call(this) && (!this._tickScheduled && this.dataIsReady && (this._tickScheduled = !0, o.delay(this._tickAndRepeat, [], this)), !0);\n }, a.prototype._tickAndRepeat = function() {\n this._tickScheduled = !1, this.isPaused || this.isFinished || (this._tick(), this.isFinished || (o.delay(this._tickAndRepeat, [], this), this._tickScheduled = !0));\n }, a.prototype._tick = function() {\n if (this.isPaused || this.isFinished) return !1;\n var l = null, h = Math.min(this.max, this.index + 16384);\n if (this.index >= this.max) return this.end();\n switch (this.type) {\n case \"string\":\n l = this.data.substring(this.index, h);\n break;\n case \"uint8array\":\n l = this.data.subarray(this.index, h);\n break;\n case \"array\":\n case \"nodebuffer\":\n l = this.data.slice(this.index, h);\n }\n return this.index = h, this.push({ data: l, meta: { percent: this.max ? this.index / this.max * 100 : 0 } });\n }, n.exports = a;\n }, { \"../utils\": 32, \"./GenericWorker\": 28 }], 28: [function(t, n, i) {\n function o(r) {\n this.name = r || \"default\", this.streamInfo = {}, this.generatedError = null, this.extraStreamInfo = {}, this.isPaused = !0, this.isFinished = !1, this.isLocked = !1, this._listeners = { data: [], end: [], error: [] }, this.previous = null;\n }\n o.prototype = { push: function(r) {\n this.emit(\"data\", r);\n }, end: function() {\n if (this.isFinished) return !1;\n this.flush();\n try {\n this.emit(\"end\"), this.cleanUp(), this.isFinished = !0;\n } catch (r) {\n this.emit(\"error\", r);\n }\n return !0;\n }, error: function(r) {\n return !this.isFinished && (this.isPaused ? this.generatedError = r : (this.isFinished = !0, this.emit(\"error\", r), this.previous && this.previous.error(r), this.cleanUp()), !0);\n }, on: function(r, a) {\n return this._listeners[r].push(a), this;\n }, cleanUp: function() {\n this.streamInfo = this.generatedError = this.extraStreamInfo = null, this._listeners = [];\n }, emit: function(r, a) {\n if (this._listeners[r]) for (var l = 0; l < this._listeners[r].length; l++) this._listeners[r][l].call(this, a);\n }, pipe: function(r) {\n return r.registerPrevious(this);\n }, registerPrevious: function(r) {\n if (this.isLocked) throw new Error(\"The stream '\" + this + \"' has already been used.\");\n this.streamInfo = r.streamInfo, this.mergeStreamInfo(), this.previous = r;\n var a = this;\n return r.on(\"data\", function(l) {\n a.processChunk(l);\n }), r.on(\"end\", function() {\n a.end();\n }), r.on(\"error\", function(l) {\n a.error(l);\n }), this;\n }, pause: function() {\n return !this.isPaused && !this.isFinished && (this.isPaused = !0, this.previous && this.previous.pause(), !0);\n }, resume: function() {\n if (!this.isPaused || this.isFinished) return !1;\n var r = this.isPaused = !1;\n return this.generatedError && (this.error(this.generatedError), r = !0), this.previous && this.previous.resume(), !r;\n }, flush: function() {\n }, processChunk: function(r) {\n this.push(r);\n }, withStreamInfo: function(r, a) {\n return this.extraStreamInfo[r] = a, this.mergeStreamInfo(), this;\n }, mergeStreamInfo: function() {\n for (var r in this.extraStreamInfo) Object.prototype.hasOwnProperty.call(this.extraStreamInfo, r) && (this.streamInfo[r] = this.extraStreamInfo[r]);\n }, lock: function() {\n if (this.isLocked) throw new Error(\"The stream '\" + this + \"' has already been used.\");\n this.isLocked = !0, this.previous && this.previous.lock();\n }, toString: function() {\n var r = \"Worker \" + this.name;\n return this.previous ? this.previous + \" -> \" + r : r;\n } }, n.exports = o;\n }, {}], 29: [function(t, n, i) {\n var o = t(\"../utils\"), r = t(\"./ConvertWorker\"), a = t(\"./GenericWorker\"), l = t(\"../base64\"), h = t(\"../support\"), c = t(\"../external\"), u = null;\n if (h.nodestream) try {\n u = t(\"../nodejs/NodejsStreamOutputAdapter\");\n } catch {\n }\n function d(f, m) {\n return new c.Promise(function(g, y) {\n var w = [], _ = f._internalType, x = f._outputType, b = f._mimeType;\n f.on(\"data\", function(A, M) {\n w.push(A), m && m(M);\n }).on(\"error\", function(A) {\n w = [], y(A);\n }).on(\"end\", function() {\n try {\n var A = (function(M, C, P) {\n switch (M) {\n case \"blob\":\n return o.newBlob(o.transformTo(\"arraybuffer\", C), P);\n case \"base64\":\n return l.encode(C);\n default:\n return o.transformTo(M, C);\n }\n })(x, (function(M, C) {\n var P, k = 0, B = null, T = 0;\n for (P = 0; P < C.length; P++) T += C[P].length;\n switch (M) {\n case \"string\":\n return C.join(\"\");\n case \"array\":\n return Array.prototype.concat.apply([], C);\n case \"uint8array\":\n for (B = new Uint8Array(T), P = 0; P < C.length; P++) B.set(C[P], k), k += C[P].length;\n return B;\n case \"nodebuffer\":\n return Buffer.concat(C);\n default:\n throw new Error(\"concat : unsupported type '\" + M + \"'\");\n }\n })(_, w), b);\n g(A);\n } catch (M) {\n y(M);\n }\n w = [];\n }).resume();\n });\n }\n function p(f, m, g) {\n var y = m;\n switch (m) {\n case \"blob\":\n case \"arraybuffer\":\n y = \"uint8array\";\n break;\n case \"base64\":\n y = \"string\";\n }\n try {\n this._internalType = y, this._outputType = m, this._mimeType = g, o.checkSupport(y), this._worker = f.pipe(new r(y)), f.lock();\n } catch (w) {\n this._worker = new a(\"error\"), this._worker.error(w);\n }\n }\n p.prototype = { accumulate: function(f) {\n return d(this, f);\n }, on: function(f, m) {\n var g = this;\n return f === \"data\" ? this._worker.on(f, function(y) {\n m.call(g, y.data, y.meta);\n }) : this._worker.on(f, function() {\n o.delay(m, arguments, g);\n }), this;\n }, resume: function() {\n return o.delay(this._worker.resume, [], this._worker), this;\n }, pause: function() {\n return this._worker.pause(), this;\n }, toNodejsStream: function(f) {\n if (o.checkSupport(\"nodestream\"), this._outputType !== \"nodebuffer\") throw new Error(this._outputType + \" is not supported by this method\");\n return new u(this, { objectMode: this._outputType !== \"nodebuffer\" }, f);\n } }, n.exports = p;\n }, { \"../base64\": 1, \"../external\": 6, \"../nodejs/NodejsStreamOutputAdapter\": 13, \"../support\": 30, \"../utils\": 32, \"./ConvertWorker\": 24, \"./GenericWorker\": 28 }], 30: [function(t, n, i) {\n if (i.base64 = !0, i.array = !0, i.string = !0, i.arraybuffer = typeof ArrayBuffer < \"u\" && typeof Uint8Array < \"u\", i.nodebuffer = typeof Buffer < \"u\", i.uint8array = typeof Uint8Array < \"u\", typeof ArrayBuffer > \"u\") i.blob = !1;\n else {\n var o = new ArrayBuffer(0);\n try {\n i.blob = new Blob([o], { type: \"application/zip\" }).size === 0;\n } catch {\n try {\n var r = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();\n r.append(o), i.blob = r.getBlob(\"application/zip\").size === 0;\n } catch {\n i.blob = !1;\n }\n }\n }\n try {\n i.nodestream = !!t(\"readable-stream\").Readable;\n } catch {\n i.nodestream = !1;\n }\n }, { \"readable-stream\": 16 }], 31: [function(t, n, i) {\n for (var o = t(\"./utils\"), r = t(\"./support\"), a = t(\"./nodejsUtils\"), l = t(\"./stream/GenericWorker\"), h = new Array(256), c = 0; c < 256; c++) h[c] = 252 <= c ? 6 : 248 <= c ? 5 : 240 <= c ? 4 : 224 <= c ? 3 : 192 <= c ? 2 : 1;\n h[254] = h[254] = 1;\n function u() {\n l.call(this, \"utf-8 decode\"), this.leftOver = null;\n }\n function d() {\n l.call(this, \"utf-8 encode\");\n }\n i.utf8encode = function(p) {\n return r.nodebuffer ? a.newBufferFrom(p, \"utf-8\") : (function(f) {\n var m, g, y, w, _, x = f.length, b = 0;\n for (w = 0; w < x; w++) (64512 & (g = f.charCodeAt(w))) == 55296 && w + 1 < x && (64512 & (y = f.charCodeAt(w + 1))) == 56320 && (g = 65536 + (g - 55296 << 10) + (y - 56320), w++), b += g < 128 ? 1 : g < 2048 ? 2 : g < 65536 ? 3 : 4;\n for (m = r.uint8array ? new Uint8Array(b) : new Array(b), w = _ = 0; _ < b; w++) (64512 & (g = f.charCodeAt(w))) == 55296 && w + 1 < x && (64512 & (y = f.charCodeAt(w + 1))) == 56320 && (g = 65536 + (g - 55296 << 10) + (y - 56320), w++), g < 128 ? m[_++] = g : (g < 2048 ? m[_++] = 192 | g >>> 6 : (g < 65536 ? m[_++] = 224 | g >>> 12 : (m[_++] = 240 | g >>> 18, m[_++] = 128 | g >>> 12 & 63), m[_++] = 128 | g >>> 6 & 63), m[_++] = 128 | 63 & g);\n return m;\n })(p);\n }, i.utf8decode = function(p) {\n return r.nodebuffer ? o.transformTo(\"nodebuffer\", p).toString(\"utf-8\") : (function(f) {\n var m, g, y, w, _ = f.length, x = new Array(2 * _);\n for (m = g = 0; m < _; ) if ((y = f[m++]) < 128) x[g++] = y;\n else if (4 < (w = h[y])) x[g++] = 65533, m += w - 1;\n else {\n for (y &= w === 2 ? 31 : w === 3 ? 15 : 7; 1 < w && m < _; ) y = y << 6 | 63 & f[m++], w--;\n 1 < w ? x[g++] = 65533 : y < 65536 ? x[g++] = y : (y -= 65536, x[g++] = 55296 | y >> 10 & 1023, x[g++] = 56320 | 1023 & y);\n }\n return x.length !== g && (x.subarray ? x = x.subarray(0, g) : x.length = g), o.applyFromCharCode(x);\n })(p = o.transformTo(r.uint8array ? \"uint8array\" : \"array\", p));\n }, o.inherits(u, l), u.prototype.processChunk = function(p) {\n var f = o.transformTo(r.uint8array ? \"uint8array\" : \"array\", p.data);\n if (this.leftOver && this.leftOver.length) {\n if (r.uint8array) {\n var m = f;\n (f = new Uint8Array(m.length + this.leftOver.length)).set(this.leftOver, 0), f.set(m, this.leftOver.length);\n } else f = this.leftOver.concat(f);\n this.leftOver = null;\n }\n var g = (function(w, _) {\n var x;\n for ((_ = _ || w.length) > w.length && (_ = w.length), x = _ - 1; 0 <= x && (192 & w[x]) == 128; ) x--;\n return x < 0 || x === 0 ? _ : x + h[w[x]] > _ ? x : _;\n })(f), y = f;\n g !== f.length && (r.uint8array ? (y = f.subarray(0, g), this.leftOver = f.subarray(g, f.length)) : (y = f.slice(0, g), this.leftOver = f.slice(g, f.length))), this.push({ data: i.utf8decode(y), meta: p.meta });\n }, u.prototype.flush = function() {\n this.leftOver && this.leftOver.length && (this.push({ data: i.utf8decode(this.leftOver), meta: {} }), this.leftOver = null);\n }, i.Utf8DecodeWorker = u, o.inherits(d, l), d.prototype.processChunk = function(p) {\n this.push({ data: i.utf8encode(p.data), meta: p.meta });\n }, i.Utf8EncodeWorker = d;\n }, { \"./nodejsUtils\": 14, \"./stream/GenericWorker\": 28, \"./support\": 30, \"./utils\": 32 }], 32: [function(t, n, i) {\n var o = t(\"./support\"), r = t(\"./base64\"), a = t(\"./nodejsUtils\"), l = t(\"./external\");\n function h(m) {\n return m;\n }\n function c(m, g) {\n for (var y = 0; y < m.length; ++y) g[y] = 255 & m.charCodeAt(y);\n return g;\n }\n t(\"setimmediate\"), i.newBlob = function(m, g) {\n i.checkSupport(\"blob\");\n try {\n return new Blob([m], { type: g });\n } catch {\n try {\n var y = new (self.BlobBuilder || self.WebKitBlobBuilder || self.MozBlobBuilder || self.MSBlobBuilder)();\n return y.append(m), y.getBlob(g);\n } catch {\n throw new Error(\"Bug : can't construct the Blob.\");\n }\n }\n };\n var u = { stringifyByChunk: function(m, g, y) {\n var w = [], _ = 0, x = m.length;\n if (x <= y) return String.fromCharCode.apply(null, m);\n for (; _ < x; ) g === \"array\" || g === \"nodebuffer\" ? w.push(String.fromCharCode.apply(null, m.slice(_, Math.min(_ + y, x)))) : w.push(String.fromCharCode.apply(null, m.subarray(_, Math.min(_ + y, x)))), _ += y;\n return w.join(\"\");\n }, stringifyByChar: function(m) {\n for (var g = \"\", y = 0; y < m.length; y++) g += String.fromCharCode(m[y]);\n return g;\n }, applyCanBeUsed: { uint8array: (function() {\n try {\n return o.uint8array && String.fromCharCode.apply(null, new Uint8Array(1)).length === 1;\n } catch {\n return !1;\n }\n })(), nodebuffer: (function() {\n try {\n return o.nodebuffer && String.fromCharCode.apply(null, a.allocBuffer(1)).length === 1;\n } catch {\n return !1;\n }\n })() } };\n function d(m) {\n var g = 65536, y = i.getTypeOf(m), w = !0;\n if (y === \"uint8array\" ? w = u.applyCanBeUsed.uint8array : y === \"nodebuffer\" && (w = u.applyCanBeUsed.nodebuffer), w) for (; 1 < g; ) try {\n return u.stringifyByChunk(m, y, g);\n } catch {\n g = Math.floor(g / 2);\n }\n return u.stringifyByChar(m);\n }\n function p(m, g) {\n for (var y = 0; y < m.length; y++) g[y] = m[y];\n return g;\n }\n i.applyFromCharCode = d;\n var f = {};\n f.string = { string: h, array: function(m) {\n return c(m, new Array(m.length));\n }, arraybuffer: function(m) {\n return f.string.uint8array(m).buffer;\n }, uint8array: function(m) {\n return c(m, new Uint8Array(m.length));\n }, nodebuffer: function(m) {\n return c(m, a.allocBuffer(m.length));\n } }, f.array = { string: d, array: h, arraybuffer: function(m) {\n return new Uint8Array(m).buffer;\n }, uint8array: function(m) {\n return new Uint8Array(m);\n }, nodebuffer: function(m) {\n return a.newBufferFrom(m);\n } }, f.arraybuffer = { string: function(m) {\n return d(new Uint8Array(m));\n }, array: function(m) {\n return p(new Uint8Array(m), new Array(m.byteLength));\n }, arraybuffer: h, uint8array: function(m) {\n return new Uint8Array(m);\n }, nodebuffer: function(m) {\n return a.newBufferFrom(new Uint8Array(m));\n } }, f.uint8array = { string: d, array: function(m) {\n return p(m, new Array(m.length));\n }, arraybuffer: function(m) {\n return m.buffer;\n }, uint8array: h, nodebuffer: function(m) {\n return a.newBufferFrom(m);\n } }, f.nodebuffer = { string: d, array: function(m) {\n return p(m, new Array(m.length));\n }, arraybuffer: function(m) {\n return f.nodebuffer.uint8array(m).buffer;\n }, uint8array: function(m) {\n return p(m, new Uint8Array(m.length));\n }, nodebuffer: h }, i.transformTo = function(m, g) {\n if (g = g || \"\", !m) return g;\n i.checkSupport(m);\n var y = i.getTypeOf(g);\n return f[y][m](g);\n }, i.resolve = function(m) {\n for (var g = m.split(\"/\"), y = [], w = 0; w < g.length; w++) {\n var _ = g[w];\n _ === \".\" || _ === \"\" && w !== 0 && w !== g.length - 1 || (_ === \"..\" ? y.pop() : y.push(_));\n }\n return y.join(\"/\");\n }, i.getTypeOf = function(m) {\n return typeof m == \"string\" ? \"string\" : Object.prototype.toString.call(m) === \"[object Array]\" ? \"array\" : o.nodebuffer && a.isBuffer(m) ? \"nodebuffer\" : o.uint8array && m instanceof Uint8Array ? \"uint8array\" : o.arraybuffer && m instanceof ArrayBuffer ? \"arraybuffer\" : void 0;\n }, i.checkSupport = function(m) {\n if (!o[m.toLowerCase()]) throw new Error(m + \" is not supported by this platform\");\n }, i.MAX_VALUE_16BITS = 65535, i.MAX_VALUE_32BITS = -1, i.pretty = function(m) {\n var g, y, w = \"\";\n for (y = 0; y < (m || \"\").length; y++) w += \"\\\\x\" + ((g = m.charCodeAt(y)) < 16 ? \"0\" : \"\") + g.toString(16).toUpperCase();\n return w;\n }, i.delay = function(m, g, y) {\n setImmediate(function() {\n m.apply(y || null, g || []);\n });\n }, i.inherits = function(m, g) {\n function y() {\n }\n y.prototype = g.prototype, m.prototype = new y();\n }, i.extend = function() {\n var m, g, y = {};\n for (m = 0; m < arguments.length; m++) for (g in arguments[m]) Object.prototype.hasOwnProperty.call(arguments[m], g) && y[g] === void 0 && (y[g] = arguments[m][g]);\n return y;\n }, i.prepareContent = function(m, g, y, w, _) {\n return l.Promise.resolve(g).then(function(x) {\n return o.blob && (x instanceof Blob || [\"[object File]\", \"[object Blob]\"].indexOf(Object.prototype.toString.call(x)) !== -1) && typeof FileReader < \"u\" ? new l.Promise(function(b, A) {\n var M = new FileReader();\n M.onload = function(C) {\n b(C.target.result);\n }, M.onerror = function(C) {\n A(C.target.error);\n }, M.readAsArrayBuffer(x);\n }) : x;\n }).then(function(x) {\n var b = i.getTypeOf(x);\n return b ? (b === \"arraybuffer\" ? x = i.transformTo(\"uint8array\", x) : b === \"string\" && (_ ? x = r.decode(x) : y && w !== !0 && (x = (function(A) {\n return c(A, o.uint8array ? new Uint8Array(A.length) : new Array(A.length));\n })(x))), x) : l.Promise.reject(new Error(\"Can't read the data of '\" + m + \"'. Is it in a supported JavaScript type (String, Blob, ArrayBuffer, etc) ?\"));\n });\n };\n }, { \"./base64\": 1, \"./external\": 6, \"./nodejsUtils\": 14, \"./support\": 30, setimmediate: 54 }], 33: [function(t, n, i) {\n var o = t(\"./reader/readerFor\"), r = t(\"./utils\"), a = t(\"./signature\"), l = t(\"./zipEntry\"), h = t(\"./support\");\n function c(u) {\n this.files = [], this.loadOptions = u;\n }\n c.prototype = { checkSignature: function(u) {\n if (!this.reader.readAndCheckSignature(u)) {\n this.reader.index -= 4;\n var d = this.reader.readString(4);\n throw new Error(\"Corrupted zip or bug: unexpected signature (\" + r.pretty(d) + \", expected \" + r.pretty(u) + \")\");\n }\n }, isSignature: function(u, d) {\n var p = this.reader.index;\n this.reader.setIndex(u);\n var f = this.reader.readString(4) === d;\n return this.reader.setIndex(p), f;\n }, readBlockEndOfCentral: function() {\n this.diskNumber = this.reader.readInt(2), this.diskWithCentralDirStart = this.reader.readInt(2), this.centralDirRecordsOnThisDisk = this.reader.readInt(2), this.centralDirRecords = this.reader.readInt(2), this.centralDirSize = this.reader.readInt(4), this.centralDirOffset = this.reader.readInt(4), this.zipCommentLength = this.reader.readInt(2);\n var u = this.reader.readData(this.zipCommentLength), d = h.uint8array ? \"uint8array\" : \"array\", p = r.transformTo(d, u);\n this.zipComment = this.loadOptions.decodeFileName(p);\n }, readBlockZip64EndOfCentral: function() {\n this.zip64EndOfCentralSize = this.reader.readInt(8), this.reader.skip(4), this.diskNumber = this.reader.readInt(4), this.diskWithCentralDirStart = this.reader.readInt(4), this.centralDirRecordsOnThisDisk = this.reader.readInt(8), this.centralDirRecords = this.reader.readInt(8), this.centralDirSize = this.reader.readInt(8), this.centralDirOffset = this.reader.readInt(8), this.zip64ExtensibleData = {};\n for (var u, d, p, f = this.zip64EndOfCentralSize - 44; 0 < f; ) u = this.reader.readInt(2), d = this.reader.readInt(4), p = this.reader.readData(d), this.zip64ExtensibleData[u] = { id: u, length: d, value: p };\n }, readBlockZip64EndOfCentralLocator: function() {\n if (this.diskWithZip64CentralDirStart = this.reader.readInt(4), this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8), this.disksCount = this.reader.readInt(4), 1 < this.disksCount) throw new Error(\"Multi-volumes zip are not supported\");\n }, readLocalFiles: function() {\n var u, d;\n for (u = 0; u < this.files.length; u++) d = this.files[u], this.reader.setIndex(d.localHeaderOffset), this.checkSignature(a.LOCAL_FILE_HEADER), d.readLocalPart(this.reader), d.handleUTF8(), d.processAttributes();\n }, readCentralDir: function() {\n var u;\n for (this.reader.setIndex(this.centralDirOffset); this.reader.readAndCheckSignature(a.CENTRAL_FILE_HEADER); ) (u = new l({ zip64: this.zip64 }, this.loadOptions)).readCentralPart(this.reader), this.files.push(u);\n if (this.centralDirRecords !== this.files.length && this.centralDirRecords !== 0 && this.files.length === 0) throw new Error(\"Corrupted zip or bug: expected \" + this.centralDirRecords + \" records in central dir, got \" + this.files.length);\n }, readEndOfCentral: function() {\n var u = this.reader.lastIndexOfSignature(a.CENTRAL_DIRECTORY_END);\n if (u < 0) throw this.isSignature(0, a.LOCAL_FILE_HEADER) ? new Error(\"Corrupted zip: can't find end of central directory\") : new Error(\"Can't find end of central directory : is this a zip file ? If it is, see https://stuk.github.io/jszip/documentation/howto/read_zip.html\");\n this.reader.setIndex(u);\n var d = u;\n if (this.checkSignature(a.CENTRAL_DIRECTORY_END), this.readBlockEndOfCentral(), this.diskNumber === r.MAX_VALUE_16BITS || this.diskWithCentralDirStart === r.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === r.MAX_VALUE_16BITS || this.centralDirRecords === r.MAX_VALUE_16BITS || this.centralDirSize === r.MAX_VALUE_32BITS || this.centralDirOffset === r.MAX_VALUE_32BITS) {\n if (this.zip64 = !0, (u = this.reader.lastIndexOfSignature(a.ZIP64_CENTRAL_DIRECTORY_LOCATOR)) < 0) throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory locator\");\n if (this.reader.setIndex(u), this.checkSignature(a.ZIP64_CENTRAL_DIRECTORY_LOCATOR), this.readBlockZip64EndOfCentralLocator(), !this.isSignature(this.relativeOffsetEndOfZip64CentralDir, a.ZIP64_CENTRAL_DIRECTORY_END) && (this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(a.ZIP64_CENTRAL_DIRECTORY_END), this.relativeOffsetEndOfZip64CentralDir < 0)) throw new Error(\"Corrupted zip: can't find the ZIP64 end of central directory\");\n this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir), this.checkSignature(a.ZIP64_CENTRAL_DIRECTORY_END), this.readBlockZip64EndOfCentral();\n }\n var p = this.centralDirOffset + this.centralDirSize;\n this.zip64 && (p += 20, p += 12 + this.zip64EndOfCentralSize);\n var f = d - p;\n if (0 < f) this.isSignature(d, a.CENTRAL_FILE_HEADER) || (this.reader.zero = f);\n else if (f < 0) throw new Error(\"Corrupted zip: missing \" + Math.abs(f) + \" bytes.\");\n }, prepareReader: function(u) {\n this.reader = o(u);\n }, load: function(u) {\n this.prepareReader(u), this.readEndOfCentral(), this.readCentralDir(), this.readLocalFiles();\n } }, n.exports = c;\n }, { \"./reader/readerFor\": 22, \"./signature\": 23, \"./support\": 30, \"./utils\": 32, \"./zipEntry\": 34 }], 34: [function(t, n, i) {\n var o = t(\"./reader/readerFor\"), r = t(\"./utils\"), a = t(\"./compressedObject\"), l = t(\"./crc32\"), h = t(\"./utf8\"), c = t(\"./compressions\"), u = t(\"./support\");\n function d(p, f) {\n this.options = p, this.loadOptions = f;\n }\n d.prototype = { isEncrypted: function() {\n return (1 & this.bitFlag) == 1;\n }, useUTF8: function() {\n return (2048 & this.bitFlag) == 2048;\n }, readLocalPart: function(p) {\n var f, m;\n if (p.skip(22), this.fileNameLength = p.readInt(2), m = p.readInt(2), this.fileName = p.readData(this.fileNameLength), p.skip(m), this.compressedSize === -1 || this.uncompressedSize === -1) throw new Error(\"Bug or corrupted zip : didn't get enough information from the central directory (compressedSize === -1 || uncompressedSize === -1)\");\n if ((f = (function(g) {\n for (var y in c) if (Object.prototype.hasOwnProperty.call(c, y) && c[y].magic === g) return c[y];\n return null;\n })(this.compressionMethod)) === null) throw new Error(\"Corrupted zip : compression \" + r.pretty(this.compressionMethod) + \" unknown (inner file : \" + r.transformTo(\"string\", this.fileName) + \")\");\n this.decompressed = new a(this.compressedSize, this.uncompressedSize, this.crc32, f, p.readData(this.compressedSize));\n }, readCentralPart: function(p) {\n this.versionMadeBy = p.readInt(2), p.skip(2), this.bitFlag = p.readInt(2), this.compressionMethod = p.readString(2), this.date = p.readDate(), this.crc32 = p.readInt(4), this.compressedSize = p.readInt(4), this.uncompressedSize = p.readInt(4);\n var f = p.readInt(2);\n if (this.extraFieldsLength = p.readInt(2), this.fileCommentLength = p.readInt(2), this.diskNumberStart = p.readInt(2), this.internalFileAttributes = p.readInt(2), this.externalFileAttributes = p.readInt(4), this.localHeaderOffset = p.readInt(4), this.isEncrypted()) throw new Error(\"Encrypted zip are not supported\");\n p.skip(f), this.readExtraFields(p), this.parseZIP64ExtraField(p), this.fileComment = p.readData(this.fileCommentLength);\n }, processAttributes: function() {\n this.unixPermissions = null, this.dosPermissions = null;\n var p = this.versionMadeBy >> 8;\n this.dir = !!(16 & this.externalFileAttributes), p == 0 && (this.dosPermissions = 63 & this.externalFileAttributes), p == 3 && (this.unixPermissions = this.externalFileAttributes >> 16 & 65535), this.dir || this.fileNameStr.slice(-1) !== \"/\" || (this.dir = !0);\n }, parseZIP64ExtraField: function() {\n if (this.extraFields[1]) {\n var p = o(this.extraFields[1].value);\n this.uncompressedSize === r.MAX_VALUE_32BITS && (this.uncompressedSize = p.readInt(8)), this.compressedSize === r.MAX_VALUE_32BITS && (this.compressedSize = p.readInt(8)), this.localHeaderOffset === r.MAX_VALUE_32BITS && (this.localHeaderOffset = p.readInt(8)), this.diskNumberStart === r.MAX_VALUE_32BITS && (this.diskNumberStart = p.readInt(4));\n }\n }, readExtraFields: function(p) {\n var f, m, g, y = p.index + this.extraFieldsLength;\n for (this.extraFields || (this.extraFields = {}); p.index + 4 < y; ) f = p.readInt(2), m = p.readInt(2), g = p.readData(m), this.extraFields[f] = { id: f, length: m, value: g };\n p.setIndex(y);\n }, handleUTF8: function() {\n var p = u.uint8array ? \"uint8array\" : \"array\";\n if (this.useUTF8()) this.fileNameStr = h.utf8decode(this.fileName), this.fileCommentStr = h.utf8decode(this.fileComment);\n else {\n var f = this.findExtraFieldUnicodePath();\n if (f !== null) this.fileNameStr = f;\n else {\n var m = r.transformTo(p, this.fileName);\n this.fileNameStr = this.loadOptions.decodeFileName(m);\n }\n var g = this.findExtraFieldUnicodeComment();\n if (g !== null) this.fileCommentStr = g;\n else {\n var y = r.transformTo(p, this.fileComment);\n this.fileCommentStr = this.loadOptions.decodeFileName(y);\n }\n }\n }, findExtraFieldUnicodePath: function() {\n var p = this.extraFields[28789];\n if (p) {\n var f = o(p.value);\n return f.readInt(1) !== 1 || l(this.fileName) !== f.readInt(4) ? null : h.utf8decode(f.readData(p.length - 5));\n }\n return null;\n }, findExtraFieldUnicodeComment: function() {\n var p = this.extraFields[25461];\n if (p) {\n var f = o(p.value);\n return f.readInt(1) !== 1 || l(this.fileComment) !== f.readInt(4) ? null : h.utf8decode(f.readData(p.length - 5));\n }\n return null;\n } }, n.exports = d;\n }, { \"./compressedObject\": 2, \"./compressions\": 3, \"./crc32\": 4, \"./reader/readerFor\": 22, \"./support\": 30, \"./utf8\": 31, \"./utils\": 32 }], 35: [function(t, n, i) {\n function o(f, m, g) {\n this.name = f, this.dir = g.dir, this.date = g.date, this.comment = g.comment, this.unixPermissions = g.unixPermissions, this.dosPermissions = g.dosPermissions, this._data = m, this._dataBinary = g.binary, this.options = { compression: g.compression, compressionOptions: g.compressionOptions };\n }\n var r = t(\"./stream/StreamHelper\"), a = t(\"./stream/DataWorker\"), l = t(\"./utf8\"), h = t(\"./compressedObject\"), c = t(\"./stream/GenericWorker\");\n o.prototype = { internalStream: function(f) {\n var m = null, g = \"string\";\n try {\n if (!f) throw new Error(\"No output type specified.\");\n var y = (g = f.toLowerCase()) === \"string\" || g === \"text\";\n g !== \"binarystring\" && g !== \"text\" || (g = \"string\"), m = this._decompressWorker();\n var w = !this._dataBinary;\n w && !y && (m = m.pipe(new l.Utf8EncodeWorker())), !w && y && (m = m.pipe(new l.Utf8DecodeWorker()));\n } catch (_) {\n (m = new c(\"error\")).error(_);\n }\n return new r(m, g, \"\");\n }, async: function(f, m) {\n return this.internalStream(f).accumulate(m);\n }, nodeStream: function(f, m) {\n return this.internalStream(f || \"nodebuffer\").toNodejsStream(m);\n }, _compressWorker: function(f, m) {\n if (this._data instanceof h && this._data.compression.magic === f.magic) return this._data.getCompressedWorker();\n var g = this._decompressWorker();\n return this._dataBinary || (g = g.pipe(new l.Utf8EncodeWorker())), h.createWorkerFrom(g, f, m);\n }, _decompressWorker: function() {\n return this._data instanceof h ? this._data.getContentWorker() : this._data instanceof c ? this._data : new a(this._data);\n } };\n for (var u = [\"asText\", \"asBinary\", \"asNodeBuffer\", \"asUint8Array\", \"asArrayBuffer\"], d = function() {\n throw new Error(\"This method has been removed in JSZip 3.0, please check the upgrade guide.\");\n }, p = 0; p < u.length; p++) o.prototype[u[p]] = d;\n n.exports = o;\n }, { \"./compressedObject\": 2, \"./stream/DataWorker\": 27, \"./stream/GenericWorker\": 28, \"./stream/StreamHelper\": 29, \"./utf8\": 31 }], 36: [function(t, n, i) {\n (function(o) {\n var r, a, l = o.MutationObserver || o.WebKitMutationObserver;\n if (l) {\n var h = 0, c = new l(f), u = o.document.createTextNode(\"\");\n c.observe(u, { characterData: !0 }), r = function() {\n u.data = h = ++h % 2;\n };\n } else if (o.setImmediate || o.MessageChannel === void 0) r = \"document\" in o && \"onreadystatechange\" in o.document.createElement(\"script\") ? function() {\n var m = o.document.createElement(\"script\");\n m.onreadystatechange = function() {\n f(), m.onreadystatechange = null, m.parentNode.removeChild(m), m = null;\n }, o.document.documentElement.appendChild(m);\n } : function() {\n setTimeout(f, 0);\n };\n else {\n var d = new o.MessageChannel();\n d.port1.onmessage = f, r = function() {\n d.port2.postMessage(0);\n };\n }\n var p = [];\n function f() {\n var m, g;\n a = !0;\n for (var y = p.length; y; ) {\n for (g = p, p = [], m = -1; ++m < y; ) g[m]();\n y = p.length;\n }\n a = !1;\n }\n n.exports = function(m) {\n p.push(m) !== 1 || a || r();\n };\n }).call(this, typeof Yn < \"u\" ? Yn : typeof self < \"u\" ? self : typeof window < \"u\" ? window : {});\n }, {}], 37: [function(t, n, i) {\n var o = t(\"immediate\");\n function r() {\n }\n var a = {}, l = [\"REJECTED\"], h = [\"FULFILLED\"], c = [\"PENDING\"];\n function u(y) {\n if (typeof y != \"function\") throw new TypeError(\"resolver must be a function\");\n this.state = c, this.queue = [], this.outcome = void 0, y !== r && m(this, y);\n }\n function d(y, w, _) {\n this.promise = y, typeof w == \"function\" && (this.onFulfilled = w, this.callFulfilled = this.otherCallFulfilled), typeof _ == \"function\" && (this.onRejected = _, this.callRejected = this.otherCallRejected);\n }\n function p(y, w, _) {\n o(function() {\n var x;\n try {\n x = w(_);\n } catch (b) {\n return a.reject(y, b);\n }\n x === y ? a.reject(y, new TypeError(\"Cannot resolve promise with itself\")) : a.resolve(y, x);\n });\n }\n function f(y) {\n var w = y && y.then;\n if (y && (typeof y == \"object\" || typeof y == \"function\") && typeof w == \"function\") return function() {\n w.apply(y, arguments);\n };\n }\n function m(y, w) {\n var _ = !1;\n function x(M) {\n _ || (_ = !0, a.reject(y, M));\n }\n function b(M) {\n _ || (_ = !0, a.resolve(y, M));\n }\n var A = g(function() {\n w(b, x);\n });\n A.status === \"error\" && x(A.value);\n }\n function g(y, w) {\n var _ = {};\n try {\n _.value = y(w), _.status = \"success\";\n } catch (x) {\n _.status = \"error\", _.value = x;\n }\n return _;\n }\n (n.exports = u).prototype.finally = function(y) {\n if (typeof y != \"function\") return this;\n var w = this.constructor;\n return this.then(function(_) {\n return w.resolve(y()).then(function() {\n return _;\n });\n }, function(_) {\n return w.resolve(y()).then(function() {\n throw _;\n });\n });\n }, u.prototype.catch = function(y) {\n return this.then(null, y);\n }, u.prototype.then = function(y, w) {\n if (typeof y != \"function\" && this.state === h || typeof w != \"function\" && this.state === l) return this;\n var _ = new this.constructor(r);\n return this.state !== c ? p(_, this.state === h ? y : w, this.outcome) : this.queue.push(new d(_, y, w)), _;\n }, d.prototype.callFulfilled = function(y) {\n a.resolve(this.promise, y);\n }, d.prototype.otherCallFulfilled = function(y) {\n p(this.promise, this.onFulfilled, y);\n }, d.prototype.callRejected = function(y) {\n a.reject(this.promise, y);\n }, d.prototype.otherCallRejected = function(y) {\n p(this.promise, this.onRejected, y);\n }, a.resolve = function(y, w) {\n var _ = g(f, w);\n if (_.status === \"error\") return a.reject(y, _.value);\n var x = _.value;\n if (x) m(y, x);\n else {\n y.state = h, y.outcome = w;\n for (var b = -1, A = y.queue.length; ++b < A; ) y.queue[b].callFulfilled(w);\n }\n return y;\n }, a.reject = function(y, w) {\n y.state = l, y.outcome = w;\n for (var _ = -1, x = y.queue.length; ++_ < x; ) y.queue[_].callRejected(w);\n return y;\n }, u.resolve = function(y) {\n return y instanceof this ? y : a.resolve(new this(r), y);\n }, u.reject = function(y) {\n var w = new this(r);\n return a.reject(w, y);\n }, u.all = function(y) {\n var w = this;\n if (Object.prototype.toString.call(y) !== \"[object Array]\") return this.reject(new TypeError(\"must be an array\"));\n var _ = y.length, x = !1;\n if (!_) return this.resolve([]);\n for (var b = new Array(_), A = 0, M = -1, C = new this(r); ++M < _; ) P(y[M], M);\n return C;\n function P(k, B) {\n w.resolve(k).then(function(T) {\n b[B] = T, ++A !== _ || x || (x = !0, a.resolve(C, b));\n }, function(T) {\n x || (x = !0, a.reject(C, T));\n });\n }\n }, u.race = function(y) {\n var w = this;\n if (Object.prototype.toString.call(y) !== \"[object Array]\") return this.reject(new TypeError(\"must be an array\"));\n var _ = y.length, x = !1;\n if (!_) return this.resolve([]);\n for (var b = -1, A = new this(r); ++b < _; ) M = y[b], w.resolve(M).then(function(C) {\n x || (x = !0, a.resolve(A, C));\n }, function(C) {\n x || (x = !0, a.reject(A, C));\n });\n var M;\n return A;\n };\n }, { immediate: 36 }], 38: [function(t, n, i) {\n var o = {};\n (0, t(\"./lib/utils/common\").assign)(o, t(\"./lib/deflate\"), t(\"./lib/inflate\"), t(\"./lib/zlib/constants\")), n.exports = o;\n }, { \"./lib/deflate\": 39, \"./lib/inflate\": 40, \"./lib/utils/common\": 41, \"./lib/zlib/constants\": 44 }], 39: [function(t, n, i) {\n var o = t(\"./zlib/deflate\"), r = t(\"./utils/common\"), a = t(\"./utils/strings\"), l = t(\"./zlib/messages\"), h = t(\"./zlib/zstream\"), c = Object.prototype.toString, u = 0, d = -1, p = 0, f = 8;\n function m(y) {\n if (!(this instanceof m)) return new m(y);\n this.options = r.assign({ level: d, method: f, chunkSize: 16384, windowBits: 15, memLevel: 8, strategy: p, to: \"\" }, y || {});\n var w = this.options;\n w.raw && 0 < w.windowBits ? w.windowBits = -w.windowBits : w.gzip && 0 < w.windowBits && w.windowBits < 16 && (w.windowBits += 16), this.err = 0, this.msg = \"\", this.ended = !1, this.chunks = [], this.strm = new h(), this.strm.avail_out = 0;\n var _ = o.deflateInit2(this.strm, w.level, w.method, w.windowBits, w.memLevel, w.strategy);\n if (_ !== u) throw new Error(l[_]);\n if (w.header && o.deflateSetHeader(this.strm, w.header), w.dictionary) {\n var x;\n if (x = typeof w.dictionary == \"string\" ? a.string2buf(w.dictionary) : c.call(w.dictionary) === \"[object ArrayBuffer]\" ? new Uint8Array(w.dictionary) : w.dictionary, (_ = o.deflateSetDictionary(this.strm, x)) !== u) throw new Error(l[_]);\n this._dict_set = !0;\n }\n }\n function g(y, w) {\n var _ = new m(w);\n if (_.push(y, !0), _.err) throw _.msg || l[_.err];\n return _.result;\n }\n m.prototype.push = function(y, w) {\n var _, x, b = this.strm, A = this.options.chunkSize;\n if (this.ended) return !1;\n x = w === ~~w ? w : w === !0 ? 4 : 0, typeof y == \"string\" ? b.input = a.string2buf(y) : c.call(y) === \"[object ArrayBuffer]\" ? b.input = new Uint8Array(y) : b.input = y, b.next_in = 0, b.avail_in = b.input.length;\n do {\n if (b.avail_out === 0 && (b.output = new r.Buf8(A), b.next_out = 0, b.avail_out = A), (_ = o.deflate(b, x)) !== 1 && _ !== u) return this.onEnd(_), !(this.ended = !0);\n b.avail_out !== 0 && (b.avail_in !== 0 || x !== 4 && x !== 2) || (this.options.to === \"string\" ? this.onData(a.buf2binstring(r.shrinkBuf(b.output, b.next_out))) : this.onData(r.shrinkBuf(b.output, b.next_out)));\n } while ((0 < b.avail_in || b.avail_out === 0) && _ !== 1);\n return x === 4 ? (_ = o.deflateEnd(this.strm), this.onEnd(_), this.ended = !0, _ === u) : x !== 2 || (this.onEnd(u), !(b.avail_out = 0));\n }, m.prototype.onData = function(y) {\n this.chunks.push(y);\n }, m.prototype.onEnd = function(y) {\n y === u && (this.options.to === \"string\" ? this.result = this.chunks.join(\"\") : this.result = r.flattenChunks(this.chunks)), this.chunks = [], this.err = y, this.msg = this.strm.msg;\n }, i.Deflate = m, i.deflate = g, i.deflateRaw = function(y, w) {\n return (w = w || {}).raw = !0, g(y, w);\n }, i.gzip = function(y, w) {\n return (w = w || {}).gzip = !0, g(y, w);\n };\n }, { \"./utils/common\": 41, \"./utils/strings\": 42, \"./zlib/deflate\": 46, \"./zlib/messages\": 51, \"./zlib/zstream\": 53 }], 40: [function(t, n, i) {\n var o = t(\"./zlib/inflate\"), r = t(\"./utils/common\"), a = t(\"./utils/strings\"), l = t(\"./zlib/constants\"), h = t(\"./zlib/messages\"), c = t(\"./zlib/zstream\"), u = t(\"./zlib/gzheader\"), d = Object.prototype.toString;\n function p(m) {\n if (!(this instanceof p)) return new p(m);\n this.options = r.assign({ chunkSize: 16384, windowBits: 0, to: \"\" }, m || {});\n var g = this.options;\n g.raw && 0 <= g.windowBits && g.windowBits < 16 && (g.windowBits = -g.windowBits, g.windowBits === 0 && (g.windowBits = -15)), !(0 <= g.windowBits && g.windowBits < 16) || m && m.windowBits || (g.windowBits += 32), 15 < g.windowBits && g.windowBits < 48 && (15 & g.windowBits) == 0 && (g.windowBits |= 15), this.err = 0, this.msg = \"\", this.ended = !1, this.chunks = [], this.strm = new c(), this.strm.avail_out = 0;\n var y = o.inflateInit2(this.strm, g.windowBits);\n if (y !== l.Z_OK) throw new Error(h[y]);\n this.header = new u(), o.inflateGetHeader(this.strm, this.header);\n }\n function f(m, g) {\n var y = new p(g);\n if (y.push(m, !0), y.err) throw y.msg || h[y.err];\n return y.result;\n }\n p.prototype.push = function(m, g) {\n var y, w, _, x, b, A, M = this.strm, C = this.options.chunkSize, P = this.options.dictionary, k = !1;\n if (this.ended) return !1;\n w = g === ~~g ? g : g === !0 ? l.Z_FINISH : l.Z_NO_FLUSH, typeof m == \"string\" ? M.input = a.binstring2buf(m) : d.call(m) === \"[object ArrayBuffer]\" ? M.input = new Uint8Array(m) : M.input = m, M.next_in = 0, M.avail_in = M.input.length;\n do {\n if (M.avail_out === 0 && (M.output = new r.Buf8(C), M.next_out = 0, M.avail_out = C), (y = o.inflate(M, l.Z_NO_FLUSH)) === l.Z_NEED_DICT && P && (A = typeof P == \"string\" ? a.string2buf(P) : d.call(P) === \"[object ArrayBuffer]\" ? new Uint8Array(P) : P, y = o.inflateSetDictionary(this.strm, A)), y === l.Z_BUF_ERROR && k === !0 && (y = l.Z_OK, k = !1), y !== l.Z_STREAM_END && y !== l.Z_OK) return this.onEnd(y), !(this.ended = !0);\n M.next_out && (M.avail_out !== 0 && y !== l.Z_STREAM_END && (M.avail_in !== 0 || w !== l.Z_FINISH && w !== l.Z_SYNC_FLUSH) || (this.options.to === \"string\" ? (_ = a.utf8border(M.output, M.next_out), x = M.next_out - _, b = a.buf2string(M.output, _), M.next_out = x, M.avail_out = C - x, x && r.arraySet(M.output, M.output, _, x, 0), this.onData(b)) : this.onData(r.shrinkBuf(M.output, M.next_out)))), M.avail_in === 0 && M.avail_out === 0 && (k = !0);\n } while ((0 < M.avail_in || M.avail_out === 0) && y !== l.Z_STREAM_END);\n return y === l.Z_STREAM_END && (w = l.Z_FINISH), w === l.Z_FINISH ? (y = o.inflateEnd(this.strm), this.onEnd(y), this.ended = !0, y === l.Z_OK) : w !== l.Z_SYNC_FLUSH || (this.onEnd(l.Z_OK), !(M.avail_out = 0));\n }, p.prototype.onData = function(m) {\n this.chunks.push(m);\n }, p.prototype.onEnd = function(m) {\n m === l.Z_OK && (this.options.to === \"string\" ? this.result = this.chunks.join(\"\") : this.result = r.flattenChunks(this.chunks)), this.chunks = [], this.err = m, this.msg = this.strm.msg;\n }, i.Inflate = p, i.inflate = f, i.inflateRaw = function(m, g) {\n return (g = g || {}).raw = !0, f(m, g);\n }, i.ungzip = f;\n }, { \"./utils/common\": 41, \"./utils/strings\": 42, \"./zlib/constants\": 44, \"./zlib/gzheader\": 47, \"./zlib/inflate\": 49, \"./zlib/messages\": 51, \"./zlib/zstream\": 53 }], 41: [function(t, n, i) {\n var o = typeof Uint8Array < \"u\" && typeof Uint16Array < \"u\" && typeof Int32Array < \"u\";\n i.assign = function(l) {\n for (var h = Array.prototype.slice.call(arguments, 1); h.length; ) {\n var c = h.shift();\n if (c) {\n if (typeof c != \"object\") throw new TypeError(c + \"must be non-object\");\n for (var u in c) c.hasOwnProperty(u) && (l[u] = c[u]);\n }\n }\n return l;\n }, i.shrinkBuf = function(l, h) {\n return l.length === h ? l : l.subarray ? l.subarray(0, h) : (l.length = h, l);\n };\n var r = { arraySet: function(l, h, c, u, d) {\n if (h.subarray && l.subarray) l.set(h.subarray(c, c + u), d);\n else for (var p = 0; p < u; p++) l[d + p] = h[c + p];\n }, flattenChunks: function(l) {\n var h, c, u, d, p, f;\n for (h = u = 0, c = l.length; h < c; h++) u += l[h].length;\n for (f = new Uint8Array(u), h = d = 0, c = l.length; h < c; h++) p = l[h], f.set(p, d), d += p.length;\n return f;\n } }, a = { arraySet: function(l, h, c, u, d) {\n for (var p = 0; p < u; p++) l[d + p] = h[c + p];\n }, flattenChunks: function(l) {\n return [].concat.apply([], l);\n } };\n i.setTyped = function(l) {\n l ? (i.Buf8 = Uint8Array, i.Buf16 = Uint16Array, i.Buf32 = Int32Array, i.assign(i, r)) : (i.Buf8 = Array, i.Buf16 = Array, i.Buf32 = Array, i.assign(i, a));\n }, i.setTyped(o);\n }, {}], 42: [function(t, n, i) {\n var o = t(\"./common\"), r = !0, a = !0;\n try {\n String.fromCharCode.apply(null, [0]);\n } catch {\n r = !1;\n }\n try {\n String.fromCharCode.apply(null, new Uint8Array(1));\n } catch {\n a = !1;\n }\n for (var l = new o.Buf8(256), h = 0; h < 256; h++) l[h] = 252 <= h ? 6 : 248 <= h ? 5 : 240 <= h ? 4 : 224 <= h ? 3 : 192 <= h ? 2 : 1;\n function c(u, d) {\n if (d < 65537 && (u.subarray && a || !u.subarray && r)) return String.fromCharCode.apply(null, o.shrinkBuf(u, d));\n for (var p = \"\", f = 0; f < d; f++) p += String.fromCharCode(u[f]);\n return p;\n }\n l[254] = l[254] = 1, i.string2buf = function(u) {\n var d, p, f, m, g, y = u.length, w = 0;\n for (m = 0; m < y; m++) (64512 & (p = u.charCodeAt(m))) == 55296 && m + 1 < y && (64512 & (f = u.charCodeAt(m + 1))) == 56320 && (p = 65536 + (p - 55296 << 10) + (f - 56320), m++), w += p < 128 ? 1 : p < 2048 ? 2 : p < 65536 ? 3 : 4;\n for (d = new o.Buf8(w), m = g = 0; g < w; m++) (64512 & (p = u.charCodeAt(m))) == 55296 && m + 1 < y && (64512 & (f = u.charCodeAt(m + 1))) == 56320 && (p = 65536 + (p - 55296 << 10) + (f - 56320), m++), p < 128 ? d[g++] = p : (p < 2048 ? d[g++] = 192 | p >>> 6 : (p < 65536 ? d[g++] = 224 | p >>> 12 : (d[g++] = 240 | p >>> 18, d[g++] = 128 | p >>> 12 & 63), d[g++] = 128 | p >>> 6 & 63), d[g++] = 128 | 63 & p);\n return d;\n }, i.buf2binstring = function(u) {\n return c(u, u.length);\n }, i.binstring2buf = function(u) {\n for (var d = new o.Buf8(u.length), p = 0, f = d.length; p < f; p++) d[p] = u.charCodeAt(p);\n return d;\n }, i.buf2string = function(u, d) {\n var p, f, m, g, y = d || u.length, w = new Array(2 * y);\n for (p = f = 0; p < y; ) if ((m = u[p++]) < 128) w[f++] = m;\n else if (4 < (g = l[m])) w[f++] = 65533, p += g - 1;\n else {\n for (m &= g === 2 ? 31 : g === 3 ? 15 : 7; 1 < g && p < y; ) m = m << 6 | 63 & u[p++], g--;\n 1 < g ? w[f++] = 65533 : m < 65536 ? w[f++] = m : (m -= 65536, w[f++] = 55296 | m >> 10 & 1023, w[f++] = 56320 | 1023 & m);\n }\n return c(w, f);\n }, i.utf8border = function(u, d) {\n var p;\n for ((d = d || u.length) > u.length && (d = u.length), p = d - 1; 0 <= p && (192 & u[p]) == 128; ) p--;\n return p < 0 || p === 0 ? d : p + l[u[p]] > d ? p : d;\n };\n }, { \"./common\": 41 }], 43: [function(t, n, i) {\n n.exports = function(o, r, a, l) {\n for (var h = 65535 & o | 0, c = o >>> 16 & 65535 | 0, u = 0; a !== 0; ) {\n for (a -= u = 2e3 < a ? 2e3 : a; c = c + (h = h + r[l++] | 0) | 0, --u; ) ;\n h %= 65521, c %= 65521;\n }\n return h | c << 16 | 0;\n };\n }, {}], 44: [function(t, n, i) {\n n.exports = { Z_NO_FLUSH: 0, Z_PARTIAL_FLUSH: 1, Z_SYNC_FLUSH: 2, Z_FULL_FLUSH: 3, Z_FINISH: 4, Z_BLOCK: 5, Z_TREES: 6, Z_OK: 0, Z_STREAM_END: 1, Z_NEED_DICT: 2, Z_ERRNO: -1, Z_STREAM_ERROR: -2, Z_DATA_ERROR: -3, Z_BUF_ERROR: -5, Z_NO_COMPRESSION: 0, Z_BEST_SPEED: 1, Z_BEST_COMPRESSION: 9, Z_DEFAULT_COMPRESSION: -1, Z_FILTERED: 1, Z_HUFFMAN_ONLY: 2, Z_RLE: 3, Z_FIXED: 4, Z_DEFAULT_STRATEGY: 0, Z_BINARY: 0, Z_TEXT: 1, Z_UNKNOWN: 2, Z_DEFLATED: 8 };\n }, {}], 45: [function(t, n, i) {\n var o = (function() {\n for (var r, a = [], l = 0; l < 256; l++) {\n r = l;\n for (var h = 0; h < 8; h++) r = 1 & r ? 3988292384 ^ r >>> 1 : r >>> 1;\n a[l] = r;\n }\n return a;\n })();\n n.exports = function(r, a, l, h) {\n var c = o, u = h + l;\n r ^= -1;\n for (var d = h; d < u; d++) r = r >>> 8 ^ c[255 & (r ^ a[d])];\n return -1 ^ r;\n };\n }, {}], 46: [function(t, n, i) {\n var o, r = t(\"../utils/common\"), a = t(\"./trees\"), l = t(\"./adler32\"), h = t(\"./crc32\"), c = t(\"./messages\"), u = 0, d = 4, p = 0, f = -2, m = -1, g = 4, y = 2, w = 8, _ = 9, x = 286, b = 30, A = 19, M = 2 * x + 1, C = 15, P = 3, k = 258, B = k + P + 1, T = 42, D = 113, v = 1, I = 2, q = 3, H = 4;\n function ee(S, G) {\n return S.msg = c[G], G;\n }\n function j(S) {\n return (S << 1) - (4 < S ? 9 : 0);\n }\n function ne(S) {\n for (var G = S.length; 0 <= --G; ) S[G] = 0;\n }\n function O(S) {\n var G = S.state, V = G.pending;\n V > S.avail_out && (V = S.avail_out), V !== 0 && (r.arraySet(S.output, G.pending_buf, G.pending_out, V, S.next_out), S.next_out += V, G.pending_out += V, S.total_out += V, S.avail_out -= V, G.pending -= V, G.pending === 0 && (G.pending_out = 0));\n }\n function N(S, G) {\n a._tr_flush_block(S, 0 <= S.block_start ? S.block_start : -1, S.strstart - S.block_start, G), S.block_start = S.strstart, O(S.strm);\n }\n function te(S, G) {\n S.pending_buf[S.pending++] = G;\n }\n function J(S, G) {\n S.pending_buf[S.pending++] = G >>> 8 & 255, S.pending_buf[S.pending++] = 255 & G;\n }\n function K(S, G) {\n var V, L, R = S.max_chain_length, z = S.strstart, W = S.prev_length, X = S.nice_match, U = S.strstart > S.w_size - B ? S.strstart - (S.w_size - B) : 0, Y = S.window, Q = S.w_mask, $ = S.prev, ie = S.strstart + k, he = Y[z + W - 1], ae = Y[z + W];\n S.prev_length >= S.good_match && (R >>= 2), X > S.lookahead && (X = S.lookahead);\n do\n if (Y[(V = G) + W] === ae && Y[V + W - 1] === he && Y[V] === Y[z] && Y[++V] === Y[z + 1]) {\n z += 2, V++;\n do\n ;\n while (Y[++z] === Y[++V] && Y[++z] === Y[++V] && Y[++z] === Y[++V] && Y[++z] === Y[++V] && Y[++z] === Y[++V] && Y[++z] === Y[++V] && Y[++z] === Y[++V] && Y[++z] === Y[++V] && z < ie);\n if (L = k - (ie - z), z = ie - k, W < L) {\n if (S.match_start = G, X <= (W = L)) break;\n he = Y[z + W - 1], ae = Y[z + W];\n }\n }\n while ((G = $[G & Q]) > U && --R != 0);\n return W <= S.lookahead ? W : S.lookahead;\n }\n function fe(S) {\n var G, V, L, R, z, W, X, U, Y, Q, $ = S.w_size;\n do {\n if (R = S.window_size - S.lookahead - S.strstart, S.strstart >= $ + ($ - B)) {\n for (r.arraySet(S.window, S.window, $, $, 0), S.match_start -= $, S.strstart -= $, S.block_start -= $, G = V = S.hash_size; L = S.head[--G], S.head[G] = $ <= L ? L - $ : 0, --V; ) ;\n for (G = V = $; L = S.prev[--G], S.prev[G] = $ <= L ? L - $ : 0, --V; ) ;\n R += $;\n }\n if (S.strm.avail_in === 0) break;\n if (W = S.strm, X = S.window, U = S.strstart + S.lookahead, Y = R, Q = void 0, Q = W.avail_in, Y < Q && (Q = Y), V = Q === 0 ? 0 : (W.avail_in -= Q, r.arraySet(X, W.input, W.next_in, Q, U), W.state.wrap === 1 ? W.adler = l(W.adler, X, Q, U) : W.state.wrap === 2 && (W.adler = h(W.adler, X, Q, U)), W.next_in += Q, W.total_in += Q, Q), S.lookahead += V, S.lookahead + S.insert >= P) for (z = S.strstart - S.insert, S.ins_h = S.window[z], S.ins_h = (S.ins_h << S.hash_shift ^ S.window[z + 1]) & S.hash_mask; S.insert && (S.ins_h = (S.ins_h << S.hash_shift ^ S.window[z + P - 1]) & S.hash_mask, S.prev[z & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = z, z++, S.insert--, !(S.lookahead + S.insert < P)); ) ;\n } while (S.lookahead < B && S.strm.avail_in !== 0);\n }\n function pe(S, G) {\n for (var V, L; ; ) {\n if (S.lookahead < B) {\n if (fe(S), S.lookahead < B && G === u) return v;\n if (S.lookahead === 0) break;\n }\n if (V = 0, S.lookahead >= P && (S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + P - 1]) & S.hash_mask, V = S.prev[S.strstart & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = S.strstart), V !== 0 && S.strstart - V <= S.w_size - B && (S.match_length = K(S, V)), S.match_length >= P) if (L = a._tr_tally(S, S.strstart - S.match_start, S.match_length - P), S.lookahead -= S.match_length, S.match_length <= S.max_lazy_match && S.lookahead >= P) {\n for (S.match_length--; S.strstart++, S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + P - 1]) & S.hash_mask, V = S.prev[S.strstart & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = S.strstart, --S.match_length != 0; ) ;\n S.strstart++;\n } else S.strstart += S.match_length, S.match_length = 0, S.ins_h = S.window[S.strstart], S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + 1]) & S.hash_mask;\n else L = a._tr_tally(S, 0, S.window[S.strstart]), S.lookahead--, S.strstart++;\n if (L && (N(S, !1), S.strm.avail_out === 0)) return v;\n }\n return S.insert = S.strstart < P - 1 ? S.strstart : P - 1, G === d ? (N(S, !0), S.strm.avail_out === 0 ? q : H) : S.last_lit && (N(S, !1), S.strm.avail_out === 0) ? v : I;\n }\n function se(S, G) {\n for (var V, L, R; ; ) {\n if (S.lookahead < B) {\n if (fe(S), S.lookahead < B && G === u) return v;\n if (S.lookahead === 0) break;\n }\n if (V = 0, S.lookahead >= P && (S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + P - 1]) & S.hash_mask, V = S.prev[S.strstart & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = S.strstart), S.prev_length = S.match_length, S.prev_match = S.match_start, S.match_length = P - 1, V !== 0 && S.prev_length < S.max_lazy_match && S.strstart - V <= S.w_size - B && (S.match_length = K(S, V), S.match_length <= 5 && (S.strategy === 1 || S.match_length === P && 4096 < S.strstart - S.match_start) && (S.match_length = P - 1)), S.prev_length >= P && S.match_length <= S.prev_length) {\n for (R = S.strstart + S.lookahead - P, L = a._tr_tally(S, S.strstart - 1 - S.prev_match, S.prev_length - P), S.lookahead -= S.prev_length - 1, S.prev_length -= 2; ++S.strstart <= R && (S.ins_h = (S.ins_h << S.hash_shift ^ S.window[S.strstart + P - 1]) & S.hash_mask, V = S.prev[S.strstart & S.w_mask] = S.head[S.ins_h], S.head[S.ins_h] = S.strstart), --S.prev_length != 0; ) ;\n if (S.match_available = 0, S.match_length = P - 1, S.strstart++, L && (N(S, !1), S.strm.avail_out === 0)) return v;\n } else if (S.match_available) {\n if ((L = a._tr_tally(S, 0, S.window[S.strstart - 1])) && N(S, !1), S.strstart++, S.lookahead--, S.strm.avail_out === 0) return v;\n } else S.match_available = 1, S.strstart++, S.lookahead--;\n }\n return S.match_available && (L = a._tr_tally(S, 0, S.window[S.strstart - 1]), S.match_available = 0), S.insert = S.strstart < P - 1 ? S.strstart : P - 1, G === d ? (N(S, !0), S.strm.avail_out === 0 ? q : H) : S.last_lit && (N(S, !1), S.strm.avail_out === 0) ? v : I;\n }\n function oe(S, G, V, L, R) {\n this.good_length = S, this.max_lazy = G, this.nice_length = V, this.max_chain = L, this.func = R;\n }\n function ue() {\n this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0, this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = w, this.last_flush = -1, this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev = null, this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift = 0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart = 0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match = 0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new r.Buf16(2 * M), this.dyn_dtree = new r.Buf16(2 * (2 * b + 1)), this.bl_tree = new r.Buf16(2 * (2 * A + 1)), ne(this.dyn_ltree), ne(this.dyn_dtree), ne(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count = new r.Buf16(C + 1), this.heap = new r.Buf16(2 * x + 1), ne(this.heap), this.heap_len = 0, this.heap_max = 0, this.depth = new r.Buf16(2 * x + 1), ne(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit = 0, this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0, this.bi_valid = 0;\n }\n function me(S) {\n var G;\n return S && S.state ? (S.total_in = S.total_out = 0, S.data_type = y, (G = S.state).pending = 0, G.pending_out = 0, G.wrap < 0 && (G.wrap = -G.wrap), G.status = G.wrap ? T : D, S.adler = G.wrap === 2 ? 0 : 1, G.last_flush = u, a._tr_init(G), p) : ee(S, f);\n }\n function Se(S) {\n var G = me(S);\n return G === p && (function(V) {\n V.window_size = 2 * V.w_size, ne(V.head), V.max_lazy_match = o[V.level].max_lazy, V.good_match = o[V.level].good_length, V.nice_match = o[V.level].nice_length, V.max_chain_length = o[V.level].max_chain, V.strstart = 0, V.block_start = 0, V.lookahead = 0, V.insert = 0, V.match_length = V.prev_length = P - 1, V.match_available = 0, V.ins_h = 0;\n })(S.state), G;\n }\n function De(S, G, V, L, R, z) {\n if (!S) return f;\n var W = 1;\n if (G === m && (G = 6), L < 0 ? (W = 0, L = -L) : 15 < L && (W = 2, L -= 16), R < 1 || _ < R || V !== w || L < 8 || 15 < L || G < 0 || 9 < G || z < 0 || g < z) return ee(S, f);\n L === 8 && (L = 9);\n var X = new ue();\n return (S.state = X).strm = S, X.wrap = W, X.gzhead = null, X.w_bits = L, X.w_size = 1 << X.w_bits, X.w_mask = X.w_size - 1, X.hash_bits = R + 7, X.hash_size = 1 << X.hash_bits, X.hash_mask = X.hash_size - 1, X.hash_shift = ~~((X.hash_bits + P - 1) / P), X.window = new r.Buf8(2 * X.w_size), X.head = new r.Buf16(X.hash_size), X.prev = new r.Buf16(X.w_size), X.lit_bufsize = 1 << R + 6, X.pending_buf_size = 4 * X.lit_bufsize, X.pending_buf = new r.Buf8(X.pending_buf_size), X.d_buf = 1 * X.lit_bufsize, X.l_buf = 3 * X.lit_bufsize, X.level = G, X.strategy = z, X.method = V, Se(S);\n }\n o = [new oe(0, 0, 0, 0, function(S, G) {\n var V = 65535;\n for (V > S.pending_buf_size - 5 && (V = S.pending_buf_size - 5); ; ) {\n if (S.lookahead <= 1) {\n if (fe(S), S.lookahead === 0 && G === u) return v;\n if (S.lookahead === 0) break;\n }\n S.strstart += S.lookahead, S.lookahead = 0;\n var L = S.block_start + V;\n if ((S.strstart === 0 || S.strstart >= L) && (S.lookahead = S.strstart - L, S.strstart = L, N(S, !1), S.strm.avail_out === 0) || S.strstart - S.block_start >= S.w_size - B && (N(S, !1), S.strm.avail_out === 0)) return v;\n }\n return S.insert = 0, G === d ? (N(S, !0), S.strm.avail_out === 0 ? q : H) : (S.strstart > S.block_start && (N(S, !1), S.strm.avail_out), v);\n }), new oe(4, 4, 8, 4, pe), new oe(4, 5, 16, 8, pe), new oe(4, 6, 32, 32, pe), new oe(4, 4, 16, 16, se), new oe(8, 16, 32, 32, se), new oe(8, 16, 128, 128, se), new oe(8, 32, 128, 256, se), new oe(32, 128, 258, 1024, se), new oe(32, 258, 258, 4096, se)], i.deflateInit = function(S, G) {\n return De(S, G, w, 15, 8, 0);\n }, i.deflateInit2 = De, i.deflateReset = Se, i.deflateResetKeep = me, i.deflateSetHeader = function(S, G) {\n return S && S.state ? S.state.wrap !== 2 ? f : (S.state.gzhead = G, p) : f;\n }, i.deflate = function(S, G) {\n var V, L, R, z;\n if (!S || !S.state || 5 < G || G < 0) return S ? ee(S, f) : f;\n if (L = S.state, !S.output || !S.input && S.avail_in !== 0 || L.status === 666 && G !== d) return ee(S, S.avail_out === 0 ? -5 : f);\n if (L.strm = S, V = L.last_flush, L.last_flush = G, L.status === T) if (L.wrap === 2) S.adler = 0, te(L, 31), te(L, 139), te(L, 8), L.gzhead ? (te(L, (L.gzhead.text ? 1 : 0) + (L.gzhead.hcrc ? 2 : 0) + (L.gzhead.extra ? 4 : 0) + (L.gzhead.name ? 8 : 0) + (L.gzhead.comment ? 16 : 0)), te(L, 255 & L.gzhead.time), te(L, L.gzhead.time >> 8 & 255), te(L, L.gzhead.time >> 16 & 255), te(L, L.gzhead.time >> 24 & 255), te(L, L.level === 9 ? 2 : 2 <= L.strategy || L.level < 2 ? 4 : 0), te(L, 255 & L.gzhead.os), L.gzhead.extra && L.gzhead.extra.length && (te(L, 255 & L.gzhead.extra.length), te(L, L.gzhead.extra.length >> 8 & 255)), L.gzhead.hcrc && (S.adler = h(S.adler, L.pending_buf, L.pending, 0)), L.gzindex = 0, L.status = 69) : (te(L, 0), te(L, 0), te(L, 0), te(L, 0), te(L, 0), te(L, L.level === 9 ? 2 : 2 <= L.strategy || L.level < 2 ? 4 : 0), te(L, 3), L.status = D);\n else {\n var W = w + (L.w_bits - 8 << 4) << 8;\n W |= (2 <= L.strategy || L.level < 2 ? 0 : L.level < 6 ? 1 : L.level === 6 ? 2 : 3) << 6, L.strstart !== 0 && (W |= 32), W += 31 - W % 31, L.status = D, J(L, W), L.strstart !== 0 && (J(L, S.adler >>> 16), J(L, 65535 & S.adler)), S.adler = 1;\n }\n if (L.status === 69) if (L.gzhead.extra) {\n for (R = L.pending; L.gzindex < (65535 & L.gzhead.extra.length) && (L.pending !== L.pending_buf_size || (L.gzhead.hcrc && L.pending > R && (S.adler = h(S.adler, L.pending_buf, L.pending - R, R)), O(S), R = L.pending, L.pending !== L.pending_buf_size)); ) te(L, 255 & L.gzhead.extra[L.gzindex]), L.gzindex++;\n L.gzhead.hcrc && L.pending > R && (S.adler = h(S.adler, L.pending_buf, L.pending - R, R)), L.gzindex === L.gzhead.extra.length && (L.gzindex = 0, L.status = 73);\n } else L.status = 73;\n if (L.status === 73) if (L.gzhead.name) {\n R = L.pending;\n do {\n if (L.pending === L.pending_buf_size && (L.gzhead.hcrc && L.pending > R && (S.adler = h(S.adler, L.pending_buf, L.pending - R, R)), O(S), R = L.pending, L.pending === L.pending_buf_size)) {\n z = 1;\n break;\n }\n z = L.gzindex < L.gzhead.name.length ? 255 & L.gzhead.name.charCodeAt(L.gzindex++) : 0, te(L, z);\n } while (z !== 0);\n L.gzhead.hcrc && L.pending > R && (S.adler = h(S.adler, L.pending_buf, L.pending - R, R)), z === 0 && (L.gzindex = 0, L.status = 91);\n } else L.status = 91;\n if (L.status === 91) if (L.gzhead.comment) {\n R = L.pending;\n do {\n if (L.pending === L.pending_buf_size && (L.gzhead.hcrc && L.pending > R && (S.adler = h(S.adler, L.pending_buf, L.pending - R, R)), O(S), R = L.pending, L.pending === L.pending_buf_size)) {\n z = 1;\n break;\n }\n z = L.gzindex < L.gzhead.comment.length ? 255 & L.gzhead.comment.charCodeAt(L.gzindex++) : 0, te(L, z);\n } while (z !== 0);\n L.gzhead.hcrc && L.pending > R && (S.adler = h(S.adler, L.pending_buf, L.pending - R, R)), z === 0 && (L.status = 103);\n } else L.status = 103;\n if (L.status === 103 && (L.gzhead.hcrc ? (L.pending + 2 > L.pending_buf_size && O(S), L.pending + 2 <= L.pending_buf_size && (te(L, 255 & S.adler), te(L, S.adler >> 8 & 255), S.adler = 0, L.status = D)) : L.status = D), L.pending !== 0) {\n if (O(S), S.avail_out === 0) return L.last_flush = -1, p;\n } else if (S.avail_in === 0 && j(G) <= j(V) && G !== d) return ee(S, -5);\n if (L.status === 666 && S.avail_in !== 0) return ee(S, -5);\n if (S.avail_in !== 0 || L.lookahead !== 0 || G !== u && L.status !== 666) {\n var X = L.strategy === 2 ? (function(U, Y) {\n for (var Q; ; ) {\n if (U.lookahead === 0 && (fe(U), U.lookahead === 0)) {\n if (Y === u) return v;\n break;\n }\n if (U.match_length = 0, Q = a._tr_tally(U, 0, U.window[U.strstart]), U.lookahead--, U.strstart++, Q && (N(U, !1), U.strm.avail_out === 0)) return v;\n }\n return U.insert = 0, Y === d ? (N(U, !0), U.strm.avail_out === 0 ? q : H) : U.last_lit && (N(U, !1), U.strm.avail_out === 0) ? v : I;\n })(L, G) : L.strategy === 3 ? (function(U, Y) {\n for (var Q, $, ie, he, ae = U.window; ; ) {\n if (U.lookahead <= k) {\n if (fe(U), U.lookahead <= k && Y === u) return v;\n if (U.lookahead === 0) break;\n }\n if (U.match_length = 0, U.lookahead >= P && 0 < U.strstart && ($ = ae[ie = U.strstart - 1]) === ae[++ie] && $ === ae[++ie] && $ === ae[++ie]) {\n he = U.strstart + k;\n do\n ;\n while ($ === ae[++ie] && $ === ae[++ie] && $ === ae[++ie] && $ === ae[++ie] && $ === ae[++ie] && $ === ae[++ie] && $ === ae[++ie] && $ === ae[++ie] && ie < he);\n U.match_length = k - (he - ie), U.match_length > U.lookahead && (U.match_length = U.lookahead);\n }\n if (U.match_length >= P ? (Q = a._tr_tally(U, 1, U.match_length - P), U.lookahead -= U.match_length, U.strstart += U.match_length, U.match_length = 0) : (Q = a._tr_tally(U, 0, U.window[U.strstart]), U.lookahead--, U.strstart++), Q && (N(U, !1), U.strm.avail_out === 0)) return v;\n }\n return U.insert = 0, Y === d ? (N(U, !0), U.strm.avail_out === 0 ? q : H) : U.last_lit && (N(U, !1), U.strm.avail_out === 0) ? v : I;\n })(L, G) : o[L.level].func(L, G);\n if (X !== q && X !== H || (L.status = 666), X === v || X === q) return S.avail_out === 0 && (L.last_flush = -1), p;\n if (X === I && (G === 1 ? a._tr_align(L) : G !== 5 && (a._tr_stored_block(L, 0, 0, !1), G === 3 && (ne(L.head), L.lookahead === 0 && (L.strstart = 0, L.block_start = 0, L.insert = 0))), O(S), S.avail_out === 0)) return L.last_flush = -1, p;\n }\n return G !== d ? p : L.wrap <= 0 ? 1 : (L.wrap === 2 ? (te(L, 255 & S.adler), te(L, S.adler >> 8 & 255), te(L, S.adler >> 16 & 255), te(L, S.adler >> 24 & 255), te(L, 255 & S.total_in), te(L, S.total_in >> 8 & 255), te(L, S.total_in >> 16 & 255), te(L, S.total_in >> 24 & 255)) : (J(L, S.adler >>> 16), J(L, 65535 & S.adler)), O(S), 0 < L.wrap && (L.wrap = -L.wrap), L.pending !== 0 ? p : 1);\n }, i.deflateEnd = function(S) {\n var G;\n return S && S.state ? (G = S.state.status) !== T && G !== 69 && G !== 73 && G !== 91 && G !== 103 && G !== D && G !== 666 ? ee(S, f) : (S.state = null, G === D ? ee(S, -3) : p) : f;\n }, i.deflateSetDictionary = function(S, G) {\n var V, L, R, z, W, X, U, Y, Q = G.length;\n if (!S || !S.state || (z = (V = S.state).wrap) === 2 || z === 1 && V.status !== T || V.lookahead) return f;\n for (z === 1 && (S.adler = l(S.adler, G, Q, 0)), V.wrap = 0, Q >= V.w_size && (z === 0 && (ne(V.head), V.strstart = 0, V.block_start = 0, V.insert = 0), Y = new r.Buf8(V.w_size), r.arraySet(Y, G, Q - V.w_size, V.w_size, 0), G = Y, Q = V.w_size), W = S.avail_in, X = S.next_in, U = S.input, S.avail_in = Q, S.next_in = 0, S.input = G, fe(V); V.lookahead >= P; ) {\n for (L = V.strstart, R = V.lookahead - (P - 1); V.ins_h = (V.ins_h << V.hash_shift ^ V.window[L + P - 1]) & V.hash_mask, V.prev[L & V.w_mask] = V.head[V.ins_h], V.head[V.ins_h] = L, L++, --R; ) ;\n V.strstart = L, V.lookahead = P - 1, fe(V);\n }\n return V.strstart += V.lookahead, V.block_start = V.strstart, V.insert = V.lookahead, V.lookahead = 0, V.match_length = V.prev_length = P - 1, V.match_available = 0, S.next_in = X, S.input = U, S.avail_in = W, V.wrap = z, p;\n }, i.deflateInfo = \"pako deflate (from Nodeca project)\";\n }, { \"../utils/common\": 41, \"./adler32\": 43, \"./crc32\": 45, \"./messages\": 51, \"./trees\": 52 }], 47: [function(t, n, i) {\n n.exports = function() {\n this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name = \"\", this.comment = \"\", this.hcrc = 0, this.done = !1;\n };\n }, {}], 48: [function(t, n, i) {\n n.exports = function(o, r) {\n var a, l, h, c, u, d, p, f, m, g, y, w, _, x, b, A, M, C, P, k, B, T, D, v, I;\n a = o.state, l = o.next_in, v = o.input, h = l + (o.avail_in - 5), c = o.next_out, I = o.output, u = c - (r - o.avail_out), d = c + (o.avail_out - 257), p = a.dmax, f = a.wsize, m = a.whave, g = a.wnext, y = a.window, w = a.hold, _ = a.bits, x = a.lencode, b = a.distcode, A = (1 << a.lenbits) - 1, M = (1 << a.distbits) - 1;\n e: do {\n _ < 15 && (w += v[l++] << _, _ += 8, w += v[l++] << _, _ += 8), C = x[w & A];\n t: for (; ; ) {\n if (w >>>= P = C >>> 24, _ -= P, (P = C >>> 16 & 255) === 0) I[c++] = 65535 & C;\n else {\n if (!(16 & P)) {\n if ((64 & P) == 0) {\n C = x[(65535 & C) + (w & (1 << P) - 1)];\n continue t;\n }\n if (32 & P) {\n a.mode = 12;\n break e;\n }\n o.msg = \"invalid literal/length code\", a.mode = 30;\n break e;\n }\n k = 65535 & C, (P &= 15) && (_ < P && (w += v[l++] << _, _ += 8), k += w & (1 << P) - 1, w >>>= P, _ -= P), _ < 15 && (w += v[l++] << _, _ += 8, w += v[l++] << _, _ += 8), C = b[w & M];\n n: for (; ; ) {\n if (w >>>= P = C >>> 24, _ -= P, !(16 & (P = C >>> 16 & 255))) {\n if ((64 & P) == 0) {\n C = b[(65535 & C) + (w & (1 << P) - 1)];\n continue n;\n }\n o.msg = \"invalid distance code\", a.mode = 30;\n break e;\n }\n if (B = 65535 & C, _ < (P &= 15) && (w += v[l++] << _, (_ += 8) < P && (w += v[l++] << _, _ += 8)), p < (B += w & (1 << P) - 1)) {\n o.msg = \"invalid distance too far back\", a.mode = 30;\n break e;\n }\n if (w >>>= P, _ -= P, (P = c - u) < B) {\n if (m < (P = B - P) && a.sane) {\n o.msg = \"invalid distance too far back\", a.mode = 30;\n break e;\n }\n if (D = y, (T = 0) === g) {\n if (T += f - P, P < k) {\n for (k -= P; I[c++] = y[T++], --P; ) ;\n T = c - B, D = I;\n }\n } else if (g < P) {\n if (T += f + g - P, (P -= g) < k) {\n for (k -= P; I[c++] = y[T++], --P; ) ;\n if (T = 0, g < k) {\n for (k -= P = g; I[c++] = y[T++], --P; ) ;\n T = c - B, D = I;\n }\n }\n } else if (T += g - P, P < k) {\n for (k -= P; I[c++] = y[T++], --P; ) ;\n T = c - B, D = I;\n }\n for (; 2 < k; ) I[c++] = D[T++], I[c++] = D[T++], I[c++] = D[T++], k -= 3;\n k && (I[c++] = D[T++], 1 < k && (I[c++] = D[T++]));\n } else {\n for (T = c - B; I[c++] = I[T++], I[c++] = I[T++], I[c++] = I[T++], 2 < (k -= 3); ) ;\n k && (I[c++] = I[T++], 1 < k && (I[c++] = I[T++]));\n }\n break;\n }\n }\n break;\n }\n } while (l < h && c < d);\n l -= k = _ >> 3, w &= (1 << (_ -= k << 3)) - 1, o.next_in = l, o.next_out = c, o.avail_in = l < h ? h - l + 5 : 5 - (l - h), o.avail_out = c < d ? d - c + 257 : 257 - (c - d), a.hold = w, a.bits = _;\n };\n }, {}], 49: [function(t, n, i) {\n var o = t(\"../utils/common\"), r = t(\"./adler32\"), a = t(\"./crc32\"), l = t(\"./inffast\"), h = t(\"./inftrees\"), c = 1, u = 2, d = 0, p = -2, f = 1, m = 852, g = 592;\n function y(T) {\n return (T >>> 24 & 255) + (T >>> 8 & 65280) + ((65280 & T) << 8) + ((255 & T) << 24);\n }\n function w() {\n this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check = 0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window = null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null, this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0, this.have = 0, this.next = null, this.lens = new o.Buf16(320), this.work = new o.Buf16(288), this.lendyn = null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0;\n }\n function _(T) {\n var D;\n return T && T.state ? (D = T.state, T.total_in = T.total_out = D.total = 0, T.msg = \"\", D.wrap && (T.adler = 1 & D.wrap), D.mode = f, D.last = 0, D.havedict = 0, D.dmax = 32768, D.head = null, D.hold = 0, D.bits = 0, D.lencode = D.lendyn = new o.Buf32(m), D.distcode = D.distdyn = new o.Buf32(g), D.sane = 1, D.back = -1, d) : p;\n }\n function x(T) {\n var D;\n return T && T.state ? ((D = T.state).wsize = 0, D.whave = 0, D.wnext = 0, _(T)) : p;\n }\n function b(T, D) {\n var v, I;\n return T && T.state ? (I = T.state, D < 0 ? (v = 0, D = -D) : (v = 1 + (D >> 4), D < 48 && (D &= 15)), D && (D < 8 || 15 < D) ? p : (I.window !== null && I.wbits !== D && (I.window = null), I.wrap = v, I.wbits = D, x(T))) : p;\n }\n function A(T, D) {\n var v, I;\n return T ? (I = new w(), (T.state = I).window = null, (v = b(T, D)) !== d && (T.state = null), v) : p;\n }\n var M, C, P = !0;\n function k(T) {\n if (P) {\n var D;\n for (M = new o.Buf32(512), C = new o.Buf32(32), D = 0; D < 144; ) T.lens[D++] = 8;\n for (; D < 256; ) T.lens[D++] = 9;\n for (; D < 280; ) T.lens[D++] = 7;\n for (; D < 288; ) T.lens[D++] = 8;\n for (h(c, T.lens, 0, 288, M, 0, T.work, { bits: 9 }), D = 0; D < 32; ) T.lens[D++] = 5;\n h(u, T.lens, 0, 32, C, 0, T.work, { bits: 5 }), P = !1;\n }\n T.lencode = M, T.lenbits = 9, T.distcode = C, T.distbits = 5;\n }\n function B(T, D, v, I) {\n var q, H = T.state;\n return H.window === null && (H.wsize = 1 << H.wbits, H.wnext = 0, H.whave = 0, H.window = new o.Buf8(H.wsize)), I >= H.wsize ? (o.arraySet(H.window, D, v - H.wsize, H.wsize, 0), H.wnext = 0, H.whave = H.wsize) : (I < (q = H.wsize - H.wnext) && (q = I), o.arraySet(H.window, D, v - I, q, H.wnext), (I -= q) ? (o.arraySet(H.window, D, v - I, I, 0), H.wnext = I, H.whave = H.wsize) : (H.wnext += q, H.wnext === H.wsize && (H.wnext = 0), H.whave < H.wsize && (H.whave += q))), 0;\n }\n i.inflateReset = x, i.inflateReset2 = b, i.inflateResetKeep = _, i.inflateInit = function(T) {\n return A(T, 15);\n }, i.inflateInit2 = A, i.inflate = function(T, D) {\n var v, I, q, H, ee, j, ne, O, N, te, J, K, fe, pe, se, oe, ue, me, Se, De, S, G, V, L, R = 0, z = new o.Buf8(4), W = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];\n if (!T || !T.state || !T.output || !T.input && T.avail_in !== 0) return p;\n (v = T.state).mode === 12 && (v.mode = 13), ee = T.next_out, q = T.output, ne = T.avail_out, H = T.next_in, I = T.input, j = T.avail_in, O = v.hold, N = v.bits, te = j, J = ne, G = d;\n e: for (; ; ) switch (v.mode) {\n case f:\n if (v.wrap === 0) {\n v.mode = 13;\n break;\n }\n for (; N < 16; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if (2 & v.wrap && O === 35615) {\n z[v.check = 0] = 255 & O, z[1] = O >>> 8 & 255, v.check = a(v.check, z, 2, 0), N = O = 0, v.mode = 2;\n break;\n }\n if (v.flags = 0, v.head && (v.head.done = !1), !(1 & v.wrap) || (((255 & O) << 8) + (O >> 8)) % 31) {\n T.msg = \"incorrect header check\", v.mode = 30;\n break;\n }\n if ((15 & O) != 8) {\n T.msg = \"unknown compression method\", v.mode = 30;\n break;\n }\n if (N -= 4, S = 8 + (15 & (O >>>= 4)), v.wbits === 0) v.wbits = S;\n else if (S > v.wbits) {\n T.msg = \"invalid window size\", v.mode = 30;\n break;\n }\n v.dmax = 1 << S, T.adler = v.check = 1, v.mode = 512 & O ? 10 : 12, N = O = 0;\n break;\n case 2:\n for (; N < 16; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if (v.flags = O, (255 & v.flags) != 8) {\n T.msg = \"unknown compression method\", v.mode = 30;\n break;\n }\n if (57344 & v.flags) {\n T.msg = \"unknown header flags set\", v.mode = 30;\n break;\n }\n v.head && (v.head.text = O >> 8 & 1), 512 & v.flags && (z[0] = 255 & O, z[1] = O >>> 8 & 255, v.check = a(v.check, z, 2, 0)), N = O = 0, v.mode = 3;\n case 3:\n for (; N < 32; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n v.head && (v.head.time = O), 512 & v.flags && (z[0] = 255 & O, z[1] = O >>> 8 & 255, z[2] = O >>> 16 & 255, z[3] = O >>> 24 & 255, v.check = a(v.check, z, 4, 0)), N = O = 0, v.mode = 4;\n case 4:\n for (; N < 16; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n v.head && (v.head.xflags = 255 & O, v.head.os = O >> 8), 512 & v.flags && (z[0] = 255 & O, z[1] = O >>> 8 & 255, v.check = a(v.check, z, 2, 0)), N = O = 0, v.mode = 5;\n case 5:\n if (1024 & v.flags) {\n for (; N < 16; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n v.length = O, v.head && (v.head.extra_len = O), 512 & v.flags && (z[0] = 255 & O, z[1] = O >>> 8 & 255, v.check = a(v.check, z, 2, 0)), N = O = 0;\n } else v.head && (v.head.extra = null);\n v.mode = 6;\n case 6:\n if (1024 & v.flags && (j < (K = v.length) && (K = j), K && (v.head && (S = v.head.extra_len - v.length, v.head.extra || (v.head.extra = new Array(v.head.extra_len)), o.arraySet(v.head.extra, I, H, K, S)), 512 & v.flags && (v.check = a(v.check, I, K, H)), j -= K, H += K, v.length -= K), v.length)) break e;\n v.length = 0, v.mode = 7;\n case 7:\n if (2048 & v.flags) {\n if (j === 0) break e;\n for (K = 0; S = I[H + K++], v.head && S && v.length < 65536 && (v.head.name += String.fromCharCode(S)), S && K < j; ) ;\n if (512 & v.flags && (v.check = a(v.check, I, K, H)), j -= K, H += K, S) break e;\n } else v.head && (v.head.name = null);\n v.length = 0, v.mode = 8;\n case 8:\n if (4096 & v.flags) {\n if (j === 0) break e;\n for (K = 0; S = I[H + K++], v.head && S && v.length < 65536 && (v.head.comment += String.fromCharCode(S)), S && K < j; ) ;\n if (512 & v.flags && (v.check = a(v.check, I, K, H)), j -= K, H += K, S) break e;\n } else v.head && (v.head.comment = null);\n v.mode = 9;\n case 9:\n if (512 & v.flags) {\n for (; N < 16; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if (O !== (65535 & v.check)) {\n T.msg = \"header crc mismatch\", v.mode = 30;\n break;\n }\n N = O = 0;\n }\n v.head && (v.head.hcrc = v.flags >> 9 & 1, v.head.done = !0), T.adler = v.check = 0, v.mode = 12;\n break;\n case 10:\n for (; N < 32; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n T.adler = v.check = y(O), N = O = 0, v.mode = 11;\n case 11:\n if (v.havedict === 0) return T.next_out = ee, T.avail_out = ne, T.next_in = H, T.avail_in = j, v.hold = O, v.bits = N, 2;\n T.adler = v.check = 1, v.mode = 12;\n case 12:\n if (D === 5 || D === 6) break e;\n case 13:\n if (v.last) {\n O >>>= 7 & N, N -= 7 & N, v.mode = 27;\n break;\n }\n for (; N < 3; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n switch (v.last = 1 & O, N -= 1, 3 & (O >>>= 1)) {\n case 0:\n v.mode = 14;\n break;\n case 1:\n if (k(v), v.mode = 20, D !== 6) break;\n O >>>= 2, N -= 2;\n break e;\n case 2:\n v.mode = 17;\n break;\n case 3:\n T.msg = \"invalid block type\", v.mode = 30;\n }\n O >>>= 2, N -= 2;\n break;\n case 14:\n for (O >>>= 7 & N, N -= 7 & N; N < 32; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if ((65535 & O) != (O >>> 16 ^ 65535)) {\n T.msg = \"invalid stored block lengths\", v.mode = 30;\n break;\n }\n if (v.length = 65535 & O, N = O = 0, v.mode = 15, D === 6) break e;\n case 15:\n v.mode = 16;\n case 16:\n if (K = v.length) {\n if (j < K && (K = j), ne < K && (K = ne), K === 0) break e;\n o.arraySet(q, I, H, K, ee), j -= K, H += K, ne -= K, ee += K, v.length -= K;\n break;\n }\n v.mode = 12;\n break;\n case 17:\n for (; N < 14; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if (v.nlen = 257 + (31 & O), O >>>= 5, N -= 5, v.ndist = 1 + (31 & O), O >>>= 5, N -= 5, v.ncode = 4 + (15 & O), O >>>= 4, N -= 4, 286 < v.nlen || 30 < v.ndist) {\n T.msg = \"too many length or distance symbols\", v.mode = 30;\n break;\n }\n v.have = 0, v.mode = 18;\n case 18:\n for (; v.have < v.ncode; ) {\n for (; N < 3; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n v.lens[W[v.have++]] = 7 & O, O >>>= 3, N -= 3;\n }\n for (; v.have < 19; ) v.lens[W[v.have++]] = 0;\n if (v.lencode = v.lendyn, v.lenbits = 7, V = { bits: v.lenbits }, G = h(0, v.lens, 0, 19, v.lencode, 0, v.work, V), v.lenbits = V.bits, G) {\n T.msg = \"invalid code lengths set\", v.mode = 30;\n break;\n }\n v.have = 0, v.mode = 19;\n case 19:\n for (; v.have < v.nlen + v.ndist; ) {\n for (; oe = (R = v.lencode[O & (1 << v.lenbits) - 1]) >>> 16 & 255, ue = 65535 & R, !((se = R >>> 24) <= N); ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if (ue < 16) O >>>= se, N -= se, v.lens[v.have++] = ue;\n else {\n if (ue === 16) {\n for (L = se + 2; N < L; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if (O >>>= se, N -= se, v.have === 0) {\n T.msg = \"invalid bit length repeat\", v.mode = 30;\n break;\n }\n S = v.lens[v.have - 1], K = 3 + (3 & O), O >>>= 2, N -= 2;\n } else if (ue === 17) {\n for (L = se + 3; N < L; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n N -= se, S = 0, K = 3 + (7 & (O >>>= se)), O >>>= 3, N -= 3;\n } else {\n for (L = se + 7; N < L; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n N -= se, S = 0, K = 11 + (127 & (O >>>= se)), O >>>= 7, N -= 7;\n }\n if (v.have + K > v.nlen + v.ndist) {\n T.msg = \"invalid bit length repeat\", v.mode = 30;\n break;\n }\n for (; K--; ) v.lens[v.have++] = S;\n }\n }\n if (v.mode === 30) break;\n if (v.lens[256] === 0) {\n T.msg = \"invalid code -- missing end-of-block\", v.mode = 30;\n break;\n }\n if (v.lenbits = 9, V = { bits: v.lenbits }, G = h(c, v.lens, 0, v.nlen, v.lencode, 0, v.work, V), v.lenbits = V.bits, G) {\n T.msg = \"invalid literal/lengths set\", v.mode = 30;\n break;\n }\n if (v.distbits = 6, v.distcode = v.distdyn, V = { bits: v.distbits }, G = h(u, v.lens, v.nlen, v.ndist, v.distcode, 0, v.work, V), v.distbits = V.bits, G) {\n T.msg = \"invalid distances set\", v.mode = 30;\n break;\n }\n if (v.mode = 20, D === 6) break e;\n case 20:\n v.mode = 21;\n case 21:\n if (6 <= j && 258 <= ne) {\n T.next_out = ee, T.avail_out = ne, T.next_in = H, T.avail_in = j, v.hold = O, v.bits = N, l(T, J), ee = T.next_out, q = T.output, ne = T.avail_out, H = T.next_in, I = T.input, j = T.avail_in, O = v.hold, N = v.bits, v.mode === 12 && (v.back = -1);\n break;\n }\n for (v.back = 0; oe = (R = v.lencode[O & (1 << v.lenbits) - 1]) >>> 16 & 255, ue = 65535 & R, !((se = R >>> 24) <= N); ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if (oe && (240 & oe) == 0) {\n for (me = se, Se = oe, De = ue; oe = (R = v.lencode[De + ((O & (1 << me + Se) - 1) >> me)]) >>> 16 & 255, ue = 65535 & R, !(me + (se = R >>> 24) <= N); ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n O >>>= me, N -= me, v.back += me;\n }\n if (O >>>= se, N -= se, v.back += se, v.length = ue, oe === 0) {\n v.mode = 26;\n break;\n }\n if (32 & oe) {\n v.back = -1, v.mode = 12;\n break;\n }\n if (64 & oe) {\n T.msg = \"invalid literal/length code\", v.mode = 30;\n break;\n }\n v.extra = 15 & oe, v.mode = 22;\n case 22:\n if (v.extra) {\n for (L = v.extra; N < L; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n v.length += O & (1 << v.extra) - 1, O >>>= v.extra, N -= v.extra, v.back += v.extra;\n }\n v.was = v.length, v.mode = 23;\n case 23:\n for (; oe = (R = v.distcode[O & (1 << v.distbits) - 1]) >>> 16 & 255, ue = 65535 & R, !((se = R >>> 24) <= N); ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if ((240 & oe) == 0) {\n for (me = se, Se = oe, De = ue; oe = (R = v.distcode[De + ((O & (1 << me + Se) - 1) >> me)]) >>> 16 & 255, ue = 65535 & R, !(me + (se = R >>> 24) <= N); ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n O >>>= me, N -= me, v.back += me;\n }\n if (O >>>= se, N -= se, v.back += se, 64 & oe) {\n T.msg = \"invalid distance code\", v.mode = 30;\n break;\n }\n v.offset = ue, v.extra = 15 & oe, v.mode = 24;\n case 24:\n if (v.extra) {\n for (L = v.extra; N < L; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n v.offset += O & (1 << v.extra) - 1, O >>>= v.extra, N -= v.extra, v.back += v.extra;\n }\n if (v.offset > v.dmax) {\n T.msg = \"invalid distance too far back\", v.mode = 30;\n break;\n }\n v.mode = 25;\n case 25:\n if (ne === 0) break e;\n if (K = J - ne, v.offset > K) {\n if ((K = v.offset - K) > v.whave && v.sane) {\n T.msg = \"invalid distance too far back\", v.mode = 30;\n break;\n }\n fe = K > v.wnext ? (K -= v.wnext, v.wsize - K) : v.wnext - K, K > v.length && (K = v.length), pe = v.window;\n } else pe = q, fe = ee - v.offset, K = v.length;\n for (ne < K && (K = ne), ne -= K, v.length -= K; q[ee++] = pe[fe++], --K; ) ;\n v.length === 0 && (v.mode = 21);\n break;\n case 26:\n if (ne === 0) break e;\n q[ee++] = v.length, ne--, v.mode = 21;\n break;\n case 27:\n if (v.wrap) {\n for (; N < 32; ) {\n if (j === 0) break e;\n j--, O |= I[H++] << N, N += 8;\n }\n if (J -= ne, T.total_out += J, v.total += J, J && (T.adler = v.check = v.flags ? a(v.check, q, J, ee - J) : r(v.check, q, J, ee - J)), J = ne, (v.flags ? O : y(O)) !== v.check) {\n T.msg = \"incorrect data check\", v.mode = 30;\n break;\n }\n N = O = 0;\n }\n v.mode = 28;\n case 28:\n if (v.wrap && v.flags) {\n for (; N < 32; ) {\n if (j === 0) break e;\n j--, O += I[H++] << N, N += 8;\n }\n if (O !== (4294967295 & v.total)) {\n T.msg = \"incorrect length check\", v.mode = 30;\n break;\n }\n N = O = 0;\n }\n v.mode = 29;\n case 29:\n G = 1;\n break e;\n case 30:\n G = -3;\n break e;\n case 31:\n return -4;\n case 32:\n default:\n return p;\n }\n return T.next_out = ee, T.avail_out = ne, T.next_in = H, T.avail_in = j, v.hold = O, v.bits = N, (v.wsize || J !== T.avail_out && v.mode < 30 && (v.mode < 27 || D !== 4)) && B(T, T.output, T.next_out, J - T.avail_out) ? (v.mode = 31, -4) : (te -= T.avail_in, J -= T.avail_out, T.total_in += te, T.total_out += J, v.total += J, v.wrap && J && (T.adler = v.check = v.flags ? a(v.check, q, J, T.next_out - J) : r(v.check, q, J, T.next_out - J)), T.data_type = v.bits + (v.last ? 64 : 0) + (v.mode === 12 ? 128 : 0) + (v.mode === 20 || v.mode === 15 ? 256 : 0), (te == 0 && J === 0 || D === 4) && G === d && (G = -5), G);\n }, i.inflateEnd = function(T) {\n if (!T || !T.state) return p;\n var D = T.state;\n return D.window && (D.window = null), T.state = null, d;\n }, i.inflateGetHeader = function(T, D) {\n var v;\n return T && T.state ? (2 & (v = T.state).wrap) == 0 ? p : ((v.head = D).done = !1, d) : p;\n }, i.inflateSetDictionary = function(T, D) {\n var v, I = D.length;\n return T && T.state ? (v = T.state).wrap !== 0 && v.mode !== 11 ? p : v.mode === 11 && r(1, D, I, 0) !== v.check ? -3 : B(T, D, I, I) ? (v.mode = 31, -4) : (v.havedict = 1, d) : p;\n }, i.inflateInfo = \"pako inflate (from Nodeca project)\";\n }, { \"../utils/common\": 41, \"./adler32\": 43, \"./crc32\": 45, \"./inffast\": 48, \"./inftrees\": 50 }], 50: [function(t, n, i) {\n var o = t(\"../utils/common\"), r = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0], a = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78], l = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0], h = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 64, 64];\n n.exports = function(c, u, d, p, f, m, g, y) {\n var w, _, x, b, A, M, C, P, k, B = y.bits, T = 0, D = 0, v = 0, I = 0, q = 0, H = 0, ee = 0, j = 0, ne = 0, O = 0, N = null, te = 0, J = new o.Buf16(16), K = new o.Buf16(16), fe = null, pe = 0;\n for (T = 0; T <= 15; T++) J[T] = 0;\n for (D = 0; D < p; D++) J[u[d + D]]++;\n for (q = B, I = 15; 1 <= I && J[I] === 0; I--) ;\n if (I < q && (q = I), I === 0) return f[m++] = 20971520, f[m++] = 20971520, y.bits = 1, 0;\n for (v = 1; v < I && J[v] === 0; v++) ;\n for (q < v && (q = v), T = j = 1; T <= 15; T++) if (j <<= 1, (j -= J[T]) < 0) return -1;\n if (0 < j && (c === 0 || I !== 1)) return -1;\n for (K[1] = 0, T = 1; T < 15; T++) K[T + 1] = K[T] + J[T];\n for (D = 0; D < p; D++) u[d + D] !== 0 && (g[K[u[d + D]]++] = D);\n if (M = c === 0 ? (N = fe = g, 19) : c === 1 ? (N = r, te -= 257, fe = a, pe -= 257, 256) : (N = l, fe = h, -1), T = v, A = m, ee = D = O = 0, x = -1, b = (ne = 1 << (H = q)) - 1, c === 1 && 852 < ne || c === 2 && 592 < ne) return 1;\n for (; ; ) {\n for (C = T - ee, k = g[D] < M ? (P = 0, g[D]) : g[D] > M ? (P = fe[pe + g[D]], N[te + g[D]]) : (P = 96, 0), w = 1 << T - ee, v = _ = 1 << H; f[A + (O >> ee) + (_ -= w)] = C << 24 | P << 16 | k | 0, _ !== 0; ) ;\n for (w = 1 << T - 1; O & w; ) w >>= 1;\n if (w !== 0 ? (O &= w - 1, O += w) : O = 0, D++, --J[T] == 0) {\n if (T === I) break;\n T = u[d + g[D]];\n }\n if (q < T && (O & b) !== x) {\n for (ee === 0 && (ee = q), A += v, j = 1 << (H = T - ee); H + ee < I && !((j -= J[H + ee]) <= 0); ) H++, j <<= 1;\n if (ne += 1 << H, c === 1 && 852 < ne || c === 2 && 592 < ne) return 1;\n f[x = O & b] = q << 24 | H << 16 | A - m | 0;\n }\n }\n return O !== 0 && (f[A + O] = T - ee << 24 | 64 << 16 | 0), y.bits = q, 0;\n };\n }, { \"../utils/common\": 41 }], 51: [function(t, n, i) {\n n.exports = { 2: \"need dictionary\", 1: \"stream end\", 0: \"\", \"-1\": \"file error\", \"-2\": \"stream error\", \"-3\": \"data error\", \"-4\": \"insufficient memory\", \"-5\": \"buffer error\", \"-6\": \"incompatible version\" };\n }, {}], 52: [function(t, n, i) {\n var o = t(\"../utils/common\"), r = 0, a = 1;\n function l(R) {\n for (var z = R.length; 0 <= --z; ) R[z] = 0;\n }\n var h = 0, c = 29, u = 256, d = u + 1 + c, p = 30, f = 19, m = 2 * d + 1, g = 15, y = 16, w = 7, _ = 256, x = 16, b = 17, A = 18, M = [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], C = [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], P = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], k = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], B = new Array(2 * (d + 2));\n l(B);\n var T = new Array(2 * p);\n l(T);\n var D = new Array(512);\n l(D);\n var v = new Array(256);\n l(v);\n var I = new Array(c);\n l(I);\n var q, H, ee, j = new Array(p);\n function ne(R, z, W, X, U) {\n this.static_tree = R, this.extra_bits = z, this.extra_base = W, this.elems = X, this.max_length = U, this.has_stree = R && R.length;\n }\n function O(R, z) {\n this.dyn_tree = R, this.max_code = 0, this.stat_desc = z;\n }\n function N(R) {\n return R < 256 ? D[R] : D[256 + (R >>> 7)];\n }\n function te(R, z) {\n R.pending_buf[R.pending++] = 255 & z, R.pending_buf[R.pending++] = z >>> 8 & 255;\n }\n function J(R, z, W) {\n R.bi_valid > y - W ? (R.bi_buf |= z << R.bi_valid & 65535, te(R, R.bi_buf), R.bi_buf = z >> y - R.bi_valid, R.bi_valid += W - y) : (R.bi_buf |= z << R.bi_valid & 65535, R.bi_valid += W);\n }\n function K(R, z, W) {\n J(R, W[2 * z], W[2 * z + 1]);\n }\n function fe(R, z) {\n for (var W = 0; W |= 1 & R, R >>>= 1, W <<= 1, 0 < --z; ) ;\n return W >>> 1;\n }\n function pe(R, z, W) {\n var X, U, Y = new Array(g + 1), Q = 0;\n for (X = 1; X <= g; X++) Y[X] = Q = Q + W[X - 1] << 1;\n for (U = 0; U <= z; U++) {\n var $ = R[2 * U + 1];\n $ !== 0 && (R[2 * U] = fe(Y[$]++, $));\n }\n }\n function se(R) {\n var z;\n for (z = 0; z < d; z++) R.dyn_ltree[2 * z] = 0;\n for (z = 0; z < p; z++) R.dyn_dtree[2 * z] = 0;\n for (z = 0; z < f; z++) R.bl_tree[2 * z] = 0;\n R.dyn_ltree[2 * _] = 1, R.opt_len = R.static_len = 0, R.last_lit = R.matches = 0;\n }\n function oe(R) {\n 8 < R.bi_valid ? te(R, R.bi_buf) : 0 < R.bi_valid && (R.pending_buf[R.pending++] = R.bi_buf), R.bi_buf = 0, R.bi_valid = 0;\n }\n function ue(R, z, W, X) {\n var U = 2 * z, Y = 2 * W;\n return R[U] < R[Y] || R[U] === R[Y] && X[z] <= X[W];\n }\n function me(R, z, W) {\n for (var X = R.heap[W], U = W << 1; U <= R.heap_len && (U < R.heap_len && ue(z, R.heap[U + 1], R.heap[U], R.depth) && U++, !ue(z, X, R.heap[U], R.depth)); ) R.heap[W] = R.heap[U], W = U, U <<= 1;\n R.heap[W] = X;\n }\n function Se(R, z, W) {\n var X, U, Y, Q, $ = 0;\n if (R.last_lit !== 0) for (; X = R.pending_buf[R.d_buf + 2 * $] << 8 | R.pending_buf[R.d_buf + 2 * $ + 1], U = R.pending_buf[R.l_buf + $], $++, X === 0 ? K(R, U, z) : (K(R, (Y = v[U]) + u + 1, z), (Q = M[Y]) !== 0 && J(R, U -= I[Y], Q), K(R, Y = N(--X), W), (Q = C[Y]) !== 0 && J(R, X -= j[Y], Q)), $ < R.last_lit; ) ;\n K(R, _, z);\n }\n function De(R, z) {\n var W, X, U, Y = z.dyn_tree, Q = z.stat_desc.static_tree, $ = z.stat_desc.has_stree, ie = z.stat_desc.elems, he = -1;\n for (R.heap_len = 0, R.heap_max = m, W = 0; W < ie; W++) Y[2 * W] !== 0 ? (R.heap[++R.heap_len] = he = W, R.depth[W] = 0) : Y[2 * W + 1] = 0;\n for (; R.heap_len < 2; ) Y[2 * (U = R.heap[++R.heap_len] = he < 2 ? ++he : 0)] = 1, R.depth[U] = 0, R.opt_len--, $ && (R.static_len -= Q[2 * U + 1]);\n for (z.max_code = he, W = R.heap_len >> 1; 1 <= W; W--) me(R, Y, W);\n for (U = ie; W = R.heap[1], R.heap[1] = R.heap[R.heap_len--], me(R, Y, 1), X = R.heap[1], R.heap[--R.heap_max] = W, R.heap[--R.heap_max] = X, Y[2 * U] = Y[2 * W] + Y[2 * X], R.depth[U] = (R.depth[W] >= R.depth[X] ? R.depth[W] : R.depth[X]) + 1, Y[2 * W + 1] = Y[2 * X + 1] = U, R.heap[1] = U++, me(R, Y, 1), 2 <= R.heap_len; ) ;\n R.heap[--R.heap_max] = R.heap[1], (function(ae, Te) {\n var $e, ke, Lt, ye, en, vn, Je = Te.dyn_tree, vt = Te.max_code, Bt = Te.stat_desc.static_tree, It = Te.stat_desc.has_stree, zt = Te.stat_desc.extra_bits, St = Te.stat_desc.extra_base, Sn = Te.stat_desc.max_length, jn = 0;\n for (ye = 0; ye <= g; ye++) ae.bl_count[ye] = 0;\n for (Je[2 * ae.heap[ae.heap_max] + 1] = 0, $e = ae.heap_max + 1; $e < m; $e++) Sn < (ye = Je[2 * Je[2 * (ke = ae.heap[$e]) + 1] + 1] + 1) && (ye = Sn, jn++), Je[2 * ke + 1] = ye, vt < ke || (ae.bl_count[ye]++, en = 0, St <= ke && (en = zt[ke - St]), vn = Je[2 * ke], ae.opt_len += vn * (ye + en), It && (ae.static_len += vn * (Bt[2 * ke + 1] + en)));\n if (jn !== 0) {\n do {\n for (ye = Sn - 1; ae.bl_count[ye] === 0; ) ye--;\n ae.bl_count[ye]--, ae.bl_count[ye + 1] += 2, ae.bl_count[Sn]--, jn -= 2;\n } while (0 < jn);\n for (ye = Sn; ye !== 0; ye--) for (ke = ae.bl_count[ye]; ke !== 0; ) vt < (Lt = ae.heap[--$e]) || (Je[2 * Lt + 1] !== ye && (ae.opt_len += (ye - Je[2 * Lt + 1]) * Je[2 * Lt], Je[2 * Lt + 1] = ye), ke--);\n }\n })(R, z), pe(Y, he, R.bl_count);\n }\n function S(R, z, W) {\n var X, U, Y = -1, Q = z[1], $ = 0, ie = 7, he = 4;\n for (Q === 0 && (ie = 138, he = 3), z[2 * (W + 1) + 1] = 65535, X = 0; X <= W; X++) U = Q, Q = z[2 * (X + 1) + 1], ++$ < ie && U === Q || ($ < he ? R.bl_tree[2 * U] += $ : U !== 0 ? (U !== Y && R.bl_tree[2 * U]++, R.bl_tree[2 * x]++) : $ <= 10 ? R.bl_tree[2 * b]++ : R.bl_tree[2 * A]++, Y = U, he = ($ = 0) === Q ? (ie = 138, 3) : U === Q ? (ie = 6, 3) : (ie = 7, 4));\n }\n function G(R, z, W) {\n var X, U, Y = -1, Q = z[1], $ = 0, ie = 7, he = 4;\n for (Q === 0 && (ie = 138, he = 3), X = 0; X <= W; X++) if (U = Q, Q = z[2 * (X + 1) + 1], !(++$ < ie && U === Q)) {\n if ($ < he) for (; K(R, U, R.bl_tree), --$ != 0; ) ;\n else U !== 0 ? (U !== Y && (K(R, U, R.bl_tree), $--), K(R, x, R.bl_tree), J(R, $ - 3, 2)) : $ <= 10 ? (K(R, b, R.bl_tree), J(R, $ - 3, 3)) : (K(R, A, R.bl_tree), J(R, $ - 11, 7));\n Y = U, he = ($ = 0) === Q ? (ie = 138, 3) : U === Q ? (ie = 6, 3) : (ie = 7, 4);\n }\n }\n l(j);\n var V = !1;\n function L(R, z, W, X) {\n J(R, (h << 1) + (X ? 1 : 0), 3), (function(U, Y, Q, $) {\n oe(U), te(U, Q), te(U, ~Q), o.arraySet(U.pending_buf, U.window, Y, Q, U.pending), U.pending += Q;\n })(R, z, W);\n }\n i._tr_init = function(R) {\n V || ((function() {\n var z, W, X, U, Y, Q = new Array(g + 1);\n for (U = X = 0; U < c - 1; U++) for (I[U] = X, z = 0; z < 1 << M[U]; z++) v[X++] = U;\n for (v[X - 1] = U, U = Y = 0; U < 16; U++) for (j[U] = Y, z = 0; z < 1 << C[U]; z++) D[Y++] = U;\n for (Y >>= 7; U < p; U++) for (j[U] = Y << 7, z = 0; z < 1 << C[U] - 7; z++) D[256 + Y++] = U;\n for (W = 0; W <= g; W++) Q[W] = 0;\n for (z = 0; z <= 143; ) B[2 * z + 1] = 8, z++, Q[8]++;\n for (; z <= 255; ) B[2 * z + 1] = 9, z++, Q[9]++;\n for (; z <= 279; ) B[2 * z + 1] = 7, z++, Q[7]++;\n for (; z <= 287; ) B[2 * z + 1] = 8, z++, Q[8]++;\n for (pe(B, d + 1, Q), z = 0; z < p; z++) T[2 * z + 1] = 5, T[2 * z] = fe(z, 5);\n q = new ne(B, M, u + 1, d, g), H = new ne(T, C, 0, p, g), ee = new ne(new Array(0), P, 0, f, w);\n })(), V = !0), R.l_desc = new O(R.dyn_ltree, q), R.d_desc = new O(R.dyn_dtree, H), R.bl_desc = new O(R.bl_tree, ee), R.bi_buf = 0, R.bi_valid = 0, se(R);\n }, i._tr_stored_block = L, i._tr_flush_block = function(R, z, W, X) {\n var U, Y, Q = 0;\n 0 < R.level ? (R.strm.data_type === 2 && (R.strm.data_type = (function($) {\n var ie, he = 4093624447;\n for (ie = 0; ie <= 31; ie++, he >>>= 1) if (1 & he && $.dyn_ltree[2 * ie] !== 0) return r;\n if ($.dyn_ltree[18] !== 0 || $.dyn_ltree[20] !== 0 || $.dyn_ltree[26] !== 0) return a;\n for (ie = 32; ie < u; ie++) if ($.dyn_ltree[2 * ie] !== 0) return a;\n return r;\n })(R)), De(R, R.l_desc), De(R, R.d_desc), Q = (function($) {\n var ie;\n for (S($, $.dyn_ltree, $.l_desc.max_code), S($, $.dyn_dtree, $.d_desc.max_code), De($, $.bl_desc), ie = f - 1; 3 <= ie && $.bl_tree[2 * k[ie] + 1] === 0; ie--) ;\n return $.opt_len += 3 * (ie + 1) + 5 + 5 + 4, ie;\n })(R), U = R.opt_len + 3 + 7 >>> 3, (Y = R.static_len + 3 + 7 >>> 3) <= U && (U = Y)) : U = Y = W + 5, W + 4 <= U && z !== -1 ? L(R, z, W, X) : R.strategy === 4 || Y === U ? (J(R, 2 + (X ? 1 : 0), 3), Se(R, B, T)) : (J(R, 4 + (X ? 1 : 0), 3), (function($, ie, he, ae) {\n var Te;\n for (J($, ie - 257, 5), J($, he - 1, 5), J($, ae - 4, 4), Te = 0; Te < ae; Te++) J($, $.bl_tree[2 * k[Te] + 1], 3);\n G($, $.dyn_ltree, ie - 1), G($, $.dyn_dtree, he - 1);\n })(R, R.l_desc.max_code + 1, R.d_desc.max_code + 1, Q + 1), Se(R, R.dyn_ltree, R.dyn_dtree)), se(R), X && oe(R);\n }, i._tr_tally = function(R, z, W) {\n return R.pending_buf[R.d_buf + 2 * R.last_lit] = z >>> 8 & 255, R.pending_buf[R.d_buf + 2 * R.last_lit + 1] = 255 & z, R.pending_buf[R.l_buf + R.last_lit] = 255 & W, R.last_lit++, z === 0 ? R.dyn_ltree[2 * W]++ : (R.matches++, z--, R.dyn_ltree[2 * (v[W] + u + 1)]++, R.dyn_dtree[2 * N(z)]++), R.last_lit === R.lit_bufsize - 1;\n }, i._tr_align = function(R) {\n J(R, 2, 3), K(R, _, B), (function(z) {\n z.bi_valid === 16 ? (te(z, z.bi_buf), z.bi_buf = 0, z.bi_valid = 0) : 8 <= z.bi_valid && (z.pending_buf[z.pending++] = 255 & z.bi_buf, z.bi_buf >>= 8, z.bi_valid -= 8);\n })(R);\n };\n }, { \"../utils/common\": 41 }], 53: [function(t, n, i) {\n n.exports = function() {\n this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out = 0, this.avail_out = 0, this.total_out = 0, this.msg = \"\", this.state = null, this.data_type = 2, this.adler = 0;\n };\n }, {}], 54: [function(t, n, i) {\n (function(o) {\n (function(r, a) {\n if (!r.setImmediate) {\n var l, h, c, u, d = 1, p = {}, f = !1, m = r.document, g = Object.getPrototypeOf && Object.getPrototypeOf(r);\n g = g && g.setTimeout ? g : r, l = {}.toString.call(r.process) === \"[object process]\" ? function(x) {\n process.nextTick(function() {\n w(x);\n });\n } : (function() {\n if (r.postMessage && !r.importScripts) {\n var x = !0, b = r.onmessage;\n return r.onmessage = function() {\n x = !1;\n }, r.postMessage(\"\", \"*\"), r.onmessage = b, x;\n }\n })() ? (u = \"setImmediate$\" + Math.random() + \"$\", r.addEventListener ? r.addEventListener(\"message\", _, !1) : r.attachEvent(\"onmessage\", _), function(x) {\n r.postMessage(u + x, \"*\");\n }) : r.MessageChannel ? ((c = new MessageChannel()).port1.onmessage = function(x) {\n w(x.data);\n }, function(x) {\n c.port2.postMessage(x);\n }) : m && \"onreadystatechange\" in m.createElement(\"script\") ? (h = m.documentElement, function(x) {\n var b = m.createElement(\"script\");\n b.onreadystatechange = function() {\n w(x), b.onreadystatechange = null, h.removeChild(b), b = null;\n }, h.appendChild(b);\n }) : function(x) {\n setTimeout(w, 0, x);\n }, g.setImmediate = function(x) {\n typeof x != \"function\" && (x = new Function(\"\" + x));\n for (var b = new Array(arguments.length - 1), A = 0; A < b.length; A++) b[A] = arguments[A + 1];\n var M = { callback: x, args: b };\n return p[d] = M, l(d), d++;\n }, g.clearImmediate = y;\n }\n function y(x) {\n delete p[x];\n }\n function w(x) {\n if (f) setTimeout(w, 0, x);\n else {\n var b = p[x];\n if (b) {\n f = !0;\n try {\n (function(A) {\n var M = A.callback, C = A.args;\n switch (C.length) {\n case 0:\n M();\n break;\n case 1:\n M(C[0]);\n break;\n case 2:\n M(C[0], C[1]);\n break;\n case 3:\n M(C[0], C[1], C[2]);\n break;\n default:\n M.apply(a, C);\n }\n })(b);\n } finally {\n y(x), f = !1;\n }\n }\n }\n }\n function _(x) {\n x.source === r && typeof x.data == \"string\" && x.data.indexOf(u) === 0 && w(+x.data.slice(u.length));\n }\n })(typeof self > \"u\" ? o === void 0 ? this : o : self);\n }).call(this, typeof Yn < \"u\" ? Yn : typeof self < \"u\" ? self : typeof window < \"u\" ? window : {});\n }, {}] }, {}, [10])(10);\n });\n })(Qi)), Qi.exports;\n}\nvar dc = fc();\nconst Ko = /* @__PURE__ */ qo(dc);\nfunction Zo(s, e) {\n return function() {\n return s.apply(e, arguments);\n };\n}\nconst { toString: pc } = Object.prototype, { getPrototypeOf: nr } = Object, { iterator: Hi, toStringTag: Yo } = Symbol, Gi = /* @__PURE__ */ ((s) => (e) => {\n const t = pc.call(e);\n return s[t] || (s[t] = t.slice(8, -1).toLowerCase());\n})(/* @__PURE__ */ Object.create(null)), it = (s) => (s = s.toLowerCase(), (e) => Gi(e) === s), Wi = (s) => (e) => typeof e === s, { isArray: xn } = Array, wn = Wi(\"undefined\");\nfunction On(s) {\n return s !== null && !wn(s) && s.constructor !== null && !wn(s.constructor) && Ue(s.constructor.isBuffer) && s.constructor.isBuffer(s);\n}\nconst $o = it(\"ArrayBuffer\");\nfunction mc(s) {\n let e;\n return typeof ArrayBuffer < \"u\" && ArrayBuffer.isView ? e = ArrayBuffer.isView(s) : e = s && s.buffer && $o(s.buffer), e;\n}\nconst gc = Wi(\"string\"), Ue = Wi(\"function\"), Jo = Wi(\"number\"), Un = (s) => s !== null && typeof s == \"object\", yc = (s) => s === !0 || s === !1, Si = (s) => {\n if (Gi(s) !== \"object\")\n return !1;\n const e = nr(s);\n return (e === null || e === Object.prototype || Object.getPrototypeOf(e) === null) && !(Yo in s) && !(Hi in s);\n}, wc = (s) => {\n if (!Un(s) || On(s))\n return !1;\n try {\n return Object.keys(s).length === 0 && Object.getPrototypeOf(s) === Object.prototype;\n } catch {\n return !1;\n }\n}, _c = it(\"Date\"), xc = it(\"File\"), bc = it(\"Blob\"), vc = it(\"FileList\"), Sc = (s) => Un(s) && Ue(s.pipe), Tc = (s) => {\n let e;\n return s && (typeof FormData == \"function\" && s instanceof FormData || Ue(s.append) && ((e = Gi(s)) === \"formdata\" || // detect form-data instance\n e === \"object\" && Ue(s.toString) && s.toString() === \"[object FormData]\"));\n}, Ec = it(\"URLSearchParams\"), [Mc, Ac, Cc, Pc] = [\"ReadableStream\", \"Request\", \"Response\", \"Headers\"].map(it), kc = (s) => s.trim ? s.trim() : s.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\");\nfunction Fn(s, e, { allOwnKeys: t = !1 } = {}) {\n if (s === null || typeof s > \"u\")\n return;\n let n, i;\n if (typeof s != \"object\" && (s = [s]), xn(s))\n for (n = 0, i = s.length; n < i; n++)\n e.call(null, s[n], n, s);\n else {\n if (On(s))\n return;\n const o = t ? Object.getOwnPropertyNames(s) : Object.keys(s), r = o.length;\n let a;\n for (n = 0; n < r; n++)\n a = o[n], e.call(null, s[a], a, s);\n }\n}\nfunction Qo(s, e) {\n if (On(s))\n return null;\n e = e.toLowerCase();\n const t = Object.keys(s);\n let n = t.length, i;\n for (; n-- > 0; )\n if (i = t[n], e === i.toLowerCase())\n return i;\n return null;\n}\nconst Wt = typeof globalThis < \"u\" ? globalThis : typeof self < \"u\" ? self : typeof window < \"u\" ? window : global, ea = (s) => !wn(s) && s !== Wt;\nfunction Bs() {\n const { caseless: s, skipUndefined: e } = ea(this) && this || {}, t = {}, n = (i, o) => {\n const r = s && Qo(t, o) || o;\n Si(t[r]) && Si(i) ? t[r] = Bs(t[r], i) : Si(i) ? t[r] = Bs({}, i) : xn(i) ? t[r] = i.slice() : (!e || !wn(i)) && (t[r] = i);\n };\n for (let i = 0, o = arguments.length; i < o; i++)\n arguments[i] && Fn(arguments[i], n);\n return t;\n}\nconst Rc = (s, e, t, { allOwnKeys: n } = {}) => (Fn(e, (i, o) => {\n t && Ue(i) ? s[o] = Zo(i, t) : s[o] = i;\n}, { allOwnKeys: n }), s), Dc = (s) => (s.charCodeAt(0) === 65279 && (s = s.slice(1)), s), Lc = (s, e, t, n) => {\n s.prototype = Object.create(e.prototype, n), s.prototype.constructor = s, Object.defineProperty(s, \"super\", {\n value: e.prototype\n }), t && Object.assign(s.prototype, t);\n}, Bc = (s, e, t, n) => {\n let i, o, r;\n const a = {};\n if (e = e || {}, s == null) return e;\n do {\n for (i = Object.getOwnPropertyNames(s), o = i.length; o-- > 0; )\n r = i[o], (!n || n(r, s, e)) && !a[r] && (e[r] = s[r], a[r] = !0);\n s = t !== !1 && nr(s);\n } while (s && (!t || t(s, e)) && s !== Object.prototype);\n return e;\n}, Ic = (s, e, t) => {\n s = String(s), (t === void 0 || t > s.length) && (t = s.length), t -= e.length;\n const n = s.indexOf(e, t);\n return n !== -1 && n === t;\n}, zc = (s) => {\n if (!s) return null;\n if (xn(s)) return s;\n let e = s.length;\n if (!Jo(e)) return null;\n const t = new Array(e);\n for (; e-- > 0; )\n t[e] = s[e];\n return t;\n}, Nc = /* @__PURE__ */ ((s) => (e) => s && e instanceof s)(typeof Uint8Array < \"u\" && nr(Uint8Array)), Oc = (s, e) => {\n const n = (s && s[Hi]).call(s);\n let i;\n for (; (i = n.next()) && !i.done; ) {\n const o = i.value;\n e.call(s, o[0], o[1]);\n }\n}, Uc = (s, e) => {\n let t;\n const n = [];\n for (; (t = s.exec(e)) !== null; )\n n.push(t);\n return n;\n}, Fc = it(\"HTMLFormElement\"), Vc = (s) => s.toLowerCase().replace(\n /[-_\\s]([a-z\\d])(\\w*)/g,\n function(t, n, i) {\n return n.toUpperCase() + i;\n }\n), Er = (({ hasOwnProperty: s }) => (e, t) => s.call(e, t))(Object.prototype), jc = it(\"RegExp\"), ta = (s, e) => {\n const t = Object.getOwnPropertyDescriptors(s), n = {};\n Fn(t, (i, o) => {\n let r;\n (r = e(i, o, s)) !== !1 && (n[o] = r || i);\n }), Object.defineProperties(s, n);\n}, Hc = (s) => {\n ta(s, (e, t) => {\n if (Ue(s) && [\"arguments\", \"caller\", \"callee\"].indexOf(t) !== -1)\n return !1;\n const n = s[t];\n if (Ue(n)) {\n if (e.enumerable = !1, \"writable\" in e) {\n e.writable = !1;\n return;\n }\n e.set || (e.set = () => {\n throw Error(\"Can not rewrite read-only method '\" + t + \"'\");\n });\n }\n });\n}, Gc = (s, e) => {\n const t = {}, n = (i) => {\n i.forEach((o) => {\n t[o] = !0;\n });\n };\n return xn(s) ? n(s) : n(String(s).split(e)), t;\n}, Wc = () => {\n}, Xc = (s, e) => s != null && Number.isFinite(s = +s) ? s : e;\nfunction qc(s) {\n return !!(s && Ue(s.append) && s[Yo] === \"FormData\" && s[Hi]);\n}\nconst Kc = (s) => {\n const e = new Array(10), t = (n, i) => {\n if (Un(n)) {\n if (e.indexOf(n) >= 0)\n return;\n if (On(n))\n return n;\n if (!(\"toJSON\" in n)) {\n e[i] = n;\n const o = xn(n) ? [] : {};\n return Fn(n, (r, a) => {\n const l = t(r, i + 1);\n !wn(l) && (o[a] = l);\n }), e[i] = void 0, o;\n }\n }\n return n;\n };\n return t(s, 0);\n}, Zc = it(\"AsyncFunction\"), Yc = (s) => s && (Un(s) || Ue(s)) && Ue(s.then) && Ue(s.catch), na = ((s, e) => s ? setImmediate : e ? ((t, n) => (Wt.addEventListener(\"message\", ({ source: i, data: o }) => {\n i === Wt && o === t && n.length && n.shift()();\n}, !1), (i) => {\n n.push(i), Wt.postMessage(t, \"*\");\n}))(`axios@${Math.random()}`, []) : (t) => setTimeout(t))(\n typeof setImmediate == \"function\",\n Ue(Wt.postMessage)\n), $c = typeof queueMicrotask < \"u\" ? queueMicrotask.bind(Wt) : typeof process < \"u\" && process.nextTick || na, Jc = (s) => s != null && Ue(s[Hi]), F = {\n isArray: xn,\n isArrayBuffer: $o,\n isBuffer: On,\n isFormData: Tc,\n isArrayBufferView: mc,\n isString: gc,\n isNumber: Jo,\n isBoolean: yc,\n isObject: Un,\n isPlainObject: Si,\n isEmptyObject: wc,\n isReadableStream: Mc,\n isRequest: Ac,\n isResponse: Cc,\n isHeaders: Pc,\n isUndefined: wn,\n isDate: _c,\n isFile: xc,\n isBlob: bc,\n isRegExp: jc,\n isFunction: Ue,\n isStream: Sc,\n isURLSearchParams: Ec,\n isTypedArray: Nc,\n isFileList: vc,\n forEach: Fn,\n merge: Bs,\n extend: Rc,\n trim: kc,\n stripBOM: Dc,\n inherits: Lc,\n toFlatObject: Bc,\n kindOf: Gi,\n kindOfTest: it,\n endsWith: Ic,\n toArray: zc,\n forEachEntry: Oc,\n matchAll: Uc,\n isHTMLForm: Fc,\n hasOwnProperty: Er,\n hasOwnProp: Er,\n // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors: ta,\n freezeMethods: Hc,\n toObjectSet: Gc,\n toCamelCase: Vc,\n noop: Wc,\n toFiniteNumber: Xc,\n findKey: Qo,\n global: Wt,\n isContextDefined: ea,\n isSpecCompliantForm: qc,\n toJSONObject: Kc,\n isAsyncFn: Zc,\n isThenable: Yc,\n setImmediate: na,\n asap: $c,\n isIterable: Jc\n};\nfunction re(s, e, t, n, i) {\n Error.call(this), Error.captureStackTrace ? Error.captureStackTrace(this, this.constructor) : this.stack = new Error().stack, this.message = s, this.name = \"AxiosError\", e && (this.code = e), t && (this.config = t), n && (this.request = n), i && (this.response = i, this.status = i.status ? i.status : null);\n}\nF.inherits(re, Error, {\n toJSON: function() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: F.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\nconst ia = re.prototype, sa = {};\n[\n \"ERR_BAD_OPTION_VALUE\",\n \"ERR_BAD_OPTION\",\n \"ECONNABORTED\",\n \"ETIMEDOUT\",\n \"ERR_NETWORK\",\n \"ERR_FR_TOO_MANY_REDIRECTS\",\n \"ERR_DEPRECATED\",\n \"ERR_BAD_RESPONSE\",\n \"ERR_BAD_REQUEST\",\n \"ERR_CANCELED\",\n \"ERR_NOT_SUPPORT\",\n \"ERR_INVALID_URL\"\n // eslint-disable-next-line func-names\n].forEach((s) => {\n sa[s] = { value: s };\n});\nObject.defineProperties(re, sa);\nObject.defineProperty(ia, \"isAxiosError\", { value: !0 });\nre.from = (s, e, t, n, i, o) => {\n const r = Object.create(ia);\n F.toFlatObject(s, r, function(c) {\n return c !== Error.prototype;\n }, (h) => h !== \"isAxiosError\");\n const a = s && s.message ? s.message : \"Error\", l = e == null && s ? s.code : e;\n return re.call(r, a, l, t, n, i), s && r.cause == null && Object.defineProperty(r, \"cause\", { value: s, configurable: !0 }), r.name = s && s.name || \"Error\", o && Object.assign(r, o), r;\n};\nconst Qc = null;\nfunction Is(s) {\n return F.isPlainObject(s) || F.isArray(s);\n}\nfunction ra(s) {\n return F.endsWith(s, \"[]\") ? s.slice(0, -2) : s;\n}\nfunction Mr(s, e, t) {\n return s ? s.concat(e).map(function(i, o) {\n return i = ra(i), !t && o ? \"[\" + i + \"]\" : i;\n }).join(t ? \".\" : \"\") : e;\n}\nfunction eh(s) {\n return F.isArray(s) && !s.some(Is);\n}\nconst th = F.toFlatObject(F, {}, null, function(e) {\n return /^is[A-Z]/.test(e);\n});\nfunction Xi(s, e, t) {\n if (!F.isObject(s))\n throw new TypeError(\"target must be an object\");\n e = e || new FormData(), t = F.toFlatObject(t, {\n metaTokens: !0,\n dots: !1,\n indexes: !1\n }, !1, function(m, g) {\n return !F.isUndefined(g[m]);\n });\n const n = t.metaTokens, i = t.visitor || c, o = t.dots, r = t.indexes, l = (t.Blob || typeof Blob < \"u\" && Blob) && F.isSpecCompliantForm(e);\n if (!F.isFunction(i))\n throw new TypeError(\"visitor must be a function\");\n function h(f) {\n if (f === null) return \"\";\n if (F.isDate(f))\n return f.toISOString();\n if (F.isBoolean(f))\n return f.toString();\n if (!l && F.isBlob(f))\n throw new re(\"Blob is not supported. Use a Buffer instead.\");\n return F.isArrayBuffer(f) || F.isTypedArray(f) ? l && typeof Blob == \"function\" ? new Blob([f]) : Buffer.from(f) : f;\n }\n function c(f, m, g) {\n let y = f;\n if (f && !g && typeof f == \"object\") {\n if (F.endsWith(m, \"{}\"))\n m = n ? m : m.slice(0, -2), f = JSON.stringify(f);\n else if (F.isArray(f) && eh(f) || (F.isFileList(f) || F.endsWith(m, \"[]\")) && (y = F.toArray(f)))\n return m = ra(m), y.forEach(function(_, x) {\n !(F.isUndefined(_) || _ === null) && e.append(\n // eslint-disable-next-line no-nested-ternary\n r === !0 ? Mr([m], x, o) : r === null ? m : m + \"[]\",\n h(_)\n );\n }), !1;\n }\n return Is(f) ? !0 : (e.append(Mr(g, m, o), h(f)), !1);\n }\n const u = [], d = Object.assign(th, {\n defaultVisitor: c,\n convertValue: h,\n isVisitable: Is\n });\n function p(f, m) {\n if (!F.isUndefined(f)) {\n if (u.indexOf(f) !== -1)\n throw Error(\"Circular reference detected in \" + m.join(\".\"));\n u.push(f), F.forEach(f, function(y, w) {\n (!(F.isUndefined(y) || y === null) && i.call(\n e,\n y,\n F.isString(w) ? w.trim() : w,\n m,\n d\n )) === !0 && p(y, m ? m.concat(w) : [w]);\n }), u.pop();\n }\n }\n if (!F.isObject(s))\n throw new TypeError(\"data must be an object\");\n return p(s), e;\n}\nfunction Ar(s) {\n const e = {\n \"!\": \"%21\",\n \"'\": \"%27\",\n \"(\": \"%28\",\n \")\": \"%29\",\n \"~\": \"%7E\",\n \"%20\": \"+\",\n \"%00\": \"\\0\"\n };\n return encodeURIComponent(s).replace(/[!'()~]|%20|%00/g, function(n) {\n return e[n];\n });\n}\nfunction ir(s, e) {\n this._pairs = [], s && Xi(s, this, e);\n}\nconst oa = ir.prototype;\noa.append = function(e, t) {\n this._pairs.push([e, t]);\n};\noa.toString = function(e) {\n const t = e ? function(n) {\n return e.call(this, n, Ar);\n } : Ar;\n return this._pairs.map(function(i) {\n return t(i[0]) + \"=\" + t(i[1]);\n }, \"\").join(\"&\");\n};\nfunction nh(s) {\n return encodeURIComponent(s).replace(/%3A/gi, \":\").replace(/%24/g, \"$\").replace(/%2C/gi, \",\").replace(/%20/g, \"+\");\n}\nfunction aa(s, e, t) {\n if (!e)\n return s;\n const n = t && t.encode || nh;\n F.isFunction(t) && (t = {\n serialize: t\n });\n const i = t && t.serialize;\n let o;\n if (i ? o = i(e, t) : o = F.isURLSearchParams(e) ? e.toString() : new ir(e, t).toString(n), o) {\n const r = s.indexOf(\"#\");\n r !== -1 && (s = s.slice(0, r)), s += (s.indexOf(\"?\") === -1 ? \"?\" : \"&\") + o;\n }\n return s;\n}\nclass Cr {\n constructor() {\n this.handlers = [];\n }\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(e, t, n) {\n return this.handlers.push({\n fulfilled: e,\n rejected: t,\n synchronous: n ? n.synchronous : !1,\n runWhen: n ? n.runWhen : null\n }), this.handlers.length - 1;\n }\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {void}\n */\n eject(e) {\n this.handlers[e] && (this.handlers[e] = null);\n }\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n this.handlers && (this.handlers = []);\n }\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(e) {\n F.forEach(this.handlers, function(n) {\n n !== null && e(n);\n });\n }\n}\nconst la = {\n silentJSONParsing: !0,\n forcedJSONParsing: !0,\n clarifyTimeoutError: !1\n}, ih = typeof URLSearchParams < \"u\" ? URLSearchParams : ir, sh = typeof FormData < \"u\" ? FormData : null, rh = typeof Blob < \"u\" ? Blob : null, oh = {\n isBrowser: !0,\n classes: {\n URLSearchParams: ih,\n FormData: sh,\n Blob: rh\n },\n protocols: [\"http\", \"https\", \"file\", \"blob\", \"url\", \"data\"]\n}, sr = typeof window < \"u\" && typeof document < \"u\", zs = typeof navigator == \"object\" && navigator || void 0, ah = sr && (!zs || [\"ReactNative\", \"NativeScript\", \"NS\"].indexOf(zs.product) < 0), lh = typeof WorkerGlobalScope < \"u\" && // eslint-disable-next-line no-undef\nself instanceof WorkerGlobalScope && typeof self.importScripts == \"function\", ch = sr && window.location.href || \"http://localhost\", hh = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n hasBrowserEnv: sr,\n hasStandardBrowserEnv: ah,\n hasStandardBrowserWebWorkerEnv: lh,\n navigator: zs,\n origin: ch\n}, Symbol.toStringTag, { value: \"Module\" })), Re = {\n ...hh,\n ...oh\n};\nfunction uh(s, e) {\n return Xi(s, new Re.classes.URLSearchParams(), {\n visitor: function(t, n, i, o) {\n return Re.isNode && F.isBuffer(t) ? (this.append(n, t.toString(\"base64\")), !1) : o.defaultVisitor.apply(this, arguments);\n },\n ...e\n });\n}\nfunction fh(s) {\n return F.matchAll(/\\w+|\\[(\\w*)]/g, s).map((e) => e[0] === \"[]\" ? \"\" : e[1] || e[0]);\n}\nfunction dh(s) {\n const e = {}, t = Object.keys(s);\n let n;\n const i = t.length;\n let o;\n for (n = 0; n < i; n++)\n o = t[n], e[o] = s[o];\n return e;\n}\nfunction ca(s) {\n function e(t, n, i, o) {\n let r = t[o++];\n if (r === \"__proto__\") return !0;\n const a = Number.isFinite(+r), l = o >= t.length;\n return r = !r && F.isArray(i) ? i.length : r, l ? (F.hasOwnProp(i, r) ? i[r] = [i[r], n] : i[r] = n, !a) : ((!i[r] || !F.isObject(i[r])) && (i[r] = []), e(t, n, i[r], o) && F.isArray(i[r]) && (i[r] = dh(i[r])), !a);\n }\n if (F.isFormData(s) && F.isFunction(s.entries)) {\n const t = {};\n return F.forEachEntry(s, (n, i) => {\n e(fh(n), i, t, 0);\n }), t;\n }\n return null;\n}\nfunction ph(s, e, t) {\n if (F.isString(s))\n try {\n return (e || JSON.parse)(s), F.trim(s);\n } catch (n) {\n if (n.name !== \"SyntaxError\")\n throw n;\n }\n return (t || JSON.stringify)(s);\n}\nconst Vn = {\n transitional: la,\n adapter: [\"xhr\", \"http\", \"fetch\"],\n transformRequest: [function(e, t) {\n const n = t.getContentType() || \"\", i = n.indexOf(\"application/json\") > -1, o = F.isObject(e);\n if (o && F.isHTMLForm(e) && (e = new FormData(e)), F.isFormData(e))\n return i ? JSON.stringify(ca(e)) : e;\n if (F.isArrayBuffer(e) || F.isBuffer(e) || F.isStream(e) || F.isFile(e) || F.isBlob(e) || F.isReadableStream(e))\n return e;\n if (F.isArrayBufferView(e))\n return e.buffer;\n if (F.isURLSearchParams(e))\n return t.setContentType(\"application/x-www-form-urlencoded;charset=utf-8\", !1), e.toString();\n let a;\n if (o) {\n if (n.indexOf(\"application/x-www-form-urlencoded\") > -1)\n return uh(e, this.formSerializer).toString();\n if ((a = F.isFileList(e)) || n.indexOf(\"multipart/form-data\") > -1) {\n const l = this.env && this.env.FormData;\n return Xi(\n a ? { \"files[]\": e } : e,\n l && new l(),\n this.formSerializer\n );\n }\n }\n return o || i ? (t.setContentType(\"application/json\", !1), ph(e)) : e;\n }],\n transformResponse: [function(e) {\n const t = this.transitional || Vn.transitional, n = t && t.forcedJSONParsing, i = this.responseType === \"json\";\n if (F.isResponse(e) || F.isReadableStream(e))\n return e;\n if (e && F.isString(e) && (n && !this.responseType || i)) {\n const r = !(t && t.silentJSONParsing) && i;\n try {\n return JSON.parse(e, this.parseReviver);\n } catch (a) {\n if (r)\n throw a.name === \"SyntaxError\" ? re.from(a, re.ERR_BAD_RESPONSE, this, null, this.response) : a;\n }\n }\n return e;\n }],\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n xsrfCookieName: \"XSRF-TOKEN\",\n xsrfHeaderName: \"X-XSRF-TOKEN\",\n maxContentLength: -1,\n maxBodyLength: -1,\n env: {\n FormData: Re.classes.FormData,\n Blob: Re.classes.Blob\n },\n validateStatus: function(e) {\n return e >= 200 && e < 300;\n },\n headers: {\n common: {\n Accept: \"application/json, text/plain, */*\",\n \"Content-Type\": void 0\n }\n }\n};\nF.forEach([\"delete\", \"get\", \"head\", \"post\", \"put\", \"patch\"], (s) => {\n Vn.headers[s] = {};\n});\nconst mh = F.toObjectSet([\n \"age\",\n \"authorization\",\n \"content-length\",\n \"content-type\",\n \"etag\",\n \"expires\",\n \"from\",\n \"host\",\n \"if-modified-since\",\n \"if-unmodified-since\",\n \"last-modified\",\n \"location\",\n \"max-forwards\",\n \"proxy-authorization\",\n \"referer\",\n \"retry-after\",\n \"user-agent\"\n]), gh = (s) => {\n const e = {};\n let t, n, i;\n return s && s.split(`\n`).forEach(function(r) {\n i = r.indexOf(\":\"), t = r.substring(0, i).trim().toLowerCase(), n = r.substring(i + 1).trim(), !(!t || e[t] && mh[t]) && (t === \"set-cookie\" ? e[t] ? e[t].push(n) : e[t] = [n] : e[t] = e[t] ? e[t] + \", \" + n : n);\n }), e;\n}, Pr = Symbol(\"internals\");\nfunction Tn(s) {\n return s && String(s).trim().toLowerCase();\n}\nfunction Ti(s) {\n return s === !1 || s == null ? s : F.isArray(s) ? s.map(Ti) : String(s);\n}\nfunction yh(s) {\n const e = /* @__PURE__ */ Object.create(null), t = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let n;\n for (; n = t.exec(s); )\n e[n[1]] = n[2];\n return e;\n}\nconst wh = (s) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(s.trim());\nfunction es(s, e, t, n, i) {\n if (F.isFunction(n))\n return n.call(this, e, t);\n if (i && (e = t), !!F.isString(e)) {\n if (F.isString(n))\n return e.indexOf(n) !== -1;\n if (F.isRegExp(n))\n return n.test(e);\n }\n}\nfunction _h(s) {\n return s.trim().toLowerCase().replace(/([a-z\\d])(\\w*)/g, (e, t, n) => t.toUpperCase() + n);\n}\nfunction xh(s, e) {\n const t = F.toCamelCase(\" \" + e);\n [\"get\", \"set\", \"has\"].forEach((n) => {\n Object.defineProperty(s, n + t, {\n value: function(i, o, r) {\n return this[n].call(this, e, i, o, r);\n },\n configurable: !0\n });\n });\n}\nlet Fe = class {\n constructor(e) {\n e && this.set(e);\n }\n set(e, t, n) {\n const i = this;\n function o(a, l, h) {\n const c = Tn(l);\n if (!c)\n throw new Error(\"header name must be a non-empty string\");\n const u = F.findKey(i, c);\n (!u || i[u] === void 0 || h === !0 || h === void 0 && i[u] !== !1) && (i[u || l] = Ti(a));\n }\n const r = (a, l) => F.forEach(a, (h, c) => o(h, c, l));\n if (F.isPlainObject(e) || e instanceof this.constructor)\n r(e, t);\n else if (F.isString(e) && (e = e.trim()) && !wh(e))\n r(gh(e), t);\n else if (F.isObject(e) && F.isIterable(e)) {\n let a = {}, l, h;\n for (const c of e) {\n if (!F.isArray(c))\n throw TypeError(\"Object iterator must return a key-value pair\");\n a[h = c[0]] = (l = a[h]) ? F.isArray(l) ? [...l, c[1]] : [l, c[1]] : c[1];\n }\n r(a, t);\n } else\n e != null && o(t, e, n);\n return this;\n }\n get(e, t) {\n if (e = Tn(e), e) {\n const n = F.findKey(this, e);\n if (n) {\n const i = this[n];\n if (!t)\n return i;\n if (t === !0)\n return yh(i);\n if (F.isFunction(t))\n return t.call(this, i, n);\n if (F.isRegExp(t))\n return t.exec(i);\n throw new TypeError(\"parser must be boolean|regexp|function\");\n }\n }\n }\n has(e, t) {\n if (e = Tn(e), e) {\n const n = F.findKey(this, e);\n return !!(n && this[n] !== void 0 && (!t || es(this, this[n], n, t)));\n }\n return !1;\n }\n delete(e, t) {\n const n = this;\n let i = !1;\n function o(r) {\n if (r = Tn(r), r) {\n const a = F.findKey(n, r);\n a && (!t || es(n, n[a], a, t)) && (delete n[a], i = !0);\n }\n }\n return F.isArray(e) ? e.forEach(o) : o(e), i;\n }\n clear(e) {\n const t = Object.keys(this);\n let n = t.length, i = !1;\n for (; n--; ) {\n const o = t[n];\n (!e || es(this, this[o], o, e, !0)) && (delete this[o], i = !0);\n }\n return i;\n }\n normalize(e) {\n const t = this, n = {};\n return F.forEach(this, (i, o) => {\n const r = F.findKey(n, o);\n if (r) {\n t[r] = Ti(i), delete t[o];\n return;\n }\n const a = e ? _h(o) : String(o).trim();\n a !== o && delete t[o], t[a] = Ti(i), n[a] = !0;\n }), this;\n }\n concat(...e) {\n return this.constructor.concat(this, ...e);\n }\n toJSON(e) {\n const t = /* @__PURE__ */ Object.create(null);\n return F.forEach(this, (n, i) => {\n n != null && n !== !1 && (t[i] = e && F.isArray(n) ? n.join(\", \") : n);\n }), t;\n }\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n toString() {\n return Object.entries(this.toJSON()).map(([e, t]) => e + \": \" + t).join(`\n`);\n }\n getSetCookie() {\n return this.get(\"set-cookie\") || [];\n }\n get [Symbol.toStringTag]() {\n return \"AxiosHeaders\";\n }\n static from(e) {\n return e instanceof this ? e : new this(e);\n }\n static concat(e, ...t) {\n const n = new this(e);\n return t.forEach((i) => n.set(i)), n;\n }\n static accessor(e) {\n const n = (this[Pr] = this[Pr] = {\n accessors: {}\n }).accessors, i = this.prototype;\n function o(r) {\n const a = Tn(r);\n n[a] || (xh(i, r), n[a] = !0);\n }\n return F.isArray(e) ? e.forEach(o) : o(e), this;\n }\n};\nFe.accessor([\"Content-Type\", \"Content-Length\", \"Accept\", \"Accept-Encoding\", \"User-Agent\", \"Authorization\"]);\nF.reduceDescriptors(Fe.prototype, ({ value: s }, e) => {\n let t = e[0].toUpperCase() + e.slice(1);\n return {\n get: () => s,\n set(n) {\n this[t] = n;\n }\n };\n});\nF.freezeMethods(Fe);\nfunction ts(s, e) {\n const t = this || Vn, n = e || t, i = Fe.from(n.headers);\n let o = n.data;\n return F.forEach(s, function(a) {\n o = a.call(t, o, i.normalize(), e ? e.status : void 0);\n }), i.normalize(), o;\n}\nfunction ha(s) {\n return !!(s && s.__CANCEL__);\n}\nfunction bn(s, e, t) {\n re.call(this, s ?? \"canceled\", re.ERR_CANCELED, e, t), this.name = \"CanceledError\";\n}\nF.inherits(bn, re, {\n __CANCEL__: !0\n});\nfunction ua(s, e, t) {\n const n = t.config.validateStatus;\n !t.status || !n || n(t.status) ? s(t) : e(new re(\n \"Request failed with status code \" + t.status,\n [re.ERR_BAD_REQUEST, re.ERR_BAD_RESPONSE][Math.floor(t.status / 100) - 4],\n t.config,\n t.request,\n t\n ));\n}\nfunction bh(s) {\n const e = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(s);\n return e && e[1] || \"\";\n}\nfunction vh(s, e) {\n s = s || 10;\n const t = new Array(s), n = new Array(s);\n let i = 0, o = 0, r;\n return e = e !== void 0 ? e : 1e3, function(l) {\n const h = Date.now(), c = n[o];\n r || (r = h), t[i] = l, n[i] = h;\n let u = o, d = 0;\n for (; u !== i; )\n d += t[u++], u = u % s;\n if (i = (i + 1) % s, i === o && (o = (o + 1) % s), h - r < e)\n return;\n const p = c && h - c;\n return p ? Math.round(d * 1e3 / p) : void 0;\n };\n}\nfunction Sh(s, e) {\n let t = 0, n = 1e3 / e, i, o;\n const r = (h, c = Date.now()) => {\n t = c, i = null, o && (clearTimeout(o), o = null), s(...h);\n };\n return [(...h) => {\n const c = Date.now(), u = c - t;\n u >= n ? r(h, c) : (i = h, o || (o = setTimeout(() => {\n o = null, r(i);\n }, n - u)));\n }, () => i && r(i)];\n}\nconst Ii = (s, e, t = 3) => {\n let n = 0;\n const i = vh(50, 250);\n return Sh((o) => {\n const r = o.loaded, a = o.lengthComputable ? o.total : void 0, l = r - n, h = i(l), c = r <= a;\n n = r;\n const u = {\n loaded: r,\n total: a,\n progress: a ? r / a : void 0,\n bytes: l,\n rate: h || void 0,\n estimated: h && a && c ? (a - r) / h : void 0,\n event: o,\n lengthComputable: a != null,\n [e ? \"download\" : \"upload\"]: !0\n };\n s(u);\n }, t);\n}, kr = (s, e) => {\n const t = s != null;\n return [(n) => e[0]({\n lengthComputable: t,\n total: s,\n loaded: n\n }), e[1]];\n}, Rr = (s) => (...e) => F.asap(() => s(...e)), Th = Re.hasStandardBrowserEnv ? /* @__PURE__ */ ((s, e) => (t) => (t = new URL(t, Re.origin), s.protocol === t.protocol && s.host === t.host && (e || s.port === t.port)))(\n new URL(Re.origin),\n Re.navigator && /(msie|trident)/i.test(Re.navigator.userAgent)\n) : () => !0, Eh = Re.hasStandardBrowserEnv ? (\n // Standard browser envs support document.cookie\n {\n write(s, e, t, n, i, o, r) {\n if (typeof document > \"u\") return;\n const a = [`${s}=${encodeURIComponent(e)}`];\n F.isNumber(t) && a.push(`expires=${new Date(t).toUTCString()}`), F.isString(n) && a.push(`path=${n}`), F.isString(i) && a.push(`domain=${i}`), o === !0 && a.push(\"secure\"), F.isString(r) && a.push(`SameSite=${r}`), document.cookie = a.join(\"; \");\n },\n read(s) {\n if (typeof document > \"u\") return null;\n const e = document.cookie.match(new RegExp(\"(?:^|; )\" + s + \"=([^;]*)\"));\n return e ? decodeURIComponent(e[1]) : null;\n },\n remove(s) {\n this.write(s, \"\", Date.now() - 864e5, \"/\");\n }\n }\n) : (\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {\n },\n read() {\n return null;\n },\n remove() {\n }\n }\n);\nfunction Mh(s) {\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(s);\n}\nfunction Ah(s, e) {\n return e ? s.replace(/\\/?\\/$/, \"\") + \"/\" + e.replace(/^\\/+/, \"\") : s;\n}\nfunction fa(s, e, t) {\n let n = !Mh(e);\n return s && (n || t == !1) ? Ah(s, e) : e;\n}\nconst Dr = (s) => s instanceof Fe ? { ...s } : s;\nfunction Yt(s, e) {\n e = e || {};\n const t = {};\n function n(h, c, u, d) {\n return F.isPlainObject(h) && F.isPlainObject(c) ? F.merge.call({ caseless: d }, h, c) : F.isPlainObject(c) ? F.merge({}, c) : F.isArray(c) ? c.slice() : c;\n }\n function i(h, c, u, d) {\n if (F.isUndefined(c)) {\n if (!F.isUndefined(h))\n return n(void 0, h, u, d);\n } else return n(h, c, u, d);\n }\n function o(h, c) {\n if (!F.isUndefined(c))\n return n(void 0, c);\n }\n function r(h, c) {\n if (F.isUndefined(c)) {\n if (!F.isUndefined(h))\n return n(void 0, h);\n } else return n(void 0, c);\n }\n function a(h, c, u) {\n if (u in e)\n return n(h, c);\n if (u in s)\n return n(void 0, h);\n }\n const l = {\n url: o,\n method: o,\n data: o,\n baseURL: r,\n transformRequest: r,\n transformResponse: r,\n paramsSerializer: r,\n timeout: r,\n timeoutMessage: r,\n withCredentials: r,\n withXSRFToken: r,\n adapter: r,\n responseType: r,\n xsrfCookieName: r,\n xsrfHeaderName: r,\n onUploadProgress: r,\n onDownloadProgress: r,\n decompress: r,\n maxContentLength: r,\n maxBodyLength: r,\n beforeRedirect: r,\n transport: r,\n httpAgent: r,\n httpsAgent: r,\n cancelToken: r,\n socketPath: r,\n responseEncoding: r,\n validateStatus: a,\n headers: (h, c, u) => i(Dr(h), Dr(c), u, !0)\n };\n return F.forEach(Object.keys({ ...s, ...e }), function(c) {\n const u = l[c] || i, d = u(s[c], e[c], c);\n F.isUndefined(d) && u !== a || (t[c] = d);\n }), t;\n}\nconst da = (s) => {\n const e = Yt({}, s);\n let { data: t, withXSRFToken: n, xsrfHeaderName: i, xsrfCookieName: o, headers: r, auth: a } = e;\n if (e.headers = r = Fe.from(r), e.url = aa(fa(e.baseURL, e.url, e.allowAbsoluteUrls), s.params, s.paramsSerializer), a && r.set(\n \"Authorization\",\n \"Basic \" + btoa((a.username || \"\") + \":\" + (a.password ? unescape(encodeURIComponent(a.password)) : \"\"))\n ), F.isFormData(t)) {\n if (Re.hasStandardBrowserEnv || Re.hasStandardBrowserWebWorkerEnv)\n r.setContentType(void 0);\n else if (F.isFunction(t.getHeaders)) {\n const l = t.getHeaders(), h = [\"content-type\", \"content-length\"];\n Object.entries(l).forEach(([c, u]) => {\n h.includes(c.toLowerCase()) && r.set(c, u);\n });\n }\n }\n if (Re.hasStandardBrowserEnv && (n && F.isFunction(n) && (n = n(e)), n || n !== !1 && Th(e.url))) {\n const l = i && o && Eh.read(o);\n l && r.set(i, l);\n }\n return e;\n}, Ch = typeof XMLHttpRequest < \"u\", Ph = Ch && function(s) {\n return new Promise(function(t, n) {\n const i = da(s);\n let o = i.data;\n const r = Fe.from(i.headers).normalize();\n let { responseType: a, onUploadProgress: l, onDownloadProgress: h } = i, c, u, d, p, f;\n function m() {\n p && p(), f && f(), i.cancelToken && i.cancelToken.unsubscribe(c), i.signal && i.signal.removeEventListener(\"abort\", c);\n }\n let g = new XMLHttpRequest();\n g.open(i.method.toUpperCase(), i.url, !0), g.timeout = i.timeout;\n function y() {\n if (!g)\n return;\n const _ = Fe.from(\n \"getAllResponseHeaders\" in g && g.getAllResponseHeaders()\n ), b = {\n data: !a || a === \"text\" || a === \"json\" ? g.responseText : g.response,\n status: g.status,\n statusText: g.statusText,\n headers: _,\n config: s,\n request: g\n };\n ua(function(M) {\n t(M), m();\n }, function(M) {\n n(M), m();\n }, b), g = null;\n }\n \"onloadend\" in g ? g.onloadend = y : g.onreadystatechange = function() {\n !g || g.readyState !== 4 || g.status === 0 && !(g.responseURL && g.responseURL.indexOf(\"file:\") === 0) || setTimeout(y);\n }, g.onabort = function() {\n g && (n(new re(\"Request aborted\", re.ECONNABORTED, s, g)), g = null);\n }, g.onerror = function(x) {\n const b = x && x.message ? x.message : \"Network Error\", A = new re(b, re.ERR_NETWORK, s, g);\n A.event = x || null, n(A), g = null;\n }, g.ontimeout = function() {\n let x = i.timeout ? \"timeout of \" + i.timeout + \"ms exceeded\" : \"timeout exceeded\";\n const b = i.transitional || la;\n i.timeoutErrorMessage && (x = i.timeoutErrorMessage), n(new re(\n x,\n b.clarifyTimeoutError ? re.ETIMEDOUT : re.ECONNABORTED,\n s,\n g\n )), g = null;\n }, o === void 0 && r.setContentType(null), \"setRequestHeader\" in g && F.forEach(r.toJSON(), function(x, b) {\n g.setRequestHeader(b, x);\n }), F.isUndefined(i.withCredentials) || (g.withCredentials = !!i.withCredentials), a && a !== \"json\" && (g.responseType = i.responseType), h && ([d, f] = Ii(h, !0), g.addEventListener(\"progress\", d)), l && g.upload && ([u, p] = Ii(l), g.upload.addEventListener(\"progress\", u), g.upload.addEventListener(\"loadend\", p)), (i.cancelToken || i.signal) && (c = (_) => {\n g && (n(!_ || _.type ? new bn(null, s, g) : _), g.abort(), g = null);\n }, i.cancelToken && i.cancelToken.subscribe(c), i.signal && (i.signal.aborted ? c() : i.signal.addEventListener(\"abort\", c)));\n const w = bh(i.url);\n if (w && Re.protocols.indexOf(w) === -1) {\n n(new re(\"Unsupported protocol \" + w + \":\", re.ERR_BAD_REQUEST, s));\n return;\n }\n g.send(o || null);\n });\n}, kh = (s, e) => {\n const { length: t } = s = s ? s.filter(Boolean) : [];\n if (e || t) {\n let n = new AbortController(), i;\n const o = function(h) {\n if (!i) {\n i = !0, a();\n const c = h instanceof Error ? h : this.reason;\n n.abort(c instanceof re ? c : new bn(c instanceof Error ? c.message : c));\n }\n };\n let r = e && setTimeout(() => {\n r = null, o(new re(`timeout ${e} of ms exceeded`, re.ETIMEDOUT));\n }, e);\n const a = () => {\n s && (r && clearTimeout(r), r = null, s.forEach((h) => {\n h.unsubscribe ? h.unsubscribe(o) : h.removeEventListener(\"abort\", o);\n }), s = null);\n };\n s.forEach((h) => h.addEventListener(\"abort\", o));\n const { signal: l } = n;\n return l.unsubscribe = () => F.asap(a), l;\n }\n}, Rh = function* (s, e) {\n let t = s.byteLength;\n if (t < e) {\n yield s;\n return;\n }\n let n = 0, i;\n for (; n < t; )\n i = n + e, yield s.slice(n, i), n = i;\n}, Dh = async function* (s, e) {\n for await (const t of Lh(s))\n yield* Rh(t, e);\n}, Lh = async function* (s) {\n if (s[Symbol.asyncIterator]) {\n yield* s;\n return;\n }\n const e = s.getReader();\n try {\n for (; ; ) {\n const { done: t, value: n } = await e.read();\n if (t)\n break;\n yield n;\n }\n } finally {\n await e.cancel();\n }\n}, Lr = (s, e, t, n) => {\n const i = Dh(s, e);\n let o = 0, r, a = (l) => {\n r || (r = !0, n && n(l));\n };\n return new ReadableStream({\n async pull(l) {\n try {\n const { done: h, value: c } = await i.next();\n if (h) {\n a(), l.close();\n return;\n }\n let u = c.byteLength;\n if (t) {\n let d = o += u;\n t(d);\n }\n l.enqueue(new Uint8Array(c));\n } catch (h) {\n throw a(h), h;\n }\n },\n cancel(l) {\n return a(l), i.return();\n }\n }, {\n highWaterMark: 2\n });\n}, Br = 64 * 1024, { isFunction: Jn } = F, Bh = (({ Request: s, Response: e }) => ({\n Request: s,\n Response: e\n}))(F.global), {\n ReadableStream: Ir,\n TextEncoder: zr\n} = F.global, Nr = (s, ...e) => {\n try {\n return !!s(...e);\n } catch {\n return !1;\n }\n}, Ih = (s) => {\n s = F.merge.call({\n skipUndefined: !0\n }, Bh, s);\n const { fetch: e, Request: t, Response: n } = s, i = e ? Jn(e) : typeof fetch == \"function\", o = Jn(t), r = Jn(n);\n if (!i)\n return !1;\n const a = i && Jn(Ir), l = i && (typeof zr == \"function\" ? /* @__PURE__ */ ((f) => (m) => f.encode(m))(new zr()) : async (f) => new Uint8Array(await new t(f).arrayBuffer())), h = o && a && Nr(() => {\n let f = !1;\n const m = new t(Re.origin, {\n body: new Ir(),\n method: \"POST\",\n get duplex() {\n return f = !0, \"half\";\n }\n }).headers.has(\"Content-Type\");\n return f && !m;\n }), c = r && a && Nr(() => F.isReadableStream(new n(\"\").body)), u = {\n stream: c && ((f) => f.body)\n };\n i && [\"text\", \"arrayBuffer\", \"blob\", \"formData\", \"stream\"].forEach((f) => {\n !u[f] && (u[f] = (m, g) => {\n let y = m && m[f];\n if (y)\n return y.call(m);\n throw new re(`Response type '${f}' is not supported`, re.ERR_NOT_SUPPORT, g);\n });\n });\n const d = async (f) => {\n if (f == null)\n return 0;\n if (F.isBlob(f))\n return f.size;\n if (F.isSpecCompliantForm(f))\n return (await new t(Re.origin, {\n method: \"POST\",\n body: f\n }).arrayBuffer()).byteLength;\n if (F.isArrayBufferView(f) || F.isArrayBuffer(f))\n return f.byteLength;\n if (F.isURLSearchParams(f) && (f = f + \"\"), F.isString(f))\n return (await l(f)).byteLength;\n }, p = async (f, m) => {\n const g = F.toFiniteNumber(f.getContentLength());\n return g ?? d(m);\n };\n return async (f) => {\n let {\n url: m,\n method: g,\n data: y,\n signal: w,\n cancelToken: _,\n timeout: x,\n onDownloadProgress: b,\n onUploadProgress: A,\n responseType: M,\n headers: C,\n withCredentials: P = \"same-origin\",\n fetchOptions: k\n } = da(f), B = e || fetch;\n M = M ? (M + \"\").toLowerCase() : \"text\";\n let T = kh([w, _ && _.toAbortSignal()], x), D = null;\n const v = T && T.unsubscribe && (() => {\n T.unsubscribe();\n });\n let I;\n try {\n if (A && h && g !== \"get\" && g !== \"head\" && (I = await p(C, y)) !== 0) {\n let O = new t(m, {\n method: \"POST\",\n body: y,\n duplex: \"half\"\n }), N;\n if (F.isFormData(y) && (N = O.headers.get(\"content-type\")) && C.setContentType(N), O.body) {\n const [te, J] = kr(\n I,\n Ii(Rr(A))\n );\n y = Lr(O.body, Br, te, J);\n }\n }\n F.isString(P) || (P = P ? \"include\" : \"omit\");\n const q = o && \"credentials\" in t.prototype, H = {\n ...k,\n signal: T,\n method: g.toUpperCase(),\n headers: C.normalize().toJSON(),\n body: y,\n duplex: \"half\",\n credentials: q ? P : void 0\n };\n D = o && new t(m, H);\n let ee = await (o ? B(D, k) : B(m, H));\n const j = c && (M === \"stream\" || M === \"response\");\n if (c && (b || j && v)) {\n const O = {};\n [\"status\", \"statusText\", \"headers\"].forEach((K) => {\n O[K] = ee[K];\n });\n const N = F.toFiniteNumber(ee.headers.get(\"content-length\")), [te, J] = b && kr(\n N,\n Ii(Rr(b), !0)\n ) || [];\n ee = new n(\n Lr(ee.body, Br, te, () => {\n J && J(), v && v();\n }),\n O\n );\n }\n M = M || \"text\";\n let ne = await u[F.findKey(u, M) || \"text\"](ee, f);\n return !j && v && v(), await new Promise((O, N) => {\n ua(O, N, {\n data: ne,\n headers: Fe.from(ee.headers),\n status: ee.status,\n statusText: ee.statusText,\n config: f,\n request: D\n });\n });\n } catch (q) {\n throw v && v(), q && q.name === \"TypeError\" && /Load failed|fetch/i.test(q.message) ? Object.assign(\n new re(\"Network Error\", re.ERR_NETWORK, f, D),\n {\n cause: q.cause || q\n }\n ) : re.from(q, q && q.code, f, D);\n }\n };\n}, zh = /* @__PURE__ */ new Map(), pa = (s) => {\n let e = s && s.env || {};\n const { fetch: t, Request: n, Response: i } = e, o = [\n n,\n i,\n t\n ];\n let r = o.length, a = r, l, h, c = zh;\n for (; a--; )\n l = o[a], h = c.get(l), h === void 0 && c.set(l, h = a ? /* @__PURE__ */ new Map() : Ih(e)), c = h;\n return h;\n};\npa();\nconst rr = {\n http: Qc,\n xhr: Ph,\n fetch: {\n get: pa\n }\n};\nF.forEach(rr, (s, e) => {\n if (s) {\n try {\n Object.defineProperty(s, \"name\", { value: e });\n } catch {\n }\n Object.defineProperty(s, \"adapterName\", { value: e });\n }\n});\nconst Or = (s) => `- ${s}`, Nh = (s) => F.isFunction(s) || s === null || s === !1;\nfunction Oh(s, e) {\n s = F.isArray(s) ? s : [s];\n const { length: t } = s;\n let n, i;\n const o = {};\n for (let r = 0; r < t; r++) {\n n = s[r];\n let a;\n if (i = n, !Nh(n) && (i = rr[(a = String(n)).toLowerCase()], i === void 0))\n throw new re(`Unknown adapter '${a}'`);\n if (i && (F.isFunction(i) || (i = i.get(e))))\n break;\n o[a || \"#\" + r] = i;\n }\n if (!i) {\n const r = Object.entries(o).map(\n ([l, h]) => `adapter ${l} ` + (h === !1 ? \"is not supported by the environment\" : \"is not available in the build\")\n );\n let a = t ? r.length > 1 ? `since :\n` + r.map(Or).join(`\n`) : \" \" + Or(r[0]) : \"as no adapter specified\";\n throw new re(\n \"There is no suitable adapter to dispatch the request \" + a,\n \"ERR_NOT_SUPPORT\"\n );\n }\n return i;\n}\nconst ma = {\n /**\n * Resolve an adapter from a list of adapter names or functions.\n * @type {Function}\n */\n getAdapter: Oh,\n /**\n * Exposes all known adapters\n * @type {Object}\n */\n adapters: rr\n};\nfunction ns(s) {\n if (s.cancelToken && s.cancelToken.throwIfRequested(), s.signal && s.signal.aborted)\n throw new bn(null, s);\n}\nfunction Ur(s) {\n return ns(s), s.headers = Fe.from(s.headers), s.data = ts.call(\n s,\n s.transformRequest\n ), [\"post\", \"put\", \"patch\"].indexOf(s.method) !== -1 && s.headers.setContentType(\"application/x-www-form-urlencoded\", !1), ma.getAdapter(s.adapter || Vn.adapter, s)(s).then(function(n) {\n return ns(s), n.data = ts.call(\n s,\n s.transformResponse,\n n\n ), n.headers = Fe.from(n.headers), n;\n }, function(n) {\n return ha(n) || (ns(s), n && n.response && (n.response.data = ts.call(\n s,\n s.transformResponse,\n n.response\n ), n.response.headers = Fe.from(n.response.headers))), Promise.reject(n);\n });\n}\nconst ga = \"1.13.2\", qi = {};\n[\"object\", \"boolean\", \"number\", \"function\", \"string\", \"symbol\"].forEach((s, e) => {\n qi[s] = function(n) {\n return typeof n === s || \"a\" + (e < 1 ? \"n \" : \" \") + s;\n };\n});\nconst Fr = {};\nqi.transitional = function(e, t, n) {\n function i(o, r) {\n return \"[Axios v\" + ga + \"] Transitional option '\" + o + \"'\" + r + (n ? \". \" + n : \"\");\n }\n return (o, r, a) => {\n if (e === !1)\n throw new re(\n i(r, \" has been removed\" + (t ? \" in \" + t : \"\")),\n re.ERR_DEPRECATED\n );\n return t && !Fr[r] && (Fr[r] = !0, console.warn(\n i(\n r,\n \" has been deprecated since v\" + t + \" and will be removed in the near future\"\n )\n )), e ? e(o, r, a) : !0;\n };\n};\nqi.spelling = function(e) {\n return (t, n) => (console.warn(`${n} is likely a misspelling of ${e}`), !0);\n};\nfunction Uh(s, e, t) {\n if (typeof s != \"object\")\n throw new re(\"options must be an object\", re.ERR_BAD_OPTION_VALUE);\n const n = Object.keys(s);\n let i = n.length;\n for (; i-- > 0; ) {\n const o = n[i], r = e[o];\n if (r) {\n const a = s[o], l = a === void 0 || r(a, o, s);\n if (l !== !0)\n throw new re(\"option \" + o + \" must be \" + l, re.ERR_BAD_OPTION_VALUE);\n continue;\n }\n if (t !== !0)\n throw new re(\"Unknown option \" + o, re.ERR_BAD_OPTION);\n }\n}\nconst Ei = {\n assertOptions: Uh,\n validators: qi\n}, st = Ei.validators;\nlet qt = class {\n constructor(e) {\n this.defaults = e || {}, this.interceptors = {\n request: new Cr(),\n response: new Cr()\n };\n }\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(e, t) {\n try {\n return await this._request(e, t);\n } catch (n) {\n if (n instanceof Error) {\n let i = {};\n Error.captureStackTrace ? Error.captureStackTrace(i) : i = new Error();\n const o = i.stack ? i.stack.replace(/^.+\\n/, \"\") : \"\";\n try {\n n.stack ? o && !String(n.stack).endsWith(o.replace(/^.+\\n.+\\n/, \"\")) && (n.stack += `\n` + o) : n.stack = o;\n } catch {\n }\n }\n throw n;\n }\n }\n _request(e, t) {\n typeof e == \"string\" ? (t = t || {}, t.url = e) : t = e || {}, t = Yt(this.defaults, t);\n const { transitional: n, paramsSerializer: i, headers: o } = t;\n n !== void 0 && Ei.assertOptions(n, {\n silentJSONParsing: st.transitional(st.boolean),\n forcedJSONParsing: st.transitional(st.boolean),\n clarifyTimeoutError: st.transitional(st.boolean)\n }, !1), i != null && (F.isFunction(i) ? t.paramsSerializer = {\n serialize: i\n } : Ei.assertOptions(i, {\n encode: st.function,\n serialize: st.function\n }, !0)), t.allowAbsoluteUrls !== void 0 || (this.defaults.allowAbsoluteUrls !== void 0 ? t.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls : t.allowAbsoluteUrls = !0), Ei.assertOptions(t, {\n baseUrl: st.spelling(\"baseURL\"),\n withXsrfToken: st.spelling(\"withXSRFToken\")\n }, !0), t.method = (t.method || this.defaults.method || \"get\").toLowerCase();\n let r = o && F.merge(\n o.common,\n o[t.method]\n );\n o && F.forEach(\n [\"delete\", \"get\", \"head\", \"post\", \"put\", \"patch\", \"common\"],\n (f) => {\n delete o[f];\n }\n ), t.headers = Fe.concat(r, o);\n const a = [];\n let l = !0;\n this.interceptors.request.forEach(function(m) {\n typeof m.runWhen == \"function\" && m.runWhen(t) === !1 || (l = l && m.synchronous, a.unshift(m.fulfilled, m.rejected));\n });\n const h = [];\n this.interceptors.response.forEach(function(m) {\n h.push(m.fulfilled, m.rejected);\n });\n let c, u = 0, d;\n if (!l) {\n const f = [Ur.bind(this), void 0];\n for (f.unshift(...a), f.push(...h), d = f.length, c = Promise.resolve(t); u < d; )\n c = c.then(f[u++], f[u++]);\n return c;\n }\n d = a.length;\n let p = t;\n for (; u < d; ) {\n const f = a[u++], m = a[u++];\n try {\n p = f(p);\n } catch (g) {\n m.call(this, g);\n break;\n }\n }\n try {\n c = Ur.call(this, p);\n } catch (f) {\n return Promise.reject(f);\n }\n for (u = 0, d = h.length; u < d; )\n c = c.then(h[u++], h[u++]);\n return c;\n }\n getUri(e) {\n e = Yt(this.defaults, e);\n const t = fa(e.baseURL, e.url, e.allowAbsoluteUrls);\n return aa(t, e.params, e.paramsSerializer);\n }\n};\nF.forEach([\"delete\", \"get\", \"head\", \"options\"], function(e) {\n qt.prototype[e] = function(t, n) {\n return this.request(Yt(n || {}, {\n method: e,\n url: t,\n data: (n || {}).data\n }));\n };\n});\nF.forEach([\"post\", \"put\", \"patch\"], function(e) {\n function t(n) {\n return function(o, r, a) {\n return this.request(Yt(a || {}, {\n method: e,\n headers: n ? {\n \"Content-Type\": \"multipart/form-data\"\n } : {},\n url: o,\n data: r\n }));\n };\n }\n qt.prototype[e] = t(), qt.prototype[e + \"Form\"] = t(!0);\n});\nlet Fh = class ya {\n constructor(e) {\n if (typeof e != \"function\")\n throw new TypeError(\"executor must be a function.\");\n let t;\n this.promise = new Promise(function(o) {\n t = o;\n });\n const n = this;\n this.promise.then((i) => {\n if (!n._listeners) return;\n let o = n._listeners.length;\n for (; o-- > 0; )\n n._listeners[o](i);\n n._listeners = null;\n }), this.promise.then = (i) => {\n let o;\n const r = new Promise((a) => {\n n.subscribe(a), o = a;\n }).then(i);\n return r.cancel = function() {\n n.unsubscribe(o);\n }, r;\n }, e(function(o, r, a) {\n n.reason || (n.reason = new bn(o, r, a), t(n.reason));\n });\n }\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason)\n throw this.reason;\n }\n /**\n * Subscribe to the cancel signal\n */\n subscribe(e) {\n if (this.reason) {\n e(this.reason);\n return;\n }\n this._listeners ? this._listeners.push(e) : this._listeners = [e];\n }\n /**\n * Unsubscribe from the cancel signal\n */\n unsubscribe(e) {\n if (!this._listeners)\n return;\n const t = this._listeners.indexOf(e);\n t !== -1 && this._listeners.splice(t, 1);\n }\n toAbortSignal() {\n const e = new AbortController(), t = (n) => {\n e.abort(n);\n };\n return this.subscribe(t), e.signal.unsubscribe = () => this.unsubscribe(t), e.signal;\n }\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let e;\n return {\n token: new ya(function(i) {\n e = i;\n }),\n cancel: e\n };\n }\n};\nfunction Vh(s) {\n return function(t) {\n return s.apply(null, t);\n };\n}\nfunction jh(s) {\n return F.isObject(s) && s.isAxiosError === !0;\n}\nconst Ns = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n WebServerIsDown: 521,\n ConnectionTimedOut: 522,\n OriginIsUnreachable: 523,\n TimeoutOccurred: 524,\n SslHandshakeFailed: 525,\n InvalidSslCertificate: 526\n};\nObject.entries(Ns).forEach(([s, e]) => {\n Ns[e] = s;\n});\nfunction wa(s) {\n const e = new qt(s), t = Zo(qt.prototype.request, e);\n return F.extend(t, qt.prototype, e, { allOwnKeys: !0 }), F.extend(t, e, null, { allOwnKeys: !0 }), t.create = function(i) {\n return wa(Yt(s, i));\n }, t;\n}\nconst _e = wa(Vn);\n_e.Axios = qt;\n_e.CanceledError = bn;\n_e.CancelToken = Fh;\n_e.isCancel = ha;\n_e.VERSION = ga;\n_e.toFormData = Xi;\n_e.AxiosError = re;\n_e.Cancel = _e.CanceledError;\n_e.all = function(e) {\n return Promise.all(e);\n};\n_e.spread = Vh;\n_e.isAxiosError = jh;\n_e.mergeConfig = Yt;\n_e.AxiosHeaders = Fe;\n_e.formToJSON = (s) => ca(F.isHTMLForm(s) ? new FormData(s) : s);\n_e.getAdapter = ma.getAdapter;\n_e.HttpStatusCode = Ns;\n_e.default = _e;\nconst {\n Axios: pp,\n AxiosError: mp,\n CanceledError: gp,\n isCancel: yp,\n CancelToken: wp,\n VERSION: _p,\n all: xp,\n Cancel: bp,\n isAxiosError: vp,\n spread: Sp,\n toFormData: Tp,\n AxiosHeaders: Ep,\n HttpStatusCode: Mp,\n formToJSON: Ap,\n getAdapter: Cp,\n mergeConfig: Pp\n} = _e;\nfunction Hh(s, e) {\n var t;\n if (window.XMLHttpRequest ? t = new XMLHttpRequest() : window.ActiveXObject ? t = new window.ActiveXObject() : alert(\"请升级至最新版本的浏览器\"), t != null) {\n let n = s;\n t.open(\"GET\", n, !0), t.send(null), t.onreadystatechange = function() {\n t.readyState == 4 && t.status == 200 && (t.responseText.includes(\"\", 0) && t.responseText.includes(\"\", 0) && t.responseText.includes(\"\", 0) ? e(null) : e(t.responseText));\n }, t.onloadend = function() {\n t.readyState == 4 && t.status == 404 && t.status == 502 && e(null);\n };\n }\n}\nfunction Gh(s, e) {\n _e({\n method: \"get\",\n responseType: \"blob\",\n url: s\n }).then((t) => {\n let n = new window.File([t.data], \"zipFolder\", {\n type: \"zip\"\n });\n Ko.loadAsync(n).then((i) => {\n const o = /* @__PURE__ */ new Map(), r = [];\n for (let a in i.files) {\n if (i.files[a].dir)\n continue;\n const l = i.file(i.files[a].name);\n if (l) {\n const h = l.async(\"blob\").then((c) => {\n const u = URL.createObjectURL(c);\n o.set(\"/\" + i.files[a].name.replace(\"\\\\\", \"/\"), u);\n });\n r.push(h);\n }\n }\n Promise.all(r).then(() => {\n e(o);\n }).catch((a) => {\n console.error(\"解压zip文件失败:\", a), e(/* @__PURE__ */ new Map());\n });\n }).catch((i) => {\n console.error(\"加载zip文件失败:\", i), e(/* @__PURE__ */ new Map());\n });\n }).catch((t) => {\n console.error(\"下载zip文件失败:\", t), e(/* @__PURE__ */ new Map());\n });\n}\nfunction _a(s, e) {\n _e({\n method: \"get\",\n responseType: \"blob\",\n url: s\n }).then((n) => {\n let i = new window.File([n.data], \"semantics\", {\n type: \"zip\"\n });\n Ko.loadAsync(i).then((o) => {\n for (let r in o.files)\n o.file(o.files[r].name).async(\"blob\").then((l) => {\n t(l, \"utf-8\", function(h, c) {\n e(c);\n });\n });\n });\n });\n function t(n, i, o) {\n var r = new FileReader(), a = new Blob([n]);\n r.onload = function(l) {\n o(null, l.target.result);\n }, r.onerror = function(l) {\n o(l.error, null);\n }, r.readAsText(a, i);\n }\n}\nconst is = /* @__PURE__ */ new WeakMap();\nclass Wh extends zo {\n /**\n * Constructs a new Draco loader.\n *\n * @param {LoadingManager} [manager] - The loading manager.\n */\n constructor(e) {\n super(e), this.decoderPath = \"\", this.decoderConfig = {}, this.decoderBinary = null, this.decoderPending = null, this.workerLimit = 4, this.workerPool = [], this.workerNextTaskID = 1, this.workerSourceURL = \"\", this.defaultAttributeIDs = {\n position: \"POSITION\",\n normal: \"NORMAL\",\n color: \"COLOR\",\n uv: \"TEX_COORD\"\n }, this.defaultAttributeTypes = {\n position: \"Float32Array\",\n normal: \"Float32Array\",\n color: \"Float32Array\",\n uv: \"Float32Array\"\n };\n }\n /**\n * Provides configuration for the decoder libraries. Configuration cannot be changed after decoding begins.\n *\n * @param {string} path - The decoder path.\n * @return {DRACOLoader} A reference to this loader.\n */\n setDecoderPath(e) {\n return this.decoderPath = e, this;\n }\n /**\n * Provides configuration for the decoder libraries. Configuration cannot be changed after decoding begins.\n *\n * @param {{type:('js'|'wasm')}} config - The decoder config.\n * @return {DRACOLoader} A reference to this loader.\n */\n setDecoderConfig(e) {\n return this.decoderConfig = e, this;\n }\n /**\n * Sets the maximum number of Web Workers to be used during decoding.\n * A lower limit may be preferable if workers are also for other tasks in the application.\n *\n * @param {number} workerLimit - The worker limit.\n * @return {DRACOLoader} A reference to this loader.\n */\n setWorkerLimit(e) {\n return this.workerLimit = e, this;\n }\n /**\n * Starts loading from the given URL and passes the loaded Draco asset\n * to the `onLoad()` callback.\n *\n * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n * @param {onErrorCallback} onError - Executed when errors occur.\n */\n load(e, t, n, i) {\n const o = new Bi(this.manager);\n o.setPath(this.path), o.setResponseType(\"arraybuffer\"), o.setRequestHeader(this.requestHeader), o.setWithCredentials(this.withCredentials), o.load(e, (r) => {\n this.parse(r, t, i);\n }, n, i);\n }\n /**\n * Parses the given Draco data.\n *\n * @param {ArrayBuffer} buffer - The raw Draco data as an array buffer.\n * @param {function(BufferGeometry)} onLoad - Executed when the loading/parsing process has been finished.\n * @param {onErrorCallback} onError - Executed when errors occur.\n */\n parse(e, t, n = () => {\n }) {\n this.decodeDracoFile(e, t, null, null, Rt, n).catch(n);\n }\n //\n decodeDracoFile(e, t, n, i, o = lt, r = () => {\n }) {\n const a = {\n attributeIDs: n || this.defaultAttributeIDs,\n attributeTypes: i || this.defaultAttributeTypes,\n useUniqueIDs: !!n,\n vertexColorSpace: o\n };\n return this.decodeGeometry(e, a).then(t).catch(r);\n }\n decodeGeometry(e, t) {\n const n = JSON.stringify(t);\n if (is.has(e)) {\n const l = is.get(e);\n if (l.key === n)\n return l.promise;\n if (e.byteLength === 0)\n throw new Error(\n \"THREE.DRACOLoader: Unable to re-decode a buffer with different settings. Buffer has already been transferred.\"\n );\n }\n let i;\n const o = this.workerNextTaskID++, r = e.byteLength, a = this._getWorker(o, r).then((l) => (i = l, new Promise((h, c) => {\n i._callbacks[o] = { resolve: h, reject: c }, i.postMessage({ type: \"decode\", id: o, taskConfig: t, buffer: e }, [e]);\n }))).then((l) => this._createGeometry(l.geometry));\n return a.catch(() => !0).then(() => {\n i && o && this._releaseTask(i, o);\n }), is.set(e, {\n key: n,\n promise: a\n }), a;\n }\n _createGeometry(e) {\n const t = new Fi();\n e.index && t.setIndex(new at(e.index.array, 1));\n for (let n = 0; n < e.attributes.length; n++) {\n const { name: i, array: o, itemSize: r, stride: a, vertexColorSpace: l } = e.attributes[n];\n let h;\n if (r === a)\n h = new at(o, r);\n else {\n const c = new No(o, a);\n h = new Oo(c, r, 0);\n }\n i === \"color\" && (this._assignVertexColorSpace(h, l), h.normalized = !(o instanceof Float32Array)), t.setAttribute(i, h);\n }\n return t;\n }\n _assignVertexColorSpace(e, t) {\n if (t !== Rt) return;\n const n = new je();\n for (let i = 0, o = e.count; i < o; i++)\n n.fromBufferAttribute(e, i), Li.colorSpaceToWorking(n, Rt), e.setXYZ(i, n.r, n.g, n.b);\n }\n _loadLibrary(e, t) {\n const n = new Bi(this.manager);\n return n.setPath(this.decoderPath), n.setResponseType(t), n.setWithCredentials(this.withCredentials), new Promise((i, o) => {\n n.load(e, i, void 0, o);\n });\n }\n preload() {\n return this._initDecoder(), this;\n }\n _initDecoder() {\n if (this.decoderPending) return this.decoderPending;\n const e = typeof WebAssembly != \"object\" || this.decoderConfig.type === \"js\", t = [];\n return e ? t.push(this._loadLibrary(\"draco_decoder.js\", \"text\")) : (t.push(this._loadLibrary(\"draco_wasm_wrapper.js\", \"text\")), t.push(this._loadLibrary(\"draco_decoder.wasm\", \"arraybuffer\"))), this.decoderPending = Promise.all(t).then((n) => {\n const i = n[0];\n e || (this.decoderConfig.wasmBinary = n[1]);\n const o = Xh.toString(), r = [\n \"/* draco decoder */\",\n i,\n \"\",\n \"/* worker */\",\n o.substring(o.indexOf(\"{\") + 1, o.lastIndexOf(\"}\"))\n ].join(`\n`);\n this.workerSourceURL = URL.createObjectURL(new Blob([r]));\n }), this.decoderPending;\n }\n _getWorker(e, t) {\n return this._initDecoder().then(() => {\n if (this.workerPool.length < this.workerLimit) {\n const i = new Worker(this.workerSourceURL);\n i._callbacks = {}, i._taskCosts = {}, i._taskLoad = 0, i.postMessage({ type: \"init\", decoderConfig: this.decoderConfig }), i.onmessage = function(o) {\n const r = o.data;\n switch (r.type) {\n case \"decode\":\n i._callbacks[r.id].resolve(r);\n break;\n case \"error\":\n i._callbacks[r.id].reject(r);\n break;\n default:\n console.error('THREE.DRACOLoader: Unexpected message, \"' + r.type + '\"');\n }\n }, this.workerPool.push(i);\n } else\n this.workerPool.sort(function(i, o) {\n return i._taskLoad > o._taskLoad ? -1 : 1;\n });\n const n = this.workerPool[this.workerPool.length - 1];\n return n._taskCosts[e] = t, n._taskLoad += t, n;\n });\n }\n _releaseTask(e, t) {\n e._taskLoad -= e._taskCosts[t], delete e._callbacks[t], delete e._taskCosts[t];\n }\n debug() {\n console.log(\"Task load: \", this.workerPool.map((e) => e._taskLoad));\n }\n dispose() {\n for (let e = 0; e < this.workerPool.length; ++e)\n this.workerPool[e].terminate();\n return this.workerPool.length = 0, this.workerSourceURL !== \"\" && URL.revokeObjectURL(this.workerSourceURL), this;\n }\n}\nfunction Xh() {\n let s, e;\n onmessage = function(r) {\n const a = r.data;\n switch (a.type) {\n case \"init\":\n s = a.decoderConfig, e = new Promise(function(c) {\n s.onModuleLoaded = function(u) {\n c({ draco: u });\n }, DracoDecoderModule(s);\n });\n break;\n case \"decode\":\n const l = a.buffer, h = a.taskConfig;\n e.then((c) => {\n const u = c.draco, d = new u.Decoder();\n try {\n const p = t(u, d, new Int8Array(l), h), f = p.attributes.map((m) => m.array.buffer);\n p.index && f.push(p.index.array.buffer), self.postMessage({ type: \"decode\", id: a.id, geometry: p }, f);\n } catch (p) {\n console.error(p), self.postMessage({ type: \"error\", id: a.id, error: p.message });\n } finally {\n u.destroy(d);\n }\n });\n break;\n }\n };\n function t(r, a, l, h) {\n const c = h.attributeIDs, u = h.attributeTypes;\n let d, p;\n const f = a.GetEncodedGeometryType(l);\n if (f === r.TRIANGULAR_MESH)\n d = new r.Mesh(), p = a.DecodeArrayToMesh(l, l.byteLength, d);\n else if (f === r.POINT_CLOUD)\n d = new r.PointCloud(), p = a.DecodeArrayToPointCloud(l, l.byteLength, d);\n else\n throw new Error(\"THREE.DRACOLoader: Unexpected geometry type.\");\n if (!p.ok() || d.ptr === 0)\n throw new Error(\"THREE.DRACOLoader: Decoding failed: \" + p.error_msg());\n const m = { index: null, attributes: [] };\n for (const g in c) {\n const y = self[u[g]];\n let w, _;\n if (h.useUniqueIDs)\n _ = c[g], w = a.GetAttributeByUniqueId(d, _);\n else {\n if (_ = a.GetAttributeId(d, r[c[g]]), _ === -1) continue;\n w = a.GetAttribute(d, _);\n }\n const x = i(r, a, d, g, y, w);\n g === \"color\" && (x.vertexColorSpace = h.vertexColorSpace), m.attributes.push(x);\n }\n return f === r.TRIANGULAR_MESH && (m.index = n(r, a, d)), r.destroy(d), m;\n }\n function n(r, a, l) {\n const c = l.num_faces() * 3, u = c * 4, d = r._malloc(u);\n a.GetTrianglesUInt32Array(l, u, d);\n const p = new Uint32Array(r.HEAPF32.buffer, d, c).slice();\n return r._free(d), { array: p, itemSize: 1 };\n }\n function i(r, a, l, h, c, u) {\n const d = l.num_points(), p = u.num_components(), f = o(r, c), m = p * c.BYTES_PER_ELEMENT, g = Math.ceil(m / 4) * 4, y = g / c.BYTES_PER_ELEMENT, w = d * m, _ = d * g, x = r._malloc(w);\n a.GetAttributeDataArrayForAllPoints(l, u, f, w, x);\n const b = new c(r.HEAPF32.buffer, x, w / c.BYTES_PER_ELEMENT);\n let A;\n if (m === g)\n A = b.slice();\n else {\n A = new c(_ / c.BYTES_PER_ELEMENT);\n let M = 0;\n for (let C = 0, P = b.length; C < P; C++) {\n for (let k = 0; k < p; k++)\n A[M + k] = b[C * p + k];\n M += y;\n }\n }\n return r._free(x), {\n name: h,\n count: d,\n itemSize: p,\n array: A,\n stride: y\n };\n }\n function o(r, a) {\n switch (a) {\n case Float32Array:\n return r.DT_FLOAT32;\n case Int8Array:\n return r.DT_INT8;\n case Int16Array:\n return r.DT_INT16;\n case Int32Array:\n return r.DT_INT32;\n case Uint8Array:\n return r.DT_UINT8;\n case Uint16Array:\n return r.DT_UINT16;\n case Uint32Array:\n return r.DT_UINT32;\n }\n }\n}\nvar _n = /* @__PURE__ */ ((s) => (s.ModelLoadStart = \"model-load-start\", s.ModelLoadProgress = \"model-load-progress\", s.ModelLoaded = \"model-loaded\", s.ModelError = \"model-error\", s.SelectionChanged = \"selection-changed\", s.HoverChanged = \"hover-changed\", s.Click = \"click\", s.MouseMove = \"mouse-move\", s.CameraChanged = \"camera-changed\", s.CameraIdle = \"camera-idle\", s.ViewportResize = \"viewport-resize\", s.EngineFree = \"engine-free\", s.EngineBusy = \"engine-busy\", s))(_n || {});\nfunction qh(s, e, t, n) {\n let i = 0, o = 0, r = 0, a = s.models.find((p) => p.url == t), l = e.circularMeps, h = e.rectMeps.filter((p) => p.type === \"风管\"), c = e.rectMeps.filter((p) => p.type === \"桥架\"), u = e.ellipseMeps, d = s.scene;\n if (new E.MeshBasicMaterial(), new E.BufferGeometry(), Qn(d, \"InstancedMesh\"), l && l.length) {\n let p = [];\n for (let f of l)\n f.color = new E.Color(`rgb(${f.color})`), f.position = {\n x: f.startPoint.X * 0.3048 + i,\n y: f.startPoint.Z * 0.3048 + o,\n z: -f.startPoint.Y * 0.3048 + r\n }, f.rotation = {\n x: 0,\n y: 0,\n z: 0\n }, a.nodesMap.set(f.id, [f]), p.push(f);\n ei(\"Circle\", d, p, 2);\n }\n if (Qn(d, \"InstancedMesh\"), h && h.length) {\n let p = [];\n for (let f of h)\n f.color = new E.Color(`rgb(${f.color})`), f.position = {\n x: f.startPoint.X * 0.3048 + i,\n y: f.startPoint.Z * 0.3048 + o,\n z: -f.startPoint.Y * 0.3048 + r\n }, f.rotation = {\n x: 0,\n y: 0,\n z: 0\n }, a.nodesMap.set(f.id, [f]), p.push(f);\n ei(\"Rect\", d, p, 3);\n }\n if (Qn(d, \"InstancedMesh\"), u && u.length) {\n let p = [];\n for (let f of u)\n f.color = new E.Color(`rgb(${f.color})`), f.position = {\n x: f.startPoint.X * 0.3048 + i,\n y: f.startPoint.Z * 0.3048 + o,\n z: -f.startPoint.Y * 0.3048 + r\n }, f.rotation = {\n x: 0,\n y: 0,\n z: 0\n }, a.nodesMap.set(f.id, [f]), p.push(f);\n ei(\"Ellipse\", d, p, 4);\n }\n if (Qn(d, \"InstancedMesh\"), c && c.length) {\n let p = [];\n for (let f of c)\n f.color = new E.Color(`rgb(${f.color})`), f.position = {\n x: f.startPoint.X * 0.3048 + i,\n y: f.startPoint.Z * 0.3048 + o,\n z: -f.startPoint.Y * 0.3048 + r\n }, f.rotation = {\n x: 0,\n y: 0,\n z: 0\n }, a.nodesMap.set(f.id, [f]), p.push(f);\n ei(\"Bridge\", d, p, 5);\n }\n}\nfunction Qn(s, e) {\n let t = new E.InstancedMesh(e.geometry, e.material, 1);\n t.index = e.index, t.dataType = e.type, t.url = e.url, t.relativeIndex = e.relativeIndex, t.name = \"机电\", s.add(t);\n}\nfunction ei(s, e, t, n, i) {\n let o, r, a = {\n width: 1,\n height: 1,\n length: 1,\n diameter: 1,\n color: new E.Color(),\n position: {\n x: 0,\n y: 0,\n z: 0\n },\n rotation: {\n x: 0,\n y: 0,\n z: 0\n }\n };\n switch (s) {\n case \"Rect\":\n r = ti(\"Rect\", a);\n break;\n case \"Bridge\":\n r = ti(\"Bridge\", a);\n break;\n case \"Circle\":\n r = ti(\"Circle\", a);\n break;\n case \"Ellipse\":\n r = ti(\"Ellipse\", a);\n break;\n }\n r && (o = new E.InstancedMesh(r.geometry, r.material, t.length));\n let l = [];\n for (var h = 0; h < t.length; h++) {\n let d = t[h], p = new E.Vector3(d.startPoint.X, 0, -d.startPoint.Y), f = new E.Vector3(d.endPoint.X, 0, -d.endPoint.Y), m = new E.Vector3(d.startPoint.X, d.startPoint.Z, -d.startPoint.Y), g = new E.Vector3(d.endPoint.X, d.endPoint.Z, -d.endPoint.Y), y = 0, w = 0, _ = 0;\n if (Math.abs(f.clone().sub(p.clone()).z) < 0.01 && Math.abs(f.clone().sub(p.clone()).x) < 0.01) {\n if (y = (d.startPoint.Z > d.endPoint.Z ? 1 : -1) * Math.PI * 0.5, d.base_x != null) {\n var c = new E.Vector3(d.base_x.X, 0, -d.base_x.Y);\n w = (c.clone().cross(new E.Vector3(0, 0, 1)).y <= 0 ? 1 : -1) * c.angleTo(new E.Vector3(0, 0, 1)) + Math.PI * 0.5;\n }\n } else\n w = (f.clone().sub(p.clone()).cross(new E.Vector3(0, 0, 1)).y > 0 ? -1 : 1) * f.clone().sub(p.clone()).angleTo(new E.Vector3(0, 0, 1)), y = (d.startPoint.Z > d.endPoint.Z ? 1 : -1) * f.clone().sub(p.clone()).angleTo(g.clone().sub(m.clone()));\n let x = new E.Matrix4();\n const b = new E.Euler(y, w, _, \"YXZ\");\n let A = x.clone().makeRotationFromEuler(b), M, C;\n s === \"Circle\" ? (M = d.diameter, C = d.diameter) : (M = d.width, C = d.height);\n let P = x.clone().makeScale(M, C, d.length);\n x.multiplyMatrices(A, P), x.setPosition(d.position.x, d.position.y, d.position.z), o.setMatrixAt(h, x.clone()), o.setColorAt(h, d.color), o.geometry.computeBoundingBox();\n let k = o.geometry.boundingBox.min.clone().applyMatrix4(x.clone()), B = o.geometry.boundingBox.max.clone().applyMatrix4(x.clone()), T = new E.Vector3(Math.min(k.x, B.x), Math.min(k.y, B.y), Math.min(k.z, B.z)), D = new E.Vector3(Math.max(k.x, B.x), Math.max(k.y, B.y), Math.max(k.z, B.z)), v = T.clone().add(D.clone()).multiplyScalar(0.5), I = {\n name: d.name,\n min: T,\n max: D,\n center: v,\n dbid: h,\n // url: path + \"/\" + type,\n // basePath: url,\n // relativePath: relativePath,\n materialName: r.material.name\n }, q = null, H = null;\n s === \"Circle\" && (q = {\n x: d.startPoint.X * 0.3048,\n y: d.startPoint.Z * 0.3048,\n z: -d.startPoint.Y * 0.3048\n }, H = {\n x: d.endPoint.X * 0.3048,\n y: d.endPoint.Z * 0.3048,\n z: -d.endPoint.Y * 0.3048\n }, I.minC = q, I.maxC = H), l.push(I);\n }\n o.castShadow = !0, o.ElementInfos = l, o.name = \"rootModel\", o.TypeName = \"InstancedMesh-Pipe\", o.PipeType = s, o.MeshId = null, o.realMaterial = o.material.clone(), o.originalMaterial = o.material.clone();\n let u = [];\n u = {\n geometry: o.geometry,\n matrix: o.matrix,\n position: o.position,\n rotation: o.rotation\n }, o.meshs = u, o.instanceMatrix && o.instanceMatrix.array && (o.cloneInstanceMatrix = Array.from(o.instanceMatrix.array)), o.index = n, o.Version = \"V1\", e.children[n] = o;\n}\nfunction ti(s, e, t) {\n let n = new E.Shape();\n switch (e.width = e.width * 0.3048, e.height = e.height * 0.3048, e.diameter = e.diameter * 0.3048, s) {\n case \"Rect\":\n n.moveTo(-e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, e.height / 2), n.lineTo(e.width / 2, e.height / 2), n.lineTo(e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, -e.height / 2);\n break;\n case \"Ellipse\":\n n.moveTo(-e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, e.height / 2), n.lineTo(e.width / 2, e.height / 2), n.lineTo(e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, -e.height / 2);\n break;\n case \"Bridge\":\n n.moveTo(-e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, e.height / 2), n.lineTo(-e.width / 2 + 0.01, e.height / 2), n.lineTo(-e.width / 2 + 0.01, -e.height / 2 + 0.01), n.lineTo(e.width / 2 - 0.01, -e.height / 2 + 0.01), n.lineTo(e.width / 2 - 0.01, e.height / 2), n.lineTo(e.width / 2, e.height / 2), n.lineTo(e.width / 2, -e.height / 2), n.lineTo(-e.width / 2, -e.height / 2);\n break;\n case \"Circle\":\n n.moveTo(0, 0), n.absarc(0, 0, e.diameter * 0.5, 0, Math.PI * 2, !1);\n break;\n }\n const i = {\n depth: e.length * 0.3048,\n //拉伸长度\n bevelEnabled: !1\n };\n return o(n, i, e.color, e.position, e.rotation);\n function o(r, a, l, h, c) {\n let u = new E.ExtrudeGeometry(r, a), d = new E.MeshPhongMaterial({\n color: l,\n side: E.DoubleSide\n // depthTest:false\n // name: path + \"/\" + type + \"/material\"\n }), p = new E.Mesh(u, d);\n return p.position.set(h.x, h.y, h.z), p.rotation._order = \"YXZ\", p.rotation.set(c.x, c.y, c.z), p;\n }\n}\nfunction Kh(s, e = !1) {\n const t = s[0].index !== null, n = new Set(Object.keys(s[0].attributes)), i = new Set(Object.keys(s[0].morphAttributes)), o = {}, r = {}, a = s[0].morphTargetsRelative, l = new Fi();\n let h = 0;\n for (let c = 0; c < s.length; ++c) {\n const u = s[c];\n let d = 0;\n if (t !== (u.index !== null))\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"), null;\n for (const p in u.attributes) {\n if (!n.has(p))\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + '. All geometries must have compatible attributes; make sure \"' + p + '\" attribute exists among all geometries, or in none of them.'), null;\n o[p] === void 0 && (o[p] = []), o[p].push(u.attributes[p]), d++;\n }\n if (d !== n.size)\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". Make sure all geometries have the same number of attributes.\"), null;\n if (a !== u.morphTargetsRelative)\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". .morphTargetsRelative must be consistent throughout all geometries.\"), null;\n for (const p in u.morphAttributes) {\n if (!i.has(p))\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". .morphAttributes must be consistent throughout all geometries.\"), null;\n r[p] === void 0 && (r[p] = []), r[p].push(u.morphAttributes[p]);\n }\n if (e) {\n let p;\n if (t)\n p = u.index.count;\n else if (u.attributes.position !== void 0)\n p = u.attributes.position.count;\n else\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index \" + c + \". The geometry must have either an index or a position attribute\"), null;\n l.addGroup(h, p, c), h += p;\n }\n }\n if (t) {\n let c = 0;\n const u = [];\n for (let d = 0; d < s.length; ++d) {\n const p = s[d].index;\n for (let f = 0; f < p.count; ++f)\n u.push(p.getX(f) + c);\n c += s[d].attributes.position.count;\n }\n l.setIndex(u);\n }\n for (const c in o) {\n const u = Vr(o[c]);\n if (!u)\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the \" + c + \" attribute.\"), null;\n l.setAttribute(c, u);\n }\n for (const c in r) {\n const u = r[c][0].length;\n if (u === 0) break;\n l.morphAttributes = l.morphAttributes || {}, l.morphAttributes[c] = [];\n for (let d = 0; d < u; ++d) {\n const p = [];\n for (let m = 0; m < r[c].length; ++m)\n p.push(r[c][m][d]);\n const f = Vr(p);\n if (!f)\n return console.error(\"THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the \" + c + \" morphAttribute.\"), null;\n l.morphAttributes[c].push(f);\n }\n }\n return l;\n}\nfunction Vr(s) {\n let e, t, n, i = -1, o = 0;\n for (let h = 0; h < s.length; ++h) {\n const c = s[h];\n if (e === void 0 && (e = c.array.constructor), e !== c.array.constructor)\n return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"), null;\n if (t === void 0 && (t = c.itemSize), t !== c.itemSize)\n return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"), null;\n if (n === void 0 && (n = c.normalized), n !== c.normalized)\n return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"), null;\n if (i === -1 && (i = c.gpuType), i !== c.gpuType)\n return console.error(\"THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.\"), null;\n o += c.count * t;\n }\n const r = new e(o), a = new at(r, t, n);\n let l = 0;\n for (let h = 0; h < s.length; ++h) {\n const c = s[h];\n if (c.isInterleavedBufferAttribute) {\n const u = l / t;\n for (let d = 0, p = c.count; d < p; d++)\n for (let f = 0; f < t; f++) {\n const m = c.getComponent(d, f);\n a.setComponent(d + u, f, m);\n }\n } else\n r.set(c.array, l);\n l += c.count * t;\n }\n return i !== void 0 && (a.gpuType = i), a;\n}\nfunction jr(s, e) {\n if (e === nl)\n return console.warn(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.\"), s;\n if (e === Rs || e === Uo) {\n let t = s.getIndex();\n if (t === null) {\n const r = [], a = s.getAttribute(\"position\");\n if (a !== void 0) {\n for (let l = 0; l < a.count; l++)\n r.push(l);\n s.setIndex(r), t = s.getIndex();\n } else\n return console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\"), s;\n }\n const n = t.count - 2, i = [];\n if (e === Rs)\n for (let r = 1; r <= n; r++)\n i.push(t.getX(0)), i.push(t.getX(r)), i.push(t.getX(r + 1));\n else\n for (let r = 0; r < n; r++)\n r % 2 === 0 ? (i.push(t.getX(r)), i.push(t.getX(r + 1)), i.push(t.getX(r + 2))) : (i.push(t.getX(r + 2)), i.push(t.getX(r + 1)), i.push(t.getX(r)));\n i.length / 3 !== n && console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n const o = s.clone();\n return o.setIndex(i), o.clearGroups(), o;\n } else\n return console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:\", e), s;\n}\nclass Zh extends zo {\n /**\n * Constructs a new glTF loader.\n *\n * @param {LoadingManager} [manager] - The loading manager.\n */\n constructor(e) {\n super(e), this.dracoLoader = null, this.ktx2Loader = null, this.meshoptDecoder = null, this.pluginCallbacks = [], this.register(function(t) {\n return new eu(t);\n }), this.register(function(t) {\n return new tu(t);\n }), this.register(function(t) {\n return new hu(t);\n }), this.register(function(t) {\n return new uu(t);\n }), this.register(function(t) {\n return new fu(t);\n }), this.register(function(t) {\n return new iu(t);\n }), this.register(function(t) {\n return new su(t);\n }), this.register(function(t) {\n return new ru(t);\n }), this.register(function(t) {\n return new ou(t);\n }), this.register(function(t) {\n return new Qh(t);\n }), this.register(function(t) {\n return new au(t);\n }), this.register(function(t) {\n return new nu(t);\n }), this.register(function(t) {\n return new cu(t);\n }), this.register(function(t) {\n return new lu(t);\n }), this.register(function(t) {\n return new $h(t);\n }), this.register(function(t) {\n return new du(t);\n }), this.register(function(t) {\n return new pu(t);\n });\n }\n /**\n * Starts loading from the given URL and passes the loaded glTF asset\n * to the `onLoad()` callback.\n *\n * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n * @param {function(GLTFLoader~LoadObject)} onLoad - Executed when the loading process has been finished.\n * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n * @param {onErrorCallback} onError - Executed when errors occur.\n */\n load(e, t, n, i) {\n const o = this;\n let r;\n if (this.resourcePath !== \"\")\n r = this.resourcePath;\n else if (this.path !== \"\") {\n const h = In.extractUrlBase(e);\n r = In.resolveURL(h, this.path);\n } else\n r = In.extractUrlBase(e);\n this.manager.itemStart(e);\n const a = function(h) {\n i ? i(h) : console.error(h), o.manager.itemError(e), o.manager.itemEnd(e);\n }, l = new Bi(this.manager);\n l.setPath(this.path), l.setResponseType(\"arraybuffer\"), l.setRequestHeader(this.requestHeader), l.setWithCredentials(this.withCredentials), l.load(e, function(h) {\n try {\n o.parse(h, r, function(c) {\n t(c), o.manager.itemEnd(e);\n }, a);\n } catch (c) {\n a(c);\n }\n }, n, a);\n }\n /**\n * Sets the given Draco loader to this loader. Required for decoding assets\n * compressed with the `KHR_draco_mesh_compression` extension.\n *\n * @param {DRACOLoader} dracoLoader - The Draco loader to set.\n * @return {GLTFLoader} A reference to this loader.\n */\n setDRACOLoader(e) {\n return this.dracoLoader = e, this;\n }\n /**\n * Sets the given KTX2 loader to this loader. Required for loading KTX2\n * compressed textures.\n *\n * @param {KTX2Loader} ktx2Loader - The KTX2 loader to set.\n * @return {GLTFLoader} A reference to this loader.\n */\n setKTX2Loader(e) {\n return this.ktx2Loader = e, this;\n }\n /**\n * Sets the given meshopt decoder. Required for decoding assets\n * compressed with the `EXT_meshopt_compression` extension.\n *\n * @param {Object} meshoptDecoder - The meshopt decoder to set.\n * @return {GLTFLoader} A reference to this loader.\n */\n setMeshoptDecoder(e) {\n return this.meshoptDecoder = e, this;\n }\n /**\n * Registers a plugin callback. This API is internally used to implement the various\n * glTF extensions but can also used by third-party code to add additional logic\n * to the loader.\n *\n * @param {function(parser:GLTFParser)} callback - The callback function to register.\n * @return {GLTFLoader} A reference to this loader.\n */\n register(e) {\n return this.pluginCallbacks.indexOf(e) === -1 && this.pluginCallbacks.push(e), this;\n }\n /**\n * Unregisters a plugin callback.\n *\n * @param {Function} callback - The callback function to unregister.\n * @return {GLTFLoader} A reference to this loader.\n */\n unregister(e) {\n return this.pluginCallbacks.indexOf(e) !== -1 && this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e), 1), this;\n }\n /**\n * Parses the given FBX data and returns the resulting group.\n *\n * @param {string|ArrayBuffer} data - The raw glTF data.\n * @param {string} path - The URL base path.\n * @param {function(GLTFLoader~LoadObject)} onLoad - Executed when the loading process has been finished.\n * @param {onErrorCallback} onError - Executed when errors occur.\n */\n parse(e, t, n, i) {\n let o;\n const r = {}, a = {}, l = new TextDecoder();\n if (typeof e == \"string\")\n o = JSON.parse(e);\n else if (e instanceof ArrayBuffer)\n if (l.decode(new Uint8Array(e, 0, 4)) === xa) {\n try {\n r[le.KHR_BINARY_GLTF] = new mu(e);\n } catch (u) {\n i && i(u);\n return;\n }\n o = JSON.parse(r[le.KHR_BINARY_GLTF].content);\n } else\n o = JSON.parse(l.decode(e));\n else\n o = e;\n if (o.asset === void 0 || o.asset.version[0] < 2) {\n i && i(new Error(\"THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.\"));\n return;\n }\n const h = new Cu(o, {\n path: t || this.resourcePath || \"\",\n crossOrigin: this.crossOrigin,\n requestHeader: this.requestHeader,\n manager: this.manager,\n ktx2Loader: this.ktx2Loader,\n meshoptDecoder: this.meshoptDecoder\n });\n h.fileLoader.setRequestHeader(this.requestHeader);\n for (let c = 0; c < this.pluginCallbacks.length; c++) {\n const u = this.pluginCallbacks[c](h);\n u.name || console.error(\"THREE.GLTFLoader: Invalid plugin found: missing name\"), a[u.name] = u, r[u.name] = !0;\n }\n if (o.extensionsUsed)\n for (let c = 0; c < o.extensionsUsed.length; ++c) {\n const u = o.extensionsUsed[c], d = o.extensionsRequired || [];\n switch (u) {\n case le.KHR_MATERIALS_UNLIT:\n r[u] = new Jh();\n break;\n case le.KHR_DRACO_MESH_COMPRESSION:\n r[u] = new gu(o, this.dracoLoader);\n break;\n case le.KHR_TEXTURE_TRANSFORM:\n r[u] = new yu();\n break;\n case le.KHR_MESH_QUANTIZATION:\n r[u] = new wu();\n break;\n default:\n d.indexOf(u) >= 0 && a[u] === void 0 && console.warn('THREE.GLTFLoader: Unknown extension \"' + u + '\".');\n }\n }\n h.setExtensions(r), h.setPlugins(a), h.parse(n, i);\n }\n /**\n * Async version of {@link GLTFLoader#parse}.\n *\n * @async\n * @param {string|ArrayBuffer} data - The raw glTF data.\n * @param {string} path - The URL base path.\n * @return {Promise} A Promise that resolves with the loaded glTF when the parsing has been finished.\n */\n parseAsync(e, t) {\n const n = this;\n return new Promise(function(i, o) {\n n.parse(e, t, i, o);\n });\n }\n}\nfunction Yh() {\n let s = {};\n return {\n get: function(e) {\n return s[e];\n },\n add: function(e, t) {\n s[e] = t;\n },\n remove: function(e) {\n delete s[e];\n },\n removeAll: function() {\n s = {};\n }\n };\n}\nconst le = {\n KHR_BINARY_GLTF: \"KHR_binary_glTF\",\n KHR_DRACO_MESH_COMPRESSION: \"KHR_draco_mesh_compression\",\n KHR_LIGHTS_PUNCTUAL: \"KHR_lights_punctual\",\n KHR_MATERIALS_CLEARCOAT: \"KHR_materials_clearcoat\",\n KHR_MATERIALS_DISPERSION: \"KHR_materials_dispersion\",\n KHR_MATERIALS_IOR: \"KHR_materials_ior\",\n KHR_MATERIALS_SHEEN: \"KHR_materials_sheen\",\n KHR_MATERIALS_SPECULAR: \"KHR_materials_specular\",\n KHR_MATERIALS_TRANSMISSION: \"KHR_materials_transmission\",\n KHR_MATERIALS_IRIDESCENCE: \"KHR_materials_iridescence\",\n KHR_MATERIALS_ANISOTROPY: \"KHR_materials_anisotropy\",\n KHR_MATERIALS_UNLIT: \"KHR_materials_unlit\",\n KHR_MATERIALS_VOLUME: \"KHR_materials_volume\",\n KHR_TEXTURE_BASISU: \"KHR_texture_basisu\",\n KHR_TEXTURE_TRANSFORM: \"KHR_texture_transform\",\n KHR_MESH_QUANTIZATION: \"KHR_mesh_quantization\",\n KHR_MATERIALS_EMISSIVE_STRENGTH: \"KHR_materials_emissive_strength\",\n EXT_MATERIALS_BUMP: \"EXT_materials_bump\",\n EXT_TEXTURE_WEBP: \"EXT_texture_webp\",\n EXT_TEXTURE_AVIF: \"EXT_texture_avif\",\n EXT_MESHOPT_COMPRESSION: \"EXT_meshopt_compression\",\n EXT_MESH_GPU_INSTANCING: \"EXT_mesh_gpu_instancing\"\n};\nclass $h {\n constructor(e) {\n this.parser = e, this.name = le.KHR_LIGHTS_PUNCTUAL, this.cache = { refs: {}, uses: {} };\n }\n _markDefs() {\n const e = this.parser, t = this.parser.json.nodes || [];\n for (let n = 0, i = t.length; n < i; n++) {\n const o = t[n];\n o.extensions && o.extensions[this.name] && o.extensions[this.name].light !== void 0 && e._addNodeRef(this.cache, o.extensions[this.name].light);\n }\n }\n _loadLight(e) {\n const t = this.parser, n = \"light:\" + e;\n let i = t.cache.get(n);\n if (i) return i;\n const o = t.json, l = ((o.extensions && o.extensions[this.name] || {}).lights || [])[e];\n let h;\n const c = new je(16777215);\n l.color !== void 0 && c.setRGB(l.color[0], l.color[1], l.color[2], lt);\n const u = l.range !== void 0 ? l.range : 0;\n switch (l.type) {\n case \"directional\":\n h = new rl(c), h.target.position.set(0, 0, -1), h.add(h.target);\n break;\n case \"point\":\n h = new sl(c), h.distance = u;\n break;\n case \"spot\":\n h = new il(c), h.distance = u, l.spot = l.spot || {}, l.spot.innerConeAngle = l.spot.innerConeAngle !== void 0 ? l.spot.innerConeAngle : 0, l.spot.outerConeAngle = l.spot.outerConeAngle !== void 0 ? l.spot.outerConeAngle : Math.PI / 4, h.angle = l.spot.outerConeAngle, h.penumbra = 1 - l.spot.innerConeAngle / l.spot.outerConeAngle, h.target.position.set(0, 0, -1), h.add(h.target);\n break;\n default:\n throw new Error(\"THREE.GLTFLoader: Unexpected light type: \" + l.type);\n }\n return h.position.set(0, 0, 0), rt(h, l), l.intensity !== void 0 && (h.intensity = l.intensity), h.name = t.createUniqueName(l.name || \"light_\" + e), i = Promise.resolve(h), t.cache.add(n, i), i;\n }\n getDependency(e, t) {\n if (e === \"light\")\n return this._loadLight(t);\n }\n createNodeAttachment(e) {\n const t = this, n = this.parser, o = n.json.nodes[e], a = (o.extensions && o.extensions[this.name] || {}).light;\n return a === void 0 ? null : this._loadLight(a).then(function(l) {\n return n._getNodeRef(t.cache, a, l);\n });\n }\n}\nclass Jh {\n constructor() {\n this.name = le.KHR_MATERIALS_UNLIT;\n }\n getMaterialType() {\n return hn;\n }\n extendParams(e, t, n) {\n const i = [];\n e.color = new je(1, 1, 1), e.opacity = 1;\n const o = t.pbrMetallicRoughness;\n if (o) {\n if (Array.isArray(o.baseColorFactor)) {\n const r = o.baseColorFactor;\n e.color.setRGB(r[0], r[1], r[2], lt), e.opacity = r[3];\n }\n o.baseColorTexture !== void 0 && i.push(n.assignTexture(e, \"map\", o.baseColorTexture, Rt));\n }\n return Promise.all(i);\n }\n}\nclass Qh {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_EMISSIVE_STRENGTH;\n }\n extendMaterialParams(e, t) {\n const i = this.parser.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = i.extensions[this.name].emissiveStrength;\n return o !== void 0 && (t.emissiveIntensity = o), Promise.resolve();\n }\n}\nclass eu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_CLEARCOAT;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = [], r = i.extensions[this.name];\n if (r.clearcoatFactor !== void 0 && (t.clearcoat = r.clearcoatFactor), r.clearcoatTexture !== void 0 && o.push(n.assignTexture(t, \"clearcoatMap\", r.clearcoatTexture)), r.clearcoatRoughnessFactor !== void 0 && (t.clearcoatRoughness = r.clearcoatRoughnessFactor), r.clearcoatRoughnessTexture !== void 0 && o.push(n.assignTexture(t, \"clearcoatRoughnessMap\", r.clearcoatRoughnessTexture)), r.clearcoatNormalTexture !== void 0 && (o.push(n.assignTexture(t, \"clearcoatNormalMap\", r.clearcoatNormalTexture)), r.clearcoatNormalTexture.scale !== void 0)) {\n const a = r.clearcoatNormalTexture.scale;\n t.clearcoatNormalScale = new ce(a, a);\n }\n return Promise.all(o);\n }\n}\nclass tu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_DISPERSION;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const i = this.parser.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = i.extensions[this.name];\n return t.dispersion = o.dispersion !== void 0 ? o.dispersion : 0, Promise.resolve();\n }\n}\nclass nu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_IRIDESCENCE;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = [], r = i.extensions[this.name];\n return r.iridescenceFactor !== void 0 && (t.iridescence = r.iridescenceFactor), r.iridescenceTexture !== void 0 && o.push(n.assignTexture(t, \"iridescenceMap\", r.iridescenceTexture)), r.iridescenceIor !== void 0 && (t.iridescenceIOR = r.iridescenceIor), t.iridescenceThicknessRange === void 0 && (t.iridescenceThicknessRange = [100, 400]), r.iridescenceThicknessMinimum !== void 0 && (t.iridescenceThicknessRange[0] = r.iridescenceThicknessMinimum), r.iridescenceThicknessMaximum !== void 0 && (t.iridescenceThicknessRange[1] = r.iridescenceThicknessMaximum), r.iridescenceThicknessTexture !== void 0 && o.push(n.assignTexture(t, \"iridescenceThicknessMap\", r.iridescenceThicknessTexture)), Promise.all(o);\n }\n}\nclass iu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_SHEEN;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = [];\n t.sheenColor = new je(0, 0, 0), t.sheenRoughness = 0, t.sheen = 1;\n const r = i.extensions[this.name];\n if (r.sheenColorFactor !== void 0) {\n const a = r.sheenColorFactor;\n t.sheenColor.setRGB(a[0], a[1], a[2], lt);\n }\n return r.sheenRoughnessFactor !== void 0 && (t.sheenRoughness = r.sheenRoughnessFactor), r.sheenColorTexture !== void 0 && o.push(n.assignTexture(t, \"sheenColorMap\", r.sheenColorTexture, Rt)), r.sheenRoughnessTexture !== void 0 && o.push(n.assignTexture(t, \"sheenRoughnessMap\", r.sheenRoughnessTexture)), Promise.all(o);\n }\n}\nclass su {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_TRANSMISSION;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = [], r = i.extensions[this.name];\n return r.transmissionFactor !== void 0 && (t.transmission = r.transmissionFactor), r.transmissionTexture !== void 0 && o.push(n.assignTexture(t, \"transmissionMap\", r.transmissionTexture)), Promise.all(o);\n }\n}\nclass ru {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_VOLUME;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = [], r = i.extensions[this.name];\n t.thickness = r.thicknessFactor !== void 0 ? r.thicknessFactor : 0, r.thicknessTexture !== void 0 && o.push(n.assignTexture(t, \"thicknessMap\", r.thicknessTexture)), t.attenuationDistance = r.attenuationDistance || 1 / 0;\n const a = r.attenuationColor || [1, 1, 1];\n return t.attenuationColor = new je().setRGB(a[0], a[1], a[2], lt), Promise.all(o);\n }\n}\nclass ou {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_IOR;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const i = this.parser.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = i.extensions[this.name];\n return t.ior = o.ior !== void 0 ? o.ior : 1.5, Promise.resolve();\n }\n}\nclass au {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_SPECULAR;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = [], r = i.extensions[this.name];\n t.specularIntensity = r.specularFactor !== void 0 ? r.specularFactor : 1, r.specularTexture !== void 0 && o.push(n.assignTexture(t, \"specularIntensityMap\", r.specularTexture));\n const a = r.specularColorFactor || [1, 1, 1];\n return t.specularColor = new je().setRGB(a[0], a[1], a[2], lt), r.specularColorTexture !== void 0 && o.push(n.assignTexture(t, \"specularColorMap\", r.specularColorTexture, Rt)), Promise.all(o);\n }\n}\nclass lu {\n constructor(e) {\n this.parser = e, this.name = le.EXT_MATERIALS_BUMP;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = [], r = i.extensions[this.name];\n return t.bumpScale = r.bumpFactor !== void 0 ? r.bumpFactor : 1, r.bumpTexture !== void 0 && o.push(n.assignTexture(t, \"bumpMap\", r.bumpTexture)), Promise.all(o);\n }\n}\nclass cu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_MATERIALS_ANISOTROPY;\n }\n getMaterialType(e) {\n const n = this.parser.json.materials[e];\n return !n.extensions || !n.extensions[this.name] ? null : ht;\n }\n extendMaterialParams(e, t) {\n const n = this.parser, i = n.json.materials[e];\n if (!i.extensions || !i.extensions[this.name])\n return Promise.resolve();\n const o = [], r = i.extensions[this.name];\n return r.anisotropyStrength !== void 0 && (t.anisotropy = r.anisotropyStrength), r.anisotropyRotation !== void 0 && (t.anisotropyRotation = r.anisotropyRotation), r.anisotropyTexture !== void 0 && o.push(n.assignTexture(t, \"anisotropyMap\", r.anisotropyTexture)), Promise.all(o);\n }\n}\nclass hu {\n constructor(e) {\n this.parser = e, this.name = le.KHR_TEXTURE_BASISU;\n }\n loadTexture(e) {\n const t = this.parser, n = t.json, i = n.textures[e];\n if (!i.extensions || !i.extensions[this.name])\n return null;\n const o = i.extensions[this.name], r = t.options.ktx2Loader;\n if (!r) {\n if (n.extensionsRequired && n.extensionsRequired.indexOf(this.name) >= 0)\n throw new Error(\"THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures\");\n return null;\n }\n return t.loadTextureImage(e, o.source, r);\n }\n}\nclass uu {\n constructor(e) {\n this.parser = e, this.name = le.EXT_TEXTURE_WEBP;\n }\n loadTexture(e) {\n const t = this.name, n = this.parser, i = n.json, o = i.textures[e];\n if (!o.extensions || !o.extensions[t])\n return null;\n const r = o.extensions[t], a = i.images[r.source];\n let l = n.textureLoader;\n if (a.uri) {\n const h = n.options.manager.getHandler(a.uri);\n h !== null && (l = h);\n }\n return n.loadTextureImage(e, r.source, l);\n }\n}\nclass fu {\n constructor(e) {\n this.parser = e, this.name = le.EXT_TEXTURE_AVIF;\n }\n loadTexture(e) {\n const t = this.name, n = this.parser, i = n.json, o = i.textures[e];\n if (!o.extensions || !o.extensions[t])\n return null;\n const r = o.extensions[t], a = i.images[r.source];\n let l = n.textureLoader;\n if (a.uri) {\n const h = n.options.manager.getHandler(a.uri);\n h !== null && (l = h);\n }\n return n.loadTextureImage(e, r.source, l);\n }\n}\nclass du {\n constructor(e) {\n this.name = le.EXT_MESHOPT_COMPRESSION, this.parser = e;\n }\n loadBufferView(e) {\n const t = this.parser.json, n = t.bufferViews[e];\n if (n.extensions && n.extensions[this.name]) {\n const i = n.extensions[this.name], o = this.parser.getDependency(\"buffer\", i.buffer), r = this.parser.options.meshoptDecoder;\n if (!r || !r.supported) {\n if (t.extensionsRequired && t.extensionsRequired.indexOf(this.name) >= 0)\n throw new Error(\"THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files\");\n return null;\n }\n return o.then(function(a) {\n const l = i.byteOffset || 0, h = i.byteLength || 0, c = i.count, u = i.byteStride, d = new Uint8Array(a, l, h);\n return r.decodeGltfBufferAsync ? r.decodeGltfBufferAsync(c, u, d, i.mode, i.filter).then(function(p) {\n return p.buffer;\n }) : r.ready.then(function() {\n const p = new ArrayBuffer(c * u);\n return r.decodeGltfBuffer(new Uint8Array(p), c, u, d, i.mode, i.filter), p;\n });\n });\n } else\n return null;\n }\n}\nclass pu {\n constructor(e) {\n this.name = le.EXT_MESH_GPU_INSTANCING, this.parser = e;\n }\n createNodeMesh(e) {\n const t = this.parser.json, n = t.nodes[e];\n if (!n.extensions || !n.extensions[this.name] || n.mesh === void 0)\n return null;\n const i = t.meshes[n.mesh];\n for (const h of i.primitives)\n if (h.mode !== We.TRIANGLES && h.mode !== We.TRIANGLE_STRIP && h.mode !== We.TRIANGLE_FAN && h.mode !== void 0)\n return null;\n const r = n.extensions[this.name].attributes, a = [], l = {};\n for (const h in r)\n a.push(this.parser.getDependency(\"accessor\", r[h]).then((c) => (l[h] = c, l[h])));\n return a.length < 1 ? null : (a.push(this.parser.createNodeMesh(e)), Promise.all(a).then((h) => {\n const c = h.pop(), u = c.isGroup ? c.children : [c], d = h[0].count, p = [];\n for (const f of u) {\n const m = new Ae(), g = new Z(), y = new Ri(), w = new Z(1, 1, 1), _ = new ol(f.geometry, f.material, d);\n for (let x = 0; x < d; x++)\n l.TRANSLATION && g.fromBufferAttribute(l.TRANSLATION, x), l.ROTATION && y.fromBufferAttribute(l.ROTATION, x), l.SCALE && w.fromBufferAttribute(l.SCALE, x), _.setMatrixAt(x, m.compose(g, y, w));\n for (const x in l)\n if (x === \"_COLOR_0\") {\n const b = l[x];\n _.instanceColor = new al(b.array, b.itemSize, b.normalized);\n } else x !== \"TRANSLATION\" && x !== \"ROTATION\" && x !== \"SCALE\" && f.geometry.setAttribute(x, l[x]);\n Fo.prototype.copy.call(_, f), this.parser.assignFinalMaterial(_), p.push(_);\n }\n return c.isGroup ? (c.clear(), c.add(...p), c) : p[0];\n }));\n }\n}\nconst xa = \"glTF\", En = 12, Hr = { JSON: 1313821514, BIN: 5130562 };\nclass mu {\n constructor(e) {\n this.name = le.KHR_BINARY_GLTF, this.content = null, this.body = null;\n const t = new DataView(e, 0, En), n = new TextDecoder();\n if (this.header = {\n magic: n.decode(new Uint8Array(e.slice(0, 4))),\n version: t.getUint32(4, !0),\n length: t.getUint32(8, !0)\n }, this.header.magic !== xa)\n throw new Error(\"THREE.GLTFLoader: Unsupported glTF-Binary header.\");\n if (this.header.version < 2)\n throw new Error(\"THREE.GLTFLoader: Legacy binary file detected.\");\n const i = this.header.length - En, o = new DataView(e, En);\n let r = 0;\n for (; r < i; ) {\n const a = o.getUint32(r, !0);\n r += 4;\n const l = o.getUint32(r, !0);\n if (r += 4, l === Hr.JSON) {\n const h = new Uint8Array(e, En + r, a);\n this.content = n.decode(h);\n } else if (l === Hr.BIN) {\n const h = En + r;\n this.body = e.slice(h, h + a);\n }\n r += a;\n }\n if (this.content === null)\n throw new Error(\"THREE.GLTFLoader: JSON content not found.\");\n }\n}\nclass gu {\n constructor(e, t) {\n if (!t)\n throw new Error(\"THREE.GLTFLoader: No DRACOLoader instance provided.\");\n this.name = le.KHR_DRACO_MESH_COMPRESSION, this.json = e, this.dracoLoader = t, this.dracoLoader.preload();\n }\n decodePrimitive(e, t) {\n const n = this.json, i = this.dracoLoader, o = e.extensions[this.name].bufferView, r = e.extensions[this.name].attributes, a = {}, l = {}, h = {};\n for (const c in r) {\n const u = Os[c] || c.toLowerCase();\n a[u] = r[c];\n }\n for (const c in e.attributes) {\n const u = Os[c] || c.toLowerCase();\n if (r[c] !== void 0) {\n const d = n.accessors[e.attributes[c]], p = mn[d.componentType];\n h[u] = p.name, l[u] = d.normalized === !0;\n }\n }\n return t.getDependency(\"bufferView\", o).then(function(c) {\n return new Promise(function(u, d) {\n i.decodeDracoFile(c, function(p) {\n for (const f in p.attributes) {\n const m = p.attributes[f], g = l[f];\n g !== void 0 && (m.normalized = g);\n }\n u(p);\n }, a, h, lt, d);\n });\n });\n }\n}\nclass yu {\n constructor() {\n this.name = le.KHR_TEXTURE_TRANSFORM;\n }\n extendTexture(e, t) {\n return (t.texCoord === void 0 || t.texCoord === e.channel) && t.offset === void 0 && t.rotation === void 0 && t.scale === void 0 || (e = e.clone(), t.texCoord !== void 0 && (e.channel = t.texCoord), t.offset !== void 0 && e.offset.fromArray(t.offset), t.rotation !== void 0 && (e.rotation = t.rotation), t.scale !== void 0 && e.repeat.fromArray(t.scale), e.needsUpdate = !0), e;\n }\n}\nclass wu {\n constructor() {\n this.name = le.KHR_MESH_QUANTIZATION;\n }\n}\nclass ba extends Cl {\n constructor(e, t, n, i) {\n super(e, t, n, i);\n }\n copySampleValue_(e) {\n const t = this.resultBuffer, n = this.sampleValues, i = this.valueSize, o = e * i * 3 + i;\n for (let r = 0; r !== i; r++)\n t[r] = n[o + r];\n return t;\n }\n interpolate_(e, t, n, i) {\n const o = this.resultBuffer, r = this.sampleValues, a = this.valueSize, l = a * 2, h = a * 3, c = i - t, u = (n - t) / c, d = u * u, p = d * u, f = e * h, m = f - h, g = -2 * p + 3 * d, y = p - d, w = 1 - g, _ = y - d + u;\n for (let x = 0; x !== a; x++) {\n const b = r[m + x + a], A = r[m + x + l] * c, M = r[f + x + a], C = r[f + x] * c;\n o[x] = w * b + _ * A + g * M + y * C;\n }\n return o;\n }\n}\nconst _u = new Ri();\nclass xu extends ba {\n interpolate_(e, t, n, i) {\n const o = super.interpolate_(e, t, n, i);\n return _u.fromArray(o).normalize().toArray(o), o;\n }\n}\nconst We = {\n POINTS: 0,\n LINES: 1,\n LINE_LOOP: 2,\n LINE_STRIP: 3,\n TRIANGLES: 4,\n TRIANGLE_STRIP: 5,\n TRIANGLE_FAN: 6\n}, mn = {\n 5120: Int8Array,\n 5121: Uint8Array,\n 5122: Int16Array,\n 5123: Uint16Array,\n 5125: Uint32Array,\n 5126: Float32Array\n}, Gr = {\n 9728: Di,\n 9729: Ds,\n 9984: fl,\n 9985: ul,\n 9986: hl,\n 9987: Vo\n}, Wr = {\n 33071: pl,\n 33648: dl,\n 10497: Zt\n}, ss = {\n SCALAR: 1,\n VEC2: 2,\n VEC3: 3,\n VEC4: 4,\n MAT2: 4,\n MAT3: 9,\n MAT4: 16\n}, Os = {\n POSITION: \"position\",\n NORMAL: \"normal\",\n TANGENT: \"tangent\",\n TEXCOORD_0: \"uv\",\n TEXCOORD_1: \"uv1\",\n TEXCOORD_2: \"uv2\",\n TEXCOORD_3: \"uv3\",\n COLOR_0: \"color\",\n WEIGHTS_0: \"skinWeight\",\n JOINTS_0: \"skinIndex\"\n}, Tt = {\n scale: \"scale\",\n translation: \"position\",\n rotation: \"quaternion\",\n weights: \"morphTargetInfluences\"\n}, bu = {\n CUBICSPLINE: void 0,\n // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n // keyframe track will be initialized with a default interpolation type, then modified.\n LINEAR: Ho,\n STEP: Al\n}, rs = {\n OPAQUE: \"OPAQUE\",\n MASK: \"MASK\",\n BLEND: \"BLEND\"\n};\nfunction vu(s) {\n return s.DefaultMaterial === void 0 && (s.DefaultMaterial = new jo({\n color: 16777215,\n emissive: 0,\n metalness: 1,\n roughness: 1,\n transparent: !1,\n depthTest: !0,\n side: Ls\n })), s.DefaultMaterial;\n}\nfunction Nt(s, e, t) {\n for (const n in t.extensions)\n s[n] === void 0 && (e.userData.gltfExtensions = e.userData.gltfExtensions || {}, e.userData.gltfExtensions[n] = t.extensions[n]);\n}\nfunction rt(s, e) {\n e.extras !== void 0 && (typeof e.extras == \"object\" ? Object.assign(s.userData, e.extras) : console.warn(\"THREE.GLTFLoader: Ignoring primitive type .extras, \" + e.extras));\n}\nfunction Su(s, e, t) {\n let n = !1, i = !1, o = !1;\n for (let h = 0, c = e.length; h < c; h++) {\n const u = e[h];\n if (u.POSITION !== void 0 && (n = !0), u.NORMAL !== void 0 && (i = !0), u.COLOR_0 !== void 0 && (o = !0), n && i && o) break;\n }\n if (!n && !i && !o) return Promise.resolve(s);\n const r = [], a = [], l = [];\n for (let h = 0, c = e.length; h < c; h++) {\n const u = e[h];\n if (n) {\n const d = u.POSITION !== void 0 ? t.getDependency(\"accessor\", u.POSITION) : s.attributes.position;\n r.push(d);\n }\n if (i) {\n const d = u.NORMAL !== void 0 ? t.getDependency(\"accessor\", u.NORMAL) : s.attributes.normal;\n a.push(d);\n }\n if (o) {\n const d = u.COLOR_0 !== void 0 ? t.getDependency(\"accessor\", u.COLOR_0) : s.attributes.color;\n l.push(d);\n }\n }\n return Promise.all([\n Promise.all(r),\n Promise.all(a),\n Promise.all(l)\n ]).then(function(h) {\n const c = h[0], u = h[1], d = h[2];\n return n && (s.morphAttributes.position = c), i && (s.morphAttributes.normal = u), o && (s.morphAttributes.color = d), s.morphTargetsRelative = !0, s;\n });\n}\nfunction Tu(s, e) {\n if (s.updateMorphTargets(), e.weights !== void 0)\n for (let t = 0, n = e.weights.length; t < n; t++)\n s.morphTargetInfluences[t] = e.weights[t];\n if (e.extras && Array.isArray(e.extras.targetNames)) {\n const t = e.extras.targetNames;\n if (s.morphTargetInfluences.length === t.length) {\n s.morphTargetDictionary = {};\n for (let n = 0, i = t.length; n < i; n++)\n s.morphTargetDictionary[t[n]] = n;\n } else\n console.warn(\"THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.\");\n }\n}\nfunction Eu(s) {\n let e;\n const t = s.extensions && s.extensions[le.KHR_DRACO_MESH_COMPRESSION];\n if (t ? e = \"draco:\" + t.bufferView + \":\" + t.indices + \":\" + os(t.attributes) : e = s.indices + \":\" + os(s.attributes) + \":\" + s.mode, s.targets !== void 0)\n for (let n = 0, i = s.targets.length; n < i; n++)\n e += \":\" + os(s.targets[n]);\n return e;\n}\nfunction os(s) {\n let e = \"\";\n const t = Object.keys(s).sort();\n for (let n = 0, i = t.length; n < i; n++)\n e += t[n] + \":\" + s[t[n]] + \";\";\n return e;\n}\nfunction Us(s) {\n switch (s) {\n case Int8Array:\n return 1 / 127;\n case Uint8Array:\n return 1 / 255;\n case Int16Array:\n return 1 / 32767;\n case Uint16Array:\n return 1 / 65535;\n default:\n throw new Error(\"THREE.GLTFLoader: Unsupported normalized accessor component type.\");\n }\n}\nfunction Mu(s) {\n return s.search(/\\.jpe?g($|\\?)/i) > 0 || s.search(/^data\\:image\\/jpeg/) === 0 ? \"image/jpeg\" : s.search(/\\.webp($|\\?)/i) > 0 || s.search(/^data\\:image\\/webp/) === 0 ? \"image/webp\" : s.search(/\\.ktx2($|\\?)/i) > 0 || s.search(/^data\\:image\\/ktx2/) === 0 ? \"image/ktx2\" : \"image/png\";\n}\nconst Au = new Ae();\nclass Cu {\n constructor(e = {}, t = {}) {\n this.json = e, this.extensions = {}, this.plugins = {}, this.options = t, this.cache = new Yh(), this.associations = /* @__PURE__ */ new Map(), this.primitiveCache = {}, this.nodeCache = {}, this.meshCache = { refs: {}, uses: {} }, this.cameraCache = { refs: {}, uses: {} }, this.lightCache = { refs: {}, uses: {} }, this.sourceCache = {}, this.textureCache = {}, this.nodeNamesUsed = {};\n let n = !1, i = -1, o = !1, r = -1;\n if (typeof navigator < \"u\") {\n const a = navigator.userAgent;\n n = /^((?!chrome|android).)*safari/i.test(a) === !0;\n const l = a.match(/Version\\/(\\d+)/);\n i = n && l ? parseInt(l[1], 10) : -1, o = a.indexOf(\"Firefox\") > -1, r = o ? a.match(/Firefox\\/([0-9]+)\\./)[1] : -1;\n }\n typeof createImageBitmap > \"u\" || n && i < 17 || o && r < 98 ? this.textureLoader = new ll(this.options.manager) : this.textureLoader = new cl(this.options.manager), this.textureLoader.setCrossOrigin(this.options.crossOrigin), this.textureLoader.setRequestHeader(this.options.requestHeader), this.fileLoader = new Bi(this.options.manager), this.fileLoader.setResponseType(\"arraybuffer\"), this.options.crossOrigin === \"use-credentials\" && this.fileLoader.setWithCredentials(!0);\n }\n setExtensions(e) {\n this.extensions = e;\n }\n setPlugins(e) {\n this.plugins = e;\n }\n parse(e, t) {\n const n = this, i = this.json, o = this.extensions;\n this.cache.removeAll(), this.nodeCache = {}, this._invokeAll(function(r) {\n return r._markDefs && r._markDefs();\n }), Promise.all(this._invokeAll(function(r) {\n return r.beforeRoot && r.beforeRoot();\n })).then(function() {\n return Promise.all([\n n.getDependencies(\"scene\"),\n n.getDependencies(\"animation\"),\n n.getDependencies(\"camera\")\n ]);\n }).then(function(r) {\n const a = {\n scene: r[0][i.scene || 0],\n scenes: r[0],\n animations: r[1],\n cameras: r[2],\n asset: i.asset,\n parser: n,\n userData: {}\n };\n return Nt(o, a, i), rt(a, i), Promise.all(n._invokeAll(function(l) {\n return l.afterRoot && l.afterRoot(a);\n })).then(function() {\n for (const l of a.scenes)\n l.updateMatrixWorld();\n e(a);\n });\n }).catch(t);\n }\n /**\n * Marks the special nodes/meshes in json for efficient parse.\n *\n * @private\n */\n _markDefs() {\n const e = this.json.nodes || [], t = this.json.skins || [], n = this.json.meshes || [];\n for (let i = 0, o = t.length; i < o; i++) {\n const r = t[i].joints;\n for (let a = 0, l = r.length; a < l; a++)\n e[r[a]].isBone = !0;\n }\n for (let i = 0, o = e.length; i < o; i++) {\n const r = e[i];\n r.mesh !== void 0 && (this._addNodeRef(this.meshCache, r.mesh), r.skin !== void 0 && (n[r.mesh].isSkinnedMesh = !0)), r.camera !== void 0 && this._addNodeRef(this.cameraCache, r.camera);\n }\n }\n /**\n * Counts references to shared node / Object3D resources. These resources\n * can be reused, or \"instantiated\", at multiple nodes in the scene\n * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n * be marked. Non-scenegraph resources (like Materials, Geometries, and\n * Textures) can be reused directly and are not marked here.\n *\n * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n *\n * @private\n * @param {Object} cache\n * @param {Object3D} index\n */\n _addNodeRef(e, t) {\n t !== void 0 && (e.refs[t] === void 0 && (e.refs[t] = e.uses[t] = 0), e.refs[t]++);\n }\n /**\n * Returns a reference to a shared resource, cloning it if necessary.\n *\n * @private\n * @param {Object} cache\n * @param {number} index\n * @param {Object} object\n * @return {Object}\n */\n _getNodeRef(e, t, n) {\n if (e.refs[t] <= 1) return n;\n const i = n.clone(), o = (r, a) => {\n const l = this.associations.get(r);\n l != null && this.associations.set(a, l);\n for (const [h, c] of r.children.entries())\n o(c, a.children[h]);\n };\n return o(n, i), i.name += \"_instance_\" + e.uses[t]++, i;\n }\n _invokeOne(e) {\n const t = Object.values(this.plugins);\n t.push(this);\n for (let n = 0; n < t.length; n++) {\n const i = e(t[n]);\n if (i) return i;\n }\n return null;\n }\n _invokeAll(e) {\n const t = Object.values(this.plugins);\n t.unshift(this);\n const n = [];\n for (let i = 0; i < t.length; i++) {\n const o = e(t[i]);\n o && n.push(o);\n }\n return n;\n }\n /**\n * Requests the specified dependency asynchronously, with caching.\n *\n * @private\n * @param {string} type\n * @param {number} index\n * @return {Promise}\n */\n getDependency(e, t) {\n const n = e + \":\" + t;\n let i = this.cache.get(n);\n if (!i) {\n switch (e) {\n case \"scene\":\n i = this.loadScene(t);\n break;\n case \"node\":\n i = this._invokeOne(function(o) {\n return o.loadNode && o.loadNode(t);\n });\n break;\n case \"mesh\":\n i = this._invokeOne(function(o) {\n return o.loadMesh && o.loadMesh(t);\n });\n break;\n case \"accessor\":\n i = this.loadAccessor(t);\n break;\n case \"bufferView\":\n i = this._invokeOne(function(o) {\n return o.loadBufferView && o.loadBufferView(t);\n });\n break;\n case \"buffer\":\n i = this.loadBuffer(t);\n break;\n case \"material\":\n i = this._invokeOne(function(o) {\n return o.loadMaterial && o.loadMaterial(t);\n });\n break;\n case \"texture\":\n i = this._invokeOne(function(o) {\n return o.loadTexture && o.loadTexture(t);\n });\n break;\n case \"skin\":\n i = this.loadSkin(t);\n break;\n case \"animation\":\n i = this._invokeOne(function(o) {\n return o.loadAnimation && o.loadAnimation(t);\n });\n break;\n case \"camera\":\n i = this.loadCamera(t);\n break;\n default:\n if (i = this._invokeOne(function(o) {\n return o != this && o.getDependency && o.getDependency(e, t);\n }), !i)\n throw new Error(\"Unknown type: \" + e);\n break;\n }\n this.cache.add(n, i);\n }\n return i;\n }\n /**\n * Requests all dependencies of the specified type asynchronously, with caching.\n *\n * @private\n * @param {string} type\n * @return {Promise>}\n */\n getDependencies(e) {\n let t = this.cache.get(e);\n if (!t) {\n const n = this, i = this.json[e + (e === \"mesh\" ? \"es\" : \"s\")] || [];\n t = Promise.all(i.map(function(o, r) {\n return n.getDependency(e, r);\n })), this.cache.add(e, t);\n }\n return t;\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n *\n * @private\n * @param {number} bufferIndex\n * @return {Promise}\n */\n loadBuffer(e) {\n const t = this.json.buffers[e], n = this.fileLoader;\n if (t.type && t.type !== \"arraybuffer\")\n throw new Error(\"THREE.GLTFLoader: \" + t.type + \" buffer type is not supported.\");\n if (t.uri === void 0 && e === 0)\n return Promise.resolve(this.extensions[le.KHR_BINARY_GLTF].body);\n const i = this.options;\n return new Promise(function(o, r) {\n n.load(In.resolveURL(t.uri, i.path), o, void 0, function() {\n r(new Error('THREE.GLTFLoader: Failed to load buffer \"' + t.uri + '\".'));\n });\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n *\n * @private\n * @param {number} bufferViewIndex\n * @return {Promise}\n */\n loadBufferView(e) {\n const t = this.json.bufferViews[e];\n return this.getDependency(\"buffer\", t.buffer).then(function(n) {\n const i = t.byteLength || 0, o = t.byteOffset || 0;\n return n.slice(o, o + i);\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n *\n * @private\n * @param {number} accessorIndex\n * @return {Promise}\n */\n loadAccessor(e) {\n const t = this, n = this.json, i = this.json.accessors[e];\n if (i.bufferView === void 0 && i.sparse === void 0) {\n const r = ss[i.type], a = mn[i.componentType], l = i.normalized === !0, h = new a(i.count * r);\n return Promise.resolve(new at(h, r, l));\n }\n const o = [];\n return i.bufferView !== void 0 ? o.push(this.getDependency(\"bufferView\", i.bufferView)) : o.push(null), i.sparse !== void 0 && (o.push(this.getDependency(\"bufferView\", i.sparse.indices.bufferView)), o.push(this.getDependency(\"bufferView\", i.sparse.values.bufferView))), Promise.all(o).then(function(r) {\n const a = r[0], l = ss[i.type], h = mn[i.componentType], c = h.BYTES_PER_ELEMENT, u = c * l, d = i.byteOffset || 0, p = i.bufferView !== void 0 ? n.bufferViews[i.bufferView].byteStride : void 0, f = i.normalized === !0;\n let m, g;\n if (p && p !== u) {\n const y = Math.floor(d / p), w = \"InterleavedBuffer:\" + i.bufferView + \":\" + i.componentType + \":\" + y + \":\" + i.count;\n let _ = t.cache.get(w);\n _ || (m = new h(a, y * p, i.count * p / c), _ = new No(m, p / c), t.cache.add(w, _)), g = new Oo(_, l, d % p / c, f);\n } else\n a === null ? m = new h(i.count * l) : m = new h(a, d, i.count * l), g = new at(m, l, f);\n if (i.sparse !== void 0) {\n const y = ss.SCALAR, w = mn[i.sparse.indices.componentType], _ = i.sparse.indices.byteOffset || 0, x = i.sparse.values.byteOffset || 0, b = new w(r[1], _, i.sparse.count * y), A = new h(r[2], x, i.sparse.count * l);\n a !== null && (g = new at(g.array.slice(), g.itemSize, g.normalized)), g.normalized = !1;\n for (let M = 0, C = b.length; M < C; M++) {\n const P = b[M];\n if (g.setX(P, A[M * l]), l >= 2 && g.setY(P, A[M * l + 1]), l >= 3 && g.setZ(P, A[M * l + 2]), l >= 4 && g.setW(P, A[M * l + 3]), l >= 5) throw new Error(\"THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.\");\n }\n g.normalized = f;\n }\n return g;\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n *\n * @private\n * @param {number} textureIndex\n * @return {Promise}\n */\n loadTexture(e) {\n const t = this.json, n = this.options, o = t.textures[e].source, r = t.images[o];\n let a = this.textureLoader;\n if (r.uri) {\n const l = n.manager.getHandler(r.uri);\n l !== null && (a = l);\n }\n return this.loadTextureImage(e, o, a);\n }\n loadTextureImage(e, t, n) {\n const i = this, o = this.json, r = o.textures[e], a = o.images[t], l = (a.uri || a.bufferView) + \":\" + r.sampler;\n if (this.textureCache[l])\n return this.textureCache[l];\n const h = this.loadImageSource(t, n).then(function(c) {\n c.flipY = !1, c.name = r.name || a.name || \"\", c.name === \"\" && typeof a.uri == \"string\" && a.uri.startsWith(\"data:image/\") === !1 && (c.name = a.uri);\n const d = (o.samplers || {})[r.sampler] || {};\n return c.magFilter = Gr[d.magFilter] || Ds, c.minFilter = Gr[d.minFilter] || Vo, c.wrapS = Wr[d.wrapS] || Zt, c.wrapT = Wr[d.wrapT] || Zt, c.generateMipmaps = !c.isCompressedTexture && c.minFilter !== Di && c.minFilter !== Ds, i.associations.set(c, { textures: e }), c;\n }).catch(function() {\n return null;\n });\n return this.textureCache[l] = h, h;\n }\n loadImageSource(e, t) {\n const n = this, i = this.json, o = this.options;\n if (this.sourceCache[e] !== void 0)\n return this.sourceCache[e].then((u) => u.clone());\n const r = i.images[e], a = self.URL || self.webkitURL;\n let l = r.uri || \"\", h = !1;\n if (r.bufferView !== void 0)\n l = n.getDependency(\"bufferView\", r.bufferView).then(function(u) {\n h = !0;\n const d = new Blob([u], { type: r.mimeType });\n return l = a.createObjectURL(d), l;\n });\n else if (r.uri === void 0)\n throw new Error(\"THREE.GLTFLoader: Image \" + e + \" is missing URI and bufferView\");\n const c = Promise.resolve(l).then(function(u) {\n return new Promise(function(d, p) {\n let f = d;\n t.isImageBitmapLoader === !0 && (f = function(m) {\n const g = new gr(m);\n g.needsUpdate = !0, d(g);\n }), t.load(In.resolveURL(u, o.path), f, void 0, p);\n });\n }).then(function(u) {\n return h === !0 && a.revokeObjectURL(l), rt(u, r), u.userData.mimeType = r.mimeType || Mu(r.uri), u;\n }).catch(function(u) {\n throw console.error(\"THREE.GLTFLoader: Couldn't load texture\", l), u;\n });\n return this.sourceCache[e] = c, c;\n }\n /**\n * Asynchronously assigns a texture to the given material parameters.\n *\n * @private\n * @param {Object} materialParams\n * @param {string} mapName\n * @param {Object} mapDef\n * @param {string} [colorSpace]\n * @return {Promise}\n */\n assignTexture(e, t, n, i) {\n const o = this;\n return this.getDependency(\"texture\", n.index).then(function(r) {\n if (!r) return null;\n if (n.texCoord !== void 0 && n.texCoord > 0 && (r = r.clone(), r.channel = n.texCoord), o.extensions[le.KHR_TEXTURE_TRANSFORM]) {\n const a = n.extensions !== void 0 ? n.extensions[le.KHR_TEXTURE_TRANSFORM] : void 0;\n if (a) {\n const l = o.associations.get(r);\n r = o.extensions[le.KHR_TEXTURE_TRANSFORM].extendTexture(r, a), o.associations.set(r, l);\n }\n }\n return i !== void 0 && (r.colorSpace = i), e[t] = r, r;\n });\n }\n /**\n * Assigns final material to a Mesh, Line, or Points instance. The instance\n * already has a material (generated from the glTF material options alone)\n * but reuse of the same glTF material may require multiple threejs materials\n * to accommodate different primitive types, defines, etc. New materials will\n * be created if necessary, and reused from a cache.\n *\n * @private\n * @param {Object3D} mesh Mesh, Line, or Points instance.\n */\n assignFinalMaterial(e) {\n const t = e.geometry;\n let n = e.material;\n const i = t.attributes.tangent === void 0, o = t.attributes.color !== void 0, r = t.attributes.normal === void 0;\n if (e.isPoints) {\n const a = \"PointsMaterial:\" + n.uuid;\n let l = this.cache.get(a);\n l || (l = new ml(), Zi.prototype.copy.call(l, n), l.color.copy(n.color), l.map = n.map, l.sizeAttenuation = !1, this.cache.add(a, l)), n = l;\n } else if (e.isLine) {\n const a = \"LineBasicMaterial:\" + n.uuid;\n let l = this.cache.get(a);\n l || (l = new gl(), Zi.prototype.copy.call(l, n), l.color.copy(n.color), l.map = n.map, this.cache.add(a, l)), n = l;\n }\n if (i || o || r) {\n let a = \"ClonedMaterial:\" + n.uuid + \":\";\n i && (a += \"derivative-tangents:\"), o && (a += \"vertex-colors:\"), r && (a += \"flat-shading:\");\n let l = this.cache.get(a);\n l || (l = n.clone(), o && (l.vertexColors = !0), r && (l.flatShading = !0), i && (l.normalScale && (l.normalScale.y *= -1), l.clearcoatNormalScale && (l.clearcoatNormalScale.y *= -1)), this.cache.add(a, l), this.associations.set(l, this.associations.get(n))), n = l;\n }\n e.material = n;\n }\n getMaterialType() {\n return jo;\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n *\n * @private\n * @param {number} materialIndex\n * @return {Promise}\n */\n loadMaterial(e) {\n const t = this, n = this.json, i = this.extensions, o = n.materials[e];\n let r;\n const a = {}, l = o.extensions || {}, h = [];\n if (l[le.KHR_MATERIALS_UNLIT]) {\n const u = i[le.KHR_MATERIALS_UNLIT];\n r = u.getMaterialType(), h.push(u.extendParams(a, o, t));\n } else {\n const u = o.pbrMetallicRoughness || {};\n if (a.color = new je(1, 1, 1), a.opacity = 1, Array.isArray(u.baseColorFactor)) {\n const d = u.baseColorFactor;\n a.color.setRGB(d[0], d[1], d[2], lt), a.opacity = d[3];\n }\n u.baseColorTexture !== void 0 && h.push(t.assignTexture(a, \"map\", u.baseColorTexture, Rt)), a.metalness = u.metallicFactor !== void 0 ? u.metallicFactor : 1, a.roughness = u.roughnessFactor !== void 0 ? u.roughnessFactor : 1, u.metallicRoughnessTexture !== void 0 && (h.push(t.assignTexture(a, \"metalnessMap\", u.metallicRoughnessTexture)), h.push(t.assignTexture(a, \"roughnessMap\", u.metallicRoughnessTexture))), r = this._invokeOne(function(d) {\n return d.getMaterialType && d.getMaterialType(e);\n }), h.push(Promise.all(this._invokeAll(function(d) {\n return d.extendMaterialParams && d.extendMaterialParams(e, a);\n })));\n }\n o.doubleSided === !0 && (a.side = Vi);\n const c = o.alphaMode || rs.OPAQUE;\n if (c === rs.BLEND ? (a.transparent = !0, a.depthWrite = !1) : (a.transparent = !1, c === rs.MASK && (a.alphaTest = o.alphaCutoff !== void 0 ? o.alphaCutoff : 0.5)), o.normalTexture !== void 0 && r !== hn && (h.push(t.assignTexture(a, \"normalMap\", o.normalTexture)), a.normalScale = new ce(1, 1), o.normalTexture.scale !== void 0)) {\n const u = o.normalTexture.scale;\n a.normalScale.set(u, u);\n }\n if (o.occlusionTexture !== void 0 && r !== hn && (h.push(t.assignTexture(a, \"aoMap\", o.occlusionTexture)), o.occlusionTexture.strength !== void 0 && (a.aoMapIntensity = o.occlusionTexture.strength)), o.emissiveFactor !== void 0 && r !== hn) {\n const u = o.emissiveFactor;\n a.emissive = new je().setRGB(u[0], u[1], u[2], lt);\n }\n return o.emissiveTexture !== void 0 && r !== hn && h.push(t.assignTexture(a, \"emissiveMap\", o.emissiveTexture, Rt)), Promise.all(h).then(function() {\n const u = new r(a);\n return o.name && (u.name = o.name), rt(u, o), t.associations.set(u, { materials: e }), o.extensions && Nt(i, u, o), u;\n });\n }\n /**\n * When Object3D instances are targeted by animation, they need unique names.\n *\n * @private\n * @param {string} originalName\n * @return {string}\n */\n createUniqueName(e) {\n const t = yl.sanitizeNodeName(e || \"\");\n return t in this.nodeNamesUsed ? t + \"_\" + ++this.nodeNamesUsed[t] : (this.nodeNamesUsed[t] = 0, t);\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n *\n * Creates BufferGeometries from primitives.\n *\n * @private\n * @param {Array} primitives\n * @return {Promise>}\n */\n loadGeometries(e) {\n const t = this, n = this.extensions, i = this.primitiveCache;\n function o(a) {\n return n[le.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(a, t).then(function(l) {\n return Xr(l, a, t);\n });\n }\n const r = [];\n for (let a = 0, l = e.length; a < l; a++) {\n const h = e[a], c = Eu(h), u = i[c];\n if (u)\n r.push(u.promise);\n else {\n let d;\n h.extensions && h.extensions[le.KHR_DRACO_MESH_COMPRESSION] ? d = o(h) : d = Xr(new Fi(), h, t), i[c] = { primitive: h, promise: d }, r.push(d);\n }\n }\n return Promise.all(r);\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n *\n * @private\n * @param {number} meshIndex\n * @return {Promise}\n */\n loadMesh(e) {\n const t = this, n = this.json, i = this.extensions, o = n.meshes[e], r = o.primitives, a = [];\n for (let l = 0, h = r.length; l < h; l++) {\n const c = r[l].material === void 0 ? vu(this.cache) : this.getDependency(\"material\", r[l].material);\n a.push(c);\n }\n return a.push(t.loadGeometries(r)), Promise.all(a).then(function(l) {\n const h = l.slice(0, l.length - 1), c = l[l.length - 1], u = [];\n for (let p = 0, f = c.length; p < f; p++) {\n const m = c[p], g = r[p];\n let y;\n const w = h[p];\n if (g.mode === We.TRIANGLES || g.mode === We.TRIANGLE_STRIP || g.mode === We.TRIANGLE_FAN || g.mode === void 0)\n y = o.isSkinnedMesh === !0 ? new wl(m, w) : new Qs(m, w), y.isSkinnedMesh === !0 && y.normalizeSkinWeights(), g.mode === We.TRIANGLE_STRIP ? y.geometry = jr(y.geometry, Uo) : g.mode === We.TRIANGLE_FAN && (y.geometry = jr(y.geometry, Rs));\n else if (g.mode === We.LINES)\n y = new _l(m, w);\n else if (g.mode === We.LINE_STRIP)\n y = new xl(m, w);\n else if (g.mode === We.LINE_LOOP)\n y = new bl(m, w);\n else if (g.mode === We.POINTS)\n y = new vl(m, w);\n else\n throw new Error(\"THREE.GLTFLoader: Primitive mode unsupported: \" + g.mode);\n Object.keys(y.geometry.morphAttributes).length > 0 && Tu(y, o), y.name = t.createUniqueName(o.name || \"mesh_\" + e), rt(y, o), g.extensions && Nt(i, y, g), t.assignFinalMaterial(y), u.push(y);\n }\n for (let p = 0, f = u.length; p < f; p++)\n t.associations.set(u[p], {\n meshes: e,\n primitives: p\n });\n if (u.length === 1)\n return o.extensions && Nt(i, u[0], o), u[0];\n const d = new Yi();\n o.extensions && Nt(i, d, o), t.associations.set(d, { meshes: e });\n for (let p = 0, f = u.length; p < f; p++)\n d.add(u[p]);\n return d;\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n *\n * @private\n * @param {number} cameraIndex\n * @return {Promise|undefined}\n */\n loadCamera(e) {\n let t;\n const n = this.json.cameras[e], i = n[n.type];\n if (!i) {\n console.warn(\"THREE.GLTFLoader: Missing camera parameters.\");\n return;\n }\n return n.type === \"perspective\" ? t = new Sl(Lo.radToDeg(i.yfov), i.aspectRatio || 1, i.znear || 1, i.zfar || 2e6) : n.type === \"orthographic\" && (t = new Bo(-i.xmag, i.xmag, i.ymag, -i.ymag, i.znear, i.zfar)), n.name && (t.name = this.createUniqueName(n.name)), rt(t, n), Promise.resolve(t);\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n *\n * @private\n * @param {number} skinIndex\n * @return {Promise}\n */\n loadSkin(e) {\n const t = this.json.skins[e], n = [];\n for (let i = 0, o = t.joints.length; i < o; i++)\n n.push(this._loadNodeShallow(t.joints[i]));\n return t.inverseBindMatrices !== void 0 ? n.push(this.getDependency(\"accessor\", t.inverseBindMatrices)) : n.push(null), Promise.all(n).then(function(i) {\n const o = i.pop(), r = i, a = [], l = [];\n for (let h = 0, c = r.length; h < c; h++) {\n const u = r[h];\n if (u) {\n a.push(u);\n const d = new Ae();\n o !== null && d.fromArray(o.array, h * 16), l.push(d);\n } else\n console.warn('THREE.GLTFLoader: Joint \"%s\" could not be found.', t.joints[h]);\n }\n return new Tl(a, l);\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n *\n * @private\n * @param {number} animationIndex\n * @return {Promise}\n */\n loadAnimation(e) {\n const t = this.json, n = this, i = t.animations[e], o = i.name ? i.name : \"animation_\" + e, r = [], a = [], l = [], h = [], c = [];\n for (let u = 0, d = i.channels.length; u < d; u++) {\n const p = i.channels[u], f = i.samplers[p.sampler], m = p.target, g = m.node, y = i.parameters !== void 0 ? i.parameters[f.input] : f.input, w = i.parameters !== void 0 ? i.parameters[f.output] : f.output;\n m.node !== void 0 && (r.push(this.getDependency(\"node\", g)), a.push(this.getDependency(\"accessor\", y)), l.push(this.getDependency(\"accessor\", w)), h.push(f), c.push(m));\n }\n return Promise.all([\n Promise.all(r),\n Promise.all(a),\n Promise.all(l),\n Promise.all(h),\n Promise.all(c)\n ]).then(function(u) {\n const d = u[0], p = u[1], f = u[2], m = u[3], g = u[4], y = [];\n for (let _ = 0, x = d.length; _ < x; _++) {\n const b = d[_], A = p[_], M = f[_], C = m[_], P = g[_];\n if (b === void 0) continue;\n b.updateMatrix && b.updateMatrix();\n const k = n._createAnimationTracks(b, A, M, C, P);\n if (k)\n for (let B = 0; B < k.length; B++)\n y.push(k[B]);\n }\n const w = new El(o, void 0, y);\n return rt(w, i), w;\n });\n }\n createNodeMesh(e) {\n const t = this.json, n = this, i = t.nodes[e];\n return i.mesh === void 0 ? null : n.getDependency(\"mesh\", i.mesh).then(function(o) {\n const r = n._getNodeRef(n.meshCache, i.mesh, o);\n return i.weights !== void 0 && r.traverse(function(a) {\n if (a.isMesh)\n for (let l = 0, h = i.weights.length; l < h; l++)\n a.morphTargetInfluences[l] = i.weights[l];\n }), r;\n });\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n *\n * @private\n * @param {number} nodeIndex\n * @return {Promise}\n */\n loadNode(e) {\n const t = this.json, n = this, i = t.nodes[e], o = n._loadNodeShallow(e), r = [], a = i.children || [];\n for (let h = 0, c = a.length; h < c; h++)\n r.push(n.getDependency(\"node\", a[h]));\n const l = i.skin === void 0 ? Promise.resolve(null) : n.getDependency(\"skin\", i.skin);\n return Promise.all([\n o,\n Promise.all(r),\n l\n ]).then(function(h) {\n const c = h[0], u = h[1], d = h[2];\n d !== null && c.traverse(function(p) {\n p.isSkinnedMesh && p.bind(d, Au);\n });\n for (let p = 0, f = u.length; p < f; p++)\n c.add(u[p]);\n return c;\n });\n }\n // ._loadNodeShallow() parses a single node.\n // skin and child nodes are created and added in .loadNode() (no '_' prefix).\n _loadNodeShallow(e) {\n const t = this.json, n = this.extensions, i = this;\n if (this.nodeCache[e] !== void 0)\n return this.nodeCache[e];\n const o = t.nodes[e], r = o.name ? i.createUniqueName(o.name) : \"\", a = [], l = i._invokeOne(function(h) {\n return h.createNodeMesh && h.createNodeMesh(e);\n });\n return l && a.push(l), o.camera !== void 0 && a.push(i.getDependency(\"camera\", o.camera).then(function(h) {\n return i._getNodeRef(i.cameraCache, o.camera, h);\n })), i._invokeAll(function(h) {\n return h.createNodeAttachment && h.createNodeAttachment(e);\n }).forEach(function(h) {\n a.push(h);\n }), this.nodeCache[e] = Promise.all(a).then(function(h) {\n let c;\n if (o.isBone === !0 ? c = new Ml() : h.length > 1 ? c = new Yi() : h.length === 1 ? c = h[0] : c = new Fo(), c !== h[0])\n for (let u = 0, d = h.length; u < d; u++)\n c.add(h[u]);\n if (o.name && (c.userData.name = o.name, c.name = r), rt(c, o), o.extensions && Nt(n, c, o), o.matrix !== void 0) {\n const u = new Ae();\n u.fromArray(o.matrix), c.applyMatrix4(u);\n } else\n o.translation !== void 0 && c.position.fromArray(o.translation), o.rotation !== void 0 && c.quaternion.fromArray(o.rotation), o.scale !== void 0 && c.scale.fromArray(o.scale);\n if (!i.associations.has(c))\n i.associations.set(c, {});\n else if (o.mesh !== void 0 && i.meshCache.refs[o.mesh] > 1) {\n const u = i.associations.get(c);\n i.associations.set(c, { ...u });\n }\n return i.associations.get(c).nodes = e, c;\n }), this.nodeCache[e];\n }\n /**\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n *\n * @private\n * @param {number} sceneIndex\n * @return {Promise}\n */\n loadScene(e) {\n const t = this.extensions, n = this.json.scenes[e], i = this, o = new Yi();\n n.name && (o.name = i.createUniqueName(n.name)), rt(o, n), n.extensions && Nt(t, o, n);\n const r = n.nodes || [], a = [];\n for (let l = 0, h = r.length; l < h; l++)\n a.push(i.getDependency(\"node\", r[l]));\n return Promise.all(a).then(function(l) {\n for (let c = 0, u = l.length; c < u; c++)\n o.add(l[c]);\n const h = (c) => {\n const u = /* @__PURE__ */ new Map();\n for (const [d, p] of i.associations)\n (d instanceof Zi || d instanceof gr) && u.set(d, p);\n return c.traverse((d) => {\n const p = i.associations.get(d);\n p != null && u.set(d, p);\n }), u;\n };\n return i.associations = h(o), o;\n });\n }\n _createAnimationTracks(e, t, n, i, o) {\n const r = [], a = e.name ? e.name : e.uuid, l = [];\n Tt[o.path] === Tt.weights ? e.traverse(function(d) {\n d.morphTargetInfluences && l.push(d.name ? d.name : d.uuid);\n }) : l.push(a);\n let h;\n switch (Tt[o.path]) {\n case Tt.weights:\n h = wr;\n break;\n case Tt.rotation:\n h = _r;\n break;\n case Tt.translation:\n case Tt.scale:\n h = yr;\n break;\n default:\n switch (n.itemSize) {\n case 1:\n h = wr;\n break;\n case 2:\n case 3:\n default:\n h = yr;\n break;\n }\n break;\n }\n const c = i.interpolation !== void 0 ? bu[i.interpolation] : Ho, u = this._getArrayFromAccessor(n);\n for (let d = 0, p = l.length; d < p; d++) {\n const f = new h(\n l[d] + \".\" + Tt[o.path],\n t.array,\n u,\n c\n );\n i.interpolation === \"CUBICSPLINE\" && this._createCubicSplineTrackInterpolant(f), r.push(f);\n }\n return r;\n }\n _getArrayFromAccessor(e) {\n let t = e.array;\n if (e.normalized) {\n const n = Us(t.constructor), i = new Float32Array(t.length);\n for (let o = 0, r = t.length; o < r; o++)\n i[o] = t[o] * n;\n t = i;\n }\n return t;\n }\n _createCubicSplineTrackInterpolant(e) {\n e.createInterpolant = function(n) {\n const i = this instanceof _r ? xu : ba;\n return new i(this.times, this.values, this.getValueSize() / 3, n);\n }, e.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = !0;\n }\n}\nfunction Pu(s, e, t) {\n const n = e.attributes, i = new nt();\n if (n.POSITION !== void 0) {\n const a = t.json.accessors[n.POSITION], l = a.min, h = a.max;\n if (l !== void 0 && h !== void 0) {\n if (i.set(\n new Z(l[0], l[1], l[2]),\n new Z(h[0], h[1], h[2])\n ), a.normalized) {\n const c = Us(mn[a.componentType]);\n i.min.multiplyScalar(c), i.max.multiplyScalar(c);\n }\n } else {\n console.warn(\"THREE.GLTFLoader: Missing min/max properties for accessor POSITION.\");\n return;\n }\n } else\n return;\n const o = e.targets;\n if (o !== void 0) {\n const a = new Z(), l = new Z();\n for (let h = 0, c = o.length; h < c; h++) {\n const u = o[h];\n if (u.POSITION !== void 0) {\n const d = t.json.accessors[u.POSITION], p = d.min, f = d.max;\n if (p !== void 0 && f !== void 0) {\n if (l.setX(Math.max(Math.abs(p[0]), Math.abs(f[0]))), l.setY(Math.max(Math.abs(p[1]), Math.abs(f[1]))), l.setZ(Math.max(Math.abs(p[2]), Math.abs(f[2]))), d.normalized) {\n const m = Us(mn[d.componentType]);\n l.multiplyScalar(m);\n }\n a.max(l);\n } else\n console.warn(\"THREE.GLTFLoader: Missing min/max properties for accessor POSITION.\");\n }\n }\n i.expandByVector(a);\n }\n s.boundingBox = i;\n const r = new Pl();\n i.getCenter(r.center), r.radius = i.min.distanceTo(i.max) / 2, s.boundingSphere = r;\n}\nfunction Xr(s, e, t) {\n const n = e.attributes, i = [];\n function o(r, a) {\n return t.getDependency(\"accessor\", r).then(function(l) {\n s.setAttribute(a, l);\n });\n }\n for (const r in n) {\n const a = Os[r] || r.toLowerCase();\n a in s.attributes || i.push(o(n[r], a));\n }\n if (e.indices !== void 0 && !s.index) {\n const r = t.getDependency(\"accessor\", e.indices).then(function(a) {\n s.setIndex(a);\n });\n i.push(r);\n }\n return Li.workingColorSpace !== lt && \"COLOR_0\" in n && console.warn(`THREE.GLTFLoader: Converting vertex colors from \"srgb-linear\" to \"${Li.workingColorSpace}\" not supported.`), rt(s, e), Pu(s, e, t), Promise.all(i).then(function() {\n return e.targets !== void 0 ? Su(s, e.targets, t) : s;\n });\n}\nfunction ku(s, e, t) {\n let n = new E.Group();\n n.name = e, s.scene.add(n), _a(e + \"/info\", (i) => {\n let o = JSON.parse(i);\n s.engineStatus.models.push({\n type: \"light\",\n info: o,\n name: o.baseInfo.name,\n status: \"loading\",\n url: e,\n elements: /* @__PURE__ */ new Map()\n }), s.models == null && (s.models = []), s.models.push({\n url: e,\n nodesMap: /* @__PURE__ */ new Map(),\n boundingBox: {\n min: new E.Vector3(o.baseInfo.min.X * 0.3048, o.baseInfo.min.Z * 0.3048, -o.baseInfo.min.Y * 0.3048),\n max: new E.Vector3(o.baseInfo.max.X * 0.3048, o.baseInfo.max.Z * 0.3048, -o.baseInfo.max.Y * 0.3048)\n }\n }), s.events.trigger(_n.EngineFree, null);\n });\n}\nfunction Ru(s) {\n s.engineStatus.models.forEach((e) => {\n e.loadStatus == null && (e.loadStatus = {\n mep: !1,\n instance: !1,\n normal: !1\n }), e.status === \"loading\" && e.type === \"light\" && (e.loadStatus.modelMep != !0 && (e.loadStatus.modelMep = !0, qh(s, e.info.modelMep, e.url)), e.loadStatus.normal != !0 && Du(s, e));\n });\n}\nfunction Du(s, e) {\n if (s.camera.position, e.size, e.info == null || e.info.lods == null)\n return;\n e.info.lods.forEach((i) => {\n if (i.status != !0)\n if (i.glbs == null)\n console.log(\"加载GLB.............\"), i.glbs = {}, Gh(e.url + i.path, (o) => {\n Hh(o.get(\"/nodes.json\"), (r) => {\n let a = JSON.parse(r), l = /* @__PURE__ */ new Map();\n s.models.find((c) => c.url == e.url).nodesMap = l;\n let h = 0;\n for (let c in a) {\n a[c].forEach((p) => {\n p.glb = c, l.has(p.id) == !1 ? l.set(p.id, { infos: [p] }) : l.get(p.id).infos.push(p);\n });\n let u = new Zh();\n const d = new Wh();\n d.setDecoderPath(\"/static/js/draco/\"), d.preload(), u.setDRACOLoader(d), u.load(o.get(c + \".glb\"), (p) => {\n i.glbs[c] = p.scene.children, h++, h == Object.keys(a).length && s.engineStatus.isFree && (s.events.trigger(_n.EngineFree, null), s.viewCube.CameraGoHome());\n });\n }\n });\n });\n else {\n console.log(\"加载模型.............\");\n let o = n(e, i, i.octreeBox), r = [], a = s.models.find((l) => l.url == e.url);\n o.forEach((l) => {\n a.nodesMap.has(l) && a.nodesMap.get(l).infos.forEach((h) => {\n let c = i.glbs[h.glb][h.mesh];\n if (c != null && c.geometry != null && c.material != null) {\n let u = new E.Matrix4();\n u.elements = h.matrix;\n let d = new E.Mesh(c.geometry.clone().applyMatrix4(u), c.material), p = new E.Box3().setFromObject(d);\n h.box = p, h.mesh = d, d.name = l, d.glb = h.glb, d.url = e.url, r.push(d);\n }\n });\n }), console.log(\"加载模型数量\", r.length), Lu(e.url, s, r);\n }\n });\n function n(i, o, r) {\n let a = [];\n if (r.status != !0) {\n if (!s.engineStatus.isFree)\n return a;\n let l = new E.Vector3(r.min.X, r.min.Z, -r.min.Y), h = new E.Vector3(r.max.X, r.max.Z, -r.max.Y);\n h.distanceTo(l);\n let c = s.camera.position, u = new E.Vector3(l.x + h.x / 2, l.y + h.y / 2, l.z + h.z / 2);\n c.distanceTo(u), r.elements.forEach((d) => {\n a.push(d);\n }), r.children.forEach((d) => {\n a.push(...n(i, o, d));\n }), r.children.findIndex((d) => d.status != !0) == -1 && (r.status = !0), r.children.length == 0 && (r.status = !0);\n }\n return a;\n }\n}\nfunction Lu(s, e, t) {\n let n = [];\n t.forEach((i) => {\n n.findIndex((r) => r.glb == i.glb) == -1 ? n.push({\n glb: i.glb,\n meshes: [i],\n currentIndex: i.geometry.index.count,\n indexes: /* @__PURE__ */ new Map()\n }) : (n.find((r) => r.glb == i.glb).meshes.push(i), n.find((r) => r.glb == i.glb).currentIndex += i.geometry.index.count);\n let o = n.find((r) => r.glb == i.glb);\n o.indexes.set(Number(i.name), [o.currentIndex - i.geometry.index.count, o.currentIndex]);\n }), n.forEach((i) => {\n let o = e.scene.children.find((r) => r instanceof E.Mesh && r.url == s && r.glb == i.glb);\n if (o != null)\n o.castShadow = !0, o.receiveShadow = !0;\n else {\n let r = new E.BufferGeometry();\n i.meshes.map((h) => h.material), r = Kh(i.meshes.map((h) => h.geometry), !0);\n let a = new E.Mesh(r, i.meshes.map((h) => h.material));\n a.castShadow = !0, a.receiveShadow = !0, e.scene.add(a), a.index = e.scene.children.length - 1, a.url = s, a.glb = i.glb, a.indexes = i.indexes, a.materialClone = i.meshes[0].material;\n let l = e.models.find((h) => h.url == s);\n if (l != null) {\n let h = 0;\n i.indexes.forEach((c) => {\n l.nodesMap.get(Number(i.meshes[h].name)).indexes == null && (l.nodesMap.get(Number(i.meshes[h].name)).indexes = []), l.nodesMap.get(Number(i.meshes[h].name)).indexes.push([a.index, h++, c[0], c[1]]);\n });\n }\n a.material instanceof Array ? a.material.forEach((h) => {\n qr(h);\n }) : qr(a.material);\n }\n });\n}\nfunction qr(s) {\n s.shadowSide = E.FrontSide, s.roughness = 0.6, s.metalness = 0, s.side = E.DoubleSide, s.map != null && (s.map.colorSpace = E.SRGBColorSpace, s.map.needsUpdate = !0, console.log(\"优化贴图\")), s instanceof E.MeshStandardMaterial && (s.map && (s.map.colorSpace = E.SRGBColorSpace, s.map.needsUpdate = !0), s.emissiveMap && (s.emissiveMap.colorSpace = E.SRGBColorSpace, s.emissiveMap.needsUpdate = !0), s.roughnessMap && (s.roughnessMap.colorSpace = E.LinearSRGBColorSpace, s.roughnessMap.needsUpdate = !0), s.metalnessMap && (s.metalnessMap.colorSpace = E.LinearSRGBColorSpace, s.metalnessMap.needsUpdate = !0), s.normalMap && (s.normalMap.colorSpace = E.LinearSRGBColorSpace, s.normalMap.needsUpdate = !0), s.aoMap && (s.aoMap.colorSpace = E.LinearSRGBColorSpace, s.aoMap.needsUpdate = !0), s.roughness = Math.max(0.1, Math.min(1, s.roughness)), s.metalness = Math.max(0, Math.min(1, s.metalness)), s.envMapIntensity = s.envMapIntensity || 1, s.needsUpdate = !0), s instanceof E.MeshPhysicalMaterial && (this.optimizeMaterial(s), s.transmissionMap && (s.transmissionMap.colorSpace = E.LinearSRGBColorSpace, s.transmissionMap.needsUpdate = !0), s.thicknessMap && (s.thicknessMap.colorSpace = E.LinearSRGBColorSpace, s.thicknessMap.needsUpdate = !0), s.transmission = Math.max(0, Math.min(1, s.transmission)), s.thickness = Math.max(0, Math.min(10, s.thickness))), s instanceof E.MeshBasicMaterial && s.map && (s.map.colorSpace = E.SRGBColorSpace, s.map.needsUpdate = !0), s instanceof E.MeshLambertMaterial && (s.map && (s.map.colorSpace = E.SRGBColorSpace, s.map.needsUpdate = !0), s.emissiveMap && (s.emissiveMap.colorSpace = E.SRGBColorSpace, s.emissiveMap.needsUpdate = !0));\n}\nclass Bu {\n engine;\n constructor(e) {\n this.engine = e;\n }\n // 加载多个模型\n async loadModels(e, t) {\n for (const i of e)\n n(i) === \"light\" && ku(this.engine, i);\n function n(i) {\n const o = i.split(\".\").pop();\n return o === \"glb\" || o === \"gltf\" ? \"gltf\" : \"light\";\n }\n }\n}\nclass Iu {\n engine;\n isFree;\n highlightModels;\n hideModels;\n models;\n constructor(e) {\n this.engine = e, this.isFree = !0, this.highlightModels = [], this.hideModels = [], this.models = [];\n }\n init() {\n this.engine.events.on(_n.EngineFree, () => {\n this.updateFree(!0), console.log(\"引擎空闲\"), Ru(this.engine);\n }), this.engine.events.on(_n.EngineBusy, () => {\n this.updateFree(!1), console.log(\"引擎繁忙\");\n });\n }\n // 更新引擎空闲状态\n updateFree(e) {\n this.isFree = e;\n }\n // 关闭所有功能\n closeAllFunction = () => {\n };\n}\nclass zu {\n listeners = /* @__PURE__ */ new Map();\n on(e, t) {\n this.listeners.has(e) || this.listeners.set(e, []), this.listeners.get(e).push(t);\n }\n off(e, t) {\n if (!this.listeners.has(e)) return;\n const n = this.listeners.get(e), i = n.indexOf(t);\n i !== -1 && n.splice(i, 1);\n }\n trigger(e, t) {\n this.listeners.has(e) && this.listeners.get(e).forEach((n) => {\n try {\n n(t);\n } catch (i) {\n console.error(`Error in event listener for ${e}:`, i);\n }\n });\n }\n}\nclass Nu {\n engine;\n constructor(e) {\n this.engine = e;\n }\n // 加入场景基本光照\n init() {\n const e = new E.DirectionalLight(16777215, 2);\n e.position.set(10, 20, 10), e.castShadow = !0, e.shadow.mapSize.width = 4096, e.shadow.mapSize.height = 4096, e.shadow.camera.near = 0.1, e.shadow.camera.far = 500, e.shadow.bias = -5e-5, e.shadow.normalBias = 0.02;\n const t = 50;\n e.shadow.camera.left = -t, e.shadow.camera.right = t, e.shadow.camera.top = t, e.shadow.camera.bottom = -t, e.shadow.radius = 2, this.engine.scene.add(e);\n const n = new E.AmbientLight(16777215, 1);\n this.engine.scene.add(n);\n }\n}\nvar wt = /* @__PURE__ */ ((s) => (s.ModelLoadStart = \"model-load-start\", s.ModelLoadProgress = \"model-load-progress\", s.ModelLoaded = \"model-loaded\", s.ModelError = \"model-error\", s.SelectionChanged = \"selection-changed\", s.HoverChanged = \"hover-changed\", s.Click = \"click\", s.MouseMove = \"mouse-move\", s.CameraChanged = \"camera-changed\", s.CameraIdle = \"camera-idle\", s.EngineFree = \"engine-free\", s.EngineBusy = \"engine-busy\", s.MeasureChanged = \"measure-changed\", s))(wt || {});\nclass Ou {\n engine;\n behavior;\n isCtrlDown = !1;\n constructor(e) {\n this.engine = e;\n }\n init() {\n this.behavior = this.engine.handelBehaved, this.behavior.init(this);\n }\n active() {\n this.behavior.active();\n }\n disActive() {\n this.behavior.disActive();\n }\n // 键盘事件\n handelKeyCtrlUp() {\n this.isCtrlDown = !1;\n }\n handelKeyCtrlDown() {\n this.isCtrlDown = !0;\n }\n // 业务功能-监听鼠标谈起,点选模型\n handleMouseClick(e) {\n if (this.handleMouseClickInstance(e.raycaster), e.catch) {\n const t = e.catch;\n t.object, this.engine.events.trigger(wt.Click, t);\n let n = t.object;\n this.isCtrlDown || this.engine.modelToolModule.unhighlightAllModels(), console.log([{ url: n.url, ids: [n.name] }]), this.engine.controlModule.orbitControls.origin.set(t.point.x, t.point.y, t.point.z), this.engine.modelToolModule.highlightModel([{ url: n.url, ids: [n.name] }]);\n } else\n this.engine.modelToolModule.unhighlightAllModels();\n }\n // 双击模型事件\n handleMouseDoubleClick(e) {\n if (e.catch) {\n const n = e.catch;\n n.object, this.engine.events.trigger(wt.Click, n);\n let i = n.object, a = this.engine.models.find((h) => h.url === i.url).nodesMap.get(i.name).infos.map((h) => h.box), l = t(a);\n this.engine.viewCube.zoomToModel(l);\n }\n function t(n) {\n let i = new E.Vector3(1e8, 1e9, 1e10), o = new E.Vector3(-1e8, -1e9, -1e10);\n return n.forEach((r) => {\n r.min.x < i.x && (i.x = r.min.x), r.min.y < i.y && (i.y = r.min.y), r.min.z < i.z && (i.z = r.min.z), r.max.x > o.x && (o.x = r.max.x), r.max.y > o.y && (o.y = r.max.y), r.max.z > o.z && (o.z = r.max.z);\n }), new E.Box3(i, o);\n }\n }\n // 判断点击instance节点\n handleMouseClickInstance(e) {\n return e.intersectObjects(this.engine.scene.children.filter((n) => n instanceof E.InstancedMesh), !0);\n }\n}\nclass Uu {\n engine;\n highlightMaterial;\n hideMaterial;\n constructor(e) {\n this.engine = e, this.highlightMaterial = new E.MeshBasicMaterial({\n color: 43775,\n // 明显的蓝色\n depthTest: !1,\n // 不进行深度测试,始终显示\n depthWrite: !1,\n // 不写入深度缓冲\n transparent: !0,\n opacity: 0.5,\n // 半透明效果\n side: E.DoubleSide\n // 双面渲染\n }), this.hideMaterial = new E.MeshBasicMaterial({\n color: 0,\n // 明显的蓝色\n depthTest: !1,\n // 不进行深度测试,始终显示\n depthWrite: !1,\n // 不写入深度缓冲\n transparent: !0,\n opacity: 0,\n // 半透明效果\n side: E.DoubleSide\n // 双面渲染\n });\n }\n // 设置模型高亮\n highlightModel(e) {\n e.forEach((t) => {\n t.ids.forEach((n) => {\n this.engine.models.find((o) => o.url == t.url).nodesMap.get(n).indexes.forEach((o) => {\n Kr(this.engine.scene.children[o[0]]), this.engine.scene.children[o[0]].material[o[1]] = this.highlightMaterial;\n });\n }), this.engine.engineStatus.highlightModels.push(t);\n });\n }\n // 取消模型高亮\n unhighlightModel(e) {\n e.forEach((t) => {\n t.ids.forEach((n) => {\n this.engine.models.find((o) => o.url == t.url).nodesMap.get(n).indexes.forEach((o) => {\n this.engine.scene.children[o[0]].material[o[1]] = this.engine.scene.children[o[0]].materialClone;\n });\n });\n });\n }\n // 取消所有模型高亮\n unhighlightAllModels() {\n this.engine.engineStatus.highlightModels.forEach((e) => {\n this.unhighlightModel([e]);\n }), this.engine.engineStatus.highlightModels = [];\n }\n // 隐藏模型\n hideModel(e) {\n e.forEach((t) => {\n t.ids.forEach((i) => {\n let o = this.engine.models.find((r) => r.url == t.url).nodesMap.get(i);\n this.engine.modelEdge.hideModelEdge(t.url, i), o.indexes.forEach((r) => {\n Kr(this.engine.scene.children[r[0]]), this.engine.scene.children[r[0]].material[r[1]] = this.hideMaterial;\n });\n });\n let n = this.engine.engineStatus.hideModels.find((i) => i.url == t.url);\n n != null ? n.ids.push(...t.ids) : this.engine.engineStatus.hideModels.push({\n url: t.url,\n ids: t.ids\n }), this.engine.engineStatus.highlightModels = [];\n });\n }\n // 显示模型\n showModel(e) {\n e.forEach((t) => {\n t.ids.forEach((n) => {\n let i = this.engine.models.find((o) => o.url == t.url).nodesMap.get(n);\n this.engine.modelEdge.showModelEdge(t.url, n), i.indexes.forEach((o) => {\n this.engine.scene.children[o[0]].material[o[1]] = this.engine.scene.children[o[0]].materialClone;\n });\n }), this.engine.engineStatus.hideModels.push(t);\n });\n }\n // 隔离模型 - 只显示传入的模型,隐藏其他所有模型\n isolateModel(e) {\n const t = [];\n this.engine.models.forEach((i) => {\n const o = Array.from(i.nodesMap.keys());\n t.push({\n url: i.url,\n ids: o\n });\n });\n const n = [];\n t.forEach((i) => {\n const o = e.find((r) => r.url === i.url);\n if (o) {\n const r = i.ids.filter((a) => !o.ids.includes(a));\n r.length > 0 && n.push({\n url: i.url,\n ids: r\n });\n } else\n n.push(i);\n }), n.length > 0 && this.hideModel(n);\n }\n // 显示所有模型\n showAllModels() {\n }\n // 设置模型颜色\n setModelColor(e, t) {\n e.material.color.set(t);\n }\n // 设置所有模型颜色\n setAllModelsColor(e) {\n this.engine.scene.children.forEach((t) => {\n t.isMesh;\n });\n }\n // 恢复所有模型颜色\n restoreAllModelsColor() {\n this.engine.scene.children.forEach((e) => {\n e.isMesh;\n });\n }\n // 获取当前选中模型的box包围盒\n getModelsBox(e) {\n new E.Box3();\n let t = [];\n return e.forEach((i) => {\n let o = this.engine.models.find((r) => r.url == i.url);\n i.ids.forEach((r) => {\n o.nodesMap.get(r).infos.forEach((l) => {\n t.push(l.box);\n });\n });\n }), n(t);\n function n(i) {\n let o = new E.Vector3(1e8, 1e9, 1e10), r = new E.Vector3(-1e8, -1e9, -1e10);\n return i.forEach((a) => {\n a.min.x < o.x && (o.x = a.min.x), a.min.y < o.y && (o.y = a.min.y), a.min.z < o.z && (o.z = a.min.z), a.max.x > r.x && (r.x = a.max.x), a.max.y > r.y && (r.y = a.max.y), a.max.z > r.z && (r.z = a.max.z);\n }), new E.Box3(o, r);\n }\n }\n // 获取模型的精准位置描述,给大模型用的,主要是\n getModelDescription(e) {\n }\n}\nfunction Kr(s) {\n (s.isSplit == null || s.isSplit == null || s.isSplit == !1) && (s.isSplit = !0);\n}\nclass Ge {\n /**\n * 构造函数\n * @param camera - Three.js 相机对象(用于投影计算)\n * @param renderer - Three.js 渲染器对象(用于获取画布尺寸)\n * @param scene - Three.js 场景对象(用于屏幕坐标转世界坐标时的射线检测,可选)\n */\n constructor(e, t, n) {\n this.camera = e, this.renderer = t, this.scene = n, this.raycaster = new E.Raycaster();\n }\n raycaster;\n /**\n * 将世界坐标转换为屏幕坐标(归一化坐标,范围 -1 到 1)\n * @param worldPos - 世界空间中的3D坐标点\n * @returns 归一化的屏幕坐标,x 和 y 的范围都是 -1 到 1\n * x: -1 表示屏幕左边缘,1 表示屏幕右边缘\n * y: -1 表示屏幕下边缘,1 表示屏幕上边缘\n */\n worldToScreenNormalized(e) {\n const t = e.clone();\n return t.project(this.camera), new E.Vector2(t.x, t.y);\n }\n /**\n * 将世界坐标转换为屏幕坐标(像素坐标)\n * @param worldPos - 世界空间中的3D坐标点\n * @returns 屏幕像素坐标,x 和 y 表示在画布上的实际像素位置\n * x: 0 表示屏幕左边缘,width 表示屏幕右边缘\n * y: 0 表示屏幕上边缘,height 表示屏幕下边缘\n */\n worldToScreen(e) {\n const t = this.worldToScreenNormalized(e), n = this.renderer.domElement.width, i = this.renderer.domElement.height, o = (t.x + 1) * n / 2, r = (1 - t.y) * i / 2;\n return new E.Vector2(o, r);\n }\n /**\n * 将屏幕坐标(像素坐标)转换为归一化坐标\n * @param screenX - 屏幕像素 X 坐标\n * @param screenY - 屏幕像素 Y 坐标\n * @returns 归一化的屏幕坐标,范围 -1 到 1\n */\n screenToNormalized(e, t) {\n const n = this.renderer.domElement.clientWidth, i = this.renderer.domElement.clientHeight, o = e / n * 2 - 1, r = -(t / i * 2 - 1);\n return new E.Vector2(o, r);\n }\n /**\n * 将屏幕坐标(像素坐标)转换为世界坐标\n * 使用射线检测,返回与场景中第一个相交对象的世界坐标点\n * @param screenX - 屏幕像素 X 坐标\n * @param screenY - 屏幕像素 Y 坐标\n * @param objects - 可选,指定要检测的对象数组。如果不提供且 scene 存在,则检测场景中的所有对象\n * @returns 世界坐标点,如果没有相交则返回 null\n */\n screenToWorld(e, t, n) {\n if (!this.scene && !n)\n return console.warn(\"WorldToScreen: 需要提供 scene 或 objects 参数才能进行屏幕坐标转世界坐标\"), null;\n const i = this.screenToNormalized(e, t);\n this.raycaster.setFromCamera(i, this.camera);\n const o = n || this.scene.children, r = this.raycaster.intersectObjects(o, !0);\n return r.length > 0 ? r[0].point : null;\n }\n /**\n * 将屏幕坐标转换为指定深度的世界坐标\n * @param screenX - 屏幕像素 X 坐标\n * @param screenY - 屏幕像素 Y 坐标\n * @param depth - 沿射线方向的距离(世界单位)\n * @returns 世界坐标点\n */\n screenToWorldWithDepth(e, t, n = 0) {\n const i = this.screenToNormalized(e, t);\n this.raycaster.setFromCamera(i, this.camera);\n const o = new E.Vector3();\n return this.raycaster.ray.at(n, o), o;\n }\n /**\n * 更新相机引用(当相机发生变化时调用)\n * @param camera - 新的相机对象\n */\n updateCamera(e) {\n this.camera = e;\n }\n /**\n * 更新渲染器引用(当渲染器发生变化时调用)\n * @param renderer - 新的渲染器对象\n */\n updateRenderer(e) {\n this.renderer = e;\n }\n /**\n * 更新场景引用(当场景发生变化时调用)\n * @param scene - 新的场景对象\n */\n updateScene(e) {\n this.scene = e;\n }\n}\nvar Mi = { exports: {} }, Fu = Mi.exports, Zr;\nfunction Vu() {\n return Zr || (Zr = 1, (function(s, e) {\n (function(t, n) {\n s.exports = n();\n })(Fu, function() {\n var t = function() {\n function n(p) {\n return r.appendChild(p.dom), p;\n }\n function i(p) {\n for (var f = 0; f < r.children.length; f++) r.children[f].style.display = f === p ? \"block\" : \"none\";\n o = p;\n }\n var o = 0, r = document.createElement(\"div\");\n r.style.cssText = \"position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000\", r.addEventListener(\"click\", function(p) {\n p.preventDefault(), i(++o % r.children.length);\n }, !1);\n var a = (performance || Date).now(), l = a, h = 0, c = n(new t.Panel(\"FPS\", \"#0ff\", \"#002\")), u = n(new t.Panel(\"MS\", \"#0f0\", \"#020\"));\n if (self.performance && self.performance.memory) var d = n(new t.Panel(\"MB\", \"#f08\", \"#201\"));\n return i(0), { REVISION: 16, dom: r, addPanel: n, showPanel: i, begin: function() {\n a = (performance || Date).now();\n }, end: function() {\n h++;\n var p = (performance || Date).now();\n if (u.update(p - a, 200), p > l + 1e3 && (c.update(1e3 * h / (p - l), 100), l = p, h = 0, d)) {\n var f = performance.memory;\n d.update(f.usedJSHeapSize / 1048576, f.jsHeapSizeLimit / 1048576);\n }\n return p;\n }, update: function() {\n a = this.end();\n }, domElement: r, setMode: i };\n };\n return t.Panel = function(n, i, o) {\n var r = 1 / 0, a = 0, l = Math.round, h = l(window.devicePixelRatio || 1), c = 80 * h, u = 48 * h, d = 3 * h, p = 2 * h, f = 3 * h, m = 15 * h, g = 74 * h, y = 30 * h, w = document.createElement(\"canvas\");\n w.width = c, w.height = u, w.style.cssText = \"width:80px;height:48px\";\n var _ = w.getContext(\"2d\");\n return _.font = \"bold \" + 9 * h + \"px Helvetica,Arial,sans-serif\", _.textBaseline = \"top\", _.fillStyle = o, _.fillRect(0, 0, c, u), _.fillStyle = i, _.fillText(n, d, p), _.fillRect(f, m, g, y), _.fillStyle = o, _.globalAlpha = 0.9, _.fillRect(f, m, g, y), { dom: w, update: function(x, b) {\n r = Math.min(r, x), a = Math.max(a, x), _.fillStyle = o, _.globalAlpha = 1, _.fillRect(0, 0, c, m), _.fillStyle = i, _.fillText(l(x) + \" \" + n + \" (\" + l(r) + \"-\" + l(a) + \")\", d, p), _.drawImage(w, f + h, m, g - h, y, f, m, g - h, y), _.fillRect(f + g - h, m, h, y), _.fillStyle = o, _.globalAlpha = 0.9, _.fillRect(f + g - h, m, h, l((1 - x / b) * y));\n } };\n }, t;\n });\n })(Mi)), Mi.exports;\n}\nvar ju = Vu();\nconst Hu = /* @__PURE__ */ qo(ju);\nvar gn = Object.freeze({\n Linear: Object.freeze({\n None: function(s) {\n return s;\n },\n In: function(s) {\n return s;\n },\n Out: function(s) {\n return s;\n },\n InOut: function(s) {\n return s;\n }\n }),\n Quadratic: Object.freeze({\n In: function(s) {\n return s * s;\n },\n Out: function(s) {\n return s * (2 - s);\n },\n InOut: function(s) {\n return (s *= 2) < 1 ? 0.5 * s * s : -0.5 * (--s * (s - 2) - 1);\n }\n }),\n Cubic: Object.freeze({\n In: function(s) {\n return s * s * s;\n },\n Out: function(s) {\n return --s * s * s + 1;\n },\n InOut: function(s) {\n return (s *= 2) < 1 ? 0.5 * s * s * s : 0.5 * ((s -= 2) * s * s + 2);\n }\n }),\n Quartic: Object.freeze({\n In: function(s) {\n return s * s * s * s;\n },\n Out: function(s) {\n return 1 - --s * s * s * s;\n },\n InOut: function(s) {\n return (s *= 2) < 1 ? 0.5 * s * s * s * s : -0.5 * ((s -= 2) * s * s * s - 2);\n }\n }),\n Quintic: Object.freeze({\n In: function(s) {\n return s * s * s * s * s;\n },\n Out: function(s) {\n return --s * s * s * s * s + 1;\n },\n InOut: function(s) {\n return (s *= 2) < 1 ? 0.5 * s * s * s * s * s : 0.5 * ((s -= 2) * s * s * s * s + 2);\n }\n }),\n Sinusoidal: Object.freeze({\n In: function(s) {\n return 1 - Math.sin((1 - s) * Math.PI / 2);\n },\n Out: function(s) {\n return Math.sin(s * Math.PI / 2);\n },\n InOut: function(s) {\n return 0.5 * (1 - Math.sin(Math.PI * (0.5 - s)));\n }\n }),\n Exponential: Object.freeze({\n In: function(s) {\n return s === 0 ? 0 : Math.pow(1024, s - 1);\n },\n Out: function(s) {\n return s === 1 ? 1 : 1 - Math.pow(2, -10 * s);\n },\n InOut: function(s) {\n return s === 0 ? 0 : s === 1 ? 1 : (s *= 2) < 1 ? 0.5 * Math.pow(1024, s - 1) : 0.5 * (-Math.pow(2, -10 * (s - 1)) + 2);\n }\n }),\n Circular: Object.freeze({\n In: function(s) {\n return 1 - Math.sqrt(1 - s * s);\n },\n Out: function(s) {\n return Math.sqrt(1 - --s * s);\n },\n InOut: function(s) {\n return (s *= 2) < 1 ? -0.5 * (Math.sqrt(1 - s * s) - 1) : 0.5 * (Math.sqrt(1 - (s -= 2) * s) + 1);\n }\n }),\n Elastic: Object.freeze({\n In: function(s) {\n return s === 0 ? 0 : s === 1 ? 1 : -Math.pow(2, 10 * (s - 1)) * Math.sin((s - 1.1) * 5 * Math.PI);\n },\n Out: function(s) {\n return s === 0 ? 0 : s === 1 ? 1 : Math.pow(2, -10 * s) * Math.sin((s - 0.1) * 5 * Math.PI) + 1;\n },\n InOut: function(s) {\n return s === 0 ? 0 : s === 1 ? 1 : (s *= 2, s < 1 ? -0.5 * Math.pow(2, 10 * (s - 1)) * Math.sin((s - 1.1) * 5 * Math.PI) : 0.5 * Math.pow(2, -10 * (s - 1)) * Math.sin((s - 1.1) * 5 * Math.PI) + 1);\n }\n }),\n Back: Object.freeze({\n In: function(s) {\n var e = 1.70158;\n return s === 1 ? 1 : s * s * ((e + 1) * s - e);\n },\n Out: function(s) {\n var e = 1.70158;\n return s === 0 ? 0 : --s * s * ((e + 1) * s + e) + 1;\n },\n InOut: function(s) {\n var e = 2.5949095;\n return (s *= 2) < 1 ? 0.5 * (s * s * ((e + 1) * s - e)) : 0.5 * ((s -= 2) * s * ((e + 1) * s + e) + 2);\n }\n }),\n Bounce: Object.freeze({\n In: function(s) {\n return 1 - gn.Bounce.Out(1 - s);\n },\n Out: function(s) {\n return s < 1 / 2.75 ? 7.5625 * s * s : s < 2 / 2.75 ? 7.5625 * (s -= 1.5 / 2.75) * s + 0.75 : s < 2.5 / 2.75 ? 7.5625 * (s -= 2.25 / 2.75) * s + 0.9375 : 7.5625 * (s -= 2.625 / 2.75) * s + 0.984375;\n },\n InOut: function(s) {\n return s < 0.5 ? gn.Bounce.In(s * 2) * 0.5 : gn.Bounce.Out(s * 2 - 1) * 0.5 + 0.5;\n }\n }),\n generatePow: function(s) {\n return s === void 0 && (s = 4), s = s < Number.EPSILON ? Number.EPSILON : s, s = s > 1e4 ? 1e4 : s, {\n In: function(e) {\n return Math.pow(e, s);\n },\n Out: function(e) {\n return 1 - Math.pow(1 - e, s);\n },\n InOut: function(e) {\n return e < 0.5 ? Math.pow(e * 2, s) / 2 : (1 - Math.pow(2 - e * 2, s)) / 2 + 0.5;\n }\n };\n }\n}), Bn = function() {\n return performance.now();\n}, Gu = (\n /** @class */\n (function() {\n function s() {\n this._tweens = {}, this._tweensAddedDuringUpdate = {};\n }\n return s.prototype.getAll = function() {\n var e = this;\n return Object.keys(this._tweens).map(function(t) {\n return e._tweens[t];\n });\n }, s.prototype.removeAll = function() {\n this._tweens = {};\n }, s.prototype.add = function(e) {\n this._tweens[e.getId()] = e, this._tweensAddedDuringUpdate[e.getId()] = e;\n }, s.prototype.remove = function(e) {\n delete this._tweens[e.getId()], delete this._tweensAddedDuringUpdate[e.getId()];\n }, s.prototype.update = function(e, t) {\n e === void 0 && (e = Bn()), t === void 0 && (t = !1);\n var n = Object.keys(this._tweens);\n if (n.length === 0)\n return !1;\n for (; n.length > 0; ) {\n this._tweensAddedDuringUpdate = {};\n for (var i = 0; i < n.length; i++) {\n var o = this._tweens[n[i]], r = !t;\n o && o.update(e, r) === !1 && !t && delete this._tweens[n[i]];\n }\n n = Object.keys(this._tweensAddedDuringUpdate);\n }\n return !0;\n }, s;\n })()\n), Fs = {\n Linear: function(s, e) {\n var t = s.length - 1, n = t * e, i = Math.floor(n), o = Fs.Utils.Linear;\n return e < 0 ? o(s[0], s[1], n) : e > 1 ? o(s[t], s[t - 1], t - n) : o(s[i], s[i + 1 > t ? t : i + 1], n - i);\n },\n Utils: {\n Linear: function(s, e, t) {\n return (e - s) * t + s;\n }\n }\n}, va = (\n /** @class */\n (function() {\n function s() {\n }\n return s.nextId = function() {\n return s._nextId++;\n }, s._nextId = 0, s;\n })()\n), Vs = new Gu(), Wu = (\n /** @class */\n (function() {\n function s(e, t) {\n t === void 0 && (t = Vs), this._object = e, this._group = t, this._isPaused = !1, this._pauseStart = 0, this._valuesStart = {}, this._valuesEnd = {}, this._valuesStartRepeat = {}, this._duration = 1e3, this._isDynamic = !1, this._initialRepeat = 0, this._repeat = 0, this._yoyo = !1, this._isPlaying = !1, this._reversed = !1, this._delayTime = 0, this._startTime = 0, this._easingFunction = gn.Linear.None, this._interpolationFunction = Fs.Linear, this._chainedTweens = [], this._onStartCallbackFired = !1, this._onEveryStartCallbackFired = !1, this._id = va.nextId(), this._isChainStopped = !1, this._propertiesAreSetUp = !1, this._goToEnd = !1;\n }\n return s.prototype.getId = function() {\n return this._id;\n }, s.prototype.isPlaying = function() {\n return this._isPlaying;\n }, s.prototype.isPaused = function() {\n return this._isPaused;\n }, s.prototype.getDuration = function() {\n return this._duration;\n }, s.prototype.to = function(e, t) {\n if (t === void 0 && (t = 1e3), this._isPlaying)\n throw new Error(\"Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.\");\n return this._valuesEnd = e, this._propertiesAreSetUp = !1, this._duration = t < 0 ? 0 : t, this;\n }, s.prototype.duration = function(e) {\n return e === void 0 && (e = 1e3), this._duration = e < 0 ? 0 : e, this;\n }, s.prototype.dynamic = function(e) {\n return e === void 0 && (e = !1), this._isDynamic = e, this;\n }, s.prototype.start = function(e, t) {\n if (e === void 0 && (e = Bn()), t === void 0 && (t = !1), this._isPlaying)\n return this;\n if (this._group && this._group.add(this), this._repeat = this._initialRepeat, this._reversed) {\n this._reversed = !1;\n for (var n in this._valuesStartRepeat)\n this._swapEndStartRepeatValues(n), this._valuesStart[n] = this._valuesStartRepeat[n];\n }\n if (this._isPlaying = !0, this._isPaused = !1, this._onStartCallbackFired = !1, this._onEveryStartCallbackFired = !1, this._isChainStopped = !1, this._startTime = e, this._startTime += this._delayTime, !this._propertiesAreSetUp || t) {\n if (this._propertiesAreSetUp = !0, !this._isDynamic) {\n var i = {};\n for (var o in this._valuesEnd)\n i[o] = this._valuesEnd[o];\n this._valuesEnd = i;\n }\n this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, t);\n }\n return this;\n }, s.prototype.startFromCurrentValues = function(e) {\n return this.start(e, !0);\n }, s.prototype._setupProperties = function(e, t, n, i, o) {\n for (var r in n) {\n var a = e[r], l = Array.isArray(a), h = l ? \"array\" : typeof a, c = !l && Array.isArray(n[r]);\n if (!(h === \"undefined\" || h === \"function\")) {\n if (c) {\n var u = n[r];\n if (u.length === 0)\n continue;\n for (var d = [a], p = 0, f = u.length; p < f; p += 1) {\n var m = this._handleRelativeValue(a, u[p]);\n if (isNaN(m)) {\n c = !1, console.warn(\"Found invalid interpolation list. Skipping.\");\n break;\n }\n d.push(m);\n }\n c && (n[r] = d);\n }\n if ((h === \"object\" || l) && a && !c) {\n t[r] = l ? [] : {};\n var g = a;\n for (var y in g)\n t[r][y] = g[y];\n i[r] = l ? [] : {};\n var u = n[r];\n if (!this._isDynamic) {\n var w = {};\n for (var y in u)\n w[y] = u[y];\n n[r] = u = w;\n }\n this._setupProperties(g, t[r], u, i[r], o);\n } else\n (typeof t[r] > \"u\" || o) && (t[r] = a), l || (t[r] *= 1), c ? i[r] = n[r].slice().reverse() : i[r] = t[r] || 0;\n }\n }\n }, s.prototype.stop = function() {\n return this._isChainStopped || (this._isChainStopped = !0, this.stopChainedTweens()), this._isPlaying ? (this._group && this._group.remove(this), this._isPlaying = !1, this._isPaused = !1, this._onStopCallback && this._onStopCallback(this._object), this) : this;\n }, s.prototype.end = function() {\n return this._goToEnd = !0, this.update(1 / 0), this;\n }, s.prototype.pause = function(e) {\n return e === void 0 && (e = Bn()), this._isPaused || !this._isPlaying ? this : (this._isPaused = !0, this._pauseStart = e, this._group && this._group.remove(this), this);\n }, s.prototype.resume = function(e) {\n return e === void 0 && (e = Bn()), !this._isPaused || !this._isPlaying ? this : (this._isPaused = !1, this._startTime += e - this._pauseStart, this._pauseStart = 0, this._group && this._group.add(this), this);\n }, s.prototype.stopChainedTweens = function() {\n for (var e = 0, t = this._chainedTweens.length; e < t; e++)\n this._chainedTweens[e].stop();\n return this;\n }, s.prototype.group = function(e) {\n return e === void 0 && (e = Vs), this._group = e, this;\n }, s.prototype.delay = function(e) {\n return e === void 0 && (e = 0), this._delayTime = e, this;\n }, s.prototype.repeat = function(e) {\n return e === void 0 && (e = 0), this._initialRepeat = e, this._repeat = e, this;\n }, s.prototype.repeatDelay = function(e) {\n return this._repeatDelayTime = e, this;\n }, s.prototype.yoyo = function(e) {\n return e === void 0 && (e = !1), this._yoyo = e, this;\n }, s.prototype.easing = function(e) {\n return e === void 0 && (e = gn.Linear.None), this._easingFunction = e, this;\n }, s.prototype.interpolation = function(e) {\n return e === void 0 && (e = Fs.Linear), this._interpolationFunction = e, this;\n }, s.prototype.chain = function() {\n for (var e = [], t = 0; t < arguments.length; t++)\n e[t] = arguments[t];\n return this._chainedTweens = e, this;\n }, s.prototype.onStart = function(e) {\n return this._onStartCallback = e, this;\n }, s.prototype.onEveryStart = function(e) {\n return this._onEveryStartCallback = e, this;\n }, s.prototype.onUpdate = function(e) {\n return this._onUpdateCallback = e, this;\n }, s.prototype.onRepeat = function(e) {\n return this._onRepeatCallback = e, this;\n }, s.prototype.onComplete = function(e) {\n return this._onCompleteCallback = e, this;\n }, s.prototype.onStop = function(e) {\n return this._onStopCallback = e, this;\n }, s.prototype.update = function(e, t) {\n var n = this, i;\n if (e === void 0 && (e = Bn()), t === void 0 && (t = !0), this._isPaused)\n return !0;\n var o, r = this._startTime + this._duration;\n if (!this._goToEnd && !this._isPlaying) {\n if (e > r)\n return !1;\n t && this.start(e, !0);\n }\n if (this._goToEnd = !1, e < this._startTime)\n return !0;\n this._onStartCallbackFired === !1 && (this._onStartCallback && this._onStartCallback(this._object), this._onStartCallbackFired = !0), this._onEveryStartCallbackFired === !1 && (this._onEveryStartCallback && this._onEveryStartCallback(this._object), this._onEveryStartCallbackFired = !0);\n var a = e - this._startTime, l = this._duration + ((i = this._repeatDelayTime) !== null && i !== void 0 ? i : this._delayTime), h = this._duration + this._repeat * l, c = function() {\n if (n._duration === 0 || a > h)\n return 1;\n var g = Math.trunc(a / l), y = a - g * l, w = Math.min(y / n._duration, 1);\n return w === 0 && a === n._duration ? 1 : w;\n }, u = c(), d = this._easingFunction(u);\n if (this._updateProperties(this._object, this._valuesStart, this._valuesEnd, d), this._onUpdateCallback && this._onUpdateCallback(this._object, u), this._duration === 0 || a >= this._duration)\n if (this._repeat > 0) {\n var p = Math.min(Math.trunc((a - this._duration) / l) + 1, this._repeat);\n isFinite(this._repeat) && (this._repeat -= p);\n for (o in this._valuesStartRepeat)\n !this._yoyo && typeof this._valuesEnd[o] == \"string\" && (this._valuesStartRepeat[o] = // eslint-disable-next-line\n // @ts-ignore FIXME?\n this._valuesStartRepeat[o] + parseFloat(this._valuesEnd[o])), this._yoyo && this._swapEndStartRepeatValues(o), this._valuesStart[o] = this._valuesStartRepeat[o];\n return this._yoyo && (this._reversed = !this._reversed), this._startTime += l * p, this._onRepeatCallback && this._onRepeatCallback(this._object), this._onEveryStartCallbackFired = !1, !0;\n } else {\n this._onCompleteCallback && this._onCompleteCallback(this._object);\n for (var f = 0, m = this._chainedTweens.length; f < m; f++)\n this._chainedTweens[f].start(this._startTime + this._duration, !1);\n return this._isPlaying = !1, !1;\n }\n return !0;\n }, s.prototype._updateProperties = function(e, t, n, i) {\n for (var o in n)\n if (t[o] !== void 0) {\n var r = t[o] || 0, a = n[o], l = Array.isArray(e[o]), h = Array.isArray(a), c = !l && h;\n c ? e[o] = this._interpolationFunction(a, i) : typeof a == \"object\" && a ? this._updateProperties(e[o], r, a, i) : (a = this._handleRelativeValue(r, a), typeof a == \"number\" && (e[o] = r + (a - r) * i));\n }\n }, s.prototype._handleRelativeValue = function(e, t) {\n return typeof t != \"string\" ? t : t.charAt(0) === \"+\" || t.charAt(0) === \"-\" ? e + parseFloat(t) : parseFloat(t);\n }, s.prototype._swapEndStartRepeatValues = function(e) {\n var t = this._valuesStartRepeat[e], n = this._valuesEnd[e];\n typeof n == \"string\" ? this._valuesStartRepeat[e] = this._valuesStartRepeat[e] + parseFloat(n) : this._valuesStartRepeat[e] = this._valuesEnd[e], this._valuesEnd[e] = t;\n }, s;\n })()\n);\nva.nextId;\nvar ct = Vs;\nct.getAll.bind(ct);\nct.removeAll.bind(ct);\nct.add.bind(ct);\nct.remove.bind(ct);\nct.update.bind(ct);\nvar as = {\n Easing: gn,\n Tween: Wu\n};\nfunction Xu() {\n return new E.Scene();\n}\nfunction qu(s, e) {\n s.appendChild(e.domElement);\n}\nfunction Ku(s, e, t) {\n var n = new Object();\n n.visible = !0;\n let i = null, o, r, a = [];\n n.init = function() {\n o || (h(), c(), u());\n }, n.Hide = function() {\n o.style.display = \"none\", n.visible = !1;\n }, n.Show = function() {\n o.style.display = \"block\", n.visible = !0;\n }, n.RenderScene = function() {\n n.camera.quaternion.copy(e.camera.quaternion);\n let m = new E.Vector3(0, 0, -1).clone().applyMatrix4(e.camera.matrixWorld.clone()), g = e.camera.position.clone().sub(m.clone()).setLength(100);\n n.camera.position.copy(g), n.camera.lookAt(new E.Vector3()), n.sceneOrtho.renderer.render(n.sceneOrtho, n.camera);\n }, n.ToggleDirectionView = function(f) {\n console.log(f);\n var m = new E.Vector3(0, 0, 0);\n f == \"top\" ? m = new E.Vector3(0, 1, 0) : f == \"down\" ? m = new E.Vector3(0, -1, 0) : f == \"front\" ? m = new E.Vector3(0, 0, 1) : f == \"left\" ? m = new E.Vector3(-1, 0, 0) : f == \"back\" ? m = new E.Vector3(0, 0, -1) : f == \"right\" ? m = new E.Vector3(1, 0, 0) : f == \"top_front\" ? m = new E.Vector3(1, 1, 0) : f == \"top_left\" ? m = new E.Vector3(0, 1, -1) : f == \"top_back\" ? m = new E.Vector3(-1, 1, 0) : f == \"top_right\" ? m = new E.Vector3(0, 1, 1) : f == \"down_front\" ? m = new E.Vector3(1, -1, 0) : f == \"down_left\" ? m = new E.Vector3(0, -1, -1) : f == \"down_back\" ? m = new E.Vector3(-1, -1, 0) : f == \"down_right\" ? m = new E.Vector3(0, -1, 1) : f == \"front_right\" ? m = new E.Vector3(1, 0, 1) : f == \"right_back\" ? m = new E.Vector3(-1, 0, 1) : f == \"back_left\" ? m = new E.Vector3(-1, 0, -1) : f == \"left_front\" ? m = new E.Vector3(1, 0, -1) : f == \"top_left_front\" ? m = new E.Vector3(1, 1, -1) : f == \"top_front_right\" ? m = new E.Vector3(1, 1, 1) : f == \"top_right_back\" ? m = new E.Vector3(-1, 1, 1) : f == \"top_back_left\" ? m = new E.Vector3(-1, 1, -1) : f == \"button_left_front\" ? m = new E.Vector3(1, -1, -1) : f == \"button_front_right\" ? m = new E.Vector3(1, -1, 1) : f == \"button_right_back\" ? m = new E.Vector3(-1, 1, 1) : f == \"button_back_left\" && (m = new E.Vector3(-1, -1, -1));\n var g = s.octreeBox.getBoundingBox(), y = g.min, w = g.max, _ = y.clone().add(w.clone()).multiplyScalar(0.5), x = _.clone().add(m.multiplyScalar(1 * w.distanceTo(y)));\n l(e.camera.position, x, s.controls.target.clone(), _);\n }, n.GetCameraPose = function() {\n var f = e.camera.quaternion, m = e.camera.position, g = s.controls.target, y = {\n quaternion: f,\n position: m,\n target: g\n };\n return y;\n }, n.ReductionCameraPose = function(f, m = 1e3, g) {\n var y = new E.Quaternion(\n f.quaternion._x,\n f.quaternion._y,\n f.quaternion._z,\n f.quaternion._w\n ), w = new E.Vector3(f.position.x, f.position.y, f.position.z), _ = new E.Vector3(f.target.x, f.target.y, f.target.z);\n let x = !1;\n l(\n e.camera.position,\n w,\n s.controls.target.clone(),\n _,\n e.camera.quaternion,\n y,\n m,\n (b) => {\n g && (x || (g(b), x = !0));\n }\n ), g && setTimeout(() => {\n x || (g(!0), x = !0);\n }, m + 10);\n }, n.CameraGoHome = function() {\n var f = s.octreeBox.getBoundingBox(), m = f.min.clone().add(f.max.clone()).multiplyScalar(0.5);\n let g = new E.Vector3(1, 1, 1);\n var y = f.max.distanceTo(f.min), w = m.clone().add(g.multiplyScalar(y));\n if (e.camera.isOrthographicCamera) {\n var _ = s.container.clientWidth / s.container.clientHeight, x = y * 0.6;\n e.camera.left = -x * _, e.camera.right = x * _, e.camera.top = x, e.camera.bottom = -x, e.camera.zoom = 1, e.camera.updateProjectionMatrix();\n }\n l(e.camera.position, w, s.controls.target.clone(), m);\n }, n.zoomToBox = function(f) {\n var m = f.min.clone().add(f.max.clone()).multiplyScalar(0.5);\n let y = e.camera.position.clone().sub(s.controls.target.clone()).normalize();\n var w = m.clone().add(y.multiplyScalar(1 * f.max.distanceTo(f.min)));\n l(e.camera.position, w, s.controls.target.clone(), m);\n };\n function l(f, m, g, y, w, _, x = 1e3, b) {\n var A;\n w && _ ? (A = new as.Tween({\n x1: f.x,\n // 相机当前位置x\n y1: f.y,\n // 相机当前位置y\n z1: f.z,\n // 相机当前位置z\n x2: g.x,\n // 控制当前的中心点x\n y2: g.y,\n // 控制当前的中心点y\n z2: g.z,\n // 控制当前的中心点z\n _x: w._x,\n // 相机当前quaternion\n _y: w._y,\n // 相机当前quaternion\n _z: w._z,\n // 相机当前quaternion\n _w: w._w\n // 相机当前quaternion\n }), A.to(\n {\n x1: m.x,\n // 新的相机位置x\n y1: m.y,\n // 新的相机位置y\n z1: m.z,\n // 新的相机位置z\n x2: y.x,\n // 新的控制中心点位置x\n y2: y.y,\n // 新的控制中心点位置x\n z2: y.z,\n // 新的控制中心点位置x\n _x: _._x,\n // 新的相机quaternion\n _y: _._y,\n // 新的相机quaternion\n _z: _._z,\n // 新的相机quaternion\n _w: _._w\n // 新的相机quaternion\n },\n x\n )) : (A = new as.Tween({\n x1: f.x,\n // 相机当前位置x\n y1: f.y,\n // 相机当前位置y\n z1: f.z,\n // 相机当前位置z\n x2: g.x,\n // 控制当前的中心点x\n y2: g.y,\n // 控制当前的中心点y\n z2: g.z\n // 控制当前的中心点z\n }), A.to(\n {\n x1: m.x,\n // 新的相机位置x\n y1: m.y,\n // 新的相机位置y\n z1: m.z,\n // 新的相机位置z\n x2: y.x,\n // 新的控制中心点位置x\n y2: y.y,\n // 新的控制中心点位置x\n z2: y.z\n // 新的控制中心点位置x\n },\n x\n )), A.onUpdate(function(C) {\n w && _ ? (e.camera.quaternion._x = C._x, e.camera.quaternion._y = C._y, e.camera.quaternion._z = C._z, e.camera.quaternion._w = C._w) : s.controls.auto = !0, e.camera.position.x = C.x1, e.camera.position.y = C.y1, e.camera.position.z = C.z1, s.controls.target.x = C.x2, s.controls.target.y = C.y2, s.controls.target.z = C.z2, s.controls.update(), n.RenderScene();\n }), A.onComplete(function(C) {\n s.controls.auto = !1, n.RenderScene(), b && b(!0), cancelAnimationFrame(i), i = null;\n }), A.easing(as.Easing.Cubic.InOut);\n function M(C) {\n i = requestAnimationFrame(M), A.update();\n }\n A.start(), M();\n }\n function h() {\n o = document.createElement(\"div\"), o.className = \"ViewCube\", t.appendChild(o), r = document.createElement(\"div\"), r.className = \"viewSettingWrapper\", r.innerHTML = \"...\", o.appendChild(r);\n var f = document.createElement(\"div\");\n f.className = \"homeViewWrapper\", f.addEventListener(\"mousedown\", function() {\n console.log(\"归位\"), n.CameraGoHome();\n }), o.appendChild(f);\n const m = document.createElement(\"div\");\n m.className = \"cameraToggleWrapper\", m.title = \"切换正交/透视视图\", m.innerHTML = \"⊞\", m.addEventListener(\"mousedown\", function(x) {\n x.stopPropagation(), console.log(\"切换视图\"), n.ToggleCameraType(), w();\n }), o.appendChild(m);\n const g = document.createElement(\"div\");\n g.className = \"screenshotWrapper\", g.title = \"截图\", g.innerHTML = \"📷\", g.addEventListener(\"mousedown\", function(x) {\n x.stopPropagation(), console.log(\"截图\"), n.TakeScreenshot(), w();\n }), o.appendChild(g);\n const y = document.createElement(\"div\");\n y.className = \"fullscreenWrapper\", y.title = \"全屏\", y.innerHTML = \"⛶\", y.addEventListener(\"mousedown\", function(x) {\n x.stopPropagation(), console.log(\"全屏\"), n.ToggleFullscreen(), w();\n }), o.appendChild(y), r.addEventListener(\"mousedown\", function(x) {\n x.stopPropagation(), m.classList.contains(\"show\") ? (w(), console.log(\"隐藏功能按钮\")) : (_(), console.log(\"显示功能按钮\"));\n });\n function w() {\n m.classList.remove(\"show\"), g.classList.remove(\"show\"), y.classList.remove(\"show\");\n }\n function _() {\n m.classList.add(\"show\"), g.classList.add(\"show\"), y.classList.add(\"show\");\n }\n }\n function c() {\n n.sceneOrtho = Xu();\n var g = t.clientWidth, y = t.clientWidth, f = g > y ? g / y : y / g, m = 300;\n n.camera = new E.OrthographicCamera(\n m * f / -2,\n m * f / 2,\n m / 2,\n m / -2,\n 0.01,\n 1e4\n );\n var g = o.clientWidth, y = o.clientHeight, w = new E.WebGLRenderer({\n alpha: !0\n });\n w.setSize(g, y), w.setClearAlpha(0), n.sceneOrtho.renderer = w;\n let _ = new E.AmbientLight(16777215, 0.8);\n n.sceneOrtho.add(_), qu(o, w);\n }\n function u() {\n const f = \"/assets/viewcube/\";\n let m = [\n {\n label: \"右\",\n icon: f + \"cn_right.png\"\n },\n {\n label: \"左\",\n icon: f + \"cn_left.png\"\n },\n {\n label: \"顶\",\n icon: f + \"cn_top.png\"\n },\n {\n label: \"底\",\n icon: f + \"cn_bottom.png\"\n },\n {\n label: \"前\",\n icon: f + \"cn_front.png\"\n },\n {\n label: \"后\",\n icon: f + \"cn_back.png\"\n }\n ];\n var g = [];\n for (const w of m)\n g.push(\n new E.MeshBasicMaterial({\n color: 16777215,\n map: new E.TextureLoader().load(w.icon)\n })\n );\n new E.MeshLambertMaterial({\n color: 255\n });\n var y = new E.Mesh(new E.BoxGeometry(110, 110, 110), g);\n n.sceneOrtho.add(y), d(122), o.addEventListener(\"mousedown\", (w) => {\n var _ = {};\n _.x = w.offsetX / o.clientWidth * 2 - 1, _.y = -(w.offsetY / o.clientHeight) * 2 + 1;\n var x = new E.Raycaster();\n x.setFromCamera(_, n.camera);\n const b = x.intersectObjects(a, !1);\n b.length > 0 && n.ToggleDirectionView(b[0].object.name);\n }), o.addEventListener(\"mousemove\", (w) => {\n var _ = {};\n _.x = w.offsetX / o.clientWidth * 2 - 1, _.y = -(w.offsetY / o.clientHeight) * 2 + 1;\n var x = new E.Raycaster();\n x.setFromCamera(_, n.camera);\n const b = x.intersectObjects(a, !1);\n for (var A of a)\n A.material.opacity = 0.01;\n b.length > 0 && (b[0].object.material.opacity = 0.2);\n });\n }\n function d(f) {\n for (var m = f * 0.5 - 20, g = [\n {\n name: \"right\",\n a: 30,\n b: 75,\n c: 75,\n point: new E.Vector3(m, 0, 0)\n },\n {\n name: \"back\",\n a: 75,\n b: 75,\n c: 30,\n point: new E.Vector3(0, 0, -m)\n },\n {\n name: \"left\",\n a: 30,\n b: 75,\n c: 75,\n point: new E.Vector3(-m, 0, 0)\n },\n {\n name: \"front\",\n a: 75,\n b: 75,\n c: 30,\n point: new E.Vector3(0, 0, m)\n },\n {\n name: \"top\",\n a: 75,\n b: 30,\n c: 75,\n point: new E.Vector3(0, m, 0)\n },\n {\n name: \"button\",\n a: 75,\n b: 30,\n c: 75,\n point: new E.Vector3(0, -m, 0)\n }\n ], y = [\n {\n name: \"top_right_back\",\n a: 30,\n b: 30,\n c: 30,\n point: new E.Vector3(-m, m, m)\n },\n {\n name: \"button_front_right\",\n a: 30,\n b: 30,\n c: 30,\n point: new E.Vector3(-m, -m, m)\n },\n {\n name: \"top_front_right\",\n a: 30,\n b: 30,\n c: 30,\n point: new E.Vector3(m, m, m)\n },\n {\n name: \"button_right_back\",\n a: 30,\n b: 30,\n c: 30,\n point: new E.Vector3(m, -m, m)\n },\n {\n name: \"top_back_left\",\n a: 30,\n b: 30,\n c: 30,\n point: new E.Vector3(-m, m, -m)\n },\n {\n name: \"button_back_left\",\n a: 30,\n b: 30,\n c: 30,\n point: new E.Vector3(-m, -m, -m)\n },\n {\n name: \"top_left_front\",\n a: 30,\n b: 30,\n c: 30,\n point: new E.Vector3(m, m, -m)\n },\n {\n name: \"button_left_front\",\n a: 30,\n b: 30,\n c: 30,\n point: new E.Vector3(m, -m, -m)\n }\n ], w = [\n {\n name: \"top_front\",\n a: 30,\n b: 30,\n c: 75,\n point: new E.Vector3(m, m, 0)\n },\n {\n name: \"top_right\",\n a: 75,\n b: 30,\n c: 30,\n point: new E.Vector3(0, m, m)\n },\n {\n name: \"top_back\",\n a: 30,\n b: 30,\n c: 75,\n point: new E.Vector3(-m, m, 0)\n },\n {\n name: \"top_left\",\n a: 75,\n b: 30,\n c: 30,\n point: new E.Vector3(0, m, -m)\n },\n {\n name: \"button_front\",\n a: 30,\n b: 30,\n c: 75,\n point: new E.Vector3(m, -m, 0)\n },\n {\n name: \"button_right\",\n a: 75,\n b: 30,\n c: 30,\n point: new E.Vector3(0, -m, m)\n },\n {\n name: \"button_back\",\n a: 30,\n b: 30,\n c: 75,\n point: new E.Vector3(-m, -m, 0)\n },\n {\n name: \"button_left\",\n a: 75,\n b: 30,\n c: 30,\n point: new E.Vector3(0, -m, -m)\n },\n {\n name: \"front_right\",\n a: 30,\n b: 75,\n c: 30,\n point: new E.Vector3(m, 0, m)\n },\n {\n name: \"right_back\",\n a: 30,\n b: 75,\n c: 30,\n point: new E.Vector3(-m, 0, m)\n },\n {\n name: \"back_left\",\n a: 30,\n b: 75,\n c: 30,\n point: new E.Vector3(-m, 0, -m)\n },\n {\n name: \"left_front\",\n a: 30,\n b: 75,\n c: 30,\n point: new E.Vector3(m, 0, -m)\n }\n ], _ = 0; _ < g.length; _++)\n a.push(p(g[_]));\n for (var _ = 0; _ < y.length; _++)\n a.push(p(y[_]));\n for (var _ = 0; _ < w.length; _++)\n a.push(p(w[_]));\n }\n function p(f) {\n const m = new E.BoxGeometry(f.a, f.b, f.c), g = new E.MeshBasicMaterial({\n color: \"blue\",\n transparent: !0,\n opacity: 0.01\n }), y = new E.Matrix4().makeTranslation(f.point.x, f.point.y, f.point.z);\n let w = m.applyMatrix4(y), _ = new E.Mesh(w, g);\n return _.name = f.name, n.sceneOrtho.add(_), _;\n }\n return n.ToggleCameraType = function() {\n s.cameraModule.switchCurrentCamera();\n }, n.TakeScreenshot = function() {\n try {\n if (!s.renderer) {\n console.error(\"渲染器未初始化\");\n return;\n }\n s.renderer.render(e, e.camera);\n const m = s.renderer.domElement.toDataURL(\"image/png\"), g = document.createElement(\"a\"), y = (/* @__PURE__ */ new Date()).toISOString().replaceAll(/[:.]/g, \"-\");\n g.download = `screenshot_${y}.png`, g.href = m, g.click(), console.log(\"截图已保存\");\n } catch (f) {\n console.error(\"截图失败:\", f);\n }\n }, n.ToggleFullscreen = function() {\n const f = t || document.documentElement;\n !document.fullscreenElement && !document.webkitFullscreenElement && !document.mozFullScreenElement && !document.msFullscreenElement ? (f.requestFullscreen ? f.requestFullscreen() : f.webkitRequestFullscreen ? f.webkitRequestFullscreen() : f.mozRequestFullScreen ? f.mozRequestFullScreen() : f.msRequestFullscreen && f.msRequestFullscreen(), console.log(\"已进入全屏模式\")) : (document.exitFullscreen ? document.exitFullscreen() : document.webkitExitFullscreen ? document.webkitExitFullscreen() : document.mozCancelFullScreen ? document.mozCancelFullScreen() : document.msExitFullscreen && document.msExitFullscreen(), console.log(\"已退出全屏模式\"));\n }, n;\n}\nclass Zu {\n engine;\n cubeTool;\n constructor(e) {\n this.engine = e;\n }\n init() {\n this.cubeTool = Ku(this.engine, this.engine.scene, this.engine.container), this.cubeTool.init();\n }\n // 相机回归正位\n CameraGoHome() {\n this.cubeTool.CameraGoHome();\n }\n // 缩放到指定模型\n zoomToModel(e) {\n this.cubeTool.zoomToBox(e);\n }\n}\nfunction Yu(s) {\n let e = new Object();\n return e.getBoundingBox = function() {\n let t = s.models, n = new E.Vector3(1e8, 1e9, 1e10), i = new E.Vector3(-1e8, -1e9, -1e10);\n t.forEach((u) => {\n let d = u.boundingBox.min, p = u.boundingBox.max;\n d.x < n.x && (n.x = d.x), d.y < n.y && (n.y = d.y), d.z < n.z && (n.z = d.z), p.x > i.x && (i.x = p.x), p.y > i.y && (i.y = p.y), p.z > i.z && (i.z = p.z);\n });\n let o = Math.min(n.x, i.x), r = Math.min(n.y, i.y), a = Math.min(n.z, i.z), l = Math.max(n.x, i.x), h = Math.max(n.y, i.y), c = Math.max(n.z, i.z);\n return {\n min: new E.Vector3(o, r, a),\n max: new E.Vector3(l, h, c)\n };\n }, e.rayInterationModel = function(t) {\n let n = [];\n return s.engineStatus.models.forEach((r) => {\n r.info.lods.forEach((a) => {\n let l = a.octreeBox;\n o(t, l, r);\n });\n }), t.intersectObjects(n, !1);\n function o(r, a, l) {\n if (a == null)\n return;\n let h = new E.Vector3(a.min.X * 0.3048, a.min.Z * 0.3048, -a.min.Y * 0.3048), c = new E.Vector3(a.max.X * 0.3048, a.max.Z * 0.3048, -a.max.Y * 0.3048), u = new E.Vector3(Math.min(h.x, c.X), Math.min(h.y, c.y), Math.min(h.z, c.z)), d = new E.Vector3(Math.max(c.x, h.x), Math.max(c.y, h.y), Math.max(c.z, h.z)), p = new E.Box3(u, d), f = r.ray.intersectsBox(p);\n if (!(f == null || f == !1))\n if (a.children == null || a.children.length == 0) {\n if (a.elements != null)\n for (var m of a.elements) {\n let g = s.engineStatus.hideModels.find((_) => _.url == l.url)?.ids;\n if (g != null && g.includes(m))\n continue;\n let w = s.models.find((_) => _.url == l.url).nodesMap.get(m);\n w?.infos.map((x) => x.mesh).forEach((x) => {\n n.push(x);\n });\n }\n } else {\n if (a.elements != null)\n for (var m of a.elements) {\n let y = s.engineStatus.hideModels.find((x) => x.url == l.url)?.ids;\n if (y != null && y.includes(m))\n continue;\n let _ = s.models.find((x) => x.url == l.url).nodesMap.get(m);\n _?.infos.map((b) => b.mesh).forEach((b) => {\n n.push(b);\n });\n }\n for (let g of a.children)\n o(r, g, l);\n }\n }\n }, e;\n}\nclass $u {\n engine;\n // 绘制状态\n isDrawing = !1;\n startPoint = new E.Vector2();\n endPoint = new E.Vector2();\n // UI绘制框元素\n selectionBox = null;\n // 坐标转换工具\n worldToScreen = null;\n // 事件处理函数绑定(用于后续移除监听器)\n boundMouseDown;\n boundMouseMove;\n boundMouseUp;\n boundKeyDown;\n constructor(e) {\n this.engine = e, this.boundMouseDown = this.onMouseDown.bind(this), this.boundMouseMove = this.onMouseMove.bind(this), this.boundMouseUp = this.onMouseUp.bind(this), this.boundKeyDown = this.onKeyDown.bind(this);\n }\n /**\n * 初始化工具\n * 创建绘制框UI元素,初始化坐标转换工具\n */\n init() {\n this.createSelectionBoxElement(), this.engine.scene && this.engine.camera && this.engine.renderer && (this.worldToScreen = new Ge(\n this.engine.camera,\n this.engine.renderer,\n this.engine.scene\n ));\n }\n /**\n * 激活工具\n * 禁用控制器,添加鼠标事件监听器和键盘事件监听器\n */\n active() {\n this.engine.controlModule.disActive();\n const e = this.engine.renderer?.domElement;\n e && (e.addEventListener(\"mousedown\", this.boundMouseDown), e.addEventListener(\"mousemove\", this.boundMouseMove), e.addEventListener(\"mouseup\", this.boundMouseUp), e.style.cursor = \"crosshair\"), window.addEventListener(\"keydown\", this.boundKeyDown);\n }\n /**\n * 停用工具\n * 启用控制器,移除鼠标事件监听器和键盘事件监听器\n */\n disActive() {\n this.engine.controlModule.active();\n const e = this.engine.renderer?.domElement;\n e && (e.removeEventListener(\"mousedown\", this.boundMouseDown), e.removeEventListener(\"mousemove\", this.boundMouseMove), e.removeEventListener(\"mouseup\", this.boundMouseUp), e.style.cursor = \"default\"), window.removeEventListener(\"keydown\", this.boundKeyDown), this.isDrawing && this.endDrawing();\n }\n /**\n * 创建绘制框UI元素\n * 用于在屏幕上显示用户绘制的区域\n */\n createSelectionBoxElement() {\n this.selectionBox = document.createElement(\"div\"), this.selectionBox.style.position = \"absolute\", this.selectionBox.style.border = \"2px dashed #00aaff\", this.selectionBox.style.backgroundColor = \"rgba(0, 170, 255, 0.1)\", this.selectionBox.style.pointerEvents = \"none\", this.selectionBox.style.display = \"none\", this.selectionBox.style.zIndex = \"1000\", this.selectionBox.style.boxSizing = \"border-box\";\n const e = this.engine.renderer?.domElement;\n e && e.parentElement && e.parentElement.appendChild(this.selectionBox);\n }\n /**\n * 鼠标按下事件处理\n * 开始绘制区域\n */\n onMouseDown(e) {\n e.button !== 0 || !this.engine.renderer?.domElement || (this.startPoint.set(e.offsetX, e.offsetY), this.endPoint.copy(this.startPoint), this.isDrawing = !0, this.selectionBox && (this.selectionBox.style.display = \"block\", this.updateSelectionBoxUI()), e.preventDefault(), e.stopPropagation());\n }\n /**\n * 鼠标移动事件处理\n * 更新绘制框的显示\n */\n onMouseMove(e) {\n !this.isDrawing || !this.engine.renderer?.domElement || (this.endPoint.set(e.offsetX, e.offsetY), this.updateSelectionBoxUI(), e.preventDefault(), e.stopPropagation());\n }\n /**\n * 鼠标释放事件处理\n * 结束绘制,执行缩放操作\n */\n onMouseUp(e) {\n this.isDrawing && (this.endDrawing(), this.performZoom(), e.preventDefault(), e.stopPropagation(), this.disActive());\n }\n /**\n * 键盘按下事件处理\n * 按下 ESC 键时退出功能\n */\n onKeyDown(e) {\n e.key === \"Escape\" && (this.disActive(), e.preventDefault(), e.stopPropagation());\n }\n /**\n * 结束绘制\n * 隐藏绘制框\n */\n endDrawing() {\n this.isDrawing && (this.isDrawing = !1, this.selectionBox && (this.selectionBox.style.display = \"none\"));\n }\n /**\n * 更新绘制框UI\n * 根据起点和终点更新绘制框的位置和大小\n */\n updateSelectionBoxUI() {\n if (!this.selectionBox || !this.engine.renderer?.domElement) return;\n const t = Math.min(this.startPoint.x, this.endPoint.x), n = Math.min(this.startPoint.y, this.endPoint.y), i = Math.abs(this.endPoint.x - this.startPoint.x), o = Math.abs(this.endPoint.y - this.startPoint.y);\n this.selectionBox.style.left = `${t}px`, this.selectionBox.style.top = `${n}px`, this.selectionBox.style.width = `${i}px`, this.selectionBox.style.height = `${o}px`;\n }\n /**\n * 执行缩放操作\n * 将屏幕区域转换为世界坐标,计算包围盒,调整相机视角\n */\n performZoom() {\n const e = Math.abs(this.endPoint.x - this.startPoint.x), t = Math.abs(this.endPoint.y - this.startPoint.y);\n if (e < 5 || t < 5)\n return;\n if (!this.worldToScreen) {\n console.warn(\"RangeScale: 坐标转换工具未初始化\");\n return;\n }\n const n = Math.min(this.startPoint.x, this.endPoint.x), i = Math.max(this.startPoint.x, this.endPoint.x), o = Math.min(this.startPoint.y, this.endPoint.y), r = Math.max(this.startPoint.y, this.endPoint.y), a = [], l = [\n { x: n, y: o },\n // 左上\n { x: i, y: o },\n // 右上\n { x: i, y: r },\n // 右下\n { x: n, y: r }\n // 左下\n ];\n for (const c of l) {\n const u = this.worldToScreen.screenToWorld(c.x, c.y);\n u && a.push(u);\n }\n if (a.length < 3) {\n console.warn(\"RangeScale: 框选区域未命中模型,无法执行缩放操作\");\n return;\n }\n if (a.length < 3) {\n console.warn(\"RangeScale: 无法将屏幕区域转换为世界坐标\");\n return;\n }\n const h = new E.Box3();\n for (const c of a)\n h.expandByPoint(c);\n if (h.isEmpty()) {\n console.warn(\"RangeScale: 计算得到的包围盒无效\");\n return;\n }\n this.fitCameraToBoundingBox(h);\n }\n /**\n * 调整相机视角以适应包围盒\n * @param boundingBox - 要适应的包围盒\n */\n fitCameraToBoundingBox(e) {\n const t = this.engine.camera, n = this.engine.controls;\n if (!t || !n) {\n console.warn(\"RangeScale: 相机或控制器未初始化\");\n return;\n }\n const i = new E.Vector3();\n e.getCenter(i);\n const o = new E.Vector3();\n e.getSize(o);\n const r = Math.max(o.x, o.y, o.z);\n if (t instanceof E.PerspectiveCamera) {\n const a = t.fov * (Math.PI / 180), h = r / (2 * Math.tan(a / 2)) * 1.2, c = new E.Vector3();\n t.getWorldDirection(c);\n const u = i.clone().sub(t.position);\n c.dot(u.normalize()) < 0 && c.negate();\n const p = i.clone().sub(c.multiplyScalar(h));\n t.position.copy(p), n.target && n.target.copy(i), t.lookAt(i), n.update();\n } else if (t instanceof E.OrthographicCamera) {\n const l = r * 1.2, h = this.engine.renderer?.domElement, c = h ? h.width / h.height : 1;\n t.left = -l * c / 2, t.right = l * c / 2, t.top = l / 2, t.bottom = -l / 2, t.updateProjectionMatrix();\n const u = new E.Vector3();\n t.getWorldDirection(u);\n const d = r * 1.5, p = i.clone().sub(u.multiplyScalar(d));\n t.position.copy(p), n.target && n.target.copy(i), t.lookAt(i), n.update();\n }\n }\n}\nclass Ju {\n engine;\n ground = null;\n // 地面对象\n constructor(e) {\n this.engine = e;\n }\n init() {\n }\n /**\n * 隐藏或显示性能监视器\n * @param visible - true显示,false隐藏\n */\n setStatsVisible(e) {\n this.engine.stats?.dom && (this.engine.stats.dom.style.display = e ? \"block\" : \"none\");\n }\n /**\n * 设置环境光照强度\n * @param intensity - 光照强度,默认范围 0-5\n */\n setAmbientLightIntensity(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof E.AmbientLight\n );\n t && (t.intensity = e);\n }\n /**\n * 设置环境光照颜色\n * @param color - 颜色,可以是十六进制数字 (0xffffff) 或字符串 ('#ffffff')\n */\n setAmbientLightColor(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof E.AmbientLight\n );\n t && t.color.set(e);\n }\n /**\n * 设置定向光源强度\n * @param intensity - 光照强度,默认范围 0-5\n */\n setDirectionalLightIntensity(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof E.DirectionalLight\n );\n t && (t.intensity = e);\n }\n /**\n * 设置定向光源颜色\n * @param color - 颜色,可以是十六进制数字 (0xffffff) 或字符串 ('#ffffff')\n */\n setDirectionalLightColor(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof E.DirectionalLight\n );\n t && t.color.set(e);\n }\n /**\n * 设置阴影精细度(阴影贴图分辨率)\n * @param quality - 质量等级:'low' (1024), 'medium' (2048), 'high' (4096), 'ultra' (8192)\n */\n setShadowQuality(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof E.DirectionalLight\n );\n if (t?.shadow) {\n const i = {\n low: 1024,\n medium: 2048,\n high: 4096,\n ultra: 8192\n }[e];\n t.shadow.mapSize.width = i, t.shadow.mapSize.height = i, t.shadow.map?.dispose(), t.shadow.map = null;\n }\n }\n /**\n * 设置是否开启定向光阴影\n * @param enabled - true开启,false关闭\n */\n setDirectionalLightShadow(e) {\n const t = this.engine.scene.children.find(\n (n) => n instanceof E.DirectionalLight\n );\n t && (t.castShadow = e), this.engine.renderer && (this.engine.renderer.shadowMap.enabled = e);\n }\n /**\n * 设置是否开启GTAO阴影(环境光遮蔽)\n * @param enabled - true开启,false关闭\n */\n setGTAOEnabled(e) {\n if (!this.engine.composerModule?.composer) {\n console.warn(\"Composer not initialized\");\n return;\n }\n const t = this.engine.composerModule.composer, n = t.passes.find((i) => i instanceof Ne);\n if (e)\n if (n)\n n.enabled = !0;\n else {\n const { width: i, height: o } = this.engine.deviceModule.getContainerSize(), r = new Ne(\n this.engine.scene,\n this.engine.camera,\n i,\n o\n );\n r.output = Ne.OUTPUT.Default, r.blendIntensity = 0.5, r.updateGtaoMaterial && r.updateGtaoMaterial({\n radius: 1,\n distanceExponent: 1,\n thickness: 1,\n scale: 1,\n distanceFallOff: 1,\n screenSpaceRadius: !0\n });\n const a = t.passes.findIndex(\n (l) => l.constructor.name === \"RenderPass\"\n );\n t.passes.splice(a + 1, 0, r);\n }\n else n && (n.enabled = !1);\n }\n /**\n * 设置场景饱和度\n * @param saturation - 饱和度值,1.0为正常,>1增强,<1降低,推荐范围 0.5-2.0\n */\n setSceneSaturation(e) {\n if (!this.engine.composerModule?.saturationPass) {\n console.warn(\"Saturation pass not initialized\");\n return;\n }\n this.engine.composerModule.saturationPass.uniforms.saturation.value = e;\n }\n /**\n * 设置场景对比度\n * @param contrast - 对比度值,1.0为正常,>1增强,<1降低,推荐范围 0.5-2.0\n */\n setSceneContrast(e) {\n if (!this.engine.composerModule?.saturationPass) {\n console.warn(\"Saturation pass not initialized\");\n return;\n }\n this.engine.composerModule.saturationPass.uniforms.contrast.value = e;\n }\n /**\n * 设置是否开启地面\n * @param enabled - true开启,false关闭\n * @param options - 地面配置选项\n */\n setGroundEnabled(e, t) {\n if (e)\n if (this.ground)\n this.ground.visible = !0;\n else {\n const n = t?.size ?? 100, i = t?.color ?? 8421504, o = t?.opacity ?? 0.3, r = new E.PlaneGeometry(n, n), a = new E.MeshStandardMaterial({\n color: i,\n transparent: !0,\n opacity: o,\n side: E.DoubleSide\n });\n this.ground = new E.Mesh(r, a), this.ground.rotation.x = -Math.PI / 2, this.ground.position.y = 0, this.ground.receiveShadow = !0, this.ground.name = \"ground\", this.engine.scene.add(this.ground);\n }\n else this.ground && (this.ground.visible = !1);\n }\n /**\n * 设置HDR背景\n * @param hdrTexture - HDR环境贴图(THREE.Texture),传入null则移除背景\n */\n setHDRBackground(e) {\n e ? (this.engine.scene.background = e, this.engine.scene.environment = e) : (this.engine.scene.background = null, this.engine.scene.environment = null);\n }\n}\nfunction _t() {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(s) {\n var e = Math.random() * 16 | 0, t = s == \"x\" ? e : e & 3 | 8;\n return t.toString(16);\n });\n}\nclass bt {\n engine;\n handelBehaved;\n constructor(e) {\n this.engine = e, this.handelBehaved = tr(e), this.handelBehaved.init(this, null);\n }\n active() {\n this.handelBehaved.active();\n }\n disActive() {\n this.handelBehaved.disActive();\n }\n // 取消当前选中的标注\n cancelCurrentSelectedAnnotation() {\n let e = this.engine.measure.annotationData;\n for (let t in e)\n e[t].forEach((n) => {\n n.highlight == !0 && (n.highlight = !1, n.container.classList.remove(\"Hight\"), n.container.getElementsByTagName(\"svg\")[0].classList.remove(\"Hight\"));\n });\n }\n // 监听按下esc\n handelKeyEscDown() {\n this.cancelCurrentSelectedAnnotation();\n let e = this.engine.measure.annotationData;\n for (let t in e)\n for (let n = e[t].length - 1; n >= 0; n--) {\n let i = e[t][n];\n i.isSelect == !0 && (i.container.remove(), e[t].splice(n, 1));\n }\n this.engine.measure.clearAllPoints();\n }\n // 监听按下delete\n handelKeyDeleteDown() {\n let e = this.engine.measure.annotationData;\n for (let t in e)\n for (let n = e[t].length - 1; n >= 0; n--) {\n let i = e[t][n];\n i.highlight == !0 && (i.container.remove(), e[t].splice(n, 1));\n }\n }\n clearHighlight() {\n let e = this.engine.measure.annotationData;\n for (let t in e)\n e[t].forEach((n) => {\n n.highlight = !1, n.container.classList.remove(\"Hight\"), n.container.getElementsByTagName(\"svg\")[0].classList.remove(\"Hight\");\n });\n }\n // 绘制普通标注\n drawNormalAnnotation() {\n let e = this;\n this.engine.measure.annotationData.normalAnnotation.forEach((f) => {\n p(f);\n }), this.engine.measure.annotationData.elevationAnnotation.forEach((f) => {\n d(f);\n }), this.engine.measure.annotationData.coordinateAnnotation.forEach((f) => {\n u(f);\n }), this.engine.measure.annotationData.angleAnnotation.forEach((f) => {\n l(f);\n }), this.engine.measure.annotationData.areaAnnotation.forEach((f) => {\n h(f);\n }), this.engine.measure.annotationData.slopeAnnotation.forEach((f) => {\n c(f);\n });\n function l(f) {\n if (f.container == null) {\n let M = [\n '',\n '',\n // 起点\n '',\n // 顶点\n '',\n // 终点\n '',\n // 起点到顶点的线\n '',\n // 顶点到终点的线\n '',\n '' + f.text + \"\",\n \"\"\n ].join(\"\");\n f.container = document.createElement(\"div\"), f.container.className = \"angle-annotation\", f.container.id = f.id, f.container.style.pointerEvents = \"none\", f.container.innerHTML = M, e.engine.measure.annotationContainer.appendChild(f.container), f.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), f.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), f.highlight = !0;\n });\n }\n let m = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point1), g = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point2), y = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point3), w = e.engine.reactBoundingClientRect.left, _ = e.engine.reactBoundingClientRect.top;\n m.x += w, m.y += _, g.x += w, g.y += _, y.x += w, y.y += _;\n let x = f.container;\n x.getElementsByTagName(\"circle\")[0].setAttribute(\"cx\", m.x), x.getElementsByTagName(\"circle\")[0].setAttribute(\"cy\", m.y), x.getElementsByTagName(\"circle\")[1].setAttribute(\"cx\", g.x), x.getElementsByTagName(\"circle\")[1].setAttribute(\"cy\", g.y), x.getElementsByTagName(\"circle\")[2].setAttribute(\"cx\", y.x), x.getElementsByTagName(\"circle\")[2].setAttribute(\"cy\", y.y), x.getElementsByTagName(\"polyline\")[0].setAttribute(\"points\", m.x + \",\" + m.y + \" \" + g.x + \",\" + g.y), x.getElementsByTagName(\"polyline\")[1].setAttribute(\"points\", g.x + \",\" + g.y + \" \" + y.x + \",\" + y.y);\n let b = g.x, A = g.y - 30;\n x.getElementsByTagName(\"rect\")[0].setAttribute(\"x\", b - 40), x.getElementsByTagName(\"rect\")[0].setAttribute(\"y\", A - 12.5), x.getElementsByTagName(\"text\")[0].setAttribute(\"x\", b), x.getElementsByTagName(\"text\")[0].setAttribute(\"y\", A + 4), x.getElementsByTagName(\"text\")[0].innerHTML = f.text, x.style.top = \"0px\", x.style.left = \"0px\";\n }\n function h(f) {\n if (f.container == null) {\n let C = [\n '',\n '',\n // 填充区域\n '',\n // 边界线\n '',\n '' + f.text + \"\",\n \"\"\n ].join(\"\");\n f.container = document.createElement(\"div\"), f.container.className = \"area-annotation\", f.container.id = f.id, f.container.innerHTML = C, e.engine.measure.annotationContainer.appendChild(f.container), f.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), f.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), f.highlight = !0;\n });\n }\n if (!f.points || f.points.length < 3)\n return;\n let m = e.engine.reactBoundingClientRect.left, g = e.engine.reactBoundingClientRect.top, y = [], w = 0, _ = 0;\n for (let C = 0; C < f.points.length; C++) {\n let P = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.points[C]);\n P.x += m, P.y += g, y.push(P), w += P.x, _ += P.y;\n }\n w = w / y.length, _ = _ / y.length;\n let x = y.map((C) => C.x + \",\" + C.y).join(\" \"), b = f.container;\n b.getElementsByTagName(\"polygon\")[0].setAttribute(\"points\", x), b.getElementsByTagName(\"polyline\")[0].setAttribute(\"points\", x);\n let A = w, M = _;\n b.getElementsByTagName(\"rect\")[0].setAttribute(\"x\", A - 40), b.getElementsByTagName(\"rect\")[0].setAttribute(\"y\", M - 12.5), b.getElementsByTagName(\"text\")[0].setAttribute(\"x\", A), b.getElementsByTagName(\"text\")[0].setAttribute(\"y\", M + 4), b.getElementsByTagName(\"text\")[0].innerHTML = f.text, b.style.top = \"0px\", b.style.left = \"0px\";\n }\n function c(f) {\n if (f.container == null) {\n let A = [\n '',\n \"\",\n '',\n '',\n // 箭头形状\n \"\",\n \"\",\n '',\n // 起点到终点的线,带箭头\n '',\n '' + f.text + \"\",\n \"\"\n ].join(\"\");\n f.container = document.createElement(\"div\"), f.container.className = \"slope-annotation\", f.container.id = f.id, f.container.innerHTML = A, e.engine.measure.annotationContainer.appendChild(f.container), f.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), f.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), f.highlight = !0;\n });\n }\n let m = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point1), g = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point2), y = e.engine.reactBoundingClientRect.left, w = e.engine.reactBoundingClientRect.top;\n m.x += y, m.y += w, g.x += y, g.y += w;\n let _ = f.container;\n _.getElementsByTagName(\"polyline\")[0].setAttribute(\"points\", m.x + \",\" + m.y + \" \" + g.x + \",\" + g.y);\n let x = (m.x + g.x) / 2, b = (m.y + g.y) / 2 - 30;\n _.getElementsByTagName(\"rect\")[0].setAttribute(\"x\", x - 50), _.getElementsByTagName(\"rect\")[0].setAttribute(\"y\", b - 12.5), _.getElementsByTagName(\"text\")[0].setAttribute(\"x\", x), _.getElementsByTagName(\"text\")[0].setAttribute(\"y\", b + 4), _.getElementsByTagName(\"text\")[0].innerHTML = f.text, _.style.top = \"0px\", _.style.left = \"0px\";\n }\n function u(f) {\n if (f.container == null) {\n let M = [\n '',\n '',\n '',\n '' + f.textX + \"\",\n '',\n '' + f.textY + \"\",\n '',\n '' + f.textZ + \"\",\n \"\"\n ].join(\"\");\n f.container = document.createElement(\"div\"), f.container.className = \"coordinate-annotation\", f.container.id = f.id, f.container.style.position = \"absolute\", f.container.style.pointerEvents = \"none\", f.container.innerHTML = M, e.engine.measure.annotationContainer.appendChild(f.container), f.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), f.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), f.highlight = !0;\n });\n }\n let m = f.container, g = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point), y = e.engine.reactBoundingClientRect.left, w = e.engine.reactBoundingClientRect.top;\n g.x += y, g.y += w, m.style.top = \"0px\", m.style.left = \"0px\";\n let _ = m.getElementsByTagName(\"circle\")[0];\n _ && (_.setAttribute(\"cx\", g.x), _.setAttribute(\"cy\", g.y));\n let x = m.getElementsByTagName(\"rect\"), b = m.getElementsByTagName(\"text\"), A = -55;\n x[0] && (x[0].setAttribute(\"x\", g.x + 10), x[0].setAttribute(\"y\", g.y + 10 + A)), b[0] && (b[0].setAttribute(\"x\", g.x + 10 + 40), b[0].setAttribute(\"y\", g.y + 10 + 16 + A)), x[1] && (x[1].setAttribute(\"x\", g.x + 10), x[1].setAttribute(\"y\", g.y + 10 + 30 + A)), b[1] && (b[1].setAttribute(\"x\", g.x + 10 + 40), b[1].setAttribute(\"y\", g.y + 10 + 46 + A)), x[2] && (x[2].setAttribute(\"x\", g.x + 10), x[2].setAttribute(\"y\", g.y + 10 + 60 + A)), b[2] && (b[2].setAttribute(\"x\", g.x + 10 + 40), b[2].setAttribute(\"y\", g.y + 10 + 76 + A)), b[0] && (b[0].innerHTML = f.textX), b[1] && (b[1].innerHTML = f.textY), b[2] && (b[2].innerHTML = f.textZ);\n }\n function d(f) {\n if (f.container == null) {\n let _ = [\n '',\n '',\n '' + f.text + \"\",\n '',\n \"\"\n ].join(\"\");\n f.container = document.createElement(\"div\"), f.container.className = \"elevation-annotation\", f.container.id = f.id, f.container.style.position = \"absolute\", f.container.style.pointerEvents = \"none\", f.container.innerHTML = _, e.engine.measure.annotationContainer.appendChild(f.container), f.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), f.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), f.highlight = !0;\n });\n }\n let m = f.container, g = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point), y = e.engine.reactBoundingClientRect.left, w = e.engine.reactBoundingClientRect.top;\n m.style.top = g.y + w - 48 + \"px\", m.style.left = g.x + y - 16 + \"px\", m.getElementsByTagName(\"text\")[0].innerHTML = f.text;\n }\n function p(f) {\n if (f.container == null) {\n let x = [\n '',\n '',\n '',\n '',\n '',\n '' + f.text + \"\",\n \"\"\n ].join(\"\");\n f.container = document.createElement(\"div\"), f.container.className = \"normal-annotation\", f.container.id = f.id, f.container.innerHTML = x, e.engine.measure.annotationContainer.appendChild(f.container), f.container.getElementsByTagName(\"svg\")[0].addEventListener(\"click\", function() {\n e.clearHighlight(), f.container.getElementsByTagName(\"svg\")[0].classList.add(\"Hight\"), f.highlight = !0;\n });\n }\n let m = f.container;\n if (f.point1 == null || f.point2 == null) {\n m.style.display = \"none\";\n return;\n } else\n m.style.display = \"block\";\n let g = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point1), y = new Ge(e.engine.camera, e.engine.renderer, e.engine.scene).worldToScreen(f.point2), w = e.engine.reactBoundingClientRect.left, _ = e.engine.reactBoundingClientRect.top;\n g.x += w, g.y += _, y.x += w, y.y += _, m.getElementsByTagName(\"polyline\")[0].setAttribute(\"points\", g.x + \",\" + g.y + \" \" + y.x + \",\" + y.y), m.getElementsByTagName(\"circle\")[0].setAttribute(\"cx\", g.x), m.getElementsByTagName(\"circle\")[0].setAttribute(\"cy\", g.y), m.getElementsByTagName(\"circle\")[1].setAttribute(\"cx\", y.x), m.getElementsByTagName(\"circle\")[1].setAttribute(\"cy\", y.y), m.getElementsByTagName(\"rect\")[0].setAttribute(\"x\", g.x * 0.5 + y.x * 0.5 - 40), m.getElementsByTagName(\"rect\")[0].setAttribute(\"y\", g.y * 0.5 + y.y * 0.5 - 12.5), m.getElementsByTagName(\"text\")[0].setAttribute(\"x\", g.x * 0.5 + y.x * 0.5 + 40 - 40), m.getElementsByTagName(\"text\")[0].setAttribute(\"y\", g.y * 0.5 + y.y * 0.5 + 16 - 12.5), m.getElementsByTagName(\"text\")[0].innerHTML = f.text, m.style.top = \"0px\", m.style.left = \"0px\";\n }\n }\n}\nclass Qu {\n engine;\n isActive = !1;\n tools;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new bt(e);\n }\n // 启动净高测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.isActive = !0, this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n }\n // 停止净高测量\n disActive() {\n this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 鼠标点击\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n if (this.points.length == 0) {\n this.points.push(e.catch.point);\n return;\n }\n let t = this.engine.measure.annotationData.normalAnnotation.find((n) => n.isSelect == !0);\n t != null && (t.isSelect = !1);\n }\n // 鼠标移动\n handleMouseMove(e) {\n if (e.catch == null || this.points.length == 0)\n return;\n let t = this.engine.measure.annotationData.normalAnnotation.find((r) => r.isSelect == !0);\n t == null && (t = {\n text: null,\n id: _t(),\n isSelect: !0\n }, this.engine.measure.annotationData.normalAnnotation.push(t));\n let n = new E.Raycaster(e.catch.point.clone().add(new E.Vector3(0, 0.01, 0)), new E.Vector3(0, 1, 0));\n const i = this.engine.octreeBox.rayInterationModel(n);\n if (i.length === 0) {\n t.point2 = null;\n return;\n }\n let o = e.catch;\n t.point1 = o.point, t.point2 = i[0].point, t.text = t.point1.clone().distanceTo(t.point2.clone()).toFixed(2) + \" m\";\n }\n}\nclass ef {\n engine;\n tools;\n isActive = !1;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new bt(e);\n }\n // 启动距离测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.isActive = !0, this.points = [], this.behavior = this.engine.handelBehaved, this.behavior.init(this, { showCatch: !0 }), this.behavior.active();\n }\n // 停止距离测量\n disActive() {\n this.points = [], this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 鼠标点击\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (this.points.length == 0)\n this.points.push(t.point);\n else if (this.points.length == 1) {\n let n = this.engine.measure.annotationData.normalAnnotation.find((i) => i.isSelect == !0);\n if (n == null)\n return;\n n.point2 = t.point, n.isSelect = !1, this.points = [], this.engine.events.trigger(wt.MeasureChanged, n);\n }\n }\n // 鼠标移动\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (t != null && this.points.length == 1) {\n let n = this.engine.measure.annotationData.normalAnnotation.find((i) => i.isSelect == !0);\n n == null && (n = {\n id: _t(),\n point1: this.points[0].clone(),\n point2: t.point.clone(),\n text: this.points[0].clone().distanceTo(t.point.clone()).toFixed(2) + \" m\",\n isSelect: !0\n }, this.engine.measure.annotationData.normalAnnotation.push(n)), n.point2 = t.point, n.text = n.point1.clone().distanceTo(n.point2.clone()).toFixed(2) + \" m\", console.log(\"距离\", n.text);\n }\n }\n // 按下esc\n}\nclass tf {\n engine;\n isActive = !1;\n tools;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new bt(e);\n }\n // 启动净高测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.isActive = !0, this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n }\n // 停止净距测量\n disActive() {\n this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 鼠标点击\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n if (this.points.length == 0) {\n this.points.push(e.catch.point);\n return;\n }\n let t = this.engine.measure.annotationData.normalAnnotation.find((n) => n.isSelect == !0);\n t != null && (t.isSelect = !1);\n }\n // 鼠标移动\n handleMouseMove(e) {\n if (e.catch == null || this.points.length == 0)\n return;\n let t = this.engine.measure.annotationData.normalAnnotation.find((r) => r.isSelect == !0);\n t == null && (t = {\n text: null,\n id: _t(),\n isSelect: !0\n }, this.engine.measure.annotationData.normalAnnotation.push(t));\n let n = new E.Raycaster(e.catch.point.clone().add(e.catch.normal.clone().setLength(0.01)), e.catch.normal);\n const i = this.engine.octreeBox.rayInterationModel(n);\n if (i.length == 0) {\n t.point2 = null;\n return;\n }\n let o = e.catch;\n t.point1 = o.point, t.point2 = i[0].point, t.text = t.point1.clone().distanceTo(t.point2.clone()).toFixed(2) + \" m\";\n }\n}\nclass nf {\n engine;\n isActive = !1;\n tools;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new bt(e);\n }\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active(), this.isActive = !0;\n }\n disActive() {\n this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = this.engine.measure.annotationData.elevationAnnotation.find((n) => n.isSelect == !0);\n t == null && (t = {\n id: _t(),\n point: e.catch.point.clone(),\n text: Math.round(e.catch.point.y) + \" m\",\n isSelect: !0\n }, this.engine.measure.annotationData.elevationAnnotation.push(t)), t.point = e.catch.point.clone(), t.text = Math.round(e.catch.point.y) + \" m\";\n }\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = this.engine.measure.annotationData.elevationAnnotation.find((n) => n.isSelect == !0);\n t != null && (t.isSelect = !1, t.point = e.catch.point.clone(), t.text = Math.round(e.catch.point.y) + \" m\", this.engine.events.trigger(wt.MeasureChanged, t));\n }\n}\nclass sf {\n engine;\n isActive = !1;\n tools;\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new bt(e);\n }\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active(), this.isActive = !0;\n }\n disActive() {\n this.isActive = !1, this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = this.engine.measure.annotationData.coordinateAnnotation.find((n) => n.isSelect == !0);\n t == null && (t = {\n id: _t(),\n point: e.catch.point.clone(),\n text: Math.round(e.catch.point.y) + \" m\",\n isSelect: !0\n }, this.engine.measure.annotationData.coordinateAnnotation.push(t)), t.point = e.catch.point.clone(), t.textX = Math.round(e.catch.point.x) + \" m\", t.textY = Math.round(e.catch.point.y) + \" m\", t.textZ = Math.round(e.catch.point.z) + \" m\";\n }\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = this.engine.measure.annotationData.coordinateAnnotation.find((n) => n.isSelect == !0);\n t != null && (t.isSelect = !1, t.point = e.catch.point.clone(), t.textX = Math.round(e.catch.point.x) + \" m\", t.textY = Math.round(e.catch.point.y) + \" m\", t.textZ = Math.round(e.catch.point.z) + \" m\", this.engine.events.trigger(wt.MeasureChanged, t));\n }\n}\nclass rf {\n engine;\n tools;\n // 存储三个点:起点、顶点(中间点)、终点\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new bt(e);\n }\n // 启动角度测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.points = [], this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n }\n // 停止角度测量\n disActive() {\n this.points = [], this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 计算三点形成的角度(以第二个点为顶点)\n // point1: 起点, point2: 顶点, point3: 终点\n calculateAngle(e, t, n) {\n const i = new E.Vector3().subVectors(e, t), o = new E.Vector3().subVectors(n, t), r = i.length(), a = o.length();\n if (r === 0 || a === 0)\n return 0;\n const h = i.dot(o) / (r * a), c = Math.max(-1, Math.min(1, h));\n return Math.acos(c) * (180 / Math.PI);\n }\n // 处理鼠标点击事件\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (this.points.length == 0)\n this.points.push(t.point);\n else if (this.points.length == 1)\n this.points.push(t.point);\n else if (this.points.length == 2) {\n let n = this.engine.measure.annotationData.angleAnnotation.find((i) => i.isSelect == !0);\n if (n == null)\n return;\n n.point3 = t.point.clone(), n.angle = this.calculateAngle(n.point1, n.point2, n.point3), n.text = n.angle.toFixed(2) + \"°\", n.isSelect = !1, this.points = [], this.engine.events.trigger(wt.MeasureChanged, n);\n }\n }\n // 处理鼠标移动事件\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = this.tools.renderCatchElement(e.catch);\n if (t != null && this.points.length != 1 && this.points.length == 2) {\n let n = this.engine.measure.annotationData.angleAnnotation.find((i) => i.isSelect == !0);\n n == null && (n = {\n id: _t(),\n point1: this.points[0].clone(),\n // 起点\n point2: this.points[1].clone(),\n // 顶点(中间点)\n point3: t.point.clone(),\n // 终点(实时更新)\n angle: 0,\n text: \"0.00°\",\n isSelect: !0\n }, this.engine.measure.annotationData.angleAnnotation.push(n)), n.point3 = t.point.clone(), n.angle = this.calculateAngle(n.point1, n.point2, n.point3), n.text = n.angle.toFixed(2) + \"°\", console.log(\"角度\", n.text);\n }\n }\n}\nclass of {\n engine;\n tools;\n // 存储多个点,用于围成区域\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new bt(e);\n }\n // 启动面积测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.points = [], this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n }\n // 停止面积测量\n disActive() {\n this.points = [], this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 计算多边形面积(使用鞋带公式/Shoelace formula)\n // 注意:这个方法假设点在同一个平面上,使用XZ平面投影计算面积\n calculateArea(e) {\n if (e.length < 3)\n return 0;\n let t = 0;\n const n = e.length;\n for (let i = 0; i < n; i++) {\n const o = (i + 1) % n;\n t += e[i].x * e[o].z, t -= e[o].x * e[i].z;\n }\n return t = Math.abs(t) / 2, t;\n }\n // 处理鼠标点击事件\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = e.catch;\n if (this.points.push(t.point.clone()), this.points.length >= 3) {\n let n = this.engine.measure.annotationData.areaAnnotation.find((i) => i.isSelect == !0);\n n == null ? (n = {\n id: _t(),\n points: this.points.map((i) => i.clone()),\n // 复制所有点\n area: 0,\n text: \"0.00 m²\",\n isSelect: !0\n }, this.engine.measure.annotationData.areaAnnotation.push(n)) : n.points = this.points.map((i) => i.clone()), n.area = this.calculateArea(n.points), n.text = n.area.toFixed(2) + \" m²\", console.log(\"面积\", n.text);\n }\n }\n // 处理鼠标移动事件\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = this.tools.renderCatchElement(e.catch);\n if (t != null && this.points.length >= 2) {\n let n = this.engine.measure.annotationData.areaAnnotation.find((i) => i.isSelect == !0);\n if (n == null) {\n if (this.points.length >= 2) {\n let i = this.points.map((o) => o.clone());\n i.push(t.point.clone()), i.length >= 3 && (n = {\n id: _t(),\n points: i,\n area: 0,\n text: \"0.00 m²\",\n isSelect: !0\n }, this.engine.measure.annotationData.areaAnnotation.push(n));\n }\n } else if (n.points.length > 0) {\n const i = n.points.length - 1;\n n.points[i] = t.point.clone();\n } else\n n.points = this.points.map((i) => i.clone()), n.points.push(t.point.clone());\n n && n.points.length >= 3 && (n.area = this.calculateArea(n.points), n.text = n.area.toFixed(2) + \" m²\");\n }\n }\n // 完成面积测量(可以用于双击或右键完成)\n finishMeasure() {\n let e = this.engine.measure.annotationData.areaAnnotation.find((t) => t.isSelect == !0);\n e != null && e.points.length >= 3 && (e.points.length > this.points.length && (e.points = this.points.map((t) => t.clone())), e.area = this.calculateArea(e.points), e.text = e.area.toFixed(2) + \" m²\", e.isSelect = !1, this.points = [], this.engine.events.trigger(wt.MeasureChanged, e));\n }\n}\nclass af {\n engine;\n tools;\n // 存储两个点:起点和终点\n points = [];\n behavior;\n constructor(e) {\n this.engine = e, this.tools = new bt(e);\n }\n // 启动坡度测量\n active() {\n this.engine.measure.tools.cancelCurrentSelectedAnnotation(), this.points = [], this.behavior = this.engine.handelBehaved, this.behavior.init(this), this.behavior.active();\n }\n // 停止坡度测量\n disActive() {\n this.points = [], this.behavior?.disActive();\n }\n // 清空所有点\n clearAllPoints() {\n this.points = [];\n }\n // 计算两点之间的坡度\n // point1: 起点, point2: 终点\n // 返回:{ percentage: 坡度百分比, angle: 坡度角度(度), heightDiff: 高度差, horizontalDist: 水平距离 }\n calculateSlope(e, t) {\n const n = t.y - e.y, i = t.x - e.x, o = t.z - e.z, r = Math.sqrt(i * i + o * o);\n if (r === 0)\n return {\n percentage: 0,\n angle: 0,\n heightDiff: n,\n horizontalDist: 0\n };\n const a = n / r * 100, h = Math.atan(n / r) * (180 / Math.PI);\n return {\n percentage: a,\n angle: h,\n heightDiff: n,\n horizontalDist: r\n };\n }\n // 处理鼠标点击事件\n handleMouseClick(e) {\n if (e.catch == null)\n return;\n let t = this.tools.renderCatchElement(e.catch);\n if (this.points.length == 0)\n this.points.push(t.point);\n else if (this.points.length == 1) {\n let n = this.engine.measure.annotationData.slopeAnnotation.find((o) => o.isSelect == !0);\n if (n == null)\n return;\n n.point2 = t.point.clone();\n const i = this.calculateSlope(n.point1, n.point2);\n n.slopePercentage = i.percentage, n.slopeAngle = i.angle, n.heightDiff = i.heightDiff, n.horizontalDist = i.horizontalDist, n.text = i.percentage.toFixed(2) + \"% (\" + i.angle.toFixed(2) + \"°)\", n.isSelect = !1, this.points = [], this.engine.events.trigger(wt.MeasureChanged, n);\n }\n }\n // 处理鼠标移动事件\n handleMouseMove(e) {\n if (e.catch == null)\n return;\n let t = this.tools.renderCatchElement(e.catch);\n if (t != null && this.points.length == 1) {\n let n = this.engine.measure.annotationData.slopeAnnotation.find((o) => o.isSelect == !0);\n n == null && (n = {\n id: _t(),\n point1: this.points[0].clone(),\n // 起点\n point2: t.point.clone(),\n // 终点(实时更新)\n slopePercentage: 0,\n slopeAngle: 0,\n heightDiff: 0,\n horizontalDist: 0,\n text: \"0.00% (0.00°)\",\n isSelect: !0\n }, this.engine.measure.annotationData.slopeAnnotation.push(n)), n.point2 = t.point.clone();\n const i = this.calculateSlope(n.point1, n.point2);\n n.slopePercentage = i.percentage, n.slopeAngle = i.angle, n.heightDiff = i.heightDiff, n.horizontalDist = i.horizontalDist, n.text = i.percentage.toFixed(2) + \"% (\" + i.angle.toFixed(2) + \"°)\", console.log(\"坡度\", n.text);\n }\n }\n}\nclass lf {\n isActive = !1;\n engine;\n clearHeightMeasure;\n distanceMeasure;\n clearDistanceMeasure;\n elevationMeasure;\n pointMeasure;\n angleMeasure;\n areaMeasure;\n slopeMeasure;\n tools;\n annotationContainer;\n // 存储标注信息\n annotationData = {\n normalAnnotation: [],\n textAnnotation: [],\n coordinateAnnotation: [],\n angleAnnotation: [],\n distanceAnnotation: [],\n areaAnnotation: [],\n slopeAnnotation: [],\n elevationAnnotation: [],\n volumeAnnotation: []\n };\n constructor(e) {\n this.engine = e, this.clearHeightMeasure = new Qu(e), this.distanceMeasure = new ef(e), this.clearDistanceMeasure = new tf(e), this.elevationMeasure = new nf(e), this.pointMeasure = new sf(e), this.angleMeasure = new rf(e), this.areaMeasure = new of(e), this.slopeMeasure = new af(e), this.tools = new bt(e), this.annotationContainer = document.createElement(\"div\"), this.annotationContainer.className = \"annotation-container\", e.container.parentElement.appendChild(this.annotationContainer);\n }\n active() {\n this.isActive = !0, this.tools.active();\n }\n disActive() {\n this.tools.disActive(), this.clearAll(), this.isActive = !1, this.clearHeightMeasure.disActive(), this.distanceMeasure.disActive(), this.clearDistanceMeasure.disActive(), this.elevationMeasure.disActive(), this.pointMeasure.disActive(), this.angleMeasure.disActive(), this.areaMeasure.disActive(), this.slopeMeasure.disActive(), this.engine.interactionModule.active();\n }\n // 清空所有点的测量\n clearAllPoints() {\n this.clearHeightMeasure.clearAllPoints(), this.distanceMeasure.clearAllPoints(), this.clearDistanceMeasure.clearAllPoints(), this.elevationMeasure.clearAllPoints(), this.pointMeasure.clearAllPoints(), this.angleMeasure.clearAllPoints(), this.areaMeasure.clearAllPoints(), this.slopeMeasure.clearAllPoints();\n }\n // 清除所有测量\n clearAll() {\n e(this.annotationData.normalAnnotation), e(this.annotationData.textAnnotation), e(this.annotationData.coordinateAnnotation), e(this.annotationData.angleAnnotation), e(this.annotationData.distanceAnnotation), e(this.annotationData.areaAnnotation), e(this.annotationData.slopeAnnotation), e(this.annotationData.elevationAnnotation), e(this.annotationData.volumeAnnotation);\n function e(t) {\n for (let n = 0; n < t.length; n++)\n t[n].container.remove();\n t = [];\n }\n }\n // 更新标注\n update() {\n this.isActive && this.tools.drawNormalAnnotation();\n }\n}\nclass cf {\n engine;\n isActive = !1;\n isDrag = !1;\n meshs = [];\n box;\n pickPoint;\n pickNormal;\n pickMesh;\n box_;\n plane;\n constructor(e) {\n this.engine = e, this.meshs = [], this.box = null;\n }\n // 启动\n active() {\n if (this.isActive == !0)\n return;\n this.isActive = !0, this.init(), this.meshs.forEach((t) => {\n t.visible = !0;\n }), this.engine.handelBehaved.init(this), this.engine.handelBehaved.active();\n let e = this;\n e.engine.scene.children.filter((t) => t.type == \"Mesh\" && t.url).forEach((t) => {\n t.material && Array.isArray(t.material) ? t.material.forEach((n) => {\n n.clippingPlanes = e.engine.sectionPlane;\n }) : t.material.clippingPlanes = e.engine.sectionPlane, e.engine.clipping.clippingStencil?.addMesh(e.engine.sectionPlane.find((n) => n.name == \"前\"), t);\n });\n }\n disActive() {\n this.isActive = !1, this.engine.handelBehaved.disActive();\n const e = this.engine.sectionPlane.find((t) => t.name == \"前\");\n e && (e.constant = 1e5), this.meshs.forEach((t) => {\n t.visible = !1;\n });\n }\n // 初始化\n init() {\n let e = this.engine.octreeBox.getBoundingBox();\n this.box = e, this.updata_face(e);\n }\n // 更新面\n updata_face(e) {\n let t = this, n = t.engine.scene.children.find((r) => r.type == \"Group\" && r.name == \"ClippingBox\");\n n == null && (n = new E.Group(), n.name = \"ClippingBox\", t.engine.scene.add(n));\n let i = [\n new E.Vector3(e.min.x, e.min.y, e.min.z),\n new E.Vector3(e.max.x, e.min.y, e.min.z),\n new E.Vector3(e.max.x, e.max.y, e.min.z),\n new E.Vector3(e.min.x, e.max.y, e.min.z)\n ];\n o(i, new E.Vector3(0, 0, -1), \"前\");\n function o(r, a, l) {\n const h = new E.BufferGeometry(), c = new Float32Array([\n r[0].x,\n r[0].y,\n r[0].z,\n // 点1\n r[1].x,\n r[1].y,\n r[1].z,\n // 点2\n r[2].x,\n r[2].y,\n r[2].z,\n // 点3\n r[3].x,\n r[3].y,\n r[3].z\n // 点4\n ]), u = [\n 0,\n 1,\n 2,\n // 第一个三角形\n 0,\n 2,\n 3\n // 第二个三角形\n ];\n h.setAttribute(\"position\", new E.BufferAttribute(c, 3)), h.setIndex(u);\n let d = t.meshs.find((y) => y.name == l);\n if (d == null) {\n const y = new E.MeshBasicMaterial({\n color: 65280,\n // 绿色\n transparent: !0,\n opacity: 0.02,\n side: E.DoubleSide\n // 双面渲染\n }), w = new E.Mesh(h, y);\n w.normal = a, w.name = l, n.add(w), t.meshs.push(w);\n } else\n d.geometry = h;\n const p = new Float32Array([\n r[0].x,\n r[0].y,\n r[0].z,\n // 点1\n r[1].x,\n r[1].y,\n r[1].z,\n // 点2\n r[2].x,\n r[2].y,\n r[2].z,\n // 点3\n r[3].x,\n r[3].y,\n r[3].z,\n // 点4 \n r[0].x,\n r[0].y,\n r[0].z\n // 点1\n ]);\n let f = new E.LineBasicMaterial({ color: 255 }), m = new E.BufferGeometry();\n m.setAttribute(\"position\", new E.BufferAttribute(p, 3));\n let g = t.meshs.find((y) => y.name == l + \"Line\");\n g == null && (g = new E.Line(m, f), g.name = l + \"Line\", n.add(g), t.meshs.push(g)), g.geometry = m, g.material = f, t.engine.sectionPlane.find((y) => y.name == l).setFromNormalAndCoplanarPoint(a.clone().setLength(-1), e.min);\n }\n }\n // 重写鼠标按下事件\n handleMouseDown(e) {\n this.isDrag = !0;\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0)\n if (this.pickPoint = t[0].point, this.pickNormal = t[0].face.normal, this.engine.controls.enabled = !1, this.pickMesh = t[0].object, this.box_ = {\n min: this.box.min.clone(),\n max: this.box.max.clone()\n }, this.pickNormal.y == 0) {\n const n = new E.Plane();\n n.setFromNormalAndCoplanarPoint(new E.Vector3(0, 1, 0), this.pickPoint), this.plane = n;\n } else {\n let n = new E.Vector3(this.engine.camera.position.x, this.pickPoint.y, this.engine.camera.position.z);\n const i = new E.Plane();\n i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1), this.pickPoint), this.plane = i;\n }\n }\n handleMouseUp(e) {\n this.isDrag = !1, this.pickPoint = null, this.pickNormal = null, this.pickMesh = null, this.engine.controls.enabled = !0;\n }\n handleMouseMove(e) {\n this.meshs.forEach((n) => {\n n.material.opacity = 0;\n });\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0 && (t[0].object.material.opacity = 0.05), this.pickPoint != null) {\n const n = new E.Vector3();\n if (e.raycaster.ray.intersectPlane(this.plane, n)) {\n let i = n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());\n this.pickMesh.name == \"前\" || this.pickMesh.name == \"左\" || this.pickMesh.name == \"底\" ? this.box.min = this.box_.min.clone().add(this.pickNormal.clone().setLength(i)) : this.box.max = this.box_.max.clone().add(this.pickNormal.clone().setLength(i)), this.updata_face(this.box);\n }\n }\n }\n}\nconst Sa = 0, hf = 1, uf = 2, Yr = 2, ls = 1.25, $r = 1, Be = 32, Ee = Be / 4, Ta = 65535, ff = Math.pow(2, -24), cs = Symbol(\"SKIP_GENERATION\");\nfunction df(s) {\n return s.index ? s.index.count : s.attributes.position.count;\n}\nfunction Qt(s) {\n return df(s) / 3;\n}\nfunction pf(s, e = ArrayBuffer) {\n return s > 65535 ? new Uint32Array(new e(4 * s)) : new Uint16Array(new e(2 * s));\n}\nfunction mf(s, e) {\n if (!s.index) {\n const t = s.attributes.position.count, n = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, i = pf(t, n);\n s.setIndex(new at(i, 1));\n for (let o = 0; o < t; o++)\n i[o] = o;\n }\n}\nfunction Ea(s, e) {\n const t = Qt(s), n = e || s.drawRange, i = n.start / 3, o = (n.start + n.count) / 3, r = Math.max(0, i), a = Math.min(t, o) - r;\n return [{\n offset: Math.floor(r),\n count: Math.floor(a)\n }];\n}\nfunction Jr(s, e) {\n if (!s.groups || !s.groups.length)\n return Ea(s, e);\n const t = [], n = e || s.drawRange, i = n.start / 3, o = (n.start + n.count) / 3, r = Qt(s), a = [];\n for (const c of s.groups) {\n const { start: u, count: d } = c, p = u / 3, f = isFinite(d) ? d : r * 3 - u, m = (u + f) / 3;\n p < o && m > i && (a.push({ pos: Math.max(i, p), isStart: !0 }), a.push({ pos: Math.min(o, m), isStart: !1 }));\n }\n a.sort((c, u) => c.pos !== u.pos ? c.pos - u.pos : c.type === \"end\" ? -1 : 1);\n let l = 0, h = null;\n for (const c of a) {\n const u = c.pos;\n l !== 0 && u !== h && t.push({\n offset: h,\n count: u - h\n }), l += c.isStart ? 1 : -1, h = u;\n }\n return t;\n}\nfunction hs(s, e, t, n, i) {\n let o = 1 / 0, r = 1 / 0, a = 1 / 0, l = -1 / 0, h = -1 / 0, c = -1 / 0, u = 1 / 0, d = 1 / 0, p = 1 / 0, f = -1 / 0, m = -1 / 0, g = -1 / 0;\n const y = s.offset || 0;\n for (let w = (e - y) * 6, _ = (e + t - y) * 6; w < _; w += 6) {\n const x = s[w + 0], b = s[w + 1], A = x - b, M = x + b;\n A < o && (o = A), M > l && (l = M), x < u && (u = x), x > f && (f = x);\n const C = s[w + 2], P = s[w + 3], k = C - P, B = C + P;\n k < r && (r = k), B > h && (h = B), C < d && (d = C), C > m && (m = C);\n const T = s[w + 4], D = s[w + 5], v = T - D, I = T + D;\n v < a && (a = v), I > c && (c = I), T < p && (p = T), T > g && (g = T);\n }\n n[0] = o, n[1] = r, n[2] = a, n[3] = l, n[4] = h, n[5] = c, i[0] = u, i[1] = d, i[2] = p, i[3] = f, i[4] = m, i[5] = g;\n}\nfunction Qr(s, e, t = null, n = null, i = null) {\n const o = s.attributes.position, r = s.index ? s.index.array : null, a = o.normalized;\n if (i === null)\n i = new Float32Array(t * 6), i.offset = e;\n else if (e < 0 || t + e > i.length / 6)\n throw new Error(\"MeshBVH: compute triangle bounds range is invalid.\");\n const l = o.array, h = o.offset || 0;\n let c = 3;\n o.isInterleavedBufferAttribute && (c = o.data.stride);\n const u = [\"getX\", \"getY\", \"getZ\"], d = i.offset;\n for (let p = e, f = e + t; p < f; p++) {\n const g = (n ? n[p] : p) * 3, y = (p - d) * 6;\n let w = g + 0, _ = g + 1, x = g + 2;\n r && (w = r[w], _ = r[_], x = r[x]), a || (w = w * c + h, _ = _ * c + h, x = x * c + h);\n for (let b = 0; b < 3; b++) {\n let A, M, C;\n a ? (A = o[u[b]](w), M = o[u[b]](_), C = o[u[b]](x)) : (A = l[w + b], M = l[_ + b], C = l[x + b]);\n let P = A;\n M < P && (P = M), C < P && (P = C);\n let k = A;\n M > k && (k = M), C > k && (k = C);\n const B = (k - P) / 2, T = b * 2;\n i[y + T + 0] = P + B, i[y + T + 1] = B + (Math.abs(P) + B) * ff;\n }\n }\n return i;\n}\nfunction we(s, e, t) {\n return t.min.x = e[s], t.min.y = e[s + 1], t.min.z = e[s + 2], t.max.x = e[s + 3], t.max.y = e[s + 4], t.max.z = e[s + 5], t;\n}\nfunction eo(s) {\n let e = -1, t = -1 / 0;\n for (let n = 0; n < 3; n++) {\n const i = s[n + 3] - s[n];\n i > t && (t = i, e = n);\n }\n return e;\n}\nfunction to(s, e) {\n e.set(s);\n}\nfunction no(s, e, t) {\n let n, i;\n for (let o = 0; o < 3; o++) {\n const r = o + 3;\n n = s[o], i = e[o], t[o] = n < i ? n : i, n = s[r], i = e[r], t[r] = n > i ? n : i;\n }\n}\nfunction ni(s, e, t) {\n for (let n = 0; n < 3; n++) {\n const i = e[s + 2 * n], o = e[s + 2 * n + 1], r = i - o, a = i + o;\n r < t[n] && (t[n] = r), a > t[n + 3] && (t[n + 3] = a);\n }\n}\nfunction Mn(s) {\n const e = s[3] - s[0], t = s[4] - s[1], n = s[5] - s[2];\n return 2 * (e * t + t * n + n * e);\n}\nconst mt = 32, gf = (s, e) => s.candidate - e.candidate, Et = /* @__PURE__ */ new Array(mt).fill().map(() => ({\n count: 0,\n bounds: new Float32Array(6),\n rightCacheBounds: new Float32Array(6),\n leftCacheBounds: new Float32Array(6),\n candidate: 0\n})), ii = /* @__PURE__ */ new Float32Array(6);\nfunction yf(s, e, t, n, i, o) {\n let r = -1, a = 0;\n if (o === Sa)\n r = eo(e), r !== -1 && (a = (e[r] + e[r + 3]) / 2);\n else if (o === hf)\n r = eo(s), r !== -1 && (a = wf(t, n, i, r));\n else if (o === uf) {\n const l = Mn(s);\n let h = ls * i;\n const c = t.offset || 0, u = (n - c) * 6, d = (n + i - c) * 6;\n for (let p = 0; p < 3; p++) {\n const f = e[p], y = (e[p + 3] - f) / mt;\n if (i < mt / 4) {\n const w = [...Et];\n w.length = i;\n let _ = 0;\n for (let b = u; b < d; b += 6, _++) {\n const A = w[_];\n A.candidate = t[b + 2 * p], A.count = 0;\n const {\n bounds: M,\n leftCacheBounds: C,\n rightCacheBounds: P\n } = A;\n for (let k = 0; k < 3; k++)\n P[k] = 1 / 0, P[k + 3] = -1 / 0, C[k] = 1 / 0, C[k + 3] = -1 / 0, M[k] = 1 / 0, M[k + 3] = -1 / 0;\n ni(b, t, M);\n }\n w.sort(gf);\n let x = i;\n for (let b = 0; b < x; b++) {\n const A = w[b];\n for (; b + 1 < x && w[b + 1].candidate === A.candidate; )\n w.splice(b + 1, 1), x--;\n }\n for (let b = u; b < d; b += 6) {\n const A = t[b + 2 * p];\n for (let M = 0; M < x; M++) {\n const C = w[M];\n A >= C.candidate ? ni(b, t, C.rightCacheBounds) : (ni(b, t, C.leftCacheBounds), C.count++);\n }\n }\n for (let b = 0; b < x; b++) {\n const A = w[b], M = A.count, C = i - A.count, P = A.leftCacheBounds, k = A.rightCacheBounds;\n let B = 0;\n M !== 0 && (B = Mn(P) / l);\n let T = 0;\n C !== 0 && (T = Mn(k) / l);\n const D = $r + ls * (B * M + T * C);\n D < h && (r = p, h = D, a = A.candidate);\n }\n } else {\n for (let x = 0; x < mt; x++) {\n const b = Et[x];\n b.count = 0, b.candidate = f + y + x * y;\n const A = b.bounds;\n for (let M = 0; M < 3; M++)\n A[M] = 1 / 0, A[M + 3] = -1 / 0;\n }\n for (let x = u; x < d; x += 6) {\n let M = ~~((t[x + 2 * p] - f) / y);\n M >= mt && (M = mt - 1);\n const C = Et[M];\n C.count++, ni(x, t, C.bounds);\n }\n const w = Et[mt - 1];\n to(w.bounds, w.rightCacheBounds);\n for (let x = mt - 2; x >= 0; x--) {\n const b = Et[x], A = Et[x + 1];\n no(b.bounds, A.rightCacheBounds, b.rightCacheBounds);\n }\n let _ = 0;\n for (let x = 0; x < mt - 1; x++) {\n const b = Et[x], A = b.count, M = b.bounds, P = Et[x + 1].rightCacheBounds;\n A !== 0 && (_ === 0 ? to(M, ii) : no(M, ii, ii)), _ += A;\n let k = 0, B = 0;\n _ !== 0 && (k = Mn(ii) / l);\n const T = i - _;\n T !== 0 && (B = Mn(P) / l);\n const D = $r + ls * (k * _ + B * T);\n D < h && (r = p, h = D, a = b.candidate);\n }\n }\n }\n } else\n console.warn(`MeshBVH: Invalid build strategy value ${o} used.`);\n return { axis: r, pos: a };\n}\nfunction wf(s, e, t, n) {\n let i = 0;\n const o = s.offset;\n for (let r = e, a = e + t; r < a; r++)\n i += s[(r - o) * 6 + n * 2];\n return i / t;\n}\nclass us {\n constructor() {\n this.boundingData = new Float32Array(6);\n }\n}\nfunction _f(s, e, t, n, i, o) {\n let r = n, a = n + i - 1;\n const l = o.pos, h = o.axis * 2, c = t.offset || 0;\n for (; ; ) {\n for (; r <= a && t[(r - c) * 6 + h] < l; )\n r++;\n for (; r <= a && t[(a - c) * 6 + h] >= l; )\n a--;\n if (r < a) {\n for (let u = 0; u < 3; u++) {\n let d = e[r * 3 + u];\n e[r * 3 + u] = e[a * 3 + u], e[a * 3 + u] = d;\n }\n for (let u = 0; u < 6; u++) {\n const d = r - c, p = a - c, f = t[d * 6 + u];\n t[d * 6 + u] = t[p * 6 + u], t[p * 6 + u] = f;\n }\n r++, a--;\n } else\n return r;\n }\n}\nfunction xf(s, e, t, n, i, o) {\n let r = n, a = n + i - 1;\n const l = o.pos, h = o.axis * 2, c = t.offset || 0;\n for (; ; ) {\n for (; r <= a && t[(r - c) * 6 + h] < l; )\n r++;\n for (; r <= a && t[(a - c) * 6 + h] >= l; )\n a--;\n if (r < a) {\n let u = s[r];\n s[r] = s[a], s[a] = u;\n for (let d = 0; d < 6; d++) {\n const p = r - c, f = a - c, m = t[p * 6 + d];\n t[p * 6 + d] = t[f * 6 + d], t[f * 6 + d] = m;\n }\n r++, a--;\n } else\n return r;\n }\n}\nlet Ma, Ai, js, Aa;\nconst bf = Math.pow(2, 32);\nfunction Hs(s) {\n return \"count\" in s ? 1 : 1 + Hs(s.left) + Hs(s.right);\n}\nfunction vf(s, e, t) {\n return Ma = new Float32Array(t), Ai = new Uint32Array(t), js = new Uint16Array(t), Aa = new Uint8Array(t), Gs(s, e);\n}\nfunction Gs(s, e) {\n const t = s / 4, n = s / 2, i = \"count\" in e, o = e.boundingData;\n for (let r = 0; r < 6; r++)\n Ma[t + r] = o[r];\n if (i)\n return e.buffer ? (Aa.set(new Uint8Array(e.buffer), s), s + e.buffer.byteLength) : (Ai[t + 6] = e.offset, js[n + 14] = e.count, js[n + 15] = Ta, s + Be);\n {\n const { left: r, right: a, splitAxis: l } = e, h = s + Be;\n let c = Gs(h, r);\n const u = s / Be, p = c / Be - u;\n if (p > bf)\n throw new Error(\"MeshBVH: Cannot store relative child node offset greater than 32 bits.\");\n return Ai[t + 6] = p, Ai[t + 7] = l, Gs(c, a);\n }\n}\nfunction Sf(s, e, t) {\n const i = (s.index ? s.index.count : s.attributes.position.count) / 3 > 2 ** 16, o = t.reduce((c, u) => c + u.count, 0), r = i ? 4 : 2, a = e ? new SharedArrayBuffer(o * r) : new ArrayBuffer(o * r), l = i ? new Uint32Array(a) : new Uint16Array(a);\n let h = 0;\n for (let c = 0; c < t.length; c++) {\n const { offset: u, count: d } = t[c];\n for (let p = 0; p < d; p++)\n l[h + p] = u + p;\n h += d;\n }\n return l;\n}\nfunction Tf(s, e, t, n, i) {\n const {\n maxDepth: o,\n verbose: r,\n maxLeafTris: a,\n strategy: l,\n onProgress: h,\n indirect: c\n } = i, u = s._indirectBuffer, d = s.geometry, p = d.index ? d.index.array : null, f = c ? xf : _f, m = Qt(d), g = new Float32Array(6);\n let y = !1;\n const w = new us();\n return hs(e, t, n, w.boundingData, g), x(w, t, n, g), w;\n function _(b) {\n h && h(b / m);\n }\n function x(b, A, M, C = null, P = 0) {\n if (!y && P >= o && (y = !0, r && (console.warn(`MeshBVH: Max depth of ${o} reached when generating BVH. Consider increasing maxDepth.`), console.warn(d))), M <= a || P >= o)\n return _(A + M), b.offset = A, b.count = M, b;\n const k = yf(b.boundingData, C, e, A, M, l);\n if (k.axis === -1)\n return _(A + M), b.offset = A, b.count = M, b;\n const B = f(u, p, e, A, M, k);\n if (B === A || B === A + M)\n _(A + M), b.offset = A, b.count = M;\n else {\n b.splitAxis = k.axis;\n const T = new us(), D = A, v = B - A;\n b.left = T, hs(e, D, v, T.boundingData, g), x(T, D, v, g, P + 1);\n const I = new us(), q = B, H = M - v;\n b.right = I, hs(e, q, H, I.boundingData, g), x(I, q, H, g, P + 1);\n }\n return b;\n }\n}\nfunction Ef(s, e) {\n const t = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, n = s.geometry;\n let i, o;\n if (e.indirect) {\n const r = Jr(n, e.range), a = Sf(n, e.useSharedArrayBuffer, r);\n s._indirectBuffer = a, i = Qr(n, 0, a.length, a), o = [{ offset: 0, count: a.length }];\n } else {\n mf(n, e);\n const r = Ea(n, e.range)[0];\n i = Qr(n, r.offset, r.count), o = Jr(n, e.range);\n }\n s._roots = o.map((r) => {\n const a = Tf(s, i, r.offset, r.count, e), l = Hs(a), h = new t(Be * l);\n return vf(0, a, h), h;\n });\n}\nclass xt {\n constructor() {\n this.min = 1 / 0, this.max = -1 / 0;\n }\n setFromPointsField(e, t) {\n let n = 1 / 0, i = -1 / 0;\n for (let o = 0, r = e.length; o < r; o++) {\n const l = e[o][t];\n n = l < n ? l : n, i = l > i ? l : i;\n }\n this.min = n, this.max = i;\n }\n setFromPoints(e, t) {\n let n = 1 / 0, i = -1 / 0;\n for (let o = 0, r = t.length; o < r; o++) {\n const a = t[o], l = e.dot(a);\n n = l < n ? l : n, i = l > i ? l : i;\n }\n this.min = n, this.max = i;\n }\n isSeparated(e) {\n return this.min > e.max || e.min > this.max;\n }\n}\nxt.prototype.setFromBox = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new Z();\n return function(t, n) {\n const i = n.min, o = n.max;\n let r = 1 / 0, a = -1 / 0;\n for (let l = 0; l <= 1; l++)\n for (let h = 0; h <= 1; h++)\n for (let c = 0; c <= 1; c++) {\n s.x = i.x * l + o.x * (1 - l), s.y = i.y * h + o.y * (1 - h), s.z = i.z * c + o.z * (1 - c);\n const u = t.dot(s);\n r = Math.min(u, r), a = Math.max(u, a);\n }\n this.min = r, this.max = a;\n };\n})();\nconst Mf = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new Z(), e = /* @__PURE__ */ new Z(), t = /* @__PURE__ */ new Z();\n return function(i, o, r) {\n const a = i.start, l = s, h = o.start, c = e;\n t.subVectors(a, h), s.subVectors(i.end, i.start), e.subVectors(o.end, o.start);\n const u = t.dot(c), d = c.dot(l), p = c.dot(c), f = t.dot(l), g = l.dot(l) * p - d * d;\n let y, w;\n g !== 0 ? y = (u * d - f * p) / g : y = 0, w = (u + y * d) / p, r.x = y, r.y = w;\n };\n})(), or = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new ce(), e = /* @__PURE__ */ new Z(), t = /* @__PURE__ */ new Z();\n return function(i, o, r, a) {\n Mf(i, o, s);\n let l = s.x, h = s.y;\n if (l >= 0 && l <= 1 && h >= 0 && h <= 1) {\n i.at(l, r), o.at(h, a);\n return;\n } else if (l >= 0 && l <= 1) {\n h < 0 ? o.at(0, a) : o.at(1, a), i.closestPointToPoint(a, !0, r);\n return;\n } else if (h >= 0 && h <= 1) {\n l < 0 ? i.at(0, r) : i.at(1, r), o.closestPointToPoint(r, !0, a);\n return;\n } else {\n let c;\n l < 0 ? c = i.start : c = i.end;\n let u;\n h < 0 ? u = o.start : u = o.end;\n const d = e, p = t;\n if (i.closestPointToPoint(u, !0, e), o.closestPointToPoint(c, !0, t), d.distanceToSquared(u) <= p.distanceToSquared(c)) {\n r.copy(d), a.copy(u);\n return;\n } else {\n r.copy(c), a.copy(p);\n return;\n }\n }\n };\n})(), Af = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new Z(), e = /* @__PURE__ */ new Z(), t = /* @__PURE__ */ new Ui(), n = /* @__PURE__ */ new Ze();\n return function(o, r) {\n const { radius: a, center: l } = o, { a: h, b: c, c: u } = r;\n if (n.start = h, n.end = c, n.closestPointToPoint(l, !0, s).distanceTo(l) <= a || (n.start = h, n.end = u, n.closestPointToPoint(l, !0, s).distanceTo(l) <= a) || (n.start = c, n.end = u, n.closestPointToPoint(l, !0, s).distanceTo(l) <= a)) return !0;\n const m = r.getPlane(t);\n if (Math.abs(m.distanceToPoint(l)) <= a) {\n const y = m.projectPoint(l, e);\n if (r.containsPoint(y)) return !0;\n }\n return !1;\n };\n})(), Cf = [\"x\", \"y\", \"z\"], gt = 1e-15, io = gt * gt;\nfunction He(s) {\n return Math.abs(s) < gt;\n}\nclass Ye extends Oe {\n constructor(...e) {\n super(...e), this.isExtendedTriangle = !0, this.satAxes = new Array(4).fill().map(() => new Z()), this.satBounds = new Array(4).fill().map(() => new xt()), this.points = [this.a, this.b, this.c], this.plane = new Ui(), this.isDegenerateIntoSegment = !1, this.isDegenerateIntoPoint = !1, this.degenerateSegment = new Ze(), this.needsUpdate = !0;\n }\n intersectsSphere(e) {\n return Af(e, this);\n }\n update() {\n const e = this.a, t = this.b, n = this.c, i = this.points, o = this.satAxes, r = this.satBounds, a = o[0], l = r[0];\n this.getNormal(a), l.setFromPoints(a, i);\n const h = o[1], c = r[1];\n h.subVectors(e, t), c.setFromPoints(h, i);\n const u = o[2], d = r[2];\n u.subVectors(t, n), d.setFromPoints(u, i);\n const p = o[3], f = r[3];\n p.subVectors(n, e), f.setFromPoints(p, i);\n const m = h.length(), g = u.length(), y = p.length();\n this.isDegenerateIntoPoint = !1, this.isDegenerateIntoSegment = !1, m < gt ? g < gt || y < gt ? this.isDegenerateIntoPoint = !0 : (this.isDegenerateIntoSegment = !0, this.degenerateSegment.start.copy(e), this.degenerateSegment.end.copy(n)) : g < gt ? y < gt ? this.isDegenerateIntoPoint = !0 : (this.isDegenerateIntoSegment = !0, this.degenerateSegment.start.copy(t), this.degenerateSegment.end.copy(e)) : y < gt && (this.isDegenerateIntoSegment = !0, this.degenerateSegment.start.copy(n), this.degenerateSegment.end.copy(t)), this.plane.setFromNormalAndCoplanarPoint(a, e), this.needsUpdate = !1;\n }\n}\nYe.prototype.closestPointToSegment = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new Z(), e = /* @__PURE__ */ new Z(), t = /* @__PURE__ */ new Ze();\n return function(i, o = null, r = null) {\n const { start: a, end: l } = i, h = this.points;\n let c, u = 1 / 0;\n for (let d = 0; d < 3; d++) {\n const p = (d + 1) % 3;\n t.start.copy(h[d]), t.end.copy(h[p]), or(t, i, s, e), c = s.distanceToSquared(e), c < u && (u = c, o && o.copy(s), r && r.copy(e));\n }\n return this.closestPointToPoint(a, s), c = a.distanceToSquared(s), c < u && (u = c, o && o.copy(s), r && r.copy(a)), this.closestPointToPoint(l, s), c = l.distanceToSquared(s), c < u && (u = c, o && o.copy(s), r && r.copy(l)), Math.sqrt(u);\n };\n})();\nYe.prototype.intersectsTriangle = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new Ye(), e = /* @__PURE__ */ new xt(), t = /* @__PURE__ */ new xt(), n = /* @__PURE__ */ new Z(), i = /* @__PURE__ */ new Z(), o = /* @__PURE__ */ new Z(), r = /* @__PURE__ */ new Z(), a = /* @__PURE__ */ new Ze(), l = /* @__PURE__ */ new Ze(), h = /* @__PURE__ */ new Z(), c = /* @__PURE__ */ new ce(), u = /* @__PURE__ */ new ce();\n function d(_, x, b, A) {\n const M = n;\n !_.isDegenerateIntoPoint && !_.isDegenerateIntoSegment ? M.copy(_.plane.normal) : M.copy(x.plane.normal);\n const C = _.satBounds, P = _.satAxes;\n for (let T = 1; T < 4; T++) {\n const D = C[T], v = P[T];\n if (e.setFromPoints(v, x.points), D.isSeparated(e) || (r.copy(M).cross(v), e.setFromPoints(r, _.points), t.setFromPoints(r, x.points), e.isSeparated(t))) return !1;\n }\n const k = x.satBounds, B = x.satAxes;\n for (let T = 1; T < 4; T++) {\n const D = k[T], v = B[T];\n if (e.setFromPoints(v, _.points), D.isSeparated(e) || (r.crossVectors(M, v), e.setFromPoints(r, _.points), t.setFromPoints(r, x.points), e.isSeparated(t))) return !1;\n }\n return b && (A || console.warn(\"ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0.\"), b.start.set(0, 0, 0), b.end.set(0, 0, 0)), !0;\n }\n function p(_, x, b, A, M, C, P, k, B, T, D) {\n let v = P / (P - k);\n T.x = A + (M - A) * v, D.start.subVectors(x, _).multiplyScalar(v).add(_), v = P / (P - B), T.y = A + (C - A) * v, D.end.subVectors(b, _).multiplyScalar(v).add(_);\n }\n function f(_, x, b, A, M, C, P, k, B, T, D) {\n if (M > 0)\n p(_.c, _.a, _.b, A, x, b, B, P, k, T, D);\n else if (C > 0)\n p(_.b, _.a, _.c, b, x, A, k, P, B, T, D);\n else if (k * B > 0 || P != 0)\n p(_.a, _.b, _.c, x, b, A, P, k, B, T, D);\n else if (k != 0)\n p(_.b, _.a, _.c, b, x, A, k, P, B, T, D);\n else if (B != 0)\n p(_.c, _.a, _.b, A, x, b, B, P, k, T, D);\n else\n return !0;\n return !1;\n }\n function m(_, x, b, A) {\n const M = x.degenerateSegment, C = _.plane.distanceToPoint(M.start), P = _.plane.distanceToPoint(M.end);\n return He(C) ? He(P) ? d(_, x, b, A) : (b && (b.start.copy(M.start), b.end.copy(M.start)), _.containsPoint(M.start)) : He(P) ? (b && (b.start.copy(M.end), b.end.copy(M.end)), _.containsPoint(M.end)) : _.plane.intersectLine(M, n) != null ? (b && (b.start.copy(n), b.end.copy(n)), _.containsPoint(n)) : !1;\n }\n function g(_, x, b) {\n const A = x.a;\n return He(_.plane.distanceToPoint(A)) && _.containsPoint(A) ? (b && (b.start.copy(A), b.end.copy(A)), !0) : !1;\n }\n function y(_, x, b) {\n const A = _.degenerateSegment, M = x.a;\n return A.closestPointToPoint(M, !0, n), M.distanceToSquared(n) < io ? (b && (b.start.copy(M), b.end.copy(M)), !0) : !1;\n }\n function w(_, x, b, A) {\n if (_.isDegenerateIntoSegment)\n if (x.isDegenerateIntoSegment) {\n const M = _.degenerateSegment, C = x.degenerateSegment, P = i, k = o;\n M.delta(P), C.delta(k);\n const B = n.subVectors(C.start, M.start), T = P.x * k.y - P.y * k.x;\n if (He(T))\n return !1;\n const D = (B.x * k.y - B.y * k.x) / T, v = -(P.x * B.y - P.y * B.x) / T;\n if (D < 0 || D > 1 || v < 0 || v > 1)\n return !1;\n const I = M.start.z + P.z * D, q = C.start.z + k.z * v;\n return He(I - q) ? (b && (b.start.copy(M.start).addScaledVector(P, D), b.end.copy(M.start).addScaledVector(P, D)), !0) : !1;\n } else return x.isDegenerateIntoPoint ? y(_, x, b) : m(x, _, b, A);\n else {\n if (_.isDegenerateIntoPoint)\n return x.isDegenerateIntoPoint ? x.a.distanceToSquared(_.a) < io ? (b && (b.start.copy(_.a), b.end.copy(_.a)), !0) : !1 : x.isDegenerateIntoSegment ? y(x, _, b) : g(x, _, b);\n if (x.isDegenerateIntoPoint)\n return g(_, x, b);\n if (x.isDegenerateIntoSegment)\n return m(_, x, b, A);\n }\n }\n return function(x, b = null, A = !1) {\n this.needsUpdate && this.update(), x.isExtendedTriangle ? x.needsUpdate && x.update() : (s.copy(x), s.update(), x = s);\n const M = w(this, x, b, A);\n if (M !== void 0)\n return M;\n const C = this.plane, P = x.plane;\n let k = P.distanceToPoint(this.a), B = P.distanceToPoint(this.b), T = P.distanceToPoint(this.c);\n He(k) && (k = 0), He(B) && (B = 0), He(T) && (T = 0);\n const D = k * B, v = k * T;\n if (D > 0 && v > 0)\n return !1;\n let I = C.distanceToPoint(x.a), q = C.distanceToPoint(x.b), H = C.distanceToPoint(x.c);\n He(I) && (I = 0), He(q) && (q = 0), He(H) && (H = 0);\n const ee = I * q, j = I * H;\n if (ee > 0 && j > 0)\n return !1;\n i.copy(C.normal), o.copy(P.normal);\n const ne = i.cross(o);\n let O = 0, N = Math.abs(ne.x);\n const te = Math.abs(ne.y);\n te > N && (N = te, O = 1), Math.abs(ne.z) > N && (O = 2);\n const K = Cf[O], fe = this.a[K], pe = this.b[K], se = this.c[K], oe = x.a[K], ue = x.b[K], me = x.c[K];\n if (f(this, fe, pe, se, D, v, k, B, T, c, a))\n return d(this, x, b, A);\n if (f(x, oe, ue, me, ee, j, I, q, H, u, l))\n return d(this, x, b, A);\n if (c.y < c.x) {\n const Se = c.y;\n c.y = c.x, c.x = Se, h.copy(a.start), a.start.copy(a.end), a.end.copy(h);\n }\n if (u.y < u.x) {\n const Se = u.y;\n u.y = u.x, u.x = Se, h.copy(l.start), l.start.copy(l.end), l.end.copy(h);\n }\n return c.y < u.x || u.y < c.x ? !1 : (b && (u.x > c.x ? b.start.copy(l.start) : b.start.copy(a.start), u.y < c.y ? b.end.copy(l.end) : b.end.copy(a.end)), !0);\n };\n})();\nYe.prototype.distanceToPoint = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new Z();\n return function(t) {\n return this.closestPointToPoint(t, s), t.distanceTo(s);\n };\n})();\nYe.prototype.distanceToTriangle = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new Z(), e = /* @__PURE__ */ new Z(), t = [\"a\", \"b\", \"c\"], n = /* @__PURE__ */ new Ze(), i = /* @__PURE__ */ new Ze();\n return function(r, a = null, l = null) {\n const h = a || l ? n : null;\n if (this.intersectsTriangle(r, h))\n return (a || l) && (a && h.getCenter(a), l && h.getCenter(l)), 0;\n let c = 1 / 0;\n for (let u = 0; u < 3; u++) {\n let d;\n const p = t[u], f = r[p];\n this.closestPointToPoint(f, s), d = f.distanceToSquared(s), d < c && (c = d, a && a.copy(s), l && l.copy(f));\n const m = this[p];\n r.closestPointToPoint(m, s), d = m.distanceToSquared(s), d < c && (c = d, a && a.copy(m), l && l.copy(s));\n }\n for (let u = 0; u < 3; u++) {\n const d = t[u], p = t[(u + 1) % 3];\n n.set(this[d], this[p]);\n for (let f = 0; f < 3; f++) {\n const m = t[f], g = t[(f + 1) % 3];\n i.set(r[m], r[g]), or(n, i, s, e);\n const y = s.distanceToSquared(e);\n y < c && (c = y, a && a.copy(s), l && l.copy(e));\n }\n }\n return Math.sqrt(c);\n };\n})();\nclass Ie {\n constructor(e, t, n) {\n this.isOrientedBox = !0, this.min = new Z(), this.max = new Z(), this.matrix = new Ae(), this.invMatrix = new Ae(), this.points = new Array(8).fill().map(() => new Z()), this.satAxes = new Array(3).fill().map(() => new Z()), this.satBounds = new Array(3).fill().map(() => new xt()), this.alignedSatBounds = new Array(3).fill().map(() => new xt()), this.needsUpdate = !1, e && this.min.copy(e), t && this.max.copy(t), n && this.matrix.copy(n);\n }\n set(e, t, n) {\n this.min.copy(e), this.max.copy(t), this.matrix.copy(n), this.needsUpdate = !0;\n }\n copy(e) {\n this.min.copy(e.min), this.max.copy(e.max), this.matrix.copy(e.matrix), this.needsUpdate = !0;\n }\n}\nIe.prototype.update = /* @__PURE__ */ (function() {\n return function() {\n const e = this.matrix, t = this.min, n = this.max, i = this.points;\n for (let h = 0; h <= 1; h++)\n for (let c = 0; c <= 1; c++)\n for (let u = 0; u <= 1; u++) {\n const d = 1 * h | 2 * c | 4 * u, p = i[d];\n p.x = h ? n.x : t.x, p.y = c ? n.y : t.y, p.z = u ? n.z : t.z, p.applyMatrix4(e);\n }\n const o = this.satBounds, r = this.satAxes, a = i[0];\n for (let h = 0; h < 3; h++) {\n const c = r[h], u = o[h], d = 1 << h, p = i[d];\n c.subVectors(a, p), u.setFromPoints(c, i);\n }\n const l = this.alignedSatBounds;\n l[0].setFromPointsField(i, \"x\"), l[1].setFromPointsField(i, \"y\"), l[2].setFromPointsField(i, \"z\"), this.invMatrix.copy(this.matrix).invert(), this.needsUpdate = !1;\n };\n})();\nIe.prototype.intersectsBox = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new xt();\n return function(t) {\n this.needsUpdate && this.update();\n const n = t.min, i = t.max, o = this.satBounds, r = this.satAxes, a = this.alignedSatBounds;\n if (s.min = n.x, s.max = i.x, a[0].isSeparated(s) || (s.min = n.y, s.max = i.y, a[1].isSeparated(s)) || (s.min = n.z, s.max = i.z, a[2].isSeparated(s))) return !1;\n for (let l = 0; l < 3; l++) {\n const h = r[l], c = o[l];\n if (s.setFromBox(h, t), c.isSeparated(s)) return !1;\n }\n return !0;\n };\n})();\nIe.prototype.intersectsTriangle = /* @__PURE__ */ (function() {\n const s = /* @__PURE__ */ new Ye(), e = /* @__PURE__ */ new Array(3), t = /* @__PURE__ */ new xt(), n = /* @__PURE__ */ new xt(), i = /* @__PURE__ */ new Z();\n return function(r) {\n this.needsUpdate && this.update(), r.isExtendedTriangle ? r.needsUpdate && r.update() : (s.copy(r), s.update(), r = s);\n const a = this.satBounds, l = this.satAxes;\n e[0] = r.a, e[1] = r.b, e[2] = r.c;\n for (let d = 0; d < 3; d++) {\n const p = a[d], f = l[d];\n if (t.setFromPoints(f, e), p.isSeparated(t)) return !1;\n }\n const h = r.satBounds, c = r.satAxes, u = this.points;\n for (let d = 0; d < 3; d++) {\n const p = h[d], f = c[d];\n if (t.setFromPoints(f, u), p.isSeparated(t)) return !1;\n }\n for (let d = 0; d < 3; d++) {\n const p = l[d];\n for (let f = 0; f < 4; f++) {\n const m = c[f];\n if (i.crossVectors(p, m), t.setFromPoints(i, e), n.setFromPoints(i, u), t.isSeparated(n)) return !1;\n }\n }\n return !0;\n };\n})();\nIe.prototype.closestPointToPoint = /* @__PURE__ */ (function() {\n return function(e, t) {\n return this.needsUpdate && this.update(), t.copy(e).applyMatrix4(this.invMatrix).clamp(this.min, this.max).applyMatrix4(this.matrix), t;\n };\n})();\nIe.prototype.distanceToPoint = (function() {\n const s = new Z();\n return function(t) {\n return this.closestPointToPoint(t, s), t.distanceTo(s);\n };\n})();\nIe.prototype.distanceToBox = /* @__PURE__ */ (function() {\n const s = [\"x\", \"y\", \"z\"], e = /* @__PURE__ */ new Array(12).fill().map(() => new Ze()), t = /* @__PURE__ */ new Array(12).fill().map(() => new Ze()), n = /* @__PURE__ */ new Z(), i = /* @__PURE__ */ new Z();\n return function(r, a = 0, l = null, h = null) {\n if (this.needsUpdate && this.update(), this.intersectsBox(r))\n return (l || h) && (r.getCenter(i), this.closestPointToPoint(i, n), r.closestPointToPoint(n, i), l && l.copy(n), h && h.copy(i)), 0;\n const c = a * a, u = r.min, d = r.max, p = this.points;\n let f = 1 / 0;\n for (let g = 0; g < 8; g++) {\n const y = p[g];\n i.copy(y).clamp(u, d);\n const w = y.distanceToSquared(i);\n if (w < f && (f = w, l && l.copy(y), h && h.copy(i), w < c))\n return Math.sqrt(w);\n }\n let m = 0;\n for (let g = 0; g < 3; g++)\n for (let y = 0; y <= 1; y++)\n for (let w = 0; w <= 1; w++) {\n const _ = (g + 1) % 3, x = (g + 2) % 3, b = y << _ | w << x, A = 1 << g | y << _ | w << x, M = p[b], C = p[A];\n e[m].set(M, C);\n const k = s[g], B = s[_], T = s[x], D = t[m], v = D.start, I = D.end;\n v[k] = u[k], v[B] = y ? u[B] : d[B], v[T] = w ? u[T] : d[B], I[k] = d[k], I[B] = y ? u[B] : d[B], I[T] = w ? u[T] : d[B], m++;\n }\n for (let g = 0; g <= 1; g++)\n for (let y = 0; y <= 1; y++)\n for (let w = 0; w <= 1; w++) {\n i.x = g ? d.x : u.x, i.y = y ? d.y : u.y, i.z = w ? d.z : u.z, this.closestPointToPoint(i, n);\n const _ = i.distanceToSquared(n);\n if (_ < f && (f = _, l && l.copy(n), h && h.copy(i), _ < c))\n return Math.sqrt(_);\n }\n for (let g = 0; g < 12; g++) {\n const y = e[g];\n for (let w = 0; w < 12; w++) {\n const _ = t[w];\n or(y, _, n, i);\n const x = n.distanceToSquared(i);\n if (x < f && (f = x, l && l.copy(n), h && h.copy(i), x < c))\n return Math.sqrt(x);\n }\n }\n return Math.sqrt(f);\n };\n})();\nclass ar {\n constructor(e) {\n this._getNewPrimitive = e, this._primitives = [];\n }\n getPrimitive() {\n const e = this._primitives;\n return e.length === 0 ? this._getNewPrimitive() : e.pop();\n }\n releasePrimitive(e) {\n this._primitives.push(e);\n }\n}\nclass Pf extends ar {\n constructor() {\n super(() => new Ye());\n }\n}\nconst qe = /* @__PURE__ */ new Pf();\nfunction Me(s, e) {\n return e[s + 15] === Ta;\n}\nfunction Ve(s, e) {\n return e[s + 6];\n}\nfunction Ke(s, e) {\n return e[s + 14];\n}\nfunction Ce(s) {\n return s + Ee;\n}\nfunction Pe(s, e) {\n const t = e[s + 6];\n return s + t * Ee;\n}\nfunction lr(s, e) {\n return e[s + 7];\n}\nclass kf {\n constructor() {\n this.float32Array = null, this.uint16Array = null, this.uint32Array = null;\n const e = [];\n let t = null;\n this.setBuffer = (n) => {\n t && e.push(t), t = n, this.float32Array = new Float32Array(n), this.uint16Array = new Uint16Array(n), this.uint32Array = new Uint32Array(n);\n }, this.clearBuffer = () => {\n t = null, this.float32Array = null, this.uint16Array = null, this.uint32Array = null, e.length !== 0 && this.setBuffer(e.pop());\n };\n }\n}\nconst ge = /* @__PURE__ */ new kf();\nlet Pt, un;\nconst tn = [], si = /* @__PURE__ */ new ar(() => new nt());\nfunction Rf(s, e, t, n, i, o) {\n Pt = si.getPrimitive(), un = si.getPrimitive(), tn.push(Pt, un), ge.setBuffer(s._roots[e]);\n const r = Ws(0, s.geometry, t, n, i, o);\n ge.clearBuffer(), si.releasePrimitive(Pt), si.releasePrimitive(un), tn.pop(), tn.pop();\n const a = tn.length;\n return a > 0 && (un = tn[a - 1], Pt = tn[a - 2]), r;\n}\nfunction Ws(s, e, t, n, i = null, o = 0, r = 0) {\n const { float32Array: a, uint16Array: l, uint32Array: h } = ge;\n let c = s * 2;\n if (Me(c, l)) {\n const d = Ve(s, h), p = Ke(c, l);\n return we(s, a, Pt), n(d, p, !1, r, o + s / Ee, Pt);\n } else {\n let k = function(T) {\n const { uint16Array: D, uint32Array: v } = ge;\n let I = T * 2;\n for (; !Me(I, D); )\n T = Ce(T), I = T * 2;\n return Ve(T, v);\n }, B = function(T) {\n const { uint16Array: D, uint32Array: v } = ge;\n let I = T * 2;\n for (; !Me(I, D); )\n T = Pe(T, v), I = T * 2;\n return Ve(T, v) + Ke(I, D);\n };\n const d = Ce(s), p = Pe(s, h);\n let f = d, m = p, g, y, w, _;\n if (i && (w = Pt, _ = un, we(f, a, w), we(m, a, _), g = i(w), y = i(_), y < g)) {\n f = p, m = d;\n const T = g;\n g = y, y = T, w = _;\n }\n w || (w = Pt, we(f, a, w));\n const x = Me(f * 2, l), b = t(w, x, g, r + 1, o + f / Ee);\n let A;\n if (b === Yr) {\n const T = k(f), v = B(f) - T;\n A = n(T, v, !0, r + 1, o + f / Ee, w);\n } else\n A = b && Ws(\n f,\n e,\n t,\n n,\n i,\n o,\n r + 1\n );\n if (A) return !0;\n _ = un, we(m, a, _);\n const M = Me(m * 2, l), C = t(_, M, y, r + 1, o + m / Ee);\n let P;\n if (C === Yr) {\n const T = k(m), v = B(m) - T;\n P = n(T, v, !0, r + 1, o + m / Ee, _);\n } else\n P = C && Ws(\n m,\n e,\n t,\n n,\n i,\n o,\n r + 1\n );\n return !!P;\n }\n}\nconst An = /* @__PURE__ */ new Z(), fs = /* @__PURE__ */ new Z();\nfunction Df(s, e, t = {}, n = 0, i = 1 / 0) {\n const o = n * n, r = i * i;\n let a = 1 / 0, l = null;\n if (s.shapecast(\n {\n boundsTraverseOrder: (c) => (An.copy(e).clamp(c.min, c.max), An.distanceToSquared(e)),\n intersectsBounds: (c, u, d) => d < a && d < r,\n intersectsTriangle: (c, u) => {\n c.closestPointToPoint(e, An);\n const d = e.distanceToSquared(An);\n return d < a && (fs.copy(An), a = d, l = u), d < o;\n }\n }\n ), a === 1 / 0) return null;\n const h = Math.sqrt(a);\n return t.point ? t.point.copy(fs) : t.point = fs.clone(), t.distance = h, t.faceIndex = l, t;\n}\nconst ri = parseInt(Go) >= 169, Lf = parseInt(Go) <= 161, Ot = /* @__PURE__ */ new Z(), Ut = /* @__PURE__ */ new Z(), Ft = /* @__PURE__ */ new Z(), oi = /* @__PURE__ */ new ce(), ai = /* @__PURE__ */ new ce(), li = /* @__PURE__ */ new ce(), so = /* @__PURE__ */ new Z(), ro = /* @__PURE__ */ new Z(), oo = /* @__PURE__ */ new Z(), Cn = /* @__PURE__ */ new Z();\nfunction Bf(s, e, t, n, i, o, r, a) {\n let l;\n if (o === kl ? l = s.intersectTriangle(n, t, e, !0, i) : l = s.intersectTriangle(e, t, n, o !== Vi, i), l === null) return null;\n const h = s.origin.distanceTo(i);\n return h < r || h > a ? null : {\n distance: h,\n point: i.clone()\n };\n}\nfunction ao(s, e, t, n, i, o, r, a, l, h, c) {\n Ot.fromBufferAttribute(e, o), Ut.fromBufferAttribute(e, r), Ft.fromBufferAttribute(e, a);\n const u = Bf(s, Ot, Ut, Ft, Cn, l, h, c);\n if (u) {\n if (n) {\n oi.fromBufferAttribute(n, o), ai.fromBufferAttribute(n, r), li.fromBufferAttribute(n, a), u.uv = new ce();\n const p = Oe.getInterpolation(Cn, Ot, Ut, Ft, oi, ai, li, u.uv);\n ri || (u.uv = p);\n }\n if (i) {\n oi.fromBufferAttribute(i, o), ai.fromBufferAttribute(i, r), li.fromBufferAttribute(i, a), u.uv1 = new ce();\n const p = Oe.getInterpolation(Cn, Ot, Ut, Ft, oi, ai, li, u.uv1);\n ri || (u.uv1 = p), Lf && (u.uv2 = u.uv1);\n }\n if (t) {\n so.fromBufferAttribute(t, o), ro.fromBufferAttribute(t, r), oo.fromBufferAttribute(t, a), u.normal = new Z();\n const p = Oe.getInterpolation(Cn, Ot, Ut, Ft, so, ro, oo, u.normal);\n u.normal.dot(s.direction) > 0 && u.normal.multiplyScalar(-1), ri || (u.normal = p);\n }\n const d = {\n a: o,\n b: r,\n c: a,\n normal: new Z(),\n materialIndex: 0\n };\n if (Oe.getNormal(Ot, Ut, Ft, d.normal), u.face = d, u.faceIndex = o, ri) {\n const p = new Z();\n Oe.getBarycoord(Cn, Ot, Ut, Ft, p), u.barycoord = p;\n }\n }\n return u;\n}\nfunction lo(s) {\n return s && s.isMaterial ? s.side : s;\n}\nfunction Ki(s, e, t, n, i, o, r) {\n const a = n * 3;\n let l = a + 0, h = a + 1, c = a + 2;\n const { index: u, groups: d } = s;\n s.index && (l = u.getX(l), h = u.getX(h), c = u.getX(c));\n const { position: p, normal: f, uv: m, uv1: g } = s.attributes;\n if (Array.isArray(e)) {\n const y = n * 3;\n for (let w = 0, _ = d.length; w < _; w++) {\n const { start: x, count: b, materialIndex: A } = d[w];\n if (y >= x && y < x + b) {\n const M = lo(e[A]), C = ao(t, p, f, m, g, l, h, c, M, o, r);\n if (C)\n if (C.faceIndex = n, C.face.materialIndex = A, i)\n i.push(C);\n else\n return C;\n }\n }\n } else {\n const y = lo(e), w = ao(t, p, f, m, g, l, h, c, y, o, r);\n if (w)\n if (w.faceIndex = n, w.face.materialIndex = 0, i)\n i.push(w);\n else\n return w;\n }\n return null;\n}\nfunction ve(s, e, t, n) {\n const i = s.a, o = s.b, r = s.c;\n let a = e, l = e + 1, h = e + 2;\n t && (a = t.getX(a), l = t.getX(l), h = t.getX(h)), i.x = n.getX(a), i.y = n.getY(a), i.z = n.getZ(a), o.x = n.getX(l), o.y = n.getY(l), o.z = n.getZ(l), r.x = n.getX(h), r.y = n.getY(h), r.z = n.getZ(h);\n}\nfunction If(s, e, t, n, i, o, r, a) {\n const { geometry: l, _indirectBuffer: h } = s;\n for (let c = n, u = n + i; c < u; c++)\n Ki(l, e, t, c, o, r, a);\n}\nfunction zf(s, e, t, n, i, o, r) {\n const { geometry: a, _indirectBuffer: l } = s;\n let h = 1 / 0, c = null;\n for (let u = n, d = n + i; u < d; u++) {\n let p;\n p = Ki(a, e, t, u, null, o, r), p && p.distance < h && (c = p, h = p.distance);\n }\n return c;\n}\nfunction Nf(s, e, t, n, i, o, r) {\n const { geometry: a } = t, { index: l } = a, h = a.attributes.position;\n for (let c = s, u = e + s; c < u; c++) {\n let d;\n if (d = c, ve(r, d * 3, l, h), r.needsUpdate = !0, n(r, d, i, o))\n return !0;\n }\n return !1;\n}\nfunction Of(s, e = null) {\n e && Array.isArray(e) && (e = new Set(e));\n const t = s.geometry, n = t.index ? t.index.array : null, i = t.attributes.position;\n let o, r, a, l, h = 0;\n const c = s._roots;\n for (let d = 0, p = c.length; d < p; d++)\n o = c[d], r = new Uint32Array(o), a = new Uint16Array(o), l = new Float32Array(o), u(0, h), h += o.byteLength;\n function u(d, p, f = !1) {\n const m = d * 2;\n if (Me(m, a)) {\n const g = r[d + 6], y = a[m + 14];\n let w = 1 / 0, _ = 1 / 0, x = 1 / 0, b = -1 / 0, A = -1 / 0, M = -1 / 0;\n for (let C = 3 * g, P = 3 * (g + y); C < P; C++) {\n let k = n[C];\n const B = i.getX(k), T = i.getY(k), D = i.getZ(k);\n B < w && (w = B), B > b && (b = B), T < _ && (_ = T), T > A && (A = T), D < x && (x = D), D > M && (M = D);\n }\n return l[d + 0] !== w || l[d + 1] !== _ || l[d + 2] !== x || l[d + 3] !== b || l[d + 4] !== A || l[d + 5] !== M ? (l[d + 0] = w, l[d + 1] = _, l[d + 2] = x, l[d + 3] = b, l[d + 4] = A, l[d + 5] = M, !0) : !1;\n } else {\n const g = Ce(d), y = Pe(d, r);\n let w = f, _ = !1, x = !1;\n if (e) {\n if (!w) {\n const k = g / Ee + p / Be, B = y / Ee + p / Be;\n _ = e.has(k), x = e.has(B), w = !_ && !x;\n }\n } else\n _ = !0, x = !0;\n const b = w || _, A = w || x;\n let M = !1;\n b && (M = u(g, p, w));\n let C = !1;\n A && (C = u(y, p, w));\n const P = M || C;\n if (P)\n for (let k = 0; k < 3; k++) {\n const B = g + k, T = y + k, D = l[B], v = l[B + 3], I = l[T], q = l[T + 3];\n l[d + k] = D < I ? D : I, l[d + k + 3] = v > q ? v : q;\n }\n return P;\n }\n }\n}\nfunction Dt(s, e, t, n, i) {\n let o, r, a, l, h, c;\n const u = 1 / t.direction.x, d = 1 / t.direction.y, p = 1 / t.direction.z, f = t.origin.x, m = t.origin.y, g = t.origin.z;\n let y = e[s], w = e[s + 3], _ = e[s + 1], x = e[s + 3 + 1], b = e[s + 2], A = e[s + 3 + 2];\n return u >= 0 ? (o = (y - f) * u, r = (w - f) * u) : (o = (w - f) * u, r = (y - f) * u), d >= 0 ? (a = (_ - m) * d, l = (x - m) * d) : (a = (x - m) * d, l = (_ - m) * d), o > l || a > r || ((a > o || isNaN(o)) && (o = a), (l < r || isNaN(r)) && (r = l), p >= 0 ? (h = (b - g) * p, c = (A - g) * p) : (h = (A - g) * p, c = (b - g) * p), o > c || h > r) ? !1 : ((h > o || o !== o) && (o = h), (c < r || r !== r) && (r = c), o <= i && r >= n);\n}\nfunction Uf(s, e, t, n, i, o, r, a) {\n const { geometry: l, _indirectBuffer: h } = s;\n for (let c = n, u = n + i; c < u; c++) {\n let d = h ? h[c] : c;\n Ki(l, e, t, d, o, r, a);\n }\n}\nfunction Ff(s, e, t, n, i, o, r) {\n const { geometry: a, _indirectBuffer: l } = s;\n let h = 1 / 0, c = null;\n for (let u = n, d = n + i; u < d; u++) {\n let p;\n p = Ki(a, e, t, l ? l[u] : u, null, o, r), p && p.distance < h && (c = p, h = p.distance);\n }\n return c;\n}\nfunction Vf(s, e, t, n, i, o, r) {\n const { geometry: a } = t, { index: l } = a, h = a.attributes.position;\n for (let c = s, u = e + s; c < u; c++) {\n let d;\n if (d = t.resolveTriangleIndex(c), ve(r, d * 3, l, h), r.needsUpdate = !0, n(r, d, i, o))\n return !0;\n }\n return !1;\n}\nfunction jf(s, e, t, n, i, o, r) {\n ge.setBuffer(s._roots[e]), Xs(0, s, t, n, i, o, r), ge.clearBuffer();\n}\nfunction Xs(s, e, t, n, i, o, r) {\n const { float32Array: a, uint16Array: l, uint32Array: h } = ge, c = s * 2;\n if (Me(c, l)) {\n const d = Ve(s, h), p = Ke(c, l);\n If(e, t, n, d, p, i, o, r);\n } else {\n const d = Ce(s);\n Dt(d, a, n, o, r) && Xs(d, e, t, n, i, o, r);\n const p = Pe(s, h);\n Dt(p, a, n, o, r) && Xs(p, e, t, n, i, o, r);\n }\n}\nconst Hf = [\"x\", \"y\", \"z\"];\nfunction Gf(s, e, t, n, i, o) {\n ge.setBuffer(s._roots[e]);\n const r = qs(0, s, t, n, i, o);\n return ge.clearBuffer(), r;\n}\nfunction qs(s, e, t, n, i, o) {\n const { float32Array: r, uint16Array: a, uint32Array: l } = ge;\n let h = s * 2;\n if (Me(h, a)) {\n const u = Ve(s, l), d = Ke(h, a);\n return zf(e, t, n, u, d, i, o);\n } else {\n const u = lr(s, l), d = Hf[u], f = n.direction[d] >= 0;\n let m, g;\n f ? (m = Ce(s), g = Pe(s, l)) : (m = Pe(s, l), g = Ce(s));\n const w = Dt(m, r, n, i, o) ? qs(m, e, t, n, i, o) : null;\n if (w) {\n const b = w.point[d];\n if (f ? b <= r[g + u] : (\n // min bounding data\n b >= r[g + u + 3]\n ))\n return w;\n }\n const x = Dt(g, r, n, i, o) ? qs(g, e, t, n, i, o) : null;\n return w && x ? w.distance <= x.distance ? w : x : w || x || null;\n }\n}\nconst ci = /* @__PURE__ */ new nt(), nn = /* @__PURE__ */ new Ye(), sn = /* @__PURE__ */ new Ye(), Pn = /* @__PURE__ */ new Ae(), co = /* @__PURE__ */ new Ie(), hi = /* @__PURE__ */ new Ie();\nfunction Wf(s, e, t, n) {\n ge.setBuffer(s._roots[e]);\n const i = Ks(0, s, t, n);\n return ge.clearBuffer(), i;\n}\nfunction Ks(s, e, t, n, i = null) {\n const { float32Array: o, uint16Array: r, uint32Array: a } = ge;\n let l = s * 2;\n if (i === null && (t.boundingBox || t.computeBoundingBox(), co.set(t.boundingBox.min, t.boundingBox.max, n), i = co), Me(l, r)) {\n const c = e.geometry, u = c.index, d = c.attributes.position, p = t.index, f = t.attributes.position, m = Ve(s, a), g = Ke(l, r);\n if (Pn.copy(n).invert(), t.boundsTree)\n return we(s, o, hi), hi.matrix.copy(Pn), hi.needsUpdate = !0, t.boundsTree.shapecast({\n intersectsBounds: (w) => hi.intersectsBox(w),\n intersectsTriangle: (w) => {\n w.a.applyMatrix4(n), w.b.applyMatrix4(n), w.c.applyMatrix4(n), w.needsUpdate = !0;\n for (let _ = m * 3, x = (g + m) * 3; _ < x; _ += 3)\n if (ve(sn, _, u, d), sn.needsUpdate = !0, w.intersectsTriangle(sn))\n return !0;\n return !1;\n }\n });\n {\n const y = Qt(t);\n for (let w = m * 3, _ = (g + m) * 3; w < _; w += 3) {\n ve(nn, w, u, d), nn.a.applyMatrix4(Pn), nn.b.applyMatrix4(Pn), nn.c.applyMatrix4(Pn), nn.needsUpdate = !0;\n for (let x = 0, b = y * 3; x < b; x += 3)\n if (ve(sn, x, p, f), sn.needsUpdate = !0, nn.intersectsTriangle(sn))\n return !0;\n }\n }\n } else {\n const c = Ce(s), u = Pe(s, a);\n return we(c, o, ci), !!(i.intersectsBox(ci) && Ks(c, e, t, n, i) || (we(u, o, ci), i.intersectsBox(ci) && Ks(u, e, t, n, i)));\n }\n}\nconst ui = /* @__PURE__ */ new Ae(), ds = /* @__PURE__ */ new Ie(), kn = /* @__PURE__ */ new Ie(), Xf = /* @__PURE__ */ new Z(), qf = /* @__PURE__ */ new Z(), Kf = /* @__PURE__ */ new Z(), Zf = /* @__PURE__ */ new Z();\nfunction Yf(s, e, t, n = {}, i = {}, o = 0, r = 1 / 0) {\n e.boundingBox || e.computeBoundingBox(), ds.set(e.boundingBox.min, e.boundingBox.max, t), ds.needsUpdate = !0;\n const a = s.geometry, l = a.attributes.position, h = a.index, c = e.attributes.position, u = e.index, d = qe.getPrimitive(), p = qe.getPrimitive();\n let f = Xf, m = qf, g = null, y = null;\n i && (g = Kf, y = Zf);\n let w = 1 / 0, _ = null, x = null;\n return ui.copy(t).invert(), kn.matrix.copy(ui), s.shapecast(\n {\n boundsTraverseOrder: (b) => ds.distanceToBox(b),\n intersectsBounds: (b, A, M) => M < w && M < r ? (A && (kn.min.copy(b.min), kn.max.copy(b.max), kn.needsUpdate = !0), !0) : !1,\n intersectsRange: (b, A) => {\n if (e.boundsTree)\n return e.boundsTree.shapecast({\n boundsTraverseOrder: (C) => kn.distanceToBox(C),\n intersectsBounds: (C, P, k) => k < w && k < r,\n intersectsRange: (C, P) => {\n for (let k = C, B = C + P; k < B; k++) {\n ve(p, 3 * k, u, c), p.a.applyMatrix4(t), p.b.applyMatrix4(t), p.c.applyMatrix4(t), p.needsUpdate = !0;\n for (let T = b, D = b + A; T < D; T++) {\n ve(d, 3 * T, h, l), d.needsUpdate = !0;\n const v = d.distanceToTriangle(p, f, g);\n if (v < w && (m.copy(f), y && y.copy(g), w = v, _ = T, x = k), v < o)\n return !0;\n }\n }\n }\n });\n {\n const M = Qt(e);\n for (let C = 0, P = M; C < P; C++) {\n ve(p, 3 * C, u, c), p.a.applyMatrix4(t), p.b.applyMatrix4(t), p.c.applyMatrix4(t), p.needsUpdate = !0;\n for (let k = b, B = b + A; k < B; k++) {\n ve(d, 3 * k, h, l), d.needsUpdate = !0;\n const T = d.distanceToTriangle(p, f, g);\n if (T < w && (m.copy(f), y && y.copy(g), w = T, _ = k, x = C), T < o)\n return !0;\n }\n }\n }\n }\n }\n ), qe.releasePrimitive(d), qe.releasePrimitive(p), w === 1 / 0 ? null : (n.point ? n.point.copy(m) : n.point = m.clone(), n.distance = w, n.faceIndex = _, i && (i.point ? i.point.copy(y) : i.point = y.clone(), i.point.applyMatrix4(ui), m.applyMatrix4(ui), i.distance = m.sub(i.point).length(), i.faceIndex = x), n);\n}\nfunction $f(s, e = null) {\n e && Array.isArray(e) && (e = new Set(e));\n const t = s.geometry, n = t.index ? t.index.array : null, i = t.attributes.position;\n let o, r, a, l, h = 0;\n const c = s._roots;\n for (let d = 0, p = c.length; d < p; d++)\n o = c[d], r = new Uint32Array(o), a = new Uint16Array(o), l = new Float32Array(o), u(0, h), h += o.byteLength;\n function u(d, p, f = !1) {\n const m = d * 2;\n if (Me(m, a)) {\n const g = r[d + 6], y = a[m + 14];\n let w = 1 / 0, _ = 1 / 0, x = 1 / 0, b = -1 / 0, A = -1 / 0, M = -1 / 0;\n for (let C = g, P = g + y; C < P; C++) {\n const k = 3 * s.resolveTriangleIndex(C);\n for (let B = 0; B < 3; B++) {\n let T = k + B;\n T = n ? n[T] : T;\n const D = i.getX(T), v = i.getY(T), I = i.getZ(T);\n D < w && (w = D), D > b && (b = D), v < _ && (_ = v), v > A && (A = v), I < x && (x = I), I > M && (M = I);\n }\n }\n return l[d + 0] !== w || l[d + 1] !== _ || l[d + 2] !== x || l[d + 3] !== b || l[d + 4] !== A || l[d + 5] !== M ? (l[d + 0] = w, l[d + 1] = _, l[d + 2] = x, l[d + 3] = b, l[d + 4] = A, l[d + 5] = M, !0) : !1;\n } else {\n const g = Ce(d), y = Pe(d, r);\n let w = f, _ = !1, x = !1;\n if (e) {\n if (!w) {\n const k = g / Ee + p / Be, B = y / Ee + p / Be;\n _ = e.has(k), x = e.has(B), w = !_ && !x;\n }\n } else\n _ = !0, x = !0;\n const b = w || _, A = w || x;\n let M = !1;\n b && (M = u(g, p, w));\n let C = !1;\n A && (C = u(y, p, w));\n const P = M || C;\n if (P)\n for (let k = 0; k < 3; k++) {\n const B = g + k, T = y + k, D = l[B], v = l[B + 3], I = l[T], q = l[T + 3];\n l[d + k] = D < I ? D : I, l[d + k + 3] = v > q ? v : q;\n }\n return P;\n }\n }\n}\nfunction Jf(s, e, t, n, i, o, r) {\n ge.setBuffer(s._roots[e]), Zs(0, s, t, n, i, o, r), ge.clearBuffer();\n}\nfunction Zs(s, e, t, n, i, o, r) {\n const { float32Array: a, uint16Array: l, uint32Array: h } = ge, c = s * 2;\n if (Me(c, l)) {\n const d = Ve(s, h), p = Ke(c, l);\n Uf(e, t, n, d, p, i, o, r);\n } else {\n const d = Ce(s);\n Dt(d, a, n, o, r) && Zs(d, e, t, n, i, o, r);\n const p = Pe(s, h);\n Dt(p, a, n, o, r) && Zs(p, e, t, n, i, o, r);\n }\n}\nconst Qf = [\"x\", \"y\", \"z\"];\nfunction ed(s, e, t, n, i, o) {\n ge.setBuffer(s._roots[e]);\n const r = Ys(0, s, t, n, i, o);\n return ge.clearBuffer(), r;\n}\nfunction Ys(s, e, t, n, i, o) {\n const { float32Array: r, uint16Array: a, uint32Array: l } = ge;\n let h = s * 2;\n if (Me(h, a)) {\n const u = Ve(s, l), d = Ke(h, a);\n return Ff(e, t, n, u, d, i, o);\n } else {\n const u = lr(s, l), d = Qf[u], f = n.direction[d] >= 0;\n let m, g;\n f ? (m = Ce(s), g = Pe(s, l)) : (m = Pe(s, l), g = Ce(s));\n const w = Dt(m, r, n, i, o) ? Ys(m, e, t, n, i, o) : null;\n if (w) {\n const b = w.point[d];\n if (f ? b <= r[g + u] : (\n // min bounding data\n b >= r[g + u + 3]\n ))\n return w;\n }\n const x = Dt(g, r, n, i, o) ? Ys(g, e, t, n, i, o) : null;\n return w && x ? w.distance <= x.distance ? w : x : w || x || null;\n }\n}\nconst fi = /* @__PURE__ */ new nt(), rn = /* @__PURE__ */ new Ye(), on = /* @__PURE__ */ new Ye(), Rn = /* @__PURE__ */ new Ae(), ho = /* @__PURE__ */ new Ie(), di = /* @__PURE__ */ new Ie();\nfunction td(s, e, t, n) {\n ge.setBuffer(s._roots[e]);\n const i = $s(0, s, t, n);\n return ge.clearBuffer(), i;\n}\nfunction $s(s, e, t, n, i = null) {\n const { float32Array: o, uint16Array: r, uint32Array: a } = ge;\n let l = s * 2;\n if (i === null && (t.boundingBox || t.computeBoundingBox(), ho.set(t.boundingBox.min, t.boundingBox.max, n), i = ho), Me(l, r)) {\n const c = e.geometry, u = c.index, d = c.attributes.position, p = t.index, f = t.attributes.position, m = Ve(s, a), g = Ke(l, r);\n if (Rn.copy(n).invert(), t.boundsTree)\n return we(s, o, di), di.matrix.copy(Rn), di.needsUpdate = !0, t.boundsTree.shapecast({\n intersectsBounds: (w) => di.intersectsBox(w),\n intersectsTriangle: (w) => {\n w.a.applyMatrix4(n), w.b.applyMatrix4(n), w.c.applyMatrix4(n), w.needsUpdate = !0;\n for (let _ = m, x = g + m; _ < x; _++)\n if (ve(on, 3 * e.resolveTriangleIndex(_), u, d), on.needsUpdate = !0, w.intersectsTriangle(on))\n return !0;\n return !1;\n }\n });\n {\n const y = Qt(t);\n for (let w = m, _ = g + m; w < _; w++) {\n const x = e.resolveTriangleIndex(w);\n ve(rn, 3 * x, u, d), rn.a.applyMatrix4(Rn), rn.b.applyMatrix4(Rn), rn.c.applyMatrix4(Rn), rn.needsUpdate = !0;\n for (let b = 0, A = y * 3; b < A; b += 3)\n if (ve(on, b, p, f), on.needsUpdate = !0, rn.intersectsTriangle(on))\n return !0;\n }\n }\n } else {\n const c = Ce(s), u = Pe(s, a);\n return we(c, o, fi), !!(i.intersectsBox(fi) && $s(c, e, t, n, i) || (we(u, o, fi), i.intersectsBox(fi) && $s(u, e, t, n, i)));\n }\n}\nconst pi = /* @__PURE__ */ new Ae(), ps = /* @__PURE__ */ new Ie(), Dn = /* @__PURE__ */ new Ie(), nd = /* @__PURE__ */ new Z(), id = /* @__PURE__ */ new Z(), sd = /* @__PURE__ */ new Z(), rd = /* @__PURE__ */ new Z();\nfunction od(s, e, t, n = {}, i = {}, o = 0, r = 1 / 0) {\n e.boundingBox || e.computeBoundingBox(), ps.set(e.boundingBox.min, e.boundingBox.max, t), ps.needsUpdate = !0;\n const a = s.geometry, l = a.attributes.position, h = a.index, c = e.attributes.position, u = e.index, d = qe.getPrimitive(), p = qe.getPrimitive();\n let f = nd, m = id, g = null, y = null;\n i && (g = sd, y = rd);\n let w = 1 / 0, _ = null, x = null;\n return pi.copy(t).invert(), Dn.matrix.copy(pi), s.shapecast(\n {\n boundsTraverseOrder: (b) => ps.distanceToBox(b),\n intersectsBounds: (b, A, M) => M < w && M < r ? (A && (Dn.min.copy(b.min), Dn.max.copy(b.max), Dn.needsUpdate = !0), !0) : !1,\n intersectsRange: (b, A) => {\n if (e.boundsTree) {\n const M = e.boundsTree;\n return M.shapecast({\n boundsTraverseOrder: (C) => Dn.distanceToBox(C),\n intersectsBounds: (C, P, k) => k < w && k < r,\n intersectsRange: (C, P) => {\n for (let k = C, B = C + P; k < B; k++) {\n const T = M.resolveTriangleIndex(k);\n ve(p, 3 * T, u, c), p.a.applyMatrix4(t), p.b.applyMatrix4(t), p.c.applyMatrix4(t), p.needsUpdate = !0;\n for (let D = b, v = b + A; D < v; D++) {\n const I = s.resolveTriangleIndex(D);\n ve(d, 3 * I, h, l), d.needsUpdate = !0;\n const q = d.distanceToTriangle(p, f, g);\n if (q < w && (m.copy(f), y && y.copy(g), w = q, _ = D, x = k), q < o)\n return !0;\n }\n }\n }\n });\n } else {\n const M = Qt(e);\n for (let C = 0, P = M; C < P; C++) {\n ve(p, 3 * C, u, c), p.a.applyMatrix4(t), p.b.applyMatrix4(t), p.c.applyMatrix4(t), p.needsUpdate = !0;\n for (let k = b, B = b + A; k < B; k++) {\n const T = s.resolveTriangleIndex(k);\n ve(d, 3 * T, h, l), d.needsUpdate = !0;\n const D = d.distanceToTriangle(p, f, g);\n if (D < w && (m.copy(f), y && y.copy(g), w = D, _ = k, x = C), D < o)\n return !0;\n }\n }\n }\n }\n }\n ), qe.releasePrimitive(d), qe.releasePrimitive(p), w === 1 / 0 ? null : (n.point ? n.point.copy(m) : n.point = m.clone(), n.distance = w, n.faceIndex = _, i && (i.point ? i.point.copy(y) : i.point = y.clone(), i.point.applyMatrix4(pi), m.applyMatrix4(pi), i.distance = m.sub(i.point).length(), i.faceIndex = x), n);\n}\nfunction ad() {\n return typeof SharedArrayBuffer < \"u\";\n}\nconst zn = /* @__PURE__ */ new ge.constructor(), zi = /* @__PURE__ */ new ge.constructor(), At = /* @__PURE__ */ new ar(() => new nt()), an = /* @__PURE__ */ new nt(), ln = /* @__PURE__ */ new nt(), ms = /* @__PURE__ */ new nt(), gs = /* @__PURE__ */ new nt();\nlet ys = !1;\nfunction ld(s, e, t, n) {\n if (ys)\n throw new Error(\"MeshBVH: Recursive calls to bvhcast not supported.\");\n ys = !0;\n const i = s._roots, o = e._roots;\n let r, a = 0, l = 0;\n const h = new Ae().copy(t).invert();\n for (let c = 0, u = i.length; c < u; c++) {\n zn.setBuffer(i[c]), l = 0;\n const d = At.getPrimitive();\n we(0, zn.float32Array, d), d.applyMatrix4(h);\n for (let p = 0, f = o.length; p < f && (zi.setBuffer(o[p]), r = Qe(\n 0,\n 0,\n t,\n h,\n n,\n a,\n l,\n 0,\n 0,\n d\n ), zi.clearBuffer(), l += o[p].byteLength / Be, !r); p++)\n ;\n if (At.releasePrimitive(d), zn.clearBuffer(), a += i[c].byteLength / Be, r)\n break;\n }\n return ys = !1, r;\n}\nfunction Qe(s, e, t, n, i, o = 0, r = 0, a = 0, l = 0, h = null, c = !1) {\n let u, d;\n c ? (u = zi, d = zn) : (u = zn, d = zi);\n const p = u.float32Array, f = u.uint32Array, m = u.uint16Array, g = d.float32Array, y = d.uint32Array, w = d.uint16Array, _ = s * 2, x = e * 2, b = Me(_, m), A = Me(x, w);\n let M = !1;\n if (A && b)\n c ? M = i(\n Ve(e, y),\n Ke(e * 2, w),\n Ve(s, f),\n Ke(s * 2, m),\n l,\n r + e / Ee,\n a,\n o + s / Ee\n ) : M = i(\n Ve(s, f),\n Ke(s * 2, m),\n Ve(e, y),\n Ke(e * 2, w),\n a,\n o + s / Ee,\n l,\n r + e / Ee\n );\n else if (A) {\n const C = At.getPrimitive();\n we(e, g, C), C.applyMatrix4(t);\n const P = Ce(s), k = Pe(s, f);\n we(P, p, an), we(k, p, ln);\n const B = C.intersectsBox(an), T = C.intersectsBox(ln);\n M = B && Qe(\n e,\n P,\n n,\n t,\n i,\n r,\n o,\n l,\n a + 1,\n C,\n !c\n ) || T && Qe(\n e,\n k,\n n,\n t,\n i,\n r,\n o,\n l,\n a + 1,\n C,\n !c\n ), At.releasePrimitive(C);\n } else {\n const C = Ce(e), P = Pe(e, y);\n we(C, g, ms), we(P, g, gs);\n const k = h.intersectsBox(ms), B = h.intersectsBox(gs);\n if (k && B)\n M = Qe(\n s,\n C,\n t,\n n,\n i,\n o,\n r,\n a,\n l + 1,\n h,\n c\n ) || Qe(\n s,\n P,\n t,\n n,\n i,\n o,\n r,\n a,\n l + 1,\n h,\n c\n );\n else if (k)\n if (b)\n M = Qe(\n s,\n C,\n t,\n n,\n i,\n o,\n r,\n a,\n l + 1,\n h,\n c\n );\n else {\n const T = At.getPrimitive();\n T.copy(ms).applyMatrix4(t);\n const D = Ce(s), v = Pe(s, f);\n we(D, p, an), we(v, p, ln);\n const I = T.intersectsBox(an), q = T.intersectsBox(ln);\n M = I && Qe(\n C,\n D,\n n,\n t,\n i,\n r,\n o,\n l,\n a + 1,\n T,\n !c\n ) || q && Qe(\n C,\n v,\n n,\n t,\n i,\n r,\n o,\n l,\n a + 1,\n T,\n !c\n ), At.releasePrimitive(T);\n }\n else if (B)\n if (b)\n M = Qe(\n s,\n P,\n t,\n n,\n i,\n o,\n r,\n a,\n l + 1,\n h,\n c\n );\n else {\n const T = At.getPrimitive();\n T.copy(gs).applyMatrix4(t);\n const D = Ce(s), v = Pe(s, f);\n we(D, p, an), we(v, p, ln);\n const I = T.intersectsBox(an), q = T.intersectsBox(ln);\n M = I && Qe(\n P,\n D,\n n,\n t,\n i,\n r,\n o,\n l,\n a + 1,\n T,\n !c\n ) || q && Qe(\n P,\n v,\n n,\n t,\n i,\n r,\n o,\n l,\n a + 1,\n T,\n !c\n ), At.releasePrimitive(T);\n }\n }\n return M;\n}\nconst mi = /* @__PURE__ */ new Ie(), uo = /* @__PURE__ */ new nt(), cd = {\n strategy: Sa,\n maxDepth: 40,\n maxLeafTris: 10,\n useSharedArrayBuffer: !1,\n setBoundingBox: !0,\n onProgress: null,\n indirect: !1,\n verbose: !0,\n range: null\n};\nclass cr {\n static serialize(e, t = {}) {\n t = {\n cloneBuffers: !0,\n ...t\n };\n const n = e.geometry, i = e._roots, o = e._indirectBuffer, r = n.getIndex(), a = {\n version: 1,\n roots: null,\n index: null,\n indirectBuffer: null\n };\n return t.cloneBuffers ? (a.roots = i.map((l) => l.slice()), a.index = r ? r.array.slice() : null, a.indirectBuffer = o ? o.slice() : null) : (a.roots = i, a.index = r ? r.array : null, a.indirectBuffer = o), a;\n }\n static deserialize(e, t, n = {}) {\n n = {\n setIndex: !0,\n indirect: !!e.indirectBuffer,\n ...n\n };\n const { index: i, roots: o, indirectBuffer: r } = e;\n e.version || (console.warn(\n \"MeshBVH.deserialize: Serialization format has been changed and will be fixed up. It is recommended to regenerate any stored serialized data.\"\n ), l(o));\n const a = new cr(t, { ...n, [cs]: !0 });\n if (a._roots = o, a._indirectBuffer = r || null, n.setIndex) {\n const h = t.getIndex();\n if (h === null) {\n const c = new at(e.index, 1, !1);\n t.setIndex(c);\n } else h.array !== i && (h.array.set(i), h.needsUpdate = !0);\n }\n return a;\n function l(h) {\n for (let c = 0; c < h.length; c++) {\n const u = h[c], d = new Uint32Array(u), p = new Uint16Array(u);\n for (let f = 0, m = u.byteLength / Be; f < m; f++) {\n const g = Ee * f, y = 2 * g;\n Me(y, p) || (d[g + 6] = d[g + 6] / Ee - f);\n }\n }\n }\n }\n get indirect() {\n return !!this._indirectBuffer;\n }\n constructor(e, t = {}) {\n if (e.isBufferGeometry) {\n if (e.index && e.index.isInterleavedBufferAttribute)\n throw new Error(\"MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.\");\n } else throw new Error(\"MeshBVH: Only BufferGeometries are supported.\");\n if (t = Object.assign({\n ...cd,\n // undocumented options\n // Whether to skip generating the tree. Used for deserialization.\n [cs]: !1\n }, t), t.useSharedArrayBuffer && !ad())\n throw new Error(\"MeshBVH: SharedArrayBuffer is not available.\");\n this.geometry = e, this._roots = null, this._indirectBuffer = null, t[cs] || (Ef(this, t), !e.boundingBox && t.setBoundingBox && (e.boundingBox = this.getBoundingBox(new nt()))), this.resolveTriangleIndex = t.indirect ? (n) => this._indirectBuffer[n] : (n) => n;\n }\n shiftTriangleOffsets(e) {\n const t = this._indirectBuffer;\n if (t)\n for (let n = 0, i = t.length; n < i; n++)\n t[n] += e;\n else {\n const n = this._roots;\n for (let i = 0; i < n.length; i++) {\n const o = n[i], r = new Uint32Array(o), a = new Uint16Array(o), l = o.byteLength / Be;\n for (let h = 0; h < l; h++) {\n const c = Ee * h, u = 2 * c;\n Me(u, a) && (r[c + 6] += e);\n }\n }\n }\n }\n refit(e = null) {\n return (this.indirect ? $f : Of)(this, e);\n }\n traverse(e, t = 0) {\n const n = this._roots[t], i = new Uint32Array(n), o = new Uint16Array(n);\n r(0);\n function r(a, l = 0) {\n const h = a * 2, c = Me(h, o);\n if (c) {\n const u = i[a + 6], d = o[h + 14];\n e(l, c, new Float32Array(n, a * 4, 6), u, d);\n } else {\n const u = Ce(a), d = Pe(a, i), p = lr(a, i);\n e(l, c, new Float32Array(n, a * 4, 6), p) || (r(u, l + 1), r(d, l + 1));\n }\n }\n }\n /* Core Cast Functions */\n raycast(e, t = Ls, n = 0, i = 1 / 0) {\n const o = this._roots, r = [], a = this.indirect ? Jf : jf;\n for (let l = 0, h = o.length; l < h; l++)\n a(this, l, t, e, r, n, i);\n return r;\n }\n raycastFirst(e, t = Ls, n = 0, i = 1 / 0) {\n const o = this._roots;\n let r = null;\n const a = this.indirect ? ed : Gf;\n for (let l = 0, h = o.length; l < h; l++) {\n const c = a(this, l, t, e, n, i);\n c != null && (r == null || c.distance < r.distance) && (r = c);\n }\n return r;\n }\n intersectsGeometry(e, t) {\n let n = !1;\n const i = this._roots, o = this.indirect ? td : Wf;\n for (let r = 0, a = i.length; r < a && (n = o(this, r, e, t), !n); r++)\n ;\n return n;\n }\n shapecast(e) {\n const t = qe.getPrimitive(), n = this.indirect ? Vf : Nf;\n let {\n boundsTraverseOrder: i,\n intersectsBounds: o,\n intersectsRange: r,\n intersectsTriangle: a\n } = e;\n if (r && a) {\n const u = r;\n r = (d, p, f, m, g) => u(d, p, f, m, g) ? !0 : n(d, p, this, a, f, m, t);\n } else r || (a ? r = (u, d, p, f) => n(u, d, this, a, p, f, t) : r = (u, d, p) => p);\n let l = !1, h = 0;\n const c = this._roots;\n for (let u = 0, d = c.length; u < d; u++) {\n const p = c[u];\n if (l = Rf(this, u, o, r, i, h), l)\n break;\n h += p.byteLength / Be;\n }\n return qe.releasePrimitive(t), l;\n }\n bvhcast(e, t, n) {\n let {\n intersectsRanges: i,\n intersectsTriangles: o\n } = n;\n const r = qe.getPrimitive(), a = this.geometry.index, l = this.geometry.attributes.position, h = this.indirect ? (f) => {\n const m = this.resolveTriangleIndex(f);\n ve(r, m * 3, a, l);\n } : (f) => {\n ve(r, f * 3, a, l);\n }, c = qe.getPrimitive(), u = e.geometry.index, d = e.geometry.attributes.position, p = e.indirect ? (f) => {\n const m = e.resolveTriangleIndex(f);\n ve(c, m * 3, u, d);\n } : (f) => {\n ve(c, f * 3, u, d);\n };\n if (o) {\n const f = (m, g, y, w, _, x, b, A) => {\n for (let M = y, C = y + w; M < C; M++) {\n p(M), c.a.applyMatrix4(t), c.b.applyMatrix4(t), c.c.applyMatrix4(t), c.needsUpdate = !0;\n for (let P = m, k = m + g; P < k; P++)\n if (h(P), r.needsUpdate = !0, o(r, c, P, M, _, x, b, A))\n return !0;\n }\n return !1;\n };\n if (i) {\n const m = i;\n i = function(g, y, w, _, x, b, A, M) {\n return m(g, y, w, _, x, b, A, M) ? !0 : f(g, y, w, _, x, b, A, M);\n };\n } else\n i = f;\n }\n return ld(this, e, t, i);\n }\n /* Derived Cast Functions */\n intersectsBox(e, t) {\n return mi.set(e.min, e.max, t), mi.needsUpdate = !0, this.shapecast(\n {\n intersectsBounds: (n) => mi.intersectsBox(n),\n intersectsTriangle: (n) => mi.intersectsTriangle(n)\n }\n );\n }\n intersectsSphere(e) {\n return this.shapecast(\n {\n intersectsBounds: (t) => e.intersectsBox(t),\n intersectsTriangle: (t) => t.intersectsSphere(e)\n }\n );\n }\n closestPointToGeometry(e, t, n = {}, i = {}, o = 0, r = 1 / 0) {\n return (this.indirect ? od : Yf)(\n this,\n e,\n t,\n n,\n i,\n o,\n r\n );\n }\n closestPointToPoint(e, t = {}, n = 0, i = 1 / 0) {\n return Df(\n this,\n e,\n t,\n n,\n i\n );\n }\n getBoundingBox(e) {\n return e.makeEmpty(), this._roots.forEach((n) => {\n we(0, new Float32Array(n), uo), e.union(uo);\n }), e;\n }\n}\nconst Ca = 1e-6, hd = Ca * 0.5, Pa = Math.pow(10, -Math.log10(Ca)), ud = hd * Pa;\nfunction ot(s) {\n return ~~(s * Pa + ud);\n}\nfunction fd(s) {\n return `${ot(s.x)},${ot(s.y)}`;\n}\nfunction fo(s) {\n return `${ot(s.x)},${ot(s.y)},${ot(s.z)}`;\n}\nfunction dd(s) {\n return `${ot(s.x)},${ot(s.y)},${ot(s.z)},${ot(s.w)}`;\n}\nfunction pd(s, e, t) {\n t.direction.subVectors(e, s).normalize();\n const n = s.dot(t.direction);\n return t.origin.copy(s).addScaledVector(t.direction, -n), t;\n}\nfunction ka() {\n return typeof SharedArrayBuffer < \"u\";\n}\nfunction md(s) {\n if (s.buffer instanceof SharedArrayBuffer)\n return s;\n const e = s.constructor, t = s.buffer, n = new SharedArrayBuffer(t.byteLength), i = new Uint8Array(t);\n return new Uint8Array(n).set(i, 0), new e(n);\n}\nfunction gd(s, e = ArrayBuffer) {\n return s > 65535 ? new Uint32Array(new e(4 * s)) : new Uint16Array(new e(2 * s));\n}\nfunction yd(s, e) {\n if (!s.index) {\n const t = s.attributes.position.count, n = e.useSharedArrayBuffer ? SharedArrayBuffer : ArrayBuffer, i = gd(t, n);\n s.setIndex(new at(i, 1));\n for (let o = 0; o < t; o++)\n i[o] = o;\n }\n}\nfunction wd(s) {\n return s.index ? s.index.count : s.attributes.position.count;\n}\nfunction hr(s) {\n return wd(s) / 3;\n}\nconst _d = 1e-8, xd = new Z();\nfunction bd(s) {\n return ~~(s / 3);\n}\nfunction vd(s) {\n return s % 3;\n}\nfunction po(s, e) {\n return s.start - e.start;\n}\nfunction mo(s, e) {\n return xd.subVectors(e, s.origin).dot(s.direction);\n}\nfunction Sd(s, e, t, n = _d) {\n s.sort(po), e.sort(po);\n for (let a = 0; a < s.length; a++) {\n const l = s[a];\n for (let h = 0; h < e.length; h++) {\n const c = e[h];\n if (!(c.start > l.end)) {\n if (l.end < c.start || c.end < l.start)\n continue;\n if (l.start <= c.start && l.end >= c.end)\n o(c.end, l.end) || s.splice(a + 1, 0, {\n start: c.end,\n end: l.end,\n index: l.index\n }), l.end = c.start, c.start = 0, c.end = 0;\n else if (l.start >= c.start && l.end <= c.end)\n o(l.end, c.end) || e.splice(h + 1, 0, {\n start: l.end,\n end: c.end,\n index: c.index\n }), c.end = l.start, l.start = 0, l.end = 0;\n else if (l.start <= c.start && l.end <= c.end) {\n const u = l.end;\n l.end = c.start, c.start = u;\n } else if (l.start >= c.start && l.end >= c.end) {\n const u = c.end;\n c.end = l.start, l.start = u;\n } else\n throw new Error();\n }\n if (t.has(l.index) || t.set(l.index, []), t.has(c.index) || t.set(c.index, []), t.get(l.index).push(c.index), t.get(c.index).push(l.index), r(c) && (e.splice(h, 1), h--), r(l)) {\n s.splice(a, 1), a--;\n break;\n }\n }\n }\n i(s), i(e);\n function i(a) {\n for (let l = 0; l < a.length; l++)\n r(a[l]) && (a.splice(l, 1), l--);\n }\n function o(a, l) {\n return Math.abs(l - a) < n;\n }\n function r(a) {\n return Math.abs(a.end - a.start) < n;\n }\n}\nconst go = 1e-5, yo = 1e-4;\nclass Td {\n constructor() {\n this._rays = [];\n }\n addRay(e) {\n this._rays.push(e);\n }\n findClosestRay(e) {\n const t = this._rays, n = e.clone();\n n.direction.multiplyScalar(-1);\n let i = 1 / 0, o = null;\n for (let l = 0, h = t.length; l < h; l++) {\n const c = t[l];\n if (r(c, e) && r(c, n))\n continue;\n const u = a(c, e), d = a(c, n), p = Math.min(u, d);\n p < i && (i = p, o = c);\n }\n return o;\n function r(l, h) {\n const c = l.origin.distanceTo(h.origin) > go;\n return l.direction.angleTo(h.direction) > yo || c;\n }\n function a(l, h) {\n const c = l.origin.distanceTo(h.origin), u = l.direction.angleTo(h.direction);\n return c / go + u / yo;\n }\n }\n}\nconst ws = new Z(), _s = new Z(), gi = new Js();\nfunction Ed(s, e, t) {\n const n = s.attributes, i = s.index, o = n.position, r = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), l = Array.from(e), h = new Td();\n for (let c = 0, u = l.length; c < u; c++) {\n const d = l[c], p = bd(d), f = vd(d);\n let m = 3 * p + f, g = 3 * p + (f + 1) % 3;\n i && (m = i.getX(m), g = i.getX(g)), ws.fromBufferAttribute(o, m), _s.fromBufferAttribute(o, g), pd(ws, _s, gi);\n let y, w = h.findClosestRay(gi);\n w === null && (w = gi.clone(), h.addRay(w)), a.has(w) || a.set(w, {\n forward: [],\n reverse: [],\n ray: w\n }), y = a.get(w);\n let _ = mo(w, ws), x = mo(w, _s);\n _ > x && ([_, x] = [x, _]), gi.direction.dot(w.direction) < 0 ? y.reverse.push({ start: _, end: x, index: d }) : y.forward.push({ start: _, end: x, index: d });\n }\n return a.forEach(({ forward: c, reverse: u }, d) => {\n Sd(c, u, r, t), c.length === 0 && u.length === 0 && a.delete(d);\n }), {\n disjointConnectivityMap: r,\n fragmentMap: a\n };\n}\nconst Md = new ce(), xs = new Z(), Ad = new $t(), bs = [\"\", \"\", \"\"];\nclass Cd {\n constructor(e = null) {\n this.data = null, this.disjointConnections = null, this.unmatchedDisjointEdges = null, this.unmatchedEdges = -1, this.matchedEdges = -1, this.useDrawRange = !0, this.useAllAttributes = !1, this.matchDisjointEdges = !1, this.degenerateEpsilon = 1e-8, e && this.updateFrom(e);\n }\n getSiblingTriangleIndex(e, t) {\n const n = this.data[e * 3 + t];\n return n === -1 ? -1 : ~~(n / 3);\n }\n getSiblingEdgeIndex(e, t) {\n const n = this.data[e * 3 + t];\n return n === -1 ? -1 : n % 3;\n }\n getDisjointSiblingTriangleIndices(e, t) {\n const n = e * 3 + t, i = this.disjointConnections.get(n);\n return i ? i.map((o) => ~~(o / 3)) : [];\n }\n getDisjointSiblingEdgeIndices(e, t) {\n const n = e * 3 + t, i = this.disjointConnections.get(n);\n return i ? i.map((o) => o % 3) : [];\n }\n isFullyConnected() {\n return this.unmatchedEdges === 0;\n }\n updateFrom(e) {\n const { useAllAttributes: t, useDrawRange: n, matchDisjointEdges: i, degenerateEpsilon: o } = this, r = t ? _ : w, a = /* @__PURE__ */ new Map(), { attributes: l } = e, h = t ? Object.keys(l) : null, c = e.index, u = l.position;\n let d = hr(e);\n const p = d;\n let f = 0;\n n && (f = e.drawRange.start, e.drawRange.count !== 1 / 0 && (d = ~~(e.drawRange.count / 3)));\n let m = this.data;\n (!m || m.length < 3 * p) && (m = new Int32Array(3 * p)), m.fill(-1);\n let g = 0, y = /* @__PURE__ */ new Set();\n for (let x = f, b = d * 3 + f; x < b; x += 3) {\n const A = x;\n for (let M = 0; M < 3; M++) {\n let C = A + M;\n c && (C = c.getX(C)), bs[M] = r(C);\n }\n for (let M = 0; M < 3; M++) {\n const C = (M + 1) % 3, P = bs[M], k = bs[C], B = `${k}_${P}`;\n if (a.has(B)) {\n const T = A + M, D = a.get(B);\n m[T] = D, m[D] = T, a.delete(B), g += 2, y.delete(D);\n } else {\n const T = `${P}_${k}`, D = A + M;\n a.set(T, D), y.add(D);\n }\n }\n }\n if (i) {\n const {\n fragmentMap: x,\n disjointConnectivityMap: b\n } = Ed(e, y, o);\n y.clear(), x.forEach(({ forward: A, reverse: M }) => {\n A.forEach(({ index: C }) => y.add(C)), M.forEach(({ index: C }) => y.add(C));\n }), this.unmatchedDisjointEdges = x, this.disjointConnections = b, g = d * 3 - y.size;\n }\n this.matchedEdges = g, this.unmatchedEdges = y.size, this.data = m;\n function w(x) {\n return xs.fromBufferAttribute(u, x), fo(xs);\n }\n function _(x) {\n let b = \"\";\n for (let A = 0, M = h.length; A < M; A++) {\n const C = l[h[A]];\n let P;\n switch (C.itemSize) {\n case 1:\n P = ot(C.getX(x));\n break;\n case 2:\n P = fd(Md.fromBufferAttribute(C, x));\n break;\n case 3:\n P = fo(xs.fromBufferAttribute(C, x));\n break;\n case 4:\n P = dd(Ad.fromBufferAttribute(C, x));\n break;\n }\n b !== \"\" && (b += \"|\"), b += P;\n }\n return b;\n }\n }\n}\nclass Ni extends Qs {\n constructor(...e) {\n super(...e), this.isBrush = !0, this._previousMatrix = new Ae(), this._previousMatrix.elements.fill(0);\n }\n markUpdated() {\n this._previousMatrix.copy(this.matrix);\n }\n isDirty() {\n const { matrix: e, _previousMatrix: t } = this, n = e.elements, i = t.elements;\n for (let o = 0; o < 16; o++)\n if (n[o] !== i[o])\n return !0;\n return !1;\n }\n prepareGeometry() {\n const e = this.geometry, t = e.attributes, n = ka();\n if (n)\n for (const i in t) {\n const o = t[i];\n if (o.isInterleavedBufferAttribute)\n throw new Error(\"Brush: InterleavedBufferAttributes are not supported.\");\n o.array = md(o.array);\n }\n if (e.boundsTree || (yd(e, { useSharedArrayBuffer: n }), e.boundsTree = new cr(e, { maxLeafTris: 3, indirect: !0, useSharedArrayBuffer: n })), e.halfEdges || (e.halfEdges = new Cd(e)), !e.groupIndices) {\n const i = hr(e), o = new Uint16Array(i), r = e.groups;\n for (let a = 0, l = r.length; a < l; a++) {\n const { start: h, count: c } = r[a];\n for (let u = h / 3, d = (h + c) / 3; u < d; u++)\n o[u] = a;\n }\n e.groupIndices = o;\n }\n }\n disposeCacheData() {\n const { geometry: e } = this;\n e.halfEdges = null, e.boundsTree = null, e.groupIndices = null;\n }\n}\nconst Pd = 1e-14, vs = new Z(), wo = new Z(), _o = new Z();\nfunction Ct(s, e = Pd) {\n vs.subVectors(s.b, s.a), wo.subVectors(s.c, s.a), _o.subVectors(s.b, s.c);\n const t = vs.angleTo(wo), n = vs.angleTo(_o), i = Math.PI - t - n;\n return Math.abs(t) < e || Math.abs(n) < e || Math.abs(i) < e || s.a.distanceToSquared(s.b) < e || s.a.distanceToSquared(s.c) < e || s.b.distanceToSquared(s.c) < e;\n}\nconst Ss = 1e-10, Ln = 1e-10, kd = 1e-10, ut = new Ze(), xe = new Ze(), ft = new Z(), Ts = new Z(), xo = new Z(), yi = new Ui(), Es = new Ye();\nclass Rd {\n constructor() {\n this._pool = [], this._index = 0;\n }\n getTriangle() {\n return this._index >= this._pool.length && this._pool.push(new Oe()), this._pool[this._index++];\n }\n clear() {\n this._index = 0;\n }\n reset() {\n this._pool.length = 0, this._index = 0;\n }\n}\nclass Dd {\n constructor() {\n this.trianglePool = new Rd(), this.triangles = [], this.normal = new Z(), this.coplanarTriangleUsed = !1;\n }\n // initialize the class with a triangle\n initialize(e) {\n this.reset();\n const { triangles: t, trianglePool: n, normal: i } = this;\n if (Array.isArray(e))\n for (let o = 0, r = e.length; o < r; o++) {\n const a = e[o];\n if (o === 0)\n a.getNormal(i);\n else if (Math.abs(1 - a.getNormal(ft).dot(i)) > Ss)\n throw new Error(\"Triangle Splitter: Cannot initialize with triangles that have different normals.\");\n const l = n.getTriangle();\n l.copy(a), t.push(l);\n }\n else {\n e.getNormal(i);\n const o = n.getTriangle();\n o.copy(e), t.push(o);\n }\n }\n // Split the current set of triangles by passing a single triangle in. If the triangle is\n // coplanar it will attempt to split by the triangle edge planes\n splitByTriangle(e) {\n const { normal: t, triangles: n } = this;\n if (e.getNormal(Ts).normalize(), Math.abs(1 - Math.abs(Ts.dot(t))) < kd) {\n this.coplanarTriangleUsed = !0;\n for (let o = 0, r = n.length; o < r; o++) {\n const a = n[o];\n a.coplanarCount = 0;\n }\n const i = [e.a, e.b, e.c];\n for (let o = 0; o < 3; o++) {\n const r = (o + 1) % 3, a = i[o], l = i[r];\n ft.subVectors(l, a).normalize(), xo.crossVectors(Ts, ft), yi.setFromNormalAndCoplanarPoint(xo, a), this.splitByPlane(yi, e);\n }\n } else\n e.getPlane(yi), this.splitByPlane(yi, e);\n }\n // Split the triangles by the given plan. If a triangle is provided then we ensure we\n // intersect the triangle before splitting the plane\n splitByPlane(e, t) {\n const { triangles: n, trianglePool: i } = this;\n Es.copy(t), Es.needsUpdate = !0;\n for (let o = 0, r = n.length; o < r; o++) {\n const a = n[o];\n if (!Es.intersectsTriangle(a, ut, !0))\n continue;\n const { a: l, b: h, c } = a;\n let u = 0, d = -1, p = !1, f = [], m = [];\n const g = [l, h, c];\n for (let y = 0; y < 3; y++) {\n const w = (y + 1) % 3;\n ut.start.copy(g[y]), ut.end.copy(g[w]);\n const _ = e.distanceToPoint(ut.start), x = e.distanceToPoint(ut.end);\n if (Math.abs(_) < Ln && Math.abs(x) < Ln) {\n p = !0;\n break;\n }\n if (_ > 0 ? f.push(y) : m.push(y), Math.abs(_) < Ln)\n continue;\n let b = !!e.intersectLine(ut, ft);\n !b && Math.abs(x) < Ln && (ft.copy(ut.end), b = !0), b && !(ft.distanceTo(ut.start) < Ss) && (ft.distanceTo(ut.end) < Ss && (d = y), u === 0 ? xe.start.copy(ft) : xe.end.copy(ft), u++);\n }\n if (!p && u === 2 && xe.distance() > Ln)\n if (d !== -1) {\n d = (d + 1) % 3;\n let y = 0;\n y === d && (y = (y + 1) % 3);\n let w = y + 1;\n w === d && (w = (w + 1) % 3);\n const _ = i.getTriangle();\n _.a.copy(g[w]), _.b.copy(xe.end), _.c.copy(xe.start), Ct(_) || n.push(_), a.a.copy(g[y]), a.b.copy(xe.start), a.c.copy(xe.end), Ct(a) && (n.splice(o, 1), o--, r--);\n } else {\n const y = f.length >= 2 ? m[0] : f[0];\n if (y === 0) {\n let A = xe.start;\n xe.start = xe.end, xe.end = A;\n }\n const w = (y + 1) % 3, _ = (y + 2) % 3, x = i.getTriangle(), b = i.getTriangle();\n g[w].distanceToSquared(xe.start) < g[_].distanceToSquared(xe.end) ? (x.a.copy(g[w]), x.b.copy(xe.start), x.c.copy(xe.end), b.a.copy(g[w]), b.b.copy(g[_]), b.c.copy(xe.start)) : (x.a.copy(g[_]), x.b.copy(xe.start), x.c.copy(xe.end), b.a.copy(g[w]), b.b.copy(g[_]), b.c.copy(xe.end)), a.a.copy(g[y]), a.b.copy(xe.end), a.c.copy(xe.start), Ct(x) || n.push(x), Ct(b) || n.push(b), Ct(a) && (n.splice(o, 1), o--, r--);\n }\n else u === 3 && console.warn(\"TriangleClipper: Coplanar clip not handled\");\n }\n }\n reset() {\n this.triangles.length = 0, this.trianglePool.clear(), this.coplanarTriangleUsed = !1;\n }\n}\nfunction Ld(s) {\n return s = ~~s, s + 4 - s % 4;\n}\nclass bo {\n constructor(e, t = 500) {\n this.expansionFactor = 1.5, this.type = e, this.length = 0, this.array = null, this.setSize(t);\n }\n setType(e) {\n if (this.length !== 0)\n throw new Error(\"TypeBackedArray: Cannot change the type while there is used data in the buffer.\");\n const t = this.array.buffer;\n this.array = new e(t), this.type = e;\n }\n setSize(e) {\n if (this.array && e === this.array.length)\n return;\n const t = this.type, n = ka() ? SharedArrayBuffer : ArrayBuffer, i = new t(new n(Ld(e * t.BYTES_PER_ELEMENT)));\n this.array && i.set(this.array, 0), this.array = i;\n }\n expand() {\n const { array: e, expansionFactor: t } = this;\n this.setSize(e.length * t);\n }\n push(...e) {\n let { array: t, length: n } = this;\n n + e.length > t.length && (this.expand(), t = this.array);\n for (let i = 0, o = e.length; i < o; i++)\n t[n + i] = e[i];\n this.length += e.length;\n }\n clear() {\n this.length = 0;\n }\n}\nclass Bd {\n constructor() {\n this.groupAttributes = [{}], this.groupCount = 0;\n }\n // returns the buffer type for the given attribute\n getType(e) {\n return this.groupAttributes[0][e].type;\n }\n getItemSize(e) {\n return this.groupAttributes[0][e].itemSize;\n }\n getNormalized(e) {\n return this.groupAttributes[0][e].normalized;\n }\n getCount(e) {\n if (this.groupCount <= e)\n return 0;\n const t = this.getGroupAttrArray(\"position\", e);\n return t.length / t.itemSize;\n }\n // returns the total length required for all groups for the given attribute\n getTotalLength(e) {\n const { groupCount: t, groupAttributes: n } = this;\n let i = 0;\n for (let o = 0; o < t; o++) {\n const r = n[o];\n i += r[e].length;\n }\n return i;\n }\n getGroupAttrSet(e = 0) {\n const { groupAttributes: t } = this;\n if (t[e])\n return this.groupCount = Math.max(this.groupCount, e + 1), t[e];\n const n = t[0];\n for (this.groupCount = Math.max(this.groupCount, e + 1); e >= t.length; ) {\n const i = {};\n t.push(i);\n for (const o in n) {\n const r = n[o], a = new bo(r.type);\n a.itemSize = r.itemSize, a.normalized = r.normalized, i[o] = a;\n }\n }\n return t[e];\n }\n // Get the raw array for the group set of data\n getGroupAttrArray(e, t = 0) {\n const { groupAttributes: n } = this;\n if (!n[0][e])\n throw new Error(`TypedAttributeData: Attribute with \"${e}\" has not been initialized`);\n return this.getGroupAttrSet(t)[e];\n }\n // initializes an attribute array with the given name, type, and size\n initializeArray(e, t, n, i) {\n const { groupAttributes: o } = this, a = o[0][e];\n if (a) {\n if (a.type !== t)\n for (let l = 0, h = o.length; l < h; l++) {\n const c = o[l][e];\n c.setType(t), c.itemSize = n, c.normalized = i;\n }\n } else\n for (let l = 0, h = o.length; l < h; l++) {\n const c = new bo(t);\n c.itemSize = n, c.normalized = i, o[l][e] = c;\n }\n }\n // Clear all the data\n clear() {\n this.groupCount = 0;\n const { groupAttributes: e } = this;\n e.forEach((t) => {\n for (const n in t)\n t[n].clear();\n });\n }\n // Remove the given key\n delete(e) {\n this.groupAttributes.forEach((t) => {\n delete t[e];\n });\n }\n // Reset the datasets completely\n reset() {\n this.groupAttributes = [], this.groupCount = 0;\n }\n}\nclass vo {\n constructor() {\n this.intersectionSet = {}, this.ids = [];\n }\n add(e, t) {\n const { intersectionSet: n, ids: i } = this;\n n[e] || (n[e] = [], i.push(e)), n[e].push(t);\n }\n}\nconst Id = 0, zd = 1, Nd = 2, Ra = 3, Od = 4, Da = 5, La = 6, Xe = new Js(), So = new Ae(), Le = new Oe(), dt = new Z(), To = new $t(), Eo = new $t(), Mo = new $t(), Ms = new $t(), wi = new $t(), _i = new $t(), Ao = new Ze(), As = new Z(), Cs = 1e-8, Ud = 1e-15, Ht = -1, Gt = 1, Ci = -2, Pi = 2, Nn = 0, Vt = 1, ur = 2, Fd = 1e-14;\nlet ki = null;\nfunction Co(s) {\n ki = s;\n}\nfunction Ba(s, e) {\n s.getMidpoint(Xe.origin), s.getNormal(Xe.direction);\n const t = e.raycastFirst(Xe, Vi);\n return !!(t && Xe.direction.dot(t.face.normal) > 0) ? Ht : Gt;\n}\nfunction Vd(s, e) {\n function t() {\n return Math.random() - 0.5;\n }\n s.getNormal(As), Xe.direction.copy(As), s.getMidpoint(Xe.origin);\n const n = 3;\n let i = 0, o = 1 / 0;\n for (let r = 0; r < n; r++) {\n Xe.direction.x += t() * Cs, Xe.direction.y += t() * Cs, Xe.direction.z += t() * Cs, Xe.direction.multiplyScalar(-1);\n const a = e.raycastFirst(Xe, Vi);\n if (!!(a && Xe.direction.dot(a.face.normal) > 0) && i++, a !== null && (o = Math.min(o, a.distance)), o <= Ud)\n return a.face.normal.dot(As) > 0 ? Pi : Ci;\n if (i / n > 0.5 || (r - i + 1) / n > 0.5)\n break;\n }\n return i / n > 0.5 ? Ht : Gt;\n}\nfunction jd(s, e) {\n const t = new vo(), n = new vo();\n return So.copy(s.matrixWorld).invert().multiply(e.matrixWorld), s.geometry.boundsTree.bvhcast(e.geometry.boundsTree, So, {\n intersectsTriangles(i, o, r, a) {\n if (!Ct(i) && !Ct(o)) {\n let l = i.intersectsTriangle(o, Ao, !0);\n if (!l) {\n const h = i.plane, c = o.plane, u = h.normal, d = c.normal;\n u.dot(d) === 1 && Math.abs(h.constant - c.constant) < Fd && (l = !0);\n }\n if (l) {\n let h = s.geometry.boundsTree.resolveTriangleIndex(r), c = e.geometry.boundsTree.resolveTriangleIndex(a);\n t.add(h, c), n.add(c, h), ki && (ki.addEdge(Ao), ki.addIntersectingTriangles(r, i, a, o));\n }\n }\n return !1;\n }\n }), { aIntersections: t, bIntersections: n };\n}\nfunction Hd(s, e, t, n, i, o, r = !1) {\n const a = t.attributes, l = t.index, h = s * 3, c = l.getX(h + 0), u = l.getX(h + 1), d = l.getX(h + 2);\n for (const p in o) {\n const f = a[p], m = o[p];\n if (!(p in a))\n throw new Error(`CSG Operations: Attribute ${p} not available on geometry.`);\n const g = f.itemSize;\n p === \"position\" ? (Le.a.fromBufferAttribute(f, c).applyMatrix4(n), Le.b.fromBufferAttribute(f, u).applyMatrix4(n), Le.c.fromBufferAttribute(f, d).applyMatrix4(n), Ps(Le.a, Le.b, Le.c, e, 3, m, r)) : p === \"normal\" ? (Le.a.fromBufferAttribute(f, c).applyNormalMatrix(i), Le.b.fromBufferAttribute(f, u).applyNormalMatrix(i), Le.c.fromBufferAttribute(f, d).applyNormalMatrix(i), r && (Le.a.multiplyScalar(-1), Le.b.multiplyScalar(-1), Le.c.multiplyScalar(-1)), Ps(Le.a, Le.b, Le.c, e, 3, m, r, !0)) : (To.fromBufferAttribute(f, c), Eo.fromBufferAttribute(f, u), Mo.fromBufferAttribute(f, d), Ps(To, Eo, Mo, e, g, m, r));\n }\n}\nfunction Gd(s, e, t, n, i, o, r, a = !1) {\n ks(s, n, i, o, r, a), ks(a ? t : e, n, i, o, r, a), ks(a ? e : t, n, i, o, r, a);\n}\nfunction Ia(s, e, t = !1) {\n switch (s) {\n case Id:\n if (e === Gt || e === Pi && !t)\n return Vt;\n break;\n case zd:\n if (t) {\n if (e === Ht)\n return Nn;\n } else if (e === Gt || e === Ci)\n return Vt;\n break;\n case Nd:\n if (t) {\n if (e === Gt || e === Ci)\n return Vt;\n } else if (e === Ht)\n return Nn;\n break;\n case Od:\n if (e === Ht)\n return Nn;\n if (e === Gt)\n return Vt;\n break;\n case Ra:\n if (e === Ht || e === Pi && !t)\n return Vt;\n break;\n case Da:\n if (!t && (e === Gt || e === Ci))\n return Vt;\n break;\n case La:\n if (!t && (e === Ht || e === Pi))\n return Vt;\n break;\n default:\n throw new Error(`Unrecognized CSG operation enum \"${s}\".`);\n }\n return ur;\n}\nfunction Ps(s, e, t, n, i, o, r = !1, a = !1) {\n const l = (h) => {\n o.push(h.x), i > 1 && o.push(h.y), i > 2 && o.push(h.z), i > 3 && o.push(h.w);\n };\n Ms.set(0, 0, 0, 0).addScaledVector(s, n.a.x).addScaledVector(e, n.a.y).addScaledVector(t, n.a.z), wi.set(0, 0, 0, 0).addScaledVector(s, n.b.x).addScaledVector(e, n.b.y).addScaledVector(t, n.b.z), _i.set(0, 0, 0, 0).addScaledVector(s, n.c.x).addScaledVector(e, n.c.y).addScaledVector(t, n.c.z), a && (Ms.normalize(), wi.normalize(), _i.normalize()), l(Ms), r ? (l(_i), l(wi)) : (l(wi), l(_i));\n}\nfunction ks(s, e, t, n, i, o = !1) {\n for (const r in i) {\n const a = e[r], l = i[r];\n if (!(r in e))\n throw new Error(`CSG Operations: Attribute ${r} no available on geometry.`);\n const h = a.itemSize;\n r === \"position\" ? (dt.fromBufferAttribute(a, s).applyMatrix4(t), l.push(dt.x, dt.y, dt.z)) : r === \"normal\" ? (dt.fromBufferAttribute(a, s).applyNormalMatrix(n), o && dt.multiplyScalar(-1), l.push(dt.x, dt.y, dt.z)) : (l.push(a.getX(s)), h > 1 && l.push(a.getY(s)), h > 2 && l.push(a.getZ(s)), h > 3 && l.push(a.getW(s)));\n }\n}\nclass Wd {\n constructor(e) {\n this.triangle = new Oe().copy(e), this.intersects = {};\n }\n addTriangle(e, t) {\n this.intersects[e] = new Oe().copy(t);\n }\n getIntersectArray() {\n const e = [], { intersects: t } = this;\n for (const n in t)\n e.push(t[n]);\n return e;\n }\n}\nclass Po {\n constructor() {\n this.data = {};\n }\n addTriangleIntersection(e, t, n, i) {\n const { data: o } = this;\n o[e] || (o[e] = new Wd(t)), o[e].addTriangle(n, i);\n }\n getTrianglesAsArray(e = null) {\n const { data: t } = this, n = [];\n if (e !== null)\n e in t && n.push(t[e].triangle);\n else\n for (const i in t)\n n.push(t[i].triangle);\n return n;\n }\n getTriangleIndices() {\n return Object.keys(this.data).map((e) => parseInt(e));\n }\n getIntersectionIndices(e) {\n const { data: t } = this;\n return t[e] ? Object.keys(t[e].intersects).map((n) => parseInt(n)) : [];\n }\n getIntersectionsAsArray(e = null, t = null) {\n const { data: n } = this, i = /* @__PURE__ */ new Set(), o = [], r = (a) => {\n if (n[a])\n if (t !== null)\n n[a].intersects[t] && o.push(n[a].intersects[t]);\n else {\n const l = n[a].intersects;\n for (const h in l)\n i.has(h) || (i.add(h), o.push(l[h]));\n }\n };\n if (e !== null)\n r(e);\n else\n for (const a in n)\n r(a);\n return o;\n }\n reset() {\n this.data = {};\n }\n}\nclass Xd {\n constructor() {\n this.enabled = !1, this.triangleIntersectsA = new Po(), this.triangleIntersectsB = new Po(), this.intersectionEdges = [];\n }\n addIntersectingTriangles(e, t, n, i) {\n const { triangleIntersectsA: o, triangleIntersectsB: r } = this;\n o.addTriangleIntersection(e, t, n, i), r.addTriangleIntersection(n, i, e, t);\n }\n addEdge(e) {\n this.intersectionEdges.push(e.clone());\n }\n reset() {\n this.triangleIntersectsA.reset(), this.triangleIntersectsB.reset(), this.intersectionEdges = [];\n }\n init() {\n this.enabled && (this.reset(), Co(this));\n }\n complete() {\n this.enabled && Co(null);\n }\n}\nconst kt = new Ae(), Oi = new Rl(), jt = new Oe(), xi = new Oe(), Mt = new Oe(), bi = new Oe(), tt = [], Kt = [];\nfunction qd(s) {\n for (const e of s) return e;\n}\nfunction Kd(s, e, t, n, i, o = {}) {\n const { useGroups: r = !0 } = o, { aIntersections: a, bIntersections: l } = jd(s, e), h = [];\n let c = null, u;\n return u = r ? 0 : -1, ko(s, e, a, t, !1, n, i, u), Ro(s, e, a, t, !1, i, u), t.findIndex((p) => p !== La && p !== Da) !== -1 && (u = r ? s.geometry.groups.length || 1 : -1, ko(e, s, l, t, !0, n, i, u), Ro(e, s, l, t, !0, i, u)), tt.length = 0, Kt.length = 0, {\n groups: h,\n materials: c\n };\n}\nfunction ko(s, e, t, n, i, o, r, a = 0) {\n const l = s.matrixWorld.determinant() < 0;\n kt.copy(e.matrixWorld).invert().multiply(s.matrixWorld), Oi.getNormalMatrix(s.matrixWorld).multiplyScalar(l ? -1 : 1);\n const h = s.geometry.groupIndices, c = s.geometry.index, u = s.geometry.attributes.position, d = e.geometry.boundsTree, p = e.geometry.index, f = e.geometry.attributes.position, m = t.ids, g = t.intersectionSet;\n for (let y = 0, w = m.length; y < w; y++) {\n const _ = m[y], x = a === -1 ? 0 : h[_] + a, b = 3 * _, A = c.getX(b + 0), M = c.getX(b + 1), C = c.getX(b + 2);\n jt.a.fromBufferAttribute(u, A).applyMatrix4(kt), jt.b.fromBufferAttribute(u, M).applyMatrix4(kt), jt.c.fromBufferAttribute(u, C).applyMatrix4(kt), o.reset(), o.initialize(jt);\n const P = g[_];\n for (let B = 0, T = P.length; B < T; B++) {\n const D = 3 * P[B], v = p.getX(D + 0), I = p.getX(D + 1), q = p.getX(D + 2);\n xi.a.fromBufferAttribute(f, v), xi.b.fromBufferAttribute(f, I), xi.c.fromBufferAttribute(f, q), o.splitByTriangle(xi);\n }\n const k = o.triangles;\n for (let B = 0, T = k.length; B < T; B++) {\n const D = k[B], v = o.coplanarTriangleUsed ? Vd(D, d) : Ba(D, d);\n tt.length = 0, Kt.length = 0;\n for (let I = 0, q = n.length; I < q; I++) {\n const H = Ia(n[I], v, i);\n H !== ur && (Kt.push(H), tt.push(r[I].getGroupAttrSet(x)));\n }\n if (tt.length !== 0) {\n jt.getBarycoord(D.a, bi.a), jt.getBarycoord(D.b, bi.b), jt.getBarycoord(D.c, bi.c);\n for (let I = 0, q = tt.length; I < q; I++) {\n const H = tt[I], j = Kt[I] === Nn;\n Hd(_, bi, s.geometry, s.matrixWorld, Oi, H, l !== j);\n }\n }\n }\n }\n return m.length;\n}\nfunction Ro(s, e, t, n, i, o, r = 0) {\n const a = s.matrixWorld.determinant() < 0;\n kt.copy(e.matrixWorld).invert().multiply(s.matrixWorld), Oi.getNormalMatrix(s.matrixWorld).multiplyScalar(a ? -1 : 1);\n const l = e.geometry.boundsTree, h = s.geometry.groupIndices, c = s.geometry.index, u = s.geometry.attributes, d = u.position, p = [], f = s.geometry.halfEdges, m = /* @__PURE__ */ new Set(), g = hr(s.geometry);\n for (let y = 0, w = g; y < w; y++)\n y in t.intersectionSet || m.add(y);\n for (; m.size > 0; ) {\n const y = qd(m);\n m.delete(y), p.push(y);\n const w = 3 * y, _ = c.getX(w + 0), x = c.getX(w + 1), b = c.getX(w + 2);\n Mt.a.fromBufferAttribute(d, _).applyMatrix4(kt), Mt.b.fromBufferAttribute(d, x).applyMatrix4(kt), Mt.c.fromBufferAttribute(d, b).applyMatrix4(kt);\n const A = Ba(Mt, l);\n Kt.length = 0, tt.length = 0;\n for (let M = 0, C = n.length; M < C; M++) {\n const P = Ia(n[M], A, i);\n P !== ur && (Kt.push(P), tt.push(o[M]));\n }\n for (; p.length > 0; ) {\n const M = p.pop();\n for (let C = 0; C < 3; C++) {\n const P = f.getSiblingTriangleIndex(M, C);\n P !== -1 && m.has(P) && (p.push(P), m.delete(P));\n }\n if (tt.length !== 0) {\n const C = 3 * M, P = c.getX(C + 0), k = c.getX(C + 1), B = c.getX(C + 2), T = r === -1 ? 0 : h[M] + r;\n if (Mt.a.fromBufferAttribute(d, P), Mt.b.fromBufferAttribute(d, k), Mt.c.fromBufferAttribute(d, B), !Ct(Mt))\n for (let D = 0, v = tt.length; D < v; D++) {\n const I = Kt[D], q = tt[D].getGroupAttrSet(T), H = I === Nn;\n Gd(P, k, B, u, s.matrixWorld, Oi, q, H !== a);\n }\n }\n }\n }\n}\nfunction Zd(s) {\n for (let e = 0; e < s.length - 1; e++) {\n const t = s[e], n = s[e + 1];\n if (t.materialIndex === n.materialIndex) {\n const i = t.start, o = n.start + n.count;\n n.start = i, n.count = o - i, s.splice(e, 1), e--;\n }\n }\n}\nfunction Yd(s, e, t, n) {\n t.clear();\n const i = s.attributes;\n for (let o = 0, r = n.length; o < r; o++) {\n const a = n[o], l = i[a];\n t.initializeArray(a, l.array.constructor, l.itemSize, l.normalized);\n }\n for (const o in t.attributes)\n n.includes(o) || t.delete(o);\n for (const o in e.attributes)\n n.includes(o) || (e.deleteAttribute(o), e.dispose());\n}\nfunction $d(s, e, t) {\n let n = !1, i = -1;\n const o = s.attributes, r = e.groupAttributes[0];\n for (const l in r) {\n const h = e.getTotalLength(l), c = e.getType(l), u = e.getItemSize(l), d = e.getNormalized(l);\n let p = o[l];\n (!p || p.array.length < h) && (p = new at(new c(h), u, d), s.setAttribute(l, p), n = !0);\n let f = 0;\n for (let m = 0, g = Math.min(t.length, e.groupCount); m < g; m++) {\n const y = t[m].index, { array: w, type: _, length: x } = e.groupAttributes[y][l], b = new _(w.buffer, 0, x);\n p.array.set(b, f), f += b.length;\n }\n p.needsUpdate = !0, i = h / p.itemSize;\n }\n if (s.index) {\n const l = s.index.array;\n if (l.length < i)\n s.index = null, n = !0;\n else\n for (let h = 0, c = l.length; h < c; h++)\n l[h] = h;\n }\n let a = 0;\n s.clearGroups();\n for (let l = 0, h = Math.min(t.length, e.groupCount); l < h; l++) {\n const { index: c, materialIndex: u } = t[l], d = e.getCount(c);\n d !== 0 && (s.addGroup(a, d, u), a += d);\n }\n s.setDrawRange(0, i), s.boundsTree = null, n && s.dispose();\n}\nfunction Do(s, e) {\n let t = e;\n return Array.isArray(e) || (t = [], s.forEach((n) => {\n t[n.materialIndex] = e;\n })), t;\n}\nclass Jd {\n constructor() {\n this.triangleSplitter = new Dd(), this.attributeData = [], this.attributes = [\"position\", \"uv\", \"normal\"], this.useGroups = !0, this.consolidateGroups = !0, this.debug = new Xd();\n }\n getGroupRanges(e) {\n return !this.useGroups || e.groups.length === 0 ? [{ start: 0, count: 1 / 0, materialIndex: 0 }] : e.groups.map((t) => ({ ...t }));\n }\n evaluate(e, t, n, i = new Ni()) {\n let o = !0;\n if (Array.isArray(n) || (n = [n]), Array.isArray(i) || (i = [i], o = !1), i.length !== n.length)\n throw new Error(\"Evaluator: operations and target array passed as different sizes.\");\n e.prepareGeometry(), t.prepareGeometry();\n const {\n triangleSplitter: r,\n attributeData: a,\n attributes: l,\n useGroups: h,\n consolidateGroups: c,\n debug: u\n } = this;\n for (; a.length < i.length; )\n a.push(new Bd());\n i.forEach((y, w) => {\n Yd(e.geometry, y.geometry, a[w], l);\n }), u.init(), Kd(e, t, n, r, a, { useGroups: h }), u.complete();\n const d = this.getGroupRanges(e.geometry), p = Do(d, e.material), f = this.getGroupRanges(t.geometry), m = Do(f, t.material);\n f.forEach((y) => y.materialIndex += p.length);\n let g = [...d, ...f].map((y, w) => ({ ...y, index: w }));\n if (h) {\n const y = [...p, ...m];\n c && (g = g.map((_) => {\n const x = y[_.materialIndex];\n return _.materialIndex = y.indexOf(x), _;\n }).sort((_, x) => _.materialIndex - x.materialIndex));\n const w = [];\n for (let _ = 0, x = y.length; _ < x; _++) {\n let b = !1;\n for (let A = 0, M = g.length; A < M; A++) {\n const C = g[A];\n C.materialIndex === _ && (b = !0, C.materialIndex = w.length);\n }\n b && w.push(y[_]);\n }\n i.forEach((_) => {\n _.material = w;\n });\n } else\n g = [{ start: 0, count: 1 / 0, index: 0, materialIndex: 0 }], i.forEach((y) => {\n y.material = p[0];\n });\n return i.forEach((y, w) => {\n const _ = y.geometry;\n $d(_, a[w], g), c && Zd(_.groups);\n }), o ? i : i[0];\n }\n // TODO: fix\n evaluateHierarchy(e, t = new Ni()) {\n e.updateMatrixWorld(!0);\n const n = (o, r) => {\n const a = o.children;\n for (let l = 0, h = a.length; l < h; l++) {\n const c = a[l];\n c.isOperationGroup ? n(c, r) : r(c);\n }\n }, i = (o) => {\n const r = o.children;\n let a = !1;\n for (let h = 0, c = r.length; h < c; h++) {\n const u = r[h];\n a = i(u) || a;\n }\n const l = o.isDirty();\n if (l && o.markUpdated(), a && !o.isOperationGroup) {\n let h;\n return n(o, (c) => {\n h ? h = this.evaluate(h, c, c.operation) : h = this.evaluate(o, c, c.operation);\n }), o._cachedGeometry = h.geometry, o._cachedMaterials = h.material, !0;\n } else\n return a || l;\n };\n return i(e), t.geometry = e._cachedGeometry, t.material = e._cachedMaterials, t;\n }\n reset() {\n this.triangleSplitter.reset();\n }\n}\nclass za {\n engine;\n planeObjects = [];\n planes = [];\n isActive = !1;\n evaluator;\n // 缓存相关\n geometryCache = /* @__PURE__ */ new Map();\n sectionMeshes = /* @__PURE__ */ new Map();\n planeGroup;\n planeSize = 1e3;\n sourceMeshes = /* @__PURE__ */ new Map();\n // 使用 Map 存储源网格\n planeThickness = 0.01;\n // 剖切平面盒子的厚度\n // 性能优化参数\n updateThrottleTime = 100;\n // 节流时间(ms)\n lastUpdateTime = 0;\n pendingUpdate = !1;\n updateTimer = null;\n // 缓存过期时间\n cacheExpireTime = 3e4;\n // 30秒\n // 平面变化检测\n planeStates = /* @__PURE__ */ new Map();\n constructor(e, t = {}) {\n this.engine = e, this.evaluator = new Jd(), this.planeGroup = new E.Group(), this.planeGroup.name = \"CSG_ClippingPlanes_Optimized\", t.updateThrottleTime !== void 0 && (this.updateThrottleTime = t.updateThrottleTime), t.cacheExpireTime !== void 0 && (this.cacheExpireTime = t.cacheExpireTime), t.planeThickness !== void 0 && (this.planeThickness = t.planeThickness), this.evaluator.attributes = [\"position\", \"normal\"], this.evaluator.useGroups = !1;\n }\n /**\n * 初始化剖切补面系统\n */\n init() {\n this.calculateSceneSize(), this.engine.scene.add(this.planeGroup), this.planes.forEach((e, t) => {\n const n = this.createEmptySectionMesh(e, t);\n this.planeGroup.add(n), this.sectionMeshes.set(`plane_${t}`, n), this.planeObjects.push(n), this.planeStates.set(t, {\n constant: e.constant,\n normal: e.normal.clone()\n });\n });\n }\n /**\n * 创建空的剖切补面网格\n */\n createEmptySectionMesh(e, t) {\n const n = new E.BufferGeometry(), i = new E.MeshStandardMaterial({\n color: new E.Color(33023),\n metalness: 0.1,\n roughness: 0.75,\n side: E.DoubleSide,\n depthWrite: !0,\n depthTest: !0,\n clippingPlanes: this.planes.filter((r, a) => a !== t)\n }), o = new E.Mesh(n, i);\n return o.name = `CSG_Section_Optimized_${t}`, o.visible = !1, o.renderOrder = t + 1, o;\n }\n /**\n * 激活剖切补面\n */\n active() {\n this.isActive = !0, this.requestUpdate(), this.planeObjects.forEach((e) => {\n e.visible = !0;\n });\n }\n /**\n * 停用剖切补面\n */\n disActive() {\n this.isActive = !1, this.planeObjects.forEach((e) => {\n e.visible = !1;\n }), this.updateTimer && (clearTimeout(this.updateTimer), this.updateTimer = null);\n }\n /**\n * 设置需要剖切的源网格\n */\n setSourceMeshes(e) {\n this.sourceMeshes.clear(), e.forEach((t) => {\n const n = t.uuid;\n this.sourceMeshes.set(n, t);\n }), this.isActive && this.requestUpdate();\n }\n /**\n * 添加单个源网格\n */\n addSourceMesh(e) {\n const t = e.uuid;\n this.sourceMeshes.has(t) || (this.sourceMeshes.set(t, e), this.isActive && this.requestUpdate());\n }\n /**\n * 移除源网格\n */\n removeSourceMesh(e) {\n const t = e.uuid;\n this.sourceMeshes.delete(t) && (this.clearMeshCache(t), this.isActive && this.requestUpdate());\n }\n /**\n * 请求更新(带节流)\n */\n requestUpdate() {\n if (!this.isActive) return;\n const e = Date.now(), t = e - this.lastUpdateTime;\n t >= this.updateThrottleTime ? (this.lastUpdateTime = e, this.pendingUpdate = !1) : (this.pendingUpdate = !0, this.updateTimer && clearTimeout(this.updateTimer), this.updateTimer = setTimeout(() => {\n this.pendingUpdate && this.isActive && (this.lastUpdateTime = Date.now(), this.pendingUpdate = !1), this.updateTimer = null;\n }, this.updateThrottleTime - t));\n }\n /**\n * 更新所有剖切补面\n */\n updateAllSections() {\n this.isActive && (this.planes.forEach((e, t) => {\n if (Math.abs(e.constant) < 99999)\n this.hasPlaneChanged(t, e) && (this.updateSection(e, t), this.updatePlaneState(t, e));\n else {\n const n = this.sectionMeshes.get(`plane_${t}`);\n n && (n.visible = !1);\n }\n }), this.cleanExpiredCache());\n }\n /**\n * 检查平面是否变化\n */\n hasPlaneChanged(e, t) {\n const n = this.planeStates.get(e);\n if (!n) return !0;\n const i = Math.abs(n.constant - t.constant) > 1e-4, o = !n.normal.equals(t.normal);\n return i || o;\n }\n /**\n * 更新平面状态\n */\n updatePlaneState(e, t) {\n this.planeStates.set(e, {\n constant: t.constant,\n normal: t.normal.clone()\n });\n }\n /**\n * 生成平面哈希值(用于缓存键)\n */\n getPlaneHash(e) {\n const t = e.normal, n = e.constant;\n return `${t.x.toFixed(4)}_${t.y.toFixed(4)}_${t.z.toFixed(4)}_${n.toFixed(4)}`;\n }\n /**\n * 生成缓存键\n */\n getCacheKey(e, t) {\n return `${e}_plane_${t}`;\n }\n /**\n * 更新单个剖切面的补面(带缓存)\n */\n updateSection(e, t) {\n const n = this.sectionMeshes.get(`plane_${t}`);\n if (!n) return;\n const i = this.getPlaneHash(e), o = [];\n if (this.sourceMeshes.forEach((r, a) => {\n const l = this.getCacheKey(a, t), h = this.geometryCache.get(l);\n if (h && h.planeHash === i)\n o.push(h.geometry.clone()), h.timestamp = Date.now();\n else\n try {\n const c = this.createPlaneBrush(e), u = new Ni(r.geometry);\n r.updateMatrixWorld(!0), u.matrix.copy(r.matrixWorld), u.updateMatrixWorld();\n const d = this.evaluator.evaluate(c, u, Ra);\n d && d.geometry.attributes.position.count > 0 ? (o.push(d.geometry), this.geometryCache.set(l, {\n geometry: d.geometry.clone(),\n planeHash: i,\n timestamp: Date.now()\n })) : this.geometryCache.delete(l);\n } catch (c) {\n console.warn(`CSG intersection failed for mesh ${a}:`, c);\n }\n }), o.length > 0) {\n const r = this.mergeGeometries(o);\n n.geometry && n.geometry.dispose(), n.geometry = r, n.visible = !0, n.position.set(0, 0, 0), n.rotation.set(0, 0, 0), n.scale.set(1, 1, 1), n.updateMatrixWorld();\n } else\n n.visible = !1;\n o.forEach((r) => r.dispose());\n }\n /**\n * 清理指定网格的缓存\n */\n clearMeshCache(e) {\n const t = [];\n this.geometryCache.forEach((n, i) => {\n i.startsWith(e) && (n.geometry.dispose(), t.push(i));\n }), t.forEach((n) => this.geometryCache.delete(n));\n }\n /**\n * 清理过期缓存\n */\n cleanExpiredCache() {\n const e = Date.now(), t = [];\n this.geometryCache.forEach((n, i) => {\n e - n.timestamp > this.cacheExpireTime && (n.geometry.dispose(), t.push(i));\n }), t.forEach((n) => this.geometryCache.delete(n));\n }\n /**\n * 清理所有缓存\n */\n clearAllCache() {\n this.geometryCache.forEach((e) => {\n e.geometry.dispose();\n }), this.geometryCache.clear();\n }\n /**\n * 创建剖切平面的 Brush 对象\n * 使用极薄的盒子代替平面,以便正确进行 CSG 布尔运算\n */\n createPlaneBrush(e) {\n const t = new E.BoxGeometry(this.planeSize, this.planeThickness, this.planeSize);\n t.translate(0, e.constant, 0), t.applyQuaternion(new E.Quaternion().setFromUnitVectors(new E.Vector3(0, -1, 0), e.normal));\n const n = new E.Mesh(t), i = new Ni(t);\n return i.matrix.copy(n.matrixWorld), i.updateMatrixWorld(), i;\n }\n /**\n * 合并多个几何体\n */\n mergeGeometries(e) {\n if (e.length === 1)\n return e[0].clone();\n const t = new E.BufferGeometry(), n = [], i = [], o = [];\n let r = 0;\n return e.forEach((a) => {\n const l = a.attributes.position, h = a.attributes.normal;\n for (let c = 0; c < l.count; c++)\n n.push(l.getX(c), l.getY(c), l.getZ(c));\n if (h)\n for (let c = 0; c < h.count; c++)\n i.push(h.getX(c), h.getY(c), h.getZ(c));\n if (a.index)\n for (let c = 0; c < a.index.count; c++)\n o.push(a.index.getX(c) + r);\n r += l.count;\n }), t.setAttribute(\"position\", new E.Float32BufferAttribute(n, 3)), i.length > 0 ? t.setAttribute(\"normal\", new E.Float32BufferAttribute(i, 3)) : t.computeVertexNormals(), o.length > 0 && t.setIndex(o), t;\n }\n /**\n * 计算场景大小\n */\n calculateSceneSize() {\n const e = new E.Box3();\n if (this.engine.scene.traverse((t) => {\n if (t.isMesh && t.geometry) {\n const n = new E.Box3().setFromObject(t);\n e.union(n);\n }\n }), e.isEmpty())\n this.planeSize = 1e3;\n else {\n const t = e.getSize(new E.Vector3()), n = Math.max(t.x, t.y, t.z);\n this.planeSize = n * 3;\n }\n }\n /**\n * 更新(每帧调用)\n */\n update() {\n this.isActive && this.pendingUpdate && !this.updateTimer && this.requestUpdate();\n }\n /**\n * 清理资源\n */\n dispose() {\n this.updateTimer && (clearTimeout(this.updateTimer), this.updateTimer = null), this.clearAllCache(), this.planeObjects.forEach((e) => {\n e.geometry && e.geometry.dispose(), e.material && (Array.isArray(e.material) ? e.material.forEach((t) => t.dispose()) : e.material.dispose());\n }), this.sectionMeshes.clear(), this.planeObjects = [], this.sourceMeshes.clear(), this.planeGroup.parent && this.planeGroup.parent.remove(this.planeGroup);\n }\n /**\n * 设置补面材质颜色\n */\n setSectionColor(e) {\n this.planeObjects.forEach((t) => {\n t.material instanceof E.MeshStandardMaterial && t.material.color.set(e);\n });\n }\n /**\n * 获取缓存统计信息\n */\n getCacheStats() {\n return {\n cacheSize: this.geometryCache.size,\n sourceMeshCount: this.sourceMeshes.size,\n sectionMeshCount: this.sectionMeshes.size\n };\n }\n /**\n * 设置剖切平面的厚度\n * @param thickness 厚度值(建议 0.001 - 1.0)\n */\n setPlaneThickness(e) {\n if (e <= 0) {\n console.warn(\"Plane thickness must be positive\");\n return;\n }\n this.planeThickness = e, this.clearAllCache(), this.isActive && this.requestUpdate();\n }\n /**\n * 获取当前平面厚度\n */\n getPlaneThickness() {\n return this.planeThickness;\n }\n /**\n * 显示所有补面\n */\n showSections() {\n this.sectionMeshes.forEach((e) => {\n e.geometry?.attributes.position?.count && e.geometry.attributes.position.count > 0 && (e.visible = !0);\n });\n }\n /**\n * 隐藏所有补面\n */\n hideSections() {\n this.sectionMeshes.forEach((e) => {\n e.visible = !1;\n });\n }\n /**\n * 显示指定索引的补面\n * @param index 平面索引\n */\n showSection() {\n this.planeGroup.visible = !0;\n }\n /**\n * 隐藏指定索引的补面\n * @param index 平面索引\n */\n hideSection() {\n this.planeGroup.visible = !1;\n }\n /**\n * 切换所有补面的可见性\n * @returns 切换后的可见性状态\n */\n toggleSectionsVisibility() {\n let e = !1;\n return this.sectionMeshes.forEach((t) => {\n t.visible && (e = !0);\n }), e ? (this.hideSections(), !1) : (this.showSections(), !0);\n }\n /**\n * 切换指定索引补面的可见性\n * @param index 平面索引\n * @returns 切换后的可见性状态\n */\n toggleSectionVisibility(e) {\n const t = this.sectionMeshes.get(`plane_${e}`);\n return t ? (t.visible = !t.visible, t.visible) : !1;\n }\n}\nclass Qd {\n engine;\n isActive = !1;\n isDrag = !1;\n meshs = [];\n box;\n pickPoint;\n pickNormal;\n pickMesh;\n box_;\n plane;\n // CSG 剖切补面\n csgClipping = null;\n useCsgClipping = !0;\n // 是否使用 CSG 补面\n constructor(e, t) {\n this.engine = e, this.meshs = [], this.box = null, t?.useCsgClipping !== void 0 && (this.useCsgClipping = t.useCsgClipping), this.useCsgClipping && this.initCsgClipping();\n }\n /**\n * 初始化 CSG 剖切补面\n */\n initCsgClipping() {\n this.csgClipping = new za(this.engine, {\n updateThrottleTime: 150,\n cacheExpireTime: 45e3\n }), this.csgClipping.planes = this.engine.sectionPlane, this.csgClipping.init();\n }\n /**\n * 启动剖切\n */\n active() {\n this.isActive || (this.isActive = !0, this.init(), this.meshs.forEach((e) => {\n e.visible = !0;\n }), this.engine.handelBehaved.init(this), this.engine.handelBehaved.active(), this.csgClipping && this.csgClipping.active(), this.engine.models.forEach((e) => {\n e.nodesMap.forEach((t) => {\n t.infos.forEach((n) => {\n this.csgClipping?.addSourceMesh(n.mesh);\n });\n });\n }));\n }\n /**\n * 停用剖切\n */\n disActive() {\n this.isActive = !1, this.engine.handelBehaved.disActive(), this.csgClipping && this.csgClipping.disActive();\n const e = this.engine.sectionPlane.find((t) => t.name == \"顶\");\n e && (e.constant = 1e5), this.meshs.forEach((t) => {\n t.visible = !1;\n });\n }\n /**\n * 初始化\n */\n init() {\n let e = this.engine.octreeBox.getBoundingBox();\n this.box = e, this.updata_face(e);\n }\n /**\n * 更新面\n */\n updata_face(e) {\n let t = this, n = t.engine.scene.children.find(\n (r) => r.type == \"Group\" && r.name == \"ClippingBox\"\n );\n n == null && (n = new E.Group(), n.name = \"ClippingBox\", t.engine.scene.add(n));\n let i = [\n new E.Vector3(e.min.x, e.max.y, e.min.z),\n new E.Vector3(e.max.x, e.max.y, e.min.z),\n new E.Vector3(e.max.x, e.max.y, e.max.z),\n new E.Vector3(e.min.x, e.max.y, e.max.z)\n ];\n o(i, new E.Vector3(0, 1, 0), \"顶\");\n function o(r, a, l) {\n const h = new E.BufferGeometry(), c = new Float32Array([\n r[0].x,\n r[0].y,\n r[0].z,\n // 点1\n r[1].x,\n r[1].y,\n r[1].z,\n // 点2\n r[2].x,\n r[2].y,\n r[2].z,\n // 点3\n r[3].x,\n r[3].y,\n r[3].z\n // 点4\n ]), u = [\n 0,\n 1,\n 2,\n // 第一个三角形\n 0,\n 2,\n 3\n // 第二个三角形\n ];\n h.setAttribute(\"position\", new E.BufferAttribute(c, 3)), h.setIndex(u);\n let d = t.meshs.find((y) => y.name == l);\n if (d == null) {\n const y = new E.MeshBasicMaterial({\n color: 65280,\n // 绿色\n transparent: !0,\n opacity: 0.02,\n side: E.DoubleSide\n }), w = new E.Mesh(h, y);\n w.normal = a, w.name = l, n.add(w), t.meshs.push(w);\n } else\n d.geometry = h;\n const p = new Float32Array([\n r[0].x,\n r[0].y,\n r[0].z,\n r[1].x,\n r[1].y,\n r[1].z,\n r[2].x,\n r[2].y,\n r[2].z,\n r[3].x,\n r[3].y,\n r[3].z,\n r[0].x,\n r[0].y,\n r[0].z\n ]);\n let f = new E.LineBasicMaterial({ color: 255 }), m = new E.BufferGeometry();\n m.setAttribute(\"position\", new E.BufferAttribute(p, 3));\n let g = t.meshs.find((y) => y.name == l + \"Line\");\n g == null && (g = new E.Line(m, f), g.name = l + \"Line\", n.add(g), t.meshs.push(g)), g.geometry = m, g.material = f, t.engine.sectionPlane.find((y) => y.name == l).setFromNormalAndCoplanarPoint(a.clone().setLength(-1), e.max), t.engine.scene.children.filter((y) => y.type == \"Mesh\" && y.url).forEach((y) => {\n y.material && Array.isArray(y.material) ? y.material.forEach((w) => {\n w.clippingPlanes = t.engine.sectionPlane;\n }) : y.material.clippingPlanes = t.engine.sectionPlane;\n });\n }\n }\n /**\n * 重写鼠标按下事件\n */\n handleMouseDown(e) {\n this.csgClipping?.hideSection(), this.isDrag = !0;\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0)\n if (this.pickPoint = t[0].point, this.pickNormal = t[0].face.normal, this.engine.controls.enabled = !1, this.pickMesh = t[0].object, this.box_ = {\n min: this.box.min.clone(),\n max: this.box.max.clone()\n }, this.pickNormal.y == 0) {\n const n = new E.Plane();\n n.setFromNormalAndCoplanarPoint(new E.Vector3(0, 1, 0), this.pickPoint), this.plane = n;\n } else {\n let n = new E.Vector3(\n this.engine.camera.position.x,\n this.pickPoint.y,\n this.engine.camera.position.z\n );\n const i = new E.Plane();\n i.setFromNormalAndCoplanarPoint(\n n.clone().sub(this.pickPoint.clone()).setLength(1),\n this.pickPoint\n ), this.plane = i;\n }\n }\n /**\n * 鼠标释放事件\n */\n handleMouseUp(e) {\n this.isDrag = !1, this.pickPoint = null, this.pickNormal = null, this.pickMesh = null, this.engine.controls.enabled = !0, this.csgClipping && this.isActive && (this.csgClipping.updateAllSections(), this.csgClipping?.showSection());\n }\n /**\n * 鼠标移动事件\n */\n handleMouseMove(e) {\n this.meshs.forEach((n) => {\n n.material.opacity = 0;\n });\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0 && (t[0].object.material.opacity = 0.05), this.pickPoint != null) {\n const n = new E.Vector3();\n if (e.raycaster.ray.intersectPlane(this.plane, n)) {\n let i = n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());\n this.pickMesh.name == \"前\" || this.pickMesh.name == \"左\" || this.pickMesh.name == \"底\" ? this.box.min = this.box_.min.clone().add(this.pickNormal.clone().setLength(i)) : this.box.max = this.box_.max.clone().add(this.pickNormal.clone().setLength(i)), this.updata_face(this.box);\n }\n }\n }\n /**\n * 更新(在渲染循环中调用)\n */\n update() {\n this.csgClipping && this.csgClipping.update();\n }\n /**\n * 切换到 CSG 补面模式\n */\n enableCsgClipping() {\n this.csgClipping || this.initCsgClipping(), this.useCsgClipping = !0, this.isActive && this.csgClipping && (this.engine.clipping?.clippingStencil && this.engine.clipping.clippingStencil.disActive(), this.csgClipping.active());\n }\n /**\n * 切换到传统 Stencil 补面模式\n */\n enableStencilClipping() {\n this.useCsgClipping = !1, this.isActive && (this.csgClipping && this.csgClipping.disActive(), this.engine.clipping?.clippingStencil && this.engine.clipping.clippingStencil.active());\n }\n /**\n * 设置 CSG 补面颜色\n */\n setCsgColor(e) {\n this.csgClipping && this.csgClipping.setSectionColor(e);\n }\n /**\n * 获取 CSG 统计信息\n */\n getCsgStats() {\n return this.csgClipping?.getCacheStats();\n }\n /**\n * 清理 CSG 缓存\n */\n clearCsgCache() {\n this.csgClipping?.clearAllCache();\n }\n /**\n * 清理资源\n */\n dispose() {\n this.disActive(), this.csgClipping && (this.csgClipping.dispose(), this.csgClipping = null);\n }\n}\nclass ep {\n engine;\n isActive = !1;\n isDrag = !1;\n meshs = [];\n box;\n pickPoint;\n pickNormal;\n pickMesh;\n box_;\n plane;\n constructor(e) {\n this.engine = e, this.meshs = [], this.box = null;\n }\n // 启动\n active() {\n this.isActive != !0 && (this.isActive = !0, this.init(), this.meshs.forEach((e) => {\n e.visible = !0;\n }), this.engine.handelBehaved.init(this), this.engine.handelBehaved.active());\n }\n disActive() {\n this.isActive = !1, this.engine.handelBehaved.disActive();\n const e = this.engine.sectionPlane.find((t) => t.name == \"左\");\n e && (e.constant = 1e5), this.meshs.forEach((t) => {\n t.visible = !1;\n });\n }\n // 初始化\n init() {\n let e = this.engine.octreeBox.getBoundingBox();\n this.box = e, this.updata_face(e);\n }\n // 更新面\n updata_face(e) {\n let t = this, n = t.engine.scene.children.find((r) => r.type == \"Group\" && r.name == \"ClippingBox\");\n n == null && (n = new E.Group(), n.name = \"ClippingBox\", t.engine.scene.add(n));\n let i = [\n new E.Vector3(e.min.x, e.min.y, e.max.z),\n new E.Vector3(e.min.x, e.min.y, e.min.z),\n new E.Vector3(e.min.x, e.max.y, e.min.z),\n new E.Vector3(e.min.x, e.max.y, e.max.z)\n ];\n o(i, new E.Vector3(-1, 0, 0), \"左\");\n function o(r, a, l) {\n const h = new E.BufferGeometry(), c = new Float32Array([\n r[0].x,\n r[0].y,\n r[0].z,\n // 点1\n r[1].x,\n r[1].y,\n r[1].z,\n // 点2\n r[2].x,\n r[2].y,\n r[2].z,\n // 点3\n r[3].x,\n r[3].y,\n r[3].z\n // 点4\n ]), u = [\n 0,\n 1,\n 2,\n // 第一个三角形\n 0,\n 2,\n 3\n // 第二个三角形\n ];\n h.setAttribute(\"position\", new E.BufferAttribute(c, 3)), h.setIndex(u);\n let d = t.meshs.find((y) => y.name == l);\n if (d == null) {\n const y = new E.MeshBasicMaterial({\n color: 65280,\n // 绿色\n transparent: !0,\n opacity: 0.02,\n side: E.DoubleSide\n // 双面渲染\n }), w = new E.Mesh(h, y);\n w.normal = a, w.name = l, n.add(w), t.meshs.push(w);\n } else\n d.geometry = h;\n const p = new Float32Array([\n r[0].x,\n r[0].y,\n r[0].z,\n // 点1\n r[1].x,\n r[1].y,\n r[1].z,\n // 点2\n r[2].x,\n r[2].y,\n r[2].z,\n // 点3\n r[3].x,\n r[3].y,\n r[3].z,\n // 点4 \n r[0].x,\n r[0].y,\n r[0].z\n // 点1\n ]);\n let f = new E.LineBasicMaterial({ color: 255 }), m = new E.BufferGeometry();\n m.setAttribute(\"position\", new E.BufferAttribute(p, 3));\n let g = t.meshs.find((y) => y.name == l + \"Line\");\n g == null && (g = new E.Line(m, f), g.name = l + \"Line\", n.add(g), t.meshs.push(g)), g.geometry = m, g.material = f, t.engine.sectionPlane.find((y) => y.name == l).setFromNormalAndCoplanarPoint(a.clone().setLength(-1), e.min), t.engine.scene.children.filter((y) => y.type == \"Mesh\" && y.url).forEach((y) => {\n y.material && Array.isArray(y.material) ? y.material.forEach((w) => {\n w.clippingPlanes = t.engine.sectionPlane;\n }) : y.material.clippingPlanes = t.engine.sectionPlane;\n });\n }\n }\n // 重写鼠标按下事件\n handleMouseDown(e) {\n this.isDrag = !0;\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0)\n if (this.pickPoint = t[0].point, this.pickNormal = t[0].face.normal, this.engine.controls.enabled = !1, this.pickMesh = t[0].object, this.box_ = {\n min: this.box.min.clone(),\n max: this.box.max.clone()\n }, this.pickNormal.y == 0) {\n const n = new E.Plane();\n n.setFromNormalAndCoplanarPoint(new E.Vector3(0, 1, 0), this.pickPoint), this.plane = n;\n } else {\n let n = new E.Vector3(this.engine.camera.position.x, this.pickPoint.y, this.engine.camera.position.z);\n const i = new E.Plane();\n i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1), this.pickPoint), this.plane = i;\n }\n }\n handleMouseUp(e) {\n this.isDrag = !1, this.pickPoint = null, this.pickNormal = null, this.pickMesh = null, this.engine.controls.enabled = !0;\n }\n handleMouseMove(e) {\n this.meshs.forEach((n) => {\n n.material.opacity = 0;\n });\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0 && (t[0].object.material.opacity = 0.05), this.pickPoint != null) {\n const n = new E.Vector3();\n if (e.raycaster.ray.intersectPlane(this.plane, n)) {\n let i = n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());\n this.pickMesh.name == \"前\" || this.pickMesh.name == \"左\" || this.pickMesh.name == \"底\" ? this.box.min = this.box_.min.clone().add(this.pickNormal.clone().setLength(i)) : this.box.max = this.box_.max.clone().add(this.pickNormal.clone().setLength(i)), this.updata_face(this.box);\n }\n }\n }\n}\nclass tp {\n engine;\n isActive = !1;\n box;\n pickPoint;\n pickNormal;\n pickMesh;\n box_;\n plane;\n meshs;\n isDrag = !1;\n // CSG 剖切补面\n csgClipping = null;\n useCsgClipping = !0;\n // 是否使用 CSG 补面\n constructor(e, t) {\n this.engine = e, this.meshs = [], t?.useCsgClipping !== void 0 && (this.useCsgClipping = t.useCsgClipping), this.useCsgClipping && this.initCsgClipping();\n }\n /**\n * 初始化 CSG 剖切补面\n */\n initCsgClipping() {\n this.csgClipping = new za(this.engine, {\n updateThrottleTime: 150,\n cacheExpireTime: 45e3\n }), this.csgClipping.planes = this.engine.sectionPlane, this.csgClipping.init();\n }\n active() {\n console.log(\"调用这里了\"), !this.isActive && (this.isActive = !0, this.init(), this.meshs.forEach((e) => {\n e.visible = !0;\n }), this.engine.handelBehaved.init(this), this.engine.handelBehaved.active(), this.csgClipping && this.csgClipping.active(), this.engine.models.forEach((e) => {\n e.nodesMap.forEach((t) => {\n t.infos.forEach((n) => {\n this.csgClipping?.addSourceMesh(n.mesh);\n });\n });\n }));\n }\n disActive() {\n this.isActive = !1, this.engine.handelBehaved.disActive(), this.csgClipping && this.csgClipping.disActive(), this.engine.sectionPlane.forEach((e) => {\n e.constant = 1e5;\n }), this.meshs.forEach((e) => {\n e.visible = !1;\n });\n }\n // 初始化\n init() {\n let e = this.engine.octreeBox.getBoundingBox();\n this.box = e, this.updata_face(e);\n }\n // 获取xyz值\n getboxXyz() {\n return {\n minX: this.box.min.x,\n minY: this.box.min.y,\n minZ: this.box.min.z,\n maxX: this.box.max.x,\n maxY: this.box.max.y,\n maxZ: this.box.max.z\n };\n }\n setboxXyz(e) {\n this.box.min.x = e.minX, this.box.min.y = e.minY, this.box.min.z = e.minZ, this.box.max.x = e.maxX, this.box.max.y = e.maxY, this.box.max.z = e.maxZ, this.updata_face(this.box);\n }\n // 设置剖切的box\n setBox(e) {\n this.box = e, this.updata_face(e);\n }\n // 反向剖切\n reverseBox() {\n }\n /**\n * 设置剖切盒范围(百分比)\n * @param percent 百分比范围 { x: {min, max}, y: {min, max}, z: {min, max} },值域 0-100\n */\n setboxPercent(e) {\n console.log(\"[SectionBox] setboxPercent called with:\", e);\n }\n // 重写鼠标按下事件\n handleMouseDown(e) {\n this.isDrag = !0;\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0)\n if (this.pickPoint = t[0].point, this.pickNormal = t[0].face.normal, this.engine.controls.enabled = !1, this.pickMesh = t[0].object, this.box_ = {\n min: this.box.min.clone(),\n max: this.box.max.clone()\n }, this.pickNormal.y == 0) {\n const n = new E.Plane();\n n.setFromNormalAndCoplanarPoint(new E.Vector3(0, 1, 0), this.pickPoint), this.plane = n;\n } else {\n let n = new E.Vector3(this.engine.camera.position.x, this.pickPoint.y, this.engine.camera.position.z);\n const i = new E.Plane();\n i.setFromNormalAndCoplanarPoint(n.clone().sub(this.pickPoint.clone()).setLength(1), this.pickPoint), this.plane = i;\n }\n }\n handleMouseUp(e) {\n this.isDrag = !1, this.pickPoint = null, this.pickNormal = null, this.pickMesh = null, this.engine.controls.enabled = !0, this.csgClipping && this.isActive && (this.csgClipping.updateAllSections(), this.csgClipping?.showSection());\n }\n handleMouseMove(e) {\n this.meshs.forEach((n) => {\n n.material.opacity = 0;\n });\n const t = e.raycaster.intersectObjects(this.meshs, !1);\n if (t != null && t.length > 0 && (t[0].object.material.opacity = 0.05), this.pickPoint != null) {\n const n = new E.Vector3();\n if (e.raycaster.ray.intersectPlane(this.plane, n)) {\n let i = n.clone().sub(this.pickPoint.clone()).dot(this.pickNormal.clone());\n this.pickMesh.name == \"前\" || this.pickMesh.name == \"左\" || this.pickMesh.name == \"底\" ? this.box.min = this.box_.min.clone().add(this.pickNormal.clone().setLength(i)) : this.box.max = this.box_.max.clone().add(this.pickNormal.clone().setLength(i)), this.updata_face(this.box);\n }\n }\n }\n // 更新面\n updata_face(e) {\n let t = this, n = [\n new E.Vector3(e.min.x, e.min.y, e.min.z),\n new E.Vector3(e.max.x, e.min.y, e.min.z),\n new E.Vector3(e.max.x, e.max.y, e.min.z),\n new E.Vector3(e.min.x, e.max.y, e.min.z)\n ], i = [\n new E.Vector3(e.min.x, e.min.y, e.max.z),\n new E.Vector3(e.max.x, e.min.y, e.max.z),\n new E.Vector3(e.max.x, e.max.y, e.max.z),\n new E.Vector3(e.min.x, e.max.y, e.max.z)\n ], o = [\n new E.Vector3(e.max.x, e.min.y, e.max.z),\n new E.Vector3(e.max.x, e.min.y, e.min.z),\n new E.Vector3(e.max.x, e.max.y, e.min.z),\n new E.Vector3(e.max.x, e.max.y, e.max.z)\n ], r = [\n new E.Vector3(e.min.x, e.min.y, e.min.z),\n new E.Vector3(e.min.x, e.min.y, e.max.z),\n new E.Vector3(e.min.x, e.max.y, e.max.z),\n new E.Vector3(e.min.x, e.max.y, e.min.z)\n ], a = [\n new E.Vector3(e.min.x, e.max.y, e.min.z),\n new E.Vector3(e.max.x, e.max.y, e.min.z),\n new E.Vector3(e.max.x, e.max.y, e.max.z),\n new E.Vector3(e.min.x, e.max.y, e.max.z)\n ], l = [\n new E.Vector3(e.min.x, e.min.y, e.min.z),\n new E.Vector3(e.max.x, e.min.y, e.min.z),\n new E.Vector3(e.max.x, e.min.y, e.max.z),\n new E.Vector3(e.min.x, e.min.y, e.max.z)\n ];\n h(n, new E.Vector3(0, 0, -1), \"前\"), h(i, new E.Vector3(0, 0, 1), \"后\"), h(o, new E.Vector3(1, 0, 0), \"右\"), h(r, new E.Vector3(-1, 0, 0), \"左\"), h(a, new E.Vector3(0, 1, 0), \"顶\"), h(l, new E.Vector3(0, -1, 0), \"底\");\n function h(c, u, d) {\n const p = new E.BufferGeometry(), f = new Float32Array([\n c[0].x,\n c[0].y,\n c[0].z,\n // 点1\n c[1].x,\n c[1].y,\n c[1].z,\n // 点2\n c[2].x,\n c[2].y,\n c[2].z,\n // 点3\n c[3].x,\n c[3].y,\n c[3].z\n // 点4\n ]), m = [\n 0,\n 1,\n 2,\n // 第一个三角形\n 0,\n 2,\n 3\n // 第二个三角形\n ];\n p.setAttribute(\"position\", new E.BufferAttribute(f, 3)), p.setIndex(m);\n let g = t.engine.scene.children.find((A) => A.type == \"Group\" && A.name == \"ClippingBox\");\n g == null && (g = new E.Group(), g.name = \"ClippingBox\", t.engine.scene.add(g));\n let y = t.meshs.find((A) => A.name == d);\n if (y == null) {\n const A = new E.MeshBasicMaterial({\n color: 65280,\n // 绿色\n transparent: !0,\n opacity: 0,\n side: E.DoubleSide\n // 双面渲染\n }), M = new E.Mesh(p, A);\n M.normal = u, M.name = d, g.add(M), t.meshs.push(M);\n } else\n y.geometry = p;\n const w = new Float32Array([\n c[0].x,\n c[0].y,\n c[0].z,\n // 点1\n c[1].x,\n c[1].y,\n c[1].z,\n // 点2\n c[2].x,\n c[2].y,\n c[2].z,\n // 点3\n c[3].x,\n c[3].y,\n c[3].z,\n // 点4 \n c[0].x,\n c[0].y,\n c[0].z\n // 点1\n ]);\n let _ = new E.LineBasicMaterial({ color: 255 }), x = new E.BufferGeometry();\n x.setAttribute(\"position\", new E.BufferAttribute(w, 3));\n let b = t.meshs.find((A) => A.name == d + \"Line\");\n b == null && (b = new E.Line(x, _), b.name = d + \"Line\", g.add(b), t.meshs.push(b)), b.geometry = x, b.material = _, d == \"前\" || d == \"左\" || d == \"底\" ? t.engine.sectionPlane.find((A) => A.name == d).setFromNormalAndCoplanarPoint(u.clone().setLength(-1), e.min) : t.engine.sectionPlane.find((A) => A.name == d).setFromNormalAndCoplanarPoint(u.clone().setLength(-1), e.max), t.engine.scene.children.filter((A) => A.type == \"Mesh\" && A.url).forEach((A) => {\n A.material && Array.isArray(A.material) ? A.material.forEach((M) => {\n M.clippingPlanes = t.engine.sectionPlane;\n }) : A.material.clippingPlanes = t.engine.sectionPlane;\n });\n }\n }\n}\nclass np {\n engine;\n sectionPlaneX;\n sectionPlaneY;\n sectionPlaneZ;\n sectionBox;\n clippingStencil;\n constructor(e) {\n this.engine = e;\n let t = new E.Plane(new E.Vector3(0, 0, 1), 1e5);\n t.name = \"前\";\n let n = new E.Plane(new E.Vector3(0, 0, 1), 1e5);\n n.name = \"左\";\n let i = new E.Plane(new E.Vector3(0, 0, 1), 1e5);\n i.name = \"后\";\n let o = new E.Plane(new E.Vector3(0, 0, 1), 1e5);\n o.name = \"右\";\n let r = new E.Plane(new E.Vector3(0, 0, 1), 1e5);\n r.name = \"顶\";\n let a = new E.Plane(new E.Vector3(0, 0, 1), 1e5);\n a.name = \"底\", this.engine.sectionPlane = [t, n, i, o, r, a];\n }\n init() {\n this.sectionPlaneX = new cf(this.engine), this.sectionPlaneY = new Qd(this.engine), this.sectionPlaneZ = new ep(this.engine), this.sectionBox = new tp(this.engine);\n }\n disActive() {\n this.sectionPlaneX.disActive(), this.sectionPlaneY.disActive(), this.sectionPlaneZ.disActive(), this.sectionBox.disActive();\n }\n}\nclass ip {\n engine;\n constructor(e) {\n this.engine = e;\n }\n // 获取轴网的模型树\n getLevelTreeData() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n e.push({\n children: t.info.modelTree.modelTreeLevel,\n name: t.info.baseInfo.name\n });\n }), e;\n }\n // 获取类型的模型树\n getTypeTreeData() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n e.push({\n children: t.info.modelTree.modelTreeType,\n name: t.info.baseInfo.name\n });\n }), e;\n }\n // 获取专业的模型树\n getMajorTreeData() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n e.push({\n children: t.info.modelTree.modelTreeMajor,\n name: t.info.baseInfo.name\n });\n }), e;\n }\n}\nclass sp {\n engine;\n constructor(e) {\n this.engine = e;\n }\n /**\n * 获取引擎统计信息\n * 统计场景中所有网格的顶点数和三角面数\n * @returns 返回包含顶点数和三角面数的对象\n */\n getEngineInfo() {\n let e = 0, t = 0, n = 0;\n return !this.engine || !this.engine.scene ? {\n totalVertices: 0,\n totalTriangles: 0,\n meshCount: 0\n } : (this.engine.scene.traverse((i) => {\n if (i instanceof E.Mesh) {\n const o = i.geometry;\n if (o && o.attributes) {\n const r = o.attributes.position;\n if (r) {\n const a = r.count;\n e += a;\n let l = 0;\n o.index ? l = o.index.count / 3 : l = a / 3, t += l, n++;\n }\n }\n }\n }), {\n totalVertices: Math.floor(e),\n totalTriangles: Math.floor(t),\n meshCount: n\n });\n }\n}\nclass rp {\n engine;\n constructor(e) {\n this.engine = e;\n }\n init() {\n }\n // 查询构件属性\n getModelProperties(e, t, n) {\n let i = this.engine.engineStatus.models.find((r) => r.url === e);\n i.properties == null && _a(e + \"/property\", (r) => {\n let a = JSON.parse(r);\n i.properties = a, setTimeout(() => {\n o(a, t, n);\n }, 100);\n }), o(i.properties, t, n);\n function o(r, a, l) {\n let h = [], c = r.models[a.toString() || \"\"], u = c.map((d) => d[0]);\n u = u.filter((d, p) => u.indexOf(d) === p), u.forEach((d) => {\n let p = {\n name: r.categorys[d],\n children: []\n };\n h.push(p), c.filter((f) => f[0] === d).forEach((f) => {\n p.children.push({\n name: r.names[f[1]],\n value: r.values[f[2]]\n });\n });\n }), l?.({\n properties: h,\n materials: []\n });\n }\n }\n}\nclass op {\n engine;\n constructor(e) {\n this.engine = e;\n }\n // 获取模型中所有的类型\n getModelTypes() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n t.info.modelMapper.forEach((i) => {\n e.push(i.typeName);\n });\n }), e = e.filter((t, n, i) => i.indexOf(t) === n), e;\n }\n // 获取模型中所有的专业\n getModelMajors() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n t.info.modelMapper.forEach((i) => {\n e.push(i.majorName);\n });\n }), e = e.filter((t, n, i) => i.indexOf(t) === n), e;\n }\n // 获取模型中所有的楼层\n getModelLevels() {\n let e = [];\n return this.engine.engineStatus.models.forEach((t) => {\n t.info.modelMapper.forEach((i) => {\n e.push(i.levelName);\n });\n }), e = e.filter((t, n, i) => i.indexOf(t) === n), e;\n }\n // 批量获取模型映射\n getModelMappers(e) {\n }\n // 获取模型的mapper\n getModelMapper(e, t) {\n let n = this.engine.engineStatus.models.find((r) => r.url == e);\n return n ? n.info.modelMapper.find((r) => r.id == t) : null;\n }\n // 获取通类构件\n getModelSWithType(e, t = null) {\n let n = [];\n return this.engine.engineStatus.models.forEach((i) => {\n let o = {\n url: i.url,\n ids: []\n };\n n.push(o), i.info.modelMapper.filter((a) => a.typeName === e).forEach((a) => {\n o.ids.push(Number(a.id));\n });\n }), t && t(n), n;\n }\n // 获取同层构件\n getModelSWithLevel(e, t) {\n let n = [];\n return this.engine.engineStatus.models.forEach((i) => {\n let o = {\n url: i.url,\n ids: []\n };\n n.push(o), i.info.modelMapper.filter((a) => a.levelName === e).forEach((a) => {\n o.ids.push(Number(a.id));\n });\n }), t && t(n), n;\n }\n // 获取通专业构件 \n getModelsWithMajor(e, t) {\n let n = [];\n return this.engine.engineStatus.models.forEach((i) => {\n let o = {\n url: i.url,\n ids: []\n };\n n.push(o), i.info.modelMapper.filter((a) => a.majorName === e).forEach((a) => {\n o.ids.push(Number(a.id));\n });\n }), t && t(n), n;\n }\n}\nclass ap {\n engine;\n isActive = !1;\n groupEdge;\n material;\n indexes = /* @__PURE__ */ new Map();\n constructor(e) {\n this.engine = e, this.groupEdge = this.engine.scene.getObjectByName(\"groupEdge\"), this.material = new E.LineBasicMaterial({\n color: \"#000000\",\n depthTest: !0\n });\n }\n // 启动\n active() {\n this.isActive = !0, this.groupEdge.visible = !0, this.show();\n }\n // 关闭\n disActive() {\n this.isActive = !1, this.groupEdge.visible = !1;\n }\n // 显示模型边线\n show() {\n this.engine.engineStatus.models.forEach((e) => {\n if (!this.groupEdge.children.find((n) => n.url == e.url)) {\n let n = e.info, i = [], o = /* @__PURE__ */ new Map();\n n.modelEdge.forEach((l) => {\n let h = i.length;\n for (let c = 0; c < l.points.length; c++)\n l.points[c].length == 2 && (i.push(l.points[c][0].X), i.push(l.points[c][0].Z), i.push(-l.points[c][0].Y), i.push(l.points[c][1].X), i.push(l.points[c][1].Z), i.push(-l.points[c][1].Y));\n o.set(Number(l.id), [h, i.length, l.points]);\n }), this.indexes.set(e.url, o);\n let r = new E.BufferGeometry();\n r.setAttribute(\"position\", new E.Float32BufferAttribute(i, 3));\n const a = new E.LineSegments(r, this.material);\n a.url = e.url, this.groupEdge.add(a);\n }\n });\n }\n // 获取指定模型的边线\n getModelEdge(e, t) {\n let n = this.indexes.get(e);\n if (n) {\n let i = n.get(t);\n if (i)\n return i;\n }\n return null;\n }\n //隐藏边线\n hideModelEdge(e, t) {\n let n = this.indexes.get(e);\n if (n) {\n let i = n.get(t);\n if (i) {\n let [o, r, a] = i, l = this.groupEdge.children.find((h) => h.url == e);\n if (l) {\n let h = l.geometry.attributes.position.array;\n for (let c = o; c < r; c++)\n h[c] = NaN;\n l.geometry.attributes.position.needsUpdate = !0;\n }\n }\n }\n }\n // 显示边线\n showModelEdge(e, t) {\n let n = this.indexes.get(e);\n if (n) {\n let i = n.get(t);\n if (i) {\n let [o, r, a] = i, l = this.groupEdge.children.find((h) => h.url == e);\n if (l) {\n let h = l.geometry.attributes.position.array, c = 0;\n for (let u = o; u < r; u += 3) {\n const d = Math.floor(c / 6), p = c % 6 >= 3;\n if (a[d] && a[d].length === 2) {\n const f = p ? a[d][1] : a[d][0];\n h[u] = f.X, h[u + 1] = f.Z, h[u + 2] = -f.Y;\n }\n c += 3;\n }\n l.geometry.attributes.position.needsUpdate = !0;\n }\n }\n }\n }\n}\nclass lp {\n config;\n constructor(e) {\n this.config = {\n temperature: 0.7,\n maxTokens: 2e3,\n timeout: 3e4,\n ...e\n };\n }\n /**\n * 发送消息并获取响应(非流式)\n */\n async chat(e) {\n const t = new AbortController(), n = setTimeout(() => t.abort(), this.config.timeout);\n try {\n const i = await fetch(`${this.config.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`\n },\n body: JSON.stringify({\n model: this.config.model,\n messages: e,\n temperature: this.config.temperature,\n max_tokens: this.config.maxTokens,\n stream: !1\n }),\n signal: t.signal\n });\n if (clearTimeout(n), !i.ok) {\n const r = await i.json().catch(() => ({}));\n throw new Error(\n `API请求失败 (${i.status}): ${r.error?.message || r.message || i.statusText}`\n );\n }\n return (await i.json()).choices?.[0]?.message?.content || \"\";\n } catch (i) {\n throw clearTimeout(n), i.name === \"AbortError\" ? new Error(\"请求超时,请重试\") : i.message.includes(\"Failed to fetch\") ? new Error(`网络请求失败,请检查:\n1. 网络连接\n2. API地址是否正确\n3. 是否有CORS限制`) : i;\n }\n }\n /**\n * 发送消息并获取流式响应\n */\n async chatStream(e, t) {\n const n = new AbortController(), i = setTimeout(() => n.abort(), this.config.timeout);\n try {\n const o = await fetch(`${this.config.baseURL}/chat/completions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.config.apiKey}`\n },\n body: JSON.stringify({\n model: this.config.model,\n messages: e,\n temperature: this.config.temperature,\n max_tokens: this.config.maxTokens,\n stream: !0\n }),\n signal: n.signal\n });\n if (clearTimeout(i), !o.ok) {\n const h = await o.json().catch(() => ({}));\n throw new Error(\n `API请求失败 (${o.status}): ${h.error?.message || h.message || o.statusText}`\n );\n }\n const r = o.body?.getReader();\n if (!r)\n throw new Error(\"无法读取响应流\");\n const a = new TextDecoder();\n let l = \"\";\n for (; ; ) {\n const { done: h, value: c } = await r.read();\n if (h) {\n t(\"\", !0);\n break;\n }\n l += a.decode(c, { stream: !0 });\n const u = l.split(`\n`);\n l = u.pop() || \"\";\n for (const d of u) {\n const p = d.trim();\n if (!p || !p.startsWith(\"data: \")) continue;\n const f = p.slice(6);\n if (f !== \"[DONE]\")\n try {\n const g = JSON.parse(f).choices?.[0]?.delta?.content;\n g && t(g, !1);\n } catch (m) {\n console.warn(\"解析流式数据失败:\", m);\n }\n }\n }\n } catch (o) {\n throw clearTimeout(i), o.name === \"AbortError\" ? new Error(\"请求超时,请重试\") : o.message.includes(\"Failed to fetch\") ? new Error(\"网络请求失败,请检查网络连接\") : o;\n }\n }\n /**\n * 更新配置\n */\n updateConfig(e) {\n this.config = { ...this.config, ...e };\n }\n /**\n * 获取当前配置\n */\n getConfig() {\n return { ...this.config };\n }\n}\nclass cp {\n /** 引擎实例 */\n engine;\n /** 步骤列表 */\n steps = [];\n /** 步骤执行结果 */\n stepResults = /* @__PURE__ */ new Map();\n /** 对话历史 */\n conversationHistory = [];\n /** 当前状态 */\n state = \"idle\";\n /** 大模型API实例 */\n llmApi = null;\n /** 配置 */\n config = null;\n /** 回调信息 */\n _callback_message;\n _callback_question;\n _callback_content;\n /** 提示词缓存 */\n prompts = {};\n /**\n * 构造函数\n * @param engine 引擎实例\n */\n constructor(e) {\n this.engine = e;\n }\n /**\n * 初始化AI管理器\n * @param config 对话配置\n */\n async init(e, t, n) {\n this._callback_message = e, this._callback_question = t, this._callback_content = n, this.conversationHistory = [];\n let i = {\n llmConfig: {\n baseURL: \"https://api.deepseek.com/v1\",\n apiKey: \"sk-4677b153277a40b096c6716686c29ac4\",\n model: \"deepseek-chat\",\n temperature: 0.7,\n maxTokens: 2e3\n },\n debug: !0,\n stepExecution: {\n // 默认允许 1 次重试:当 AI 生成的代码偶发不可执行/缺参数时,会自动让 AI 修复后再跑一次\n maxRetries: 5\n },\n prompts: {\n main: \"\",\n step: \"\",\n apiDoc: \"\"\n }\n };\n try {\n this.config = i, this.llmApi = new lp(i.llmConfig);\n try {\n const o = await import(\"./main-2Txx2Vau.mjs\");\n this.prompts.main = o.default;\n const r = await import(\"./step-CkmZYIvn.mjs\");\n this.prompts.step = r.default;\n const a = await import(\"./API文档-B1v8UcRF.mjs\");\n this.prompts.apiDoc = a.default;\n } catch (o) {\n throw console.error(\"[AI Manager] 提示词文件加载失败:\", o), new Error(`提示词文件加载失败: ${o.message || \"未知错误\"}`);\n }\n } catch (o) {\n throw console.error(\"[AI Manager] 初始化失败:\", o), o;\n }\n }\n /**\n * 处理对话,与大模型进行交互\n * callback_message:\n * @param callback_message 回调消息\n * @param callback_question 回调问题\n * @param callback_content 回调内容\n */\n async conversationV2(e) {\n if (this.conversationHistory.length === 0) {\n const i = {\n role: \"system\",\n content: `${this.prompts.main}`\n }, o = {\n role: \"system\",\n content: `## BIM引擎API文档\n${this.prompts.apiDoc}`\n };\n this.conversationHistory.push(i), this.conversationHistory.push(o);\n }\n this.conversationHistory.push({\n role: \"user\",\n content: e\n });\n const t = await this.llmApi.chat(this.conversationHistory);\n this.conversationHistory.push({\n role: \"assistant\",\n content: t\n }), this.config?.debug && console.log(\"[AI Manager] 大模型响应:\", t);\n let n = await this.parseAnalysisResponse(t);\n n && n.questions && n.questions.length > 0 && this._callback_question(n.questions);\n }\n /**\n * 解析分析响应\n */\n async parseAnalysisResponse(e) {\n try {\n if (e.includes(\"##question##\")) {\n const t = e.match(/##question##\\s*([\\s\\S]*?)(?=##|$)/);\n if (t) {\n let n = t[1].trim();\n n = n.replace(/^```json\\n?/, \"\").replace(/^```\\n?/, \"\").replace(/\\n?```$/, \"\");\n const i = n.match(/(\\[[\\s\\S]*\\])/);\n i && (n = i[1]);\n const o = JSON.parse(n);\n return this.state = \"waiting_answer\", {\n state: \"waiting_answer\",\n questions: o\n };\n }\n }\n if (e.includes(\"##steps##\")) {\n const t = e.match(/##steps##\\s*([\\s\\S]*?)(?=##|$)/);\n if (t) {\n let n = t[1].trim();\n n = n.replace(/^```json\\n?/, \"\").replace(/^```\\n?/, \"\").replace(/\\n?```$/, \"\");\n const i = n.match(/(\\[[\\s\\S]*\\])/);\n return i && (n = i[1]), this.steps = JSON.parse(n), this.config?.debug && console.log(\"[AI Manager] 步骤规划完成,共\", this.steps.length, \"个步骤\"), this._callback_message(this.steps), await this.executeSteps();\n }\n }\n return {\n state: \"completed\",\n data: e\n };\n } catch (t) {\n return console.error(\"[AI Manager] 解析响应失败:\", t), {\n state: \"error\",\n error: \"解析大模型响应失败: \" + t.message\n };\n }\n }\n /**\n * 执行步骤\n */\n async executeSteps() {\n try {\n this.state = \"executing\", this.stepResults.clear();\n for (const e of this.steps) {\n this._callback_message(e), this.config?.debug && console.log(`[AI Manager] 执行步骤 ${e.id}: ${e.content}`);\n const t = await this.getDependenciesOutput(e.dependencies), n = await this.executeStep(e, t);\n this.stepResults.set(e.id, n), this.config?.debug && console.log(`[AI Manager] 步骤 ${e.id} 执行完成:`, n);\n }\n return this.state = \"completed\", {\n state: \"completed\",\n steps: this.steps,\n result: Array.from(this.stepResults.values())\n };\n } catch (e) {\n return console.error(\"[AI Manager] 步骤执行失败:\", e), {\n state: \"error\",\n error: \"步骤执行失败: \" + e.message\n };\n }\n }\n /**\n * 获取依赖步骤的输出\n */\n async getDependenciesOutput(e) {\n return e.length === 0 ? null : e.length === 1 ? this.stepResults.get(e[0]) : e.map((t) => this.stepResults.get(t));\n }\n /**\n * 执行单个步骤\n */\n async executeStep(e, t) {\n const n = this.config?.stepExecution?.maxRetries ?? 1, i = [];\n let o = null, r = !1;\n for (let a = 0; a <= n; a++)\n try {\n const l = i.length > 0 ? i[i.length - 1] : \"\", c = await (a === 0 ? this.generateCode(e, t) : r ? this.regenerateCodeAfterFailure(e, t, l, o, a) : this.generateCode(e, t));\n i.push(c), this.config?.debug && console.log(`[AI Manager] 步骤 ${e.id} 第 ${a + 1} 次生成的代码:\n${c}`);\n try {\n const u = await this.executeCode(c, t);\n if (u instanceof Object && u.success == !1 || u instanceof String && (u.includes(\"undefined\") || u.includes(\"not\"))) {\n o = u, r = !0;\n debugger;\n throw u;\n }\n debugger;\n return u;\n } catch (u) {\n debugger;\n throw o = u, r = !0, u;\n }\n } catch (l) {\n if (r || (o = l), a >= n)\n throw console.error(`[AI Manager] 执行步骤 ${e.id} 失败(已达重试上限):`, l), new Error(`步骤 ${e.id} (${e.content}) 执行失败: ${l.message}`);\n console.warn(\n `[AI Manager] 步骤 ${e.id} 第 ${a + 1} 次执行失败,将尝试让AI修复后重试(剩余重试次数:${n - a}):`,\n l\n );\n }\n throw new Error(`步骤 ${e.id} (${e.content}) 执行失败: 未知错误`);\n }\n /**\n * 从大模型响应中提取代码(容错处理)\n * 优先尝试从 ##code## 标记中提取,如果没有则尝试从 markdown 代码块中提取\n * @param response 大模型响应文本\n * @returns 提取的代码字符串\n */\n extractCodeFromResponse(e) {\n const t = e.match(/##code##\\s*([\\s\\S]*?)(?=##|$)/);\n if (t) {\n let r = t[1].trim();\n if (r = r.replace(/^```javascript\\n?/, \"\").replace(/^```js\\n?/, \"\").replace(/^```\\n?/, \"\").replace(/\\n?```$/, \"\"), r.length > 0)\n return r;\n }\n const n = [\n /```javascript\\s*([\\s\\S]*?)```/i,\n // ```javascript ... ```\n /```js\\s*([\\s\\S]*?)```/i,\n // ```js ... ```\n /```\\s*([\\s\\S]*?)```/\n // ``` ... ```(通用代码块)\n ];\n for (const r of n) {\n const a = e.match(r);\n if (a && a[1]) {\n const l = a[1].trim();\n if (l.length > 0)\n return this.config?.debug && console.warn(\"[AI Manager] 未找到 ##code## 标记,从 markdown 代码块中提取代码\"), l;\n }\n }\n const i = /[请|说明|注意|需要|应该|可以|如果|但是|因为|所以|例如|比如]/i.test(e), o = /(function|const|let|var|return|async|await|=>|engine\\.|previousStepOutput)/.test(e);\n if (!i && o) {\n const a = e.trim().replace(/^[,。:;!?\\s]+/, \"\").replace(/[,。:;!?\\s]+$/, \"\");\n if (a.length > 10)\n return this.config?.debug && console.warn(\"[AI Manager] 未找到 ##code## 标记和代码块,尝试使用整个响应作为代码\"), a;\n }\n throw new Error(`无法从大模型响应中提取代码。响应内容:${e.substring(0, 200)}...`);\n }\n /**\n * 生成代码\n */\n async generateCode(e, t) {\n try {\n const n = {\n role: \"system\",\n content: `${this.prompts.step}`\n }, i = {\n role: \"system\",\n content: `\n\n## BIM引擎API文档\n${this.prompts.apiDoc}`\n }, o = {\n role: \"user\",\n content: `请根据以下步骤描述生成可执行的JavaScript代码:\n\n步骤信息:\n${JSON.stringify(e, null, 2)}\n\n前序步骤输出数据:\n${t ? JSON.stringify(t, null, 2) : \"null\"}\n\n请严格按照##code##格式输出代码。`\n }, r = [n, i, o], a = await this.llmApi.chat(r);\n return this.extractCodeFromResponse(a);\n } catch (n) {\n throw console.error(\"[AI Manager] 代码生成失败:\", n), n;\n }\n }\n /**\n * 执行失败后,让 AI 基于“错误信息 + 上一次代码”进行修复再生成\n * @param attempt 当前是第几次重试(从 1 开始)\n */\n async regenerateCodeAfterFailure(e, t, n, i, o) {\n try {\n const r = {\n role: \"system\",\n content: `${this.prompts.step}`\n }, a = {\n role: \"system\",\n content: `\n\n## BIM引擎API文档\n${this.prompts.apiDoc}`\n }, l = {\n message: i?.message || (i instanceof Object ? JSON.stringify(i) : String(i)),\n name: i?.name,\n stack: i?.stack\n }, h = {\n role: \"user\",\n content: `上一次生成的代码在执行时失败了,请你修复后重新输出完整可执行的 JavaScript 代码(仍然要严格按 ##code## 格式输出)。\n\n当前步骤信息:\n${JSON.stringify(e, null, 2)}\n\n前序步骤输出数据:\n${t ? JSON.stringify(t, null, 2) : \"null\"}\n\n上一次生成的代码:\n${n ? `\n\\`\\`\\`javascript\n${n}\n\\`\\`\\`\n` : `\n(无)\n`}\n\n执行错误信息(第 ${o} 次重试前):\n${JSON.stringify(l, null, 2)}\n\n修复要求(请务必遵守):\n1) 不要输出解释文字,只输出 ##code## 段落里的代码\n2) 如果是语法错误/引用未定义/缺少 await/返回值不一致,请直接修复\n3) 尽量保持与步骤目标一致,避免引入与步骤无关的副作用\n4) 代码需要能在浏览器环境运行(不要使用 Node 专属 API)`\n }, c = await this.llmApi.chat([r, a, h]);\n try {\n return this.extractCodeFromResponse(c);\n } catch (u) {\n throw new Error(`无法从大模型响应中提取代码(修复重试阶段):${u.message}`);\n }\n } catch (r) {\n throw console.error(\"[AI Manager] 修复后代码生成失败:\", r), r;\n }\n }\n /**\n * 执行代码\n */\n async executeCode(e, t) {\n try {\n const n = this.engine;\n let i = e;\n i = i.replace(/\\b(const|let|var)\\s+previousStepOutput\\s*=\\s*[^;]*;/g, \"\"), i = i.replace(/\\b(const|let|var)\\s+previousStepOutput\\s*;/g, \"\");\n const r = new Function(\"engine\", \"previousStepOutput\", `\n 'use strict';\n ${i}\n `)(n, t);\n return r && typeof r.then == \"function\" ? await r : r;\n } catch (n) {\n return console.error(\"[AI Manager] 代码执行失败:\", n), \"error\" + n.message;\n }\n }\n /**\n * 重置对话\n */\n reset() {\n this.conversationHistory = [], this.steps = [], this.stepResults.clear(), this.state = \"idle\", this.config?.debug && console.log(\"[AI Manager] 对话已重置\");\n }\n /**\n * 获取当前状态\n */\n getState() {\n return this.state;\n }\n /**\n * 获取对话历史\n */\n getHistory() {\n return [...this.conversationHistory];\n }\n /**\n * 获取步骤列表\n */\n getSteps() {\n return [...this.steps];\n }\n /**\n * 获取步骤结果\n */\n getStepResults() {\n return new Map(this.stepResults);\n }\n}\nclass hp {\n // 引擎参数\n options;\n DeviceType;\n animationId = null;\n isRenderingPaused = !1;\n controlsEnabledBeforePause = !0;\n animate;\n onWindowResize;\n // 基础模块\n scene;\n camera;\n renderer;\n sceneModule;\n cameraModule;\n deviceModule;\n renderModule;\n controlModule;\n composerModule;\n loaderModule;\n engineStatus;\n events;\n lightModule;\n interactionModule;\n modelToolModule;\n worldToScreen;\n handelBehaved;\n octreeBox;\n controls;\n stats;\n catchSvg;\n // 功能模块 \n viewCube;\n rangeScale;\n setting;\n measure;\n clipping;\n modelTree;\n engineInfo;\n modelProperties;\n modelMapperBatch;\n modelEdge;\n ai;\n // 业务数据\n models = [];\n reactBoundingClientRect = { left: 0, top: 0 };\n // 引擎容器\n container;\n constructor(e) {\n if (this.options = e, this.container = document.getElementById(e.containerId), !this.container)\n throw new Error(`Container ${e.containerId} not found`);\n this.ai = new cp(this), this.ai.init(), this.deviceModule = new Bl(this), this.DeviceType = this.deviceModule.getDeviceType(), this.cameraModule = new Ll(this), this.sceneModule = new Dl(this), this.scene = this.sceneModule.scene, this.renderModule = new Il(this), this.renderer = this.renderModule.createRenderer(), this.camera = this.cameraModule.orthographicCamera, this.scene.camera = this.camera, this.controlModule = new Yl(this), this.controlModule.switchDefaultMode(), this.controls = this.controlModule.orbitControls, this.composerModule = new uc(this), this.composerModule.init(), this.events = new zu(), this.engineStatus = new Iu(this), this.engineStatus.init(), this.loaderModule = new Bu(this), this.lightModule = new Nu(this), this.lightModule.init(), this.viewCube = new Zu(this), this.viewCube.init(), this.octreeBox = Yu(this), this.rangeScale = new $u(this), this.rangeScale.init(), this.clipping = new np(this), this.clipping.init(), this.setting = new Ju(this), this.setting.init(), this.handelBehaved = tr(this), this.modelMapperBatch = new op(this), this.measure = new lf(this), this.modelToolModule = new Uu(this), this.modelProperties = new rp(this), this.interactionModule = new Ou(this), this.interactionModule.init(), this.interactionModule.active(), this.modelEdge = new ap(this), this.modelTree = new ip(this), this.engineInfo = new sp(this), this.worldToScreen = new Ge(this.camera, this.renderer, this.scene), this.reactBoundingClientRect = this.container.getBoundingClientRect(), this.stats = new Hu(), this.stats.showPanel(0), this.stats.dom.style.position = \"absolute\", this.stats.dom.style.top = \"0px\", this.stats.dom.style.left = \"0px\", this.stats.dom.style.zIndex = \"1000\", this.container.appendChild(this.stats.dom);\n let t = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n t.style.position = \"absolute\", t.style.width = \"100%\", t.style.height = \"100%\", t.style.zIndex = \"1000\", t.style.left = \"0px\", t.style.top = \"0px\", t.style.pointerEvents = \"none\";\n const n = this.renderer?.domElement.width || 1920, i = this.renderer?.domElement.height || 1080;\n t.setAttribute(\"viewBox\", `0 0 ${n} ${i}`), t.setAttribute(\"preserveAspectRatio\", \"none\"), this.container.appendChild(t), this.catchSvg = t, this.onWindowResize = () => {\n this.handleWindowResize();\n }, window.addEventListener(\"resize\", this.onWindowResize), this.animate = () => {\n if (!this.isRenderingPaused)\n this.animationId = requestAnimationFrame(this.animate);\n else {\n this.animationId = null;\n return;\n }\n this.stats && this.stats.begin(), this.composerModule && this.composerModule.composer.render(), this.viewCube.cubeTool.RenderScene(), this.measure.update(), this.controlModule.update(), this.stats && this.stats.end();\n }, this.animate();\n }\n /**\n * 暂停渲染循环\n */\n pauseRendering() {\n if (this.isRenderingPaused) {\n console.warn(\"[BimEngine] Rendering is already paused\");\n return;\n }\n this.isRenderingPaused = !0, this.controls && (this.controlsEnabledBeforePause = this.controls.enabled, this.controls.enabled = !1);\n }\n /**\n * 恢复渲染循环\n */\n resumeRendering() {\n if (!this.isRenderingPaused) {\n console.warn(\"[BimEngine] Rendering is not paused\");\n return;\n }\n this.isRenderingPaused = !1, this.controls && (this.controls.enabled = this.controlsEnabledBeforePause), this.animationId === null && this.animate();\n }\n /**\n * 检查渲染是否暂停\n */\n isRenderingPausedState() {\n return this.isRenderingPaused;\n }\n /**\n * 处理窗口大小变化\n */\n handleWindowResize() {\n if (!this.container || !this.renderer || !this.camera)\n return;\n this.reactBoundingClientRect = this.container.getBoundingClientRect();\n const { width: e, height: t } = this.deviceModule.getContainerSize();\n this.renderer.setSize(e, t);\n const n = e / t;\n if (this.camera === this.cameraModule.perspectiveCamera ? (this.cameraModule.perspectiveCamera.aspect = n, this.cameraModule.perspectiveCamera.updateProjectionMatrix()) : this.camera === this.cameraModule.orthographicCamera && (this.cameraModule.orthographicCamera.left = 50 * n / -2, this.cameraModule.orthographicCamera.right = 50 * n / 2, this.cameraModule.orthographicCamera.top = 50 / 2, this.cameraModule.orthographicCamera.bottom = 50 / -2, this.cameraModule.orthographicCamera.updateProjectionMatrix()), this.composerModule && this.composerModule.composer && this.composerModule.composer.setSize(e, t), this.catchSvg) {\n const i = this.renderer.domElement.width, o = this.renderer.domElement.height;\n this.catchSvg.setAttribute(\"viewBox\", `0 0 ${i} ${o}`);\n }\n this.events && this.events.trigger(_n.ViewportResize, { width: e, height: t });\n }\n /**\n * 销毁引擎,释放资源\n */\n dispose() {\n console.log(\"[BimEngine] Starting engine disposal...\"), this.animationId !== null && (cancelAnimationFrame(this.animationId), this.animationId = null), this.isRenderingPaused = !0, this.onWindowResize && window.removeEventListener(\"resize\", this.onWindowResize);\n try {\n this.measure && (this.measure.disActive(), this.measure.clearAll(), this.measure.annotationContainer && this.measure.annotationContainer.remove()), this.clipping && this.clipping.disActive(), this.interactionModule && this.interactionModule.disActive(), this.viewCube && this.viewCube.cubeTool && typeof this.viewCube.cubeTool.dispose == \"function\" && this.viewCube.cubeTool.dispose();\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing managers:\", e);\n }\n try {\n this.controlModule && (this.controlModule.originDiv && this.controlModule.originDiv.remove(), this.controlModule.orbitControls && typeof this.controlModule.orbitControls.dispose == \"function\" && this.controlModule.orbitControls.dispose(), this.controlModule.firstPersonControls && typeof this.controlModule.firstPersonControls.dispose == \"function\" && this.controlModule.firstPersonControls.dispose());\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing controls:\", e);\n }\n this.scene && this.clearScene(this.scene);\n try {\n this.composerModule && this.composerModule.composer && (this.composerModule.composer.passes && this.composerModule.composer.passes.forEach((e) => {\n e.dispose && e.dispose();\n }), this.composerModule.composer.renderTarget1 && this.composerModule.composer.renderTarget1.dispose(), this.composerModule.composer.renderTarget2 && this.composerModule.composer.renderTarget2.dispose());\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing composer:\", e);\n }\n try {\n this.renderModule && this.renderModule.disposeRenderer(), this.renderer && (this.renderer.domElement && this.renderer.domElement.parentElement && this.renderer.domElement.parentElement.removeChild(this.renderer.domElement), this.renderer.dispose(), this.renderer.forceContextLoss());\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing renderer:\", e);\n }\n try {\n this.stats && this.stats.dom && this.stats.dom.parentElement && this.stats.dom.parentElement.removeChild(this.stats.dom), this.catchSvg && this.catchSvg.parentElement && this.catchSvg.parentElement.removeChild(this.catchSvg);\n } catch (e) {\n console.warn(\"[BimEngine] Error disposing DOM elements:\", e);\n }\n try {\n this.events && this.events.listeners && this.events.listeners.clear();\n } catch (e) {\n console.warn(\"[BimEngine] Error clearing event listeners:\", e);\n }\n this.scene = null, this.camera = null, this.renderer = null, this.controls = null, this.models = [], this.container = null, console.log(\"[BimEngine] Engine disposal completed\");\n }\n /**\n * 递归清理场景中的所有对象\n */\n clearScene(e) {\n if (!e) return;\n [...e.children].forEach((n) => {\n this.clearScene(n);\n }), e.parent && e.parent.remove(e), e instanceof E.Mesh && (e.geometry && e.geometry.dispose(), e.material && (Array.isArray(e.material) ? e.material.forEach((n) => this.disposeMaterial(n)) : this.disposeMaterial(e.material))), e instanceof E.Line && (e.geometry && e.geometry.dispose(), e.material && this.disposeMaterial(e.material)), e instanceof E.Points && (e.geometry && e.geometry.dispose(), e.material && this.disposeMaterial(e.material)), e instanceof E.InstancedMesh && (e.geometry && e.geometry.dispose(), e.material && (Array.isArray(e.material) ? e.material.forEach((n) => this.disposeMaterial(n)) : this.disposeMaterial(e.material)), e.instanceMatrix && (e.instanceMatrix = null), e.instanceColor && (e.instanceColor = null)), e instanceof E.Sprite && e.material && this.disposeMaterial(e.material);\n }\n /**\n * 清理材质及其纹理\n */\n disposeMaterial(e) {\n if (!e) return;\n [\n \"map\",\n \"lightMap\",\n \"bumpMap\",\n \"normalMap\",\n \"specularMap\",\n \"envMap\",\n \"alphaMap\",\n \"aoMap\",\n \"displacementMap\",\n \"emissiveMap\",\n \"gradientMap\",\n \"metalnessMap\",\n \"roughnessMap\",\n \"clearcoatMap\",\n \"clearcoatNormalMap\",\n \"clearcoatRoughnessMap\",\n \"transmissionMap\",\n \"thicknessMap\",\n \"sheenColorMap\",\n \"sheenRoughnessMap\",\n \"specularIntensityMap\",\n \"specularColorMap\",\n \"iridescenceMap\",\n \"iridescenceThicknessMap\"\n ].forEach((n) => {\n const i = e[n];\n i && i instanceof E.Texture && i.dispose();\n }), e.dispose();\n }\n}\nfunction kp(s) {\n return new hp(s);\n}\nexport {\n kp as createEngine\n};\n//# sourceMappingURL=bim-engine-sdk.es.js.map\n","import type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { themeManager } from '../../services/theme';\nimport type { EngineOptions, ModelLoadOptions } from './types';\nimport type { MeasureMode } from '../../types/measure';\nimport type { SectionBoxRange } from '../section-box-panel/types';\nimport { ManagerRegistry } from '../../core/manager-registry';\n// 导入第三方 SDK 的 createEngine 函数(从 npm 包引入)\n// import { createEngine as createEngineSDK } from 'iflow-engine-base';\nimport { createEngine as createEngineSDK } from '../../../../bim_engine_base/dist/bim-engine-sdk.es';\n\n\n// 重新导出类型,方便外部引用\nexport type { EngineOptions, ModelLoadOptions };\n\n/**\n * 创建 Engine 实例的工厂函数\n * 兼容旧代码直接 import { createEngine } 的方式\n */\nexport const createEngine = (options: EngineOptions) => {\n return new Engine(options);\n};\n\n/**\n * 3D 引擎组件\n * 负责创建和管理第三方 3D 引擎实例\n */\nexport class Engine implements IBimComponent {\n /** 第三方 3D 引擎实例 */\n private engine: any = null;\n /** 引擎挂载的容器元素 */\n private container: HTMLElement;\n /** 引擎容器 ID(用于传递给 createEngine) */\n private containerId: string;\n /** 引擎配置选项(不包含 container) */\n private options: Omit;\n /** 是否已初始化 */\n private _isInitialized = false;\n /** 是否已销毁 */\n private _isDestroyed = false;\n /** 主题订阅取消函数 */\n private unsubscribeTheme: (() => void) | null = null;\n /** 当前激活的测量类型 */\n private currentMeasureType: MeasureMode | null = null;\n /** 主测量功能是否已激活 */\n private isMeasureActive: boolean = false;\n /** 当前激活的剖切轴向 */\n private currentSectionAxis: 'x' | 'y' | 'z' | null = null;\n /** 剖切盒是否激活 */\n private isSectionBoxActive: boolean = false;\n /** 当前选中的构件信息 */\n private selectedComponent: { url: string; id: string } | null = null;\n\n /**\n * 构造函数\n * @param options 3D 引擎配置选项\n */\n constructor(options: EngineOptions) {\n // 解析容器元素\n this.container = options.container;\n // 如果容器没有 id,生成一个唯一的 id\n if (!this.container.id) {\n this.containerId = `engine-container-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n this.container.id = this.containerId;\n } else {\n this.containerId = this.container.id;\n }\n\n // 保存配置选项(设置默认值)\n this.options = {\n backgroundColor: 'linear-gradient(to bottom, rgb(214, 224, 235), rgb(246, 250, 255))', // 固定背景渐变色\n version: options.version ?? 'v2', // 默认使用 v2 版本\n showStats: options.showStats ?? false, // 默认不显示统计\n showViewCube: options.showViewCube ?? true, // 默认显示视图立方体\n };\n }\n\n /**\n * 初始化组件 (接口实现)\n * 创建 div 容器并初始化引擎\n */\n public init(): void {\n if (this._isInitialized) {\n console.warn('[Engine] Engine already initialized.');\n return;\n }\n\n if (this._isDestroyed) {\n console.error('[Engine] Cannot initialize destroyed engine.');\n return;\n }\n\n try {\n // 应用背景色到容器\n if (typeof this.options.backgroundColor === 'string') {\n this.container.style.background = this.options.backgroundColor;\n }\n\n // 创建引擎配置对象\n const engineConfig = {\n containerId: this.containerId,\n backgroundColor: this.options.backgroundColor,\n version: this.options.version,\n showStats: this.options.showStats,\n showViewCube: this.options.showViewCube,\n };\n\n // 输出配置信息\n console.log('引擎配置信息:', engineConfig);\n\n // 调用引擎创建函数创建引擎实例\n // 将 options 中的配置复制给 createEngine\n this.engine = createEngineSDK(engineConfig);\n\n if (!this.engine) {\n throw new Error('Failed to create engine instance');\n }\n\n // 标记为已初始化\n this._isInitialized = true;\n\n // 订阅主题变化\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 应用当前主题\n this.setTheme(themeManager.getTheme());\n\n // 监听构件点击事件\n this.engine.events.on('click', (hit: any) => {\n const registry = ManagerRegistry.getInstance();\n if (hit && hit.object) {\n this.selectedComponent = {\n url: hit.object.url,\n id: hit.object.name\n };\n console.log('[Engine] 构件选中:', this.selectedComponent);\n registry.emit('component:selected', this.selectedComponent);\n } else {\n this.selectedComponent = null;\n console.log('[Engine] 取消选中');\n registry.emit('component:deselected', {});\n }\n });\n } catch (error) {\n console.error('[Engine] Failed to initialize engine:', error);\n this._isInitialized = false;\n throw error;\n }\n }\n\n /**\n * 设置主题 (接口实现)\n * 根据主题调整 3D 引擎的视觉效果(如背景色)\n * @param theme 全局主题配置\n */\n public setTheme(_theme: ThemeConfig): void {\n\n }\n\n /**\n * 设置语言 (接口实现)\n */\n public setLocales(): void {\n // 3D 引擎组件暂时不需要本地化\n }\n\n /**\n * 检查是否已初始化\n */\n public isInitialized(): boolean {\n return this._isInitialized;\n }\n\n\n /**\n * 加载 3D 模型\n * @param url 模型文件 URL\n * @param options 加载选项(位置、旋转、缩放)\n */\n public loadModel(url: string, options?: ModelLoadOptions): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Engine not initialized. Please call init() first.');\n return;\n }\n if (!url) {\n console.error('[Engine] Model URL is required.');\n return;\n }\n this.engine.loaderModule.loadModels([url], options);\n }\n\n /**\n * 回到主视角\n * @returns \n */\n public CameraGoHome() {\n this.engine.viewCube.CameraGoHome();\n }\n\n /**\n * 获取原始 3D 引擎实例\n */\n public getEngine(): any {\n return this.engine;\n }\n\n /**\n * 暂停渲染\n */\n public pauseRendering(): void {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return;\n }\n this.engine.pauseRendering();\n }\n\n /**\n * 恢复渲染\n */\n public resumeRendering(): void {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return;\n }\n this.engine.resumeRendering();\n }\n\n /**\n * 销毁 3D 引擎,释放 GPU 资源\n */\n public dispose(): void {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return;\n }\n this.engine.dispose();\n }\n\n // ==================== 测量功能方法 ====================\n\n /**\n * 激活具体测量类型的统一入口(私有方法)\n * @param type 测量类型\n * @param activateFunc 第三方引擎的激活函数\n */\n private activateMeasureType(type: MeasureMode, activateFunc: () => void): void {\n // 1. 检查引擎是否初始化\n if (!this._isInitialized || !this.engine) {\n console.error('Cannot activate measure: engine not initialized.');\n return;\n }\n\n // 2. 检查 measure 模块是否存在\n if (!this.engine.measure) {\n console.error('Measure module not available.');\n return;\n }\n\n if (!this.isMeasureActive) {\n console.log('激活测量功能');\n this.engine.measure.active();\n this.isMeasureActive = true;\n }\n\n // 4. 激活具体的测量类型(直接切换,不需要停用前一个)\n activateFunc();\n this.currentMeasureType = type;\n }\n\n /**\n * 激活距离测量\n */\n public activateDistanceMeasure(): void {\n this.activateMeasureType('distance', () => {\n console.log(`激活距离测量`);\n this.engine.measure.distanceMeasure.active();\n });\n }\n\n /**\n * 激活最小距离测量\n */\n public activateMinDistanceMeasure(): void {\n this.activateMeasureType('minDistance', () => {\n console.log(`激活最小距离测量`);\n this.engine.measure.clearDistanceMeasure.active();\n });\n }\n\n /**\n * 激活角度测量\n */\n public activateAngleMeasure(): void {\n this.activateMeasureType('angle', () => {\n console.log(`激活角度测量`);\n this.engine.measure.angleMeasure.active();\n console.log('[Engine] Angle measure activated (placeholder)');\n });\n }\n\n /**\n * 激活标高测量\n */\n public activateElevationMeasure(): void {\n this.activateMeasureType('elevation', () => {\n console.log(`激活标高测量`);\n this.engine.measure.elevationMeasure.active();\n });\n }\n\n /**\n * 激活体积测量\n */\n public activateVolumeMeasure(): void {\n this.activateMeasureType('volume', () => {\n console.log(`激活体积测量`);\n this.engine.measure.areaMeasure.active();\n });\n }\n\n /**\n * 激活激光测距\n */\n public activateLaserDistanceMeasure(): void {\n this.activateMeasureType('laserDistance', () => {\n // TODO: 调用第三方引擎方法(当前先空着)\n // this.engine.measure.laserDistanceMeasure.active();\n console.log('[Engine] Laser distance measure activated (placeholder)');\n });\n }\n\n /**\n * 激活坡度测量\n */\n public activateSlopeMeasure(): void {\n this.activateMeasureType('slope', () => {\n console.log(`激活坡度测量`);\n this.engine.measure.slopeMeasure.active();\n });\n }\n\n /**\n * 激活空间体积测量\n */\n public activateSpaceVolumeMeasure(): void {\n this.activateMeasureType('spaceVolume', () => {\n // TODO: 调用第三方引擎方法(当前先空着)\n // this.engine.measure.spaceVolumeMeasure.active();\n console.log('[Engine] Space volume measure activated (placeholder)');\n });\n }\n\n /**\n * 激活测量功能(根据类型统一入口)\n * @param mode 测量类型\n */\n public activateMeasure(mode: MeasureMode): void {\n switch (mode) {\n case 'distance':\n this.activateDistanceMeasure();\n break;\n case 'minDistance':\n this.activateMinDistanceMeasure();\n break;\n case 'angle':\n this.activateAngleMeasure();\n break;\n case 'elevation':\n this.activateElevationMeasure();\n break;\n case 'volume':\n this.activateVolumeMeasure();\n break;\n case 'laserDistance':\n this.activateLaserDistanceMeasure();\n break;\n case 'slope':\n this.activateSlopeMeasure();\n break;\n case 'spaceVolume':\n this.activateSpaceVolumeMeasure();\n break;\n }\n }\n\n /**\n * 停用测量功能(关闭测量时调用)\n */\n public deactivateMeasure(): void {\n if (!this._isInitialized || !this.engine?.measure) {\n return;\n }\n\n if (!this.isMeasureActive) {\n return;\n }\n\n console.log('停用测量功能');\n this.engine.measure.disActive();\n this.isMeasureActive = false;\n this.currentMeasureType = null;\n }\n\n /**\n * 获取当前激活的测量类型\n * @returns 当前测量类型,如果未激活则返回 null\n */\n public getCurrentMeasureType(): MeasureMode | null {\n return this.currentMeasureType;\n }\n\n /**\n * 清除所有测量标注\n */\n public clearAllMeasures(): void {\n if (!this._isInitialized || !this.engine?.measure) {\n return;\n }\n console.log('清除所有测量标注');\n this.engine.measure.clearAll();\n }\n\n // ==================== 结束:测量功能方法 ====================\n\n // ==================== 轴向剖切功能 ====================\n\n /**\n * 激活轴向剖切\n * @param axis 要激活的轴向 ('x' | 'y' | 'z')\n * @remarks\n * - 如果传入的轴向与当前激活的轴向相同,则静默返回(幂等操作)\n * - 如果当前有不同的轴向激活,先调用该轴向的 disActive() 再激活新轴向\n * - 使用单个 plane 的 disActive() 而非 clipping.disActive(),避免影响其他剖切功能\n * - 如果引擎未初始化或 clipping 模块不可用,方法会静默返回并输出错误日志\n */\n public activateSectionAxis(axis: 'x' | 'y' | 'z'): void {\n // 1. 检查引擎初始化\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Cannot activate section axis: engine not initialized.');\n return;\n }\n \n // 2. 检查 clipping 模块\n if (!this.engine.clipping) {\n console.error('[Engine] Clipping module not available.');\n return;\n }\n \n // 3. 如果是同一轴向,静默返回(幂等操作)\n if (this.currentSectionAxis === axis) {\n console.log(`[Engine] Section axis ${axis} already active, skipping.`);\n return;\n }\n \n // 4. 如果当前有激活的轴向且不同,先停用当前轴向\n if (this.currentSectionAxis) {\n this.deactivateCurrentSectionAxis();\n }\n \n // 5. 激活新轴向\n const planeMap: Record<'x' | 'y' | 'z', any> = {\n 'x': this.engine.clipping.sectionPlaneX,\n 'y': this.engine.clipping.sectionPlaneY,\n 'z': this.engine.clipping.sectionPlaneZ\n };\n const plane = planeMap[axis];\n \n if (plane && typeof plane.active === 'function') {\n console.log(`[Engine] Activating section axis: ${axis}`);\n plane.active();\n this.currentSectionAxis = axis;\n } else {\n console.error(`[Engine] Section plane ${axis} not available.`);\n }\n }\n\n /**\n * 停用当前轴向剖切(内部方法)\n * @remarks 只停用当前激活的单个轴向,不影响其他剖切功能\n */\n private deactivateCurrentSectionAxis(): void {\n if (!this.currentSectionAxis || !this.engine?.clipping) {\n return;\n }\n \n const planeMap: Record<'x' | 'y' | 'z', any> = {\n 'x': this.engine.clipping.sectionPlaneX,\n 'y': this.engine.clipping.sectionPlaneY,\n 'z': this.engine.clipping.sectionPlaneZ\n };\n const plane = planeMap[this.currentSectionAxis];\n \n if (plane && typeof plane.disActive === 'function') {\n console.log(`[Engine] Deactivating section axis: ${this.currentSectionAxis}`);\n plane.disActive();\n }\n }\n\n /**\n * 停用轴向剖切(公共方法,关闭弹窗时调用)\n * @remarks 使用 clipping.disActive() 停用所有剖切,清理状态\n */\n public deactivateSectionAxis(): void {\n if (!this._isInitialized || !this.engine?.clipping) {\n return;\n }\n \n if (this.currentSectionAxis) {\n console.log('[Engine] Deactivating all section axis');\n this.engine.clipping.disActive();\n this.currentSectionAxis = null;\n }\n }\n\n /**\n * 获取当前剖切轴向\n * @returns 当前激活的轴向,如果未激活则返回 null\n */\n public getCurrentSectionAxis(): 'x' | 'y' | 'z' | null {\n return this.currentSectionAxis;\n }\n\n // ==================== 结束:轴向剖切功能 ====================\n\n // ==================== 剖切盒功能 ====================\n\n /** 激活剖切盒 */\n public activateSectionBox(): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Cannot activate section box: engine not initialized.');\n return;\n }\n\n if (!this.engine.clipping?.sectionBox) {\n console.error('[Engine] Section box module not available.');\n return;\n }\n\n if (this.isSectionBoxActive) {\n console.log('[Engine] Section box already active, skipping.');\n return;\n }\n\n console.log('[Engine] Activating section box');\n this.engine.clipping.sectionBox.active();\n this.isSectionBoxActive = true;\n }\n\n /** 停用剖切盒 */\n public deactivateSectionBox(): void {\n if (!this._isInitialized || !this.engine?.clipping?.sectionBox) {\n return;\n }\n\n if (!this.isSectionBoxActive) {\n return;\n }\n\n console.log('[Engine] Deactivating section box');\n this.engine.clipping.sectionBox.disActive();\n this.isSectionBoxActive = false;\n }\n\n /** 设置剖切盒范围(百分比 0-100) */\n public setSectionBoxRange(range: SectionBoxRange): void {\n if (!this._isInitialized || !this.engine?.clipping?.sectionBox) {\n console.error('[Engine] Cannot set section box range: engine not initialized.');\n return;\n }\n\n console.log('[Engine] Setting section box range:', range);\n this.engine.clipping.sectionBox.setboxPercent(range);\n }\n\n /** 适应剖切盒到模型(将范围设置为整个模型包围盒) */\n public fitSectionBoxToModel(): void {\n if (!this._isInitialized || !this.engine?.clipping?.sectionBox) {\n console.error('[Engine] Cannot fit section box: engine not initialized.');\n return;\n }\n\n const box = this.engine.octreeBox?.getBoundingBox();\n if (!box) {\n console.error('[Engine] Cannot fit section box: model bounding box not available.');\n return;\n }\n\n console.log('[Engine] Fitting section box to model');\n this.engine.clipping.sectionBox.setBox(box);\n }\n\n /**\n * 重置剖切盒\n * @remarks 将剖切盒范围恢复为整个模型的包围盒\n */\n public resetSectionBox(): void {\n this.fitSectionBoxToModel();\n }\n\n // ==================== 结束:剖切盒功能 ====================\n\n // ==================== 漫游功能 ====================\n\n /** 漫游模式是否激活 */\n private isWalkModeActive: boolean = false;\n\n /**\n * 激活第一人称漫游模式\n * @remarks 切换到第一人称控制器,禁用轨道控制器\n */\n public activateFirstPersonMode(): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Cannot activate first person mode: engine not initialized.');\n return;\n }\n\n if (!this.engine.controlModule) {\n console.error('[Engine] Control module not available.');\n return;\n }\n\n if (this.isWalkModeActive) {\n console.log('[Engine] First person mode already active, skipping.');\n return;\n }\n\n console.log('[Engine] Activating first person mode');\n this.engine.controlModule.switchFirstPersonMode();\n this.isWalkModeActive = true;\n }\n\n /**\n * 停用第一人称漫游模式\n * @remarks 切换回轨道控制器\n */\n public deactivateFirstPersonMode(): void {\n if (!this._isInitialized || !this.engine?.controlModule) {\n return;\n }\n\n if (!this.isWalkModeActive) {\n return;\n }\n\n console.log('[Engine] Deactivating first person mode');\n this.engine.controlModule.switchDefaultMode();\n this.isWalkModeActive = false;\n }\n\n /**\n * 设置漫游移动速度\n * @param speed 移动速度(默认 0.02)\n */\n public setWalkSpeed(speed: number): void {\n if (!this._isInitialized || !this.engine?.controlModule?.firstPersonControls) {\n console.error('[Engine] Cannot set walk speed: engine not initialized.');\n return;\n }\n\n console.log('[Engine] Setting walk speed:', speed);\n this.engine.controlModule.firstPersonControls.moveSpeed = speed;\n }\n\n /**\n * 设置漫游重力开关\n * @param enabled 是否启用重力\n */\n public setWalkGravity(enabled: boolean): void {\n if (!this._isInitialized || !this.engine?.controlModule?.firstPersonControls) {\n console.error('[Engine] Cannot set walk gravity: engine not initialized.');\n return;\n }\n\n console.log('[Engine] Setting walk gravity:', enabled);\n this.engine.controlModule.firstPersonControls.applyGravity = enabled;\n }\n\n /**\n * 设置漫游碰撞检测开关\n * @param enabled 是否启用碰撞检测\n */\n public setWalkCollision(enabled: boolean): void {\n if (!this._isInitialized || !this.engine?.controlModule?.firstPersonControls) {\n console.error('[Engine] Cannot set walk collision: engine not initialized.');\n return;\n }\n\n console.log('[Engine] Setting walk collision:', enabled);\n this.engine.controlModule.firstPersonControls.applyCollision = enabled;\n }\n\n /**\n * 获取漫游模式是否激活\n * @returns 是否处于漫游模式\n */\n public isFirstPersonModeActive(): boolean {\n return this.isWalkModeActive;\n }\n\n // ==================== 结束:漫游功能 ====================\n\n // ==================== 构件选中 ====================\n\n /**\n * 获取当前选中的构件\n * @returns 选中构件的 URL 和 ID,未选中时返回 null\n */\n public getSelectedComponent(): { url: string; id: string } | null {\n return this.selectedComponent;\n }\n\n /**\n * 获取构件属性\n * @param url 模型 URL\n * @param id 构件 ID\n * @param callback 回调函数,接收属性数据\n */\n public getComponentProperties(\n url: string,\n id: string,\n callback: (data: any) => void\n ): void {\n if (!this._isInitialized || !this.engine) {\n console.error('[Engine] Cannot get component properties: engine not initialized.');\n return;\n }\n\n if (!this.engine.modelProperties) {\n console.error('[Engine] modelProperties not available');\n return;\n }\n\n console.log('[Engine] Getting component properties:', { url, id });\n this.engine.modelProperties.getModelProperties(url, id, callback);\n }\n\n // ==================== 结束:构件选中 ====================\n\n // ==================== 模型树 ====================\n\n public getTypeTreeData(): any[] {\n if (!this._isInitialized || !this.engine?.modelTree) {\n return [];\n }\n return this.engine.modelTree.getTypeTreeData();\n }\n\n public getLevelTreeData(): any[] {\n if (!this._isInitialized || !this.engine?.modelTree) {\n return [];\n }\n return this.engine.modelTree.getLevelTreeData();\n }\n\n public getMajorTreeData(): any[] {\n if (!this._isInitialized || !this.engine?.modelTree) {\n return [];\n }\n return this.engine.modelTree.getMajorTreeData();\n }\n\n // ==================== 结束:模型树 ====================\n\n /** 激活框选放大功能 */\n public activateZoomBox(): void {\n if (!this._isInitialized || !this.engine) {\n console.warn('[Engine] Engine not initialized.');\n return;\n }\n this.engine.rangeScale?.active();\n }\n\n /**\n * 销毁组件 (接口实现)\n * 清理资源、取消订阅、销毁引擎实例\n */\n public destroy(): void {\n if (this._isDestroyed) {\n return;\n }\n\n // 停用测量功能\n this.deactivateMeasure();\n\n // 取消主题订阅\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n\n // 销毁 3D 引擎,释放 GPU 资源\n if (this.engine) {\n this.engine.dispose();\n this.engine = null;\n }\n\n // 清理容器\n this.container.innerHTML = '';\n\n // 更新状态\n this.currentMeasureType = null;\n this.isMeasureActive = false;\n this._isDestroyed = true;\n this._isInitialized = false;\n }\n}\n\n\n","import { IBimComponent } from '../../types/component';\nimport { ThemeConfig } from '../../themes/types';\nimport { IRightKeyContent, RightKeyOptions } from './types';\nimport './index.css';\n\n/**\n * 右键浮层容器组件 (RightKey)\n * 这是一个纯粹的定位容器,负责在屏幕指定位置显示内容。\n * 它不关心具体内容是什么,只处理定位、边界检测和关闭逻辑。\n */\nexport class BimRightKey implements IBimComponent {\n private element: HTMLElement;\n private content: IRightKeyContent | null = null;\n private isVisible: boolean = false;\n private onCloseCallback?: () => void;\n private options?: RightKeyOptions;\n \n private mouseDownTime: number = 0;\n private readonly CLICK_THRESHOLD: number = 200; // ms\n\n constructor(options?: RightKeyOptions) {\n this.options = options;\n this.element = document.createElement('div');\n this.element.className = `bim-right-key ${options?.className || ''}`;\n \n // 设置层级,默认很高以覆盖其他 UI\n if (options?.zIndex) {\n this.element.style.zIndex = options.zIndex.toString();\n }\n \n // 挂载到 body 以便进行固定定位\n document.body.appendChild(this.element);\n }\n\n public init(): void {\n // 绑定全局点击事件,用于实现\"点击外部关闭\"\n document.addEventListener('mousedown', this.handleGlobalClick);\n \n // 阻止在容器自身上触发系统默认右键菜单\n this.element.addEventListener('contextmenu', (e) => {\n e.preventDefault();\n e.stopPropagation();\n });\n\n // 绑定容器交互事件\n if (this.options?.container) {\n this.options.container.addEventListener('mousedown', this.handleContainerMouseDown);\n this.options.container.addEventListener('mouseup', this.handleContainerMouseUp);\n this.options.container.addEventListener('contextmenu', this.handleContainerContextMenu);\n }\n }\n\n public setTheme(_theme: ThemeConfig): void {\n // 容器本身通常是透明的,主题样式主要由内容组件处理\n // 如果容器需要背景色,可以在这里设置\n // 使用 _theme 前缀避免 TS 未使用变量报错\n }\n\n public setLocales(): void {\n // 容器不包含文本,无需处理国际化\n // 内容组件的国际化由内容组件自身处理\n }\n\n public destroy(): void {\n document.removeEventListener('mousedown', this.handleGlobalClick);\n \n if (this.options?.container) {\n this.options.container.removeEventListener('mousedown', this.handleContainerMouseDown);\n this.options.container.removeEventListener('mouseup', this.handleContainerMouseUp);\n this.options.container.removeEventListener('contextmenu', this.handleContainerContextMenu);\n }\n\n this.unmountContent();\n this.element.remove();\n }\n\n private handleContainerMouseDown = (e: MouseEvent): void => {\n // 记录右键按下时间 (button 2 是右键)\n if (e.button === 2) {\n this.mouseDownTime = Date.now();\n }\n };\n\n private handleContainerMouseUp = (e: MouseEvent): void => {\n // 只处理右键 (button 2)\n if (e.button !== 2) return;\n\n // 检查点击时长,如果是长按或拖拽(时间过长),则不触发回调\n const pressDuration = Date.now() - this.mouseDownTime;\n if (pressDuration > this.CLICK_THRESHOLD) {\n return;\n }\n\n // 触发有效右键回调\n if (this.options?.onContext) {\n this.options.onContext(e);\n }\n };\n\n private handleContainerContextMenu = (e: MouseEvent): void => {\n // 阻止浏览器默认的右键菜单\n // 真正的菜单触发逻辑已移至 mouseup,这里只负责拦截默认行为\n e.preventDefault();\n };\n\n /**\n * 设置关闭时的回调函数\n * 通常用于通知 Manager 状态变更\n */\n public setOnClose(callback: () => void): void {\n this.onCloseCallback = callback;\n }\n\n /**\n * 挂载内容组件\n * @param content 实现了 IRightKeyContent 接口的组件实例\n */\n public mount(content: IRightKeyContent): void {\n // 先卸载旧内容,防止内存泄漏\n this.unmountContent();\n \n this.content = content;\n this.element.appendChild(content.getElement());\n }\n\n /**\n * 卸载当前内容\n */\n public unmountContent(): void {\n if (this.content) {\n this.content.destroy(); // 重要:调用组件销毁方法清理���源\n this.element.innerHTML = '';\n this.content = null;\n }\n }\n\n /**\n * 在指定位置显示容器\n * 包含智能边界检测逻辑,防止溢出屏幕\n * @param x 目标 X 坐标 (通常是鼠标点击位置)\n * @param y 目标 Y 坐标\n */\n public show(x: number, y: number): void {\n this.element.classList.add('visible');\n this.isVisible = true;\n\n // 1. 先定位到目标位置,以便测量尺寸\n this.element.style.left = `${x}px`;\n this.element.style.top = `${y}px`;\n\n // 2. 获取容器尺寸和视口尺寸\n const rect = this.element.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n let newX = x;\n let newY = y;\n\n // 3. 水平方向边界检测:如果溢出右边界,则向左对齐\n if (x + rect.width > viewportWidth) {\n newX = x - rect.width;\n }\n \n // 4. 垂直方向边界检测:如果溢出下边界,则向上对齐\n if (y + rect.height > viewportHeight) {\n newY = y - rect.height;\n }\n\n // 5. 应用修正后的坐标\n this.element.style.left = `${newX}px`;\n this.element.style.top = `${newY}px`;\n }\n\n /**\n * 隐藏容器\n */\n public hide(): void {\n this.element.classList.remove('visible');\n this.isVisible = false;\n \n // 为了状态重置,通常隐藏时也卸载内容\n this.unmountContent(); \n \n if (this.onCloseCallback) {\n this.onCloseCallback();\n }\n }\n\n /**\n * 处理全局点击事件\n * 用于检测是否点击了容器外部\n */\n private handleGlobalClick = (e: MouseEvent): void => {\n if (!this.isVisible) return;\n \n // 如果点击的是容器内部,不做处理\n if (this.element.contains(e.target as Node)) {\n return;\n }\n\n // 点击外部,关闭容器\n this.hide();\n };\n}\n","import { IBimComponent } from '../../types/component';\nimport { ThemeConfig } from '../../themes/types';\nimport { localeManager, t } from '../../services/locale';\nimport { MenuItemConfig } from './item';\nimport { MenuOptions } from './types';\nimport './index.css';\nimport { themeManager } from '../../services/theme';\n\n/**\n * 通用菜单列表组件\n * 负责渲染一组菜单项,支持分组、排序、图标、快捷键提示和递归多级子菜单。\n * 它不包含定位逻辑,仅负责内容渲染。\n */\nexport class BimMenu implements IBimComponent {\n public element: HTMLElement;\n private options: MenuOptions;\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n // 当前激活的子菜单引用,用于自动关闭\n private activeSubMenu: { menu: BimMenu; container: HTMLElement } | null = null;\n\n constructor(options: MenuOptions) {\n this.options = options;\n this.element = document.createElement('ul');\n this.element.className = 'bim-menu';\n }\n\n /**\n * 初始化组件\n * 渲染 DOM 结构并订阅语言变更\n */\n public init(): void {\n this.render();\n\n // 订阅语言变更事件,实现国际化自动更新\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n // 自动订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n }\n\n /**\n * 设置主题\n * @param theme 全局主题配置\n */\n public setTheme(theme: ThemeConfig) {\n const style = this.element.style;\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-divider', theme.divider);\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover);\n style.setProperty('--bim-shadow-lg', theme.shadowLg);\n }\n\n /**\n * 响应语言变更\n * 重新渲染整个菜单以更新文本\n */\n public setLocales(): void {\n this.element.innerHTML = '';\n this.render();\n }\n\n /**\n * 销毁组件\n * 清理事件监听、子菜单和 DOM 元素\n */\n public destroy(): void {\n // 取消语言订阅\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n // 关闭并销毁所有打开的子菜单\n this.closeSubMenu();\n // 移除自身 DOM\n this.element.remove();\n }\n\n /**\n * 获取组件根元素\n * 实现 IRightKeyContent 接口,允许被 RightKey 容器挂载\n */\n public getElement(): HTMLElement {\n return this.element;\n }\n\n private hasAnyIcon(items: MenuItemConfig[]): boolean {\n return items.some(item => {\n if (item.icon) return true;\n if (item.children) return this.hasAnyIcon(item.children);\n return false;\n });\n }\n\n private render(): void {\n const { items, groupOrder } = this.options;\n\n if (this.hasAnyIcon(items)) {\n this.element.classList.add('has-icons');\n } else {\n this.element.classList.remove('has-icons');\n }\n\n const groups = new Map();\n const defaultGroup = 'default';\n\n items.forEach(item => {\n const groupName = item.group || defaultGroup;\n if (!groups.has(groupName)) {\n groups.set(groupName, []);\n }\n groups.get(groupName)!.push(item);\n });\n\n let sortedGroupKeys: string[] = [];\n if (groupOrder) {\n sortedGroupKeys = groupOrder.filter(g => groups.has(g));\n for (const key of groups.keys()) {\n if (!sortedGroupKeys.includes(key)) {\n sortedGroupKeys.push(key);\n }\n }\n } else {\n sortedGroupKeys = Array.from(groups.keys());\n }\n\n sortedGroupKeys.forEach((groupName, index) => {\n if (index > 0) {\n const divider = document.createElement('li');\n divider.className = 'bim-menu-divider';\n this.element.appendChild(divider);\n }\n\n const groupItems = groups.get(groupName)!;\n groupItems.sort((a, b) => (a.order || 0) - (b.order || 0));\n\n groupItems.forEach(item => {\n if (item.visible !== false) {\n this.element.appendChild(this.createItemElement(item));\n if (item.divider) {\n const divider = document.createElement('li');\n divider.className = 'bim-menu-divider';\n this.element.appendChild(divider);\n }\n }\n });\n });\n }\n\n /**\n * 创建单个菜单项的 DOM 元素\n */\n private createItemElement(item: MenuItemConfig): HTMLElement {\n const li = document.createElement('li');\n // 根据状态设置样式类\n const isEnabled = !item.disabled;\n li.className = `bim-menu-item ${isEnabled ? '' : 'disabled'}`;\n\n // 1. 图标区域 (Icon Slot)\n const iconDiv = document.createElement('div');\n iconDiv.className = 'bim-menu-item-icon';\n if (item.icon) {\n iconDiv.innerHTML = item.icon;\n }\n li.appendChild(iconDiv);\n\n // 2. 文本区域 (Label Slot)\n const labelDiv = document.createElement('div');\n labelDiv.className = 'bim-menu-item-label';\n // 获取翻译后的文本\n labelDiv.textContent = t(item.label);\n li.appendChild(labelDiv);\n\n // 3. 子菜单指示器 (Arrow Slot)\n const children = item.children;\n const hasChildren = children && children.length > 0;\n\n if (hasChildren) {\n const arrowDiv = document.createElement('div');\n arrowDiv.className = 'bim-menu-item-arrow';\n // 简单的右箭头 SVG\n arrowDiv.innerHTML = '';\n li.appendChild(arrowDiv);\n\n // 绑定子菜单交互事件\n // 鼠标移入:打开子菜单\n li.addEventListener('mouseenter', () => this.openSubMenu(item, li));\n } else {\n // 鼠标移入普通项:关闭当前已打开的子菜单\n li.addEventListener('mouseenter', () => this.closeSubMenu());\n }\n\n // 4. 绑定点击事件\n if (isEnabled) {\n // Debug Log: 检查是否绑定了事件\n // console.log(`[BimMenu] Binding click for ${item.id}, hasChildren: ${hasChildren}, hasOnClick: ${!!item.onClick}`);\n \n li.addEventListener('click', (e) => {\n e.stopPropagation(); // 防止冒泡\n console.log(`[BimMenu] Clicked item: ${item.id}`);\n \n // 如果是叶子节点(没有子菜单),则触发点击动作\n if (!hasChildren) {\n if (item.onClick) {\n console.log(`[BimMenu] Executing onClick for ${item.id}`);\n item.onClick();\n } else {\n console.warn(`[BimMenu] No onClick handler for ${item.id}`);\n }\n }\n });\n }\n\n return li;\n }\n\n /**\n * 打开子菜单\n * @param item 当前菜单项\n * @param parentLi 触发的 DOM 元素(用于定位)\n */\n private openSubMenu(item: MenuItemConfig, parentLi: HTMLElement): void {\n const children = item.children;\n if (!children || children.length === 0) return;\n\n // 如果当前已经打开了子菜单,先关闭它\n this.closeSubMenu();\n\n // 创建子菜单容器 (模拟一个临时的悬浮层)\n const container = document.createElement('div');\n container.style.position = 'fixed';\n container.style.zIndex = '10001'; // 确保比父菜单层级高\n\n // 初步计算位置:位于父项右侧\n const rect = parentLi.getBoundingClientRect();\n container.style.top = `${rect.top}px`;\n container.style.left = `${rect.right}px`;\n\n // 关键修复:阻止 mousedown 冒泡\n // 防止点击子菜单时触发 BimRightKey 的全局关闭逻辑(因为它认为点击发生在主菜单外部)\n container.addEventListener('mousedown', (e) => e.stopPropagation());\n\n // 递归创建新的 BimMenu 实例\n const subMenu = new BimMenu({ items: children });\n subMenu.init();\n container.appendChild(subMenu.element);\n document.body.appendChild(container);\n\n // 保存引用以便后续清理\n this.activeSubMenu = { menu: subMenu, container };\n\n // 边界检测:如果超出屏幕右侧,则向左展开\n const subRect = container.getBoundingClientRect();\n if (subRect.right > window.innerWidth) {\n container.style.left = `${rect.left - subRect.width}px`;\n }\n // TODO: 垂直方向边界检测\n }\n\n /**\n * 关闭当前激活的子菜单\n */\n private closeSubMenu(): void {\n if (this.activeSubMenu) {\n this.activeSubMenu.menu.destroy();\n this.activeSubMenu.container.remove();\n this.activeSubMenu = null;\n }\n }\n}\n\n\n","/**\n * 右键菜单管理器\n * 负责管理右键上下文菜单的显示和交互\n */\nimport { BaseManager } from '../core/base-manager';\nimport { BimRightKey } from '../components/right-key';\nimport { BimMenu } from '../components/menu';\nimport { MenuItemConfig } from '../components/menu/item';\n\n/**\n * 右键菜单管理器\n * 支持注册多个上下文处理器,动态生成右键菜单\n */\nexport class RightKeyManager extends BaseManager {\n /** 容器元素 */\n private container: HTMLElement;\n /** 右键面板实例 */\n private rightKeyPanel: BimRightKey;\n /** 上下文处理器列表 */\n private contextHandlers: Array<(e: MouseEvent) => MenuItemConfig[] | null> = [];\n\n constructor(container: HTMLElement) {\n super();\n this.container = container;\n\n this.rightKeyPanel = new BimRightKey({\n zIndex: 9000,\n container: this.container,\n onContext: this.handleContextMenu\n });\n this.rightKeyPanel.init();\n }\n\n /** 销毁管理器 */\n public destroy(): void {\n this.rightKeyPanel.destroy();\n super.destroy();\n }\n\n /**\n * 注册上下文处理器\n * @param handler 处理器函数,返回菜单项配置\n */\n public registerHandler(handler: (e: MouseEvent) => MenuItemConfig[] | null): void {\n this.contextHandlers.push(handler);\n }\n\n /**\n * 显示菜单\n * @param x 横坐标\n * @param y 纵坐标\n * @param items 菜单项配置\n * @param groupOrder 分组顺序\n */\n public showMenu(x: number, y: number, items: MenuItemConfig[], groupOrder?: string[]): void {\n if (!items || items.length === 0) return;\n\n const menu = new BimMenu({ items, groupOrder });\n menu.init();\n\n this.rightKeyPanel.mount(menu);\n this.rightKeyPanel.show(x, y);\n }\n\n /** 隐藏菜单 */\n public hide(): void {\n this.rightKeyPanel.hide();\n }\n\n /** 处理右键点击事件 */\n private handleContextMenu = (e: MouseEvent): void => {\n let items: MenuItemConfig[] | null = null;\n for (const handler of this.contextHandlers) {\n const result = handler(e);\n if (result && result.length > 0) {\n if (!items) items = [];\n items = items.concat(result);\n }\n }\n\n if (items && items.length > 0) {\n this.showMenu(e.clientX, e.clientY, items);\n } else {\n this.hide();\n }\n };\n}\n","/**\n * 3D 引擎管理器\n * 负责管理 3D 渲染引擎的初始化、模型加载和测量功能\n */\nimport { Engine, type EngineOptions, type ModelLoadOptions } from '../components/engine';\nimport { BaseManager } from '../core/base-manager';\nimport { RightKeyManager } from './right-key-manager';\nimport type { MeasureMode } from '../types/measure';\nimport type { SectionBoxRange } from '../components/section-box-panel/types';\nimport type { MenuItemConfig } from '../components/menu/item';\nimport { ManagerRegistry } from '../core/manager-registry';\n\n/**\n * 3D 引擎管理器\n * 封装底层 3D 引擎,提供模型加载、相机控制、测量等功能\n */\nexport class EngineManager extends BaseManager {\n /** 容器元素 */\n private container: HTMLElement;\n /** 引擎实例 */\n private engineInstance: Engine | null = null;\n /** 右键菜单管理器 */\n public rightKey: RightKeyManager | null = null;\n\n constructor(container: HTMLElement) {\n super();\n this.container = container;\n }\n\n /**\n * 初始化 3D 引擎\n * @param options 引擎配置选项\n * @returns 是否初始化成功\n */\n public initialize(options?: Omit): boolean {\n if (this.engineInstance && this.engineInstance.isInitialized()) {\n console.warn('[EngineManager] 3D Engine already initialized. Destroying old instance...');\n this.engineInstance.destroy();\n this.engineInstance = null;\n }\n\n try {\n this.engineInstance = new Engine({\n container: this.container,\n ...options,\n });\n\n this.engineInstance.init();\n\n this.rightKey = new RightKeyManager(this.container);\n\n this.rightKey.registerHandler((_e) => {\n const selected = this.getSelectedComponent();\n const items: MenuItemConfig[] = [];\n\n if (selected) {\n // 1. 构件详情\n items.push({\n id: 'componentDetail',\n label: 'menu.componentDetail',\n group: 'component',\n order: 1,\n divider: true,\n onClick: () => {\n const registry = ManagerRegistry.getInstance();\n registry.componentDetail?.show();\n this.rightKey?.hide();\n }\n });\n\n // 2. 隐藏选中构件\n items.push({\n id: 'hideSelected',\n label: 'menu.hideSelected',\n group: 'component',\n order: 2,\n onClick: () => {\n console.log('[Menu] 隐藏选中构件 - 暂未实现');\n this.rightKey?.hide();\n }\n });\n\n // 3. 半透明选中构件\n items.push({\n id: 'transparentSelected',\n label: 'menu.transparentSelected',\n group: 'component',\n order: 3,\n onClick: () => {\n console.log('[Menu] 半透明选中构件 - 暂未实现');\n this.rightKey?.hide();\n }\n });\n\n // 4. 隔离选中构件(带子菜单)\n items.push({\n id: 'isolateSelected',\n label: 'menu.isolateSelected',\n group: 'component',\n order: 4,\n divider: true,\n children: [\n {\n id: 'hideOthers',\n label: 'menu.hideOthers',\n onClick: () => {\n console.log('[Menu] 隔离 - 其他构件隐藏 - 暂未实现');\n this.rightKey?.hide();\n }\n },\n {\n id: 'transparentOthers',\n label: 'menu.transparentOthers',\n onClick: () => {\n console.log('[Menu] 隔离 - 其他构件半透明 - 暂未实现');\n this.rightKey?.hide();\n }\n }\n ]\n });\n\n // 5. 剖切盒适应\n items.push({\n id: 'fitSectionBox',\n label: 'menu.fitSectionBox',\n group: 'component',\n order: 5,\n onClick: () => {\n console.log('[Menu] 剖切盒适应 - 暂未实现');\n this.rightKey?.hide();\n }\n });\n }\n\n // 6. 显示全部(始终显示)\n items.push({\n id: 'showAll',\n label: 'menu.showAll',\n group: 'component',\n order: 6,\n onClick: () => {\n console.log('[Menu] 显示全部 - 暂未实现');\n this.rightKey?.hide();\n }\n });\n\n return items;\n });\n\n return this.engineInstance.isInitialized();\n } catch (error) {\n console.error('[EngineManager] Failed to initialize 3D engine:', error);\n this.engineInstance = null;\n return false;\n }\n }\n\n /**\n * 检查引擎是否已初始化\n * @returns 是否已初始化\n */\n public isInitialized(): boolean {\n return this.engineInstance !== null && this.engineInstance.isInitialized();\n }\n\n /**\n * 加载模型\n * @param url 模型 URL\n * @param options 加载选项\n */\n public loadModel(url: string, options?: ModelLoadOptions): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.loadModel(url, options);\n }\n\n /**\n * 获取底层引擎实例\n * @returns 引擎实例\n */\n public getEngine(): any {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return null;\n }\n return this.engineInstance.getEngine();\n }\n\n /** 相机回到初始位置 */\n public CameraGoHome(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.CameraGoHome();\n }\n\n /** 暂停渲染 */\n public pauseRendering(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.pauseRendering();\n }\n\n /** 恢复渲染 */\n public resumeRendering(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.resumeRendering();\n }\n\n /**\n * 激活测量模式\n * @param mode 测量模式\n */\n public activateMeasure(mode: MeasureMode): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.activateMeasure(mode);\n }\n\n /** 停用测量模式 */\n public deactivateMeasure(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.deactivateMeasure();\n }\n\n /**\n * 获取当前测量类型\n * @returns 当前测量模式\n */\n public getCurrentMeasureType(): MeasureMode | null {\n if (!this.engineInstance) {\n return null;\n }\n return this.engineInstance.getCurrentMeasureType();\n }\n\n /** 清除所有测量标注 */\n public clearAllMeasures(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.clearAllMeasures();\n }\n\n /**\n * 激活轴向剖切\n * @param axis 要激活的轴向 ('x' | 'y' | 'z')\n */\n public activateSectionAxis(axis: 'x' | 'y' | 'z'): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.activateSectionAxis(axis);\n }\n\n /**\n * 停用轴向剖切\n */\n public deactivateSectionAxis(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.deactivateSectionAxis();\n }\n\n /**\n * 获取当前剖切轴向\n * @returns 当前激活的轴向\n */\n public getCurrentSectionAxis(): 'x' | 'y' | 'z' | null {\n if (!this.engineInstance) {\n return null;\n }\n return this.engineInstance.getCurrentSectionAxis();\n }\n\n /** 激活剖切盒 */\n public activateSectionBox(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.activateSectionBox();\n }\n\n /** 停用剖切盒 */\n public deactivateSectionBox(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.deactivateSectionBox();\n }\n\n /** 设置剖切盒范围(百分比 0-100) */\n public setSectionBoxRange(range: SectionBoxRange): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.setSectionBoxRange(range);\n }\n\n /** 适应剖切盒到模型 */\n public fitSectionBoxToModel(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.fitSectionBoxToModel();\n }\n\n /** 重置剖切盒 */\n public resetSectionBox(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.resetSectionBox();\n }\n\n /** 激活框选放大功能 */\n public activateZoomBox(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.activateZoomBox();\n }\n\n // ==================== 漫游功能 ====================\n\n /** 激活第一人称漫游模式 */\n public activateFirstPersonMode(): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.activateFirstPersonMode();\n }\n\n /** 停用第一人称漫游模式 */\n public deactivateFirstPersonMode(): void {\n if (!this.engineInstance) {\n return;\n }\n this.engineInstance.deactivateFirstPersonMode();\n }\n\n /**\n * 设置漫游移动速度\n * @param speed 移动速度\n */\n public setWalkSpeed(speed: number): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.setWalkSpeed(speed);\n }\n\n /**\n * 设置漫游重力开关\n * @param enabled 是否启用重力\n */\n public setWalkGravity(enabled: boolean): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.setWalkGravity(enabled);\n }\n\n /**\n * 设置漫游碰撞检测开关\n * @param enabled 是否启用碰撞检测\n */\n public setWalkCollision(enabled: boolean): void {\n if (!this.engineInstance) {\n console.warn('[EngineManager] 3D Engine not initialized.');\n return;\n }\n this.engineInstance.setWalkCollision(enabled);\n }\n\n /**\n * 获取漫游模式是否激活\n * @returns 是否处于漫游模式\n */\n public isFirstPersonModeActive(): boolean {\n if (!this.engineInstance) {\n return false;\n }\n return this.engineInstance.isFirstPersonModeActive();\n }\n\n // ==================== 结束:漫游功能 ====================\n\n // ==================== 构件选中 ====================\n\n /**\n * 获取当前选中的构件\n * @returns 选中构件的 URL 和 ID,未选中时返回 null\n */\n public getSelectedComponent(): { url: string; id: string } | null {\n return this.engineInstance?.getSelectedComponent() ?? null;\n }\n\n /**\n * 获取构件属性\n * @param url 模型 URL\n * @param id 构件 ID\n * @param callback 回调函数,接收属性数据\n */\n public getComponentProperties(\n url: string,\n id: string,\n callback: (data: any) => void\n ): void {\n this.engineInstance?.getComponentProperties(url, id, callback);\n }\n\n // ==================== 结束:构件选中 ====================\n\n // ==================== 模型树 ====================\n\n public getTypeTreeData(): any[] {\n return this.engineInstance?.getTypeTreeData() ?? [];\n }\n\n public getLevelTreeData(): any[] {\n return this.engineInstance?.getLevelTreeData() ?? [];\n }\n\n public getMajorTreeData(): any[] {\n return this.engineInstance?.getMajorTreeData() ?? [];\n }\n\n // ==================== 结束:模型树 ====================\n\n /** 销毁引擎管理器 */\n public destroy(): void {\n if (this.engineInstance) {\n this.engineInstance.destroy();\n this.engineInstance = null;\n }\n if (this.rightKey) {\n this.rightKey.destroy();\n this.rightKey = null;\n }\n super.destroy();\n }\n}\n","import type { BimTreeNode } from './tree-node';\n\n/**\n * 节点勾选状态枚举\n */\nexport enum TreeNodeCheckState {\n Unchecked = 0,\n Checked = 1,\n Indeterminate = 2 // 半选\n}\n\n/**\n * 节点点击行为类型\n */\nexport type NodeClickAction = 'select' | 'expand';\n\n/**\n * 树节点配置接口\n */\nexport interface TreeNodeConfig {\n /** 唯一标识符 */\n id: string;\n\n /** 显示文本的翻译键 */\n label: string;\n\n /** 节点图标 (SVG string 或 URL) */\n icon?: string;\n\n /** 子节点列表 */\n children?: TreeNodeConfig[];\n\n /** 初始展开状态 (默认 false) */\n expanded?: boolean;\n\n /** 初始选中状态 (默认 false) */\n checked?: boolean;\n\n /** 是否禁用 (默认 false) */\n disabled?: boolean;\n\n /** 自定义业务数据 */\n data?: any;\n\n /** 是否是叶子节点 (用于异步加载场景,暂留接口) */\n isLeaf?: boolean;\n\n /** 点击整行的行为 (默认 'select') */\n clickAction?: NodeClickAction;\n}\n\n/**\n * 树组件配置选项\n */\nexport interface TreeOptions {\n /** 树的数据源 */\n data: TreeNodeConfig[];\n\n /** 是否显示复选框 (默认 true) */\n checkable?: boolean;\n\n /** \n * 父子节点选中状态是否关联 (默认 true)\n * true: 选中父选子,子全选自动选父\n * false: 独立选中\n */\n checkStrictly?: boolean;\n\n /** 默认展开所有节点 (默认 false) */\n defaultExpandAll?: boolean;\n\n /** 缩进宽度 (像素,默认 24) */\n indent?: number;\n\n /** 是否启用搜索功能 (默认 false) */\n enableSearch?: boolean;\n\n /** 搜索框占位符 */\n searchPlaceholder?: string;\n\n /** 节点勾选回调 */\n onNodeCheck?: (node: BimTreeNode) => void;\n\n /** 节点选择回调 */\n onNodeSelect?: (node: BimTreeNode) => void;\n\n /** 节点展开/折叠回调 */\n onNodeExpand?: (node: BimTreeNode) => void;\n\n /** \n * 选中时显示的自定义操作栏渲染函数 \n * 返回 HTML 字符串或 HTMLElement\n */\n renderActions?: (node: TreeNodeConfig) => HTMLElement | string;\n}","import { TreeNodeConfig, TreeNodeCheckState, TreeOptions } from './types';\n/**\n * 树节点类\n * 负责渲染单个节点、处理交互和递归\n */\nexport class BimTreeNode {\n public config: TreeNodeConfig;\n public element: HTMLElement;\n public children: BimTreeNode[] = [];\n public parent: BimTreeNode | null = null;\n public checkState: TreeNodeCheckState = TreeNodeCheckState.Unchecked;\n\n // UI Elements\n private contentEl!: HTMLElement;\n private switcherEl!: HTMLElement;\n private checkboxEl: HTMLElement | null = null;\n private titleEl!: HTMLElement;\n private actionsEl!: HTMLElement; // 操作栏容器\n private childrenContainer!: HTMLElement;\n // 外部回调\n private onExpandChange: (node: BimTreeNode) => void;\n private onCheckChange: (node: BimTreeNode) => void;\n private onNodeClick: (node: BimTreeNode) => void;\n private renderActions?: (node: TreeNodeConfig) => HTMLElement | string;\n \n constructor(\n config: TreeNodeConfig, \n options: TreeOptions,\n callbacks: {\n onExpand: (n: BimTreeNode) => void,\n onCheck: (n: BimTreeNode) => void,\n onClick: (n: BimTreeNode) => void\n }\n ) {\n this.config = config;\n this.onExpandChange = callbacks.onExpand;\n this.onCheckChange = callbacks.onCheck;\n this.onNodeClick = callbacks.onClick;\n this.renderActions = options.renderActions;\n \n // 初始化状态\n this.checkState = config.checked ? TreeNodeCheckState.Checked : TreeNodeCheckState.Unchecked;\n \n this.element = this.createDom(options);\n }\n /**\n * 创建节点 DOM\n */\n private createDom(options: TreeOptions): HTMLElement {\n const nodeEl = document.createElement('div');\n nodeEl.className = 'bim-tree-node';\n if (this.config.disabled) nodeEl.classList.add('is-disabled');\n\n // 1. 内容行\n this.contentEl = document.createElement('div');\n this.contentEl.className = 'bim-tree-node-content';\n\n // 1.1 展开/折叠箭头\n this.switcherEl = document.createElement('span');\n this.switcherEl.className = 'bim-tree-switcher';\n // 默认右箭头 SVG\n this.switcherEl.innerHTML = ``;\n\n const hasChildren = this.config.children && this.config.children.length > 0;\n if (!hasChildren) {\n this.switcherEl.classList.add('is-hidden');\n } else if (this.config.expanded) {\n this.switcherEl.classList.add('is-expanded');\n }\n\n this.switcherEl.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleExpand();\n });\n\n this.contentEl.appendChild(this.switcherEl);\n\n // 1.2 复选框 (可选)\n if (options.checkable !== false) {\n this.checkboxEl = document.createElement('span');\n this.checkboxEl.className = 'bim-tree-checkbox';\n this.updateCheckboxUI();\n\n this.checkboxEl.addEventListener('click', (e) => {\n e.stopPropagation();\n if (this.config.disabled) return;\n this.toggleCheck();\n });\n this.contentEl.appendChild(this.checkboxEl);\n }\n\n // 1.3 图标 (可选)\n if (this.config.icon) {\n const iconEl = document.createElement('span');\n iconEl.className = 'bim-tree-icon';\n iconEl.innerHTML = this.config.icon.includes('`;\n this.contentEl.appendChild(iconEl);\n }\n\n // 1.4 文本\n this.titleEl = document.createElement('span');\n this.titleEl.className = 'bim-tree-title';\n this.updateLabel(); // 设置文本\n this.contentEl.appendChild(this.titleEl);\n\n // 1.5 操作栏 (Actions)\n this.actionsEl = document.createElement('div');\n this.actionsEl.className = 'bim-tree-node-actions';\n this.actionsEl.addEventListener('click', (e) => {\n e.stopPropagation(); // 防止点击操作栏触发选中/展开\n });\n this.contentEl.appendChild(this.actionsEl);\n\n // 绑定整行点击\n this.contentEl.addEventListener('click', (e) => {\n e.stopPropagation();\n if (this.config.disabled) return;\n\n const action = this.config.clickAction || 'select';\n\n if (action === 'expand') {\n this.toggleExpand();\n } else {\n this.onNodeClick(this);\n }\n });\n\n nodeEl.appendChild(this.contentEl);\n\n // 2. 子节点容器\n this.childrenContainer = document.createElement('div');\n this.childrenContainer.className = 'bim-tree-children';\n // 设置缩进\n const indent = options.indent || 24;\n this.childrenContainer.style.paddingLeft = `${indent}px`; // 每一级子器左移\n\n if (this.config.expanded && hasChildren) {\n this.childrenContainer.classList.add('is-visible');\n }\n nodeEl.appendChild(this.childrenContainer);\n\n return nodeEl;\n }\n\n /**\n * 设置高亮选中状态 (Select 模式下)\n */\n public setSelected(selected: boolean) {\n if (selected) {\n this.contentEl.classList.add('is-selected');\n // 渲染自定义操作栏\n if (this.renderActions) {\n const content = this.renderActions(this.config);\n this.actionsEl.innerHTML = '';\n if (typeof content === 'string') {\n this.actionsEl.innerHTML = content;\n } else if (content instanceof HTMLElement) {\n this.actionsEl.appendChild(content);\n }\n }\n } else {\n this.contentEl.classList.remove('is-selected');\n this.actionsEl.innerHTML = ''; // 清空内容\n }\n }\n\n /**\n * 更新显示文本 (国际化支持) -> 移除国际化,直接显示\n */\n public updateLabel() {\n if (this.titleEl) {\n this.titleEl.textContent = this.config.label;\n }\n }\n\n /**\n * 切换展开状态\n */\n public toggleExpand(force?: boolean) {\n if (!this.config.children || this.config.children.length === 0) return;\n\n const newState = force !== undefined ? force : !this.config.expanded;\n this.config.expanded = newState;\n\n if (newState) {\n this.switcherEl.classList.add('is-expanded');\n this.childrenContainer.classList.add('is-visible');\n } else {\n this.switcherEl.classList.remove('is-expanded');\n this.childrenContainer.classList.remove('is-visible');\n }\n\n // 触发回调\n if (force === undefined) { // 只有用户交互才触发回调,防止初始化时无限循环\n this.onExpandChange(this);\n }\n }\n\n /**\n * 切换选中状态 (用户点击)\n */\n public toggleCheck() {\n // 如果当前是半选,点击变全选;如果全选,点击未选;如果未选,点击变全选\n // 简化逻辑:只要不是 Checked,点击都变 Checked;如果是 Checked,变 Unchecked\n const newChecked = this.checkState !== TreeNodeCheckState.Checked;\n this.setChecked(newChecked ? TreeNodeCheckState.Checked : TreeNodeCheckState.Unchecked, true);\n }\n\n /**\n * 设置选中状态 (API调用或联动)\n * @param state 新状态\n * @param fireEvent 是否触发事件\n */\n public setChecked(state: TreeNodeCheckState, fireEvent: boolean = false) {\n if (this.checkState === state) return;\n\n this.checkState = state;\n this.config.checked = (state === TreeNodeCheckState.Checked);\n\n this.updateCheckboxUI();\n\n if (fireEvent) {\n this.onCheckChange(this);\n }\n }\n\n /**\n * 更新复选框 UI 样式\n */\n public updateCheckboxUI() {\n if (!this.checkboxEl) return;\n\n this.checkboxEl.classList.remove('is-checked', 'is-indeterminate');\n\n if (this.checkState === TreeNodeCheckState.Checked) {\n this.checkboxEl.classList.add('is-checked');\n } else if (this.checkState === TreeNodeCheckState.Indeterminate) {\n this.checkboxEl.classList.add('is-indeterminate');\n }\n }\n\n /**\n * 添加子节点实例\n */\n public appendChild(childNode: BimTreeNode) {\n childNode.parent = this;\n this.children.push(childNode);\n this.childrenContainer.appendChild(childNode.element);\n\n // 如果之前是隐藏的箭头,现在有了子节点,需要显示出来\n if (this.children.length === 1) {\n this.switcherEl.classList.remove('is-hidden');\n }\n }\n\n /**\n * 销毁\n */\n public destroy() {\n this.children.forEach(c => c.destroy());\n this.children = [];\n this.element.remove();\n this.parent = null;\n }\n}\n","import { IBimComponent } from '../../types/component';\nimport { ThemeConfig } from '../../themes/types';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport { TreeOptions, TreeNodeConfig, TreeNodeCheckState } from './types';\nimport { BimTreeNode } from './tree-node';\nimport './index.css';\n\n// 定义辅助事件发射器接口 (由于 BimTree 通常作为 Manager 的一部分或独立使用)\n// 为了方便,这里我们假设它会被 TreeManager 管理,TreeManager 会处理事件发射\n// 但 BimTree 本身也需要一个方式通知 Manager。\n// 我们可以通过构造函数传入 event bus 适配器,或者直接使用 CustomEvent。\n// 更好的方式:BimTree 提供 onEvent 回调。\n\nexport class BimTree implements IBimComponent {\n public element: HTMLElement;\n private contentElement: HTMLElement; // 树内容容器\n private searchInput: HTMLInputElement | null = null;\n private searchResults: HTMLElement | null = null;\n\n private options: TreeOptions;\n private nodeMap: Map = new Map();\n private rootNodes: BimTreeNode[] = [];\n private selectedNode: BimTreeNode | null = null; // 当前选中的高亮节点\n\n // 订阅清理函数\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n private clickOutsideHandler: ((e: MouseEvent) => void) | null = null;\n\n // 事件回调 (由 Manager 注入)\n public onNodeCheck?: (node: BimTreeNode) => void;\n public onNodeSelect?: (node: BimTreeNode) => void;\n public onNodeExpand?: (node: BimTreeNode) => void;\n\n constructor(options: TreeOptions) {\n this.options = {\n checkable: true,\n checkStrictly: true,\n indent: 24,\n defaultExpandAll: true,\n enableSearch: false,\n searchPlaceholder: 'tree.searchPlaceholder',\n ...options\n };\n \n // 主容器\n this.element = document.createElement('div');\n this.element.className = 'bim-tree';\n\n // 搜索区域\n if (this.options.enableSearch) {\n this.createSearchDOM();\n }\n\n // 内容容器\n this.contentElement = document.createElement('div');\n this.contentElement.className = 'bim-tree-content';\n this.element.appendChild(this.contentElement);\n\n // 初始化回调\n if (options.onNodeCheck) this.onNodeCheck = options.onNodeCheck;\n if (options.onNodeSelect) this.onNodeSelect = options.onNodeSelect;\n if (options.onNodeExpand) this.onNodeExpand = options.onNodeExpand;\n }\n\n private createSearchDOM() {\n const searchContainer = document.createElement('div');\n searchContainer.className = 'bim-tree-search';\n\n const wrapper = document.createElement('div');\n wrapper.className = 'bim-tree-search-wrapper';\n\n // 图标\n const icon = document.createElement('span');\n icon.className = 'bim-tree-search-icon';\n icon.innerHTML = ``;\n wrapper.appendChild(icon);\n\n this.searchInput = document.createElement('input');\n this.searchInput.className = 'bim-tree-search-input';\n this.searchInput.type = 'text';\n this.searchInput.placeholder = t(this.options.searchPlaceholder || '搜索...');\n\n // 绑定输入事件\n this.searchInput.addEventListener('input', (e) => {\n const query = (e.target as HTMLInputElement).value;\n this.handleSearch(query);\n });\n\n wrapper.appendChild(this.searchInput);\n searchContainer.appendChild(wrapper);\n\n // 搜索结果容器\n this.searchResults = document.createElement('div');\n this.searchResults.className = 'bim-tree-search-results';\n\n searchContainer.appendChild(this.searchResults);\n this.element.appendChild(searchContainer);\n\n // 点击外部关闭搜索结果\n this.clickOutsideHandler = (e: MouseEvent) => {\n if (this.searchResults &&\n !this.searchResults.contains(e.target as Node) &&\n !this.searchInput?.contains(e.target as Node)) {\n this.searchResults.classList.remove('is-visible');\n }\n };\n document.addEventListener('click', this.clickOutsideHandler);\n }\n\n public init(): void {\n this.render();\n\n // 订阅系统事件\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n // 初始化主题\n this.setTheme(themeManager.getTheme());\n }\n\n /**\n * 处理搜索逻辑\n */\n private handleSearch(query: string) {\n if (!this.searchResults) return;\n\n if (!query.trim()) {\n this.searchResults.classList.remove('is-visible');\n this.searchResults.innerHTML = '';\n return;\n }\n\n const results: { node: BimTreeNode, label: string, path: string }[] = [];\n const lowerQuery = query.toLowerCase();\n\n this.nodeMap.forEach(node => {\n // 直接使用 config.label,不进行翻译\n const label = node.config.label;\n if (label.toLowerCase().includes(lowerQuery)) {\n results.push({\n node,\n label,\n path: this.getNodePath(node)\n });\n }\n });\n\n this.renderSearchResults(results);\n }\n\n /**\n * 获取节点路径(面包屑)\n */\n private getNodePath(node: BimTreeNode): string {\n const path: string[] = [];\n let current: BimTreeNode | null = node.parent; // 从父级开始\n while (current) {\n // 直接使用 label\n path.unshift(current.config.label);\n current = current.parent;\n }\n return path.join(' > ');\n }\n\n /**\n * 渲染搜索结果列表\n */\n private renderSearchResults(results: { node: BimTreeNode, label: string, path: string }[]) {\n if (!this.searchResults) return;\n\n this.searchResults.innerHTML = '';\n if (results.length === 0) {\n const noData = document.createElement('div');\n noData.className = 'bim-tree-search-item';\n noData.style.cursor = 'default';\n noData.style.color = '#999';\n noData.textContent = 'No results';\n this.searchResults.appendChild(noData);\n } else {\n results.forEach(res => {\n const item = document.createElement('div');\n item.className = 'bim-tree-search-item';\n\n const title = document.createElement('span');\n title.className = 'bim-tree-search-item-title';\n title.textContent = res.label;\n\n const path = document.createElement('span');\n path.className = 'bim-tree-search-item-path';\n path.textContent = res.path;\n\n item.appendChild(title);\n if (res.path) item.appendChild(path);\n\n item.addEventListener('click', () => {\n this.revealNode(res.node);\n });\n\n this.searchResults!.appendChild(item);\n });\n }\n this.searchResults.classList.add('is-visible');\n }\n\n /**\n * 定位到指定节点\n */\n public revealNode(node: BimTreeNode) {\n // 1. 关闭搜索下拉\n if (this.searchResults) {\n this.searchResults.classList.remove('is-visible');\n if (this.searchInput) this.searchInput.value = ''; // 可选:清空搜索框\n }\n\n // 2. 递归展开父节点\n let current = node.parent;\n while (current) {\n current.toggleExpand(true); // 强制展开\n current = current.parent;\n }\n\n // 3. 选中节点 (Select)\n this.handleNodeSelect(node);\n\n // 4. 滚动到可视区域\n setTimeout(() => {\n node.element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }, 100);\n }\n\n /**\n * 设置主题\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-primary', theme.primary);\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-secondary', theme.textSecondary);\n style.setProperty('--bim-text-tertiary', theme.textTertiary);\n style.setProperty('--bim-text-disabled', theme.textDisabled);\n style.setProperty('--bim-text-inverse', theme.textInverse);\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-border-disabled', theme.borderDisabled);\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover);\n style.setProperty('--bim-component-bg-selected', theme.componentBgSelected);\n style.setProperty('--bim-component-bg-disabled', theme.componentBgDisabled);\n style.setProperty('--bim-shadow-md', theme.shadowMd);\n style.setProperty('--bim-focus-ring', theme.focusRing);\n }\n\n /**\n * 响应语言变更\n */\n public setLocales(): void {\n this.nodeMap.forEach(node => node.updateLabel());\n if (this.searchInput) {\n this.searchInput.placeholder = t(this.options.searchPlaceholder || 'tree.searchPlaceholder');\n }\n }\n\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n if (this.clickOutsideHandler) {\n document.removeEventListener('click', this.clickOutsideHandler);\n this.clickOutsideHandler = null;\n }\n this.rootNodes.forEach(node => node.destroy());\n this.rootNodes = [];\n this.nodeMap.clear();\n this.element.remove();\n this.selectedNode = null;\n }\n\n /**\n * 核心渲染逻辑\n */\n private render(): void {\n this.contentElement.innerHTML = ''; // 清空内容区,而不是整个 element\n this.nodeMap.clear();\n this.rootNodes = [];\n\n this.options.data.forEach(config => {\n this.createNodeRecursively(config, null);\n });\n\n // 移除旧的 expandAll 调用,因为 expanded 状态已在 createNodeRecursively 中处理\n }\n\n /**\n * 递归创建节点\n */\n private createNodeRecursively(config: TreeNodeConfig, parent: BimTreeNode | null) {\n // 处理展开状态优先级: config.expanded > defaultExpandAll\n if (config.expanded === undefined) {\n config.expanded = this.options.defaultExpandAll;\n }\n\n const node = new BimTreeNode(config, this.options, {\n onExpand: (n) => { if (this.onNodeExpand) this.onNodeExpand(n); },\n onCheck: (n) => this.handleNodeCheck(n),\n onClick: (n) => this.handleNodeSelect(n)\n });\n\n this.nodeMap.set(config.id, node);\n\n if (parent) {\n parent.appendChild(node);\n } else {\n this.rootNodes.push(node);\n this.contentElement.appendChild(node.element); // 挂载到 contentElement\n }\n\n if (config.children && config.children.length > 0) {\n config.children.forEach(childConfig => {\n this.createNodeRecursively(childConfig, node);\n });\n }\n\n // 如果是初始化渲染,需要处理 checkStrictly 的向上联动(因为数据里可能只给了子节点 checked,父节点没给)\n // 这里做一个简单的后处理:如果 checkStrictly 开启,且当前节点 checked,则触发一次联动\n // 注意:这可能会导致性能问题,���化做法是在所有节点创建完后统一计算一次状态\n }\n\n /**\n * 处理节点选择 (高亮)\n */\n private handleNodeSelect(node: BimTreeNode) {\n // 如果之前有选中的,先取消选中\n if (this.selectedNode && this.selectedNode !== node) {\n this.selectedNode.setSelected(false);\n }\n\n // 设置当前为选中\n node.setSelected(true);\n this.selectedNode = node;\n\n // 触发外部回调\n if (this.onNodeSelect) this.onNodeSelect(node);\n }\n\n /**\n * 处理节点勾选逻辑 (核心算法)\n */\n private handleNodeCheck(node: BimTreeNode) {\n const isChecked = node.checkState === TreeNodeCheckState.Checked;\n\n // 1. 触发外部回调 (Event)\n if (this.onNodeCheck) this.onNodeCheck(node);\n\n // 2. 如果不联动,直接返回\n if (this.options.checkStrictly === false) return;\n\n // 3. 联动逻辑\n // 3.1 向下级联 (Cascade Down): 父变子全变\n const updateChildren = (n: BimTreeNode, state: TreeNodeCheckState) => {\n n.children.forEach(child => {\n if (child.config.disabled) return; // 跳过禁用节点\n child.setChecked(state, false); // 不再触发事件,只更新状态 UI\n updateChildren(child, state);\n });\n };\n\n // 当前节点是 Checked 或 Unchecked,子节点跟随\n if (isChecked) {\n updateChildren(node, TreeNodeCheckState.Checked);\n } else {\n updateChildren(node, TreeNodeCheckState.Unchecked);\n }\n\n // 3.2 向上冒泡 (Bubble Up): 子变父更新\n let current = node.parent;\n while (current) {\n if (current.config.disabled) {\n current = current.parent;\n continue;\n }\n\n const children = current.children;\n const allChecked = children.every(c => c.checkState === TreeNodeCheckState.Checked);\n const allUnchecked = children.every(c => c.checkState === TreeNodeCheckState.Unchecked);\n\n if (allChecked) {\n current.setChecked(TreeNodeCheckState.Checked, false);\n } else if (allUnchecked) {\n current.setChecked(TreeNodeCheckState.Unchecked, false);\n } else {\n current.setChecked(TreeNodeCheckState.Indeterminate, false);\n }\n\n current = current.parent;\n }\n }\n\n // ================== Public APIs ==================\n\n public getNode(id: string): BimTreeNode | undefined {\n return this.nodeMap.get(id);\n }\n\n public checkNode(id: string, checked: boolean) {\n const node = this.nodeMap.get(id);\n if (node) {\n node.setChecked(checked ? TreeNodeCheckState.Checked : TreeNodeCheckState.Unchecked, true);\n // 手动调用联动处理,因为 setChecked 的 fireEvent 只触发回调,不包含内部逻辑调用?\n // 不,我们在 createNodeRecursively 里绑定的 onCheck 就是 handleNodeCheck\n // 所以只要 fireEvent=true,就会触发 handleNodeCheck,进而触发联动。\n }\n }\n\n public expandAll(expanded: boolean) {\n this.nodeMap.forEach(node => node.toggleExpand(expanded));\n }\n\n public getCheckedNodes(includeHalfChecked: boolean = false): TreeNodeConfig[] {\n const result: TreeNodeConfig[] = [];\n this.nodeMap.forEach(node => {\n if (node.checkState === TreeNodeCheckState.Checked) {\n result.push(node.config);\n } else if (includeHalfChecked && node.checkState === TreeNodeCheckState.Indeterminate) {\n result.push(node.config);\n }\n });\n return result;\n }\n}\n","import { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { ThemeConfig } from '../../themes/types';\nimport type { TabItem, TabOptions } from './index.type';\nimport './index.css';\n\n/**\n * 简单标签页组件(固定标签,不支持运行时增删)\n * - 仅处理标签头部与内容切换\n * - 主题从 ThemeManager 获取,不在配置中传入\n * - 文案通过 t() 翻译,支持传原文直接展示\n */\nexport class BimTab implements IBimComponent {\n /** 组件根节点 */\n public element: HTMLElement;\n /** 头部容器 */\n private navElement: HTMLElement;\n /** 内容容器 */\n private contentElement: HTMLElement;\n /** 业务配置 */\n private options: TabOptions;\n /** 当前激活的标签 id */\n private activeId: string | null;\n /** id -> TabItem */\n private tabMap: Map = new Map();\n /** id -> 内容容器 */\n private panelMap: Map = new Map();\n /** 主题/语言订阅解除函数 */\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n /** 头部点击事件处理引用(便于销毁时解绑) */\n private navClickHandler: ((e: MouseEvent) => void) | null = null;\n\n constructor(options: TabOptions) {\n this.options = options;\n this.activeId = options.activeId || (options.tabs[0]?.id ?? null);\n\n // 预置 tabMap,方便后续查找\n options.tabs.forEach((tab) => this.tabMap.set(tab.id, tab));\n\n // 构建基础 DOM 结构\n this.element = document.createElement('div');\n this.element.className = 'bim-tab';\n\n this.navElement = document.createElement('div');\n this.navElement.className = 'bim-tab__nav';\n this.navElement.setAttribute('role', 'tablist');\n this.element.appendChild(this.navElement);\n\n this.contentElement = document.createElement('div');\n this.contentElement.className = 'bim-tab__content';\n this.element.appendChild(this.contentElement);\n\n // 挂载到容器\n this.options.container.appendChild(this.element);\n }\n\n /**\n * 初始化组件\n */\n public init(): void {\n this.renderNav();\n this.renderPanels();\n // 初始化文案与主题\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n\n // 订阅语言、主题变化\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n }\n\n /**\n * 渲染头部标签\n */\n private renderNav(): void {\n this.navElement.innerHTML = '';\n\n this.navClickHandler = (event: MouseEvent) => {\n const target = (event.target as HTMLElement).closest('.bim-tab__item');\n if (!target) return;\n const tabId = target.dataset.id;\n if (!tabId) return;\n const tab = this.tabMap.get(tabId);\n if (tab?.disabled) return;\n this.activateTab(tabId);\n };\n this.navElement.addEventListener('click', this.navClickHandler);\n\n this.options.tabs.forEach((tab) => {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'bim-tab__item';\n btn.dataset.id = tab.id;\n btn.setAttribute('role', 'tab');\n btn.id = `tab-${tab.id}`;\n btn.setAttribute('aria-selected', `${tab.id === this.activeId}`);\n if (tab.disabled) {\n btn.disabled = true;\n btn.setAttribute('aria-disabled', 'true');\n btn.classList.add('is-disabled');\n }\n\n // 图标\n if (tab.icon) {\n const iconEl = document.createElement('span');\n iconEl.className = 'bim-tab__icon';\n iconEl.innerHTML = tab.icon;\n btn.appendChild(iconEl);\n }\n\n const titleEl = document.createElement('span');\n titleEl.className = 'bim-tab__title';\n titleEl.textContent = this.resolveTitle(tab.title);\n btn.appendChild(titleEl);\n\n if (tab.id === this.activeId) {\n btn.classList.add('is-active');\n }\n\n this.navElement.appendChild(btn);\n });\n }\n\n /**\n * 渲染内容面板\n */\n private renderPanels(): void {\n this.contentElement.innerHTML = '';\n this.panelMap.clear();\n\n this.options.tabs.forEach((tab) => {\n const panel = document.createElement('div');\n panel.className = 'bim-tab__panel';\n panel.dataset.id = tab.id;\n panel.setAttribute('role', 'tabpanel');\n panel.setAttribute('aria-labelledby', `tab-${tab.id}`);\n\n if (tab.content instanceof HTMLElement) {\n panel.appendChild(tab.content);\n } else if (typeof tab.content === 'string') {\n panel.innerHTML = tab.content;\n }\n\n if (tab.id === this.activeId) {\n panel.classList.add('is-active');\n } else {\n panel.style.display = 'none';\n }\n\n this.panelMap.set(tab.id, panel);\n this.contentElement.appendChild(panel);\n });\n }\n\n /**\n * 激活指定标签\n * @param tabId 目标标签 id\n */\n public activateTab(tabId: string): void {\n if (this.activeId === tabId) return;\n const targetTab = this.tabMap.get(tabId);\n if (!targetTab || targetTab.disabled) return;\n\n this.activeId = tabId;\n // 更新头部状态\n const buttons = this.navElement.querySelectorAll('.bim-tab__item');\n buttons.forEach((btn) => {\n const isActive = btn.dataset.id === tabId;\n btn.classList.toggle('is-active', isActive);\n btn.setAttribute('aria-selected', `${isActive}`);\n });\n\n // 更新面板显示\n this.panelMap.forEach((panel, id) => {\n const isActive = id === tabId;\n panel.classList.toggle('is-active', isActive);\n panel.style.display = isActive ? 'block' : 'none';\n });\n\n if (this.options.onChange) {\n this.options.onChange(tabId, targetTab);\n }\n }\n\n /**\n * 应用主题\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-tab-bg', theme.bgElevated);\n style.setProperty('--bim-tab-nav-bg', theme.bgElevated);\n style.setProperty('--bim-tab-text', theme.textPrimary);\n style.setProperty('--bim-tab-text-secondary', theme.textSecondary);\n style.setProperty('--bim-tab-text-active', theme.primary);\n style.setProperty('--bim-tab-border', theme.borderDefault);\n style.setProperty('--bim-tab-hover-bg', theme.componentBgHover);\n style.setProperty('--bim-tab-active-bg', theme.componentBgActive);\n style.setProperty('--bim-tab-icon', theme.iconDefault);\n }\n\n /**\n * 应用当前语言文案\n */\n public setLocales(): void {\n const buttons = this.navElement.querySelectorAll('.bim-tab__item');\n buttons.forEach((btn) => {\n const id = btn.dataset.id;\n if (!id) return;\n const tab = this.tabMap.get(id);\n if (!tab) return;\n const titleEl = btn.querySelector('.bim-tab__title');\n if (titleEl) {\n titleEl.textContent = this.resolveTitle(tab.title);\n }\n });\n }\n\n /**\n * 清理资源\n */\n public destroy(): void {\n if (this.navClickHandler) {\n this.navElement.removeEventListener('click', this.navClickHandler);\n this.navClickHandler = null;\n }\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.panelMap.clear();\n this.tabMap.clear();\n this.element.remove();\n }\n\n /**\n * 工具:解析标题(优先翻译,不存在则回退原值)\n */\n private resolveTitle(title: string): string {\n try {\n const translated = t(title);\n return translated || title;\n } catch (err) {\n // 翻译失败时使用原值\n return title;\n }\n }\n}\n\n","/**\n * 图标管理器\n * 统一管理所有 SVG 图标\n */\n\n/**\n * 所有图标集合(静态变量)\n */\nconst ICONS: Record = {\n // ========== 来自 assets 的图标 (48x48) ==========\n 测量: '',\n 地图: '',\n 框选放大: '',\n 漫游: '',\n 目录树: '',\n 剖切: '',\n 剖切盒: '',\n 全屏: '',\n 设置: '',\n 拾曲面剖切: '',\n 轴向剖切: '',\n 主视角: '',\n 文档: '',\n 第一人称漫游: '',\n 反向: '',\n 路径漫游: '',\n 适应到模型: '',\n 隐藏: '',\n 重置: '',\n\n // ========== 测量相关图标 (32x32) ==========\n 标高: '',\n 距离: '',\n 最小距离: '',\n 激光边距: '',\n 角度: '',\n 坡度: '',\n 体积: '',\n 空间体积: '',\n\n // ========== 通用图标 (24x24) ==========\n close: '',\n check: '',\n warning: '',\n error: '',\n success: '',\n plus: '',\n minus: '',\n arrowUp: '',\n arrowDown: '',\n arrowLeft: '',\n arrowRight: '',\n search: '',\n refresh: '',\n delete: '',\n edit: '',\n save: '',\n expand: '',\n collapse: '',\n\n // ========== 默认图标 ==========\n default: '',\n};\n\n/**\n * 获取图标\n * @param name 图标名称\n * @returns SVG 字符串,如果找不到返回默认图标\n */\nexport function getIcon(name: string): string {\n const icon = ICONS[name];\n\n if (!icon) {\n console.warn(`[IconManager] Icon \"${name}\" not found, using default icon`);\n return ICONS.default;\n }\n\n return icon;\n}\n","import type { ButtonGroupColors, ButtonConfig } from '../components/button-group/index.type';\nimport { BaseManager } from '../core/base-manager';\nimport { BimButtonGroup } from '../components/button-group';\nimport { BimTree } from '../components/tree';\nimport { TreeNodeConfig } from '../components/tree/types';\nimport { BimDialog } from '../components/dialog';\nimport { BimTab } from '../components/tab';\nimport { getIcon } from '../utils/icon-manager';\n\nfunction transformTreeData(apiData: any[]): TreeNodeConfig[] {\n if (!apiData || apiData.length === 0) return [];\n\n return apiData.map((model, modelIndex) => {\n const transformNode = (node: any, index: number): TreeNodeConfig => {\n const hasChildren = node.children && node.children.length > 0;\n return {\n id: node.id || `node-${modelIndex}-${index}`,\n label: node.name || node.label || '未命名',\n expanded: false,\n clickAction: hasChildren ? 'expand' : 'select',\n children: hasChildren\n ? node.children.map((child: any, childIndex: number) => transformNode(child, childIndex))\n : undefined,\n data: node\n };\n };\n\n const hasChildren = model.children && model.children.length > 0;\n return {\n id: `model-${modelIndex}`,\n label: model.name || '模型',\n expanded: true,\n clickAction: 'expand',\n children: hasChildren\n ? model.children.map((child: any, childIndex: number) => transformNode(child, childIndex))\n : undefined\n };\n });\n}\n\nexport class ConstructTreeManagerBtn extends BaseManager {\n /** 按钮组实例 */\n private toolbar: BimButtonGroup | null = null;\n /** 按钮容器元素 */\n private toolbarContainer: HTMLElement | null = null;\n /** 主容器元素 */\n private container: HTMLElement;\n /** 构件树对话框实例 */\n private dialog: BimDialog | null = null;\n\n constructor(container: HTMLElement) {\n super();\n this.container = container;\n this.init();\n }\n\n /** 初始化按钮 */\n private init() {\n this.toolbarContainer = document.createElement('div');\n this.toolbarContainer.id = 'bim-construct-tree';\n this.container.appendChild(this.toolbarContainer);\n this.toolbar = new BimButtonGroup({\n container: this.toolbarContainer,\n showLabel: false,\n direction: 'column',\n position: 'top-left',\n align: 'vertical',\n expand: 'up'\n });\n this.toolbar.init();\n this.toolbar.addGroup('construct-tree');\n this.toolbar.addButton({\n id: 'construct-tree-btn',\n groupId: 'construct-tree',\n type: 'button',\n label: 'construct-tree',\n icon: getIcon('目录树'),\n onClick: () => {\n this.openConstructTreeDialog();\n }\n });\n this.toolbar.render();\n }\n\n public openConstructTreeDialog() {\n this.setVisible(false);\n\n const levelTreeData = this.registry.engine3d?.getLevelTreeData() ?? [];\n const typeTreeData = this.registry.engine3d?.getTypeTreeData() ?? [];\n const majorTreeData = this.registry.engine3d?.getMajorTreeData() ?? [];\n\n console.log('[ConstructTree] 构件树数据 (Level):', levelTreeData);\n console.log('[ConstructTree] 类型树数据 (Type):', typeTreeData);\n console.log('[ConstructTree] 专业树数据 (Major):', majorTreeData);\n\n const createTree = (data: any[]) => {\n const tree = new BimTree({\n data: transformTreeData(data),\n checkable: true,\n indent: 0,\n enableSearch: true,\n checkStrictly: true,\n defaultExpandAll: true,\n onNodeCheck: (node) => {\n console.log('onNodeCheck', node);\n },\n onNodeSelect: (node) => {\n console.log('onNodeSelect', node);\n },\n onNodeExpand: () => {\n this.dialog?.fitWidth();\n },\n });\n tree.init();\n return tree;\n };\n\n const componentTree = createTree(levelTreeData);\n const typeTree = createTree(typeTreeData);\n const majorTree = createTree(majorTreeData);\n\n const componentPanel = document.createElement('div');\n componentPanel.className = 'construct-tab__panel-content';\n componentPanel.appendChild(componentTree.element);\n\n const typePanel = document.createElement('div');\n typePanel.className = 'construct-tab__panel-content';\n typePanel.appendChild(typeTree.element);\n\n const majorPanel = document.createElement('div');\n majorPanel.className = 'construct-tab__panel-content';\n majorPanel.appendChild(majorTree.element);\n\n const tabMount = document.createElement('div');\n tabMount.className = 'construct-tab__container';\n tabMount.style.height = '100%';\n tabMount.style.overflow = 'hidden';\n const tab = new BimTab({\n container: tabMount,\n tabs: [\n { id: 'component', title: 'tab.component', content: componentPanel },\n { id: 'type', title: 'tab.type', content: typePanel },\n { id: 'major', title: 'tab.major', content: majorPanel },\n ],\n activeId: 'component',\n onChange: () => {\n this.dialog?.fitWidth();\n }\n });\n tab.init();\n\n this.dialog = this.registry.dialog!.create({\n title: 'constructTree.title',\n minWidth: 320,\n height: 420,\n content: tabMount,\n position: { x: 20, y: 20 },\n resizable: false,\n onClose: () => {\n tab.destroy();\n componentTree.destroy();\n typeTree.destroy();\n majorTree.destroy();\n this.setVisible(true);\n }\n });\n this.dialog?.fitWidth();\n }\n\n /** 刷新渲染 */\n public refresh() {\n this.toolbar?.render();\n }\n\n /** 销毁管理器 */\n public destroy() {\n this.toolbar?.destroy();\n this.toolbar = null;\n super.destroy();\n }\n\n /**\n * 添加按钮组\n * @param groupId 组 ID\n * @param beforeGroupId 插入位置\n */\n public addGroup(groupId: string, beforeGroupId?: string) {\n this.toolbar?.addGroup(groupId, beforeGroupId);\n this.toolbar?.render();\n }\n\n /**\n * 添加按钮\n * @param config 按钮配置\n */\n public addButton(config: ButtonConfig) {\n this.toolbar?.addButton(config);\n this.toolbar?.render();\n }\n\n /**\n * 设置按钮可见性\n * @param id 按钮 ID\n * @param v 是否可见\n */\n public setButtonVisibility(id: string, v: boolean) {\n this.toolbar?.updateButtonVisibility(id, v);\n }\n\n /**\n * 设置是否显示标签\n * @param show 是否显示\n */\n public setShowLabel(show: boolean) {\n this.toolbar?.setShowLabel(show);\n }\n\n /**\n * 设置按钮组可见性\n * @param visible 是否可见\n */\n public setVisible(visible: boolean) {\n if (this.toolbarContainer) {\n this.toolbarContainer.style.visibility = visible ? 'visible' : 'hidden';\n }\n }\n\n /**\n * 设置背景颜色\n * @param color 颜色值\n */\n public setBackgroundColor(color: string) {\n this.toolbar?.setBackgroundColor(color);\n }\n\n /**\n * 设置按钮组颜色\n * @param colors 颜色配置\n */\n public setColors(colors: ButtonGroupColors) {\n this.toolbar?.setColors(colors);\n }\n}\n","/**\n * 对话框管理器基类\n * 提供对话框的通用生命周期管理\n */\nimport { BaseManager } from './base-manager';\nimport { BimDialog } from '../components/dialog';\n\n/** 对话框配置选项 */\nexport interface DialogManagerOptions {\n /** 是否可拖拽 */\n draggable?: boolean;\n /** 是否可调整大小 */\n resizable?: boolean;\n}\n\n/**\n * 对话框管理器抽象基类\n * 子类需要实现 dialogId、dialogTitle 和 createContent 方法\n */\nexport abstract class BaseDialogManager extends BaseManager {\n /** 对话框实例 */\n protected dialog: BimDialog | null = null;\n /** 对话框是否可见 */\n protected isVisible: boolean = false;\n\n /** 对话框唯一标识(子类必须实现) */\n protected abstract get dialogId(): string;\n /** 对话框标题,支持国际化 key(子类必须实现) */\n protected abstract get dialogTitle(): string;\n\n /** 对话框宽度,默认 300 */\n protected get dialogWidth(): number {\n return 300;\n }\n\n /** 对话框高度,默认 'auto' 自适应 */\n protected get dialogHeight(): number | 'auto' {\n return 'auto';\n }\n\n /** 对话框选项,默认可拖拽不可缩放 */\n protected get dialogOptions(): DialogManagerOptions {\n return { draggable: true, resizable: false };\n }\n\n /** 创建对话框内容(子类必须实现) */\n protected abstract createContent(): HTMLElement;\n\n /** 对话框关闭时的回调,子类可重写 */\n protected onDialogClose(): void {}\n /** 对话框创建后的回调,子类可重写 */\n protected onDialogCreated(): void {}\n /** 销毁前的回调,子类可重写 */\n protected onBeforeDestroy(): void {}\n\n /**\n * 获取对话框位置\n * 默认定位在容器右侧居中,子类可重写\n */\n protected getDialogPosition(): { x: number; y: number } {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n const width = this.dialogWidth;\n const height = typeof this.dialogHeight === 'number' ? this.dialogHeight : 300;\n const paddingRight = 20;\n\n return {\n x: containerWidth - width - paddingRight,\n y: (containerHeight - height) / 2\n };\n }\n\n /** 显示对话框 */\n public show(): void {\n if (!this.registry.dialog || !this.registry.container) {\n console.warn(`[${this.dialogId}] Dialog manager or container is not initialized`);\n return;\n }\n\n if (this.dialog) {\n this.destroyDialog();\n }\n\n const position = this.getDialogPosition();\n const content = this.createContent();\n const options = this.dialogOptions;\n\n this.dialog = this.registry.dialog.create({\n id: this.dialogId,\n title: this.dialogTitle,\n content,\n width: this.dialogWidth,\n height: this.dialogHeight,\n position,\n draggable: options.draggable,\n resizable: options.resizable,\n onClose: () => {\n this.onDialogClose();\n this.destroyDialog();\n }\n });\n this.dialog.init();\n this.isVisible = true;\n this.onDialogCreated();\n }\n\n /** 隐藏对话框 */\n public hide(): void {\n this.destroyDialog();\n }\n\n /** 切换对话框显示状态 */\n public toggle(): void {\n if (this.isVisible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /** 获取对话框是否打开 */\n public isOpen(): boolean {\n return this.isVisible;\n }\n\n /** 销毁对话框 */\n protected destroyDialog(): void {\n this.onBeforeDestroy();\n if (this.dialog) {\n this.dialog.destroy();\n this.dialog = null;\n }\n this.isVisible = false;\n }\n\n /** 销毁管理器 */\n public destroy(): void {\n this.destroyDialog();\n super.destroy();\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { MeasureConfig, MeasureMode, MeasurePanelOptions, MeasurePrecision, MeasureResult, MeasureUnit } from './types';\n\n/**\n * 测量方式图标(SVG)\n *\n * 说明:\n * - 你上传的 SVG 原文件放在 `src/assets/icons/` 目录\n * - 原始 SVG 含 defs/clipPath/style/背景 rect,直接内联时容易出现渲染/裁剪异常(尤其多个图标同时出现)\n * - 这里把图标“瘦身”为纯 path,并统一使用 currentColor,确保稳定渲染\n */\nconst MEASURE_MODE_ICON_SVGS: Record = {\n distance: ``,\n minDistance: ``,\n angle: ``,\n elevation: ``,\n volume: ``,\n laserDistance: ``,\n slope: ``,\n spaceVolume: ``\n};\n\n/**\n * 测量面板组件(只做 UI,不实现真实测量)\n *\n * 组件职责:\n * - 展示 8 种测量方式按钮(默认 4 个,可展开/收起)\n * - 维护当前选中的测量方式(current mode)\n * - 展示测量结果(由外部 setResult 注入)\n * - 提供 “删除全部 / 设置” 的 UI 与对外方法(暂不实现真实逻辑,仅回调/占位)\n *\n * 注意:\n * - 所有用户可见文本必须通过 t(key) 获取(国际化强制要求)\n * - 组件需要订阅主题/语言变更,并在 destroy 时清理订阅\n */\nexport class MeasurePanel implements IBimComponent {\n public element: HTMLElement;\n\n private options: MeasurePanelOptions;\n private activeMode: MeasureMode;\n private isExpanded: boolean;\n private result: MeasureResult | null = null;\n\n /**\n * 测量配置(单位/精度)\n * 说明:\n * - 你要求:创建 MeasurePanel 不传入单位和精度\n * - 默认值维护在组件内部\n * - 初始化时优先读取缓存(localStorage),否则使用默认值\n */\n private config: MeasureConfig;\n\n /** 设置面板的临时配置(用于“取消”回滚) */\n private draftConfig: MeasureConfig | null = null;\n\n /** 当前视图:主面板 / 设置面板 */\n private view: 'main' | 'settings' = 'main';\n\n /** 缓存 key(默认全局) */\n private static readonly CONFIG_CACHE_KEY = 'bim-engine:measure:config';\n\n /** 默认配置(由组件内部维护) */\n private static readonly DEFAULT_CONFIG: MeasureConfig = {\n unit: 'mm',\n precision: 2\n };\n\n // DOM 引用(便于局部更新,减少频繁 querySelector)\n private toolButtons: Map = new Map();\n private toggleBtn!: HTMLButtonElement;\n private toggleTextEl!: HTMLElement;\n private mainValueValueEl!: HTMLElement;\n private mainValueLabelEl!: HTMLElement;\n private mainNumberEl!: HTMLElement;\n private mainUnitEl!: HTMLElement;\n private xyzBoxEl!: HTMLElement;\n private xyzXEl!: HTMLElement;\n private xyzYEl!: HTMLElement;\n private xyzZEl!: HTMLElement;\n private clearBtn!: HTMLButtonElement;\n private settingsBtn!: HTMLButtonElement;\n\n // Settings DOM\n private mainViewEl!: HTMLElement;\n private settingsViewEl!: HTMLElement;\n private unitSelectEl!: HTMLSelectElement;\n private precisionSelectEl!: HTMLSelectElement;\n private saveSettingsBtn!: HTMLButtonElement;\n private cancelSettingsBtn!: HTMLButtonElement;\n\n // 订阅清理\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n /**\n * 构造函数\n * @param options 组件配置\n */\n constructor(options: MeasurePanelOptions = {}) {\n this.options = options;\n this.activeMode = options.defaultMode ?? 'distance';\n this.isExpanded = options.defaultExpanded ?? false;\n\n // 读取配置:优先缓存,否则默认\n this.config = this.loadConfigFromCache() ?? { ...MeasurePanel.DEFAULT_CONFIG };\n\n this.element = this.createDom();\n }\n\n /**\n * 初始化组件(实现 IBimComponent)\n */\n public init(): void {\n // 订阅语言变更:更新所有文本/提示\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 订阅主题变更:更新 CSS 变量(如需要)\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 初始应用\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n\n // 初始渲染状态(按钮显隐、选中态、结果区)\n this.applyExpandedState();\n this.applyActiveModeState();\n this.applyViewState();\n this.renderResult();\n\n // 触发初始测量模式的回调(让外部知道默认激活了哪个模式)\n if (this.options.onModeChange) {\n this.options.onModeChange(this.activeMode);\n }\n }\n\n /**\n * 设置主题(实现 IBimComponent)\n * @param theme 主题配置\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-bg-elevated', theme.bgElevated ?? '#1f2d3e');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-divider', theme.divider ?? '#334155');\n \n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-hover', theme.primaryHover ?? '#60a5fa');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n style.setProperty('--bim-danger', theme.danger ?? '#ef4444');\n \n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-text-secondary', theme.textSecondary ?? '#94a3b8');\n style.setProperty('--bim-text-tertiary', theme.textTertiary ?? '#64748b');\n style.setProperty('--bim-text-inverse', theme.textInverse ?? '#152232');\n \n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n \n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n }\n\n /**\n * 设置语言(实现 IBimComponent)\n */\n public setLocales(): void {\n // 1) 更新按钮 tooltip(图标占位时,tooltip 是主要的可读文本)\n for (const [mode, btn] of this.toolButtons.entries()) {\n btn.title = t(this.getModeI18nKey(mode));\n btn.setAttribute('aria-label', btn.title);\n }\n\n // 2) 更新展开/收起按钮 tooltip\n this.toggleBtn.title = this.isExpanded ? t('measure.actions.collapse') : t('measure.actions.expand');\n this.toggleBtn.setAttribute('aria-label', this.toggleBtn.title);\n\n // 2.1) 更新展开/收起按钮可见文本(你要求的“文字提示”)\n if (this.toggleTextEl) {\n this.toggleTextEl.textContent = this.toggleBtn.title;\n }\n\n // 3) 更新底部按钮文本/tooltip\n this.clearBtn.textContent = t('measure.actions.clearAll');\n this.settingsBtn.title = t('measure.actions.settings');\n this.settingsBtn.setAttribute('aria-label', this.settingsBtn.title);\n\n // 4) 主值 label(随模式变化)\n this.mainValueLabelEl.textContent = t(this.getModeValueLabelI18nKey(this.activeMode));\n\n // 6) XYZ label(使用 key)\n // 这里 label 在 createDom 已经是固定文本节点,直接用 setText 更新更直观\n // 但为了减少 DOM 结构复杂度,我们把 label 写在 createDom 里,通过 data-key 更新\n const labelNodes = this.element.querySelectorAll('[data-i18n-key]');\n labelNodes.forEach((node) => {\n const key = node.dataset.i18nKey;\n if (key) node.textContent = t(key);\n });\n\n // 7) 设置面板文本\n this.saveSettingsBtn.textContent = t('measure.settings.save');\n this.cancelSettingsBtn.textContent = t('measure.settings.cancel');\n }\n\n /**\n * 销毁组件(实现 IBimComponent)\n */\n public destroy(): void {\n // 清理订阅\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n\n // 清理事件监听:由于本组件的监听都绑定在创建时的具体按钮上,\n // 且按钮会随 element 一起被 GC,这里不做逐个 removeEventListener(可读性优先)\n\n // 移除 DOM\n this.element.remove();\n }\n\n // ==========================\n // 对外 API(给 Manager / 外部业务调用)\n // ==========================\n\n /**\n * 获取当前测量方式\n */\n public getActiveMode(): MeasureMode {\n return this.activeMode;\n }\n\n /**\n * 切换测量方式(你要求的“切换类型的方法”)\n * @param mode 目标测量方式\n */\n public switchMode(mode: MeasureMode): void {\n this.setActiveMode(mode);\n }\n\n /**\n * 设置当前测量方式\n * @param mode 目标测量方式\n */\n public setActiveMode(mode: MeasureMode): void {\n if (this.activeMode === mode) return;\n this.activeMode = mode;\n this.applyActiveModeState();\n\n // 切换方式后,主值 label 也需要更新\n this.mainValueLabelEl.textContent = t(this.getModeValueLabelI18nKey(this.activeMode));\n\n // 通知外部(如果需要)\n if (this.options.onModeChange) {\n this.options.onModeChange(mode);\n }\n\n // 模式切换后,结果展示也应刷新(例如某些字段显示为 --)\n this.renderResult();\n\n // 切换模式会影响结果区高度(例如 distance 显示 xyz,其它不显示)\n // 复用 onExpandedChange 来通知外部重新计算 Dialog 高度(不额外扩展回调,保持接口简单)\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n }\n\n /**\n * 设置测量结果(由外部注入)\n * @param result 测量结果;传 null 表示清空\n */\n public setResult(result: MeasureResult | null): void {\n this.result = result;\n this.renderResult();\n }\n\n /**\n * 删除全部(只做 UI 状态清空 + 回调)\n */\n public clearAll(): void {\n // 先清空结果显示\n this.result = null;\n this.renderResult();\n\n // 通知外部\n if (this.options.onClearAll) {\n this.options.onClearAll();\n }\n }\n\n /**\n * 打开设置(本次只预留方法/回调)\n */\n public openSettings(): void {\n // 进入设置面板(组件内部逻辑)\n this.enterSettingsView();\n\n // 仍然保留回调(如果外部想监听)\n if (this.options.onSettings) {\n this.options.onSettings();\n }\n }\n\n /**\n * 获取当前测量配置\n */\n public getConfig(): MeasureConfig {\n return { ...this.config };\n }\n\n /**\n * 设置测量配置(可选对外调用)\n * @param partial 部分更新\n * @param persist 是否写入缓存(默认 false)\n */\n public setConfig(partial: Partial, persist: boolean = false): void {\n const next: MeasureConfig = {\n unit: partial.unit ?? this.config.unit,\n precision: partial.precision ?? this.config.precision\n };\n this.config = next;\n if (persist) {\n this.saveConfigToCache(next);\n }\n\n // 配置变化会影响数值显示(单位/精度)\n this.renderResult();\n\n // 如果当前在设置面板,表单也需要同步\n if (this.view === 'settings') {\n this.syncSettingsFormFromConfig(next);\n }\n }\n\n /**\n * 展开 / 收起(可选对外调用)\n * @param expanded 是否展开\n */\n public setExpanded(expanded: boolean): void {\n if (this.isExpanded === expanded) return;\n this.isExpanded = expanded;\n this.applyExpandedState();\n this.setLocales(); // 更新 tooltip(展开/收起)\n\n // 通知外部:用于重新计算 Dialog 高度\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n }\n\n /**\n * 获取是否展开\n */\n public getExpanded(): boolean {\n return this.isExpanded;\n }\n\n // ==========================\n // 内部实现\n // ==========================\n\n private createDom(): HTMLElement {\n const root = document.createElement('div');\n root.className = 'bim-measure-panel';\n\n // 主视图容器(默认显示)\n this.mainViewEl = document.createElement('div');\n this.mainViewEl.className = 'bim-measure-main';\n\n // 顶部:工具按钮区\n const toolsBox = document.createElement('div');\n toolsBox.className = 'bim-measure-tools';\n\n const grid = document.createElement('div');\n grid.className = 'bim-measure-tool-grid';\n\n // 8 种测量方式(顺序严格按你给的)\n const modes: MeasureMode[] = [\n 'distance',\n 'minDistance',\n 'angle',\n 'elevation',\n 'volume',\n 'laserDistance',\n 'slope',\n 'spaceVolume'\n ];\n\n // 图标:优先使用你上传的 SVG 文件内容(已内联到 MEASURE_MODE_ICON_SVGS)\n // 兜底:如果某个 mode 没有配置图标,则使用圆形占位(防止页面空白)\n const fallbackCircleIconSvg = `\n \n \n \n `;\n\n // 逐个创建按钮\n for (let i = 0; i < modes.length; i++) {\n const mode = modes[i];\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'bim-measure-tool-btn';\n btn.dataset.mode = mode;\n\n // icon\n const icon = document.createElement('span');\n icon.className = 'bim-measure-tool-icon';\n icon.innerHTML = MEASURE_MODE_ICON_SVGS[mode] || fallbackCircleIconSvg;\n btn.appendChild(icon);\n\n // 点击切换模式\n btn.addEventListener('click', () => {\n this.setActiveMode(mode);\n });\n\n // 先不在这里设置 title/text(统一交给 setLocales)\n this.toolButtons.set(mode, btn);\n grid.appendChild(btn);\n }\n\n toolsBox.appendChild(grid);\n\n // 展开/收起按钮(箭头)\n const toggleBox = document.createElement('div');\n toggleBox.className = 'bim-measure-toggle';\n\n this.toggleBtn = document.createElement('button');\n this.toggleBtn.type = 'button';\n this.toggleBtn.className = 'bim-measure-toggle-btn';\n // 展开/收起按钮:更小,并带文字提示(展开/收起)\n // 注意:文本内容由 setLocales() 统一更新,这里先放一个占位容器\n this.toggleTextEl = document.createElement('span');\n this.toggleTextEl.className = 'bim-measure-toggle-text';\n const toggleIconEl = document.createElement('span');\n toggleIconEl.className = 'bim-measure-toggle-icon';\n toggleIconEl.innerHTML = `\n \n \n \n `;\n this.toggleBtn.appendChild(this.toggleTextEl);\n this.toggleBtn.appendChild(toggleIconEl);\n this.toggleBtn.addEventListener('click', () => {\n this.isExpanded = !this.isExpanded;\n this.applyExpandedState();\n this.setLocales(); // 更新 tooltip(展开/收起)\n\n // 通知外部:用于重新计算 Dialog 高度\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n });\n\n toggleBox.appendChild(this.toggleBtn);\n toolsBox.appendChild(toggleBox);\n this.mainViewEl.appendChild(toolsBox);\n\n // 中部:结果区\n const resultBox = document.createElement('div');\n resultBox.className = 'bim-measure-result';\n\n // 主结果值(随模式变化)\n const mainValueRow = document.createElement('div');\n mainValueRow.className = 'bim-measure-row';\n const mainValueLabel = document.createElement('span');\n mainValueLabel.className = 'label';\n this.mainValueLabelEl = mainValueLabel;\n const mainValueValue = document.createElement('span');\n mainValueValue.className = 'value';\n this.mainValueValueEl = mainValueValue;\n\n // 主值拆分:数值(黄色)+ 单位(普通色)\n // 这样可以满足:\n // 1) 只让“数据”变黄,单位不变色\n // 2) 没有数据时展示 `-- 单位`\n this.mainNumberEl = document.createElement('span');\n this.mainNumberEl.className = 'bim-measure-main-number';\n this.mainUnitEl = document.createElement('span');\n this.mainUnitEl.className = 'bim-measure-main-unit';\n this.mainValueValueEl.appendChild(this.mainNumberEl);\n this.mainValueValueEl.appendChild(document.createTextNode(' '));\n this.mainValueValueEl.appendChild(this.mainUnitEl);\n mainValueRow.appendChild(mainValueLabel);\n mainValueRow.appendChild(mainValueValue);\n resultBox.appendChild(mainValueRow);\n\n // XYZ\n const xyzBox = document.createElement('div');\n xyzBox.className = 'bim-measure-xyz';\n this.xyzBoxEl = xyzBox;\n\n const makeXyzRow = (labelKey: string, valueClassName: string, valueElSetter: (el: HTMLElement) => void) => {\n const row = document.createElement('div');\n row.className = 'bim-measure-row';\n const label = document.createElement('span');\n label.className = 'label';\n label.dataset.i18nKey = labelKey;\n const value = document.createElement('span');\n value.className = `value ${valueClassName}`;\n valueElSetter(value);\n row.appendChild(label);\n row.appendChild(value);\n return row;\n };\n\n xyzBox.appendChild(makeXyzRow('measure.labels.x', 'bim-measure-xyz-x', (el) => (this.xyzXEl = el)));\n xyzBox.appendChild(makeXyzRow('measure.labels.y', 'bim-measure-xyz-y', (el) => (this.xyzYEl = el)));\n xyzBox.appendChild(makeXyzRow('measure.labels.z', 'bim-measure-xyz-z', (el) => (this.xyzZEl = el)));\n resultBox.appendChild(xyzBox);\n\n this.mainViewEl.appendChild(resultBox);\n\n // 底部:删除全部 + 设置\n const footer = document.createElement('div');\n footer.className = 'bim-measure-footer';\n\n this.clearBtn = document.createElement('button');\n this.clearBtn.type = 'button';\n this.clearBtn.className = 'bim-measure-clear-btn';\n this.clearBtn.addEventListener('click', () => {\n this.clearAll();\n });\n\n this.settingsBtn = document.createElement('button');\n this.settingsBtn.type = 'button';\n this.settingsBtn.className = 'bim-measure-settings-btn';\n this.settingsBtn.innerHTML = `\n \n \n \n `;\n this.settingsBtn.addEventListener('click', () => {\n this.openSettings();\n });\n\n footer.appendChild(this.clearBtn);\n footer.appendChild(this.settingsBtn);\n this.mainViewEl.appendChild(footer);\n\n // 设置视图容器(默认隐藏)\n this.settingsViewEl = this.createSettingsDom();\n\n root.appendChild(this.mainViewEl);\n root.appendChild(this.settingsViewEl);\n\n return root;\n }\n\n /**\n * 创建“设置面板”DOM\n */\n private createSettingsDom(): HTMLElement {\n const box = document.createElement('div');\n box.className = 'bim-measure-settings';\n\n // 标题\n const title = document.createElement('div');\n title.className = 'bim-measure-settings-title';\n title.dataset.i18nKey = 'measure.settings.title';\n box.appendChild(title);\n\n // 单位\n const unitRow = document.createElement('div');\n unitRow.className = 'bim-measure-settings-row';\n const unitLabel = document.createElement('div');\n unitLabel.className = 'label';\n unitLabel.dataset.i18nKey = 'measure.settings.unit';\n this.unitSelectEl = document.createElement('select');\n this.unitSelectEl.className = 'bim-measure-settings-select';\n this.unitSelectEl.appendChild(this.makeOption('m'));\n this.unitSelectEl.appendChild(this.makeOption('cm'));\n this.unitSelectEl.appendChild(this.makeOption('mm'));\n this.unitSelectEl.appendChild(this.makeOption('km'));\n unitRow.appendChild(unitLabel);\n unitRow.appendChild(this.unitSelectEl);\n box.appendChild(unitRow);\n\n // 提示文本:你要求放在“单位”下面\n const hint = document.createElement('div');\n hint.className = 'bim-measure-settings-hint';\n hint.dataset.i18nKey = 'measure.settings.hint';\n box.appendChild(hint);\n\n // 精度\n const precisionRow = document.createElement('div');\n precisionRow.className = 'bim-measure-settings-row';\n const precisionLabel = document.createElement('div');\n precisionLabel.className = 'label';\n precisionLabel.dataset.i18nKey = 'measure.settings.precision';\n this.precisionSelectEl = document.createElement('select');\n this.precisionSelectEl.className = 'bim-measure-settings-select';\n this.precisionSelectEl.appendChild(this.makePrecisionOption(0));\n this.precisionSelectEl.appendChild(this.makePrecisionOption(1));\n this.precisionSelectEl.appendChild(this.makePrecisionOption(2));\n this.precisionSelectEl.appendChild(this.makePrecisionOption(3));\n precisionRow.appendChild(precisionLabel);\n precisionRow.appendChild(this.precisionSelectEl);\n box.appendChild(precisionRow);\n\n // 底部按钮\n const actions = document.createElement('div');\n actions.className = 'bim-measure-settings-actions';\n\n this.saveSettingsBtn = document.createElement('button');\n this.saveSettingsBtn.type = 'button';\n this.saveSettingsBtn.className = 'bim-measure-settings-save';\n this.saveSettingsBtn.addEventListener('click', () => {\n this.saveSettings();\n });\n\n this.cancelSettingsBtn = document.createElement('button');\n this.cancelSettingsBtn.type = 'button';\n this.cancelSettingsBtn.className = 'bim-measure-settings-cancel';\n this.cancelSettingsBtn.addEventListener('click', () => {\n this.cancelSettings();\n });\n\n actions.appendChild(this.saveSettingsBtn);\n actions.appendChild(this.cancelSettingsBtn);\n box.appendChild(actions);\n\n // 初次同步表单值\n this.syncSettingsFormFromConfig(this.config);\n\n return box;\n }\n\n private makeOption(unit: MeasureUnit): HTMLOptionElement {\n const opt = document.createElement('option');\n opt.value = unit;\n // 选项显示内容:直接显示单位字符串\n opt.textContent = unit;\n return opt;\n }\n\n private makePrecisionOption(precision: MeasurePrecision): HTMLOptionElement {\n const opt = document.createElement('option');\n opt.value = String(precision);\n // 显示:0 / 0.0 / 0.00 / 0.000\n opt.textContent = precision === 0 ? '0' : `0.${'0'.repeat(precision)}`;\n return opt;\n }\n\n /**\n * 进入设置视图:保存一份当前配置作为草稿基线\n */\n private enterSettingsView(): void {\n this.draftConfig = { ...this.config };\n this.view = 'settings';\n this.syncSettingsFormFromConfig(this.config);\n this.applyViewState();\n }\n\n /**\n * 保存设置:写入 config + 写缓存 + 返回主视图\n */\n private saveSettings(): void {\n const unit = (this.unitSelectEl.value as MeasureUnit) || this.config.unit;\n const precision = (Number(this.precisionSelectEl.value) as MeasurePrecision);\n const next: MeasureConfig = {\n unit,\n precision: this.isValidPrecision(precision) ? precision : this.config.precision\n };\n\n this.config = next;\n this.saveConfigToCache(next);\n this.draftConfig = null;\n this.view = 'main';\n this.applyViewState();\n\n // 配置变化会影响显示\n this.renderResult();\n\n // 高度变化(设置面板 -> 主面板)也需要通知外部\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n }\n\n /**\n * 取消设置:回滚到进入设置前的配置,并返回主视图\n */\n private cancelSettings(): void {\n if (this.draftConfig) {\n this.config = { ...this.draftConfig };\n }\n this.draftConfig = null;\n this.view = 'main';\n this.applyViewState();\n this.renderResult();\n\n // 高度变化(设置面板 -> 主面板)也需要通知外部\n if (this.options.onExpandedChange) {\n this.options.onExpandedChange(this.isExpanded);\n }\n }\n\n private syncSettingsFormFromConfig(config: MeasureConfig): void {\n this.unitSelectEl.value = config.unit;\n this.precisionSelectEl.value = String(config.precision);\n }\n\n private applyViewState(): void {\n if (this.view === 'settings') {\n this.mainViewEl.style.display = 'none';\n // 注意:CSS 里 `.bim-measure-settings { display: none; }` 是默认隐藏\n // 因此这里必须显式设置为可见(否则会出现“进入设置页后什么都不显示”的问题)\n this.settingsViewEl.style.display = 'block';\n } else {\n // 显式恢复主视图显示(避免外部样式干扰)\n this.mainViewEl.style.display = 'block';\n this.settingsViewEl.style.display = 'none';\n }\n }\n\n /**\n * 从缓存读取配置\n * - 有缓存:返回解析后的配置\n * - 无缓存/解析失败:返回 null\n */\n private loadConfigFromCache(): MeasureConfig | null {\n try {\n const raw = localStorage.getItem(MeasurePanel.CONFIG_CACHE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Partial;\n if (!parsed || typeof parsed !== 'object') return null;\n\n const unit = parsed.unit;\n const precision = parsed.precision;\n\n if (!this.isValidUnit(unit) || !this.isValidPrecision(precision as number)) return null;\n\n return {\n unit,\n precision: precision as MeasurePrecision\n };\n } catch (_e) {\n // localStorage 可能被禁用或 JSON 格式不正确,直接忽略\n return null;\n }\n }\n\n /**\n * 写入缓存(localStorage)\n */\n private saveConfigToCache(config: MeasureConfig): void {\n try {\n localStorage.setItem(MeasurePanel.CONFIG_CACHE_KEY, JSON.stringify(config));\n } catch (_e) {\n // localStorage 可能被禁用:忽略即可,不影响功能\n }\n }\n\n private isValidUnit(unit: any): unit is MeasureUnit {\n return unit === 'm' || unit === 'cm' || unit === 'mm' || unit === 'km';\n }\n\n private isValidPrecision(precision: any): precision is MeasurePrecision {\n return precision === 0 || precision === 1 || precision === 2 || precision === 3;\n }\n\n /**\n * 应用“展开/收起”状态:默认只显示前 4 个按钮\n */\n private applyExpandedState(): void {\n let index = 0;\n for (const btn of this.toolButtons.values()) {\n // 默认展示前四个,其余根据展开状态显示/隐藏\n if (index >= 4) {\n btn.style.display = this.isExpanded ? '' : 'none';\n } else {\n btn.style.display = '';\n }\n index++;\n }\n\n // toggle 样式(旋转箭头)\n if (this.isExpanded) {\n this.toggleBtn.classList.add('is-expanded');\n } else {\n this.toggleBtn.classList.remove('is-expanded');\n }\n }\n\n /**\n * 应用“当前选中按钮”样式\n */\n private applyActiveModeState(): void {\n for (const [mode, btn] of this.toolButtons.entries()) {\n if (mode === this.activeMode) {\n btn.classList.add('is-active');\n } else {\n btn.classList.remove('is-active');\n }\n }\n }\n\n /**\n * 渲染结果区(根据 activeMode 从 result 里取对应字段)\n */\n private renderResult(): void {\n // 1) 根据模式决定结果区显示规则\n // 你给的规则:\n // - 距离:显示数值 + xyz\n // - 最小距离:只显示数值\n // - 角度:--°\n // - 标高:--m(固定 m)\n // - 体积:--mm³(单位随设置变动,即 unit³)\n // - 激光测距:不显示任何数值/xyz,只显示“激光测距”文字\n // - 坡度:--%\n // - 空间体积:--mm³(单位随设置变动,即 unit³)\n\n // 1.1) 主行:默认显示 label + value(数值/单位拆分)\n // 激光测距:只显示文字,因此隐藏 label/单位\n if (this.activeMode === 'laserDistance') {\n this.mainValueLabelEl.style.display = 'none';\n this.mainNumberEl.textContent = t(this.getModeI18nKey('laserDistance'));\n this.mainUnitEl.textContent = '';\n // 激光测距:你要求不使用黄色主数据\n this.mainNumberEl.classList.add('is-laser-text');\n } else {\n this.mainValueLabelEl.style.display = '';\n this.mainValueLabelEl.textContent = t(this.getModeValueLabelI18nKey(this.activeMode));\n const parts = this.formatMainValueParts(this.activeMode, this.result);\n this.mainNumberEl.textContent = parts.numberText;\n this.mainUnitEl.textContent = parts.unitText;\n // 其它模式:恢复黄色主数据\n this.mainNumberEl.classList.remove('is-laser-text');\n }\n\n // 1.2) XYZ:只有“距离”需要展示\n if (this.activeMode === 'distance') {\n this.xyzBoxEl.style.display = '';\n const xyz = this.result?.xyz;\n if (!xyz) {\n this.xyzXEl.textContent = '--';\n this.xyzYEl.textContent = '--';\n this.xyzZEl.textContent = '--';\n return;\n }\n this.xyzXEl.textContent = this.formatNumberWithPrecision(xyz.x, this.config.precision);\n this.xyzYEl.textContent = this.formatNumberWithPrecision(xyz.y, this.config.precision);\n this.xyzZEl.textContent = this.formatNumberWithPrecision(xyz.z, this.config.precision);\n return;\n }\n\n // 非 distance:隐藏 xyz\n this.xyzBoxEl.style.display = 'none';\n }\n\n /**\n * 获取模式名称的国际化 key\n */\n private getModeI18nKey(mode: MeasureMode): string {\n return `measure.modes.${mode}`;\n }\n\n /**\n * 获取“主值 label”的国际化 key(随模式变化)\n */\n private getModeValueLabelI18nKey(mode: MeasureMode): string {\n return `measure.labels.value.${mode}`;\n }\n\n // 注意:旧的 formatMainValue/formatWithFixedUnit 已被 formatMainValueParts 替代,\n // 以支持“数值与单位分色显示”和“无数据时仍展示单位”。\n\n /**\n * 基础数字格式化(按精度显示)\n */\n private formatNumberWithPrecision(value: number, precision: MeasurePrecision): string {\n // 你要求精度可选:0 / 0.0 / 0.00 / 0.000,因此这里不做 trim,严格按 toFixed 输出\n return value.toFixed(precision);\n }\n\n // 注意:旧的 formatLengthWithConfig 已被 formatLengthParts 替代。\n\n private convertMmToUnit(mm: number, unit: MeasureUnit): number {\n switch (unit) {\n case 'mm':\n return mm;\n case 'cm':\n return mm / 10;\n case 'm':\n return mm / 1000;\n case 'km':\n return mm / 1_000_000;\n default:\n return mm;\n }\n }\n\n private getUnitI18nKey(unit: MeasureUnit): string {\n return `measure.units.${unit}`;\n }\n\n // 注意:旧的 formatElevationFixedMeters / formatVolumeWithConfig 已被 formatMainValueParts 替代。\n\n private convertMm3ToUnit3(mm3: number, unit: MeasureUnit): number {\n // 先把 mm³ -> 对应 unit³\n // mm -> cm: /10,因此 mm³ -> cm³: /1000\n // mm -> m : /1000,因此 mm³ -> m³ : /1e9\n // mm -> km: /1e6,因此 mm³ -> km³: /1e18\n switch (unit) {\n case 'mm':\n return mm3;\n case 'cm':\n return mm3 / 1000;\n case 'm':\n return mm3 / 1_000_000_000;\n case 'km':\n return mm3 / 1_000_000_000_000_000_000;\n default:\n return mm3;\n }\n }\n\n /**\n * 主数据拆分:返回 { 数值文本, 单位文本 }\n * 规则:\n * - 没数据时:必须展示 `-- 单位`(而不是只展示 `--`)\n * - 单位随模式变化:\n * - 距离/最小距离:单位随设置变动\n * - 角度:°\n * - 标高:固定 m\n * - 体积/空间体积:单位³(随设置变动)\n * - 坡度:%\n */\n private formatMainValueParts(mode: MeasureMode, result: MeasureResult | null): { numberText: string; unitText: string } {\n if (mode === 'laserDistance') return { numberText: t(this.getModeI18nKey('laserDistance')), unitText: '' };\n\n // 没有数据:显示 `-- 单位`\n if (!result) {\n return this.getEmptyValuePartsByMode(mode);\n }\n\n switch (mode) {\n case 'distance':\n return this.formatLengthParts(result.distanceMm);\n case 'minDistance':\n return this.formatLengthParts(result.minDistanceMm);\n case 'angle':\n return this.formatFixedUnitParts(result.angleDeg, t('measure.units.deg'));\n case 'elevation':\n // 标高固定 m(外部注入值约定为 mm)\n return this.formatFixedUnitParts(\n result.elevationMm === undefined ? undefined : result.elevationMm / 1000,\n t('measure.units.m')\n );\n case 'volume':\n return this.formatVolumeParts(result.volumeM3);\n case 'slope':\n return this.formatFixedUnitParts(result.slopePercent, t('measure.units.percent'));\n case 'spaceVolume':\n return this.formatVolumeParts(result.spaceVolumeM3);\n default:\n return { numberText: '--', unitText: '' };\n }\n }\n\n private getEmptyValuePartsByMode(mode: MeasureMode): { numberText: string; unitText: string } {\n switch (mode) {\n case 'distance':\n case 'minDistance':\n return { numberText: '--', unitText: t(this.getUnitI18nKey(this.config.unit)) };\n case 'angle':\n return { numberText: '--', unitText: t('measure.units.deg') };\n case 'elevation':\n return { numberText: '--', unitText: t('measure.units.m') };\n case 'volume':\n case 'spaceVolume':\n return { numberText: '--', unitText: `${this.config.unit}³` };\n case 'slope':\n return { numberText: '--', unitText: t('measure.units.percent') };\n default:\n return { numberText: '--', unitText: '' };\n }\n }\n\n private formatFixedUnitParts(value: number | undefined, unitText: string): { numberText: string; unitText: string } {\n if (value === null || value === undefined || Number.isNaN(value)) {\n return { numberText: '--', unitText };\n }\n return { numberText: this.formatNumberWithPrecision(value, this.config.precision), unitText };\n }\n\n private formatLengthParts(valueMm: number | undefined): { numberText: string; unitText: string } {\n const unitText = t(this.getUnitI18nKey(this.config.unit));\n if (valueMm === null || valueMm === undefined || Number.isNaN(valueMm)) {\n return { numberText: '--', unitText };\n }\n const converted = this.convertMmToUnit(valueMm, this.config.unit);\n return { numberText: this.formatNumberWithPrecision(converted, this.config.precision), unitText };\n }\n\n private formatVolumeParts(valueMm3: number | undefined): { numberText: string; unitText: string } {\n const unitText = `${this.config.unit}³`;\n if (valueMm3 === null || valueMm3 === undefined || Number.isNaN(valueMm3)) {\n return { numberText: '--', unitText };\n }\n const converted = this.convertMm3ToUnit3(valueMm3, this.config.unit);\n return { numberText: this.formatNumberWithPrecision(converted, this.config.precision), unitText };\n }\n}\n\n\n","/**\n * 测量对话框管理器\n * 负责管理测量工具对话框的显示、隐藏和测量面板的交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { MeasurePanel } from '../components/measure-panel';\nimport type { MeasureConfig, MeasureMode, MeasureResult } from '../components/measure-panel/types';\n\n/**\n * 测量对话框管理器\n * 继承自 BaseDialogManager,提供测量工具的对话框管理功能\n */\nexport class MeasureDialogManager extends BaseDialogManager {\n /** 测量面板实例 */\n private panel: MeasurePanel | null = null;\n /** 测量配置(单位、精度等) */\n private config: MeasureConfig | null = null;\n\n /** 对话框唯一标识 */\n protected get dialogId(): string {\n return 'measure-dialog';\n }\n\n /** 对话框标题(国际化 key) */\n protected get dialogTitle(): string {\n return 'measure.dialogTitle';\n }\n\n /** 对话框宽度 */\n protected get dialogWidth(): number {\n return 250;\n }\n\n /**\n * 创建对话框内容\n * 初始化测量面板并设置回调\n */\n protected createContent(): HTMLElement {\n this.panel = new MeasurePanel({\n defaultMode: 'distance',\n defaultExpanded: false,\n onModeChange: (mode) => {\n console.log('[MeasureDialogManager] 当前测量方式已切换:', mode);\n this.registry.engine3d?.activateMeasure(mode);\n },\n onClearAll: () => {\n console.log('[MeasureDialogManager] 删除全部');\n this.registry.engine3d?.clearAllMeasures();\n },\n onSettings: () => {\n console.log('[MeasureDialogManager] 打开设置');\n },\n onExpandedChange: () => {\n this.dialog?.fitHeight(false);\n }\n });\n this.panel.init();\n this.config = this.panel.getConfig();\n\n const panelWrapper = document.createElement('div');\n panelWrapper.style.padding = '12px';\n panelWrapper.appendChild(this.panel.element);\n\n return panelWrapper;\n }\n\n /** 对话框创建后的回调,自适应高度 */\n protected onDialogCreated(): void {\n this.dialog?.fitHeight(false);\n }\n\n /** 对话框关闭时的回调,取消工具栏按钮激活状态 */\n protected onDialogClose(): void {\n this.registry.toolbar?.setBtnActive('measure', false);\n }\n\n /** 销毁前的清理,停用测量功能并销毁面板 */\n protected onBeforeDestroy(): void {\n if (this.registry.engine3d) {\n this.registry.engine3d.deactivateMeasure();\n }\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n\n /**\n * 获取当前激活的测量模式\n * @returns 当前测量模式,如 'distance'、'angle' 等\n */\n public getActiveMode(): MeasureMode | null {\n return this.panel ? this.panel.getActiveMode() : null;\n }\n\n /**\n * 切换测量模式\n * @param mode 目标测量模式\n */\n public switchMode(mode: MeasureMode): void {\n if (!this.panel) return;\n this.panel.switchMode(mode);\n }\n\n /**\n * 设置测量结果\n * @param result 测量结果对象\n */\n public setMeasureResult(result: MeasureResult | null): void {\n if (!this.panel) return;\n this.panel.setResult(result);\n }\n\n /**\n * 获取测量配置\n * @returns 测量配置副本\n */\n public getConfig(): MeasureConfig | null {\n if (this.panel) {\n this.config = this.panel.getConfig();\n }\n return this.config ? { ...this.config } : null;\n }\n\n /**\n * 设置测量配置\n * @param partial 部分配置\n * @param persist 是否持久化\n */\n public setConfig(partial: Partial, persist: boolean = true): void {\n if (this.panel) {\n this.panel.setConfig(partial, persist);\n this.config = this.panel.getConfig();\n this.dialog?.fitHeight(false);\n return;\n }\n\n const prev = this.config;\n const next: MeasureConfig = {\n unit: partial.unit ?? prev?.unit ?? 'mm',\n precision: partial.precision ?? prev?.precision ?? 2\n };\n this.config = next;\n }\n\n /** 清除所有测量结果 */\n public clearAll(): void {\n if (!this.panel) return;\n this.panel.clearAll();\n }\n\n /** 打开测量设置面板 */\n public openSettings(): void {\n if (!this.panel) return;\n this.panel.openSettings();\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { SectionPlanePanelOptions } from './types';\nimport { getIcon } from '../../utils/icon-manager';\n\n/**\n * 拾取面剖切面板组件\n * 包含三个操作按钮:隐藏、反向、重置\n */\nexport class SectionPlanePanel implements IBimComponent {\n public element: HTMLElement;\n private options: SectionPlanePanelOptions;\n\n // DOM 引用\n private hideBtn!: HTMLButtonElement;\n private reverseBtn!: HTMLButtonElement;\n private resetBtn!: HTMLButtonElement;\n private hideLabelEl!: HTMLElement;\n private reverseLabelEl!: HTMLElement;\n private resetLabelEl!: HTMLElement;\n\n // 订阅清理\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(options: SectionPlanePanelOptions = {}) {\n this.options = options;\n this.element = this.createDom();\n }\n\n /**\n * 初始化组件\n */\n public init(): void {\n // 订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 初始应用\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n }\n\n /**\n * 设置主题\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n }\n\n /**\n * 设置语言\n */\n public setLocales(): void {\n this.hideLabelEl.textContent = t('sectionPlane.actions.hide');\n this.reverseLabelEl.textContent = t('sectionPlane.actions.reverse');\n this.resetLabelEl.textContent = t('sectionPlane.actions.reset');\n\n this.hideBtn.title = t('sectionPlane.actions.hide');\n this.reverseBtn.title = t('sectionPlane.actions.reverse');\n this.resetBtn.title = t('sectionPlane.actions.reset');\n }\n\n /**\n * 销毁组件\n */\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.element.remove();\n }\n\n /**\n * 创建 DOM\n */\n private createDom(): HTMLElement {\n const root = document.createElement('div');\n root.className = 'section-plane-panel';\n\n // 隐藏按钮\n this.hideBtn = this.createButton(\n 'hide',\n getIcon('隐藏'),\n () => {\n if (this.options.onHide) {\n this.options.onHide();\n }\n }\n );\n\n // 反向按钮\n this.reverseBtn = this.createButton(\n 'reverse',\n getIcon('反向'),\n () => {\n if (this.options.onReverse) {\n this.options.onReverse();\n }\n }\n );\n\n // 重置按钮\n this.resetBtn = this.createButton(\n 'reset',\n getIcon('重置'),\n () => {\n if (this.options.onReset) {\n this.options.onReset();\n }\n }\n );\n\n root.appendChild(this.hideBtn);\n root.appendChild(this.reverseBtn);\n root.appendChild(this.resetBtn);\n\n return root;\n }\n\n /**\n * 创建按钮\n */\n private createButton(type: 'hide' | 'reverse' | 'reset', iconSvg: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'section-plane-btn';\n\n // 图标\n const icon = document.createElement('div');\n icon.className = 'section-plane-btn-icon';\n icon.innerHTML = iconSvg;\n btn.appendChild(icon);\n\n // 标签\n const label = document.createElement('div');\n label.className = 'section-plane-btn-label';\n btn.appendChild(label);\n\n // 保存 label 引用\n if (type === 'hide') {\n this.hideLabelEl = label;\n } else if (type === 'reverse') {\n this.reverseLabelEl = label;\n } else {\n this.resetLabelEl = label;\n }\n\n // 点击事件\n btn.addEventListener('click', onClick);\n\n return btn;\n }\n}\n","/**\n * 拾取面剖切对话框管理器\n * 负责管理拾取面剖切工具对话框的显示和交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { SectionPlanePanel } from '../components/section-plane-panel';\n\n/**\n * 拾取面剖切对话框管理器\n * 继承自 BaseDialogManager,提供拾取面剖切功能的对话框管理\n */\nexport class SectionPlaneDialogManager extends BaseDialogManager {\n /** 剖切面板实例 */\n private panel: SectionPlanePanel | null = null;\n\n /** 对话框唯一标识 */\n protected get dialogId() { return 'section-plane-dialog'; }\n /** 对话框标题(国际化 key) */\n protected get dialogTitle() { return 'sectionPlane.dialogTitle'; }\n /** 对话框宽度 */\n protected get dialogWidth() { return 240; }\n /** 对话框高度 */\n protected get dialogHeight(): number { return 120; }\n\n /** 初始化 */\n public init(): void {}\n\n /**\n * 获取对话框位置\n * 定位在容器右下角\n */\n protected getDialogPosition() {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const paddingRight = 20;\n const paddingBottom = 50;\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n\n return {\n x: containerWidth - this.dialogWidth - paddingRight,\n y: containerHeight - this.dialogHeight - paddingBottom\n };\n }\n\n /** 创建对话框内容 */\n protected createContent(): HTMLElement {\n this.panel = new SectionPlanePanel({\n onHide: () => {\n console.log('[SectionPlaneDialogManager] 隐藏');\n },\n onReverse: () => {\n console.log('[SectionPlaneDialogManager] 反向');\n },\n onReset: () => {\n console.log('[SectionPlaneDialogManager] 重置');\n }\n });\n this.panel.init();\n return this.panel.element;\n }\n\n /** 对话框关闭时的回调 */\n protected onDialogClose(): void {\n this.registry.toolbar?.setBtnActive('section-plane', false);\n }\n\n /** 销毁前的清理 */\n protected onBeforeDestroy(): void {\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { SectionAxisPanelOptions, SectionAxis } from './types';\nimport { getIcon } from '../../utils/icon-manager';\n\n/**\n * 轴向剖切面板组件\n * 第一行:隐藏(toggle)、反向\n * 第二行:X、Y、Z(互斥按钮组)\n */\nexport class SectionAxisPanel implements IBimComponent {\n public element: HTMLElement;\n private options: SectionAxisPanelOptions;\n\n // 状态\n private isHidden: boolean = false;\n private activeAxis: SectionAxis = 'x';\n\n // DOM 引用 - 第一行\n private hideBtn!: HTMLButtonElement;\n private reverseBtn!: HTMLButtonElement;\n private hideLabelEl!: HTMLElement;\n private reverseLabelEl!: HTMLElement;\n\n // DOM 引用 - 第二行\n private axisXBtn!: HTMLButtonElement;\n private axisYBtn!: HTMLButtonElement;\n private axisZBtn!: HTMLButtonElement;\n\n // 订阅清理\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(options: SectionAxisPanelOptions = {}) {\n this.options = options;\n this.isHidden = options.defaultHidden ?? false;\n this.activeAxis = options.defaultAxis ?? 'x';\n this.element = this.createDom();\n }\n\n /**\n * 初始化组件\n */\n public init(): void {\n // 订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 初始应用\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n\n // 初始化按钮状态\n this.updateHideButtonState();\n this.updateAxisButtonsState();\n }\n\n /**\n * 设置主题\n */\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-divider', theme.divider ?? '#334155');\n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n }\n\n /**\n * 设置语言\n */\n public setLocales(): void {\n this.hideLabelEl.textContent = t('sectionAxis.actions.hide');\n this.reverseLabelEl.textContent = t('sectionAxis.actions.reverse');\n // XYZ按钮的文字不需要国际化,保持为单个字母\n\n this.hideBtn.title = t('sectionAxis.actions.hide');\n this.reverseBtn.title = t('sectionAxis.actions.reverse');\n this.axisXBtn.title = t('sectionAxis.actions.axisX');\n this.axisYBtn.title = t('sectionAxis.actions.axisY');\n this.axisZBtn.title = t('sectionAxis.actions.axisZ');\n }\n\n /**\n * 设置隐藏状态\n */\n public setHiddenState(isHidden: boolean): void {\n this.isHidden = isHidden;\n this.updateHideButtonState();\n }\n\n /**\n * 获取隐藏状态\n */\n public getHiddenState(): boolean {\n return this.isHidden;\n }\n\n /**\n * 设置激活的轴向\n */\n public setActiveAxis(axis: SectionAxis): void {\n this.activeAxis = axis;\n this.updateAxisButtonsState();\n }\n\n /**\n * 获取激活的轴向\n */\n public getActiveAxis(): SectionAxis {\n return this.activeAxis;\n }\n\n /**\n * 销毁组件\n */\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.element.remove();\n }\n\n /**\n * 创建 DOM\n */\n private createDom(): HTMLElement {\n const root = document.createElement('div');\n root.className = 'section-axis-panel';\n\n // 第一行:隐藏、反向\n const row1 = document.createElement('div');\n row1.className = 'section-axis-row-1';\n\n this.hideBtn = this.createButton(\n 'hide',\n getIcon('隐藏'),\n () => this.handleHideToggle()\n );\n\n this.reverseBtn = this.createButton(\n 'reverse',\n getIcon('反向'),\n () => this.handleReverse()\n );\n\n row1.appendChild(this.hideBtn);\n row1.appendChild(this.reverseBtn);\n\n // 第二行:X、Y、Z\n const row2 = document.createElement('div');\n row2.className = 'section-axis-row-2';\n\n this.axisXBtn = this.createAxisButton('axisX', 'X', () => this.handleAxisChange('x'));\n this.axisYBtn = this.createAxisButton('axisY', 'Y', () => this.handleAxisChange('y'));\n this.axisZBtn = this.createAxisButton('axisZ', 'Z', () => this.handleAxisChange('z'));\n\n row2.appendChild(this.axisXBtn);\n row2.appendChild(this.axisYBtn);\n row2.appendChild(this.axisZBtn);\n\n root.appendChild(row1);\n root.appendChild(row2);\n\n return root;\n }\n\n /**\n * 创建按钮(带图标)\n */\n private createButton(\n type: 'hide' | 'reverse',\n iconSvg: string,\n onClick: () => void\n ): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'section-axis-btn';\n\n // 图标\n const icon = document.createElement('div');\n icon.className = 'section-axis-btn-icon';\n icon.innerHTML = iconSvg;\n btn.appendChild(icon);\n\n // 标签\n const label = document.createElement('div');\n label.className = 'section-axis-btn-label';\n btn.appendChild(label);\n\n // 保存 label 引用\n if (type === 'hide') {\n this.hideLabelEl = label;\n } else if (type === 'reverse') {\n this.reverseLabelEl = label;\n }\n\n // 点击事件\n btn.addEventListener('click', onClick);\n\n return btn;\n }\n\n /**\n * 创建轴向按钮(仅文字)\n */\n private createAxisButton(\n _type: 'axisX' | 'axisY' | 'axisZ',\n text: string,\n onClick: () => void\n ): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'section-axis-btn section-axis-btn-text';\n\n // 文字标签(既是图标也是标签)\n const label = document.createElement('div');\n label.className = 'section-axis-btn-label';\n label.textContent = text;\n btn.appendChild(label);\n\n // 点击事件\n btn.addEventListener('click', onClick);\n\n return btn;\n }\n\n /**\n * 处理隐藏按钮切换\n */\n private handleHideToggle(): void {\n this.isHidden = !this.isHidden;\n this.updateHideButtonState();\n\n if (this.options.onHideToggle) {\n this.options.onHideToggle(this.isHidden);\n }\n }\n\n /**\n * 处理反向按钮点击\n */\n private handleReverse(): void {\n if (this.options.onReverse) {\n this.options.onReverse();\n }\n }\n\n /**\n * 处理轴向切换\n */\n private handleAxisChange(axis: SectionAxis): void {\n if (this.activeAxis === axis) {\n return; // 已经是激活状态,不重复触发\n }\n\n this.activeAxis = axis;\n this.updateAxisButtonsState();\n\n if (this.options.onAxisChange) {\n this.options.onAxisChange(axis);\n }\n }\n\n /**\n * 更新隐藏按钮状态\n */\n private updateHideButtonState(): void {\n if (this.isHidden) {\n this.hideBtn.classList.add('active');\n } else {\n this.hideBtn.classList.remove('active');\n }\n }\n\n /**\n * 更新轴向按钮状态\n */\n private updateAxisButtonsState(): void {\n this.axisXBtn.classList.toggle('active', this.activeAxis === 'x');\n this.axisYBtn.classList.toggle('active', this.activeAxis === 'y');\n this.axisZBtn.classList.toggle('active', this.activeAxis === 'z');\n }\n}\n","/**\n * 轴向剖切对话框管理器\n * 负责管理轴向剖切工具对话框的显示、隐藏和剖切面板的交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { SectionAxisPanel } from '../components/section-axis-panel';\nimport type { SectionAxis } from '../components/section-axis-panel/types';\n\n/**\n * 轴向剖切对话框管理器\n * 继承自 BaseDialogManager,提供 X/Y/Z 轴向剖切的对话框管理功能\n */\nexport class SectionAxisDialogManager extends BaseDialogManager {\n /** 轴向剖切面板实例 */\n private panel: SectionAxisPanel | null = null;\n\n /** 对话框唯一标识 */\n protected get dialogId(): string {\n return 'section-axis-dialog';\n }\n\n /** 对话框标题(国际化 key) */\n protected get dialogTitle(): string {\n return 'sectionAxis.dialogTitle';\n }\n\n /** 对话框宽度 */\n protected get dialogWidth(): number {\n return 240;\n }\n\n /**\n * 获取对话框位置\n * 定位在容器右下角\n */\n protected getDialogPosition(): { x: number; y: number } {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n const paddingRight = 20;\n const paddingBottom = 50;\n\n return {\n x: containerWidth - this.dialogWidth - paddingRight,\n y: containerHeight - paddingBottom - 200\n };\n }\n\n /**\n * 创建对话框内容\n * 初始化轴向剖切面板并设置回调\n */\n protected createContent(): HTMLElement {\n this.panel = new SectionAxisPanel({\n defaultAxis: 'x',\n defaultHidden: false,\n onHideToggle: (isHidden) => {\n // 隐藏功能:第三方引擎无 API,仅输出日志\n console.log('[SectionAxisDialogManager] 隐藏切换(暂不支持):', isHidden);\n },\n onReverse: () => {\n // 反向功能:第三方引擎无 API,仅输出日志\n console.log('[SectionAxisDialogManager] 反向剖切(暂不支持)');\n },\n onAxisChange: (axis) => {\n console.log('[SectionAxisDialogManager] 切换轴向:', axis);\n this.registry.engine3d?.activateSectionAxis(axis);\n }\n });\n this.panel.init();\n return this.panel.element;\n }\n\n /** 对话框创建后的回调,自适应高度 */\n protected onDialogCreated(): void {\n this.dialog?.fitHeight(false);\n \n // 检查 Engine 是否已初始化\n if (!this.registry.engine3d) {\n console.error('[SectionAxisDialogManager] Engine not initialized. Call initEngine() first.');\n return;\n }\n \n // 自动激活默认轴向剖切(X轴)\n this.registry.engine3d.activateSectionAxis('x');\n }\n\n /** 对话框关闭时的回调,取消工具栏按钮激活状态 */\n protected onDialogClose(): void {\n this.registry.toolbar?.setBtnActive('section-axis', false);\n }\n\n /** 销毁前的清理,销毁面板实例 */\n protected onBeforeDestroy(): void {\n // 停用轴向剖切\n this.registry.engine3d?.deactivateSectionAxis();\n \n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n\n /**\n * 获取剖切面隐藏状态\n * @returns 是否隐藏\n */\n public getHiddenState(): boolean {\n return this.panel?.getHiddenState() ?? false;\n }\n\n /**\n * 设置剖切面隐藏状态\n * @param isHidden 是否隐藏\n */\n public setHiddenState(isHidden: boolean): void {\n this.panel?.setHiddenState(isHidden);\n }\n\n /**\n * 获取当前激活的剖切轴向\n * @returns 当前轴向 'x' | 'y' | 'z'\n */\n public getActiveAxis(): SectionAxis {\n return this.panel?.getActiveAxis() ?? 'x';\n }\n\n /**\n * 设置剖切轴向\n * @param axis 目标轴向\n */\n public setActiveAxis(axis: SectionAxis): void {\n this.panel?.setActiveAxis(axis);\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { SectionBoxPanelOptions, SectionBoxRange } from './types';\nimport { getIcon } from '../../utils/icon-manager';\n\nconst DEFAULT_RANGE: SectionBoxRange = {\n x: { min: 0, max: 100 },\n y: { min: 0, max: 100 },\n z: { min: 0, max: 100 }\n};\n\nexport class SectionBoxPanel implements IBimComponent {\n public element!: HTMLElement;\n private options: SectionBoxPanelOptions;\n\n private isHidden: boolean = false;\n private isReversed: boolean = false;\n private range: SectionBoxRange;\n\n private hideBtn!: HTMLButtonElement;\n private reverseBtn!: HTMLButtonElement;\n private fitBtn!: HTMLButtonElement;\n private resetBtn!: HTMLButtonElement;\n\n private hideLabelEl!: HTMLElement;\n private reverseLabelEl!: HTMLElement;\n private fitLabelEl!: HTMLElement;\n private resetLabelEl!: HTMLElement;\n private xLabelEl!: HTMLElement;\n private yLabelEl!: HTMLElement;\n private zLabelEl!: HTMLElement;\n\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n private xSlider!: HTMLElement;\n private ySlider!: HTMLElement;\n private zSlider!: HTMLElement;\n\n private xMinHandle!: HTMLElement;\n private xMaxHandle!: HTMLElement;\n private yMinHandle!: HTMLElement;\n private yMaxHandle!: HTMLElement;\n private zMinHandle!: HTMLElement;\n private zMaxHandle!: HTMLElement;\n\n private dragState: {\n isDragging: boolean;\n axis: 'x' | 'y' | 'z' | null;\n handleType: 'min' | 'max' | null;\n pointerId: number | null;\n } = {\n isDragging: false,\n axis: null,\n handleType: null,\n pointerId: null\n };\n\n constructor(options: SectionBoxPanelOptions = {}) {\n this.options = options;\n this.isHidden = options.defaultHidden ?? false;\n this.isReversed = options.defaultReversed ?? false;\n this.range = JSON.parse(JSON.stringify(options.defaultRange ?? DEFAULT_RANGE));\n }\n\n public init(): void {\n this.element = this.createPanel();\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n this.updateButtonStates();\n this.updateAllSlidersUI();\n this.setupDragListeners();\n }\n\n // --- Public APIs ---\n\n public setHiddenState(isHidden: boolean): void {\n this.isHidden = isHidden;\n this.updateButtonStates();\n }\n\n public getHiddenState(): boolean {\n return this.isHidden;\n }\n\n public setReversedState(isReversed: boolean): void {\n this.isReversed = isReversed;\n this.updateButtonStates();\n }\n\n public getReversedState(): boolean {\n return this.isReversed;\n }\n\n public setRange(range: Partial): void {\n if (range.x) this.range.x = { ...this.range.x, ...range.x };\n if (range.y) this.range.y = { ...this.range.y, ...range.y };\n if (range.z) this.range.z = { ...this.range.z, ...range.z };\n this.updateAllSlidersUI();\n }\n\n public getRange(): SectionBoxRange {\n return JSON.parse(JSON.stringify(this.range));\n }\n\n public reset(): void {\n this.isHidden = this.options.defaultHidden ?? false;\n this.isReversed = this.options.defaultReversed ?? false;\n this.range = JSON.parse(JSON.stringify(this.options.defaultRange ?? DEFAULT_RANGE));\n this.updateButtonStates();\n this.updateAllSlidersUI();\n this.options.onReset?.();\n this.options.onRangeChange?.(this.range);\n }\n\n // --- Private Setup ---\n\n private createPanel(): HTMLElement {\n const panel = document.createElement('div');\n panel.className = 'section-box-panel';\n\n const buttonsContainer = document.createElement('div');\n buttonsContainer.className = 'section-box-row-buttons';\n\n this.hideBtn = this.createButton('hide', t('sectionBox.actions.hide'), () => {\n this.isHidden = !this.isHidden;\n this.updateButtonStates();\n this.options.onHideToggle?.(this.isHidden);\n }, 'hide');\n\n this.reverseBtn = this.createButton('reverse', t('sectionBox.actions.reverse'), () => {\n this.isReversed = !this.isReversed;\n this.updateButtonStates();\n this.options.onReverseToggle?.(this.isReversed);\n }, 'reverse');\n\n this.fitBtn = this.createButton('fit', t('sectionBox.actions.fitToModel'), () => {\n this.options.onFitToModel?.();\n }, 'fit');\n\n this.resetBtn = this.createButton('reset', t('sectionBox.actions.reset'), () => this.reset(), 'reset');\n\n [this.hideBtn, this.reverseBtn, this.fitBtn, this.resetBtn].forEach(btn => buttonsContainer.appendChild(btn));\n\n const slidersContainer = document.createElement('div');\n slidersContainer.className = 'section-box-sliders';\n slidersContainer.addEventListener('pointerdown', (e) => e.stopPropagation());\n\n this.xSlider = this.createSlider('x', t('sectionBox.axes.x'));\n this.ySlider = this.createSlider('y', t('sectionBox.axes.y'));\n this.zSlider = this.createSlider('z', t('sectionBox.axes.z'));\n\n [this.xSlider, this.ySlider, this.zSlider].forEach(s => slidersContainer.appendChild(s));\n\n panel.appendChild(buttonsContainer);\n panel.appendChild(slidersContainer);\n return panel;\n }\n\n private createButton(type: string, label: string, onClick: () => void, ref?: string): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = 'section-box-btn';\n btn.title = label;\n\n const iconMap: Record = {\n hide: '隐藏',\n reverse: '反向',\n fit: '适应到模型',\n reset: '重置'\n };\n\n const icon = document.createElement('div');\n icon.className = 'section-box-btn-icon';\n icon.innerHTML = getIcon(iconMap[type] || type);\n\n const labelEl = document.createElement('div');\n labelEl.className = 'section-box-btn-label';\n labelEl.textContent = label;\n\n if (ref === 'hide') this.hideLabelEl = labelEl;\n else if (ref === 'reverse') this.reverseLabelEl = labelEl;\n else if (ref === 'fit') this.fitLabelEl = labelEl;\n else if (ref === 'reset') this.resetLabelEl = labelEl;\n\n btn.appendChild(icon);\n btn.appendChild(labelEl);\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n private createSlider(axis: 'x' | 'y' | 'z', label: string): HTMLElement {\n const slider = document.createElement('div');\n slider.className = 'section-box-slider';\n\n const labelEl = document.createElement('div');\n labelEl.className = 'section-box-slider-label';\n labelEl.textContent = label;\n if (axis === 'x') this.xLabelEl = labelEl;\n else if (axis === 'y') this.yLabelEl = labelEl;\n else this.zLabelEl = labelEl;\n\n const track = document.createElement('div');\n track.className = 'section-box-slider-track';\n\n const range = document.createElement('div');\n range.className = 'section-box-slider-range';\n\n const minHandle = document.createElement('div');\n minHandle.className = 'section-box-slider-handle';\n minHandle.setAttribute('data-axis', axis);\n minHandle.setAttribute('data-handle', 'min');\n\n const maxHandle = document.createElement('div');\n maxHandle.className = 'section-box-slider-handle';\n maxHandle.setAttribute('data-axis', axis);\n maxHandle.setAttribute('data-handle', 'max');\n\n track.append(range, minHandle, maxHandle);\n slider.append(labelEl, track);\n\n if (axis === 'x') { this.xMinHandle = minHandle; this.xMaxHandle = maxHandle; }\n else if (axis === 'y') { this.yMinHandle = minHandle; this.yMaxHandle = maxHandle; }\n else { this.zMinHandle = minHandle; this.zMaxHandle = maxHandle; }\n\n return slider;\n }\n\n private setupDragListeners(): void {\n const handles = [this.xMinHandle, this.xMaxHandle, this.yMinHandle, this.yMaxHandle, this.zMinHandle, this.zMaxHandle];\n\n handles.forEach(handle => {\n handle.addEventListener('pointerdown', (e: PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n // 核心锁定:确保后续所有移动事件都只发给这个手柄\n handle.setPointerCapture(e.pointerId);\n\n this.dragState = {\n isDragging: true,\n axis: handle.getAttribute('data-axis') as 'x' | 'y' | 'z',\n handleType: handle.getAttribute('data-handle') as 'min' | 'max',\n pointerId: e.pointerId\n };\n\n handle.classList.add('dragging');\n (handle.closest('.section-box-slider') as HTMLElement).style.zIndex = '100';\n });\n\n handle.addEventListener('pointermove', (e: PointerEvent) => {\n if (this.dragState.isDragging && this.dragState.pointerId === e.pointerId) {\n this.onDragging(e);\n }\n });\n\n const stop = (e: PointerEvent) => {\n if (this.dragState.isDragging && this.dragState.pointerId === e.pointerId) {\n handle.releasePointerCapture(e.pointerId);\n (handle.closest('.section-box-slider') as HTMLElement).style.zIndex = '';\n handle.classList.remove('dragging');\n this.dragState.isDragging = false;\n this.dragState.pointerId = null;\n }\n };\n\n handle.addEventListener('pointerup', stop);\n handle.addEventListener('pointercancel', stop);\n });\n }\n\n private onDragging(e: PointerEvent): void {\n const { axis, handleType } = this.dragState;\n if (!axis || !handleType) return;\n\n const sliderEl = axis === 'x' ? this.xSlider : (axis === 'y' ? this.ySlider : this.zSlider);\n const track = sliderEl.querySelector('.section-box-slider-track') as HTMLElement;\n const rect = track.getBoundingClientRect();\n\n let percentage = ((e.clientX - rect.left) / rect.width) * 100;\n percentage = Math.max(0, Math.min(100, percentage));\n\n const current = this.range[axis];\n if (handleType === 'min') {\n current.min = Math.min(percentage, current.max);\n } else {\n current.max = Math.max(percentage, current.min);\n }\n\n this.updateSliderUI(axis);\n this.options.onRangeChange?.(this.range);\n }\n\n private updateSliderUI(axis: 'x' | 'y' | 'z'): void {\n const range = this.range[axis];\n const minH = axis === 'x' ? this.xMinHandle : (axis === 'y' ? this.yMinHandle : this.zMinHandle);\n const maxH = axis === 'x' ? this.xMaxHandle : (axis === 'y' ? this.yMaxHandle : this.zMaxHandle);\n const slider = axis === 'x' ? this.xSlider : (axis === 'y' ? this.ySlider : this.zSlider);\n const rangeEl = slider.querySelector('.section-box-slider-range') as HTMLElement;\n\n minH.style.left = `${range.min}%`;\n maxH.style.left = `${range.max}%`;\n rangeEl.style.left = `${range.min}%`;\n rangeEl.style.width = `${range.max - range.min}%`;\n\n minH.setAttribute('data-value', Math.round(range.min).toString());\n maxH.setAttribute('data-value', Math.round(range.max).toString());\n }\n\n private updateAllSlidersUI(): void {\n ['x', 'y', 'z'].forEach((a: any) => this.updateSliderUI(a));\n }\n\n private updateButtonStates(): void {\n if (this.hideBtn) this.hideBtn.classList.toggle('active', this.isHidden);\n if (this.reverseBtn) this.reverseBtn.classList.toggle('active', this.isReversed);\n }\n\n public setLocales(): void {\n if (!this.hideLabelEl) return;\n this.hideLabelEl.textContent = t('sectionBox.actions.hide');\n this.reverseLabelEl.textContent = t('sectionBox.actions.reverse');\n this.fitLabelEl.textContent = t('sectionBox.actions.fitToModel');\n this.resetLabelEl.textContent = t('sectionBox.actions.reset');\n this.xLabelEl.textContent = t('sectionBox.axes.x');\n this.yLabelEl.textContent = t('sectionBox.axes.y');\n this.zLabelEl.textContent = t('sectionBox.axes.z');\n this.hideBtn.title = t('sectionBox.actions.hide');\n this.reverseBtn.title = t('sectionBox.actions.reverse');\n this.fitBtn.title = t('sectionBox.actions.fitToModel');\n this.resetBtn.title = t('sectionBox.actions.reset');\n }\n\n public setTheme(theme: ThemeConfig): void {\n if (!this.element) return;\n const style = this.element.style;\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-bg-elevated', theme.bgElevated ?? '#1f2d3e');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-divider', theme.divider ?? '#334155');\n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n }\n\n public destroy(): void {\n this.unsubscribeLocale?.();\n this.unsubscribeTheme?.();\n if (this.element && this.element.parentElement) {\n this.element.parentElement.removeChild(this.element);\n }\n }\n}","/**\n * 剖切盒对话框管理器\n * 负责管理剖切盒工具对话框的显示、隐藏和剖切盒面板的交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { SectionBoxPanel } from '../components/section-box-panel';\nimport type { SectionBoxRange } from '../components/section-box-panel/types';\n\n/**\n * 剖切盒对话框管理器\n * 继承自 BaseDialogManager,提供六面体剖切盒的对话框管理功能\n */\nexport class SectionBoxDialogManager extends BaseDialogManager {\n /** 剖切盒面板实例 */\n private panel: SectionBoxPanel | null = null;\n\n /** 对话框唯一标识 */\n protected get dialogId(): string {\n return 'section-box-dialog';\n }\n\n /** 对话框标题(国际化 key) */\n protected get dialogTitle(): string {\n return 'sectionBox.dialogTitle';\n }\n\n /** 对话框宽度 */\n protected get dialogWidth(): number {\n return 280;\n }\n\n /**\n * 获取对话框位置\n * 定位在容器右下角\n */\n protected getDialogPosition(): { x: number; y: number } {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n const paddingRight = 20;\n const paddingBottom = 50;\n\n return {\n x: containerWidth - this.dialogWidth - paddingRight,\n y: containerHeight - paddingBottom - 300\n };\n }\n\n /**\n * 创建对话框内容\n * 初始化剖切盒面板并设置回调\n */\n protected createContent(): HTMLElement {\n this.panel = new SectionBoxPanel({\n defaultHidden: false,\n defaultReversed: false,\n onHideToggle: (isHidden) => {\n // 底层暂不支持隐藏功能\n console.log('[SectionBoxDialogManager] 隐藏切换(底层暂不支持):', isHidden);\n },\n onReverseToggle: (isReversed) => {\n // 底层暂不支持反向功能\n console.log('[SectionBoxDialogManager] 反向切换(底层暂不支持):', isReversed);\n },\n onFitToModel: () => {\n this.registry.engine3d?.fitSectionBoxToModel();\n },\n onReset: () => {\n this.registry.engine3d?.resetSectionBox();\n },\n onRangeChange: (range) => {\n this.registry.engine3d?.setSectionBoxRange(range);\n }\n });\n this.panel.init();\n return this.panel.element;\n }\n\n /** 对话框创建后的回调,激活剖切盒并自适应高度 */\n protected onDialogCreated(): void {\n this.registry.engine3d?.activateSectionBox();\n this.dialog?.fitHeight(false);\n }\n\n /** 对话框关闭时的回调,取消工具栏按钮激活状态 */\n protected onDialogClose(): void {\n this.registry.toolbar?.setBtnActive('section-box', false);\n }\n\n /** 销毁前的清理,停用剖切盒并销毁面板实例 */\n protected onBeforeDestroy(): void {\n this.registry.engine3d?.deactivateSectionBox();\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n\n /**\n * 获取剖切盒隐藏状态\n * @returns 是否隐藏\n */\n public getHiddenState(): boolean {\n return this.panel?.getHiddenState() ?? false;\n }\n\n /**\n * 设置剖切盒隐藏状态\n * @param isHidden 是否隐藏\n */\n public setHiddenState(isHidden: boolean): void {\n this.panel?.setHiddenState(isHidden);\n }\n\n /**\n * 获取剖切盒反向状态\n * @returns 是否反向(显示盒内/盒外)\n */\n public getReversedState(): boolean {\n return this.panel?.getReversedState() ?? false;\n }\n\n /**\n * 设置剖切盒反向状态\n * @param isReversed 是否反向\n */\n public setReversedState(isReversed: boolean): void {\n this.panel?.setReversedState(isReversed);\n }\n\n /**\n * 获取剖切盒范围\n * @returns 六面体范围 { minX, maxX, minY, maxY, minZ, maxZ }\n */\n public getRange(): SectionBoxRange | null {\n return this.panel?.getRange() ?? null;\n }\n\n /**\n * 设置剖切盒范围\n * @param range 部分或全部范围值\n */\n public setRange(range: Partial): void {\n this.panel?.setRange(range);\n }\n}\n","import './index.css';\nimport type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager, t } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { WalkControlPanelOptions, WalkControlState, WalkControlMode, CharacterModel, WalkMode } from './types';\nimport { getIcon } from '../../utils/icon-manager';\n\nexport class WalkControlPanel implements IBimComponent {\n public element!: HTMLElement;\n private options: WalkControlPanelOptions;\n\n // 状态\n private state: WalkControlState = {\n mode: 'none',\n isPlanViewActive: false,\n speed: 1,\n gravity: false,\n collision: false,\n characterModel: 'construction-worker',\n walkMode: 'walk'\n };\n\n // DOM 引用 - 左侧按钮\n private planViewBtn!: HTMLButtonElement;\n private pathModeBtn!: HTMLButtonElement;\n private walkModeBtn!: HTMLButtonElement;\n\n // DOM 引用 - 中间设置区\n private settingsContainer!: HTMLElement;\n private speedControl!: HTMLElement;\n private speedDecreaseBtn!: HTMLButtonElement;\n private speedIncreaseBtn!: HTMLButtonElement;\n private speedDisplay!: HTMLElement;\n private gravityCheckbox!: HTMLInputElement;\n private gravityLabel!: HTMLElement;\n private collisionCheckbox!: HTMLInputElement;\n private collisionLabel!: HTMLElement;\n private characterModelSelect!: HTMLSelectElement;\n private characterModelLabel!: HTMLElement;\n private walkModeSelect!: HTMLSelectElement;\n private walkModeLabel!: HTMLElement;\n\n // DOM 引用 - 退出按钮\n private exitBtn!: HTMLButtonElement;\n\n // 国际化订阅\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(options: WalkControlPanelOptions = {}) {\n this.options = options;\n this.state.speed = options.defaultSpeed ?? 1;\n this.state.gravity = options.defaultGravity ?? false;\n this.state.collision = options.defaultCollision ?? false;\n this.state.characterModel = options.defaultCharacterModel ?? 'construction-worker';\n this.state.walkMode = options.defaultWalkMode ?? 'walk';\n }\n\n public init(): void {\n this.element = this.createPanel();\n this.updateSettingsView();\n\n // 订阅\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n }\n\n // --- 公共方法 ---\n\n public setPlanViewActive(active: boolean): void {\n this.state.isPlanViewActive = active;\n this.updateButtonStates();\n }\n\n public setPathModeActive(active: boolean): void {\n // 只有当前是路径模式时,取消才设置为 none\n // 避免在其他模式下被误设置为 none\n if (!active && this.state.mode !== 'path') {\n return;\n }\n const newMode: WalkControlMode = active ? 'path' : 'none';\n this.setMode(newMode);\n }\n\n public getState(): WalkControlState {\n return { ...this.state };\n }\n\n // --- 私有方法 ---\n\n private createPanel(): HTMLElement {\n const panel = document.createElement('div');\n panel.className = 'walk-control-panel';\n\n // 左侧按钮区\n const leftButtons = this.createLeftButtons();\n\n // 分割线1\n const divider1 = document.createElement('div');\n divider1.className = 'walk-divider';\n\n // 中间设置区\n this.settingsContainer = this.createSettingsContainer();\n\n // 分割线2\n const divider2 = document.createElement('div');\n divider2.className = 'walk-divider';\n\n // 右侧退出按钮\n const exitBtn = this.createExitButton();\n\n panel.appendChild(leftButtons);\n panel.appendChild(divider1);\n panel.appendChild(this.settingsContainer);\n panel.appendChild(divider2);\n panel.appendChild(exitBtn);\n\n return panel;\n }\n\n private createLeftButtons(): HTMLElement {\n const container = document.createElement('div');\n container.className = 'walk-control-left';\n\n this.planViewBtn = this.createIconButton('plan-view', () => {\n this.state.isPlanViewActive = !this.state.isPlanViewActive;\n this.updateButtonStates();\n this.options.onPlanViewToggle?.(this.state.isPlanViewActive);\n });\n\n this.pathModeBtn = this.createIconButton('path', () => {\n const newMode: WalkControlMode = this.state.mode === 'path' ? 'none' : 'path';\n this.setMode(newMode);\n this.options.onPathModeToggle?.(newMode === 'path');\n });\n\n this.walkModeBtn = this.createIconButton('walk', () => {\n const newMode: WalkControlMode = this.state.mode === 'walk' ? 'none' : 'walk';\n this.setMode(newMode);\n this.options.onWalkModeToggle?.(newMode === 'walk');\n });\n\n container.appendChild(this.planViewBtn);\n container.appendChild(this.pathModeBtn);\n container.appendChild(this.walkModeBtn);\n\n return container;\n }\n\n private createSettingsContainer(): HTMLElement {\n const container = document.createElement('div');\n container.className = 'walk-control-settings';\n\n // 移动速度控件\n this.speedControl = this.createSpeedControl();\n\n // 重力复选框\n const gravityWrapper = document.createElement('label');\n gravityWrapper.className = 'walk-checkbox-wrapper walk-checkbox-gravity';\n this.gravityCheckbox = document.createElement('input');\n this.gravityCheckbox.type = 'checkbox';\n this.gravityCheckbox.className = 'walk-checkbox';\n this.gravityCheckbox.checked = this.state.gravity;\n this.gravityCheckbox.addEventListener('change', () => {\n this.state.gravity = this.gravityCheckbox.checked;\n this.options.onGravityToggle?.(this.state.gravity);\n });\n this.gravityLabel = document.createElement('span');\n this.gravityLabel.className = 'walk-checkbox-label';\n gravityWrapper.appendChild(this.gravityCheckbox);\n gravityWrapper.appendChild(this.gravityLabel);\n\n // 碰撞复选框\n const collisionWrapper = document.createElement('label');\n collisionWrapper.className = 'walk-checkbox-wrapper walk-checkbox-collision';\n this.collisionCheckbox = document.createElement('input');\n this.collisionCheckbox.type = 'checkbox';\n this.collisionCheckbox.className = 'walk-checkbox';\n this.collisionCheckbox.checked = this.state.collision;\n this.collisionCheckbox.addEventListener('change', () => {\n this.state.collision = this.collisionCheckbox.checked;\n this.options.onCollisionToggle?.(this.state.collision);\n });\n this.collisionLabel = document.createElement('span');\n this.collisionLabel.className = 'walk-checkbox-label';\n collisionWrapper.appendChild(this.collisionCheckbox);\n collisionWrapper.appendChild(this.collisionLabel);\n\n // 角色模型选择\n const characterWrapper = document.createElement('div');\n characterWrapper.className = 'walk-select-wrapper walk-select-wrapper-character-model';\n this.characterModelLabel = document.createElement('label');\n this.characterModelLabel.className = 'walk-select-label';\n this.characterModelSelect = document.createElement('select');\n this.characterModelSelect.className = 'walk-select walk-select-character-model';\n this.characterModelSelect.addEventListener('change', () => {\n this.state.characterModel = this.characterModelSelect.value as CharacterModel;\n this.options.onCharacterModelChange?.(this.state.characterModel);\n });\n characterWrapper.appendChild(this.characterModelLabel);\n characterWrapper.appendChild(this.characterModelSelect);\n\n // 行走模式选择\n const walkModeWrapper = document.createElement('div');\n walkModeWrapper.className = 'walk-select-wrapper walk-select-wrapper-walk-mode';\n this.walkModeLabel = document.createElement('label');\n this.walkModeLabel.className = 'walk-select-label';\n this.walkModeSelect = document.createElement('select');\n this.walkModeSelect.className = 'walk-select walk-select-walk-mode';\n this.walkModeSelect.addEventListener('change', () => {\n this.state.walkMode = this.walkModeSelect.value as WalkMode;\n this.options.onWalkModeChange?.(this.state.walkMode);\n });\n walkModeWrapper.appendChild(this.walkModeLabel);\n walkModeWrapper.appendChild(this.walkModeSelect);\n\n // 添加所有控件\n // 注意:顺序为 速度、角色模型、行走模式、重力、碰撞\n // 这样在漫游模式下显示的顺序就是:角色模型、行走模式、重力、碰撞\n container.appendChild(this.speedControl);\n container.appendChild(characterWrapper);\n container.appendChild(walkModeWrapper);\n container.appendChild(gravityWrapper);\n container.appendChild(collisionWrapper);\n\n return container;\n }\n\n private createSpeedControl(): HTMLElement {\n const container = document.createElement('div');\n container.className = 'walk-speed-control';\n\n const label = document.createElement('label');\n label.className = 'walk-speed-label';\n label.textContent = t('walkControl.speed');\n\n const controlGroup = document.createElement('div');\n controlGroup.className = 'walk-speed-group';\n\n // 减速按钮\n this.speedDecreaseBtn = document.createElement('button');\n this.speedDecreaseBtn.className = 'walk-speed-btn';\n this.speedDecreaseBtn.textContent = '-';\n this.speedDecreaseBtn.addEventListener('click', () => {\n if (this.state.speed > 1) {\n this.state.speed--;\n this.updateSpeedDisplay();\n this.options.onSpeedChange?.(this.state.speed);\n }\n });\n\n // 速度显示\n this.speedDisplay = document.createElement('div');\n this.speedDisplay.className = 'walk-speed-display';\n this.speedDisplay.textContent = `${this.state.speed}X`;\n\n // 加速按钮\n this.speedIncreaseBtn = document.createElement('button');\n this.speedIncreaseBtn.className = 'walk-speed-btn';\n this.speedIncreaseBtn.textContent = '+';\n this.speedIncreaseBtn.addEventListener('click', () => {\n if (this.state.speed < 10) {\n this.state.speed++;\n this.updateSpeedDisplay();\n this.options.onSpeedChange?.(this.state.speed);\n }\n });\n\n controlGroup.appendChild(this.speedDecreaseBtn);\n controlGroup.appendChild(this.speedDisplay);\n controlGroup.appendChild(this.speedIncreaseBtn);\n\n container.appendChild(label);\n container.appendChild(controlGroup);\n\n return container;\n }\n\n private createIconButton(type: string, onClick: () => void): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = `walk-icon-btn walk-icon-btn-${type}`;\n btn.innerHTML = this.getIconSVG(type);\n btn.addEventListener('click', onClick);\n return btn;\n }\n\n private createExitButton(): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = 'walk-exit-btn';\n btn.addEventListener('click', () => {\n this.options.onExit?.();\n });\n this.exitBtn = btn;\n return btn;\n }\n\n private setMode(mode: WalkControlMode): void {\n const oldMode = this.state.mode;\n\n // 如果从walk模式切换到其他模式,触发walk关闭事件\n if (oldMode === 'walk' && mode !== 'walk') {\n this.options.onWalkModeToggle?.(false);\n }\n\n // 如果从path模式切换到其他模式,触发path关闭事件\n if (oldMode === 'path' && mode !== 'path') {\n this.options.onPathModeToggle?.(false);\n }\n\n this.state.mode = mode;\n\n // 路径模式:禁用重力和碰撞\n if (mode === 'path') {\n this.state.gravity = false;\n this.state.collision = false;\n this.gravityCheckbox.checked = false;\n this.gravityCheckbox.disabled = true;\n this.collisionCheckbox.checked = false;\n this.collisionCheckbox.disabled = true;\n } else {\n this.gravityCheckbox.disabled = false;\n this.collisionCheckbox.disabled = false;\n }\n\n this.updateButtonStates();\n this.updateSettingsView();\n this.updateSpeedButtonStates();\n }\n\n private updateButtonStates(): void {\n // 平面图按钮\n this.planViewBtn.classList.toggle('active', this.state.isPlanViewActive);\n\n // 路径漫游按钮\n this.pathModeBtn.classList.toggle('active', this.state.mode === 'path');\n\n // 漫游按钮\n this.walkModeBtn.classList.toggle('active', this.state.mode === 'walk');\n }\n\n private updateSettingsView(): void {\n // 根据模式显示/隐藏不同的控件\n const speedWrapper = this.speedControl;\n const gravityWrapper = this.gravityCheckbox.parentElement!;\n const collisionWrapper = this.collisionCheckbox.parentElement!;\n const characterWrapper = this.characterModelSelect.parentElement!;\n const walkModeWrapper = this.walkModeSelect.parentElement!;\n\n if (this.state.mode === 'walk') {\n // 漫游模式:隐藏速度,显示模型、行走模式、重力、碰撞\n speedWrapper.style.display = 'none';\n gravityWrapper.style.display = 'flex';\n collisionWrapper.style.display = 'flex';\n characterWrapper.style.display = 'flex';\n walkModeWrapper.style.display = 'flex';\n } else {\n // 默认或路径模式:显示速度、重力、碰撞,隐藏模型和行走模式\n speedWrapper.style.display = 'flex';\n gravityWrapper.style.display = 'flex';\n collisionWrapper.style.display = 'flex';\n characterWrapper.style.display = 'none';\n walkModeWrapper.style.display = 'none';\n }\n }\n\n private updateSpeedDisplay(): void {\n this.speedDisplay.textContent = `${this.state.speed}X`;\n this.updateSpeedButtonStates();\n }\n\n private updateSpeedButtonStates(): void {\n this.speedDecreaseBtn.disabled = this.state.speed <= 1;\n this.speedIncreaseBtn.disabled = this.state.speed >= 10;\n }\n\n private getIconSVG(type: string): string {\n const icons: Record = {\n 'plan-view': getIcon('地图'),\n 'path': getIcon('路径漫游'),\n 'walk': getIcon('第一人称漫游')\n };\n return icons[type] || '';\n }\n\n public setLocales(): void {\n // 更新速度标签\n const speedLabel = this.speedControl.querySelector('.walk-speed-label');\n if (speedLabel) {\n speedLabel.textContent = t('walkControl.speed');\n }\n\n // 更新复选框标签\n this.gravityLabel.textContent = t('walkControl.gravity');\n this.collisionLabel.textContent = t('walkControl.collision');\n\n // 更新角色模型下拉框\n this.characterModelLabel.textContent = t('walkControl.characterModel.label');\n this.characterModelSelect.innerHTML = '';\n const constructionWorkerOption = document.createElement('option');\n constructionWorkerOption.value = 'construction-worker';\n constructionWorkerOption.textContent = t('walkControl.characterModel.constructionWorker');\n constructionWorkerOption.selected = this.state.characterModel === 'construction-worker';\n this.characterModelSelect.appendChild(constructionWorkerOption);\n\n const officeMaleOption = document.createElement('option');\n officeMaleOption.value = 'office-male';\n officeMaleOption.textContent = t('walkControl.characterModel.officeMale');\n officeMaleOption.selected = this.state.characterModel === 'office-male';\n this.characterModelSelect.appendChild(officeMaleOption);\n\n // 更新行走模式下拉框\n this.walkModeLabel.textContent = t('walkControl.walkMode.label');\n this.walkModeSelect.innerHTML = '';\n const walkOption = document.createElement('option');\n walkOption.value = 'walk';\n walkOption.textContent = t('walkControl.walkMode.walk');\n walkOption.selected = this.state.walkMode === 'walk';\n this.walkModeSelect.appendChild(walkOption);\n\n const runOption = document.createElement('option');\n runOption.value = 'run';\n runOption.textContent = t('walkControl.walkMode.run');\n runOption.selected = this.state.walkMode === 'run';\n this.walkModeSelect.appendChild(runOption);\n\n // 更新退出按钮\n this.exitBtn.textContent = t('walkControl.exit');\n }\n\n public setTheme(theme: ThemeConfig): void {\n if (!this.element) return;\n const style = this.element.style;\n \n style.setProperty('--bim-bg-base', theme.bgBase ?? '#152232');\n style.setProperty('--bim-bg-elevated', theme.bgElevated ?? '#1f2d3e');\n style.setProperty('--bim-bg-inset', theme.bgInset ?? '#152232');\n style.setProperty('--bim-border-default', theme.borderDefault ?? '#334155');\n style.setProperty('--bim-border-strong', theme.borderStrong ?? '#475569');\n style.setProperty('--bim-border-subtle', theme.borderSubtle ?? '#1e293b');\n style.setProperty('--bim-divider', theme.divider ?? '#334155');\n style.setProperty('--bim-shadow-xl', theme.shadowXl ?? '0 20px 40px rgba(0, 0, 0, 0.3)');\n \n style.setProperty('--bim-primary', theme.primary ?? '#3b82f6');\n style.setProperty('--bim-primary-hover', theme.primaryHover ?? '#60a5fa');\n style.setProperty('--bim-primary-subtle', theme.primarySubtle ?? 'rgba(59, 130, 246, 0.15)');\n \n style.setProperty('--bim-text-primary', theme.textPrimary ?? '#ffffff');\n style.setProperty('--bim-text-inverse', theme.textInverse ?? '#152232');\n \n style.setProperty('--bim-icon-default', theme.iconDefault ?? '#ffffff');\n \n style.setProperty('--bim-component-bg-hover', theme.componentBgHover ?? 'rgba(248, 250, 252, 0.06)');\n style.setProperty('--bim-component-bg-active', theme.componentBgActive ?? 'rgba(248, 250, 252, 0.1)');\n }\n\n public destroy(): void {\n this.unsubscribeLocale?.();\n this.unsubscribeTheme?.();\n if (this.element && this.element.parentElement) {\n this.element.parentElement.removeChild(this.element);\n }\n }\n}\n","import type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\n\n/**\n * 路径漫游面板组件(暂时空内容)\n */\nexport class WalkPathPanel implements IBimComponent {\n public element!: HTMLElement;\n\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor() {\n // 暂时无配置\n }\n\n public init(): void {\n this.element = this.createPanel();\n\n // 订阅\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n }\n\n private createPanel(): HTMLElement {\n const panel = document.createElement('div');\n panel.className = 'walk-path-panel';\n panel.style.padding = '20px';\n panel.style.color = 'var(--bim-text-color, #fff)';\n panel.textContent = '路径漫游内容待实现';\n return panel;\n }\n\n public setLocales(): void {\n // 更新文本\n }\n\n public setTheme(_theme: ThemeConfig): void {\n // 应用主题\n }\n\n public destroy(): void {\n this.unsubscribeLocale?.();\n this.unsubscribeTheme?.();\n if (this.element && this.element.parentElement) {\n this.element.parentElement.removeChild(this.element);\n }\n }\n}\n","/**\n * 漫游路径对话框管理器\n * 负责管理漫游路径设置对话框的显示和交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { WalkPathPanel } from '../components/walk-path-panel';\n\n/**\n * 漫游路径对话框管理器\n * 继承自 BaseDialogManager,提供漫游路径配置的对话框管理功能\n */\nexport class WalkPathDialogManager extends BaseDialogManager {\n /** 漫游路径面板实例 */\n private panel: WalkPathPanel | null = null;\n\n /** 对话框唯一标识 */\n protected get dialogId() { return 'walk-path-dialog'; }\n /** 对话框标题(国际化 key) */\n protected get dialogTitle() { return 'walkControl.path.dialogTitle'; }\n /** 对话框宽度 */\n protected get dialogWidth() { return 300; }\n /** 对话框高度 */\n protected get dialogHeight(): number { return 400; }\n\n /** 初始化 */\n public init(): void {}\n\n /**\n * 获取对话框位置\n * 定位在容器右侧居中\n */\n protected getDialogPosition() {\n const container = this.registry.container;\n if (!container) return { x: 100, y: 100 };\n\n const paddingRight = 20;\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n\n return {\n x: containerWidth - this.dialogWidth - paddingRight,\n y: (containerHeight - this.dialogHeight) / 2\n };\n }\n\n /** 创建对话框内容 */\n protected createContent(): HTMLElement {\n this.panel = new WalkPathPanel();\n this.panel.init();\n return this.panel.element;\n }\n\n /** 对话框关闭时的回调 */\n protected onDialogClose(): void {\n if (this.registry.walkControl && this.registry.walkControl.panel) {\n this.registry.walkControl.panel.setPathModeActive(false);\n }\n }\n\n /** 销毁前的清理 */\n protected onBeforeDestroy(): void {\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n}\n","/**\n * 漫游控制管理器\n * 负责管理漫游模式的控制面板和相关交互\n */\nimport { BaseManager } from '../core/base-manager';\nimport { WalkControlPanel } from '../components/walk-control-panel';\nimport { WalkPathDialogManager } from './walk-path-dialog-manager';\n\n/**\n * 漫游控制管理器\n * 提供第一人称漫游、路径漫游等功能的控制界面\n */\nexport class WalkControlManager extends BaseManager {\n /** 漫游控制面板实例 */\n public panel: WalkControlPanel | null = null;\n /** 路径漫游对话框管理器 */\n private pathManager: WalkPathDialogManager | null = null;\n\n constructor() {\n super();\n }\n\n /** 初始化管理器 */\n public init(): void {\n this.pathManager = new WalkPathDialogManager();\n this.pathManager.init();\n }\n\n /** 显示漫游控制面板 */\n public show(): void {\n if (!this.registry.toolbar) {\n console.warn('Toolbar not initialized');\n return;\n }\n\n this.registry.toolbar.hide();\n\n // 打开漫游面板时,默认激活第一人称模式\n console.log('[WalkControl] 打开漫游面板,激活第一人称模式');\n this.registry.engine3d?.activateFirstPersonMode();\n\n this.panel = new WalkControlPanel({\n onPlanViewToggle: (isActive) => {\n console.log('[WalkControl] 地图:', isActive);\n if (isActive) {\n this.registry.map?.show();\n } else {\n this.registry.map?.hide();\n }\n this.emit('walk:plan-view-toggle', { isActive });\n },\n onPathModeToggle: (isActive) => {\n console.log('[WalkControl] 路径漫游:', isActive);\n if (isActive) {\n this.pathManager?.show();\n } else {\n this.pathManager?.hide();\n }\n this.emit('walk:path-mode-toggle', { isActive });\n },\n onWalkModeToggle: (isActive) => {\n console.log('[WalkControl] 第三人称漫游按钮点击:', isActive);\n if (isActive) {\n this.pathManager?.hide();\n alert('第三人称功能开发中');\n }\n this.emit('walk:walk-mode-toggle', { isActive });\n },\n onSpeedChange: (speed) => {\n console.log('[WalkControl] 速度变化:', speed);\n const engineSpeed = speed * 0.1;\n this.registry.engine3d?.setWalkSpeed(engineSpeed);\n this.emit('walk:speed-change', { speed });\n },\n onGravityToggle: (enabled) => {\n console.log('[WalkControl] 重力:', enabled);\n this.registry.engine3d?.setWalkGravity(enabled);\n this.emit('walk:gravity-toggle', { enabled });\n },\n onCollisionToggle: (enabled) => {\n console.log('[WalkControl] 碰撞:', enabled);\n this.registry.engine3d?.setWalkCollision(enabled);\n this.emit('walk:collision-toggle', { enabled });\n },\n onCharacterModelChange: (model) => {\n console.log('[WalkControl] 角色模型:', model);\n },\n onWalkModeChange: (mode) => {\n console.log('[WalkControl] 行走模式:', mode);\n },\n onExit: () => {\n this.hide();\n }\n });\n this.panel.init();\n\n if (this.registry.map?.isOpen()) {\n this.panel.setPlanViewActive(true);\n }\n\n this.subscribe('map:opened', () => {\n this.panel?.setPlanViewActive(true);\n });\n\n this.subscribe('map:closed', () => {\n this.panel?.setPlanViewActive(false);\n });\n\n if (this.registry.container) {\n this.panel.element.style.position = 'absolute';\n this.panel.element.style.bottom = '20px';\n this.panel.element.style.left = '50%';\n this.panel.element.style.transform = 'translateX(-50%)';\n this.panel.element.style.zIndex = '1000';\n\n this.registry.container.appendChild(this.panel.element);\n } else {\n console.warn('[WalkControlManager] Container not found');\n }\n }\n\n /** 隐藏漫游控制面板 */\n public hide(): void {\n this.pathManager?.hide();\n\n console.log('[WalkControl] 关闭漫游面板,退出第一人称模式');\n this.registry.engine3d?.deactivateFirstPersonMode();\n\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n\n if (this.registry.toolbar) {\n this.registry.toolbar.show();\n }\n }\n\n /** 销毁管理器 */\n public destroy(): void {\n this.hide();\n this.pathManager?.destroy();\n this.pathManager = null;\n super.destroy();\n }\n}\n","import type { ThemeConfig } from '../../themes/types';\nimport { IBimComponent } from '../../types/component';\nimport { localeManager } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\n\n/**\n * 地图面板组件\n */\nexport class MapPanel implements IBimComponent {\n public element!: HTMLElement;\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor() {}\n\n public init(): void {\n this.element = this.createPanel();\n this.unsubscribeLocale = localeManager.subscribe(() => this.setLocales());\n this.unsubscribeTheme = themeManager.subscribe((theme) => this.setTheme(theme));\n\n this.setLocales();\n this.setTheme(themeManager.getTheme());\n }\n\n private createPanel(): HTMLElement {\n const panel = document.createElement('div');\n panel.className = 'map-panel';\n panel.style.padding = '20px';\n panel.style.color = '#fff';\n panel.textContent = '地图内容待实现';\n return panel;\n }\n\n public setLocales(): void {\n // 更新文本\n }\n\n public setTheme(_theme: ThemeConfig): void {\n // 应用主题\n }\n\n public destroy(): void {\n this.unsubscribeLocale?.();\n this.unsubscribeTheme?.();\n if (this.element && this.element.parentElement) {\n this.element.parentElement.removeChild(this.element);\n }\n }\n}\n","/**\n * 地图对话框管理器\n * 负责管理地图/平面图对话框的显示和交互\n */\nimport { BaseDialogManager } from '../core/base-dialog-manager';\nimport { MapPanel } from '../components/map-panel';\n\n/**\n * 地图对话框管理器\n * 继承自 BaseDialogManager,提供地图面板的对话框管理功能\n */\nexport class MapDialogManager extends BaseDialogManager {\n /** 地图面板实例 */\n private panel: MapPanel | null = null;\n\n /** 对话框唯一标识 */\n protected get dialogId() { return 'map-dialog'; }\n /** 对话框标题(国际化 key) */\n protected get dialogTitle() { return 'map.dialogTitle'; }\n /** 对话框宽度 */\n protected get dialogWidth() { return 300; }\n /** 对话框高度 */\n protected get dialogHeight(): number { return 400; }\n\n /** 初始化 */\n public init(): void {}\n\n /**\n * 获取对话框位置\n * 定位在容器左下角\n */\n protected getDialogPosition() {\n const container = this.registry.container;\n if (!container) return { x: 20, y: 100 };\n\n const paddingLeft = 20;\n const paddingBottom = 20;\n const containerHeight = container.clientHeight;\n\n return {\n x: paddingLeft,\n y: containerHeight - this.dialogHeight - paddingBottom\n };\n }\n\n /** 创建对话框内容 */\n protected createContent(): HTMLElement {\n this.panel = new MapPanel();\n this.panel.init();\n return this.panel.element;\n }\n\n /** 对话框创建后的回调 */\n protected onDialogCreated(): void {\n this.emit('map:opened', {});\n }\n\n /** 对话框关闭时的回调 */\n protected onDialogClose(): void {\n this.emit('map:closed', {});\n }\n\n /** 销毁前的清理 */\n protected onBeforeDestroy(): void {\n if (this.panel) {\n this.panel.destroy();\n this.panel = null;\n }\n }\n\n /** 隐藏对话框 */\n public hide(): void {\n super.hide();\n this.emit('map:closed', {});\n }\n}\n","import './index.css';\nimport { CollapseOptions, CollapseItemConfig } from './types';\nimport { IBimComponent } from '../../types/component';\nimport { t, localeManager } from '../../services/locale';\nimport { themeManager } from '../../services/theme';\nimport type { ThemeConfig } from '../../themes/types';\n\n/**\n * 单个折叠面板项\n */\nclass BimCollapseItem {\n public element: HTMLElement;\n public headerEl!: HTMLElement;\n public contentEl!: HTMLElement;\n public contentBoxEl!: HTMLElement;\n public arrowEl!: HTMLElement;\n public titleEl!: HTMLElement;\n\n private config: CollapseItemConfig;\n private parent: BimCollapse;\n\n constructor(config: CollapseItemConfig, parent: BimCollapse) {\n this.config = config;\n this.parent = parent;\n this.element = this.createDom();\n }\n\n private createDom(): HTMLElement {\n const itemEl = document.createElement('div');\n itemEl.className = `bim-collapse-item ${this.config.className || ''}`;\n if (this.config.disabled) itemEl.classList.add('is-disabled');\n itemEl.dataset.id = this.config.id;\n\n // ��部区域\n this.headerEl = document.createElement('div');\n this.headerEl.className = 'bim-collapse-header';\n\n // 箭头图标\n this.arrowEl = document.createElement('span');\n this.arrowEl.className = 'bim-collapse-arrow';\n this.arrowEl.innerHTML = ``;\n this.headerEl.appendChild(this.arrowEl);\n\n // 自定义图标 (可选)\n if (this.config.icon) {\n const iconEl = document.createElement('span');\n iconEl.className = 'bim-collapse-icon';\n iconEl.innerHTML = this.config.icon;\n this.headerEl.appendChild(iconEl);\n }\n\n // 标题文本\n this.titleEl = document.createElement('span');\n this.titleEl.className = 'bim-collapse-title';\n this.titleEl.textContent = t(this.config.title); // 初始翻译\n this.headerEl.appendChild(this.titleEl);\n\n // 额外内容 (可选,如右侧标签)\n if (this.config.extra) {\n const extraEl = document.createElement('div');\n extraEl.className = 'bim-collapse-extra';\n if (typeof this.config.extra === 'string') {\n extraEl.innerHTML = this.config.extra;\n } else {\n extraEl.appendChild(this.config.extra);\n }\n this.headerEl.appendChild(extraEl);\n }\n\n // 点击事件\n this.headerEl.addEventListener('click', () => {\n if (this.config.disabled) return;\n this.parent.toggleItem(this.config.id);\n });\n\n itemEl.appendChild(this.headerEl);\n\n // 内容区域\n this.contentEl = document.createElement('div');\n this.contentEl.className = 'bim-collapse-content is-hidden';\n\n this.contentBoxEl = document.createElement('div');\n this.contentBoxEl.className = 'bim-collapse-content-box';\n\n if (typeof this.config.content === 'string') {\n this.contentBoxEl.innerHTML = this.config.content;\n } else {\n this.contentBoxEl.appendChild(this.config.content);\n }\n\n this.contentEl.appendChild(this.contentBoxEl);\n itemEl.appendChild(this.contentEl);\n\n return itemEl;\n }\n\n public updateLocale() {\n if (this.titleEl) {\n this.titleEl.textContent = t(this.config.title);\n }\n }\n\n public setActive(isActive: boolean) {\n if (isActive) {\n this.element.classList.add('is-active');\n this.contentEl.classList.remove('is-hidden');\n // 简单的动画处理:设置 height\n // 实际生产中可能需要更复杂的 JS 动画库或 transitionend 事件处理\n // 这里依赖 CSS transition\n } else {\n this.element.classList.remove('is-active');\n this.contentEl.classList.add('is-hidden');\n }\n }\n}\n\n/**\n * 折叠面板组件\n */\nexport class BimCollapse implements IBimComponent {\n private element: HTMLElement;\n private options: CollapseOptions;\n private items: Map = new Map();\n private activeIds: Set = new Set();\n private unsubscribeLocale: (() => void) | null = null;\n private unsubscribeTheme: (() => void) | null = null;\n\n constructor(options: CollapseOptions) {\n this.options = {\n bordered: true,\n accordion: false,\n ...options\n };\n\n this.element = document.createElement('div');\n this.element.className = `bim-collapse ${this.options.className || ''}`;\n if (!this.options.bordered) this.element.style.border = 'none';\n if (this.options.ghost) this.element.classList.add('is-ghost');\n\n const container = typeof this.options.container === 'string'\n ? document.getElementById(this.options.container)\n : this.options.container;\n\n if (container) {\n container.appendChild(this.element);\n }\n\n // 初始化激活的 ID\n if (this.options.activeIds) {\n this.options.activeIds.forEach(id => this.activeIds.add(id));\n }\n\n this.init();\n }\n\n public init() {\n // 创建子项\n this.options.items.forEach(itemConfig => {\n const item = new BimCollapseItem(itemConfig, this);\n this.items.set(itemConfig.id, item);\n this.element.appendChild(item.element);\n\n // 设置初始状态\n if (this.activeIds.has(itemConfig.id)) {\n item.setActive(true);\n }\n });\n\n // 订阅语言变更\n this.unsubscribeLocale = localeManager.subscribe(() => {\n this.setLocales();\n });\n\n // 订阅主题变更\n this.unsubscribeTheme = themeManager.subscribe((theme) => {\n this.setTheme(theme);\n });\n\n // 初始应用主题\n this.setTheme(themeManager.getTheme());\n }\n\n public toggleItem(id: string) {\n const isActive = this.activeIds.has(id);\n\n if (this.options.accordion) {\n // 手风琴模式:关闭其他所有,只展开目标\n this.activeIds.clear();\n if (!isActive) {\n this.activeIds.add(id);\n }\n } else {\n // 普通模式:切换目标状态\n if (isActive) {\n this.activeIds.delete(id);\n } else {\n this.activeIds.add(id);\n }\n }\n\n this.refreshState();\n\n if (this.options.onChange) {\n this.options.onChange(Array.from(this.activeIds));\n }\n }\n\n private refreshState() {\n this.items.forEach((item, id) => {\n item.setActive(this.activeIds.has(id));\n });\n }\n\n public setTheme(theme: ThemeConfig): void {\n const style = this.element.style;\n style.setProperty('--bim-bg-elevated', theme.bgElevated);\n style.setProperty('--bim-border-default', theme.borderDefault);\n style.setProperty('--bim-border-subtle', theme.borderSubtle);\n style.setProperty('--bim-border-strong', theme.borderStrong);\n style.setProperty('--bim-text-primary', theme.textPrimary);\n style.setProperty('--bim-text-disabled', theme.textDisabled);\n style.setProperty('--bim-component-bg', theme.componentBg);\n style.setProperty('--bim-component-bg-hover', theme.componentBgHover);\n style.setProperty('--bim-component-bg-active', theme.componentBgActive);\n }\n\n public setLocales(): void {\n this.items.forEach(item => item.updateLocale());\n }\n\n public destroy(): void {\n if (this.unsubscribeLocale) {\n this.unsubscribeLocale();\n this.unsubscribeLocale = null;\n }\n if (this.unsubscribeTheme) {\n this.unsubscribeTheme();\n this.unsubscribeTheme = null;\n }\n this.element.remove();\n this.items.clear();\n }\n}\n","import { BaseManager } from '../core/base-manager';\nimport { BimCollapse } from '../components/collapse/index';\nimport { BimTab } from '../components/tab';\nimport { t } from '../services/locale';\n\nexport class ComponentDetailManager extends BaseManager {\n private dialogId = 'component-detail-dialog';\n private dialog: any = null;\n private currentSelection: { url: string; id: string } | null = null;\n private unsubscribeSelected: (() => void) | null = null;\n private unsubscribeDeselected: (() => void) | null = null;\n private tabInstance: BimTab | null = null;\n private propertiesData: any = null;\n\n constructor() {\n super();\n }\n\n public init(): void {\n this.unsubscribeSelected = this.registry.on('component:selected', (payload) => {\n this.currentSelection = payload;\n if (this.isOpen()) {\n this.loadAndRenderContent();\n }\n });\n\n this.unsubscribeDeselected = this.registry.on('component:deselected', () => {\n this.currentSelection = null;\n if (this.isOpen()) {\n this.renderNoSelection();\n }\n });\n }\n\n public show(): void {\n if (!this.registry.dialog) {\n console.warn('[ComponentDetailManager] Dialog manager not initialized');\n return;\n }\n\n if (!this.isOpen()) {\n this.createDialog();\n }\n\n if (this.currentSelection) {\n this.loadAndRenderContent();\n } else {\n this.renderNoSelection();\n }\n }\n\n private createDialog(): void {\n const width = 300;\n const x = document.body.clientWidth - width - 40;\n\n this.dialog = this.registry.dialog?.create({\n id: this.dialogId,\n title: 'panel.componentDetail.title',\n content: '',\n width: `${width}px`,\n height: '500px',\n position: { x, y: 20 },\n resizable: true,\n onClose: () => this.hide()\n } as any);\n }\n\n private loadAndRenderContent(): void {\n if (!this.dialog || !this.currentSelection) return;\n\n this.showLoading();\n\n this.registry.engine3d?.getComponentProperties(\n this.currentSelection.url,\n this.currentSelection.id,\n (data) => {\n this.propertiesData = data;\n this.renderTabbedContent();\n }\n );\n }\n\n private showLoading(): void {\n const container = document.createElement('div');\n container.style.cssText = 'height:100%;display:flex;align-items:center;justify-content:center;';\n container.textContent = '加载中...';\n this.dialog?.setContent(container);\n }\n\n private renderNoSelection(): void {\n if (!this.dialog) return;\n\n const container = document.createElement('div');\n container.style.cssText = 'height:100%;display:flex;align-items:center;justify-content:center;color:var(--bim-text-secondary,#999);';\n container.textContent = t('panel.componentDetail.noSelection') || '请先选中构件';\n this.dialog.setContent(container);\n }\n\n private renderTabbedContent(): void {\n if (!this.dialog) return;\n\n if (this.tabInstance) {\n this.tabInstance.destroy();\n this.tabInstance = null;\n }\n\n const container = document.createElement('div');\n container.style.cssText = 'height:100%;display:flex;flex-direction:column;';\n\n const propertiesPanel = this.createPropertiesPanel();\n const materialsPanel = this.createMaterialsPanel();\n\n this.tabInstance = new BimTab({\n container,\n activeId: 'properties',\n tabs: [\n {\n id: 'properties',\n title: 'panel.property.tab.props',\n content: propertiesPanel\n },\n {\n id: 'materials',\n title: 'panel.property.tab.material',\n content: materialsPanel\n }\n ]\n });\n this.tabInstance.init();\n\n this.dialog.setContent(container);\n }\n\n private createPropertiesPanel(): HTMLElement {\n const container = document.createElement('div');\n container.style.cssText = 'height:100%;overflow-y:auto;';\n\n const properties = this.propertiesData?.properties || [];\n\n if (properties.length === 0) {\n container.innerHTML = '
    无属性数据
    ';\n return container;\n }\n\n const collapseItems = properties.map((category: any, index: number) => ({\n id: `category-${index}`,\n title: category.name || `分类 ${index + 1}`,\n content: this.createCategoryContent(category.children || [])\n }));\n\n new BimCollapse({\n container,\n accordion: false,\n ghost: true,\n activeIds: collapseItems.length > 0 ? [collapseItems[0].id] : [],\n items: collapseItems\n });\n\n const style = document.createElement('style');\n style.textContent = `\n #${this.dialogId} .bim-collapse-header {\n background-color: var(--bim-component-bg-hover) !important;\n }\n #${this.dialogId} .bim-collapse-header:hover {\n background-color: var(--bim-component-bg-active) !important;\n }\n `;\n container.appendChild(style);\n\n return container;\n }\n\n private createMaterialsPanel(): HTMLElement {\n const container = document.createElement('div');\n container.style.cssText = 'height:100%;overflow-y:auto;';\n\n const materials = this.propertiesData?.materials || [];\n\n if (materials.length === 0) {\n container.innerHTML = '
    无材质数据
    ';\n return container;\n }\n\n const collapseItems = materials.map((material: any, index: number) => ({\n id: `material-${index}`,\n title: material.name || `材质 ${index + 1}`,\n content: this.createCategoryContent(material.children || material.properties || [])\n }));\n\n new BimCollapse({\n container,\n accordion: false,\n ghost: true,\n activeIds: collapseItems.length > 0 ? [collapseItems[0].id] : [],\n items: collapseItems\n });\n\n const style = document.createElement('style');\n style.textContent = `\n #${this.dialogId} .bim-collapse-header {\n background-color: var(--bim-component-bg-hover) !important;\n }\n #${this.dialogId} .bim-collapse-header:hover {\n background-color: var(--bim-component-bg-active) !important;\n }\n `;\n container.appendChild(style);\n\n return container;\n }\n\n private createCategoryContent(items: any[]): HTMLElement {\n const container = document.createElement('div');\n\n items.forEach((item: any, index: number) => {\n const row = document.createElement('div');\n row.style.cssText = `\n display: flex;\n border-bottom: 1px solid var(--bim-border-default, rgba(255,255,255,0.15));\n `;\n\n if (index === items.length - 1) {\n row.style.borderBottom = 'none';\n }\n\n const label = document.createElement('div');\n label.style.cssText = `\n width: 120px;\n flex-shrink: 0;\n color: var(--bim-text-secondary, #999);\n font-size: 13px;\n padding: 8px 12px;\n border-right: 1px solid var(--bim-border-default, rgba(255,255,255,0.15));\n `;\n label.textContent = item.name || '-';\n\n const value = document.createElement('div');\n value.style.cssText = `\n flex: 1;\n color: var(--bim-text-primary, #fff);\n font-size: 13px;\n padding: 8px 12px;\n word-break: break-all;\n `;\n value.textContent = String(item.value ?? '-');\n\n row.appendChild(label);\n row.appendChild(value);\n container.appendChild(row);\n });\n\n return container;\n }\n\n public isOpen(): boolean {\n return this.dialog !== null;\n }\n\n public hide(): void {\n if (this.tabInstance) {\n this.tabInstance.destroy();\n this.tabInstance = null;\n }\n if (this.dialog) {\n this.dialog.destroy();\n this.dialog = null;\n }\n }\n\n public destroy(): void {\n if (this.unsubscribeSelected) {\n this.unsubscribeSelected();\n this.unsubscribeSelected = null;\n }\n if (this.unsubscribeDeselected) {\n this.unsubscribeDeselected();\n this.unsubscribeDeselected = null;\n }\n this.hide();\n super.destroy();\n }\n}\n","import './bim-engine.css';\nimport { ToolbarManager } from './managers/toolbar-manager';\nimport { ButtonGroupManager } from './managers/button-group-manager';\nimport { DialogManager } from './managers/dialog-manager';\nimport { EngineManager } from './managers/engine-manager';\nimport { RightKeyManager } from './managers/right-key-manager';\nimport { ConstructTreeManagerBtn } from './managers/construct-tree-manager-btn';\n\nimport { MeasureDialogManager } from './managers/measure-dialog-manager';\nimport { SectionPlaneDialogManager } from './managers/section-plane-dialog-manager';\nimport { SectionAxisDialogManager } from './managers/section-axis-dialog-manager';\nimport { SectionBoxDialogManager } from './managers/section-box-dialog-manager';\nimport { WalkControlManager } from './managers/walk-control-manager';\nimport { MapDialogManager } from './managers/map-dialog-manager';\nimport { ComponentDetailManager } from './managers/component-detail-manager';\nimport type { EngineOptions, ModelLoadOptions } from './components/engine';\nimport { localeManager } from './services/locale';\nimport { themeManager } from './services/theme';\nimport type { LocaleType } from './locales/types';\nimport type { ThemeType, ThemeConfig } from './themes/types';\nimport { ManagerRegistry } from './core/manager-registry';\nimport { EngineEvents } from './types/events';\n\nexport type { EngineOptions, ModelLoadOptions };\n\nexport class BimEngine {\n public container: HTMLElement;\n private wrapper: HTMLElement | null = null;\n private registry: ManagerRegistry;\n\n public toolbar: ToolbarManager | null = null;\n public constructTreeBtn: ConstructTreeManagerBtn | null = null;\n public buttonGroup: ButtonGroupManager | null = null;\n public dialog: DialogManager | null = null;\n public engine: EngineManager | null = null;\n public rightKey: RightKeyManager | null = null;\n\n public measure: MeasureDialogManager | null = null;\n public sectionPlane: SectionPlaneDialogManager | null = null;\n public sectionAxis: SectionAxisDialogManager | null = null;\n public sectionBox: SectionBoxDialogManager | null = null;\n public walkControl: WalkControlManager | null = null;\n public map: MapDialogManager | null = null;\n public componentDetail: ComponentDetailManager | null = null;\n\n constructor(\n container: HTMLElement | string,\n options?: {\n locale?: LocaleType;\n theme?: ThemeType;\n }\n ) {\n const el = typeof container === 'string' ? document.getElementById(container) : container;\n if (!el) throw new Error('Container not found');\n this.container = el;\n\n this.registry = ManagerRegistry.getInstance();\n\n if (options?.locale) localeManager.setLocale(options.locale);\n if (options?.theme) {\n if (options.theme === 'custom') {\n console.warn('Custom theme should be set via setCustomTheme().');\n } else {\n themeManager.setTheme(options.theme);\n }\n }\n\n this.init();\n }\n\n public emit(event: K, payload: EngineEvents[K]) {\n this.registry.emit(event, payload);\n }\n\n public on(event: K, listener: (payload: EngineEvents[K]) => void): () => void {\n return this.registry.on(event, listener);\n }\n\n public setLocale(locale: LocaleType) {\n localeManager.setLocale(locale);\n }\n\n public getLocale(): LocaleType {\n return localeManager.getLocale();\n }\n\n public setTheme(theme: 'dark' | 'light') {\n themeManager.setTheme(theme);\n }\n\n public setCustomTheme(theme: ThemeConfig) {\n themeManager.setCustomTheme(theme);\n }\n\n private init() {\n this.container.innerHTML = '';\n this.wrapper = document.createElement('div');\n this.wrapper.className = 'bim-engine-wrapper';\n this.container.appendChild(this.wrapper);\n\n this.registry.container = this.container;\n this.registry.wrapper = this.wrapper;\n\n this.engine = new EngineManager(this.wrapper);\n this.dialog = new DialogManager(this.wrapper);\n this.toolbar = new ToolbarManager(this.wrapper);\n this.buttonGroup = new ButtonGroupManager(this.wrapper);\n this.rightKey = new RightKeyManager(this.wrapper);\n this.constructTreeBtn = new ConstructTreeManagerBtn(this.wrapper);\n\n this.measure = new MeasureDialogManager();\n this.sectionPlane = new SectionPlaneDialogManager();\n this.sectionAxis = new SectionAxisDialogManager();\n this.sectionBox = new SectionBoxDialogManager();\n this.walkControl = new WalkControlManager();\n this.walkControl.init();\n this.map = new MapDialogManager();\n this.map.init();\n\n this.registry.engine3d = this.engine;\n this.registry.dialog = this.dialog;\n this.registry.toolbar = this.toolbar;\n this.registry.buttonGroup = this.buttonGroup;\n this.registry.rightKey = this.rightKey;\n this.registry.constructTree = this.constructTreeBtn;\n\n this.registry.measure = this.measure;\n this.registry.sectionPlane = this.sectionPlane;\n this.registry.sectionAxis = this.sectionAxis;\n this.registry.sectionBox = this.sectionBox;\n this.registry.walkControl = this.walkControl;\n this.registry.map = this.map;\n\n this.componentDetail = new ComponentDetailManager();\n this.registry.componentDetail = this.componentDetail;\n this.componentDetail.init();\n\n this.updateTheme(themeManager.getTheme());\n themeManager.subscribe((theme) => {\n this.updateTheme(theme);\n });\n }\n\n private updateTheme(theme: ThemeConfig) {\n if (this.wrapper) {\n this.wrapper.style.color = theme.textPrimary;\n }\n }\n\n public destroy() {\n this.toolbar?.destroy();\n this.buttonGroup?.destroy();\n this.engine?.destroy();\n this.dialog?.destroy();\n this.rightKey?.destroy();\n\n this.measure?.destroy();\n this.sectionPlane?.destroy();\n this.sectionAxis?.destroy();\n this.sectionBox?.destroy();\n this.walkControl?.destroy();\n this.container.innerHTML = '';\n ManagerRegistry.reset();\n }\n}\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createHomeButton = (): ButtonConfig => {\n return {\n id: 'home',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.home',\n icon: getIcon('主视角'),\n keepActive: false,\n onClick: (button) => {\n console.log('首页按钮被点击:', button.id);\n const registry = ManagerRegistry.getInstance();\n registry.engine3d?.CameraGoHome();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createZoomBoxButton = (): ButtonConfig => {\n return {\n id: 'zoom-box',\n groupId: 'group-1',\n keepActive: false,\n type: 'button',\n label: 'toolbar.zoomBox',\n icon: getIcon('框选放大'),\n onClick: () => {\n const registry = ManagerRegistry.getInstance();\n registry.engine3d?.activateZoomBox();\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createWalkMenuButton = (): ButtonConfig => {\n return {\n id: 'walk',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.walk',\n align: 'vertical',\n icon: getIcon('漫游'),\n onClick: () => {\n console.log('漫游按钮被点击');\n const registry = ManagerRegistry.getInstance();\n registry.walkControl?.show();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createMapButton = (): ButtonConfig => {\n const registry = ManagerRegistry.getInstance();\n\n registry.on('map:opened', () => {\n registry.toolbar?.setBtnActive('map', true);\n });\n\n registry.on('map:closed', () => {\n registry.toolbar?.setBtnActive('map', false);\n });\n\n return {\n id: 'map',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.map',\n align: 'vertical',\n keepActive: true,\n icon: getIcon('地图'),\n onClick: () => {\n if (registry.map?.isOpen()) {\n registry.map?.hide();\n } else {\n registry.map?.show();\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createPropertyButton = (): ButtonConfig => {\n return {\n id: 'property',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.property',\n align: 'vertical',\n icon: getIcon('文档'),\n onClick: () => {\n console.log('构件详情按钮被点击');\n const registry = ManagerRegistry.getInstance();\n registry.componentDetail?.show();\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\n\nexport const createSettingButton = (): ButtonConfig => {\n return {\n id: 'setting',\n groupId: 'group-2',\n type: 'button',\n label: 'toolbar.setting',\n icon: getIcon('设置'),\n keepActive: false,\n onClick: (button) => {\n console.log('设置按钮被点击:', button.id);\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createInfoButton = (): ButtonConfig => {\n return {\n id: 'info',\n groupId: 'group-2',\n type: 'button',\n label: 'toolbar.info',\n icon: getIcon('信息'),\n keepActive: false,\n onClick: () => {\n const registry = ManagerRegistry.getInstance();\n registry.emit('ui:open-dialog', { id: 'info' });\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\n\nexport const createFullscreenButton = (): ButtonConfig => {\n return {\n id: 'fullscreen',\n groupId: 'group-2',\n type: 'button',\n label: 'toolbar.fullscreen',\n align: 'vertical',\n icon: getIcon('全屏'),\n onClick: async () => {\n console.log('全屏按钮被点击');\n\n const isIframe = window.self !== window.top;\n if (isIframe) {\n console.warn('检测到在 Iframe 中运行,请确保父级 iframe 标签拥有 allow=\"fullscreen\" 属性');\n }\n\n try {\n const doc = document as any;\n const fullscreenElement = doc.fullscreenElement ||\n doc.webkitFullscreenElement ||\n doc.mozFullScreenElement ||\n doc.msFullscreenElement;\n\n const isFullscreen = !!fullscreenElement;\n console.log('当前是否全屏:', isFullscreen);\n\n const bimContainer = document.querySelector('.bim-engine-container') as HTMLElement;\n const targetElem = bimContainer || document.body;\n const el = targetElem as any;\n\n if (!isFullscreen) {\n console.log('准备进入全屏...');\n\n if (targetElem.style.backgroundColor === '' || targetElem.style.backgroundColor === 'transparent') {\n targetElem.style.backgroundColor = '#ffffff';\n }\n\n const requestMethod = el.requestFullscreen ||\n el.webkitRequestFullscreen ||\n el.mozRequestFullScreen ||\n el.msRequestFullscreen;\n\n if (requestMethod) {\n await requestMethod.call(el, { navigationUI: 'hide' });\n console.log('全屏请求已发送');\n } else {\n console.warn('当前浏览器不支持全屏 API');\n alert('当前浏览器不支持全屏功能');\n }\n } else {\n console.log('准备退出全屏...');\n\n const exitMethod = doc.exitFullscreen ||\n doc.webkitExitFullscreen ||\n doc.mozCancelFullScreen ||\n doc.msExitFullscreen;\n\n if (exitMethod) {\n await exitMethod.call(doc);\n console.log('退出全屏请求已发送');\n }\n }\n } catch (error: any) {\n console.error('全屏操作失败:', error);\n if (error && error.message && error.message.includes('denied')) {\n console.error('全屏请求被拒绝。如果是 Iframe,请检查 allow=\"fullscreen\"。如果是自动触发,请确保由用户点击触发。');\n }\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../index.type';\nimport { getIcon } from '../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../core/manager-registry';\n\nexport const createMeasureButton = (): ButtonConfig => {\n return {\n id: 'measure',\n groupId: 'group-1',\n type: 'button',\n label: 'toolbar.measure',\n icon: getIcon('测量'),\n keepActive: true,\n onClick: (button) => {\n const registry = ManagerRegistry.getInstance();\n if (button.isActive) {\n registry.measure?.show();\n } else {\n registry.measure?.destroy();\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\n\nexport const createSectionMenuButton = (): ButtonConfig => {\n return {\n id: 'section',\n groupId: 'group-1',\n type: 'menu',\n label: 'toolbar.section',\n align: 'vertical',\n icon: getIcon('剖切'),\n keepActive: true,\n onClick: (button) => {\n console.log('剖切按钮被点击:', button.id);\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createSectionPlaneButton = (): ButtonConfig => {\n return {\n id: 'section-plane',\n groupId: 'group-1',\n parentId: 'section',\n type: 'button',\n keepActive: true,\n exclusive: true,\n align: 'vertical',\n label: 'toolbar.sectionPlane',\n icon: getIcon('拾曲面剖切'),\n onClick: (button) => {\n console.log('拾取面剖切被点击:', button.id, '激活状态:', button.isActive);\n const registry = ManagerRegistry.getInstance();\n if (button.isActive) {\n registry.sectionPlane?.show();\n } else {\n registry.sectionPlane?.hide();\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createSectionAxisButton = (): ButtonConfig => {\n return {\n id: 'section-axis',\n groupId: 'group-1',\n parentId: 'section',\n type: 'button',\n keepActive: true,\n exclusive: true,\n align: 'vertical',\n label: 'toolbar.sectionAxis',\n icon: getIcon('轴向剖切'),\n onClick: (button) => {\n const registry = ManagerRegistry.getInstance();\n if (button.isActive) {\n registry.sectionAxis?.show();\n } else {\n registry.sectionAxis?.destroy();\n }\n }\n };\n};\n","import type { ButtonConfig } from '../../../../index.type';\nimport { getIcon } from '../../../../../../utils/icon-manager';\nimport { ManagerRegistry } from '../../../../../../core/manager-registry';\n\nexport const createSectionBoxButton = (): ButtonConfig => {\n return {\n id: 'section-box',\n groupId: 'group-1',\n parentId: 'section',\n type: 'button',\n keepActive: true,\n exclusive: true,\n align: 'vertical',\n label: 'toolbar.sectionBox',\n icon: getIcon('剖切盒'),\n onClick: (button) => {\n console.log('剖切盒被点击:', button.id, '激活状态:', button.isActive);\n const registry = ManagerRegistry.getInstance();\n if (button.isActive) {\n registry.sectionBox?.show();\n } else {\n registry.sectionBox?.hide();\n }\n }\n };\n};\n","const n = `# BIM引擎AI助手 - 需求分析与步骤规划专家\n\n## 角色定位\n\n你是一位资深的**AI+BIM轻量化引擎架构专家**,具备以下核心能力:\n\n1. **深度理解BIM引擎架构**:精通BIM引擎的模块化设计、API体系、数据结构和交互模式\n2. **需求分析能力**:能够准确理解用户意图,识别模糊需求,提出精准的澄清问题\n3. **任务分解能力**:将复杂需求拆解为可执行的、原子化的操作步骤\n4. **技术决策能力**:根据需求特点选择最优的API组合和实现路径\n\n你的职责是通过分析用户需求,生成结构化的执行步骤,指导代码生成模块完成BIM引擎的功能实现。\n\n## 工作流程\n\n如果存在疑问,你就不能输出最终的步骤,只有当你把所有的疑问清楚后,你才可以输出步骤,如果存在疑问,你要以bim模型为载体,不能问一下和bim模型不想干的问题,尽量没有或减少问题\n\n### 阶段一:需求理解与分析\n\n当接收到用户需求时,你需要:\n\n1. **深度分析需求**:\n - 理解用户的核心目标\n - 识别涉及到的BIM引擎模块(场景、相机、模型、测量、剖切等)\n - 分析数据流向和依赖关系\n - 评估需求的复杂度和可行性\n\n2. **识别模糊点**:\n - 检查需求中是否存在歧义、缺失信息或边界条件不明确的情况\n - 判断是否需要用户澄清才能继续\n\n3. **决策是否需要提问**:\n - **仅在必要时提问**:如果需求足够清晰,直接进入步骤规划阶段\n - **避免过度提问**:不要为了提问而提问,不要询问可以从上下文推断的信息\n - **精准提问**:每个问题都应该针对关键决策点,影响后续实现路径\n\n### 阶段二:需求澄清(如需要)\n\n如果需要用户澄清,请按照以下格式输出:\n\n**输出格式**:\n\\`\\`\\`\n##question## \njson内容\n\\`\\`\\`\n\n**JSON格式规范**:\n\\`\\`\\`json\n[\n {\n \"id\": 0,\n \"question\": \"您是否需要设置所有的构件?\",\n \"answers\": [\n \"A. 是的,设置所有构件\",\n \"B. 只设置1F层的构件\",\n \"C. 根据特定条件筛选构件\"\n ]\n },\n {\n \"id\": 1,\n \"question\": \"颜色设置的优先级是什么?\",\n \"answers\": [\n \"A. 按构件类型设置\",\n \"B. 按楼层设置\",\n \"C. 按自定义属性设置\"\n ]\n }\n]\n\\`\\`\\`\n\n**提问原则**:\n- 每个问题必须针对一个明确的决策点\n- 答案选项应该互斥且覆盖主要场景\n- 问题数量控制在3个以内,优先询问最关键的问题\n- 问题描述清晰、具体,避免模糊表述\n- 不要强行提问,尽量减少或不提问题\n### 阶段三:步骤规划\n\n当需求清晰后,你需要将用户意图拆解为一系列可执行的步骤。\n\n**输出格式**:\n\\`\\`\\`\n##steps## \njson内容\n\n\\`\\`\\`\n\n**JSON格式规范**:\n\\`\\`\\`json\n[\n {\n \"id\": 0,\n \"content\": \"获取所有桩基模型\",\n \"description\": \"通过modelTree模块遍历模型树,筛选出类型为'桩基'的所有构件,返回构件ID数组和构件对象数组\",\n \"output\": \"{\\\\\"modelIds\\\\\": [\\\\\"id1\\\\\", \\\\\"id2\\\\\", ...], \\\\\"models\\\\\": [modelObject1, modelObject2, ...]}\",\n \"dependencies\": [],\n \"apiModules\": [\"modelTree\", \"dataModule\"]\n },\n {\n \"id\": 1,\n \"content\": \"设置桩基模型颜色为红色\",\n \"description\": \"使用modelMapperBatch模块的批量设置方法,将上一步获取的所有桩基模型的颜色属性设置为红色(RGB: 255, 0, 0)\",\n \"output\": \"{\\\\\"success\\\\\": true, \\\\\"count\\\\\": 10, \\\\\"failedIds\\\\\": []}\",\n \"dependencies\": [0],\n \"apiModules\": [\"modelMapperBatch\"]\n }\n]\n\\`\\`\\`\n\n**字段说明**:\n- \\`id\\`: 步骤唯一标识符,从0开始递增\n- \\`content\\`: 步骤的简短描述(一句话概括)\n- \\`description\\`: 步骤的详细功能说明,包括:\n - 具体要做什么\n - 使用哪些API模块\n - 如何处理数据\n - 可能的边界情况\n- \\`output\\`: 步骤输出的数据格式说明(JSON Schema格式),用于:\n - 指导代码生成模块返回正确的数据结构\n - 确保步骤间的数据传递正确\n- \\`dependencies\\`: 依赖的步骤ID数组,表示此步骤需要等待哪些步骤完成\n- \\`apiModules\\`: 此步骤涉及到的BIM引擎模块名称数组(如:modelTree, cameraModule, measure等)\n\n**步骤规划原则**:\n1. **原子化**:每个步骤应该只完成一个明确的功能点\n2. **可执行**:每个步骤都应该能够独立生成可执行的代码\n3. **依赖清晰**:明确标注步骤间的依赖关系,确保执行顺序正确\n4. **数据流转**:每个步骤的输出格式要明确,便于后续步骤使用\n5. **模块化**:合理利用BIM引擎的模块化设计,选择最合适的API\n6. **错误处理**:在关键步骤中考虑异常情况的处理\n\n## 硬性要求\n\n### 1. 输出格式规范\n- **必须严格遵循**上述JSON格式,字段名称和类型不能改变\n- JSON必须是有效的、可解析的格式\n- 步骤ID必须连续且从0开始\n- 依赖关系必须正确,不能出现循环依赖\n\n### 2. 需求理解要求\n- **深度理解**:不能停留在表面理解,要理解用户的真实意图和业务场景\n- **上下文感知**:结合BIM引擎的特性,理解每个需求在BIM场景下的实际意义\n- **技术可行性**:确保规划的步骤在BIM引擎API能力范围内\n\n### 3. 步骤质量要求\n- **完整性**:步骤应该覆盖用户需求的所有方面,不能遗漏关键环节\n- **准确性**:步骤描述要准确,不能有歧义或错误\n- **可执行性**:每个步骤都应该能够生成可执行的代码\n- **效率性**:优先选择高效的API组合,避免不必要的中间步骤\n\n### 4. 错误预防\n- 检查步骤间的数据格式是否匹配\n- 确保依赖关系正确,避免执行顺序错误\n- 验证API模块名称是否正确\n- 考虑边界情况和异常处理\n\n### 5. 代码生成友好\n- 步骤描述要足够详细,让代码生成模块能够准确理解意图\n- 输出格式说明要具体,使用JSON Schema或示例数据\n- 明确标注使用的API模块,便于代码生成时快速定位\n\n## 最佳实践\n\n1. **先理解后规划**:充分理解需求后再开始规划步骤,避免返工\n2. **模块优先**:优先使用BIM引擎提供的功能模块,而不是底层API\n3. **数据驱动**:明确每个步骤的输入输出,确保数据流清晰\n4. **可扩展性**:考虑未来可能的扩展需求,设计灵活的步骤结构\n5. **用户友好**:步骤描述要清晰易懂,便于用户理解整个执行流程\n\n\n''`;\nexport {\n n as default\n};\n//# sourceMappingURL=main-2Txx2Vau.mjs.map\n","const n = `# BIM引擎AI助手 - 代码生成专家\n\n## 角色定位\n\n你是一位资深的**BIM引擎代码生成专家**,具备以下核心能力:\n\n1. **BIM引擎API精通**:深度掌握BIM引擎的所有模块API、方法签名、参数类型和返回值\n2. **代码生成能力**:能够根据步骤描述,生成高质量、可执行、符合规范的JavaScript代码\n3. **上下文理解**:能够理解步骤间的数据流转,正确处理前序步骤的输出结果\n4. **错误处理能力**:具备完善的异常处理和边界情况处理能力\n5. **代码质量意识**:生成的代码应该具备良好的可读性、可维护性和性能\n\n你的职责是根据步骤规划模块提供的步骤描述,生成可直接在BIM引擎环境中执行的JavaScript代码片段。\n\n## 工作流程\n\n### 阶段一:理解步骤要求\n\n当接收到步骤执行请求时,你需要:\n\n1. **解析步骤信息**:\n - 理解步骤的\\`content\\`(简短描述)和\\`description\\`(详细说明)\n - 识别步骤涉及到的BIM引擎模块(\\`apiModules\\`字段)\n - 理解步骤的依赖关系(\\`dependencies\\`字段)\n - 明确步骤的预期输出格式(\\`output\\`字段)\n\n2. **分析上下文数据**:\n - 如果有前序步骤的输出结果,分析其数据结构\n - 理解当前步骤需要使用的输入数据\n - 验证数据格式是否匹配步骤要求\n\n3. **确定实现方案**:\n - 根据步骤描述,选择最合适的BIM引擎API\n - 设计数据转换和处理逻辑\n - 规划错误处理策略\n\n### 阶段二:生成代码\n\n根据步骤要求生成可执行的JavaScript代码。\n\n**输出格式**:\n\\`\\`\\`\n##code##\n[可执行的JavaScript代码]\n\\`\\`\\`\n\n**代码生成规范**:\n\n1. **代码结构**:\n - 代码必须是一个完整的、可执行的JavaScript代码片段\n - 可以是函数、立即执行函数(IIFE)或代码块\n - 代码应该能够直接运行,不需要额外的包装\n\n2. **引擎实例访问**:\n - 假设BIM引擎实例通过变量\\`engine\\`访问(全局作用域)\n - 通过\\`engine.moduleName\\`访问各个功能模块\n - 例如:\\`engine.modelTree\\`、\\`engine.cameraModule\\`、\\`engine.measure\\`等\n\n3. **数据输入处理**:\n - 如果步骤有依赖,使用前序步骤的输出数据\n - 假设前序步骤的输出数据存储在变量\\`previousStepOutput\\`中(如果是第一步,则为\\`null\\`)\n - 需要根据\\`output\\`字段的格式说明,正确解析和使用输入数据\n\n4. **API调用规范**:\n - 严格按照BIM引擎API文档使用API\n - 参数类型和数量必须正确\n - 处理API的返回值和可能的异常\n\n5. **数据输出规范**:\n - 代码执行后,必须返回符合步骤\\`output\\`字段要求的数据格式\n - 使用\\`return\\`语句返回结果\n - 返回的数据必须是可序列化的(JSON格式)\n\n6. **错误处理**:\n - 必须包含完善的错误处理逻辑\n - 使用try-catch捕获可能的异常\n - 对于关键操作,添加参数验证\n - 错误信息要清晰,便于调试\n\n7. **代码质量要求**:\n - 代码要有清晰的注释,说明关键逻辑\n - 变量命名要有意义,符合JavaScript命名规范\n - 避免使用过于复杂的嵌套结构\n - 优先使用可读性高的写法,而不是过于\"高级\"的技巧\n\n## 硬性要求\n\n### 1. 代码格式要求\n- **单一代码块**:输出必须且只能包含一个JavaScript代码片段\n- **可执行性**:代码必须能够直接执行,不需要额外的依赖或配置\n- **完整性**:代码必须完整,不能有语法错误或未定义的变量\n\n### 2. 数据格式要求\n- **输入解析**:正确解析和使用前序步骤的输出数据\n- **输出格式**:严格按照步骤\\`output\\`字段的格式要求返回数据\n- **类型安全**:确保数据类型正确,必要时进行类型转换\n\n### 3. API使用要求\n- **准确性**:API调用必须准确,参数必须正确\n- **模块识别**:正确识别和使用BIM引擎的各个模块\n- **方法调用**:使用正确的方法名和参数签名\n\n### 4. 错误处理要求\n- **异常捕获**:所有可能抛出异常的操作都要有try-catch保护\n- **参数验证**:对关键参数进行验证,避免无效输入\n- **错误信息**:错误信息要清晰,包含足够的上下文信息\n- **优雅降级**:在可能的情况下,提供降级方案\n\n### 5. 代码质量要求\n- **可读性**:代码结构清晰,逻辑易懂\n- **注释完整**:关键逻辑要有注释说明\n- **命名规范**:变量和函数命名要有意义\n- **性能考虑**:避免不必要的循环和计算\n\n## 代码生成示例\n\n### 示例1:获取模型数据\n\n**步骤描述**:\n\\`\\`\\`json\n{\n \"id\": 0,\n \"content\": \"获取所有桩基模型\",\n \"description\": \"通过modelTree模块遍历模型树,筛选出类型为'桩基'的所有构件\",\n \"output\": \"{\\\\\"modelIds\\\\\": [\\\\\"id1\\\\\", \\\\\"id2\\\\\"], \\\\\"models\\\\\": [modelObject1, modelObject2]}\",\n \"dependencies\": [],\n \"apiModules\": [\"modelTree\"]\n}\n\\`\\`\\`\n\n**生成代码**:\n\\`\\`\\`javascript\n// 获取所有桩基模型\ntry {\n // 获取模型树模块\n const modelTree = engine.modelTree;\n if (!modelTree) {\n throw new Error('模型树模块未初始化');\n }\n \n // 获取所有模型\n const allModels = modelTree.getAllModels();\n if (!allModels || allModels.length === 0) {\n return {\n modelIds: [],\n models: []\n };\n }\n \n // 筛选桩基模型\n const pileModels = [];\n const pileModelIds = [];\n \n for (let i = 0; i < allModels.length; i++) {\n const model = allModels[i];\n // 根据模型属性判断是否为桩基\n const modelType = model.getProperty('类型') || model.getProperty('category');\n if (modelType && (modelType.includes('桩基') || modelType.includes('Pile'))) {\n pileModels.push(model);\n pileModelIds.push(model.id || model.uuid);\n }\n }\n \n // 返回结果\n return {\n modelIds: pileModelIds,\n models: pileModels\n };\n} catch (error) {\n console.error('获取桩基模型失败:', error);\n return {\n modelIds: [],\n models: [],\n error: error.message\n };\n}\n\\`\\`\\`\n\n### 示例2:使用前序步骤的输出\n\n**步骤描述**:\n\\`\\`\\`json\n{\n \"id\": 1,\n \"content\": \"设置桩基模型颜色为红色\",\n \"description\": \"使用modelMapperBatch模块批量设置上一步获取的桩基模型颜色\",\n \"output\": \"{\\\\\"success\\\\\": true, \\\\\"count\\\\\": 10}\",\n \"dependencies\": [0],\n \"apiModules\": [\"modelMapperBatch\"]\n}\n\\`\\`\\`\n\n**生成代码**:\n\\`\\`\\`javascript\n// 设置桩基模型颜色为红色\ntry {\n // 获取前序步骤的输出数据\n if (!previousStepOutput || !previousStepOutput.modelIds) {\n throw new Error('前序步骤输出数据无效,缺少modelIds字段');\n }\n \n const modelIds = previousStepOutput.modelIds;\n if (modelIds.length === 0) {\n return {\n success: true,\n count: 0,\n message: '没有需要设置的模型'\n };\n }\n \n // 获取批量映射模块\n const modelMapperBatch = engine.modelMapperBatch;\n if (!modelMapperBatch) {\n throw new Error('批量映射模块未初始化');\n }\n \n // 设置颜色为红色 (RGB: 255, 0, 0)\n const redColor = { r: 255, g: 0, b: 0 };\n \n // 批量设置模型颜色\n const result = modelMapperBatch.setModelColor(modelIds, redColor);\n \n return {\n success: result.success !== false,\n count: result.count || modelIds.length,\n failedIds: result.failedIds || []\n };\n} catch (error) {\n console.error('设置模型颜色失败:', error);\n return {\n success: false,\n count: 0,\n error: error.message\n };\n}\n\\`\\`\\`\n\n## 最佳实践\n\n1. **充分理解步骤**:仔细阅读步骤描述,确保理解每个细节\n2. **查阅API文档**:不确定的API用法,参考BIM引擎API文档\n3. **数据验证优先**:在处理数据前,先验证数据的有效性\n4. **错误处理完善**:考虑各种可能的异常情况\n5. **代码可读性**:优先保证代码的可读性,而不是追求\"高级\"写法\n6. **注释清晰**:关键逻辑要有注释,但不要过度注释\n7. **性能考虑**:对于大量数据的处理,考虑性能优化\n8. **测试友好**:生成的代码应该便于测试和调试 `;\nexport {\n n as default\n};\n//# sourceMappingURL=step-CkmZYIvn.mjs.map\n","const n = `# BIM Engine SDK API 文档\n\n本文档为 BIM Engine SDK 的完整 API 参考,适合大模型阅读和理解引擎的功能结构。\n\n## 目录\n\n1. [核心引擎类](#1-核心引擎类)\n2. [基础模块](#2-基础模块)\n3. [功能管理器](#3-功能管理器)\n4. [状态管理](#4-状态管理)\n\n---\n\n## 1. 核心引擎类\n\n### EngineKernelV2\n\n引擎核心组件,负责整合和管理所有模块。\n\n**文件路径**: \\`src/core/v2/EngineKernel.ts\\`\n\n#### 构造函数\n\n\\`\\`\\`typescript\nconstructor(options: any)\n\\`\\`\\`\n\n**参数**:\n- \\`options.containerId\\`: string - 容器元素的 ID\n\n**功能**:\n- 初始化所有基础模块(场景、相机、渲染器、控制器等)\n- 初始化所有功能管理器(测量、剖切、模型树等)\n- 设置渲染循环\n- 添加性能监视器\n\n#### 公共属性\n\n\\`\\`\\`typescript\n// 基础对象\npublic scene: THREE.Scene | null // 三维场景\npublic camera: THREE.Camera | null // 当前使用的相机\npublic renderer: THREE.WebGLRenderer | null // 渲染器\npublic controls: any // 控制器(轨道控制或第一人称)\n\n// 基础模块\npublic sceneModule: SceneModule // 场景模块\npublic cameraModule: CameraModule // 相机模块\npublic deviceModule: DeviceModule // 设备模块\npublic renderModule: RenderModule // 渲染模块\npublic controlModule: ControlModule // 控制模块\npublic composerModule: ComposerModule // 合成器模块\npublic loaderModule: LoaderModule // 加载器模块\npublic lightModule: LightModule // 光照模块\npublic interactionModule: InteractionModule // 交互模块\npublic modelToolModule: ModelToolModule // 模型工具模块\n\n// 功能管理器\npublic viewCube: ViewCube // 视图立方体\npublic rangeScale: RangeScale // 范围缩放\npublic setting: Setting // 设置\npublic measure: Measure // 测量\npublic clipping: Clipping // 剖切\npublic modelTree: ModelTree // 模型树\npublic engineInfo: EngineInfo // 引擎信息统计\npublic modelProperties: ModelProperties // 模型属性\npublic modelMapperBatch: ModelMapperBatch // 模型批量映射\npublic modelEdge: ModelEdge // 模型边线\n\n// 状态管理\npublic engineStatus: EngineStatus // 引擎状态\npublic events: EventModule // 事件模块\n\n// 业务数据\npublic models: any[] // 已加载的模型数组\npublic reactBoundingClientRect: { left: number; top: number } // 容器的边界矩形\n\\`\\`\\`\n\n#### 公共方法\n\n##### pauseRendering()\n\n\\`\\`\\`typescript\npublic pauseRendering(): void\n\\`\\`\\`\n\n**功能**: 暂停渲染循环\n- 停止动画帧请求\n- 禁用控制器\n- 用于性能优化或后台运行\n\n##### resumeRendering()\n\n\\`\\`\\`typescript\npublic resumeRendering(): void\n\\`\\`\\`\n\n**功能**: 恢复渲染循环\n- 重新启动动画帧请求\n- 恢复控制器状态\n\n##### isRenderingPausedState()\n\n\\`\\`\\`typescript\npublic isRenderingPausedState(): boolean\n\\`\\`\\`\n\n**功能**: 检查渲染是否暂停\n\n**返回值**: boolean - true 表示已暂停\n\n##### dispose()\n\n\\`\\`\\`typescript\npublic dispose(): void\n\\`\\`\\`\n\n**功能**: 销毁引擎,释放所有资源\n- 停止渲染循环\n- 清理所有模块\n- 释放几何体、材质、纹理\n- 移除 DOM 元素\n- 清理事件监听器\n\n**注意**: 调用此方法后引擎不可再使用\n\n---\n\n## 2. 基础模块\n\n### 2.1 SceneModule - 场景模块\n\n**文件路径**: \\`src/core/v2/modules/sceneModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic scene: THREE.Scene | null // 三维场景对象\n\\`\\`\\`\n\n**功能**:\n- 创建并管理 THREE.Scene\n- 初始化边线组(groupEdge)用于存储模型边线\n\n---\n\n### 2.2 CameraModule - 相机模块\n\n**文件路径**: \\`src/core/v2/modules/cameraModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic perspectiveCamera: THREE.PerspectiveCamera // 透视相机\npublic orthographicCamera: THREE.OrthographicCamera // 正交相机\n\\`\\`\\`\n\n#### 公共方法\n\n##### switchCurrentCamera()\n\n\\`\\`\\`typescript\npublic switchCurrentCamera(): void\n\\`\\`\\`\n\n**功能**: 切换当前相机类型(透视 ↔ 正交)\n\n##### switchToPerspectiveCamera()\n\n\\`\\`\\`typescript\npublic switchToPerspectiveCamera(): void\n\\`\\`\\`\n\n**功能**: 切换到透视相机\n- 保持当前位置和目标点\n- 更新控制器\n- 重新初始化合成器\n\n##### switchToOrthographicCamera()\n\n\\`\\`\\`typescript\npublic switchToOrthographicCamera(): void\n\\`\\`\\`\n\n**功能**: 切换到正交相机\n- 保持当前位置和目标点\n- 更新控制器\n- 重新初始化合成器\n\n##### getCameraType()\n\n\\`\\`\\`typescript\npublic getCameraType(): CameraType\n\\`\\`\\`\n\n**功能**: 获取当前相机类型\n\n**返回值**:\n- \\`CameraType.PERSPECTIVE\\` - 透视相机\n- \\`CameraType.ORTHOGRAPHIC\\` - 正交相机\n\n##### getCameraPose()\n\n\\`\\`\\`typescript\npublic getCameraPose(): ICameraPose\n\\`\\`\\`\n\n**功能**: 获取当前相机姿态(位置、旋转、目标点、缩放等)\n\n**返回值**: ICameraPose 对象\n\\`\\`\\`typescript\ninterface ICameraPose {\n type: CameraType;\n position: { x: number; y: number; z: number };\n rotation: { x: number; y: number; z: number };\n quaternion: { x: number; y: number; z: number; w: number };\n target?: { x: number; y: number; z: number };\n zoom?: number;\n}\n\\`\\`\\`\n\n##### restoreCameraPose()\n\n\\`\\`\\`typescript\npublic restoreCameraPose(pose: ICameraPose): void\n\\`\\`\\`\n\n**功能**: 通过相机姿态还原相机位置\n- 自动切换相机类型\n- 恢复位置、旋转、目标点\n- 恢复正交相机的缩放值\n\n**参数**:\n- \\`pose\\`: ICameraPose - 相机姿态对象\n\n---\n\n### 2.3 DeviceModule - 设备模块\n\n**文件路径**: \\`src/core/v2/modules/deviceModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic deviceType: string // 设备类型(默认 'PC')\n\\`\\`\\`\n\n#### 公共方法\n\n##### getDeviceType()\n\n\\`\\`\\`typescript\npublic getDeviceType(): string\n\\`\\`\\`\n\n**功能**: 获取设备类型\n\n**返回值**: 'PC' 或其他设备标识\n\n##### getContainerSize()\n\n\\`\\`\\`typescript\npublic getContainerSize(): { width: number; height: number }\n\\`\\`\\`\n\n**功能**: 获取容器尺寸\n\n**返回值**: 容器的宽度和高度\n\n---\n\n### 2.4 RenderModule - 渲染模块\n\n**文件路径**: \\`src/core/v2/modules/renderModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic renderer: THREE.WebGLRenderer | null // WebGL 渲染器\n\\`\\`\\`\n\n#### 公共方法\n\n##### createRenderer()\n\n\\`\\`\\`typescript\npublic createRenderer(): THREE.WebGLRenderer\n\\`\\`\\`\n\n**功能**: 创建并配置 WebGL 渲染器\n- 启用抗锯齿\n- 启用阴影映射(PCFSoftShadowMap)\n- 启用本地裁剪(用于剖切平面)\n- 配置色彩空间和色调映射\n\n**返回值**: 配置好的渲染器实例\n\n##### disposeRenderer()\n\n\\`\\`\\`typescript\npublic disposeRenderer(): void\n\\`\\`\\`\n\n**功能**: 释放渲染器资源\n\n---\n\n### 2.5 ControlModule - 控制模块\n\n**文件路径**: \\`src/core/v2/modules/controlModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic orbitControls: any // 轨道控制器\npublic firstPersonControls: any // 第一人称控制器\npublic isActive: boolean // 控制器是否激活\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化控制器\n- 创建轨道控制器和第一人称控制器\n- 创建旋转中心指示器 UI\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 激活控制器\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 禁用控制器\n\n##### switchFirstPersonMode()\n\n\\`\\`\\`typescript\npublic switchFirstPersonMode(): void\n\\`\\`\\`\n\n**功能**: 切换到第一人称漫游模式\n- 禁用轨道控制器\n- 启用第一人称控制器\n\n##### switchDefaultMode()\n\n\\`\\`\\`typescript\npublic switchDefaultMode(): void\n\\`\\`\\`\n\n**功能**: 切换到默认模式(轨道控制)\n- 禁用第一人称控制器\n- 启用轨道控制器\n\n##### update()\n\n\\`\\`\\`typescript\npublic update(): void\n\\`\\`\\`\n\n**功能**: 更新控制器状态\n- 更新旋转中心指示器位置\n- 在渲染循环中调用\n\n---\n\n### 2.6 ComposerModule - 合成器模块\n\n**文件路径**: \\`src/core/v2/modules/composerModule.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic composer: any // 效果合成器\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化后处理管线\n- RenderPass - 基础渲染\n- GTAOPass - 环境光遮蔽(默认禁用)\n- UnrealBloomPass - 辉光效果(默认禁用)\n- SaturationPass - 饱和度和对比度调整\n- OutputPass - 色调映射和颜色校正\n- FXAAPass - 抗锯齿\n\n##### resize()\n\n\\`\\`\\`typescript\npublic resize(): void\n\\`\\`\\`\n\n**功能**: 调整合成器大小\n- 更新所有 pass 的分辨率\n- 更新 FXAA 的分辨率参数\n\n---\n\n### 2.7 LoaderModule - 加载器模块\n\n**文件路径**: \\`src/core/v2/modules/loaderModule.ts\\`\n\n#### 公共方法\n\n##### loadModels()\n\n\\`\\`\\`typescript\nasync loadModels(urls: string[], options?: LoadModelOptions): Promise\n\\`\\`\\`\n\n**功能**: 加载多个模型\n- 支持轻量化模型格式\n- 支持 GLTF/GLB 格式\n- 异步加载\n\n**参数**:\n- \\`urls\\`: string[] - 模型 URL 数组\n- \\`options\\`: LoadModelOptions - 加载选项(可选)\n\n---\n\n### 2.8 EventModule - 事件模块\n\n**文件路径**: \\`src/core/v2/modules/eventModule.ts\\`\n\n#### 公共方法\n\n##### on()\n\n\\`\\`\\`typescript\non(event: EventType, callback: (data: T) => void): void\n\\`\\`\\`\n\n**功能**: 注册事件监听器\n\n**参数**:\n- \\`event\\`: EventType - 事件类型\n- \\`callback\\`: 回调函数\n\n##### off()\n\n\\`\\`\\`typescript\noff(event: EventType, callback: (data: T) => void): void\n\\`\\`\\`\n\n**功能**: 移除事件监听器\n\n**参数**:\n- \\`event\\`: EventType - 事件类型\n- \\`callback\\`: 要移除的回调函数\n\n##### trigger()\n\n\\`\\`\\`typescript\ntrigger(event: EventType, data?: any): void\n\\`\\`\\`\n\n**功能**: 触发事件\n\n**参数**:\n- \\`event\\`: EventType - 事件类型\n- \\`data\\`: 传递给监听器的数据\n\n**常用事件类型**:\n- \\`EventType.Click\\` - 点击事件\n- \\`EventType.ViewportResize\\` - 视口大小改变\n- \\`EventType.EngineFree\\` - 引擎空闲\n- \\`EventType.EngineBusy\\` - 引擎繁忙\n\n---\n\n### 2.9 LightModule - 光照模块\n\n**文件路径**: \\`src/core/v2/modules/lightModule.ts\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化场景基本光照\n- 添加定向光(DirectionalLight)\n - 强度: 2\n - 位置: (10, 20, 10)\n - 阴影贴图: 4096x4096(高质量)\n- 添加环境光(AmbientLight)\n - 强度: 1\n\n---\n\n### 2.10 InteractionModule - 交互模块\n\n**文件路径**: \\`src/core/v2/modules/interactionModule.ts\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化交互行为处理器\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 激活交互功能\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 禁用交互功能\n\n##### handleMouseClick()\n\n\\`\\`\\`typescript\npublic handleMouseClick(event: any): void\n\\`\\`\\`\n\n**功能**: 处理鼠标单击事件\n- 射线检测点击的模型\n- 高亮选中的模型\n- 设置旋转中心\n- 支持 Ctrl 多选\n\n##### handleMouseDoubleClick()\n\n\\`\\`\\`typescript\npublic handleMouseDoubleClick(event: any): void\n\\`\\`\\`\n\n**功能**: 处理鼠标双击事件\n- 双击模型后缩放到该模型\n- 计算模型包围盒并调整相机视角\n\n##### handleMouseClickInstance()\n\n\\`\\`\\`typescript\npublic handleMouseClickInstance(raycaster: any): any\n\\`\\`\\`\n\n**功能**: 判断点击实例化网格节点\n\n**参数**:\n- \\`raycaster\\`: 射线投射器\n\n**返回值**: 相交结果数组\n\n---\n\n### 2.11 ModelToolModule - 模型工具模块\n\n**文件路径**: \\`src/core/v2/modules/modelToolModule.ts\\`\n\n#### 公共方法\n\n##### highlightModel()\n\n\\`\\`\\`typescript\npublic highlightModel(models: any): void\n\\`\\`\\`\n\n**功能**: 设置模型高亮显示\n\n**参数**:\n- \\`models\\`: 模型数组,格式: \\`[{url: string, ids: string[]}]\\`\n\n##### unhighlightModel()\n\n\\`\\`\\`typescript\npublic unhighlightModel(models: any): void\n\\`\\`\\`\n\n**功能**: 取消模型高亮\n\n**参数**:\n- \\`models\\`: 模型数组\n\n##### unhighlightAllModels()\n\n\\`\\`\\`typescript\npublic unhighlightAllModels(): void\n\\`\\`\\`\n\n**功能**: 取消所有模型高亮\n\n##### hideModel()\n\n\\`\\`\\`typescript\npublic hideModel(models: any): void\n\\`\\`\\`\n\n**功能**: 隐藏模型\n\n**参数**:\n- \\`models\\`: 模型数组,格式: \\`[{url: string, ids: string[]}]\\`\n\n##### showModel()\n\n\\`\\`\\`typescript\npublic showModel(models: any): void\n\\`\\`\\`\n\n**功能**: 显示模型\n\n**参数**:\n- \\`models\\`: 模型数组\n\n##### isolateModel()\n\n\\`\\`\\`typescript\npublic isolateModel(models: any): void\n\\`\\`\\`\n\n**功能**: 隔离模型(只显示指定模型,隐藏其他)\n\n**参数**:\n- \\`models\\`: 要显示的模型数组\n\n##### showAllModels()\n\n\\`\\`\\`typescript\npublic showAllModels(): void\n\\`\\`\\`\n\n**功能**: 显示所有模型\n\n##### getModelsBox()\n\n\\`\\`\\`typescript\npublic getModelsBox(models: any): THREE.Box3\n\\`\\`\\`\n\n**功能**: 获取模型的包围盒\n\n**参数**:\n- \\`models\\`: 模型数组\n\n**返回值**: THREE.Box3 包围盒对象\n\n---\n\n## 3. 功能管理器\n\n### 3.1 ViewCube - 视图立方体\n\n**文件路径**: \\`src/core/v2/managers/viewCube/index.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic cubeTool: any // 视图立方体工具\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化视图立方体\n- 创建 3D 小立方体辅助视图\n- 支持六个面和边角视图切换\n\n##### CameraGoHome()\n\n\\`\\`\\`typescript\npublic CameraGoHome(): void\n\\`\\`\\`\n\n**功能**: 相机回归正位(默认视角)\n\n##### zoomToModel()\n\n\\`\\`\\`typescript\npublic zoomToModel(box: THREE.Box3): void\n\\`\\`\\`\n\n**功能**: 缩放到指定模型包围盒\n\n**参数**:\n- \\`box\\`: THREE.Box3 - 目标包围盒\n\n---\n\n### 3.2 RangeScale - 范围缩放工具\n\n**文件路径**: \\`src/core/v2/managers/rangeScale/index.ts\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化范围缩放工具\n- 创建绘制框 UI 元素\n- 初始化坐标转换工具\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 激活范围缩放工具\n- 禁用控制器\n- 启用框选功能\n- 鼠标变为十字光标\n\n**使用方式**:\n1. 激活工具\n2. 鼠标拖拽绘制矩形区域\n3. 松开鼠标自动缩放到该区域\n4. 按 ESC 键退出\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 停用范围缩放工具\n- 恢复控制器\n- 移除事件监听\n\n---\n\n### 3.3 Setting - 设置管理器\n\n**文件路径**: \\`src/core/v2/managers/setting/index.ts\\`\n\n#### 公共方法\n\n##### setStatsVisible()\n\n\\`\\`\\`typescript\npublic setStatsVisible(visible: boolean): void\n\\`\\`\\`\n\n**功能**: 显示/隐藏性能监视器\n\n**参数**:\n- \\`visible\\`: true 显示,false 隐藏\n\n##### setAmbientLightIntensity()\n\n\\`\\`\\`typescript\npublic setAmbientLightIntensity(intensity: number): void\n\\`\\`\\`\n\n**功能**: 设置环境光照强度\n\n**参数**:\n- \\`intensity\\`: 光照强度,范围 0-5\n\n##### setAmbientLightColor()\n\n\\`\\`\\`typescript\npublic setAmbientLightColor(color: number | string): void\n\\`\\`\\`\n\n**功能**: 设置环境光照颜色\n\n**参数**:\n- \\`color\\`: 颜色(0xffffff 或 '#ffffff')\n\n##### setDirectionalLightIntensity()\n\n\\`\\`\\`typescript\npublic setDirectionalLightIntensity(intensity: number): void\n\\`\\`\\`\n\n**功能**: 设置定向光源强度\n\n**参数**:\n- \\`intensity\\`: 光照强度,范围 0-5\n\n##### setDirectionalLightColor()\n\n\\`\\`\\`typescript\npublic setDirectionalLightColor(color: number | string): void\n\\`\\`\\`\n\n**功能**: 设置定向光源颜色\n\n**参数**:\n- \\`color\\`: 颜色\n\n##### setShadowQuality()\n\n\\`\\`\\`typescript\npublic setShadowQuality(quality: 'low' | 'medium' | 'high' | 'ultra'): void\n\\`\\`\\`\n\n**功能**: 设置阴影精细度\n\n**参数**:\n- \\`quality\\`: 质量等级\n - 'low': 1024\n - 'medium': 2048\n - 'high': 4096\n - 'ultra': 8192\n\n##### setDirectionalLightShadow()\n\n\\`\\`\\`typescript\npublic setDirectionalLightShadow(enabled: boolean): void\n\\`\\`\\`\n\n**功能**: 开启/关闭定向光阴影\n\n**参数**:\n- \\`enabled\\`: true 开启,false 关闭\n\n##### setGTAOEnabled()\n\n\\`\\`\\`typescript\npublic setGTAOEnabled(enabled: boolean): void\n\\`\\`\\`\n\n**功能**: 开启/关闭 GTAO 环境光遮蔽\n\n**参数**:\n- \\`enabled\\`: true 开启,false 关闭\n\n##### setSceneSaturation()\n\n\\`\\`\\`typescript\npublic setSceneSaturation(saturation: number): void\n\\`\\`\\`\n\n**功能**: 设置场景饱和度\n\n**参数**:\n- \\`saturation\\`: 饱和度值,1.0 为正常,推荐范围 0.5-2.0\n\n##### setSceneContrast()\n\n\\`\\`\\`typescript\npublic setSceneContrast(contrast: number): void\n\\`\\`\\`\n\n**功能**: 设置场景对比度\n\n**参数**:\n- \\`contrast\\`: 对比度值,1.0 为正常,推荐范围 0.5-2.0\n\n##### setGroundEnabled()\n\n\\`\\`\\`typescript\npublic setGroundEnabled(enabled: boolean, options?: {\n size?: number;\n color?: number | string;\n opacity?: number;\n}): void\n\\`\\`\\`\n\n**功能**: 开启/关闭地面\n\n**参数**:\n- \\`enabled\\`: true 开启,false 关闭\n- \\`options\\`: 地面配置选项\n - \\`size\\`: 地面大小(默认 100)\n - \\`color\\`: 地面颜色(默认 0x808080)\n - \\`opacity\\`: 透明度(默认 0.3)\n\n##### setHDRBackground()\n\n\\`\\`\\`typescript\npublic setHDRBackground(hdrTexture: THREE.Texture | null): void\n\\`\\`\\`\n\n**功能**: 设置 HDR 背景\n\n**参数**:\n- \\`hdrTexture\\`: HDR 环境贴图,null 则移除\n\n---\n\n### 3.4 Measure - 测量工具\n\n**文件路径**: \\`src/core/v2/managers/measure/index.ts\\`\n\n#### 公共方法\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 激活测量工具\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 停用测量工具\n- 清除所有测量\n- 恢复点选功能\n\n##### clearAllPoints()\n\n\\`\\`\\`typescript\npublic clearAllPoints(): void\n\\`\\`\\`\n\n**功能**: 清空所有测量点\n\n##### clearAll()\n\n\\`\\`\\`typescript\npublic clearAll(): void\n\\`\\`\\`\n\n**功能**: 清除所有测量标注\n\n##### update()\n\n\\`\\`\\`typescript\nupdate(): void\n\\`\\`\\`\n\n**功能**: 更新测量标注\n- 在渲染循环中调用\n- 更新屏幕坐标\n\n**测量类型**:\n- 距离测量(DistanceMeasure)\n- 净高测量(ClearHeightMeasure)\n- 净距测量(ClearDistanceMeasure)\n- 标高测量(ElevationMeasure)\n- 点测量(PointMeasure)\n- 角度测量(AngleMeasure)\n- 面积测量(AreaMeasure)\n- 坡度测量(SlopeMeasure)\n\n---\n\n### 3.5 Clipping - 剖切管理器\n\n**文件路径**: \\`src/core/v2/managers/clipping/index.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic sectionPlaneX: any // X 轴剖切平面\npublic sectionPlaneY: any // Y 轴剖切平面\npublic sectionPlaneZ: any // Z 轴剖切平面\npublic sectionBox: any // 剖切盒\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化剖切管理器\n- 创建 6 个剖切平面(前、后、左、右、顶、底)\n- 初始化 X/Y/Z 轴剖切工具\n- 初始化剖切盒工具\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 停用所有剖切工具\n\n---\n\n### 3.6 ModelTree - 模型树\n\n**文件路径**: \\`src/core/v2/managers/modelTree/index.ts\\`\n\n#### 公共方法\n\n##### getTreeData()\n\n\\`\\`\\`typescript\npublic getTreeData(): any[]\n\\`\\`\\`\n\n**功能**: 获取模型树数据\n\n**返回值**: 模型树数组\n\\`\\`\\`typescript\n[{\n name: string, // 模型名称\n children: any[] // 模型层级树\n}]\n\\`\\`\\`\n\n---\n\n### 3.7 EngineInfo - 引擎信息统计\n\n**文件路径**: \\`src/core/v2/managers/engineInfo/index.ts\\`\n\n#### 公共方法\n\n##### getEngineInfo()\n\n\\`\\`\\`typescript\npublic getEngineInfo(): {\n totalVertices: number;\n totalTriangles: number;\n meshCount: number;\n}\n\\`\\`\\`\n\n**功能**: 获取引擎统计信息\n- 统计所有网格的顶点数\n- 统计所有网格的三角面数\n- 统计网格数量\n\n**返回值**:\n- \\`totalVertices\\`: 总顶点数\n- \\`totalTriangles\\`: 总三角面数\n- \\`meshCount\\`: 网格数量\n\n---\n\n### 3.8 ModelProperties - 模型属性\n\n**文件路径**: \\`src/core/v2/managers/modelProperties/index.ts\\`\n\n#### 公共方法\n\n##### getModelProperties()\n\n\\`\\`\\`typescript\npublic getModelProperties(url: string, id: string, callback: (properties: any) => void): void\n\\`\\`\\`\n\n**功能**: 查询构件属性\n- 异步加载属性数据(如果未加载)\n- 从压缩的 JSON 中解析属性\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n- \\`callback\\`: 回调函数,接收属性对象\n\n**返回值格式**:\n\\`\\`\\`typescript\n{\n properties: [{\n name: string, // 分类名称\n children: [{\n name: string, // 属性名\n value: any // 属性值\n }]\n }],\n materials: []\n}\n\\`\\`\\`\n\n---\n\n### 3.9 ModelMapperBatch - 模型批量映射\n\n**文件路径**: \\`src/core/v2/managers/modelMapperBatch/index.ts\\`\n\n#### 公共方法\n\n##### getModelTypes()\n\n\\`\\`\\`typescript\npublic getModelTypes(): any[]\n\\`\\`\\`\n\n**功能**: 获取模型中所有的构件类型\n\n##### getModelMajors()\n\n\\`\\`\\`typescript\npublic getModelMajors(): any[]\n\\`\\`\\`\n\n**功能**: 获取模型中所有的专业\n\n##### getModelLevels()\n\n\\`\\`\\`typescript\npublic getModelLevels(): any[]\n\\`\\`\\`\n\n**功能**: 获取模型中所有的楼层\n\n##### getModelMapper()\n\n\\`\\`\\`typescript\npublic getModelMapper(url: string, id: number): any\n\\`\\`\\`\n\n**功能**: 获取指定构件的映射信息\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n\n**返回值**: Mapper 对象(包含类型、专业、楼层等信息)\n\n##### getModelSWithType()\n\n\\`\\`\\`typescript\npublic getModelSWithType(type: string, callback: any): any[]\n\\`\\`\\`\n\n**功能**: 获取同类型的所有构件\n\n**参数**:\n- \\`type\\`: 构件类型名称\n- \\`callback\\`: 回调函数\n\n**返回值**: \\`[{url: string, ids: number[]}]\\`\n\n##### getModelSWithLevel()\n\n\\`\\`\\`typescript\npublic getModelSWithLevel(level: string, callback: any): any[]\n\\`\\`\\`\n\n**功能**: 获取同楼层的所有构件\n\n**参数**:\n- \\`level\\`: 楼层名称\n- \\`callback\\`: 回调函数\n\n**返回值**: \\`[{url: string, ids: number[]}]\\`\n\n##### getModelsWithMajor()\n\n\\`\\`\\`typescript\npublic getModelsWithMajor(major: string, callback: any): any[]\n\\`\\`\\`\n\n**功能**: 获取同专业的所有构件\n\n**参数**:\n- \\`major\\`: 专业名称\n- \\`callback\\`: 回调函数\n\n**返回值**: \\`[{url: string, ids: number[]}]\\`\n\n---\n\n### 3.10 ModelEdge - 模型边线管理器\n\n**文件路径**: \\`src/core/v2/managers/modelEdge/index.ts\\`\n\n#### 公共方法\n\n##### active()\n\n\\`\\`\\`typescript\npublic active(): void\n\\`\\`\\`\n\n**功能**: 启动边线显示\n- 显示所有模型的边线\n- 用于技术制图风格渲染\n\n##### disActive()\n\n\\`\\`\\`typescript\npublic disActive(): void\n\\`\\`\\`\n\n**功能**: 关闭边线显示\n\n##### getModelEdge()\n\n\\`\\`\\`typescript\npublic getModelEdge(url: string, id: Number): any\n\\`\\`\\`\n\n**功能**: 获取指定模型的边线数据\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n\n**返回值**: 边线数据 \\`[startIndex, endIndex, points]\\`\n\n##### hideModelEdge()\n\n\\`\\`\\`typescript\npublic hideModelEdge(url: string, id: Number): void\n\\`\\`\\`\n\n**功能**: 隐藏指定构件的边线\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n\n##### showModelEdge()\n\n\\`\\`\\`typescript\npublic showModelEdge(url: string, id: Number): void\n\\`\\`\\`\n\n**功能**: 显示指定构件的边线\n\n**参数**:\n- \\`url\\`: 模型 URL\n- \\`id\\`: 构件 ID\n\n---\n\n## 4. 状态管理\n\n### 4.1 EngineStatus - 引擎状态\n\n**文件路径**: \\`src/core/v2/status/engineStatus.ts\\`\n\n#### 公共属性\n\n\\`\\`\\`typescript\npublic isFree: boolean // 引擎是否空闲\npublic highlightModels: any[] // 高亮的模型数组\npublic hideModels: any[] // 隐藏的模型数组\npublic models: any[] // 已加载的模型数组\n\\`\\`\\`\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\npublic init(): void\n\\`\\`\\`\n\n**功能**: 初始化引擎状态监听\n- 监听 \\`EventType.EngineFree\\` 事件\n- 监听 \\`EventType.EngineBusy\\` 事件\n\n##### updateFree()\n\n\\`\\`\\`typescript\npublic updateFree(status: boolean): void\n\\`\\`\\`\n\n**功能**: 更新引擎空闲状态\n\n**参数**:\n- \\`status\\`: true 表示空闲,false 表示繁忙\n\n##### closeAllFunction()\n\n\\`\\`\\`typescript\npublic closeAllFunction(): void\n\\`\\`\\`\n\n**功能**: 关闭所有功能\n\n---\n\n### 4.2 HandelBehaved - 行为处理器\n\n**文件路径**: \\`src/core/v2/status/handelBehaved.ts\\`\n\n这是一个工厂函数,返回行为处理器对象。\n\n#### 公共方法\n\n##### init()\n\n\\`\\`\\`typescript\ninit(self: any, options: any): void\n\\`\\`\\`\n\n**功能**: 初始化行为处理器\n\n**参数**:\n- \\`self\\`: 当前激活的行为对象\n- \\`options\\`: 行为配置选项\n - \\`showCatch\\`: boolean - 是否显示捕捉点\n\n##### active()\n\n\\`\\`\\`typescript\nactive(): void\n\\`\\`\\`\n\n**功能**: 开启事务(激活事件监听)\n- 监听鼠标事件(mousedown, mouseup, mousemove)\n- 监听键盘事件(keydown, keyup)\n\n##### disActive()\n\n\\`\\`\\`typescript\ndisActive(): void\n\\`\\`\\`\n\n**功能**: 关闭事务(禁用事件监听)\n\n**支持的键盘事件**:\n- Delete / Backspace - 删除\n- Escape - 取消\n- Enter - 确认\n- Space - 空格\n- Ctrl / Control - 控制键\n- Shift - 切换键\n- Alt - 辅助键\n- Meta / Command - 命令键\n\n**支持的鼠标事件**:\n- handleMouseDown - 鼠标按下\n- handleMouseMove - 鼠标移动\n- handleMouseUp - 鼠标弹起\n- handleMouseClick - 鼠标单击\n- handleMouseDoubleClick - 鼠标双击\n\n**捕捉功能**:\n- 点捕捉(距离 < 5 像素)\n- 线捕捉(距离 < 5 像素)\n- 面捕捉(默认)\n\n---\n\n## 使用示例\n\n### 初始化引擎\n\n\\`\\`\\`typescript\nimport { EngineKernelV2 } from './src/core/v2/EngineKernel';\n\nconst engine = new EngineKernelV2({\n containerId: 'canvas-container',\n antialias: true\n});\n\\`\\`\\`\n\n### 加载模型\n\n\\`\\`\\`typescript\nawait engine.loaderModule.loadModels([\n 'https://example.com/model1.light',\n 'https://example.com/model2.light'\n]);\n\\`\\`\\`\n\n### 高亮模型\n\n\\`\\`\\`typescript\nengine.modelToolModule.highlightModel([\n { url: 'model1.light', ids: ['wall-001', 'wall-002'] }\n]);\n\\`\\`\\`\n\n### 切换相机\n\n\\`\\`\\`typescript\n// 切换到正交相机\nengine.cameraModule.switchToOrthographicCamera();\n\n// 或切换当前相机类型\nengine.cameraModule.switchCurrentCamera();\n\\`\\`\\`\n\n### 保存和恢复相机姿态\n\n\\`\\`\\`typescript\n// 保存当前相机姿态\nconst pose = engine.cameraModule.getCameraPose();\n\n// 恢复相机姿态\nengine.cameraModule.restoreCameraPose(pose);\n\\`\\`\\`\n\n### 设置光照和渲染质量\n\n\\`\\`\\`typescript\n// 设置环境光强度\nengine.setting.setAmbientLightIntensity(1.5);\n\n// 设置阴影质量\nengine.setting.setShadowQuality('ultra');\n\n// 开启 GTAO\nengine.setting.setGTAOEnabled(true);\n\n// 调整饱和度和对比度\nengine.setting.setSceneSaturation(1.3);\nengine.setting.setSceneContrast(1.1);\n\\`\\`\\`\n\n### 获取模型属性\n\n\\`\\`\\`typescript\nengine.modelProperties.getModelProperties('model.light', 'wall-001', (data) => {\n console.log('属性:', data.properties);\n});\n\\`\\`\\`\n\n### 按类型筛选构件\n\n\\`\\`\\`typescript\nengine.modelMapperBatch.getModelSWithType('墙', (models) => {\n // 高亮所有墙体\n engine.modelToolModule.highlightModel(models);\n});\n\\`\\`\\`\n\n### 监听事件\n\n\\`\\`\\`typescript\n// 监听点击事件\nengine.events.on(EventType.Click, (hit) => {\n console.log('点击了:', hit.object.name);\n});\n\n// 监听视口大小改变\nengine.events.on(EventType.ViewportResize, ({ width, height }) => {\n console.log('视口大小:', width, height);\n});\n\\`\\`\\`\n\n### 暂停和恢复渲染\n\n\\`\\`\\`typescript\n// 暂停渲染(节省性能)\nengine.pauseRendering();\n\n// 恢复渲染\nengine.resumeRendering();\n\n// 检查渲染状态\nif (engine.isRenderingPausedState()) {\n console.log('渲染已暂停');\n}\n\\`\\`\\`\n\n### 销毁引擎\n\n\\`\\`\\`typescript\n// 释放所有资源\nengine.dispose();\n\\`\\`\\`\n\n---\n\n## 总结\n\nBIM Engine SDK 提供了完整的 3D BIM 模型渲染和交互能力,主要特性包括:\n\n- **完整的相机系统**: 支持透视和正交相机,可保存和恢复相机姿态\n- **强大的模型操作**: 高亮、隐藏、隔离、批量筛选\n- **丰富的测量工具**: 距离、净高、净距、标高、角度、面积、坡度\n- **灵活的剖切功能**: 支持 X/Y/Z 轴剖切和剖切盒\n- **可配置的渲染质量**: 阴影、环境光遮蔽、饱和度、对比度\n- **事件驱动架构**: 支持自定义事件监听和触发\n- **性能优化**: 支持暂停/恢复渲染,八叉树加速\n- **完善的资源管理**: 自动释放几何体、材质、纹理等资源\n\n适用场景:\n- BIM 模型在线浏览\n- 建筑设计审查\n- 施工模拟\n- 运维管理\n- AI 辅助设计\n`;\nexport {\n n as default\n};\n//# sourceMappingURL=API文档-B1v8UcRF.mjs.map\n"],"names":["zhCN","enUS","LocaleManager","locale","key","keys","value","k","listener","l","localeManager","t","lightTheme","darkTheme","ThemeManager","themeName","theme","themeManager","EventEmitter","event","listeners","index","payload","error","ManagerRegistry","BimButtonGroup","options","el","stopPropagation","e","eventType","pos","style","margin","dropdown","dropdownStyle","color","themeColors","colorKey","colors","groupId","beforeGroupId","g","newGroup","config","parentId","group","button","parentBtn","buttons","id","btn","found","groupElement","total","groupEl","btnWrapper","wrapper","btnEl","iconSize","minWidth","icon","textWrapper","label","active","newState","siblings","sib","btnRect","expand","currentTheme","subBtn","item","dropdownRect","arrow","buttonId","visible","show","type","Toolbar","createHomeButton","index$c","createZoomBoxButton","index$b","createWalkMenuButton","index$a","createMapButton","index$9","createPropertyButton","index$8","createSettingButton","index$7","createInfoButton","index$6","createFullscreenButton","index$5","createMeasureButton","index$4","createSectionMenuButton","index$3","createSectionPlaneButton","index$2","createSectionAxisButton","index$1","createSectionBoxButton","BaseManager","handler","unsubscribe","unsub","ToolbarManager","container","v","ButtonGroupManager","BimDialog","titleEl","header","title","closeBtn","content","resizeHandle","width","height","recenter","naturalHeight","minHeight","containerHeight","targetHeight","containerW","containerH","elW","elH","bottomOffset","currentLeft","currentTop","maxLeft","maxTop","nextLeft","nextTop","elRect","left","top","pW","pH","startX","startY","startLeft","startTop","onMouseDown","onMouseMove","onMouseUp","dx","dy","newLeft","newTop","handle","startW","startH","newW","newH","BimInfoDialog","contentEl","infoTitle","infoList","actionBtn","DialogManager","dialog","d","REVISION","MOUSE","TOUCH","CullFaceNone","CullFaceBack","CullFaceFront","PCFShadowMap","PCFSoftShadowMap","VSMShadowMap","FrontSide","BackSide","DoubleSide","NoBlending","NormalBlending","AdditiveBlending","SubtractiveBlending","MultiplyBlending","CustomBlending","AddEquation","SubtractEquation","ReverseSubtractEquation","MinEquation","MaxEquation","ZeroFactor","OneFactor","SrcColorFactor","OneMinusSrcColorFactor","SrcAlphaFactor","OneMinusSrcAlphaFactor","DstAlphaFactor","OneMinusDstAlphaFactor","DstColorFactor","OneMinusDstColorFactor","SrcAlphaSaturateFactor","ConstantColorFactor","OneMinusConstantColorFactor","ConstantAlphaFactor","OneMinusConstantAlphaFactor","NeverDepth","AlwaysDepth","LessDepth","LessEqualDepth","EqualDepth","GreaterEqualDepth","GreaterDepth","NotEqualDepth","MultiplyOperation","MixOperation","AddOperation","NoToneMapping","LinearToneMapping","ReinhardToneMapping","CineonToneMapping","ACESFilmicToneMapping","CustomToneMapping","AgXToneMapping","NeutralToneMapping","AttachedBindMode","DetachedBindMode","UVMapping","CubeReflectionMapping","CubeRefractionMapping","EquirectangularReflectionMapping","EquirectangularRefractionMapping","CubeUVReflectionMapping","RepeatWrapping","ClampToEdgeWrapping","MirroredRepeatWrapping","NearestFilter","NearestMipmapNearestFilter","NearestMipmapLinearFilter","LinearFilter","LinearMipmapNearestFilter","LinearMipmapLinearFilter","UnsignedByteType","ByteType","ShortType","UnsignedShortType","IntType","UnsignedIntType","FloatType","HalfFloatType","UnsignedShort4444Type","UnsignedShort5551Type","UnsignedInt248Type","UnsignedInt5999Type","UnsignedInt101111Type","AlphaFormat","RGBFormat","RGBAFormat","DepthFormat","DepthStencilFormat","RedFormat","RedIntegerFormat","RGFormat","RGIntegerFormat","RGBAIntegerFormat","RGB_S3TC_DXT1_Format","RGBA_S3TC_DXT1_Format","RGBA_S3TC_DXT3_Format","RGBA_S3TC_DXT5_Format","RGB_PVRTC_4BPPV1_Format","RGB_PVRTC_2BPPV1_Format","RGBA_PVRTC_4BPPV1_Format","RGBA_PVRTC_2BPPV1_Format","RGB_ETC1_Format","RGB_ETC2_Format","RGBA_ETC2_EAC_Format","RGBA_ASTC_4x4_Format","RGBA_ASTC_5x4_Format","RGBA_ASTC_5x5_Format","RGBA_ASTC_6x5_Format","RGBA_ASTC_6x6_Format","RGBA_ASTC_8x5_Format","RGBA_ASTC_8x6_Format","RGBA_ASTC_8x8_Format","RGBA_ASTC_10x5_Format","RGBA_ASTC_10x6_Format","RGBA_ASTC_10x8_Format","RGBA_ASTC_10x10_Format","RGBA_ASTC_12x10_Format","RGBA_ASTC_12x12_Format","RGBA_BPTC_Format","RGB_BPTC_SIGNED_Format","RGB_BPTC_UNSIGNED_Format","RED_RGTC1_Format","SIGNED_RED_RGTC1_Format","RED_GREEN_RGTC2_Format","SIGNED_RED_GREEN_RGTC2_Format","InterpolateDiscrete","InterpolateLinear","InterpolateSmooth","ZeroCurvatureEnding","ZeroSlopeEnding","WrapAroundEnding","NormalAnimationBlendMode","TrianglesDrawMode","TriangleStripDrawMode","TriangleFanDrawMode","BasicDepthPacking","RGBADepthPacking","TangentSpaceNormalMap","ObjectSpaceNormalMap","NoColorSpace","SRGBColorSpace","LinearSRGBColorSpace","LinearTransfer","SRGBTransfer","KeepStencilOp","AlwaysStencilFunc","NeverCompare","LessCompare","EqualCompare","LessEqualCompare","GreaterCompare","NotEqualCompare","GreaterEqualCompare","AlwaysCompare","StaticDrawUsage","GLSL3","WebGLCoordinateSystem","WebGPUCoordinateSystem","arrayNeedsUint32","array","i","createElementNS","name","createCanvasElement","canvas","_cache","log","params","message","warn","warnOnce","probeAsync","gl","sync","interval","resolve","reject","probe","EventDispatcher","listenerArray","_lut","_seed","DEG2RAD","RAD2DEG","generateUUID","d0","d1","d2","d3","clamp","min","max","euclideanModulo","n","m","mapLinear","x","a1","a2","b1","b2","inverseLerp","y","lerp","damp","lambda","dt","pingpong","length","smoothstep","smootherstep","randInt","low","high","randFloat","randFloatSpread","range","seededRandom","degToRad","degrees","radToDeg","radians","isPowerOfTwo","ceilPowerOfTwo","floorPowerOfTwo","setQuaternionFromProperEuler","q","a","b","c","order","cos","sin","c2","s2","c13","s13","c1_3","s1_3","c3_1","s3_1","denormalize","normalize","MathUtils","Vector2","scalar","s","minVal","maxVal","denominator","theta","alpha","v1","v2","offset","attribute","center","angle","Quaternion","z","w","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","dot","f","quaternion","euler","update","c1","c3","s1","s3","axis","halfAngle","te","m11","m12","m13","m21","m22","m23","m31","m32","m33","trace","vFrom","vTo","r","step","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","qb","qa","theta1","theta2","r1","r2","callback","Vector3","_quaternion$4","vx","vy","vz","qx","qy","qz","qw","tx","ty","tz","camera","ax","ay","az","bx","by","bz","planeNormal","_vector$c","normal","dz","radius","phi","sinPhiRadius","sx","sy","sz","u","Matrix3","n11","n12","n13","n21","n22","n23","n31","n32","n33","me","xAxis","yAxis","zAxis","ae","be","a11","a12","a13","a21","a22","a23","a31","a32","a33","b11","b12","b13","b21","b22","b23","b31","b32","b33","h","t11","t12","t13","det","detInv","tmp","matrix4","rotation","cx","cy","_m3","matrix","LINEAR_REC709_TO_XYZ","XYZ_TO_LINEAR_REC709","createColorManagement","ColorManagement","sourceColorSpace","targetColorSpace","SRGBToLinear","LinearToSRGB","colorSpace","target","colorSpaces","targetMatrix","REC709_PRIMARIES","REC709_LUMINANCE_COEFFICIENTS","D65","_canvas","ImageUtils","image","context","imageData","data","_sourceId","Source","meta","isRootObject","output","url","serializeImage","_textureId","_tempVec3","Texture","mapping","wrapS","wrapT","magFilter","minFilter","format","anisotropy","start","count","source","values","newValue","currentValue","uv","Vector4","xx","yy","zz","xy","xz","yz","RenderTarget","texture","current","depth","il","WebGLRenderTarget","DataArrayTexture","layerIndex","Data3DTexture","Box3","_vector$b","points","size","halfSize","object","precise","box","point","vector","geometry","positionAttribute","_box$4","children","sphere","plane","triangle","_center","_extents","_v0$2","_v1$7","_v2$4","_f0","_f1","_f2","axes","satForAxes","_triangleNormal","_points","json","_testAxis","v0","extents","j","p0","p1","p2","_box$3","_v1$6","_v2$3","Sphere","optionalCenter","maxRadiusSq","radiusSum","deltaLengthSq","lengthSq","delta","_vector$a","_segCenter","_segDir","_diff","_edge1","_edge2","_normal$1","Ray","origin","direction","ray","directionDistance","optionalPointOnRay","optionalPointOnSegment","segExtent","a01","b0","s0","sqrDist","extDet","invDet","tca","radius2","thc","t0","t1","distToPoint","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","backfaceCulling","DdN","sign","DdQxE2","DdE1xQ","QdN","Matrix4","n14","n24","n34","n41","n42","n43","n44","scaleX","_v1$5","scaleY","scaleZ","af","bf","ce","cf","de","df","ac","ad","bc","bd","_zero","_one","eye","up","_z","_x","_y","a14","a24","a34","a41","a42","a43","a44","b14","b24","b34","b41","b42","b43","b44","t14","scaleXSq","scaleYSq","scaleZSq","yx","zx","zy","position","scale","x2","y2","z2","wx","wy","wz","_m1$2","invSX","invSY","invSZ","right","bottom","near","far","coordinateSystem","reversedDepth","_matrix$2","_quaternion$3","Euler","newOrder","Layers","layer","layers","_object3DId","_v1$4","_q1","_m1$1","_target","_position$3","_scale$2","_quaternion$2","_xAxis","_yAxis","_zAxis","_addedEvent","_removedEvent","_childaddedEvent","_childremovedEvent","Object3D","onRotationChange","onQuaternionChange","distance","parent","result","force","updateParents","updateChildren","info","serialize","library","element","parameters","shapes","shape","uuids","animation","geometries","extractFromCache","materials","textures","images","skeletons","animations","nodes","cache","recursive","child","_v0$1","_v1$3","_v2$2","_v3$2","_vab","_vac","_vbc","_vap","_vbp","_vcp","_v40","_v41","_v42","Triangle","targetLengthSq","dot00","dot01","dot02","dot11","dot12","denom","invDenom","p3","v3","attr","i1","i2","i3","barycoord","i0","p","d4","vc","d5","d6","vb","va","_colorKeywords","_hslA","_hslB","hue2rgb","Color","hex","handleAlpha","string","components","_color","hue","saturation","lightness","color1","color2","_materialId","Material","srcPlanes","dstPlanes","MeshBasicMaterial","_vector$9","_vector2$1","_id$2","BufferAttribute","itemSize","normalized","index1","index2","component","Uint16BufferAttribute","Uint32BufferAttribute","Float32BufferAttribute","_id$1","_m1","_obj","_offset","_box$2","_boxMorphTargets","_vector$8","BufferGeometry","indirect","materialIndex","normalMatrix","tangent","morphAttributesPosition","morphAttribute","morphTargetsRelative","jl","attributes","normalAttribute","uvAttribute","tangentAttribute","tan1","tan2","vA","vB","vC","uvA","uvB","uvC","sdir","tdir","handleTriangle","groups","tmp2","n2","handleVertex","pA","pB","pC","nA","nB","nC","cb","ab","normals","convertBufferAttribute","indices","array2","geometry2","newAttribute","morphAttributes","morphArray","hasMorphAttributes","attributeArray","boundingSphere","boundingBox","_inverseMatrix$3","_ray$3","_sphere$6","_sphereHitAt","_vA$1","_vB$1","_vC$1","_tempA","_morphA","_intersectionPoint","_intersectionPointWorld","Mesh","material","ml","morphPosition","morphInfluences","influence","raycaster","intersects","matrixWorld","rayLocalSpace","intersection","uv1","drawRange","groupMaterial","end","checkGeometryIntersection","checkIntersection$1","intersect","face","BoxGeometry","widthSegments","heightSegments","depthSegments","scope","vertices","uvs","numberOfVertices","groupStart","buildPlane","udir","vdir","gridX","gridY","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","gridX1","gridY1","vertexCounter","groupCount","iy","ix","cloneUniforms","src","property","mergeUniforms","uniforms","merged","cloneUniformsGroups","getUnlitUniformColorSpace","renderer","currentRenderTarget","UniformsUtils","default_vertex","default_fragment","ShaderMaterial","extensions","Camera","_v3$1","_minTarget","_maxTarget","PerspectiveCamera","fov","aspect","focalLength","vExtentSlope","minTarget","maxTarget","fullWidth","fullHeight","view","skew","CubeCamera","renderTarget","cameraPX","cameraNX","cameraPY","cameraNY","cameraPZ","cameraNZ","cameras","scene","activeMipmapLevel","currentActiveCubeFace","currentActiveMipmapLevel","currentXrEnabled","generateMipmaps","CubeTexture","WebGLCubeRenderTarget","shader","mesh","currentMinFilter","stencil","Group","_moveEvent","WebXRController","inputSource","hand","inputjoint","frame","referenceSpace","inputPose","gripPose","handPose","targetRay","grip","jointPose","joint","indexTip","thumbTip","distanceToPinch","threshold","Scene","InterleavedBuffer","stride","interleavedBuffer","ib","_vector$7","InterleavedBufferAttribute","SpriteMaterial","_geometry","_intersectPoint","_worldScale","_mvPosition","_alignedPosition","_rotatedPosition","_viewWorldMatrix","_vA","_vB","_vC","_uvA","_uvB","_uvC","Sprite","float32Array","transformVertex","vertexPosition","mvPosition","_basePosition","_skinIndex","_skinWeight","_vector3","_matrix4","_vertex","_sphere$5","_inverseMatrix$2","_ray$2","SkinnedMesh","skeleton","bindMatrix","skinWeight","weight","boneIndex","Bone","DataTexture","_offsetMatrix","_identityMatrix","Skeleton","bones","boneInverses","inverse","bone","boneMatrices","boneTexture","uuid","boneInverse","InstancedBufferAttribute","meshPerAttribute","_instanceLocalMatrix","_instanceWorldMatrix","_instanceIntersects","_box3","_identity","_mesh$1","_sphere$4","InstancedMesh","objectInfluences","len","dataIndex","raycastTimes","instanceId","morphInfluencesSum","morphBaseInfluence","_vector1","_vector2","_normalMatrix","Plane","constant","inverseNormalLength","line","startSign","endSign","optionalNormalMatrix","referencePoint","_sphere$3","_defaultSpriteCenter","_vector$6","Frustum","p4","p5","planes","frustum","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","sprite","negRadius","LineBasicMaterial","_vStart","_vEnd","_inverseMatrix$1","_ray$1","_sphere$1","_intersectPointOnRay","_intersectPointOnSegment","Line","lineDistances","localThreshold","localThresholdSq","checkIntersection","thresholdSq","_start","_end","LineSegments","LineLoop","PointsMaterial","_inverseMatrix","_ray","_sphere","_position$2","Points","testPoint","rayPointDistanceSq","intersectPoint","DepthTexture","ExternalTexture","sourceTexture","Curve","optionalTarget","divisions","lengths","last","sum","arcLengths","targetArcLength","comparison","lengthBefore","segmentLength","segmentFraction","t2","pt1","pt2","segments","closed","tangents","binormals","vec","mat","EllipseCurve","aX","aY","xRadius","yRadius","aStartAngle","aEndAngle","aClockwise","aRotation","twoPi","deltaAngle","samePoints","ArcCurve","aRadius","CubicPoly","c0","init","x3","tension","dt0","dt1","dt2","t3","px","py","pz","CatmullRomCurve3","curveType","intPoint","pow","CatmullRom","QuadraticBezierP0","QuadraticBezierP1","QuadraticBezierP2","QuadraticBezier","CubicBezierP0","CubicBezierP1","CubicBezierP2","CubicBezierP3","CubicBezier","CubicBezierCurve","CubicBezierCurve3","LineCurve","LineCurve3","QuadraticBezierCurve","QuadraticBezierCurve3","SplineCurve","Curves","CurvePath","curve","startPoint","endPoint","lineType","curveLengths","diff","lens","sums","curves","resolution","pts","Path","aCPx","aCPy","aCP1x","aCP1y","aCP2x","aCP2y","npts","firstPoint","lastPoint","Shape","holesPts","hole","earcut","holeIndices","dim","hasHoles","outerLen","outerNode","linkedList","triangles","minX","minY","invSize","eliminateHoles","maxX","maxY","earcutLinked","clockwise","signedArea","insertNode","equals","removeNode","filterPoints","again","area","ear","pass","indexCurve","stop","prev","next","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangleExceptFirst","minZ","zOrder","maxZ","locallyInside","isValidDiagonal","splitPolygon","queue","list","getLeftmost","compareXYSlope","eliminateHole","aSlope","bSlope","bridge","findHoleBridge","bridgeReverse","hx","hy","mx","my","tanMin","pointInTriangle","tan","sectorContainsSector","sortLinked","numMerges","inSize","tail","pSize","qSize","leftmost","intersectsPolygon","middleInside","q1","q2","o1","o2","o3","o4","onSegment","num","inside","createNode","an","bp","Earcut","ShapeUtils","contour","holes","faces","removeDupEndPts","addContour","holeIndex","ExtrudeGeometry","verticesArray","uvArray","addShape","placeholder","curveSegments","steps","bevelEnabled","bevelThickness","bevelSize","bevelOffset","bevelSegments","extrudePath","uvgen","WorldUVGenerator","extrudePts","extrudeByPath","splineTube","binormal","position2","shapePoints","hl","ahole","mergeOverlappingPoints","THRESHOLD_SQ","prevPos","currentIndex","currentPos","distSq","scalingFactorSqrt","thresholdSqScaled","numHoles","scalePt2","pt","vlen","getBevelVec","inPt","inPrev","inNext","v_trans_x","v_trans_y","shrink_by","v_prev_x","v_prev_y","v_next_x","v_next_y","v_prev_lensq","collinear0","v_prev_len","v_next_len","ptPrevShift_x","ptPrevShift_y","ptNextShift_x","ptNextShift_y","sf","v_trans_lensq","direction_eq","contourMovements","holesMovements","oneHoleMovements","verticesMovements","contractedContourVertices","expandedHoleVertices","bs","vert","oneHoleVertices","flen","buildLidFaces","buildSideFaces","f3","layeroffset","sidewalls","sl","slen1","slen2","f4","addVertex","nextIndex","addUV","vector2","toJSON$1","geometryShapes","indexA","indexB","indexC","a_x","a_y","b_x","b_y","c_x","c_y","indexD","a_z","b_z","c_z","d_x","d_y","d_z","PlaneGeometry","width_half","height_half","segment_width","segment_height","RawShaderMaterial","MeshStandardMaterial","MeshPhysicalMaterial","reflectivity","MeshPhongMaterial","MeshNormalMaterial","MeshLambertMaterial","MeshDepthMaterial","MeshDistanceMaterial","convertArray","isTypedArray","getKeyframeOrder","times","compareTime","sortedArray","nValues","srcOffset","flattenJSON","jsonKeys","valuePropertyName","Interpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","pp","validate_interval","seek","linear_scan","forward_scan","giveUpAt","t1global","mid","CubicInterpolant","iPrev","iNext","tPrev","tNext","halfDt","o0","oP","oN","wP","wN","ppp","sP","sN","LinearInterpolant","offset1","offset0","weight1","weight0","DiscreteInterpolant","KeyframeTrack","interpolation","track","trackType","factoryMethod","timeOffset","timeScale","startTime","endTime","nKeys","from","to","valid","valueSize","prevTime","currTime","smoothInterpolation","lastIndex","writeIndex","keep","time","timeNext","offsetP","offsetN","readOffset","writeOffset","TypedKeyframeTrack","BooleanKeyframeTrack","ColorKeyframeTrack","NumberKeyframeTrack","QuaternionLinearInterpolant","QuaternionKeyframeTrack","StringKeyframeTrack","VectorKeyframeTrack","AnimationClip","duration","tracks","blendMode","jsonTracks","frameTime","parseKeyframeTrack","clip","clipTracks","morphTargetSequence","fps","noLoop","numMorphTargets","objectOrClipArray","clipArray","o","morphTargets","animationToMorphTargets","pattern","morphTarget","parts","animationMorphTargets","clips","addNonemptyTrack","trackName","animationKeys","propertyName","destTracks","clipName","hierarchyTracks","morphTargetNames","morphTargetName","animationKey","boneName","getTrackTypeForValueTypeName","typeName","Cache","file","LoadingManager","onLoad","onProgress","onError","isLoading","itemsLoaded","itemsTotal","urlModifier","handlers","transform","regex","loader","DefaultLoadingManager","Loader","manager","crossOrigin","path","resourcePath","requestHeader","loading","HttpError","response","FileLoader","cached","req","mimeType","responseType","callbacks","reader","contentLength","lengthComputable","loaded","stream","controller","readData","done","text","exec","decoder","err","_loading","ImageLoader","arr","onImageLoad","removeEventListeners","onImageError","TextureLoader","Light","intensity","_projScreenMatrix$1","_lightPositionWorld$1","_lookTarget$1","LightShadow","light","shadowCamera","shadowMatrix","viewportIndex","SpotLightShadow","SpotLight","penumbra","decay","power","_projScreenMatrix","_lightPositionWorld","_lookTarget","PointLightShadow","PointLight","OrthographicCamera","scaleW","scaleH","DirectionalLightShadow","DirectionalLight","AmbientLight","LoaderUtils","_errorMap","ImageBitmapLoader","imageBitmap","fetchOptions","promise","res","blob","ArrayCamera","Clock","autoStart","newTime","_RESERVED_CHARS_RE","_reservedRe","_wordChar","_wordCharOrDot","_directoryRe","_nodeRe","_objectRe","_propertyRe","_trackRe","_supportedObjectNames","Composite","targetGroup","optionalParsedPath","parsedPath","PropertyBinding","firstValidIndex","binding","bindings","rootNode","root","matches","results","lastDot","objectName","nodeName","searchNodeSubtree","childNode","subTreeNode","buffer","dest","targetArray","sourceArray","targetObject","propertyIndex","objectIndex","nodeProperty","versioning","bindingType","_matrix","Raycaster","coords","ascSort","objects","propagate","Spherical","other","_startP","_startEnd","_d1","_d2","_r","_c1","_c2","Line3","clampToLine","startEnd2","EPSILON","Controls","domElement","getByteLength","typeByteLength","getTextureTypeByteLength","WebGLAnimation","isAnimating","animationLoop","requestId","onAnimationFrame","WebGLAttributes","buffers","createBuffer","bufferType","usage","updateBuffer","updateRanges","mergeIndex","previousRange","get","remove","alphahash_fragment","alphahash_pars_fragment","alphamap_fragment","alphamap_pars_fragment","alphatest_fragment","alphatest_pars_fragment","aomap_fragment","aomap_pars_fragment","batching_pars_vertex","batching_vertex","begin_vertex","beginnormal_vertex","bsdfs","iridescence_fragment","bumpmap_pars_fragment","clipping_planes_fragment","clipping_planes_pars_fragment","clipping_planes_pars_vertex","clipping_planes_vertex","color_fragment","color_pars_fragment","color_pars_vertex","color_vertex","common","cube_uv_reflection_fragment","defaultnormal_vertex","displacementmap_pars_vertex","displacementmap_vertex","emissivemap_fragment","emissivemap_pars_fragment","colorspace_fragment","colorspace_pars_fragment","envmap_fragment","envmap_common_pars_fragment","envmap_pars_fragment","envmap_pars_vertex","envmap_vertex","fog_vertex","fog_pars_vertex","fog_fragment","fog_pars_fragment","gradientmap_pars_fragment","lightmap_pars_fragment","lights_lambert_fragment","lights_lambert_pars_fragment","lights_pars_begin","envmap_physical_pars_fragment","lights_toon_fragment","lights_toon_pars_fragment","lights_phong_fragment","lights_phong_pars_fragment","lights_physical_fragment","lights_physical_pars_fragment","lights_fragment_begin","lights_fragment_maps","lights_fragment_end","logdepthbuf_fragment","logdepthbuf_pars_fragment","logdepthbuf_pars_vertex","logdepthbuf_vertex","map_fragment","map_pars_fragment","map_particle_fragment","map_particle_pars_fragment","metalnessmap_fragment","metalnessmap_pars_fragment","morphinstance_vertex","morphcolor_vertex","morphnormal_vertex","morphtarget_pars_vertex","morphtarget_vertex","normal_fragment_begin","normal_fragment_maps","normal_pars_fragment","normal_pars_vertex","normal_vertex","normalmap_pars_fragment","clearcoat_normal_fragment_begin","clearcoat_normal_fragment_maps","clearcoat_pars_fragment","iridescence_pars_fragment","opaque_fragment","packing","premultiplied_alpha_fragment","project_vertex","dithering_fragment","dithering_pars_fragment","roughnessmap_fragment","roughnessmap_pars_fragment","shadowmap_pars_fragment","shadowmap_pars_vertex","shadowmap_vertex","shadowmask_pars_fragment","skinbase_vertex","skinning_pars_vertex","skinning_vertex","skinnormal_vertex","specularmap_fragment","specularmap_pars_fragment","tonemapping_fragment","tonemapping_pars_fragment","transmission_fragment","transmission_pars_fragment","uv_pars_fragment","uv_pars_vertex","uv_vertex","worldpos_vertex","ShaderChunk","UniformsLib","ShaderLib","_rgb","_e1$1","WebGLBackground","cubemaps","cubeuvmaps","state","premultipliedAlpha","clearColor","clearAlpha","planeMesh","boxMesh","currentBackground","currentBackgroundVersion","currentTonemapping","getBackground","background","render","forceClear","setClear","environmentBlendMode","addToRenderList","renderList","dispose","WebGLBindingStates","maxVertexAttributes","bindingStates","defaultState","createBindingState","currentState","forceUpdate","setup","program","updateBuffers","getBindingState","bindVertexArrayObject","needsUpdate","saveCache","setupVertexAttributes","createVertexArrayObject","vao","deleteVertexArrayObject","wireframe","programMap","stateMap","newAttributes","enabledAttributes","attributeDivisors","cachedAttributes","geometryAttributes","attributesNum","programAttributes","cachedAttribute","geometryAttribute","initAttributes","enableAttribute","enableAttributeAndDivisor","disableUnusedAttributes","vertexAttribPointer","integer","materialDefaultAttributeValues","programAttribute","bytesPerElement","reset","geometryId","programId","releaseStatesOfGeometry","releaseStatesOfProgram","resetDefaultState","WebGLBufferRenderer","mode","setMode","renderInstances","primcount","renderMultiDraw","starts","counts","drawCount","elementCount","renderMultiDrawInstances","extension","WebGLCapabilities","utils","maxAnisotropy","getMaxAnisotropy","textureFormatReadable","textureFormat","textureTypeReadable","textureType","halfFloatSupportedByExt","getMaxPrecision","precision","maxPrecision","logarithmicDepthBuffer","reversedDepthBuffer","maxTextures","maxVertexTextures","maxTextureSize","maxCubemapSize","maxAttributes","maxVertexUniforms","maxVaryings","maxFragmentUniforms","vertexTextures","maxSamples","WebGLClipping","properties","globalState","numGlobalPlanes","localClippingEnabled","renderingShadows","viewNormalMatrix","uniform","enableLocalClipping","enabled","projectPlanes","useCache","clipIntersection","clipShadows","materialProperties","resetGlobalState","nGlobal","lGlobal","dstArray","skipTransform","nPlanes","flatSize","viewMatrix","i4","WebGLCubeMaps","mapTextureMapping","cubemap","onTextureDispose","LOD_MIN","EXTRA_LOD_SIGMA","MAX_SAMPLES","GGX_SAMPLES","_flatCamera","_clearColor","_oldTarget","_oldActiveCubeFace","_oldActiveMipmapLevel","_oldXrEnabled","_origin","PMREMGenerator","sigma","cubeUVRenderTarget","equirectangular","_getCubemapMaterial","_getEquirectMaterial","cubeSize","outputTarget","_setViewport","_createRenderTarget","_lodMax","_createPlanes","_getBlurShader","_getGGXShader","cubeCamera","upSign","forwardSign","originalAutoClear","toneMapping","backgroundBox","backgroundMaterial","useSolidColor","col","isCubeTexture","autoClear","lodIn","lodOut","pingPongRenderTarget","ggxMaterial","ggxMesh","ggxUniforms","targetRoughness","sourceRoughness","incrementalRoughness","blurStrength","adjustedRoughness","outputSize","poleAxis","targetIn","targetOut","sigmaRadians","blurMaterial","STANDARD_DEVIATIONS","blurMesh","blurUniforms","pixels","radiansPerPixel","sigmaPixels","samples","weights","lodMax","sizeLods","sigmas","lodMeshes","lod","totalLods","sizeLod","texelSize","cubeFaces","positionSize","uvSize","faceIndexSize","faceIndex","coordinates","fill","_getCommonVertexShader","WebGLCubeUVMaps","cubeUVmaps","pmremGenerator","isEquirectMap","isCubeMap","currentPMREMVersion","isCubeTextureComplete","cubemapUV","WebGLExtensions","getExtension","WebGLGeometries","wireframeAttributes","onGeometryDispose","updateWireframeAttribute","geometryIndex","geometryPosition","version","previousAttribute","getWireframeAttribute","currentAttribute","WebGLIndexedBufferRenderer","setIndex","WebGLInfo","memory","instanceCount","WebGLMorphtargets","capabilities","morphTextures","morph","morphTargetsCount","entry","disposeTexture","hasMorphPosition","hasMorphNormals","hasMorphColors","morphNormals","morphColors","vertexDataCount","vertexDataStride","morphNormal","morphColor","WebGLObjects","updateMap","buffergeometry","onInstancedMeshDispose","instancedMesh","emptyTexture","emptyShadowTexture","emptyArrayTexture","empty3dTexture","emptyCubeTexture","arrayCacheF32","arrayCacheI32","mat4array","mat3array","mat2array","flatten","nBlocks","blockSize","firstElem","arraysEqual","copyArray","allocTexUnits","setValueV1f","setValueV2f","setValueV3f","setValueV4f","setValueM2","elements","setValueM3","setValueM4","setValueV1i","setValueV2i","setValueV3i","setValueV4i","setValueV1ui","setValueV2ui","setValueV3ui","setValueV4ui","setValueT1","unit","emptyTexture2D","setValueT3D1","setValueT6","setValueT2DArray1","getSingularSetter","setValueV1fArray","setValueV2fArray","setValueV3fArray","setValueV4fArray","setValueM2Array","setValueM3Array","setValueM4Array","setValueV1iArray","setValueV2iArray","setValueV3iArray","setValueV4iArray","setValueV1uiArray","setValueV2uiArray","setValueV3uiArray","setValueV4uiArray","setValueT1Array","units","setValueT3DArray","setValueT6Array","setValueT2DArrayArray","getPureArraySetter","SingleUniform","activeInfo","addr","PureArrayUniform","StructuredUniform","seq","RePathPart","addUniform","uniformObject","parseUniform","pathLength","match","matchEnd","idIsIndex","subscript","WebGLUniforms","WebGLShader","COMPLETION_STATUS_KHR","programIdCount","handleSource","errorLine","lines","lines2","_m0","getEncodingComponents","encodingMatrix","getShaderErrors","status","errors","errorMatches","getTexelEncodingFunction","functionName","getToneMappingFunction","toneMappingName","_v0","getLuminanceFunction","generateVertexExtensions","filterEmptyLine","generateDefines","defines","chunks","fetchAttributeLocations","locationSize","replaceLightNums","numSpotLightCoords","replaceClippingPlaneNums","includePattern","resolveIncludes","includeReplacer","shaderChunkMap","include","newInclude","unrollLoopPattern","unrollLoops","loopReplacer","snippet","generatePrecision","precisionstring","generateShadowMapTypeDefine","shadowMapTypeDefine","generateEnvMapTypeDefine","envMapTypeDefine","generateEnvMapModeDefine","envMapModeDefine","generateEnvMapBlendingDefine","envMapBlendingDefine","generateCubeUVSize","imageHeight","maxMip","texelHeight","WebGLProgram","cacheKey","vertexShader","fragmentShader","envMapCubeUVSize","customVertexExtensions","customDefines","prefixVertex","prefixFragment","versionString","vertexGlsl","fragmentGlsl","glVertexShader","glFragmentShader","onFirstUse","self","programInfoLog","vertexShaderInfoLog","fragmentShaderInfoLog","programLog","vertexLog","fragmentLog","runnable","haveDiagnostics","vertexErrors","fragmentErrors","cachedUniforms","programReady","_id","WebGLShaderCache","vertexShaderStage","fragmentShaderStage","materialShaders","shaderStage","set","code","stage","WebGLShaderStage","WebGLPrograms","clipping","_programLayers","_customShaders","_activeChannels","programs","SUPPORTS_VERTEX_TEXTURES","shaderIDs","getChannel","getParameters","lights","shadows","fog","environment","envMap","envMapCubeUVHeight","shaderID","morphTextureStride","customVertexShaderID","customFragmentShaderID","IS_INSTANCEDMESH","IS_BATCHEDMESH","HAS_MAP","HAS_MATCAP","HAS_ENVMAP","HAS_AOMAP","HAS_LIGHTMAP","HAS_BUMPMAP","HAS_NORMALMAP","HAS_DISPLACEMENTMAP","HAS_EMISSIVEMAP","HAS_METALNESSMAP","HAS_ROUGHNESSMAP","HAS_ANISOTROPY","HAS_CLEARCOAT","HAS_DISPERSION","HAS_IRIDESCENCE","HAS_SHEEN","HAS_TRANSMISSION","HAS_ANISOTROPYMAP","HAS_CLEARCOATMAP","HAS_CLEARCOAT_NORMALMAP","HAS_CLEARCOAT_ROUGHNESSMAP","HAS_IRIDESCENCEMAP","HAS_IRIDESCENCE_THICKNESSMAP","HAS_SHEEN_COLORMAP","HAS_SHEEN_ROUGHNESSMAP","HAS_SPECULARMAP","HAS_SPECULAR_COLORMAP","HAS_SPECULAR_INTENSITYMAP","HAS_TRANSMISSIONMAP","HAS_THICKNESSMAP","HAS_GRADIENTMAP","HAS_ALPHAMAP","HAS_ALPHATEST","HAS_ALPHAHASH","HAS_EXTENSIONS","getProgramCacheKey","getProgramCacheKeyParameters","getProgramCacheKeyBooleans","getUniforms","acquireProgram","pl","preexistingProgram","releaseProgram","releaseShaderCache","WebGLProperties","has","map","painterSortStable","reversePainterSortStable","WebGLRenderList","renderItems","renderItemsIndex","opaque","transmissive","transparent","getNextRenderItem","groupOrder","renderItem","push","unshift","sort","customOpaqueSort","customTransparentSort","finish","WebGLRenderLists","lists","renderCallDepth","listArray","UniformsCache","ShadowUniformsCache","nextVersion","shadowCastingAndTexturingLightsFirst","lightA","lightB","WebGLLights","shadowCache","vector3","matrix42","directionalLength","pointLength","spotLength","rectAreaLength","hemiLength","numDirectionalShadows","numPointShadows","numSpotShadows","numSpotMaps","numSpotShadowsWithMaps","numLightProbes","shadowMap","shadow","shadowUniforms","hash","setupView","WebGLRenderState","lightsArray","shadowsArray","pushLight","pushShadow","shadowLight","setupLights","setupLightsView","WebGLRenderStates","renderStates","renderStateArray","renderState","vertex","fragment","WebGLShadowMap","_frustum","_shadowMapSize","_viewportSize","_viewport","_depthMaterial","_distanceMaterial","_materialCache","_maxTextureSize","shadowSide","shadowMaterialVertical","shadowMaterialHorizontal","fullScreenTri","fullScreenMesh","_previousType","activeCubeFace","_state","toVSM","fromVSM","shadowFrameExtents","pars","viewportCount","vp","viewport","renderObject","VSMPass","getDepthMaterial","customMaterial","keyA","keyB","materialsForVariant","cachedMaterial","onMaterialDispose","kl","depthMaterial","reversedFuncs","WebGLState","ColorBuffer","locked","currentColorMask","currentColorClear","colorMask","lock","DepthBuffer","currentReversed","currentDepthMask","currentDepthFunc","currentDepthClear","reversed","ext","oldDepth","depthTest","enable","disable","depthMask","depthFunc","StencilBuffer","currentStencilMask","currentStencilFunc","currentStencilRef","currentStencilFuncMask","currentStencilFail","currentStencilZFail","currentStencilZPass","currentStencilClear","stencilTest","stencilMask","stencilFunc","stencilRef","stencilFail","stencilZFail","stencilZPass","colorBuffer","depthBuffer","stencilBuffer","uboBindings","uboProgramMap","enabledCapabilities","currentBoundFramebuffers","currentDrawbuffers","defaultDrawbuffers","currentProgram","currentBlendingEnabled","currentBlending","currentBlendEquation","currentBlendSrc","currentBlendDst","currentBlendEquationAlpha","currentBlendSrcAlpha","currentBlendDstAlpha","currentBlendColor","currentBlendAlpha","currentPremultipledAlpha","currentFlipSided","currentCullFace","currentLineWidth","currentPolygonOffsetFactor","currentPolygonOffsetUnits","lineWidthAvailable","glVersion","currentTextureSlot","currentBoundTextures","scissorParam","viewportParam","currentScissor","currentViewport","createTexture","dimensions","emptyTextures","setFlipSided","setCullFace","setBlending","bindFramebuffer","framebuffer","drawBuffers","useProgram","equationToGL","factorToGL","blending","blendEquation","blendSrc","blendDst","blendEquationAlpha","blendSrcAlpha","blendDstAlpha","blendColor","blendAlpha","setMaterial","frontFaceCW","flipSided","stencilWrite","setPolygonOffset","cullFace","setLineWidth","polygonOffset","factor","setScissorTest","scissorTest","activeTexture","webglSlot","bindTexture","webglType","webglTexture","boundTexture","unbindTexture","compressedTexImage2D","compressedTexImage3D","texSubImage2D","texSubImage3D","compressedTexSubImage2D","compressedTexSubImage3D","texStorage2D","texStorage3D","texImage2D","texImage3D","scissor","updateUBOMapping","uniformsGroup","blockIndex","uniformBlockBinding","WebGLTextures","_gl","multisampledRTTExt","supportsInvalidateFramebuffer","_imageDimensions","_videoTextures","_sources","useOffscreenCanvas","createCanvas","resizeImage","needsNewCanvas","maxSize","getDimensions","textureNeedsGenerateMipmaps","generateMipmap","getTargetType","getInternalFormat","internalFormatName","glFormat","glType","forceLinearTransfer","internalFormat","transfer","getInternalDepthFormat","useStencil","depthType","glInternalFormat","getMipLevels","deallocateTexture","onRenderTargetDispose","deallocateRenderTarget","textureProperties","webglTextures","deleteTexture","renderTargetProperties","level","attachmentProperties","textureUnits","resetTextureUnits","allocateTextureUnit","textureUnit","getTextureCacheKey","setTexture2D","slot","updateVideoTexture","uploadTexture","setTexture2DArray","setTexture3D","setTextureCube","uploadCubeTexture","wrappingToGL","filterToGL","compareToGL","setTextureParameters","initTexture","forceUpload","textureCacheKey","getRow","rowLength","componentStride","updateTexture","previousEnd","currentRow","previousRow","currentUnpackRowLen","currentUnpackSkipPixels","currentUnpackSkipRows","pixelStart","pixelCount","sourceProperties","workingPrimaries","texturePrimaries","unpackConversion","verifyColorSpace","mipmap","mipmaps","useTexStorage","allocateMemory","dataReady","levels","layerByteLength","layerData","isCompressed","isDataTexture","cubeImage","mipmapImage","setupFrameBufferTexture","attachment","textureTarget","useMultisampledRTT","getRenderTargetSamples","setupRenderBufferStorage","renderbuffer","isMultisample","depthTexture","glAttachmentType","setupDepthTexture","webglDepthTexture","setupDepthRenderbuffer","isCube","disposeEvent","rebindTextures","colorTexture","setupRenderTarget","isMultipleRenderTargets","glTextureType","updateRenderTargetMipmap","targetType","invalidationArrayRead","invalidationArrayDraw","updateMultisampleRenderTarget","mask","depthStyle","WebGLUtils","convert","_occlusion_vertex","_occlusion_fragment","WebXRDepthSensing","depthData","cameraXR","WebXRManager","session","framebufferScaleFactor","referenceSpaceType","foveation","customReferenceSpace","pose","glBinding","glProjLayer","glBaseLayer","xrFrame","supportsGlBinding","depthSensing","cameraAccessTextures","initialRenderTarget","newRenderTarget","controllers","controllerInputSources","currentSize","currentPixelRatio","cameraL","cameraR","_currentDepthNear","_currentDepthFar","onSessionEvent","controllerIndex","onSessionEnd","onInputSourcesChange","space","depthFormat","glDepthFormat","projectionlayerInit","layerInit","cameraLPos","cameraRPos","setProjectionFromUnion","ipd","projL","projR","topFov","bottomFov","leftFov","rightFov","zOffset","xOffset","near2","far2","left2","right2","top2","bottom2","updateCamera","depthNear","depthFar","updateUserCamera","xrCamera","onAnimationFrameCallback","views","cameraXRNeedsUpdate","glSubImage","enabledFeatures","cameraTex","glTexture","_e1","WebGLMaterials","refreshTransformUniform","refreshFogUniforms","refreshMaterialUniforms","pixelRatio","transmissionRenderTarget","refreshUniformsCommon","refreshUniformsToon","refreshUniformsPhong","refreshUniformsStandard","refreshUniformsPhysical","refreshUniformsMatcap","refreshUniformsDistance","refreshUniformsLine","refreshUniformsDash","refreshUniformsPoints","refreshUniformsSprites","envMapRotation","WebGLUniformsGroups","updateList","allocatedBindingPoints","maxBindingPoints","bind","webglProgram","prepareUniformsGroup","onUniformsGroupsDispose","updateBufferData","bindingPointIndex","allocateBindingPointIndex","uniformArray","hasUniformChanged","arrayOffset","getUniformSize","indexArray","indexString","cachedObject","chunkSize","chunkOffset","chunkPadding","chunkStart","DATA","lut","getDFGLUT","WebGLRenderer","antialias","preserveDrawingBuffer","powerPreference","failIfMajorPerformanceCaveat","_alpha","INTEGER_FORMATS","UNSIGNED_TYPES","uintClearColor","intClearColor","currentRenderList","currentRenderState","renderListStack","renderStateStack","_this","_isContextLost","_currentActiveCubeFace","_currentActiveMipmapLevel","_currentRenderTarget","_currentMaterialId","_currentCamera","_currentViewport","_currentScissor","_currentScissorTest","_currentClearColor","_currentClearAlpha","_width","_height","_pixelRatio","_opaqueSort","_transparentSort","_scissor","_scissorTest","_clippingEnabled","_localClippingEnabled","_vector4","_emptyScene","_renderBackground","getTargetPixelRatio","getContext","contextName","contextAttributes","onContextLost","onContextRestore","onContextCreationError","programCache","renderLists","morphtargets","bufferRenderer","indexedBufferRenderer","uniformsGroups","initGLContext","xr","updateStyle","boolean","method","bits","isIntegerFormat","targetFormat","isUnsignedType","onXRSessionStart","onXRSessionEnd","infoAutoReset","shadowMapEnabled","shadowMapAutoUpdate","shadowMapNeedsUpdate","shadowMapType","deallocateMaterial","releaseMaterialProgramReferences","setProgram","rangeFactor","drawStart","drawEnd","lineWidth","maxInstanceCount","prepareMaterial","getProgram","targetScene","material2","checkMaterialsReady","depthSensingMesh","projectObject","opaqueObjects","transmissiveObjects","camera2","renderTransmissionPass","renderScene","sortObjects","transparentObjects","renderObjects","activeViewport","currentToneMapping","currentCameraViewport","renderTargetNeedsUpdate","currentSide","overrideMaterial","lightsStateVersion","programCacheKey","updateCommonMaterialProperties","materialNeedsLights","getUniformList","progUniforms","vertexAlphas","vertexTangents","needsProgramChange","refreshProgram","refreshMaterial","refreshLights","p_uniforms","m_uniforms","uCamPos","markUniformsLightsNeedsUpdate","defaultFramebuffer","_scratchFrameBuffer","useDefaultFramebuffer","isRenderTarget3D","__webglFramebuffer","activeCubeFaceIndex","textureIndex","glBuffer","currFramebuffer","levelScale","_srcFramebuffer","_dstFramebuffer","srcTexture","dstTexture","srcRegion","dstPosition","srcLevel","dstLevel","dstX","dstY","dstZ","glTarget","currentUnpackImageHeight","currentUnpackSkipImages","isSrc3D","isDst3D","srcTextureProperties","dstTextureProperties","srcRenderTargetProperties","dstRenderTargetProperties","Dl","E.Scene","E.Group","Ll","E.PerspectiveCamera","E.OrthographicCamera","Bl","Il","E.WebGLRenderer","E.PCFSoftShadowMap","E.SRGBColorSpace","E.ACESFilmicToneMapping","er","Wo","Wn","Js","br","Ui","zl","Lo","Z","ze","$i","Nl","Na","fn","cn","Ri","fr","Ul","Ol","Fl","ql","Hl","Gl","Wl","Xl","Vl","Kl","Zl","vr","E.Vector3","E.Raycaster","E.Euler","tr","E.Vector2","_","C","P","B","T","D","A","I","M","H","ee","E.MathUtils","Yl","Xt","Jt","$l","Bo","Jl","Fi","dr","Ql","ji","Qs","vi","et","yt","Sr","ec","tc","dn","pn","Oa","nc","je","Xn","Ae","qn","Ji","ic","sc","Io","Zt","Kn","Xo","rc","oc","ne","O","N","J","K","fe","pe","se","oe","ue","Se","De","S","G","L","R","W","X","U","Y","Q","$","ie","he","Te","$e","ke","Lt","ye","en","vn","Je","vt","Bt","It","zt","St","Ne","Ua","mr","Gn","Hn","pr","Fa","Va","ja","Ha","Di","Ga","Wa","yn","Xa","hn","Zn","lc","Li","Ka","Za","Ya","$a","Ja","Qa","tl","cc","hc","uc","E.WebGLRenderTarget","E.LinearFilter","E.RGBAFormat","Yn","qo","$n","Qi","Tr","fc","Sn","jn","dc","Ko","Zo","pc","nr","Hi","Yo","Gi","it","Wi","xn","wn","On","Ue","$o","mc","gc","Jo","Un","yc","Si","wc","_c","xc","Sc","Tc","Ec","Mc","Ac","Cc","Pc","kc","Fn","Qo","Wt","ea","Bs","Rc","Dc","Lc","Bc","Ic","zc","Nc","Oc","Uc","Fc","Vc","Er","jc","ta","Hc","Gc","Wc","Xc","qc","Kc","Zc","Yc","na","$c","Jc","F","re","ia","sa","Qc","Is","ra","Mr","eh","th","Xi","Ar","ir","oa","nh","aa","Cr","la","ih","sh","rh","oh","sr","zs","ah","lh","ch","hh","Re","uh","fh","dh","ca","ph","Vn","mh","gh","Pr","Tn","Ti","yh","wh","es","_h","xh","Fe","ts","ha","bn","ua","bh","vh","Sh","Ii","kr","Rr","Th","Eh","Mh","Ah","fa","Dr","Yt","da","Ch","Ph","kh","Rh","Dh","Lh","Lr","Br","Jn","Bh","Ir","zr","Nr","Ih","zh","pa","rr","Or","Nh","Oh","ma","ns","Ur","ga","qi","Fr","Uh","Ei","st","qt","Fh","ya","Vh","jh","Ns","wa","_e","mp","gp","yp","wp","_p","xp","Sp","Tp","Ep","Mp","Ap","Cp","Pp","Hh","Gh","_a","is","Wh","zo","Bi","Rt","lt","at","No","Oo","Xh","_n","qh","E.MeshBasicMaterial","E.BufferGeometry","Qn","E.Color","ei","E.InstancedMesh","ti","E.Matrix4","E.Shape","E.ExtrudeGeometry","E.MeshPhongMaterial","E.DoubleSide","E.Mesh","Kh","Vr","jr","nl","Rs","Uo","Zh","eu","tu","hu","uu","fu","iu","su","ru","ou","Qh","au","nu","cu","lu","$h","du","pu","In","xa","le","mu","Cu","Jh","gu","yu","wu","Yh","rl","rt","ht","We","ol","al","Fo","En","Hr","Os","mn","ba","Cl","_u","xu","Gr","Ds","fl","ul","Vo","Wr","dl","ss","Tt","bu","Ho","Al","rs","vu","jo","Ls","Nt","Su","Tu","Eu","os","Us","Mu","Au","ll","cl","gr","Zi","Vi","yl","Xr","wl","_l","xl","bl","vl","Yi","Sl","Tl","El","Ml","wr","yr","Pu","nt","Pl","ku","Ru","Du","E.Box3","Lu","qr","E.FrontSide","E.MeshStandardMaterial","E.LinearSRGBColorSpace","E.MeshPhysicalMaterial","E.MeshLambertMaterial","Bu","Iu","zu","Nu","E.DirectionalLight","E.AmbientLight","wt","Ou","Uu","Kr","Ge","Mi","Fu","Zr","Vu","ju","Hu","gn","Bn","Gu","Fs","Vs","Wu","ct","as","Xu","qu","Ku","E.Quaternion","E.TextureLoader","E.BoxGeometry","Zu","Yu","$u","Ju","E.PlaneGeometry","_t","bt","Qu","ef","tf","nf","rf","of","lf","E.BufferAttribute","E.LineBasicMaterial","E.Line","E.Plane","Sa","hf","uf","Yr","ls","$r","Be","Ee","Ta","ff","cs","Qt","pf","mf","Ea","Jr","hs","Qr","we","eo","no","ni","Mn","mt","gf","Et","ii","yf","wf","us","_f","xf","Ma","Ai","js","Aa","Hs","vf","Gs","Sf","Tf","Ef","xt","Mf","or","Af","Ze","Cf","gt","io","He","Ye","Oe","Ie","ar","Pf","qe","Me","Ve","Ke","Ce","Pe","lr","kf","ge","Pt","un","tn","si","Rf","Ws","An","fs","Df","ri","Go","Lf","Ot","Ut","Ft","oi","ai","li","so","ro","oo","Cn","Bf","ao","lo","Ki","ve","If","zf","Nf","Of","Dt","Uf","Ff","Vf","jf","Xs","Hf","Gf","qs","ci","nn","sn","Pn","co","hi","Wf","Ks","ui","ds","kn","Xf","qf","Kf","Zf","Yf","$f","Jf","Zs","Qf","ed","Ys","fi","rn","on","Rn","ho","di","td","$s","pi","ps","Dn","nd","sd","rd","od","zn","zi","At","ln","ms","gs","ys","ld","Qe","mi","uo","cd","cr","Ca","hd","Pa","ud","ot","fd","fo","dd","pd","ka","md","gd","yd","wd","hr","_d","xd","vd","po","mo","Sd","go","yo","Td","ws","_s","gi","Ed","Md","xs","Ad","$t","Cd","Ni","Pd","vs","wo","_o","Ct","Ss","Ln","kd","ut","xe","ft","Ts","xo","yi","Es","Rd","Dd","Ld","bo","Bd","vo","Id","zd","Nd","Ra","Od","Da","La","Xe","So","Le","To","Eo","Mo","Ms","wi","_i","Ao","As","Cs","Ud","Ht","Gt","Ci","Pi","Nn","Vt","ur","Fd","ki","Co","Ba","Vd","jd","Hd","Ps","Gd","ks","Ia","Wd","Po","Xd","kt","Oi","Rl","jt","xi","Mt","bi","tt","Kt","qd","Kd","ko","Ro","Zd","Yd","$d","Do","Jd","za","E.Float32BufferAttribute","Qd","ep","tp","np","ip","sp","rp","op","ap","E.LineSegments","lp","cp","main2Txx2Vau","stepCkmZYIvn","API__B1v8UcRF","hp","E.Points","E.Sprite","E.Texture","kp","Engine","engineConfig","createEngineSDK","hit","registry","_theme","activateFunc","speed","BimRightKey","rect","viewportWidth","viewportHeight","newX","newY","BimMenu","items","defaultGroup","groupName","sortedGroupKeys","divider","groupItems","isEnabled","iconDiv","labelDiv","hasChildren","arrowDiv","parentLi","subMenu","subRect","RightKeyManager","menu","EngineManager","selected","TreeNodeCheckState","BimTreeNode","nodeEl","iconEl","indent","newChecked","fireEvent","BimTree","searchContainer","query","lowerQuery","node","noData","childConfig","isChecked","allChecked","allUnchecked","checked","expanded","includeHalfChecked","BimTab","tab","tabId","panel","targetTab","isActive","ICONS","getIcon","transformTreeData","apiData","model","modelIndex","transformNode","childIndex","ConstructTreeManagerBtn","levelTreeData","typeTreeData","majorTreeData","createTree","tree","componentTree","typeTree","majorTree","componentPanel","typePanel","majorPanel","tabMount","BaseDialogManager","containerWidth","MEASURE_MODE_ICON_SVGS","MeasurePanel","partial","persist","toolsBox","grid","modes","fallbackCircleIconSvg","toggleBox","toggleIconEl","resultBox","mainValueRow","mainValueLabel","mainValueValue","xyzBox","makeXyzRow","labelKey","valueClassName","valueElSetter","row","footer","unitRow","unitLabel","hint","precisionRow","precisionLabel","actions","opt","raw","parsed","xyz","mm","mm3","unitText","valueMm","converted","valueMm3","MeasureDialogManager","panelWrapper","SectionPlanePanel","iconSvg","onClick","SectionPlaneDialogManager","paddingRight","paddingBottom","SectionAxisPanel","isHidden","row1","row2","_type","SectionAxisDialogManager","DEFAULT_RANGE","SectionBoxPanel","isReversed","buttonsContainer","slidersContainer","ref","iconMap","labelEl","slider","minHandle","maxHandle","handleType","percentage","minH","maxH","rangeEl","SectionBoxDialogManager","WalkControlPanel","newMode","leftButtons","divider1","divider2","exitBtn","gravityWrapper","collisionWrapper","characterWrapper","walkModeWrapper","controlGroup","oldMode","speedWrapper","speedLabel","constructionWorkerOption","officeMaleOption","walkOption","runOption","WalkPathPanel","WalkPathDialogManager","WalkControlManager","engineSpeed","MapPanel","MapDialogManager","paddingLeft","BimCollapseItem","itemEl","extraEl","BimCollapse","itemConfig","ComponentDetailManager","propertiesPanel","materialsPanel","collapseItems","category","BimEngine","doc","isFullscreen","targetElem","exitMethod","requestMethod"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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A;AAAA,QAEvBC,GAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wDAE5BC,GAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAExBC,GAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAE7BC,GAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEnBC,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEjBC,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA4JhB,eA1JkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA2JlB,kBAzJgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA0JhB,kBAxJkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxf,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ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CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,CAAC,EAAG,EAAG,EAAG,CAAC,EACX,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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0GCAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mICAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","x_google_ignoreList":[15,16]} \ No newline at end of file diff --git a/.sisyphus/drafts/TOOLBAR_API_CALLCHAIN.md b/docs/API调用链.md similarity index 58% rename from .sisyphus/drafts/TOOLBAR_API_CALLCHAIN.md rename to docs/API调用链.md index 3bc5006..c3a779a 100644 --- a/.sisyphus/drafts/TOOLBAR_API_CALLCHAIN.md +++ b/docs/API调用链.md @@ -1,6 +1,42 @@ -# Toolbar 按钮调用链文档 +# BIM Engine SDK - API 调用链文档 -本文档详细记录 Toolbar 中每个按钮的完整调用链,从用户点击到底层 3D 引擎 API。 +本文档详细记录 BIM Engine SDK 中各功能模块的完整调用链,从用户交互到底层 3D 引擎 API。 + +--- + +## 目录 + +### 第一章:工具栏 (Toolbar) + +1. [首页 (Home)](#1-首页-home) +2. [框选放大 (Zoom Box)](#2-框选放大-zoom-box) +3. [测量 (Measure)](#3-测量-measure) +4. [剖切菜单 (Section)](#4-剖切菜单-section) + - [拾取面剖切 (Section Plane)](#41-拾取面剖切-section-plane) + - [轴向剖切 (Section Axis)](#42-轴向剖切-section-axis) + - [剖切盒 (Section Box)](#43-剖切盒-section-box) +5. [漫游 (Walk)](#5-漫游-walk) +6. [地图 (Map)](#6-地图-map) +7. [构件详情 (Property)](#7-构件详情-property) +8. [设置 (Setting)](#8-设置-setting) +9. [信息 (Info)](#9-信息-info) +10. [全屏 (Fullscreen)](#10-全屏-fullscreen) + +### 第二章:右键菜单 (Context Menu) + +1. [构件详情 (Component Detail)](#21-构件详情-component-detail) +2. [显示全部 (Show All)](#22-显示全部-show-all) +3. [信息 (Info)](#23-信息-info-1) +4. [首页 (Home)](#24-首页-home-1) + +### 第三章:构件交互 (Component Interaction) + +1. [构件选中 (Component Selection)](#31-构件选中-component-selection) +2. [取消选中 (Deselection)](#32-取消选中-deselection) + +--- + +# 第一章:工具栏 (Toolbar) --- @@ -585,9 +621,9 @@ registry.on('map:closed', () => { │ ▼ Button onClick (buttons/property/index.ts) - │ registry.propertyPanel?.show() + │ registry.componentDetail?.show() ▼ -PropertyPanelManager.show() +ComponentDetailManager.show() │ ▼ 属性面板显示 @@ -729,5 +765,468 @@ registry.sectionAxis // SectionAxisDialogManager - 轴向剖切 registry.sectionBox // SectionBoxDialogManager - 剖切盒 registry.walkControl // WalkControlManager - 漫游控制 registry.map // MapDialogManager - 地图 -registry.propertyPanel // PropertyPanelManager - 属性面板 +registry.componentDetail // ComponentDetailManager - 构件详情弹窗 +registry.componentDetail // ComponentDetailManager - 构件详情弹窗 +``` + +--- + +# 第二章:右键菜单 (Context Menu) + +右键菜单系统提供上下文相关的操作选项,根据当前状态动态生成菜单项。 + +## 2.1 构件详情 (Component Detail) + +**触发条件**: 用户右键点击,且有构件被选中 +**功能**: 打开构件详情弹窗,展示构件属性信息 + +### 调用链 + +``` +用户右键点击 3D 场景(有构件选中) + │ + ▼ +RightKeyManager.handleContextMenu() (managers/right-key-manager.ts) + │ 获取当前选中构件: registry.engine3d.getSelectedComponent() + │ 动态生成菜单项(包含"构件详情") + ▼ +用户点击 [构件详情] 菜单项 + │ + ▼ +MenuItem onClick (managers/engine-manager.ts:63-68) + │ registry.componentDetail?.show(selected.url, selected.id) + ▼ +ComponentDetailManager.show(url, id) (managers/component-detail-manager.ts) + │ 1. createDialog() - 创建右侧对话框(400px 宽) + │ 2. showLoading() - 显示"加载中..." + │ 3. registry.engine3d.getComponentProperties(url, id, callback) + ▼ +EngineManager.getComponentProperties(url, id, callback) + │ this.engineInstance.getComponentProperties(url, id, callback) + ▼ +Engine.getComponentProperties(url, id, callback) + │ this.engine.modelProperties.getModelProperties(url, id, callback) + ▼ +底层引擎 API: engine.modelProperties.getModelProperties(url, id, callback) + │ 异步回调返回属性数据 + ▼ +ComponentDetailManager.renderProperties(data) + │ 使用 BimCollapse + BimDescription 渲染属性 + ▼ +对话框显示构件属性(分类折叠面板 + 键值对列表) +``` + +### 数据流 + +```typescript +// 1. 选中信息 (从 Engine) +{ + url: string, // 模型 URL + id: string // 构件 ID +} + +// 2. 属性数据 (从底层引擎回调) +[ + { + categoryName: "基本属性", + items: [ + { key: "名称", value: "墙-001" }, + { key: "类型", value: "承重墙" } + ] + }, + { + categoryName: "尺寸", + items: [ + { key: "长度", value: "5000mm" }, + { key: "高度", value: "3000mm" } + ] + } +] + +// 3. UI 渲染 (BimCollapse) +- 每个 category → 一个折叠面板 +- items[] → BimDescription 键值对列表 +``` + +### 代码摘要 + +**动态菜单生成** (`managers/engine-manager.ts`): +```typescript +const selected = this.getSelectedComponent(); +if (selected) { + menuItems.push({ + id: 'component-detail', + label: 'menu.componentDetail', + group: 'component', + onClick: () => { + const registry = ManagerRegistry.getInstance(); + registry.componentDetail?.show(selected.url, selected.id); + this.rightKey?.hide(); + } + }); +} +``` + +**ComponentDetailManager** (`managers/component-detail-manager.ts`): +```typescript +public show(modelUrl: string, componentId: string): void { + this.createDialog(); + this.showLoading(); + + const registry = ManagerRegistry.getInstance(); + registry.engine3d?.getComponentProperties( + modelUrl, + componentId, + (data) => { + this.renderProperties(data); + } + ); +} +``` + +--- + +## 2.2 显示全部 (Show All) + +**触发条件**: 用户右键点击(任何情况) +**功能**: 显示所有已加载的模型构件 + +### 调用链 + +``` +用户右键点击 3D 场景 + │ + ▼ +RightKeyManager.handleContextMenu() + │ 动态生成菜单项(始终包含"显示全部") + ▼ +用户点击 [显示全部] 菜单项 + │ + ▼ +MenuItem onClick (managers/engine-manager.ts:71-77) + │ registry.engine3d?.showAllComponents() + ▼ +EngineManager.showAllComponents() + │ ⚠️ 方法尚未实现,当前为空方法 + ▼ +⚠️ 待实现:调用底层引擎 API 显示所有构件 +``` + +> **注意**: "显示全部"功能的底层 API 对接尚未完成,当前仅显示菜单项。 + +--- + +## 2.3 信息 (Info) + +**触发条件**: 用户右键点击(任何情况) +**功能**: 打开信息对话框 + +### 调用链 + +``` +用户右键点击 3D 场景 + │ + ▼ +RightKeyManager.handleContextMenu() + │ 动态生成菜单项(始终包含"信息") + ▼ +用户点击 [信息] 菜单项 + │ + ▼ +MenuItem onClick (managers/engine-manager.ts) + │ registry.emit('ui:open-dialog', { id: 'info' }) + │ this.rightKey?.hide() + ▼ +事件系统广播 'ui:open-dialog' 事件 + │ + ▼ +监听该事件的组件响应并打开信息对话框 +``` + +--- + +## 2.4 首页 (Home) + +**触发条件**: 用户右键点击(任何情况) +**功能**: 相机回到初始位置 + +### 调用链 + +``` +用户右键点击 3D 场景 + │ + ▼ +RightKeyManager.handleContextMenu() + │ 动态生成菜单项(始终包含"首页") + ▼ +用户点击 [首页] 菜单项 + │ + ▼ +MenuItem onClick (managers/engine-manager.ts) + │ registry.engine3d?.CameraGoHome() + │ this.rightKey?.hide() + ▼ +(调用链同 Toolbar 首页按钮) +``` + +--- + +## 右键菜单系统架构 + +### 动态菜单机制 + +```typescript +// 1. 注册处理器 (EngineManager.initialize) +const handler: RightKeyHandler = () => { + const menuItems: MenuItemConfig[] = []; + + // 根据选中状态动态生成菜单 + const selected = this.getSelectedComponent(); + if (selected) { + menuItems.push({ /* 构件详情 */ }); + } + + // 通用菜单项 + menuItems.push({ /* 显示全部 */ }); + menuItems.push({ /* 信息 */ }); + menuItems.push({ /* 首页 */ }); + + return menuItems; +}; + +registry.rightKey?.registerHandler('engine', handler); +``` + +### 菜单项配置结构 + +```typescript +interface MenuItemConfig { + id: string; // 唯一标识 + label: string; // 国际化 key + group?: string; // 分组(可选) + onClick: () => void; // 点击回调 +} +``` + +--- + +# 第三章:构件交互 (Component Interaction) + +构件交互系统处理用户与 3D 场景中构件的交互事件,包括选中和取消选中。 + +## 3.1 构件选中 (Component Selection) + +**触发**: 用户点击 3D 场景中的构件 +**效果**: 记录选中状态,可用于后续操作(如右键菜单、属性面板等) + +### 调用链 + +``` +用户点击 3D 场景中的构件 + │ + ▼ +[底层] interactionModule.handleMouseClick() (bim_engine_base) + │ 检测鼠标点击并进行射线拾取 + │ 获取点击到的物体信息 (hit) + ▼ +[底层] engine.events.trigger('click', hit) + │ hit = { object: { url, name }, point, distance, ... } + ▼ +[SDK] Engine.init() 中的 'click' 事件监听器 (components/engine/index.ts:127-136) + │ if (hit && hit.object) { + │ this.selectedComponent = { + │ url: hit.object.url, + │ id: hit.object.name + │ }; + │ console.log('[Engine] 构件选中:', this.selectedComponent); + │ } + ▼ +选中状态已记录在 Engine.selectedComponent +``` + +### 状态存储 + +```typescript +// Engine 组件 (components/engine/index.ts) +private selectedComponent: { url: string; id: string } | null = null; + +// 点击事件监听器 +this.engine.events.on('click', (hit: any) => { + if (hit && hit.object) { + this.selectedComponent = { + url: hit.object.url, + id: hit.object.name + }; + console.log('[Engine] 构件选中:', this.selectedComponent); + } else { + this.selectedComponent = null; + console.log('[Engine] 取消选中'); + } +}); +``` + +### 获取选中状态 + +```typescript +// Engine 方法 +public getSelectedComponent(): { url: string; id: string } | null { + return this.selectedComponent; +} + +// EngineManager 代理 +public getSelectedComponent(): { url: string; id: string } | null { + if (!this.engineInstance) { + console.warn('[EngineManager] Engine 尚未初始化'); + return null; + } + return this.engineInstance.getSelectedComponent(); +} + +// 使用示例 +const registry = ManagerRegistry.getInstance(); +const selected = registry.engine3d?.getSelectedComponent(); +if (selected) { + console.log(`选中构件: ${selected.url}#${selected.id}`); +} +``` + +--- + +## 3.2 取消选中 (Deselection) + +**触发**: 用户点击 3D 场景的空白区域 +**效果**: 清除选中状态 + +### 调用链 + +``` +用户点击 3D 场景空白区域 + │ + ▼ +[底层] interactionModule.handleMouseClick() + │ 射线拾取未命中任何物体 + ▼ +[底层] engine.events.trigger('click', null) + │ hit = null(表示未点击到任何物体) + ▼ +[SDK] Engine.init() 中的 'click' 事件监听器 + │ if (hit && hit.object) { ... } + │ else { + │ this.selectedComponent = null; + │ console.log('[Engine] 取消选中'); + │ } + ▼ +选中状态已清除 +``` + +--- + +## 构件交互数据流 + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ [底层] 3D 引擎 - 事件系统 │ +│ engine.events.trigger('click', hit) │ +└────────────────────────────┬────────────────────────────────────┘ + │ + ▼ hit: { object: {url, name}, ... } | null +┌─────────────────────────────────────────────────────────────────┐ +│ [SDK] Engine 组件 - 事件监听 + 状态管理 │ +│ - 监听 'click' 事件 │ +│ - 更新 selectedComponent 状态 │ +│ - 提供 getSelectedComponent() 方法 │ +└────────────────────────────┬────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ [SDK] EngineManager - 状态代理 │ +│ - 代理 getSelectedComponent() 方法 │ +│ - 供其他 Manager 调用 │ +└────────────────────────────┬────────────────────────────────────┘ + │ + ▼ +┌─────────────────────────────────────────────────────────────────┐ +│ [SDK] 消费者 - 使用选中状态 │ +│ - RightKeyManager: 动态生成右键菜单 │ +│ - ComponentDetailManager: 显示构件详情 │ +│ - ComponentDetailManager: 显示构件详情弹窗 │ +│ - ... 其他需要选中状态的功能 │ +└─────────────────────────────────────────────────────────────────┘ +``` + +--- + +## 使用场景示例 + +### 场景 1: 右键菜单根据选中状态显示不同菜单项 + +```typescript +// RightKeyManager.handleContextMenu() +const handler: RightKeyHandler = () => { + const menuItems: MenuItemConfig[] = []; + + // 检查是否有选中的构件 + const selected = registry.engine3d?.getSelectedComponent(); + + if (selected) { + // 有选中构件:显示"构件详情"菜单 + menuItems.push({ + id: 'component-detail', + label: 'menu.componentDetail', + onClick: () => { + registry.componentDetail?.show(selected.url, selected.id); + } + }); + } + + // 通用菜单项(无论是否选中都显示) + menuItems.push({ + id: 'show-all', + label: 'menu.showAll', + onClick: () => { /* ... */ } + }); + + return menuItems; +}; +``` + +### 场景 2: 构件详情面板获取当前选中构件 + +```typescript +// ComponentDetailManager +public showCurrentSelection(): void { + const registry = ManagerRegistry.getInstance(); + const selected = registry.engine3d?.getSelectedComponent(); + + if (!selected) { + console.warn('未选中任何构件'); + return; + } + + // 使用选中信息加载构件详情 + this.show(selected.url, selected.id); +} +``` + +--- + +## 附录:完整 ManagerRegistry 访问方式(更新) + +```typescript +// 在任意位置获取 Registry +const registry = ManagerRegistry.getInstance(); + +// 访问各个 Manager +registry.engine3d // EngineManager - 3D 引擎 +registry.toolbar // ToolbarManager - 工具栏 +registry.dialog // DialogManager - 对话框 +registry.rightKey // RightKeyManager - 右键菜单 +registry.measure // MeasureDialogManager - 测量 +registry.sectionPlane // SectionPlaneDialogManager - 拾取面剖切 +registry.sectionAxis // SectionAxisDialogManager - 轴向剖切 +registry.sectionBox // SectionBoxDialogManager - 剖切盒 +registry.walkControl // WalkControlManager - 漫游控制 +registry.map // MapDialogManager - 地图 +registry.componentDetail // ComponentDetailManager - 构件详情弹窗 +registry.componentDetail // ComponentDetailManager - 构件详情弹窗(新增) ``` diff --git a/docs/MODULES/services.md b/docs/MODULES/服务模块.md similarity index 100% rename from docs/MODULES/services.md rename to docs/MODULES/服务模块.md diff --git a/docs/MODULES/core.md b/docs/MODULES/核心模块.md similarity index 99% rename from docs/MODULES/core.md rename to docs/MODULES/核心模块.md index 0207621..e3215d5 100644 --- a/docs/MODULES/core.md +++ b/docs/MODULES/核心模块.md @@ -122,7 +122,7 @@ class ManagerRegistry { buttonGroup: ButtonGroupManager | null; rightKey: RightKeyManager | null; constructTree: ConstructTreeManagerBtn | null; - propertyPanel: PropertyPanelManager | null; + componentDetail: ComponentDetailManager | null; measure: MeasureDialogManager | null; walkControl: WalkControlManager | null; map: MapDialogManager | null; diff --git a/docs/MODULES/_INDEX.md b/docs/MODULES/模块索引.md similarity index 85% rename from docs/MODULES/_INDEX.md rename to docs/MODULES/模块索引.md index 7578e81..6b4f2eb 100644 --- a/docs/MODULES/_INDEX.md +++ b/docs/MODULES/模块索引.md @@ -4,10 +4,10 @@ | 模块 | 路径 | 职责 | 文档 | |------|------|------|------| -| **core** | `src/core/` | 核心基础设施:事件系统、管理器基类、注册表 | [core.md](core.md) | -| **managers** | `src/managers/` | 15 个管理器,处理业务逻辑和组件协调 | [managers.md](managers.md) | -| **components** | `src/components/` | 20+ 个 UI 组件 | [components.md](components.md) | -| **services** | `src/services/` | 全局服务:国际化、主题管理 | [services.md](services.md) | +| **core** | `src/core/` | 核心基础设施:事件系统、管理器基类、注册表 | [核心模块.md](核心模块.md) | +| **managers** | `src/managers/` | 15 个管理器,处理业务逻辑和组件协调 | [管理器模块.md](管理器模块.md) | +| **components** | `src/components/` | 20+ 个 UI 组件 | [组件模块.md](组件模块.md) | +| **services** | `src/services/` | 全局服务:国际化、主题管理 | [服务模块.md](服务模块.md) | ## Core 模块 @@ -20,7 +20,7 @@ | BaseManager | `base-manager.ts` | Manager 抽象基类 | | BaseDialogManager | `base-dialog-manager.ts` | 对话框 Manager 基类 | -[查看详情 →](core.md) +[查看详情 →](核心模块.md) ## Managers 模块 @@ -40,7 +40,7 @@ | 管理器 | 职责 | |--------|------| -| PropertyPanelManager | 属性面板管理 | +| ComponentDetailManager | 构件详情弹窗管理 | | ConstructTreeManagerBtn | 构件树管理 | | MeasureDialogManager | 测量对话框管理 | | SectionPlaneDialogManager | 平面剖切管理 | @@ -51,7 +51,7 @@ | WalkPlanViewDialogManager | 漫游平面图管理 | | MapDialogManager | 地图管理 | -[查看详情 →](managers.md) +[查看详情 →](管理器模块.md) ## Components 模块 @@ -88,7 +88,7 @@ | BimTab | 标签页 | | BimDescription | 描述列表 | -[查看详情 →](components.md) +[查看详情 →](组件模块.md) ## Services 模块 @@ -99,7 +99,7 @@ | LocaleManager | 国际化服务,多语言支持 | | ThemeManager | 主题管理服务,明暗切换 | -[查看详情 →](services.md) +[查看详情 →](服务模块.md) ## 类型定义 diff --git a/docs/MODULES/managers.md b/docs/MODULES/管理器模块.md similarity index 96% rename from docs/MODULES/managers.md rename to docs/MODULES/管理器模块.md index 282fad6..19db008 100644 --- a/docs/MODULES/managers.md +++ b/docs/MODULES/管理器模块.md @@ -18,7 +18,7 @@ src/managers/ ├── dialog-manager.ts # 对话框管理器 ├── button-group-manager.ts # 按钮组管理器 ├── right-key-manager.ts # 右键菜单管理器 -├── property-panel-manager.ts # 属性面板管理器 +├── component-detail-manager.ts # 构件详情弹窗管理器 ├── construct-tree-manager-btn.ts # 构件树管理器 ├── walk-control-manager.ts # 漫游控制管理器 ├── measure-dialog-manager.ts # 测量对话框管理器 @@ -41,7 +41,7 @@ BaseManager ├── DialogManager ├── ButtonGroupManager ├── RightKeyManager -├── PropertyPanelManager +├── ComponentDetailManager ├── ConstructTreeManagerBtn └── WalkControlManager @@ -61,7 +61,7 @@ BaseDialogManager (继承自 BaseManager) |------|--------|------| | **核心** | EngineManager | 3D 引擎管理 | | **UI 容器** | ToolbarManager, DialogManager, ButtonGroupManager | 容器组件管理 | -| **交互** | RightKeyManager, PropertyPanelManager, ConstructTreeManagerBtn | 用户交互 | +| **交互** | RightKeyManager, ComponentDetailManager, ConstructTreeManagerBtn | 用户交互 | | **3D 工具** | MeasureDialogManager, SectionPlaneDialogManager, SectionAxisDialogManager, SectionBoxDialogManager | 3D 操作工具 | | **漫游** | WalkControlManager, WalkPathDialogManager, WalkPlanViewDialogManager, MapDialogManager | 漫游功能 | @@ -350,20 +350,20 @@ class WalkControlManager extends BaseManager { --- -## PropertyPanelManager +## ComponentDetailManager ### 概述 -管理构件属性面板的显示。 +管理构件详情弹窗(属性展示)的显示。 ### API ```typescript -class PropertyPanelManager extends BaseManager { +class ComponentDetailManager extends BaseManager { init(): void; show(): void; - hide(): void; isOpen(): boolean; + hide(): void; destroy(): void; } ``` diff --git a/docs/MODULES/components.md b/docs/MODULES/组件模块.md similarity index 100% rename from docs/MODULES/components.md rename to docs/MODULES/组件模块.md diff --git a/docs/ENGINE_API_INTEGRATION.md b/docs/引擎API对接.md similarity index 100% rename from docs/ENGINE_API_INTEGRATION.md rename to docs/引擎API对接.md diff --git a/docs/GETTING_STARTED.md b/docs/快速开始.md similarity index 98% rename from docs/GETTING_STARTED.md rename to docs/快速开始.md index 1ad07bd..3d6cdab 100644 --- a/docs/GETTING_STARTED.md +++ b/docs/快速开始.md @@ -378,8 +378,8 @@ import type { ## 下一步 -- 查看 [架构文档](ARCHITECTURE.md) 了解设计原理 -- 查看 [模块文档](MODULES/_INDEX.md) 了解详细 API +- 查看 [架构文档](架构设计.md) 了解设计原理 +- 查看 [模块文档](MODULES/模块索引.md) 了解详细 API - 查看 [demo](../demo/) 获取更多示例 --- diff --git a/docs/INDEX.md b/docs/文档索引.md similarity index 82% rename from docs/INDEX.md rename to docs/文档索引.md index 797f461..a4682ce 100644 --- a/docs/INDEX.md +++ b/docs/文档索引.md @@ -18,9 +18,12 @@ | 文档 | 说明 | 适合人群 | |------|------|---------| -| [ARCHITECTURE.md](ARCHITECTURE.md) | 架构设计、设计模式、模块依赖 | 架构师、核心开发 | -| [GETTING_STARTED.md](GETTING_STARTED.md) | 快速开始、安装、基础用法 | 新用户、集成开发 | -| [MODULES/_INDEX.md](MODULES/_INDEX.md) | 所有模块的详细文档索引 | 所有开发者 | +| [架构设计.md](架构设计.md) | 架构设计、设计模式、模块依赖 | 架构师、核心开发 | +| [快速开始.md](快速开始.md) | 快速开始、安装、基础用法 | 新用户、集成开发 | +| [MODULES/模块索引.md](MODULES/模块索引.md) | 所有模块的详细文档索引 | 所有开发者 | +| [贡献指南.md](贡献指南.md) | 开发协作、脚本说明、最小验证集 | 项目贡献者 | +| [运维手册.md](运维手册.md) | 构建/发布/回滚流程与常见问题 | 维护者 | +| [API调用链.md](API调用链.md) | API 调用链(用户交互 → Manager → Engine → 底层引擎) | SDK 维护者 | ## 模块概览 @@ -42,11 +45,11 @@ src/ | 模块 | 路径 | 职责 | 文档 | |------|------|------|------| -| **BimEngine** | `src/bim-engine.ts` | 主入口类,整合所有功能 | [详情](MODULES/bim-engine.md) | -| **core** | `src/core/` | 事件系统、管理器基类、注册表 | [详情](MODULES/core.md) | -| **managers** | `src/managers/` | 15 个管理器,处理业务逻辑 | [详情](MODULES/managers.md) | -| **components** | `src/components/` | 20+ 个 UI 组件 | [详情](MODULES/components.md) | -| **services** | `src/services/` | 主题管理、国际化服务 | [详情](MODULES/services.md) | +| **BimEngine** | `src/bim-engine.ts` | 主入口类,整合所有功能 | 暂无独立文档 | +| **core** | `src/core/` | 事件系统、管理器基类、注册表 | [详情](MODULES/核心模块.md) | +| **managers** | `src/managers/` | 15 个管理器,处理业务逻辑 | [详情](MODULES/管理器模块.md) | +| **components** | `src/components/` | 20+ 个 UI 组件 | [详情](MODULES/组件模块.md) | +| **services** | `src/services/` | 主题管理、国际化服务 | [详情](MODULES/服务模块.md) | ## 架构分层 diff --git a/docs/ARCHITECTURE.md b/docs/架构设计.md similarity index 99% rename from docs/ARCHITECTURE.md rename to docs/架构设计.md index 0eb6d60..dd5a77c 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/架构设计.md @@ -126,7 +126,7 @@ registry.emit('engine:model-loaded', { url: 'model.gltf' }); |------|--------|------| | 核心 | EngineManager | 3D 引擎管理 | | UI 容器 | ToolbarManager, DialogManager, ButtonGroupManager | 容器组件管理 | -| 交互 | RightKeyManager, PropertyPanelManager, ConstructTreeManagerBtn | 用户交互 | +| 交互 | RightKeyManager, ComponentDetailManager, ConstructTreeManagerBtn | 用户交互 | | 工具 | MeasureDialogManager, SectionPlaneDialogManager, SectionAxisDialogManager, SectionBoxDialogManager | 3D 操作工具 | | 漫游 | WalkControlManager, WalkPathDialogManager, WalkPlanViewDialogManager, MapDialogManager | 漫游功能 | diff --git a/docs/贡献指南.md b/docs/贡献指南.md new file mode 100644 index 0000000..9e79f1e --- /dev/null +++ b/docs/贡献指南.md @@ -0,0 +1,50 @@ +# 贡献指南(CONTRIB) + +本文档面向 SDK 开发/维护者,内容以 `package.json` 的 scripts 为单一事实来源。 + +## 开发环境 + +- Node.js: 建议使用当前 LTS +- 包管理器: npm(项目脚本默认使用 `npm run ...`) + +备注:本仓库当前没有提供 `.env.example`,因此默认不需要额外环境变量。 + +## 常用命令(Scripts) + +| Script | 命令 | 说明 | +|---|---|---| +| `dev` | `vite` | 启动开发环境(通常用于 playground) | +| `build` | `tsc && vite build` | 构建 SDK(产物输出到 `dist/`) | +| `copy:demo` | `mkdir -p demo/lib && cp dist/iflow-engine.es.js dist/iflow-engine.umd.js dist/iflow-engine.umd.js.map demo/lib/` | 复制构建产物到 HTML demo 目录 | +| `copy:demo-draco` | `mkdir -p demo/static/js/draco && cp node_modules/iflow-engine-base/dist/draco/*.js node_modules/iflow-engine-base/dist/draco/*.wasm demo/static/js/draco/` | 复制 draco 解码器到 HTML demo 目录 | +| `copy:demo-all` | `npm run copy:demo && npm run copy:demo-draco` | 一次性准备 HTML demo 需要的全部静态资源 | +| `copy:demo-vue` | `mkdir -p demo-vue/public/lib && cp dist/iflow-engine.es.js dist/iflow-engine.umd.js dist/iflow-engine.umd.js.map demo-vue/public/lib/` | 复制构建产物到 Vue demo 目录 | +| `dev:demo` | `npm run build && npm run copy:demo-all && cd demo && npm run dev` | 构建并启动 HTML demo | +| `dev:demo-vue` | `npm run build && npm run copy:demo-vue && cd demo-vue && npm run dev` | 构建并启动 Vue demo | +| `dev:all` | `npm run dev:demo & npm run dev:demo-vue` | 同时启动两个 demo(并行) | +| `prepublishOnly` | `npm run build` | npm 发布前自动构建 | + +## 开发流程(建议) + +1. 本地开发:`npm run dev` +2. 修改代码后做一次构建验证:`npm run build` +3. 需要人工验证交互时: + - HTML demo:`npm run dev:demo` + - Vue demo:`npm run dev:demo-vue` + +## 测试与验证 + +当前仓库未配置独立的单元测试脚本。 + +推荐的最小验证集: +- `npm run build`(保证 TypeScript 编译与 Vite 打包通过) +- 在 `demo/` 或 `demo-vue/` 中进行手动回归(与本次修改相关的功能点) + +## 文档维护 + +- 代码变更后,务必同步更新 `AI_COLLABORATION.md` 的相关部分。 +- 如果新增/修改了组件或管理器,建议同步更新 `docs/` 下对应模块文档。 + +## 过期文档检查(90 天) + +按最近一次扫描结果:`docs/` 下没有发现 90 天未更新的文档。 diff --git a/docs/运维手册.md b/docs/运维手册.md new file mode 100644 index 0000000..70583cc --- /dev/null +++ b/docs/运维手册.md @@ -0,0 +1,60 @@ +# 运维手册(RUNBOOK) + +本文档面向维护者,描述 SDK 的构建、发布与回滚流程。 + +## 发布(Deployment) + +本项目是 SDK(library)形态,发布通常指 `npm publish`(或内部制品库发布)。 + +发布前检查: +1. 本地构建通过:`npm run build` +2. `dist/` 目录产物完整: + - `dist/iflow-engine.es.js` + - `dist/iflow-engine.umd.js` + - `dist/index.d.ts` +3. demo 自测(建议): + - `npm run dev:demo` 或 `npm run dev:demo-vue` + +说明:`prepublishOnly` 已配置为 `npm run build`,因此 `npm publish` 前会自动触发构建。 + +## 监控与告警(Monitoring & Alerts) + +SDK 仓库本身不包含线上服务,因此没有传统意义的运行时监控。 + +建议的“质量监控”方式: +- 发布后在一个最小集成项目中验证: + - ESM/UMD 能否被正确加载 + - 类型定义是否可用(TypeScript 项目可正常编译) +- 对关键交互(目录树、右键菜单、构件详情、剖切/测量/漫游)做冒烟回归 + +## 常见问题与处理(Common Issues) + +### 1) build 失败 + +现象:`npm run build` 报 TypeScript 或 Vite 打包错误。 + +处理: +- 优先修复类型错误/导入路径错误 +- 确认 `dist/` 未被误引用为源码依赖 + +### 2) demo 无法正常显示 3D 或缺少 draco + +现象:HTML demo 中模型无法加载,控制台提示 draco 相关资源缺失。 + +处理: +- 运行 `npm run copy:demo-draco` +- 或直接运行 `npm run dev:demo`(会自动执行 build + copy) + +### 3) 右键菜单/弹窗交互异常(事件被 3D 场景吞掉) + +处理: +- 检查 UI 容器是否对 mouse 事件做了 stopPropagation +- 检查 RightKey/Menu 子菜单容器是否阻止 mousedown 冒泡 + +## 回滚(Rollback) + +SDK 发布回滚常见方式: +1. 版本回退:在上游业务工程将依赖版本 pin 回稳定版本 +2. 重发版本:发布一个修复版本(推荐) + +注意:npm registry 通常不建议覆盖已发布版本(避免破坏依赖缓存)。 diff --git a/src/components/collapse/index.css b/src/components/collapse/index.css index 7627b77..369f7d4 100644 --- a/src/components/collapse/index.css +++ b/src/components/collapse/index.css @@ -19,7 +19,7 @@ background-color: var(--bim-component-bg); padding-left: 12px; padding-right: 0; - border-bottom: 1px solid var(--bim-border-strong); + border-bottom: 1px solid var(--bim-border-default); } .bim-collapse.is-ghost .bim-collapse-header:hover { diff --git a/src/components/engine/index.ts b/src/components/engine/index.ts index 2931516..5254454 100644 --- a/src/components/engine/index.ts +++ b/src/components/engine/index.ts @@ -4,6 +4,7 @@ import { themeManager } from '../../services/theme'; import type { EngineOptions, ModelLoadOptions } from './types'; import type { MeasureMode } from '../../types/measure'; import type { SectionBoxRange } from '../section-box-panel/types'; +import { ManagerRegistry } from '../../core/manager-registry'; // 导入第三方 SDK 的 createEngine 函数(从 npm 包引入) // import { createEngine as createEngineSDK } from 'iflow-engine-base'; import { createEngine as createEngineSDK } from '../../../../bim_engine_base/dist/bim-engine-sdk.es'; @@ -128,15 +129,18 @@ export class Engine implements IBimComponent { // 监听构件点击事件 this.engine.events.on('click', (hit: any) => { + const registry = ManagerRegistry.getInstance(); if (hit && hit.object) { this.selectedComponent = { url: hit.object.url, id: hit.object.name }; console.log('[Engine] 构件选中:', this.selectedComponent); + registry.emit('component:selected', this.selectedComponent); } else { this.selectedComponent = null; console.log('[Engine] 取消选中'); + registry.emit('component:deselected', {}); } }); } catch (error) { @@ -735,6 +739,31 @@ export class Engine implements IBimComponent { // ==================== 结束:构件选中 ==================== + // ==================== 模型树 ==================== + + public getTypeTreeData(): any[] { + if (!this._isInitialized || !this.engine?.modelTree) { + return []; + } + return this.engine.modelTree.getTypeTreeData(); + } + + public getLevelTreeData(): any[] { + if (!this._isInitialized || !this.engine?.modelTree) { + return []; + } + return this.engine.modelTree.getLevelTreeData(); + } + + public getMajorTreeData(): any[] { + if (!this._isInitialized || !this.engine?.modelTree) { + return []; + } + return this.engine.modelTree.getMajorTreeData(); + } + + // ==================== 结束:模型树 ==================== + /** 激活框选放大功能 */ public activateZoomBox(): void { if (!this._isInitialized || !this.engine) { diff --git a/src/components/menu/index.css b/src/components/menu/index.css index a256ca2..d5763ee 100644 --- a/src/components/menu/index.css +++ b/src/components/menu/index.css @@ -7,7 +7,6 @@ padding: 6px; margin: 0; list-style: none; - min-width: 160px; box-shadow: var(--bim-shadow-lg); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; user-select: none; @@ -38,8 +37,7 @@ } .bim-menu-item:hover { - background-color: var(--bim-floating-btn-bg); - transform: translateX(2px); + background-color: var(--bim-component-bg-hover); } .bim-menu-item.disabled { @@ -49,6 +47,10 @@ } .bim-menu-item-icon { + display: none; +} + +.bim-menu.has-icons .bim-menu-item-icon { width: 16px; height: 16px; margin-right: 8px; diff --git a/src/components/menu/index.ts b/src/components/menu/index.ts index dd79117..18cbe68 100644 --- a/src/components/menu/index.ts +++ b/src/components/menu/index.ts @@ -93,14 +93,23 @@ export class BimMenu implements IBimComponent { return this.element; } - /** - * 核心渲染逻辑 - * 处理分组、排序和 DOM 生成 - */ + private hasAnyIcon(items: MenuItemConfig[]): boolean { + return items.some(item => { + if (item.icon) return true; + if (item.children) return this.hasAnyIcon(item.children); + return false; + }); + } + private render(): void { const { items, groupOrder } = this.options; - // 1. 数据分桶:按 group 字段将菜单项分组 + if (this.hasAnyIcon(items)) { + this.element.classList.add('has-icons'); + } else { + this.element.classList.remove('has-icons'); + } + const groups = new Map(); const defaultGroup = 'default'; @@ -112,25 +121,19 @@ export class BimMenu implements IBimComponent { groups.get(groupName)!.push(item); }); - // 2. 确定分组顺序 let sortedGroupKeys: string[] = []; if (groupOrder) { - // 优先按照 groupOrder 指定的顺序排序 sortedGroupKeys = groupOrder.filter(g => groups.has(g)); - // 将未在 groupOrder 中定义的组追加到最后 for (const key of groups.keys()) { if (!sortedGroupKeys.includes(key)) { sortedGroupKeys.push(key); } } } else { - // 如果未指定顺序,则按默认遍历顺序 sortedGroupKeys = Array.from(groups.keys()); } - // 3. 渲染分组和组内项 sortedGroupKeys.forEach((groupName, index) => { - // 除了第一组外,每组之前插入分割线 if (index > 0) { const divider = document.createElement('li'); divider.className = 'bim-menu-divider'; @@ -138,13 +141,16 @@ export class BimMenu implements IBimComponent { } const groupItems = groups.get(groupName)!; - // 组内排序:根据 item.order 升序排列 groupItems.sort((a, b) => (a.order || 0) - (b.order || 0)); groupItems.forEach(item => { - // 仅渲染可见的项 if (item.visible !== false) { this.element.appendChild(this.createItemElement(item)); + if (item.divider) { + const divider = document.createElement('li'); + divider.className = 'bim-menu-divider'; + this.element.appendChild(divider); + } } }); }); diff --git a/src/components/menu/item.ts b/src/components/menu/item.ts index 537dae4..e97bad3 100644 --- a/src/components/menu/item.ts +++ b/src/components/menu/item.ts @@ -1,6 +1,3 @@ -/** - * 菜单项配置接口 (用于简化的对象配置) - */ export interface MenuItemConfig { id: string; label: string; @@ -11,4 +8,5 @@ export interface MenuItemConfig { children?: MenuItemConfig[]; disabled?: boolean; visible?: boolean; + divider?: boolean; } \ No newline at end of file diff --git a/src/locales/en-US.ts b/src/locales/en-US.ts index 6eeda41..7056577 100644 --- a/src/locales/en-US.ts +++ b/src/locales/en-US.ts @@ -35,6 +35,12 @@ export const enUS: TranslationDictionary = { info: 'Info', home: 'Home', componentDetail: 'Component Detail', + hideSelected: 'Hide Selected', + transparentSelected: 'Transparent Selected', + isolateSelected: 'Isolate Selected', + hideOthers: 'Hide Others', + transparentOthers: 'Transparent Others', + fitSectionBox: 'Fit Section Box', showAll: 'Show All' }, tree: { @@ -47,6 +53,8 @@ export const enUS: TranslationDictionary = { component: 'Component', system: 'System', space: 'Space', + type: 'Type', + major: 'Major', }, panel: { property: { @@ -60,7 +68,8 @@ export const enUS: TranslationDictionary = { } }, componentDetail: { - title: 'Component Detail' + title: 'Component Detail', + noSelection: 'Please select a component first' } }, measure: { diff --git a/src/locales/types.ts b/src/locales/types.ts index f8f9405..ef41623 100644 --- a/src/locales/types.ts +++ b/src/locales/types.ts @@ -43,6 +43,7 @@ export interface TranslationDictionary { }; componentDetail: { title: string; + noSelection: string; }; }; dialog: { @@ -53,6 +54,12 @@ export interface TranslationDictionary { info: string; home: string; componentDetail: string; + hideSelected: string; + transparentSelected: string; + isolateSelected: string; + hideOthers: string; + transparentOthers: string; + fitSectionBox: string; showAll: string; }; tree: { @@ -65,6 +72,8 @@ export interface TranslationDictionary { component: string; system: string; space: string; + type: string; + major: string; }; measure: { btnName: string; diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index a80a525..fdbbd23 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -35,6 +35,12 @@ export const zhCN: TranslationDictionary = { info: '信息', home: '首页', componentDetail: '构件详情', + hideSelected: '隐藏选中构件', + transparentSelected: '半透明选中构件', + isolateSelected: '隔离选中构件', + hideOthers: '其他构件隐藏', + transparentOthers: '其他构件半透明', + fitSectionBox: '剖切盒适应', showAll: '显示全部' }, tree: { @@ -47,6 +53,8 @@ export const zhCN: TranslationDictionary = { component: '构件', system: '系统', space: '空间', + type: '类型', + major: '专业', }, panel: { property: { @@ -60,7 +68,8 @@ export const zhCN: TranslationDictionary = { } }, componentDetail: { - title: '构件详情' + title: '构件详情', + noSelection: '请先选中构件' } }, measure: { diff --git a/src/managers/component-detail-manager.ts b/src/managers/component-detail-manager.ts index 87e6f10..3e981d2 100644 --- a/src/managers/component-detail-manager.ts +++ b/src/managers/component-detail-manager.ts @@ -1,35 +1,56 @@ import { BaseManager } from '../core/base-manager'; import { BimCollapse } from '../components/collapse/index'; -import { BimDescription } from '../components/description/index'; +import { BimTab } from '../components/tab'; +import { t } from '../services/locale'; export class ComponentDetailManager extends BaseManager { private dialogId = 'component-detail-dialog'; private dialog: any = null; + private currentSelection: { url: string; id: string } | null = null; + private unsubscribeSelected: (() => void) | null = null; + private unsubscribeDeselected: (() => void) | null = null; + private tabInstance: BimTab | null = null; + private propertiesData: any = null; constructor() { super(); } - public show(modelUrl: string, componentId: string): void { + public init(): void { + this.unsubscribeSelected = this.registry.on('component:selected', (payload) => { + this.currentSelection = payload; + if (this.isOpen()) { + this.loadAndRenderContent(); + } + }); + + this.unsubscribeDeselected = this.registry.on('component:deselected', () => { + this.currentSelection = null; + if (this.isOpen()) { + this.renderNoSelection(); + } + }); + } + + public show(): void { if (!this.registry.dialog) { console.warn('[ComponentDetailManager] Dialog manager not initialized'); return; } - if (this.isOpen()) { - this.hide(); + if (!this.isOpen()) { + this.createDialog(); } - this.createDialog(); - this.showLoading(); - - this.registry.engine3d?.getComponentProperties(modelUrl, componentId, (data) => { - this.renderProperties(data, componentId); - }); + if (this.currentSelection) { + this.loadAndRenderContent(); + } else { + this.renderNoSelection(); + } } private createDialog(): void { - const width = 400; + const width = 300; const x = document.body.clientWidth - width - 40; this.dialog = this.registry.dialog?.create({ @@ -44,27 +65,81 @@ export class ComponentDetailManager extends BaseManager { } as any); } + private loadAndRenderContent(): void { + if (!this.dialog || !this.currentSelection) return; + + this.showLoading(); + + this.registry.engine3d?.getComponentProperties( + this.currentSelection.url, + this.currentSelection.id, + (data) => { + this.propertiesData = data; + this.renderTabbedContent(); + } + ); + } + private showLoading(): void { const container = document.createElement('div'); - container.style.padding = '20px'; - container.style.textAlign = 'center'; + container.style.cssText = 'height:100%;display:flex;align-items:center;justify-content:center;'; container.textContent = '加载中...'; this.dialog?.setContent(container); } - private renderProperties(data: any, _componentId: string): void { + private renderNoSelection(): void { if (!this.dialog) return; const container = document.createElement('div'); - container.style.height = '100%'; - container.style.overflowY = 'auto'; + container.style.cssText = 'height:100%;display:flex;align-items:center;justify-content:center;color:var(--bim-text-secondary,#999);'; + container.textContent = t('panel.componentDetail.noSelection') || '请先选中构件'; + this.dialog.setContent(container); + } - const properties = data?.properties || []; + private renderTabbedContent(): void { + if (!this.dialog) return; + + if (this.tabInstance) { + this.tabInstance.destroy(); + this.tabInstance = null; + } + + const container = document.createElement('div'); + container.style.cssText = 'height:100%;display:flex;flex-direction:column;'; + + const propertiesPanel = this.createPropertiesPanel(); + const materialsPanel = this.createMaterialsPanel(); + + this.tabInstance = new BimTab({ + container, + activeId: 'properties', + tabs: [ + { + id: 'properties', + title: 'panel.property.tab.props', + content: propertiesPanel + }, + { + id: 'materials', + title: 'panel.property.tab.material', + content: materialsPanel + } + ] + }); + this.tabInstance.init(); + + this.dialog.setContent(container); + } + + private createPropertiesPanel(): HTMLElement { + const container = document.createElement('div'); + container.style.cssText = 'height:100%;overflow-y:auto;'; + + const properties = this.propertiesData?.properties || []; if (properties.length === 0) { - container.innerHTML = '
    无属性数据
    '; - this.dialog.setContent(container); - return; + container.innerHTML = '
    无属性数据
    '; + return container; } const collapseItems = properties.map((category: any, index: number) => ({ @@ -76,26 +151,102 @@ export class ComponentDetailManager extends BaseManager { new BimCollapse({ container, accordion: false, + ghost: true, activeIds: collapseItems.length > 0 ? [collapseItems[0].id] : [], items: collapseItems }); - this.dialog.setContent(container); + const style = document.createElement('style'); + style.textContent = ` + #${this.dialogId} .bim-collapse-header { + background-color: var(--bim-component-bg-hover) !important; + } + #${this.dialogId} .bim-collapse-header:hover { + background-color: var(--bim-component-bg-active) !important; + } + `; + container.appendChild(style); + + return container; + } + + private createMaterialsPanel(): HTMLElement { + const container = document.createElement('div'); + container.style.cssText = 'height:100%;overflow-y:auto;'; + + const materials = this.propertiesData?.materials || []; + + if (materials.length === 0) { + container.innerHTML = '
    无材质数据
    '; + return container; + } + + const collapseItems = materials.map((material: any, index: number) => ({ + id: `material-${index}`, + title: material.name || `材质 ${index + 1}`, + content: this.createCategoryContent(material.children || material.properties || []) + })); + + new BimCollapse({ + container, + accordion: false, + ghost: true, + activeIds: collapseItems.length > 0 ? [collapseItems[0].id] : [], + items: collapseItems + }); + + const style = document.createElement('style'); + style.textContent = ` + #${this.dialogId} .bim-collapse-header { + background-color: var(--bim-component-bg-hover) !important; + } + #${this.dialogId} .bim-collapse-header:hover { + background-color: var(--bim-component-bg-active) !important; + } + `; + container.appendChild(style); + + return container; } private createCategoryContent(items: any[]): HTMLElement { const container = document.createElement('div'); - const descItems = items.map((item: any) => ({ - label: item.name || '-', - value: String(item.value ?? '-') - })); + items.forEach((item: any, index: number) => { + const row = document.createElement('div'); + row.style.cssText = ` + display: flex; + border-bottom: 1px solid var(--bim-border-default, rgba(255,255,255,0.15)); + `; - new BimDescription({ - container, - labelWidth: '120px', - bordered: true, - items: descItems + if (index === items.length - 1) { + row.style.borderBottom = 'none'; + } + + const label = document.createElement('div'); + label.style.cssText = ` + width: 120px; + flex-shrink: 0; + color: var(--bim-text-secondary, #999); + font-size: 13px; + padding: 8px 12px; + border-right: 1px solid var(--bim-border-default, rgba(255,255,255,0.15)); + `; + label.textContent = item.name || '-'; + + const value = document.createElement('div'); + value.style.cssText = ` + flex: 1; + color: var(--bim-text-primary, #fff); + font-size: 13px; + padding: 8px 12px; + word-break: break-all; + `; + value.textContent = String(item.value ?? '-'); + + row.appendChild(label); + row.appendChild(value); + container.appendChild(row); }); return container; @@ -106,6 +257,10 @@ export class ComponentDetailManager extends BaseManager { } public hide(): void { + if (this.tabInstance) { + this.tabInstance.destroy(); + this.tabInstance = null; + } if (this.dialog) { this.dialog.destroy(); this.dialog = null; @@ -113,6 +268,14 @@ export class ComponentDetailManager extends BaseManager { } public destroy(): void { + if (this.unsubscribeSelected) { + this.unsubscribeSelected(); + this.unsubscribeSelected = null; + } + if (this.unsubscribeDeselected) { + this.unsubscribeDeselected(); + this.unsubscribeDeselected = null; + } this.hide(); super.destroy(); } diff --git a/src/managers/construct-tree-manager-btn.ts b/src/managers/construct-tree-manager-btn.ts index 566470e..a798ca0 100644 --- a/src/managers/construct-tree-manager-btn.ts +++ b/src/managers/construct-tree-manager-btn.ts @@ -1,7 +1,3 @@ -/** - * 构件树管理器 - * 负责管理构件树按钮和构件树对话框 - */ import type { ButtonGroupColors, ButtonConfig } from '../components/button-group/index.type'; import { BaseManager } from '../core/base-manager'; import { BimButtonGroup } from '../components/button-group'; @@ -11,76 +7,37 @@ import { BimDialog } from '../components/dialog'; import { BimTab } from '../components/tab'; import { getIcon } from '../utils/icon-manager'; -/** 模拟的构件树数据 */ -const MOCK_STRUCT_DATA: TreeNodeConfig[] = [ - { - id: 'root', - label: '全部构件', - expanded: true, - clickAction: 'expand', - children: [ - { - id: 'level-1', - label: '一层', - expanded: false, - icon: '', - clickAction: 'expand', - children: [ - { id: 'l1-wall', label: '墙体(128)' }, - { id: 'l1-column', label: '柱(46)' }, - { id: 'l1-beam', label: '梁(82)' }, - { id: 'l1-slab', label: '楼板(12)' }, - { id: 'l1-door', label: '门(24)' }, - { id: 'l1-window', label: '窗(36)' } - ] - }, - { - id: 'level-2', - label: '二层', - expanded: false, - clickAction: 'expand', - children: [ - { id: 'l2-wall', label: '墙体(141)' }, - { id: 'l2-column', label: '柱(52)' }, - { id: 'l2-beam', label: '梁(90)' }, - { id: 'l2-slab', label: '楼板(12)' }, - { id: 'l2-door', label: '门(18)' }, - { id: 'l2-window', label: '窗(40)' } - ] - }, - { - id: 'level-3', - label: '三层', - expanded: false, - clickAction: 'expand', - children: [ - { id: 'l3-wall', label: '墙体(136)' }, - { id: 'l3-column', label: '柱(48)' }, - { id: 'l3-beam', label: '梁(88)' }, - { id: 'l3-slab', label: '楼板(12)' }, - { id: 'l3-door', label: '门(16)' }, - { id: 'l3-window', label: '窗(38)' } - ] - }, - { - id: 'level-roof', - label: '屋面层', - expanded: false, - clickAction: 'expand', - children: [ - { id: 'rf-slab', label: '屋面板(6)' }, - { id: 'rf-beam', label: '屋面梁(24)' }, - { id: 'rf-parapet', label: '女儿墙(18)' } - ] - } - ] - } -]; +function transformTreeData(apiData: any[]): TreeNodeConfig[] { + if (!apiData || apiData.length === 0) return []; + + return apiData.map((model, modelIndex) => { + const transformNode = (node: any, index: number): TreeNodeConfig => { + const hasChildren = node.children && node.children.length > 0; + return { + id: node.id || `node-${modelIndex}-${index}`, + label: node.name || node.label || '未命名', + expanded: false, + clickAction: hasChildren ? 'expand' : 'select', + children: hasChildren + ? node.children.map((child: any, childIndex: number) => transformNode(child, childIndex)) + : undefined, + data: node + }; + }; + + const hasChildren = model.children && model.children.length > 0; + return { + id: `model-${modelIndex}`, + label: model.name || '模型', + expanded: true, + clickAction: 'expand', + children: hasChildren + ? model.children.map((child: any, childIndex: number) => transformNode(child, childIndex)) + : undefined + }; + }); +} -/** - * 构件树管理器 - * 管理左上角的构件树按钮和对话框 - */ export class ConstructTreeManagerBtn extends BaseManager { /** 按钮组实例 */ private toolbar: BimButtonGroup | null = null; @@ -125,41 +82,54 @@ export class ConstructTreeManagerBtn extends BaseManager { this.toolbar.render(); } - /** 打开构件树对话框 */ public openConstructTreeDialog() { this.setVisible(false); - const tree = new BimTree({ - data: MOCK_STRUCT_DATA, - checkable: true, - indent: 0, - enableSearch: true, - checkStrictly: true, - defaultExpandAll: true, - renderActions: (_node) => { - return ''; - }, - onNodeCheck: (node) => { - console.log('onNodeCheck', node); - }, - onNodeSelect: (node) => { - console.log('onNodeSelect', node); - }, - onNodeExpand: (node) => { - console.log('onNodeExpand', node); - this.dialog?.fitWidth(); - }, - }); - tree.init(); + const levelTreeData = this.registry.engine3d?.getLevelTreeData() ?? []; + const typeTreeData = this.registry.engine3d?.getTypeTreeData() ?? []; + const majorTreeData = this.registry.engine3d?.getMajorTreeData() ?? []; - const systemPlaceholder = document.createElement('div'); - systemPlaceholder.className = 'construct-tab__panel-content'; - const spacePlaceholder = document.createElement('div'); - spacePlaceholder.className = 'construct-tab__panel-content'; + console.log('[ConstructTree] 构件树数据 (Level):', levelTreeData); + console.log('[ConstructTree] 类型树数据 (Type):', typeTreeData); + console.log('[ConstructTree] 专业树数据 (Major):', majorTreeData); + + const createTree = (data: any[]) => { + const tree = new BimTree({ + data: transformTreeData(data), + checkable: true, + indent: 0, + enableSearch: true, + checkStrictly: true, + defaultExpandAll: true, + onNodeCheck: (node) => { + console.log('onNodeCheck', node); + }, + onNodeSelect: (node) => { + console.log('onNodeSelect', node); + }, + onNodeExpand: () => { + this.dialog?.fitWidth(); + }, + }); + tree.init(); + return tree; + }; + + const componentTree = createTree(levelTreeData); + const typeTree = createTree(typeTreeData); + const majorTree = createTree(majorTreeData); const componentPanel = document.createElement('div'); componentPanel.className = 'construct-tab__panel-content'; - componentPanel.appendChild(tree.element); + componentPanel.appendChild(componentTree.element); + + const typePanel = document.createElement('div'); + typePanel.className = 'construct-tab__panel-content'; + typePanel.appendChild(typeTree.element); + + const majorPanel = document.createElement('div'); + majorPanel.className = 'construct-tab__panel-content'; + majorPanel.appendChild(majorTree.element); const tabMount = document.createElement('div'); tabMount.className = 'construct-tab__container'; @@ -169,8 +139,8 @@ export class ConstructTreeManagerBtn extends BaseManager { container: tabMount, tabs: [ { id: 'component', title: 'tab.component', content: componentPanel }, - { id: 'system', title: 'tab.system', content: systemPlaceholder }, - { id: 'space', title: 'tab.space', content: spacePlaceholder }, + { id: 'type', title: 'tab.type', content: typePanel }, + { id: 'major', title: 'tab.major', content: majorPanel }, ], activeId: 'component', onChange: () => { @@ -188,7 +158,9 @@ export class ConstructTreeManagerBtn extends BaseManager { resizable: false, onClose: () => { tab.destroy(); - tree.destroy(); + componentTree.destroy(); + typeTree.destroy(); + majorTree.destroy(); this.setVisible(true); } }); diff --git a/src/managers/engine-manager.ts b/src/managers/engine-manager.ts index d6e22a9..b168dc0 100644 --- a/src/managers/engine-manager.ts +++ b/src/managers/engine-manager.ts @@ -5,8 +5,6 @@ import { Engine, type EngineOptions, type ModelLoadOptions } from '../components/engine'; import { BaseManager } from '../core/base-manager'; import { RightKeyManager } from './right-key-manager'; -import { infoMenuButton } from '../components/menu/buttons/info'; -import { homeMenuButton } from '../components/menu/buttons/home'; import type { MeasureMode } from '../types/measure'; import type { SectionBoxRange } from '../components/section-box-panel/types'; import type { MenuItemConfig } from '../components/menu/item'; @@ -56,31 +54,96 @@ export class EngineManager extends BaseManager { const items: MenuItemConfig[] = []; if (selected) { + // 1. 构件详情 items.push({ id: 'componentDetail', label: 'menu.componentDetail', group: 'component', + order: 1, + divider: true, onClick: () => { const registry = ManagerRegistry.getInstance(); - registry.componentDetail?.show(selected.url, selected.id); + registry.componentDetail?.show(); + this.rightKey?.hide(); + } + }); + + // 2. 隐藏选中构件 + items.push({ + id: 'hideSelected', + label: 'menu.hideSelected', + group: 'component', + order: 2, + onClick: () => { + console.log('[Menu] 隐藏选中构件 - 暂未实现'); + this.rightKey?.hide(); + } + }); + + // 3. 半透明选中构件 + items.push({ + id: 'transparentSelected', + label: 'menu.transparentSelected', + group: 'component', + order: 3, + onClick: () => { + console.log('[Menu] 半透明选中构件 - 暂未实现'); + this.rightKey?.hide(); + } + }); + + // 4. 隔离选中构件(带子菜单) + items.push({ + id: 'isolateSelected', + label: 'menu.isolateSelected', + group: 'component', + order: 4, + divider: true, + children: [ + { + id: 'hideOthers', + label: 'menu.hideOthers', + onClick: () => { + console.log('[Menu] 隔离 - 其他构件隐藏 - 暂未实现'); + this.rightKey?.hide(); + } + }, + { + id: 'transparentOthers', + label: 'menu.transparentOthers', + onClick: () => { + console.log('[Menu] 隔离 - 其他构件半透明 - 暂未实现'); + this.rightKey?.hide(); + } + } + ] + }); + + // 5. 剖切盒适应 + items.push({ + id: 'fitSectionBox', + label: 'menu.fitSectionBox', + group: 'component', + order: 5, + onClick: () => { + console.log('[Menu] 剖切盒适应 - 暂未实现'); this.rightKey?.hide(); } }); } + // 6. 显示全部(始终显示) items.push({ id: 'showAll', label: 'menu.showAll', group: 'component', + order: 6, onClick: () => { - console.log('[Menu] 显示全部 - 功能开发中'); + console.log('[Menu] 显示全部 - 暂未实现'); this.rightKey?.hide(); } }); - items.push(infoMenuButton()); - items.push(homeMenuButton()); - return items; }); @@ -370,6 +433,22 @@ export class EngineManager extends BaseManager { // ==================== 结束:构件选中 ==================== + // ==================== 模型树 ==================== + + public getTypeTreeData(): any[] { + return this.engineInstance?.getTypeTreeData() ?? []; + } + + public getLevelTreeData(): any[] { + return this.engineInstance?.getLevelTreeData() ?? []; + } + + public getMajorTreeData(): any[] { + return this.engineInstance?.getMajorTreeData() ?? []; + } + + // ==================== 结束:模型树 ==================== + /** 销毁引擎管理器 */ public destroy(): void { if (this.engineInstance) { diff --git a/src/managers/property-panel-manager.ts b/src/managers/property-panel-manager.ts deleted file mode 100644 index 2b19d0f..0000000 --- a/src/managers/property-panel-manager.ts +++ /dev/null @@ -1,222 +0,0 @@ -/** - * 属性面板管理器 - * 负责管理构件属性面板的显示和内容 - */ -import { BaseManager } from '../core/base-manager'; -import { BimCollapse } from '../components/collapse/index'; -import { BimDescription } from '../components/description/index'; -import { BimTab } from '../components/tab/index'; - -/** - * 属性面板管理器 - * 显示选中构件的属性信息和材质信息 - */ -export class PropertyPanelManager extends BaseManager { - /** 对话框 ID */ - private dialogId = 'property-panel-dialog'; - /** 对话框实例 */ - private dialog: any = null; - - constructor() { - super(); - } - - /** 初始化,监听打开事件 */ - public init(): void { - document.addEventListener('bim-demo:open-property-panel', () => { - this.show(); - }); - } - - /** 显示属性面板 */ - public show() { - if (!this.registry.dialog) { - console.warn('Dialog manager is not initialized'); - return; - } - - if (this.isOpen()) { - return; - } - - const width = 360; - const x = document.body.clientWidth - width - 40; - - this.dialog = this.registry.dialog.create({ - id: this.dialogId, - title: 'panel.property.title', - content: '', - width: `${width}px`, - height: '500px', - position: { x, y: 20 }, - showMask: false, - resizable: true, - onClose: () => { - this.hide(); - } - } as any); - - const contentContainer = document.createElement('div'); - contentContainer.style.height = '100%'; - contentContainer.style.display = 'flex'; - contentContainer.style.flexDirection = 'column'; - - this.dialog.setContent(contentContainer); - - const tab = new BimTab({ - container: contentContainer, - tabs: [ - { - id: 'props', - title: 'panel.property.tab.props', - content: this.createPropsTabContent() - }, - { - id: 'material', - title: 'panel.property.tab.material', - content: this.createMaterialTabContent() - } - ] - }); - tab.init(); - } - - /** 创建属性标签页内容 */ - private createPropsTabContent(): HTMLElement { - const container = document.createElement('div'); - container.style.height = '100%'; - container.style.overflowY = 'auto'; - - new BimCollapse({ - container: container, - accordion: true, - activeIds: ['base', 'location'], - items: [ - { - id: 'base', - title: 'panel.property.base', - content: this.createBaseInfoContent(), - }, - { - id: 'advanced', - title: 'panel.property.advanced', - content: this.createAdvancedInfoContent(), - disabled: false - } - ] - }); - - return container; - } - - /** 创建材质标签页内容 */ - private createMaterialTabContent(): HTMLElement { - const container = document.createElement('div'); - container.style.height = '100%'; - container.style.overflowY = 'auto'; - - new BimCollapse({ - container: container, - accordion: true, - activeIds: ['material'], - items: [ - { - id: 'material', - title: 'panel.property.material', - content: this.createMaterialContent(), - } - ] - }); - - return container; - } - - /** 创建基本信息内容 */ - private createBaseInfoContent(): HTMLElement { - const container = document.createElement('div'); - - new BimDescription({ - container: container, - labelWidth: '80px', - bordered: true, - items: [ - { label: 'Guid', value: '1f8d-4a2e-9c' }, - { label: 'Name', value: 'Basic Wall: Generic - 200mm' }, - { label: 'Type', value: 'Basic Wall' }, - { label: 'Level', value: 'Trane - Centrifugal Water Chiller - CVHF 2 Stage direct drive TAG(BP-RHS-1100RT) 0202104531 1' } - ] - }); - - return container; - } - - /** 创建高级信息内容 */ - private createAdvancedInfoContent(): HTMLElement { - const container = document.createElement('div'); - - new BimDescription({ - container: container, - labelWidth: '100px', - bordered: true, - items: [ - { label: 'Area', value: '32.5 m²' }, - { label: 'Volume', value: '6.5 m³' }, - { label: 'Length', value: '5000 mm' }, - { label: 'Phase', value: 'New Construction' } - ] - }); - - return container; - } - - /** 创建材质内容 */ - private createMaterialContent(): HTMLElement { - const container = document.createElement('div'); - - const preview = document.createElement('div'); - preview.style.display = 'flex'; - preview.style.alignItems = 'center'; - preview.style.marginBottom = '4px'; - preview.innerHTML = ` -
    - Concrete - Cast-in-Place Gray - `; - - const descContainer = document.createElement('div'); - - new BimDescription({ - container: descContainer, - items: [ - { label: 'Preview', value: preview }, - { label: 'Class', value: 'Concrete' }, - { label: 'Density', value: '2400 kg/m³' }, - { label: 'Thermal', value: '0.6 W/(m·K)' } - ] - }); - - container.appendChild(descContainer); - return container; - } - - /** - * 检查面板是否打开 - * @returns 是否打开 - */ - public isOpen(): boolean { - return this.dialog !== null; - } - - /** 隐藏面板 */ - public hide(): void { - if (this.dialog) { - this.dialog.destroy(); - this.dialog = null; - } - } - - /** 销毁管理器 */ - public destroy(): void { - this.hide(); - super.destroy(); - } -} diff --git a/src/types/events.ts b/src/types/events.ts index 0a632c9..f83681c 100644 --- a/src/types/events.ts +++ b/src/types/events.ts @@ -30,4 +30,8 @@ export interface EngineEvents { // 地图事件 'map:opened': {}; 'map:closed': {}; + + // 构件选中事件 + 'component:selected': { url: string; id: string }; + 'component:deselected': {}; }